{"version":3,"file":"index.cjs","sources":["../../src/builders/base-service-builder.ts","../../src/builders/hcs/hcs-builder.ts","../../src/builders/hts/hts-builder.ts","../../src/builders/account/account-builder.ts","../../src/builders/scs/scs-builder.ts","../../src/builders/file/file-builder.ts","../../src/builders/query/query-builder.ts","../../src/langchain/tools/common/base-hedera-transaction-tool.ts","../../src/utils/key-utils.ts","../../src/langchain/tools/hcs/create-topic-tool.ts","../../src/langchain/tools/hcs/delete-topic-tool.ts","../../src/langchain/tools/hcs/submit-message-tool.ts","../../src/langchain/tools/hts/claim-airdrop-tool.ts","../../src/langchain/tools/hts/create-fungible-token-tool.ts","../../src/langchain/tools/hts/create-nft-tool.ts","../../src/langchain/tools/hts/mint-fungible-token-tool.ts","../../src/langchain/tools/hts/mint-nft-tool.ts","../../src/langchain/tools/hts/reject-tokens-tool.ts","../../src/langchain/tools/hts/transfer-tokens-tool.ts","../../src/langchain/tools/hts/dissociate-tokens-tool.ts","../../src/langchain/tools/hts/update-token-tool.ts","../../src/langchain/tools/hts/delete-token-tool.ts","../../src/langchain/tools/hts/pause-token-tool.ts","../../src/langchain/tools/hts/unpause-token-tool.ts","../../src/langchain/tools/hts/freeze-token-account-tool.ts","../../src/langchain/tools/hts/unfreeze-token-account-tool.ts","../../src/langchain/tools/hts/grant-kyc-token-tool.ts","../../src/langchain/tools/hts/revoke-kyc-token-tool.ts","../../src/langchain/tools/hts/wipe-token-account-tool.ts","../../src/langchain/tools/hts/token-fee-schedule-update-tool.ts","../../src/langchain/tools/hts/transfer-nft-tool.ts","../../src/langchain/tools/hts/burn-fungible-token-tool.ts","../../src/langchain/tools/hts/burn-nft-tool.ts","../../src/langchain/tools/account/approve-fungible-token-allowance-tool.ts","../../src/langchain/tools/account/approve-hbar-allowance-tool.ts","../../src/langchain/tools/account/approve-token-nft-allowance-tool.ts","../../src/langchain/tools/account/create-account-tool.ts","../../src/langchain/tools/account/delete-account-tool.ts","../../src/langchain/tools/account/update-account-tool.ts","../../src/langchain/tools/account/transfer-hbar-tool.ts","../../src/langchain/tools/account/revoke-hbar-allowance-tool.ts","../../src/langchain/tools/account/revoke-fungible-token-allowance-tool.ts","../../src/langchain/tools/account/sign-and-execute-scheduled-transaction-tool.ts","../../src/langchain/tools/file/create-file-tool.ts","../../src/langchain/tools/file/append-file-tool.ts","../../src/langchain/tools/file/update-file-tool.ts","../../src/langchain/tools/file/delete-file-tool.ts","../../src/langchain/tools/scs/create-contract-tool.ts","../../src/langchain/tools/scs/update-contract-tool.ts","../../src/langchain/tools/scs/delete-contract-tool.ts","../../src/langchain/tools/scs/execute-contract-tool.ts","../../src/types/model-capability.ts","../../src/utils/model-capability-detector.ts","../../src/langchain/tools/common/base-hedera-query-tool.ts","../../src/langchain/tools/hcs/get-topic-info-tool.ts","../../src/langchain/tools/hcs/get-topic-fees-tool.ts","../../src/langchain/tools/account/get-account-balance-tool.ts","../../src/langchain/tools/account/get-account-public-key-tool.ts","../../src/langchain/tools/account/get-account-info-tool.ts","../../src/langchain/tools/account/get-account-tokens-tool.ts","../../src/langchain/tools/account/get-account-nfts-tool.ts","../../src/langchain/tools/hts/get-token-info-tool.ts","../../src/langchain/tools/hts/validate-nft-ownership-tool.ts","../../src/langchain/tools/network/get-hbar-price-tool.ts","../../src/langchain/tools/transaction/get-transaction-tool.ts","../../src/langchain/tools/account/get-outstanding-airdrops-tool.ts","../../src/langchain/tools/account/get-pending-airdrops-tool.ts","../../src/langchain/tools/network/get-blocks-tool.ts","../../src/langchain/tools/scs/get-contracts-tool.ts","../../src/langchain/tools/scs/get-contract-tool.ts","../../src/langchain/tools/network/get-network-info-tool.ts","../../src/langchain/tools/network/get-network-fees-tool.ts","../../src/langchain/tools/hts/airdrop-token-tool.ts","../../src/langchain/tools/hts/associate-tokens-tool.ts","../../src/langchain/tools/hcs/update-topic-tool.ts","../../src/langchain/tools/hcs/get-topic-messages-tool.ts","../../src/langchain/tools/file/get-file-contents-tool.ts","../../src/langchain/tools/account/delete-nft-spender-allowance-tool.ts","../../src/langchain/tools/account/delete-nft-allowance-all-serials-tool.ts","../../src/langchain/index.ts","../../src/agent/agent.ts","../../src/utils/token-usage-tracker.ts","../../src/signer/abstract-signer.ts","../../src/types/index.ts","../../src/mcp/client.ts","../../src/signer/browser-signer.ts","../../src/agent/conversational-agent.ts","../../src/signer/server-signer.ts","../../src/utils/api-utils.ts"],"sourcesContent":["import {\n  AccountId,\n  Transaction,\n  TransactionId,\n  TransactionReceipt,\n  ScheduleCreateTransaction,\n  ScheduleId,\n  Key,\n  PublicKey,\n  PrivateKey,\n  KeyList,\n  Long,\n} from '@hashgraph/sdk';\nimport { Buffer } from 'buffer';\nimport { AbstractSigner } from '../signer/abstract-signer';\nimport { Logger, detectKeyTypeFromString } from '@hashgraphonline/standards-sdk';\nimport type { HederaAgentKit } from '../agent/agent';\n\n/**\n * Defines the structure for the result of an execute operation.\n */\nexport interface ExecuteResult {\n  success: boolean;\n  receipt?: TransactionReceipt;\n  scheduleId?: ScheduleId | string;\n  error?: string;\n  transactionId?: string | undefined;\n}\n\n/**\n * BaseServiceBuilder provides common functionality for service-specific builders.\n * It manages the current transaction being built and offers common execution and byte generation methods.\n */\nexport abstract class BaseServiceBuilder {\n  protected currentTransaction: Transaction | null = null;\n  protected logger: Logger;\n  protected kit: HederaAgentKit;\n  protected notes: string[] = [];\n\n  /**\n   * @param {HederaAgentKit} kit - The HederaAgentKit instance\n   */\n  constructor(protected readonly hederaKit: HederaAgentKit) {\n    this.kit = hederaKit;\n\n    const shouldDisableLogs = process.env.DISABLE_LOGS === 'true';\n\n    this.logger = new Logger({\n      module: 'ServiceBuilder',\n      level: shouldDisableLogs ? 'silent' : 'info',\n      silent: shouldDisableLogs,\n    });\n  }\n\n  /**\n   * Helper method to get the effective sender account to use for transactions.\n   * In user-centric contexts, this will be the user's account. Otherwise, it falls back to the signer's account.\n   * @returns {AccountId} The account ID to use as sender\n   */\n  protected getEffectiveSenderAccountId(): AccountId {\n    if (this.kit.userAccountId) {\n      return AccountId.fromString(this.kit.userAccountId);\n    }\n    return this.kit.signer.getAccountId();\n  }\n\n  /**\n   * Helper method to determine if a transaction is a user-initiated transfer.\n   * Used for properly constructing transfer arrays.\n   * @param {boolean} isUserInitiated Whether this is a user-initiated transfer\n   * @returns {AccountId} The account that should be used as the sender\n   */\n  protected getTransferSourceAccount(\n    isUserInitiated: boolean = true\n  ): AccountId {\n    if (isUserInitiated && this.kit.userAccountId) {\n      return AccountId.fromString(this.kit.userAccountId);\n    }\n    return this.kit.signer.getAccountId();\n  }\n\n  /**\n   * @param {string} memo\n   * @returns {this}\n   * @throws {Error}\n   */\n  public setTransactionMemo(memo: string): this {\n    if (!this.currentTransaction) {\n      throw new Error(\n        'No transaction is currently being built. Call a specific transaction method first (e.g., createTopic).'\n      );\n    }\n    this.currentTransaction.setTransactionMemo(memo);\n    return this;\n  }\n\n  /**\n   * @param {TransactionId} transactionId\n   * @returns {this}\n   * @throws {Error}\n   */\n  public setTransactionId(transactionId: TransactionId): this {\n    if (!this.currentTransaction) {\n      throw new Error(\n        'No transaction is currently being built. Call a specific transaction method first.'\n      );\n    }\n    this.currentTransaction.setTransactionId(transactionId);\n    return this;\n  }\n\n  /**\n   * @param {AccountId[]} nodeAccountIds\n   * @returns {this}\n   * @throws {Error}\n   */\n  public setNodeAccountIds(nodeAccountIds: AccountId[]): this {\n    if (!this.currentTransaction) {\n      throw new Error(\n        'No transaction is currently being built. Call a specific transaction method first.'\n      );\n    }\n    this.currentTransaction.setNodeAccountIds(nodeAccountIds);\n    return this;\n  }\n\n  /**\n   * @param {object} [options]\n   * @param {boolean} [options.schedule]\n   * @param {string} [options.scheduleMemo]\n   * @param {string | AccountId} [options.schedulePayerAccountId]\n   * @returns {Promise<ExecuteResult>}\n   * @throws {Error}\n   */\n  public async execute(options?: {\n    schedule?: boolean;\n    scheduleMemo?: string;\n    schedulePayerAccountId?: string | AccountId;\n  }): Promise<ExecuteResult> {\n    const innerTx = this.currentTransaction;\n\n    if (!innerTx) {\n      return { success: false, error: 'No transaction to execute.' };\n    }\n\n    let transactionToExecute: Transaction = innerTx;\n    let originalTransactionIdForReporting = innerTx.transactionId?.toString();\n\n    if (options?.schedule) {\n      if (!innerTx.isFrozen() && this.kit.userAccountId) {\n        innerTx.setTransactionId(\n          TransactionId.generate(this.kit.userAccountId)\n        );\n      }\n\n      const scheduleCreateTx =\n        new ScheduleCreateTransaction().setScheduledTransaction(innerTx);\n\n      if (options.scheduleMemo) {\n        scheduleCreateTx.setScheduleMemo(options.scheduleMemo);\n      }\n\n      if (this.kit.userAccountId) {\n        scheduleCreateTx.setPayerAccountId(\n          AccountId.fromString(this.kit.userAccountId)\n        );\n      } else if (options.schedulePayerAccountId) {\n        const payerForScheduleCreate =\n          typeof options.schedulePayerAccountId === 'string'\n            ? AccountId.fromString(options.schedulePayerAccountId)\n            : options.schedulePayerAccountId;\n        scheduleCreateTx.setPayerAccountId(payerForScheduleCreate);\n      } else {\n        scheduleCreateTx.setPayerAccountId(this.kit.signer.getAccountId());\n        this.addNote(\n          `Your agent account (${this.kit.signer\n            .getAccountId()\n            .toString()}) will pay the fee to create this schedule.`\n        );\n      }\n\n      const agentOperator = await this.kit.getOperator();\n      const adminKeyList = new KeyList().setThreshold(1);\n      if (agentOperator.publicKey) {\n        adminKeyList.push(agentOperator.publicKey);\n        this.addNote(\n          `The schedule admin key allows both your agent and user (${this.kit.userAccountId}) to manage the schedule.`\n        );\n      }\n\n      if (this.kit.userAccountId) {\n        try {\n          const mirrorNode = this.kit.mirrorNode;\n          const userAccountInfo = await mirrorNode.requestAccount(\n            this.kit.userAccountId\n          );\n          if (userAccountInfo?.key?.key) {\n            adminKeyList.push(PublicKey.fromString(userAccountInfo.key.key));\n            this.addNote(\n              `The schedule admin key allows both your agent and user (${this.kit.userAccountId}) to manage the schedule.`\n            );\n          } else {\n            this.addNote(\n              `The schedule admin key is set to your agent. User (${this.kit.userAccountId}) key not found or not a single key.`\n            );\n          }\n        } catch (e) {\n          this.logger.warn(\n            `Failed to get user key for schedule admin key for ${\n              this.kit.userAccountId\n            }: ${(e as Error).message}`\n          );\n          this.addNote(\n            `The schedule admin key is set to your agent. Could not retrieve user (${this.kit.userAccountId}) key.`\n          );\n        }\n      }\n      if (Array.from(adminKeyList).length > 0) {\n        scheduleCreateTx.setAdminKey(adminKeyList);\n      } else {\n        this.addNote(\n          'No admin key could be set for the schedule (agent key missing and user key not found/retrieved).'\n        );\n      }\n\n      transactionToExecute = scheduleCreateTx;\n    }\n\n    try {\n      if (\n        !transactionToExecute.isFrozen() &&\n        !transactionToExecute.transactionId\n      ) {\n        await transactionToExecute.freezeWith(this.kit.client);\n      }\n      if (options?.schedule && transactionToExecute.transactionId) {\n        originalTransactionIdForReporting =\n          transactionToExecute.transactionId.toString();\n      }\n\n      const receipt = await this.kit.signer.signAndExecuteTransaction(\n        transactionToExecute\n      );\n      const finalTransactionId =\n        transactionToExecute.transactionId?.toString() ||\n        originalTransactionIdForReporting;\n\n      const result: ExecuteResult = {\n        success: true,\n        receipt: receipt,\n        transactionId: finalTransactionId,\n      };\n\n      if (options?.schedule && receipt.scheduleId) {\n        result.scheduleId = receipt.scheduleId.toString();\n      }\n      return result;\n    } catch (e: unknown) {\n      console.log('error is:', e);\n      const error = e as Error;\n      this.logger.error(\n        `Transaction execution failed: ${error.message}`,\n        error\n      );\n      const errorResult: ExecuteResult = {\n        success: false,\n        error:\n          error.message ||\n          'An unknown error occurred during transaction execution.',\n        transactionId: originalTransactionIdForReporting,\n      };\n      return errorResult;\n    }\n  }\n\n  /**\n   * @param {object} [options]\n   * @param {boolean} [options.schedule]\n   * @param {string} [options.scheduleMemo]\n   * @param {string | AccountId} [options.schedulePayerAccountId]\n   * @param {Key} [options.scheduleAdminKey]\n   * @returns {Promise<string>}\n   * @throws {Error}\n   */\n  public async getTransactionBytes(options?: {\n    schedule?: boolean;\n    scheduleMemo?: string;\n    schedulePayerAccountId?: string | AccountId;\n    scheduleAdminKey?: Key;\n  }): Promise<string> {\n    if (!this.currentTransaction) {\n      throw new Error(\n        'No transaction to get bytes for. Call a specific transaction method first.'\n      );\n    }\n\n    let transactionForBytes: Transaction = this.currentTransaction;\n\n    if (options?.schedule) {\n      const scheduleCreateTx =\n        new ScheduleCreateTransaction().setScheduledTransaction(\n          this.currentTransaction\n        );\n\n      if (options.scheduleMemo) {\n        scheduleCreateTx.setScheduleMemo(options.scheduleMemo);\n      }\n      if (options.schedulePayerAccountId) {\n        const payerAccountId =\n          typeof options.schedulePayerAccountId === 'string'\n            ? AccountId.fromString(options.schedulePayerAccountId)\n            : options.schedulePayerAccountId;\n        scheduleCreateTx.setPayerAccountId(payerAccountId);\n      }\n      if (options.scheduleAdminKey) {\n        scheduleCreateTx.setAdminKey(options.scheduleAdminKey);\n      }\n      transactionForBytes = scheduleCreateTx;\n    }\n\n    return Buffer.from(transactionForBytes.toBytes()).toString('base64');\n  }\n\n  /**\n   * Executes the current transaction using a provided signer.\n   * This is useful if the transaction needs to be signed and paid for by a different account\n   * than the one initially configured with the HederaAgentKit/builder instance.\n   * Note: The transaction should ideally not be frozen, or if frozen, its transactionId\n   * should be compatible with the newSigner's accountId as the payer.\n   * @param {AbstractSigner} newSigner - The signer to use for this specific execution.\n   * @returns {Promise<ExecuteResult>}\n   * @throws {Error}\n   */\n  public async executeWithSigner(\n    newSigner: AbstractSigner\n  ): Promise<ExecuteResult> {\n    if (!this.currentTransaction) {\n      return {\n        success: false,\n        error:\n          'No transaction to execute. Call a specific transaction method first.',\n      };\n    }\n\n    let transactionToExecute = this.currentTransaction;\n\n    if (transactionToExecute.isFrozen()) {\n      throw new Error(\n        'Transaction is frozen, try to call the builder method again and then executeWithSigner.'\n      );\n    }\n\n    try {\n      const receipt = await newSigner.signAndExecuteTransaction(\n        transactionToExecute\n      );\n      const transactionId = transactionToExecute.transactionId?.toString();\n      return {\n        success: true,\n        receipt: receipt,\n        transactionId: transactionId,\n      };\n    } catch (e: unknown) {\n      const error = e as Error;\n      this.logger.error(\n        `Transaction execution with new signer failed: ${error.message}`\n      );\n      return {\n        success: false,\n        error:\n          error.message ||\n          'An unknown error occurred during transaction execution with new signer.',\n      };\n    }\n  }\n\n  /**\n   * @param {Transaction} transaction\n   */\n  protected setCurrentTransaction(transaction: Transaction): void {\n    this.currentTransaction = transaction;\n  }\n\n  /**\n   * Retrieves the current transaction object being built.\n   * @returns {Transaction | null} The current transaction or null.\n   */\n  public getCurrentTransaction(): Transaction | null {\n    return this.currentTransaction;\n  }\n\n  public addNote(note: string): void {\n    this.notes.push(note);\n  }\n\n  public getNotes(): string[] {\n    return this.notes;\n  }\n\n  public clearNotes(): void {\n    this.notes = [];\n  }\n\n  protected async parseKey(\n    keyInput?: string | PublicKey | Key | null\n  ): Promise<Key | undefined> {\n    if (keyInput === undefined || keyInput === null) {\n      return undefined;\n    }\n    if (\n      typeof keyInput === 'object' &&\n      ('_key' in keyInput ||\n        keyInput instanceof PublicKey ||\n        keyInput instanceof PrivateKey ||\n        keyInput instanceof KeyList)\n    ) {\n      return keyInput as Key;\n    }\n    if (typeof keyInput === 'string') {\n      if (keyInput.toLowerCase() === 'current_signer') {\n        if (this.kit.signer) {\n          this.logger.info(\n            `[BaseServiceBuilder.parseKey] Substituting \"current_signer\" with signer's public key.`\n          );\n          return await this.kit.signer.getPublicKey();\n        } else {\n          throw new Error(\n            '[BaseServiceBuilder.parseKey] Signer is not available to resolve \"current_signer\".'\n          );\n        }\n      }\n      try {\n        return PublicKey.fromString(keyInput);\n      } catch (e: unknown) {\n        const error = e as Error;\n        try {\n          this.logger.warn(\n            '[BaseServiceBuilder.parseKey] Attempting to parse key string as PrivateKey to derive PublicKey. This is generally not recommended for public-facing keys.',\n            { error: error.message }\n          );\n          const keyDetection = detectKeyTypeFromString(keyInput);\n          return keyDetection.privateKey;\n        } catch (e2: unknown) {\n          const error2 = e2 as Error;\n          this.logger.error(\n            `[BaseServiceBuilder.parseKey] Failed to parse key string as PublicKey or PrivateKey: ${keyInput.substring(\n              0,\n              30\n            )}...`,\n            { error: error2.message }\n          );\n          throw new Error(\n            `[BaseServiceBuilder.parseKey] Invalid key string format: ${keyInput.substring(\n              0,\n              30\n            )}...`\n          );\n        }\n      }\n    }\n    this.logger.warn(\n      `[BaseServiceBuilder.parseKey] Received an object that is not an SDK Key instance or a recognized string format: ${JSON.stringify(\n        keyInput\n      )}`\n    );\n    return undefined;\n  }\n\n  protected parseAmount(amount?: number | string | Long | BigNumber): Long {\n    if (amount === undefined) {\n      return Long.fromNumber(0);\n    }\n    if (typeof amount === 'number') {\n      return Long.fromNumber(amount);\n    }\n    if (typeof amount === 'string') {\n      return Long.fromString(amount);\n    }\n    if (amount instanceof BigNumber) {\n      return Long.fromString(amount.toString());\n    }\n    return amount;\n  }\n}\n","import {\n  TopicCreateTransaction,\n  TopicMessageSubmitTransaction,\n  TopicDeleteTransaction,\n  TopicUpdateTransaction,\n  TopicId,\n  PublicKey,\n  AccountId,\n  KeyList,\n} from '@hashgraph/sdk';\nimport { Buffer } from 'buffer';\nimport {\n  CreateTopicParams,\n  SubmitMessageParams,\n  DeleteTopicParams,\n  UpdateTopicParams,\n} from '../../types';\nimport { BaseServiceBuilder } from '../base-service-builder';\nimport { HederaAgentKit } from '../../agent/agent';\n\nconst DEFAULT_AUTORENEW_PERIOD_SECONDS = 7776000;\nconst MAX_SINGLE_MESSAGE_BYTES = 1000;\n\n/**\n * HcsBuilder facilitates the construction and execution of Hedera Consensus Service (HCS) transactions.\n * It extends BaseServiceBuilder to provide common transaction execution and byte generation methods.\n */\nexport class HcsBuilder extends BaseServiceBuilder {\n  constructor(hederaKit: HederaAgentKit) {\n    super(hederaKit);\n  }\n\n  /**\n   * @param {CreateTopicParams} params\n   * @returns {Promise<this>}\n   */\n  public async createTopic(params: CreateTopicParams): Promise<this> {\n    this.clearNotes();\n    const transaction = new TopicCreateTransaction();\n\n    if (params.memo) {\n      transaction.setTopicMemo(params.memo);\n    }\n\n    if (params.adminKey) {\n      const parsedAdminKey = await this.parseKey(params.adminKey);\n      if (parsedAdminKey) {\n        transaction.setAdminKey(parsedAdminKey);\n      }\n    }\n\n    if (params.feeScheduleKey) {\n      const parsedFeeScheduleKey = await this.parseKey(params.feeScheduleKey);\n      if (parsedFeeScheduleKey) {\n        transaction.setFeeScheduleKey(parsedFeeScheduleKey);\n      }\n    }\n\n    if (params.submitKey) {\n      const parsedSubmitKey = await this.parseKey(params.submitKey);\n      if (parsedSubmitKey) {\n        transaction.setSubmitKey(parsedSubmitKey);\n      }\n    }\n\n    if (params.autoRenewPeriod) {\n      transaction.setAutoRenewPeriod(params.autoRenewPeriod);\n    } else {\n      transaction.setAutoRenewPeriod(DEFAULT_AUTORENEW_PERIOD_SECONDS);\n      this.addNote(`Default auto-renew period of ${DEFAULT_AUTORENEW_PERIOD_SECONDS} seconds applied for topic.`);\n    }\n\n    if (params.autoRenewAccountId) {\n      transaction.setAutoRenewAccountId(params.autoRenewAccountId);\n    } else {\n      this.logger.warn(\n        'MirrorNode client is not available on the signer, cannot set fee exempt keys by account ID for createTopic.'\n      );\n      this.addNote('Could not set fee exempt accounts for topic creation: MirrorNode client not available on signer.');\n    }\n\n    if (params.customFees && params.customFees.length > 0) {\n      transaction.setCustomFees(params.customFees);\n    }\n\n    if (params.exemptAccountIds && params.exemptAccountIds.length > 0) {\n      if (!this.kit.signer.mirrorNode) {\n        this.logger.warn(\n          'MirrorNode client is not available on the signer, cannot set fee exempt keys by account ID for createTopic.'\n        );\n        this.addNote('Could not attempt to set fee exempt accounts for topic creation: MirrorNode client not available on signer.');\n      } else {\n        try {\n          const publicKeys: PublicKey[] = [];\n          for (const accountIdStr of params.exemptAccountIds) {\n            const publicKey = await this.kit.signer.mirrorNode.getPublicKey(\n              accountIdStr\n            );\n            publicKeys.push(publicKey);\n          }\n          if (publicKeys.length > 0) {\n            this.logger.warn(\n              'TopicCreateTransaction does not support setFeeExemptKeys. This parameter will be ignored for topic creation.'\n            );\n          }\n        } catch (e: unknown) {\n          const error = e as Error;\n          this.logger.error(\n            `Failed to process exemptAccountIds for createTopic: ${error.message}`\n          );\n          this.addNote(`Error processing fee exempt accounts for topic creation: ${error.message}. They may not be set.`);\n        }\n      }\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Configures the builder to submit a message to an HCS topic.\n   * The transaction will be signed by the primary signer (operator).\n   * If the target topic has a specific submit key and it is different from the operator's key,\n   * the transaction may fail at the network level unless the transaction bytes are retrieved\n   * using `getTransactionBytes()` and signed externally by the required submit key(s) before submission.\n   * The `params.submitKey` (if provided in `SubmitMessageParams`) is not directly used to sign\n   * within this builder method for `TopicMessageSubmitTransaction` as the transaction type itself\n   * does not have a field for an overriding submitter's public key; authorization is based on the topic's configuration.\n   * @param {SubmitMessageParams} params - Parameters for submitting the message.\n   * @returns {this} The HcsBuilder instance for fluent chaining.\n   */\n  public submitMessageToTopic(params: SubmitMessageParams): this {\n    const topicId =\n      typeof params.topicId === 'string'\n        ? TopicId.fromString(params.topicId)\n        : params.topicId;\n    const messageContents = params.message;\n    const messageBytesLength =\n      typeof messageContents === 'string'\n        ? Buffer.from(messageContents, 'utf8').length\n        : messageContents.length;\n\n    if (messageBytesLength > MAX_SINGLE_MESSAGE_BYTES) {\n      this.logger.warn(\n        `HcsBuilder: Message size (${messageBytesLength} bytes) exceeds recommended single transaction limit (${MAX_SINGLE_MESSAGE_BYTES} bytes). The transaction will likely fail if not accepted by the network.`\n      );\n    }\n\n    let transaction = new TopicMessageSubmitTransaction()\n      .setTopicId(topicId)\n      .setMessage(messageContents);\n\n    if (params.maxChunks) {\n      transaction.setMaxChunks(params.maxChunks);\n    }\n\n    if (params.chunkSize) {\n      transaction.setChunkSize(params.chunkSize);\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {DeleteTopicParams} params\n   * @returns {this}\n   * @throws {Error}\n   */\n  public deleteTopic(params: DeleteTopicParams): this {\n    if (params.topicId === undefined) {\n      throw new Error('Topic ID is required to delete a topic.');\n    }\n    const transaction = new TopicDeleteTransaction().setTopicId(params.topicId);\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Configures the builder to update an HCS topic.\n   * @param {UpdateTopicParams} params - Parameters for updating the topic.\n   * @returns {Promise<this>} The HcsBuilder instance for fluent chaining.\n   * @throws {Error} If topicId is not provided.\n   */\n  public async updateTopic(params: UpdateTopicParams): Promise<this> {\n    this.clearNotes();\n    if (!params.topicId) {\n      throw new Error('Topic ID is required to update a topic.');\n    }\n    const transaction = new TopicUpdateTransaction().setTopicId(params.topicId);\n\n    if (Object.prototype.hasOwnProperty.call(params, 'memo')) {\n      transaction.setTopicMemo(params.memo === null ? '' : params.memo!);\n    }\n\n    if (Object.prototype.hasOwnProperty.call(params, 'adminKey')) {\n      if (params.adminKey === null) {\n        transaction.setAdminKey(new KeyList());\n      } else if (params.adminKey) {\n        const parsedAdminKey = await this.parseKey(params.adminKey);\n        if (parsedAdminKey) transaction.setAdminKey(parsedAdminKey);\n      }\n    }\n\n    if (Object.prototype.hasOwnProperty.call(params, 'submitKey')) {\n      if (params.submitKey === null) {\n        transaction.setSubmitKey(new KeyList());\n      } else if (params.submitKey) {\n        const parsedSubmitKey = await this.parseKey(params.submitKey);\n        if (parsedSubmitKey) transaction.setSubmitKey(parsedSubmitKey);\n      }\n    }\n\n    if (params.autoRenewPeriod) {\n      transaction.setAutoRenewPeriod(params.autoRenewPeriod);\n    }\n\n    if (Object.prototype.hasOwnProperty.call(params, 'autoRenewAccountId')) {\n      if (params.autoRenewAccountId === null) {\n        transaction.setAutoRenewAccountId(AccountId.fromString('0.0.0'));\n      } else if (params.autoRenewAccountId) {\n        transaction.setAutoRenewAccountId(\n          params.autoRenewAccountId as string | AccountId\n        );\n      }\n    }\n\n    if (Object.prototype.hasOwnProperty.call(params, 'exemptAccountIds')) {\n      if (\n        params.exemptAccountIds &&\n        params.exemptAccountIds.length > 0 &&\n        !this.kit.signer.mirrorNode \n      ) {\n        this.logger.warn(\n          'MirrorNode client is not available on the signer, cannot set fee exempt keys by account ID for updateTopic if account IDs are provided and not empty.'\n        );\n        this.addNote('Could not set fee exempt accounts for topic update: MirrorNode client not available on signer.');\n      } else if (params.exemptAccountIds) {\n        if (params.exemptAccountIds.length === 0) {\n          transaction.setFeeExemptKeys([]);\n        } else {\n          try {\n            const publicKeys: PublicKey[] = [];\n            for (const accountIdStr of params.exemptAccountIds) {\n              const publicKey = await this.kit.signer.mirrorNode.getPublicKey(\n                accountIdStr\n              );\n              publicKeys.push(publicKey);\n            }\n            if (publicKeys.length > 0) {\n              transaction.setFeeExemptKeys(publicKeys);\n            } else {\n              this.addNote('Fee exempt accounts were provided, but no valid public keys could be resolved for them.');\n            }\n          } catch (e: unknown) {\n            const error = e as Error;\n            this.logger.error(\n              `Failed to process exemptAccountIds for updateTopic: ${error.message}`\n            );\n            this.addNote(`Error processing fee exempt accounts for topic update: ${error.message}. They may not be set.`);\n          }\n        }\n      }\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n}\n","import {\n  AccountId,\n  CustomFee,\n  TokenCreateTransaction,\n  TokenSupplyType,\n  TokenType,\n  TokenId,\n  Long,\n  TokenMintTransaction,\n  TokenBurnTransaction,\n  TransferTransaction,\n  TokenAssociateTransaction,\n  TokenDissociateTransaction,\n  Hbar,\n  TokenWipeTransaction,\n  TokenFreezeTransaction,\n  TokenUnfreezeTransaction,\n  TokenGrantKycTransaction,\n  TokenRevokeKycTransaction,\n  TokenPauseTransaction,\n  TokenUnpauseTransaction,\n  TokenUpdateTransaction,\n  TokenDeleteTransaction,\n  TokenFeeScheduleUpdateTransaction,\n  NftId,\n  TokenAirdropTransaction,\n  TokenClaimAirdropTransaction,\n  TokenCancelAirdropTransaction,\n  TokenRejectTransaction,\n  CustomFixedFee,\n  CustomFractionalFee,\n  CustomRoyaltyFee,\n  KeyList,\n  PublicKey,\n  FeeAssessmentMethod,\n} from '@hashgraph/sdk';\n\nimport {\n  FTCreateParams,\n  NFTCreateParams,\n  MintFTParams,\n  BurnFTParams,\n  MintNFTParams,\n  BurnNFTParams,\n  TransferNFTParams,\n  AssociateTokensParams,\n  DissociateTokensParams,\n  TransferTokensParams,\n  FungibleTokenTransferSpec,\n  WipeTokenAccountParams,\n  FreezeTokenAccountParams,\n  UnfreezeTokenAccountParams,\n  GrantKycTokenParams,\n  RevokeKycTokenParams,\n  PauseTokenParams,\n  UnpauseTokenParams,\n  UpdateTokenParams,\n  DeleteTokenParams,\n  TokenFeeScheduleUpdateParams,\n  AirdropTokenParams,\n  ClaimAirdropParams,\n  CancelAirdropParams,\n  RejectAirdropParams,\n} from '../../types';\nimport { BaseServiceBuilder } from '../base-service-builder';\nimport { Buffer } from 'buffer';\nimport { HederaAgentKit } from '../../agent/agent';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport { CustomFeeInputData } from '../../langchain/tools/hts/create-fungible-token-tool';\nimport { AgentOperationalMode } from '../../types';\n\nconst DEFAULT_AUTORENEW_PERIOD_SECONDS = 7776000;\n\nfunction generateDefaultSymbol(tokenName: string): string {\n  if (!tokenName) {\n    return 'TOKEN';\n  }\n  const symbol = tokenName\n    .replace(/[^a-zA-Z0-9]/g, '')\n    .substring(0, 5)\n    .toUpperCase();\n  if (symbol) {\n    return symbol;\n  }\n  return 'TOKEN';\n}\n\nfunction mapToSdkCustomFees(\n  fees: CustomFeeInputData[],\n  parseAmountFn: (amount?: number | string | Long | BigNumber) => Long,\n  logger: Logger,\n  kitUserAccountId?: string,\n  kitOperationalMode?: AgentOperationalMode,\n  addNoteFn?: (note: string) => void\n): CustomFee[] {\n  if (!fees || fees.length === 0) {\n    return [];\n  }\n\n  return fees.map((feeData: CustomFeeInputData) => {\n    let feeCollectorStringToParse = feeData.feeCollectorAccountId;\n\n    if (\n      !feeCollectorStringToParse &&\n      kitUserAccountId &&\n      kitOperationalMode === 'provideBytes'\n    ) {\n      feeCollectorStringToParse = kitUserAccountId;\n      if (addNoteFn) {\n        let feeTypeForNote = 'custom';\n        if (feeData.type === 'FIXED' || feeData.type === 'FIXED_FEE') {\n          feeTypeForNote = 'fixed';\n        } else if (\n          feeData.type === 'FRACTIONAL' ||\n          feeData.type === 'FRACTIONAL_FEE'\n        ) {\n          feeTypeForNote = 'fractional';\n        } else if (\n          feeData.type === 'ROYALTY' ||\n          feeData.type === 'ROYALTY_FEE'\n        ) {\n          feeTypeForNote = 'royalty';\n        }\n        addNoteFn(\n          `Fee collector for a ${feeTypeForNote} fee was defaulted to your account (${kitUserAccountId}).`\n        );\n      }\n    }\n\n    if (!feeCollectorStringToParse) {\n      throw new Error(\n        `Fee collector account ID is required for custom fee type ${feeData.type} but was not provided or defaulted.`\n      );\n    }\n\n    let feeCollectorSdkAccountId: AccountId;\n    try {\n      feeCollectorSdkAccountId = AccountId.fromString(\n        feeCollectorStringToParse\n      );\n    } catch (e) {\n      logger.error(\n        `Invalid feeCollectorAccountId: ${feeCollectorStringToParse}`,\n        e\n      );\n      throw new Error(\n        `Invalid feeCollectorAccountId: ${feeCollectorStringToParse}`\n      );\n    }\n\n    switch (feeData.type) {\n      case 'FIXED':\n      case 'FIXED_FEE': {\n        const fixedFee = new CustomFixedFee()\n          .setFeeCollectorAccountId(feeCollectorSdkAccountId)\n          .setAmount(parseAmountFn(feeData.amount));\n        if (feeData.denominatingTokenId) {\n          try {\n            fixedFee.setDenominatingTokenId(\n              TokenId.fromString(feeData.denominatingTokenId)\n            );\n          } catch (e) {\n            logger.error(\n              `Invalid denominatingTokenId for fixed fee: ${feeData.denominatingTokenId}`,\n              e\n            );\n            throw new Error(\n              `Invalid denominatingTokenId for fixed fee: ${feeData.denominatingTokenId}`\n            );\n          }\n        }\n        return fixedFee;\n      }\n      case 'FRACTIONAL':\n      case 'FRACTIONAL_FEE': {\n        const fractionalFee = new CustomFractionalFee()\n          .setFeeCollectorAccountId(feeCollectorSdkAccountId)\n          .setNumerator(parseAmountFn(feeData.numerator).toNumber())\n          .setDenominator(parseAmountFn(feeData.denominator).toNumber());\n        if (feeData.minAmount !== undefined) {\n          fractionalFee.setMin(parseAmountFn(feeData.minAmount));\n        }\n        if (feeData.maxAmount !== undefined) {\n          fractionalFee.setMax(parseAmountFn(feeData.maxAmount));\n        }\n        const fractionalFeeData = feeData as Extract<\n          CustomFeeInputData,\n          { type: 'FRACTIONAL' | 'FRACTIONAL_FEE' }\n        >;\n        if (fractionalFeeData.assessmentMethodInclusive !== undefined) {\n          if (fractionalFeeData.assessmentMethodInclusive) {\n            fractionalFee.setAssessmentMethod(FeeAssessmentMethod.Inclusive);\n          } else {\n            fractionalFee.setAssessmentMethod(FeeAssessmentMethod.Exclusive);\n          }\n        }\n        return fractionalFee;\n      }\n      case 'ROYALTY':\n      case 'ROYALTY_FEE': {\n        const royaltyFee = new CustomRoyaltyFee()\n          .setFeeCollectorAccountId(feeCollectorSdkAccountId)\n          .setNumerator(parseAmountFn(feeData.numerator).toNumber())\n          .setDenominator(parseAmountFn(feeData.denominator).toNumber());\n        const royaltyFeeData = feeData as Extract<\n          CustomFeeInputData,\n          { type: 'ROYALTY' | 'ROYALTY_FEE' }\n        >;\n        if (royaltyFeeData.fallbackFee) {\n          let fallbackFeeCollectorStringToParse =\n            royaltyFeeData.fallbackFee.feeCollectorAccountId;\n          if (\n            !fallbackFeeCollectorStringToParse &&\n            kitUserAccountId &&\n            kitOperationalMode === 'provideBytes'\n          ) {\n            fallbackFeeCollectorStringToParse = kitUserAccountId;\n            if (addNoteFn) {\n              addNoteFn(\n                `Fallback fee collector for a royalty fee was also defaulted to your account (${kitUserAccountId}).`\n              );\n            }\n          }\n          if (!fallbackFeeCollectorStringToParse) {\n            throw new Error(\n              `Fallback fee collector account ID is required for royalty fee but was not provided or defaulted.`\n            );\n          }\n          let fallbackFeeCollectorSdkAccountId: AccountId;\n          try {\n            fallbackFeeCollectorSdkAccountId = AccountId.fromString(\n              fallbackFeeCollectorStringToParse\n            );\n          } catch (e) {\n            logger.error(\n              `Invalid feeCollectorAccountId in fallbackFee: ${fallbackFeeCollectorStringToParse}`,\n              e\n            );\n            throw new Error(\n              `Invalid feeCollectorAccountId in fallbackFee: ${fallbackFeeCollectorStringToParse}`\n            );\n          }\n          const fallback = new CustomFixedFee()\n            .setFeeCollectorAccountId(fallbackFeeCollectorSdkAccountId)\n            .setAmount(parseAmountFn(royaltyFeeData.fallbackFee.amount));\n          if (royaltyFeeData.fallbackFee.denominatingTokenId) {\n            try {\n              fallback.setDenominatingTokenId(\n                TokenId.fromString(\n                  royaltyFeeData.fallbackFee.denominatingTokenId\n                )\n              );\n            } catch (e) {\n              logger.error(\n                `Invalid denominatingTokenId in fallbackFee: ${royaltyFeeData.fallbackFee.denominatingTokenId}`,\n                e\n              );\n              throw new Error(\n                `Invalid denominatingTokenId in fallbackFee: ${royaltyFeeData.fallbackFee.denominatingTokenId}`\n              );\n            }\n          }\n          royaltyFee.setFallbackFee(fallback);\n        }\n        return royaltyFee;\n      }\n      default: {\n        const exhaustiveCheck: never = feeData;\n        logger.warn(\n          `Unsupported custom fee type encountered: ${\n            (exhaustiveCheck as any).type\n          }`\n        );\n        throw new Error(\n          `Unsupported custom fee type: ${(exhaustiveCheck as any).type}`\n        );\n      }\n    }\n  });\n}\n\n/**\n * HtsBuilder facilitates the construction and execution of Hedera Token Service (HTS) transactions.\n */\nexport class HtsBuilder extends BaseServiceBuilder {\n  constructor(hederaKit: HederaAgentKit) {\n    super(hederaKit);\n  }\n\n  /**\n   * @param {FTCreateParams} params\n   * @returns {Promise<this>}\n   * @throws {Error}\n   */\n  public async createFungibleToken(params: FTCreateParams): Promise<this> {\n    this.clearNotes();\n    let treasuryAccId = params.treasuryAccountId;\n    if (\n      !treasuryAccId &&\n      this.kit.userAccountId &&\n      this.kit.operationalMode === 'provideBytes'\n    ) {\n      this.logger.info(\n        `[HtsBuilder.createFungibleToken] Using userAccountId ${this.kit.userAccountId} as treasury for FT creation in provideBytes mode.`\n      );\n      treasuryAccId = AccountId.fromString(this.kit.userAccountId);\n      this.addNote(\n        `Since no treasury was specified, your account (${this.kit.userAccountId}) has been set as the token's treasury.`\n      );\n    }\n    if (!treasuryAccId) {\n      throw new Error(\n        '[HtsBuilder.createFungibleToken] Treasury Account ID is required (e.g., explicitly, via userAccountId for provideBytes mode, or via agent operator for directExecution if applicable).'\n      );\n    }\n\n    let tokenSymbolToUse = params.tokenSymbol;\n    if (!tokenSymbolToUse) {\n      tokenSymbolToUse = generateDefaultSymbol(params.tokenName);\n      this.addNote(\n        `We've generated a token symbol '${tokenSymbolToUse}' for you, based on the token name '${params.tokenName}'.`\n      );\n    }\n\n    let sdkSupplyType: TokenSupplyType;\n    if (typeof params.supplyType === 'string') {\n      const supplyTypeString: string = params.supplyType;\n      if (\n        supplyTypeString.toUpperCase() ===\n        TokenSupplyType.Finite.toString().toUpperCase()\n      ) {\n        sdkSupplyType = TokenSupplyType.Finite;\n      } else if (\n        supplyTypeString.toUpperCase() ===\n        TokenSupplyType.Infinite.toString().toUpperCase()\n      ) {\n        sdkSupplyType = TokenSupplyType.Infinite;\n      } else {\n        this.logger.warn(\n          `Invalid string for supplyType: ${supplyTypeString}. Defaulting to INFINITE.`\n        );\n        this.addNote(\n          `Invalid supplyType string '${supplyTypeString}' received, defaulted to INFINITE.`\n        );\n        sdkSupplyType = TokenSupplyType.Infinite;\n      }\n    } else {\n      sdkSupplyType = params.supplyType;\n    }\n\n    const transaction = new TokenCreateTransaction()\n      .setTokenName(params.tokenName)\n      .setTokenSymbol(tokenSymbolToUse)\n      .setTreasuryAccountId(treasuryAccId)\n      .setTokenType(TokenType.FungibleCommon)\n      .setSupplyType(sdkSupplyType)\n      .setInitialSupply(this.parseAmount(params.initialSupply))\n      .setDecimals(params.decimals);\n\n    if (sdkSupplyType === TokenSupplyType.Finite && params.maxSupply) {\n      transaction.setMaxSupply(this.parseAmount(params.maxSupply));\n    }\n    if (params.adminKey) {\n      const parsedKey = await this.parseKey(params.adminKey);\n      if (parsedKey) transaction.setAdminKey(parsedKey);\n    }\n    if (params.kycKey) {\n      const parsedKey = await this.parseKey(params.kycKey);\n      if (parsedKey) transaction.setKycKey(parsedKey);\n    }\n    if (params.freezeKey) {\n      const parsedKey = await this.parseKey(params.freezeKey);\n      if (parsedKey) transaction.setFreezeKey(parsedKey);\n    }\n    if (params.wipeKey) {\n      const parsedKey = await this.parseKey(params.wipeKey);\n      if (parsedKey) transaction.setWipeKey(parsedKey);\n    }\n    if (params.supplyKey) {\n      const parsedKey = await this.parseKey(params.supplyKey);\n      if (parsedKey) transaction.setSupplyKey(parsedKey);\n    }\n    if (params.feeScheduleKey) {\n      const parsedKey = await this.parseKey(params.feeScheduleKey);\n      if (parsedKey) transaction.setFeeScheduleKey(parsedKey);\n    }\n    if (params.pauseKey) {\n      const parsedKey = await this.parseKey(params.pauseKey);\n      if (parsedKey) transaction.setPauseKey(parsedKey);\n    }\n    if (params.memo) {\n      transaction.setTokenMemo(params.memo);\n    }\n    if (params.customFees && params.customFees.length > 0) {\n      const sdkCustomFees = mapToSdkCustomFees(\n        params.customFees as unknown as CustomFeeInputData[],\n        this.parseAmount.bind(this),\n        this.logger,\n        this.kit.userAccountId,\n        this.kit.operationalMode,\n        this.addNote.bind(this)\n      );\n      transaction.setCustomFees(sdkCustomFees);\n    }\n    if (params.autoRenewAccountId) {\n      transaction.setAutoRenewAccountId(params.autoRenewAccountId);\n    }\n    if (params.autoRenewPeriod) {\n      transaction.setAutoRenewPeriod(params.autoRenewPeriod);\n    } else if (params.autoRenewAccountId) {\n      transaction.setAutoRenewPeriod(DEFAULT_AUTORENEW_PERIOD_SECONDS);\n      this.addNote(\n        `A standard auto-renew period of ${\n          DEFAULT_AUTORENEW_PERIOD_SECONDS / (24 * 60 * 60)\n        } days has been set for this token.`\n      );\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Creates a non-fungible token. If the supply key is not provided, the operator's public key will be used.\n   * @param {NFTCreateParams} params\n   * @returns {Promise<this>}\n   * @throws {Error}\n   */\n  public async createNonFungibleToken(params: NFTCreateParams): Promise<this> {\n    this.clearNotes();\n    let treasuryAccId = params.treasuryAccountId;\n    if (\n      !treasuryAccId &&\n      this.kit.userAccountId &&\n      this.kit.operationalMode === 'provideBytes'\n    ) {\n      this.logger.info(\n        `[HtsBuilder.createNonFungibleToken] Using userAccountId ${this.kit.userAccountId} as treasury for NFT creation in provideBytes mode.`\n      );\n      treasuryAccId = AccountId.fromString(this.kit.userAccountId);\n      this.addNote(\n        `Since no treasury was specified, your account (${this.kit.userAccountId}) has been set as the NFT collection's treasury.`\n      );\n    }\n    if (!treasuryAccId) {\n      throw new Error(\n        '[HtsBuilder.createNonFungibleToken] Treasury Account ID is required (e.g., explicitly, via userAccountId for provideBytes mode, or via agent operator for directExecution if applicable).'\n      );\n    }\n\n    let tokenSymbolToUse = params.tokenSymbol;\n    if (!tokenSymbolToUse) {\n      tokenSymbolToUse = generateDefaultSymbol(params.tokenName);\n      this.addNote(\n        `We've generated an NFT collection symbol '${tokenSymbolToUse}' for you, based on the collection name '${params.tokenName}'.`\n      );\n    }\n\n    let sdkSupplyType: TokenSupplyType;\n    if (typeof params.supplyType === 'string') {\n      const supplyTypeString: string = params.supplyType;\n      if (\n        supplyTypeString.toUpperCase() ===\n        TokenSupplyType.Finite.toString().toUpperCase()\n      ) {\n        sdkSupplyType = TokenSupplyType.Finite;\n      } else if (\n        supplyTypeString.toUpperCase() ===\n        TokenSupplyType.Infinite.toString().toUpperCase()\n      ) {\n        sdkSupplyType = TokenSupplyType.Infinite;\n      } else {\n        this.logger.warn(\n          `Invalid string for NFT supplyType: ${supplyTypeString}. Defaulting to FINITE as per NFT common practice.`\n        );\n        this.addNote(\n          `Invalid supplyType string '${supplyTypeString}' received for NFT, defaulted to FINITE.`\n        );\n        sdkSupplyType = TokenSupplyType.Finite;\n      }\n    } else {\n      sdkSupplyType = params.supplyType;\n    }\n\n    const transaction = new TokenCreateTransaction()\n      .setTokenName(params.tokenName)\n      .setTokenSymbol(tokenSymbolToUse)\n      .setTreasuryAccountId(treasuryAccId)\n      .setTokenType(TokenType.NonFungibleUnique)\n      .setSupplyType(sdkSupplyType)\n      .setInitialSupply(0)\n      .setDecimals(0);\n\n    if (sdkSupplyType === TokenSupplyType.Finite && params.maxSupply) {\n      transaction.setMaxSupply(this.parseAmount(params.maxSupply));\n    } else if (sdkSupplyType === TokenSupplyType.Finite && !params.maxSupply) {\n      this.logger.warn(\n        'NFT supplyType is FINITE but no maxSupply was provided. This might lead to an unmintable token or undesired SDK default. Consider prompting user for maxSupply or setting a builder default.'\n      );\n      this.addNote(\n        'For this FINITE NFT collection, a specific maximum supply was not provided. The Hedera network might apply its own default or limit minting.'\n      );\n    }\n    if (params.adminKey) {\n      const parsedKey = await this.parseKey(params.adminKey);\n      if (parsedKey) transaction.setAdminKey(parsedKey);\n    }\n    if (params.kycKey) {\n      const parsedKey = await this.parseKey(params.kycKey);\n      if (parsedKey) transaction.setKycKey(parsedKey);\n    }\n    if (params.freezeKey) {\n      const parsedKey = await this.parseKey(params.freezeKey);\n      if (parsedKey) transaction.setFreezeKey(parsedKey);\n    }\n    if (params.wipeKey) {\n      const parsedKey = await this.parseKey(params.wipeKey);\n      if (parsedKey) {\n        transaction.setWipeKey(parsedKey);\n      }\n    }\n\n    if (params.supplyKey) {\n      const parsedKey = await this.parseKey(params.supplyKey);\n      if (parsedKey) {\n        transaction.setSupplyKey(parsedKey);\n      }\n    } else {\n      const operator = await this.kit.query().getAccountInfo(treasuryAccId);\n      const key = operator?.key?.key;\n      if (key) {\n        transaction.setSupplyKey(PublicKey.fromString(key));\n      }\n    }\n\n    if (params.feeScheduleKey) {\n      const parsedKey = await this.parseKey(params.feeScheduleKey);\n      if (parsedKey) {\n        transaction.setFeeScheduleKey(parsedKey);\n      }\n    }\n    if (params.pauseKey) {\n      const parsedKey = await this.parseKey(params.pauseKey);\n      if (parsedKey) {\n        transaction.setPauseKey(parsedKey);\n      }\n    }\n    if (params.memo) {\n      transaction.setTokenMemo(params.memo);\n    }\n    if (params.customFees && params.customFees.length > 0) {\n      const sdkCustomFees = mapToSdkCustomFees(\n        params.customFees as unknown as CustomFeeInputData[],\n        this.parseAmount.bind(this),\n        this.logger,\n        this.kit.userAccountId,\n        this.kit.operationalMode,\n        this.addNote.bind(this)\n      );\n      transaction.setCustomFees(sdkCustomFees);\n    }\n    if (params.autoRenewAccountId) {\n      transaction.setAutoRenewAccountId(params.autoRenewAccountId);\n    }\n    if (params.autoRenewPeriod) {\n      transaction.setAutoRenewPeriod(params.autoRenewPeriod);\n    } else if (params.autoRenewAccountId) {\n      transaction.setAutoRenewPeriod(DEFAULT_AUTORENEW_PERIOD_SECONDS);\n      this.addNote(\n        `A standard auto-renew period of ${\n          DEFAULT_AUTORENEW_PERIOD_SECONDS / (24 * 60 * 60)\n        } days has been set for this NFT collection.`\n      );\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {MintFTParams} params\n   * @returns {this}\n   */\n  public mintFungibleToken(params: MintFTParams): this {\n    const transaction = new TokenMintTransaction()\n      .setTokenId(params.tokenId)\n      .setAmount(this.parseAmount(params.amount));\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {BurnFTParams} params\n   * @returns {this}\n   */\n  public burnFungibleToken(params: BurnFTParams): this {\n    const transaction = new TokenBurnTransaction()\n      .setTokenId(params.tokenId)\n      .setAmount(this.parseAmount(params.amount));\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {MintNFTParams} params\n   * @returns {this}\n   * @throws {Error}\n   */\n  public mintNonFungibleToken(params: MintNFTParams): this {\n    const transaction = new TokenMintTransaction()\n      .setTokenId(params.tokenId)\n      .setMetadata(\n        params.metadata.map((m) => {\n          if (typeof m === 'string') {\n            return Buffer.from(m, 'utf8');\n          }\n          return m;\n        })\n      );\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {BurnNFTParams} params\n   * @returns {this}\n   */\n  public burnNonFungibleToken(params: BurnNFTParams): this {\n    if (!params.serials || params.serials.length === 0) {\n      throw new Error('Serial numbers are required to burn NFTs.');\n    }\n    const serialsAsLong = params.serials.map((s) => this.parseAmount(s));\n    const transaction = new TokenBurnTransaction()\n      .setTokenId(params.tokenId)\n      .setSerials(serialsAsLong);\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {TransferNFTParams} params - Parameters for transferring a single NFT.\n   * @returns {this}\n   */\n  public transferNft(params: TransferNFTParams): this {\n    let transaction: TransferTransaction = new TransferTransaction();\n\n    if (!params.isApproved) {\n      transaction = transaction.addNftTransfer(\n        params.nftId,\n        params.senderAccountId,\n        params.receiverAccountId\n      );\n    } else {\n      transaction = transaction.addApprovedNftTransfer(\n        params.nftId,\n        params.senderAccountId,\n        params.receiverAccountId\n      );\n    }\n\n    if (params.memo) {\n      transaction.setTransactionMemo(params.memo);\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {AssociateTokensParams} params\n   * @returns {this}\n   */\n  public associateTokens(params: AssociateTokensParams): this {\n    const transaction = new TokenAssociateTransaction()\n      .setAccountId(params.accountId)\n      .setTokenIds(\n        params.tokenIds.map((id) =>\n          typeof id === 'string' ? TokenId.fromString(id) : id\n        )\n      );\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {DissociateTokensParams} params\n   * @returns {this}\n   */\n  public dissociateTokens(params: DissociateTokensParams): this {\n    const transaction = new TokenDissociateTransaction()\n      .setAccountId(params.accountId)\n      .setTokenIds(\n        params.tokenIds.map((id) =>\n          typeof id === 'string' ? TokenId.fromString(id) : id\n        )\n      );\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {TransferTokensParams} params - Parameters for transferring fungible tokens, NFTs, and/or HBAR.\n   * @returns {this}\n   */\n  public transferTokens(params: TransferTokensParams): this {\n    const transaction = new TransferTransaction();\n\n    if (params.tokenTransfers && params.tokenTransfers.length > 0) {\n      for (const transferInput of params.tokenTransfers) {\n        if (transferInput.type === 'fungible') {\n          const fungibleTransfer = transferInput as FungibleTokenTransferSpec;\n          transaction.addTokenTransfer(\n            typeof fungibleTransfer.tokenId === 'string'\n              ? TokenId.fromString(fungibleTransfer.tokenId)\n              : fungibleTransfer.tokenId,\n            typeof fungibleTransfer.accountId === 'string'\n              ? AccountId.fromString(fungibleTransfer.accountId)\n              : fungibleTransfer.accountId,\n            this.parseAmount(fungibleTransfer.amount)\n          );\n        } else if (transferInput.type === 'nft') {\n          const toolNftInput = transferInput as any;\n\n          const sdkTokenId = TokenId.fromString(toolNftInput.tokenId as string);\n\n          let serialValueForLong: number | Long;\n          if (typeof toolNftInput.serial === 'string') {\n            serialValueForLong = parseInt(toolNftInput.serial, 10);\n          } else {\n            serialValueForLong = toolNftInput.serial as number | Long;\n          }\n          const sdkSerial = Long.fromValue(serialValueForLong);\n          const sdkNftId = new NftId(sdkTokenId, sdkSerial);\n\n          const senderAccountId = AccountId.fromString(\n            toolNftInput.senderAccountId as string\n          );\n          const receiverAccountId = AccountId.fromString(\n            toolNftInput.receiverAccountId as string\n          );\n\n          if (toolNftInput.isApproved) {\n            transaction.addApprovedNftTransfer(\n              sdkNftId,\n              senderAccountId,\n              receiverAccountId\n            );\n          } else {\n            transaction.addNftTransfer(\n              sdkNftId,\n              senderAccountId,\n              receiverAccountId\n            );\n          }\n        }\n      }\n    }\n\n    if (params.hbarTransfers && params.hbarTransfers.length > 0) {\n      for (const hbarInput of params.hbarTransfers) {\n        const sdkHbarAmount = Hbar.fromString(hbarInput.amount.toString());\n        transaction.addHbarTransfer(\n          typeof hbarInput.accountId === 'string'\n            ? AccountId.fromString(hbarInput.accountId)\n            : hbarInput.accountId,\n          sdkHbarAmount\n        );\n      }\n    }\n\n    if (params.memo) {\n      transaction.setTransactionMemo(params.memo);\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {WipeTokenAccountParams} params\n   * @returns {this}\n   * @throws {Error}\n   */\n  public wipeTokenAccount(params: WipeTokenAccountParams): this {\n    const transaction = new TokenWipeTransaction()\n      .setAccountId(params.accountId)\n      .setTokenId(\n        typeof params.tokenId === 'string'\n          ? TokenId.fromString(params.tokenId)\n          : params.tokenId\n      );\n    if (params.amount) {\n      transaction.setAmount(this.parseAmount(params.amount));\n    }\n    if (params.serials && params.serials.length > 0) {\n      transaction.setSerials(params.serials.map((s) => this.parseAmount(s)));\n    }\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {FreezeTokenAccountParams} params\n   * @returns {this}\n   */\n  public freezeTokenAccount(params: FreezeTokenAccountParams): this {\n    const transaction = new TokenFreezeTransaction()\n      .setAccountId(params.accountId)\n      .setTokenId(\n        typeof params.tokenId === 'string'\n          ? TokenId.fromString(params.tokenId)\n          : params.tokenId\n      );\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {UnfreezeTokenAccountParams} params\n   * @returns {this}\n   */\n  public unfreezeTokenAccount(params: UnfreezeTokenAccountParams): this {\n    const transaction = new TokenUnfreezeTransaction()\n      .setAccountId(params.accountId)\n      .setTokenId(\n        typeof params.tokenId === 'string'\n          ? TokenId.fromString(params.tokenId)\n          : params.tokenId\n      );\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {GrantKycTokenParams} params\n   * @returns {this}\n   */\n  public grantKycToken(params: GrantKycTokenParams): this {\n    const transaction = new TokenGrantKycTransaction()\n      .setAccountId(params.accountId)\n      .setTokenId(\n        typeof params.tokenId === 'string'\n          ? TokenId.fromString(params.tokenId)\n          : params.tokenId\n      );\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {RevokeKycTokenParams} params\n   * @returns {this}\n   */\n  public revokeKycToken(params: RevokeKycTokenParams): this {\n    const transaction = new TokenRevokeKycTransaction()\n      .setAccountId(params.accountId)\n      .setTokenId(\n        typeof params.tokenId === 'string'\n          ? TokenId.fromString(params.tokenId)\n          : params.tokenId\n      );\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {PauseTokenParams} params\n   * @returns {this}\n   */\n  public pauseToken(params: PauseTokenParams): this {\n    const transaction = new TokenPauseTransaction().setTokenId(\n      typeof params.tokenId === 'string'\n        ? TokenId.fromString(params.tokenId)\n        : params.tokenId\n    );\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {UnpauseTokenParams} params\n   * @returns {this}\n   */\n  public unpauseToken(params: UnpauseTokenParams): this {\n    const transaction = new TokenUnpauseTransaction().setTokenId(\n      typeof params.tokenId === 'string'\n        ? TokenId.fromString(params.tokenId)\n        : params.tokenId\n    );\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {UpdateTokenParams} params\n   * @returns {Promise<this>}\n   * @throws {Error}\n   */\n  public async updateToken(params: UpdateTokenParams): Promise<this> {\n    if (!params.tokenId) {\n      throw new Error('Token ID is required to update a token.');\n    }\n    this.logger.info(\n      `[HtsBuilder.updateToken] Starting update for token ID: ${params.tokenId.toString()}`\n    );\n    const transaction = new TokenUpdateTransaction().setTokenId(\n      typeof params.tokenId === 'string'\n        ? TokenId.fromString(params.tokenId)\n        : params.tokenId\n    );\n\n    if (Object.prototype.hasOwnProperty.call(params, 'tokenName')) {\n      transaction.setTokenName(\n        params.tokenName === null ? '' : params.tokenName!\n      );\n    }\n    if (Object.prototype.hasOwnProperty.call(params, 'tokenSymbol')) {\n      transaction.setTokenSymbol(\n        params.tokenSymbol === null ? '' : params.tokenSymbol!\n      );\n    }\n    if (params.treasuryAccountId) {\n      transaction.setTreasuryAccountId(params.treasuryAccountId);\n    }\n\n    if (Object.prototype.hasOwnProperty.call(params, 'adminKey')) {\n      if (params.adminKey === null) transaction.setAdminKey(new KeyList());\n      else if (params.adminKey) {\n        const pk = await this.parseKey(params.adminKey);\n        if (pk) transaction.setAdminKey(pk);\n      }\n    }\n    if (Object.prototype.hasOwnProperty.call(params, 'kycKey')) {\n      if (params.kycKey === null) transaction.setKycKey(new KeyList());\n      else if (params.kycKey) {\n        const pk = await this.parseKey(params.kycKey);\n        if (pk) transaction.setKycKey(pk);\n      }\n    }\n    if (Object.prototype.hasOwnProperty.call(params, 'freezeKey')) {\n      if (params.freezeKey === null) transaction.setFreezeKey(new KeyList());\n      else if (params.freezeKey) {\n        const pk = await this.parseKey(params.freezeKey);\n        if (pk) transaction.setFreezeKey(pk);\n      }\n    }\n    if (Object.prototype.hasOwnProperty.call(params, 'wipeKey')) {\n      if (params.wipeKey === null) transaction.setWipeKey(new KeyList());\n      else if (params.wipeKey) {\n        const pk = await this.parseKey(params.wipeKey);\n        if (pk) transaction.setWipeKey(pk);\n      }\n    }\n    if (Object.prototype.hasOwnProperty.call(params, 'supplyKey')) {\n      if (params.supplyKey === null) transaction.setSupplyKey(new KeyList());\n      else if (params.supplyKey) {\n        const pk = await this.parseKey(params.supplyKey);\n        if (pk) transaction.setSupplyKey(pk);\n      }\n    }\n    if (Object.prototype.hasOwnProperty.call(params, 'feeScheduleKey')) {\n      if (params.feeScheduleKey === null)\n        transaction.setFeeScheduleKey(new KeyList());\n      else if (params.feeScheduleKey) {\n        const pk = await this.parseKey(params.feeScheduleKey);\n        if (pk) transaction.setFeeScheduleKey(pk);\n      }\n    }\n    if (Object.prototype.hasOwnProperty.call(params, 'pauseKey')) {\n      if (params.pauseKey === null) transaction.setPauseKey(new KeyList());\n      else if (params.pauseKey) {\n        const pk = await this.parseKey(params.pauseKey);\n        if (pk) transaction.setPauseKey(pk);\n      }\n    }\n\n    if (Object.prototype.hasOwnProperty.call(params, 'memo')) {\n      transaction.setTokenMemo(params.memo === null ? '' : params.memo!);\n    }\n\n    if (Object.prototype.hasOwnProperty.call(params, 'autoRenewAccountId')) {\n      const autoRenewId = params.autoRenewAccountId;\n      if (autoRenewId === null) {\n        transaction.setAutoRenewAccountId(AccountId.fromString('0.0.0'));\n      } else if (autoRenewId) {\n        transaction.setAutoRenewAccountId(autoRenewId);\n      }\n    }\n    if (params.autoRenewPeriod) {\n      transaction.setAutoRenewPeriod(params.autoRenewPeriod);\n    }\n\n    this.logger.info(\n      '[HtsBuilder.updateToken] Transaction object populated. Setting current transaction.',\n      transaction\n    );\n    this.setCurrentTransaction(transaction);\n    this.logger.info(\n      '[HtsBuilder.updateToken] Current transaction set. Value:',\n      this.currentTransaction\n    );\n    return this;\n  }\n\n  /**\n   * @param {DeleteTokenParams} params\n   * @returns {this}\n   */\n  public deleteToken(params: DeleteTokenParams): this {\n    if (!params.tokenId) {\n      throw new Error('Token ID is required to delete a token.');\n    }\n    const transaction = new TokenDeleteTransaction().setTokenId(\n      typeof params.tokenId === 'string'\n        ? TokenId.fromString(params.tokenId)\n        : params.tokenId\n    );\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {TokenFeeScheduleUpdateParams} params\n   * @returns {this}\n   */\n  public async feeScheduleUpdate(\n    params: TokenFeeScheduleUpdateParams\n  ): Promise<this> {\n    this.clearNotes();\n    if (!params.tokenId) {\n      throw new Error('Token ID is required to update fee schedule.');\n    }\n    const sdkCustomFees = mapToSdkCustomFees(\n      params.customFees as unknown as CustomFeeInputData[],\n      this.parseAmount.bind(this),\n      this.logger,\n      this.kit.userAccountId,\n      this.kit.operationalMode,\n      this.addNote.bind(this)\n    );\n    const transaction = new TokenFeeScheduleUpdateTransaction()\n      .setTokenId(\n        typeof params.tokenId === 'string'\n          ? TokenId.fromString(params.tokenId)\n          : params.tokenId\n      )\n      .setCustomFees(sdkCustomFees);\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Configures a transaction to airdrop fungible tokens from the operator's account to multiple recipients.\n   * This method uses the `TokenAirdropTransaction`.\n   * @param {AirdropTokenParams} params - Parameters for the airdrop.\n   * @returns {this} The HtsBuilder instance for fluent chaining.\n   * @throws {Error} If no recipients are provided or if amounts are invalid.\n   */\n  public airdropToken(params: AirdropTokenParams): this {\n    if (!params.recipients || params.recipients.length === 0) {\n      throw new Error('Recipients are required for an airdrop.');\n    }\n\n    const transaction = new TokenAirdropTransaction();\n    const operatorAccountId = this.kit.signer.getAccountId();\n    const tokenId =\n      typeof params.tokenId === 'string'\n        ? TokenId.fromString(params.tokenId)\n        : params.tokenId;\n    let validTransfersMade = false;\n\n    for (const recipient of params.recipients) {\n      const transferAmount = this.parseAmount(recipient.amount);\n\n      if (transferAmount.isZero() || transferAmount.isNegative()) {\n        this.logger.warn(\n          `Skipping airdrop to ${recipient.accountId.toString()} with zero or negative amount.`\n        );\n        continue;\n      }\n\n      transaction.addTokenTransfer(\n        tokenId,\n        operatorAccountId,\n        transferAmount.negate()\n      );\n      transaction.addTokenTransfer(\n        tokenId,\n        recipient.accountId,\n        transferAmount\n      );\n      validTransfersMade = true;\n    }\n\n    if (!validTransfersMade) {\n      throw new Error(\n        'No valid transfers generated for the airdrop. Check recipient amounts.'\n      );\n    }\n\n    if (params.memo) {\n      transaction.setTransactionMemo(params.memo);\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Configures a transaction to claim pending airdrops.\n   * The operator (signer) is the recipient of the claim.\n   * @param {ClaimAirdropParams} params - Parameters specifying which pending airdrops to claim.\n   *                                      The `pendingAirdropIds` should be valid `PendingAirdropId` instances from the SDK.\n   * @returns {this} The HtsBuilder instance for fluent chaining.\n   * @throws {Error} If no `pendingAirdropIds` are provided.\n   */\n  public claimAirdrop(params: ClaimAirdropParams): this {\n    if (!params.pendingAirdropIds || params.pendingAirdropIds.length === 0) {\n      throw new Error(\n        'pendingAirdropIds must be provided and non-empty for claimAirdrop.'\n      );\n    }\n\n    const transaction = new TokenClaimAirdropTransaction();\n\n    for (const pendingId of params.pendingAirdropIds) {\n      transaction.addPendingAirdropId(pendingId);\n    }\n\n    if (params.memo) {\n      transaction.setTransactionMemo(params.memo);\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Configures a transaction to cancel pending airdrops sent by the operator.\n   * @param {CancelAirdropParams} params - Parameters specifying which pending airdrops to cancel.\n   *                                       The `pendingAirdropIds` should be valid `PendingAirdropId` instances from the SDK.\n   * @returns {this} The HtsBuilder instance for fluent chaining.\n   * @throws {Error} If no `pendingAirdropIds` are provided.\n   */\n  public cancelAirdrop(params: CancelAirdropParams): this {\n    if (!params.pendingAirdropIds || params.pendingAirdropIds.length === 0) {\n      throw new Error(\n        'pendingAirdropIds must be provided and non-empty for cancelAirdrop.'\n      );\n    }\n    const transaction = new TokenCancelAirdropTransaction();\n\n    transaction.setPendingAirdropIds(params.pendingAirdropIds);\n\n    if (params.memo) {\n      transaction.setTransactionMemo(params.memo);\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Configures a transaction for the operator to reject future auto-associations with specified token types.\n   * @param {RejectAirdropParams} params - Parameters specifying which tokens to reject.\n   *        Note: `senderAccountId` and `serials` from `RejectAirdropParams` are currently ignored by this method\n   *        as `TokenRejectTransaction` operates on token types for the owner.\n   * @returns {this} The HtsBuilder instance for fluent chaining.\n   */\n  public rejectTokens(params: RejectAirdropParams): this {\n    const transaction = new TokenRejectTransaction().setOwnerId(\n      this.kit.signer.getAccountId()\n    );\n\n    const tokenToReject =\n      typeof params.tokenId === 'string'\n        ? TokenId.fromString(params.tokenId)\n        : params.tokenId;\n    transaction.addTokenId(tokenToReject);\n\n    if (params.memo) {\n      transaction.setTransactionMemo(params.memo);\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n}\n","import {\n  AccountCreateTransaction,\n  AccountUpdateTransaction,\n  AccountDeleteTransaction,\n  Hbar,\n  TransferTransaction,\n  Long,\n  AccountAllowanceApproveTransaction,\n  AccountAllowanceDeleteTransaction,\n  TokenId,\n  NftId,\n  Key,\n  AccountId,\n  ScheduleId,\n  ScheduleSignTransaction,\n} from '@hashgraph/sdk';\nimport BigNumber from 'bignumber.js';\nimport { detectKeyTypeFromString } from '@hashgraphonline/standards-sdk';\nimport {\n  CreateAccountParams,\n  HbarTransferParams,\n  UpdateAccountParams,\n  DeleteAccountParams,\n  ApproveHbarAllowanceParams,\n  ApproveTokenNftAllowanceParams,\n  ApproveFungibleTokenAllowanceParams,\n  RevokeHbarAllowanceParams,\n  RevokeFungibleTokenAllowanceParams,\n  DeleteNftSpenderAllowanceParams,\n  DeleteNftSpenderAllowanceToolParams,\n  DeleteNftSerialAllowancesParams,\n  SignScheduledTransactionParams,\n} from '../../types';\nimport { BaseServiceBuilder } from '../base-service-builder';\nimport { HederaAgentKit } from '../../agent/agent';\n\nconst DEFAULT_ACCOUNT_AUTORENEW_PERIOD_SECONDS = 7776000;\n\n/**\n * AccountBuilder facilitates the construction and execution of Hedera account-related transactions.\n */\nexport class AccountBuilder extends BaseServiceBuilder {\n  constructor(hederaKit: HederaAgentKit) {\n    super(hederaKit);\n  }\n\n  /**\n   * Creates a new Hedera account.\n   * @param {CreateAccountParams} params Parameters for creating an account.\n   * @returns {this} The builder instance for chaining.\n   * @throws {Error} If required parameters are missing.\n   */\n  public createAccount(params: CreateAccountParams): this {\n    this.clearNotes();\n    const transaction = new AccountCreateTransaction();\n    let autoRenewPeriodSetByUser = false;\n\n    if (typeof params.key !== 'undefined') {\n      if (params.key === null) {\n        this.logger.warn(\n          'Received null for key in createAccount. A key or alias is typically required.'\n        );\n      } else if (typeof params.key === 'string') {\n        const keyDetection = detectKeyTypeFromString(params.key);\n        transaction.setKeyWithoutAlias(keyDetection.privateKey);\n      } else {\n        transaction.setKeyWithoutAlias(params.key as Key);\n      }\n    }\n\n    if (typeof params.initialBalance !== 'undefined') {\n      if (params.initialBalance === null) {\n        this.logger.warn('Received null for initialBalance in createAccount.');\n      } else if (typeof params.initialBalance === 'string') {\n        transaction.setInitialBalance(Hbar.fromString(params.initialBalance));\n      } else if (typeof params.initialBalance === 'number') {\n        transaction.setInitialBalance(new Hbar(params.initialBalance));\n      } else {\n        transaction.setInitialBalance(params.initialBalance);\n      }\n    }\n\n    if (typeof params.receiverSignatureRequired !== 'undefined') {\n      if (params.receiverSignatureRequired === null) {\n        this.logger.warn(\n          'Received null for receiverSignatureRequired in createAccount.'\n        );\n      } else {\n        transaction.setReceiverSignatureRequired(\n          params.receiverSignatureRequired\n        );\n      }\n    }\n\n    if (typeof params.autoRenewPeriod !== 'undefined') {\n      if (params.autoRenewPeriod === null) {\n        this.logger.warn('Received null for autoRenewPeriod in createAccount.');\n      } else if (\n        typeof params.autoRenewPeriod === 'number' ||\n        (params.autoRenewPeriod as any) instanceof Long\n      ) {\n        transaction.setAutoRenewPeriod(params.autoRenewPeriod as number | Long);\n        autoRenewPeriodSetByUser = true;\n      } else if (\n        typeof params.autoRenewPeriod === 'object' &&\n        typeof (params.autoRenewPeriod as any).seconds === 'number'\n      ) {\n        transaction.setAutoRenewPeriod(\n          (params.autoRenewPeriod as { seconds: number }).seconds\n        );\n        autoRenewPeriodSetByUser = true;\n      } else {\n        this.logger.warn(\n          'Invalid autoRenewPeriod in createAccount, using default.'\n        );\n        transaction.setAutoRenewPeriod(\n          DEFAULT_ACCOUNT_AUTORENEW_PERIOD_SECONDS\n        );\n      }\n    } else {\n      transaction.setAutoRenewPeriod(DEFAULT_ACCOUNT_AUTORENEW_PERIOD_SECONDS);\n    }\n\n    if (!autoRenewPeriodSetByUser) {\n      this.addNote(\n        `Default auto-renew period of ${DEFAULT_ACCOUNT_AUTORENEW_PERIOD_SECONDS} seconds applied.`\n      );\n    }\n\n    if (typeof params.memo !== 'undefined') {\n      if (params.memo === null) {\n        this.logger.warn('Received null for memo in createAccount.');\n      } else {\n        transaction.setAccountMemo(params.memo);\n      }\n    }\n\n    if (typeof params.maxAutomaticTokenAssociations !== 'undefined') {\n      if (params.maxAutomaticTokenAssociations === null) {\n        this.logger.warn(\n          'Received null for maxAutomaticTokenAssociations in createAccount.'\n        );\n      } else {\n        transaction.setMaxAutomaticTokenAssociations(\n          params.maxAutomaticTokenAssociations\n        );\n      }\n    }\n\n    if (typeof params.stakedAccountId !== 'undefined') {\n      if (params.stakedAccountId === null) {\n        this.logger.warn('Received null for stakedAccountId in createAccount.');\n      } else {\n        transaction.setStakedAccountId(params.stakedAccountId);\n      }\n    }\n\n    if (typeof params.stakedNodeId !== 'undefined') {\n      if (params.stakedNodeId === null) {\n        this.logger.warn('Received null for stakedNodeId in createAccount.');\n      } else {\n        transaction.setStakedNodeId(params.stakedNodeId);\n      }\n    }\n\n    if (typeof params.declineStakingReward !== 'undefined') {\n      if (params.declineStakingReward === null) {\n        this.logger.warn(\n          'Received null for declineStakingReward in createAccount.'\n        );\n      } else {\n        transaction.setDeclineStakingReward(params.declineStakingReward);\n      }\n    }\n\n    if (typeof params.alias !== 'undefined') {\n      if (params.alias === null) {\n        this.logger.warn('Received null for alias in createAccount.');\n      } else {\n        transaction.setAlias(params.alias);\n      }\n    }\n\n    if (!params.key && !params.alias) {\n      this.logger.warn(\n        'AccountCreateTransaction: Neither key nor a usable alias (PublicKey/EvmAddress) was provided. Transaction might fail.'\n      );\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Transfers HBAR between accounts.\n   * @param {HbarTransferParams} params Parameters for the HBAR transfer.\n   * @param {boolean} [isUserInitiated=true] Whether this transfer was initiated by the user (vs. system/agent)\n   * @returns {this} The builder instance for chaining.\n   * @throws {Error} If transfers are missing or do not sum to zero.\n   */\n  public transferHbar(\n    params: HbarTransferParams,\n    isUserInitiated: boolean = true\n  ): this {\n    this.clearNotes();\n    const transaction = new TransferTransaction();\n    if (!params.transfers || params.transfers.length === 0) {\n      throw new Error('HbarTransferParams must include at least one transfer.');\n    }\n\n    let netZeroInTinybars = new BigNumber(0);\n    let userTransferProcessedForScheduling = false;\n\n    if (\n      isUserInitiated &&\n      this.kit.userAccountId &&\n      this.kit.operationalMode === 'provideBytes' &&\n      params.transfers.length === 1\n    ) {\n      const receiverTransfer = params.transfers[0];\n      const amountValue =\n        typeof receiverTransfer.amount === 'string' ||\n        typeof receiverTransfer.amount === 'number'\n          ? receiverTransfer.amount\n          : receiverTransfer.amount.toString();\n\n      const amountBigNum = new BigNumber(amountValue);\n\n      if (amountBigNum.isPositive()) {\n        const recipientAccountId =\n          typeof receiverTransfer.accountId === 'string'\n            ? AccountId.fromString(receiverTransfer.accountId)\n            : receiverTransfer.accountId;\n\n        const sdkHbarAmount = Hbar.fromString(amountValue.toString());\n\n        this.logger.info(\n          `[AccountBuilder.transferHbar] Configuring user-initiated scheduled transfer: ${sdkHbarAmount.toString()} from ${\n            this.kit.userAccountId\n          } to ${recipientAccountId.toString()}`\n        );\n        this.addNote(\n          `Configured HBAR transfer from your account (${\n            this.kit.userAccountId\n          }) to ${recipientAccountId.toString()} for ${sdkHbarAmount.toString()}.`\n        );\n\n        transaction.addHbarTransfer(recipientAccountId, sdkHbarAmount);\n        transaction.addHbarTransfer(\n          AccountId.fromString(this.kit.userAccountId),\n          sdkHbarAmount.negated()\n        );\n\n        userTransferProcessedForScheduling = true;\n      }\n    }\n\n    if (!userTransferProcessedForScheduling) {\n      for (const transferInput of params.transfers) {\n        const accountId =\n          typeof transferInput.accountId === 'string'\n            ? AccountId.fromString(transferInput.accountId)\n            : transferInput.accountId;\n\n        const amountValue =\n          typeof transferInput.amount === 'string' ||\n          typeof transferInput.amount === 'number'\n            ? transferInput.amount\n            : transferInput.amount.toString();\n\n        const sdkHbarAmount = Hbar.fromString(amountValue.toString());\n\n        transaction.addHbarTransfer(accountId, sdkHbarAmount);\n\n        const tinybarsContribution = sdkHbarAmount.toTinybars();\n        netZeroInTinybars = netZeroInTinybars.plus(\n          tinybarsContribution.toString()\n        );\n      }\n\n      if (!netZeroInTinybars.isZero()) {\n        throw new Error('The sum of all HBAR transfers must be zero.');\n      }\n    }\n\n    if (typeof params.memo !== 'undefined') {\n      if (params.memo === null) {\n        this.logger.warn('Received null for memo in transferHbar.');\n      } else {\n        transaction.setTransactionMemo(params.memo);\n      }\n    }\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Updates an existing Hedera account.\n   * If an optional field in `params` is `undefined`, that aspect of the account is not changed.\n   * Specific string or number values (e.g., memo: \"\", stakedAccountId: \"0.0.0\", stakedNodeId: -1)\n   * provided by the LLM (and allowed by the Zod schema in the tool) will be applied directly.\n   * @param {UpdateAccountParams} params Parameters for updating an account.\n   * @returns {this} The builder instance for chaining.\n   * @throws {Error} If accountIdToUpdate is missing or key parsing fails.\n   */\n  public updateAccount(params: UpdateAccountParams): this {\n    if (!params.accountIdToUpdate) {\n      throw new Error('accountIdToUpdate is required for updating an account.');\n    }\n    const transaction = new AccountUpdateTransaction().setAccountId(\n      params.accountIdToUpdate\n    );\n\n    if (typeof params.key !== 'undefined') {\n      if (params.key === null) {\n        this.logger.warn('Received null for key, skipping update for key.');\n      } else if (typeof params.key === 'string') {\n        try {\n          const keyDetection = detectKeyTypeFromString(params.key);\n          transaction.setKey(keyDetection.privateKey);\n        } catch (e) {\n          this.logger.error(`Failed to parse key string: ${params.key}`, e);\n          throw new Error(`Invalid key string provided: ${params.key}`);\n        }\n      } else {\n        transaction.setKey(params.key as Key);\n      }\n    }\n\n    if (typeof params.autoRenewPeriod !== 'undefined') {\n      if (params.autoRenewPeriod === null) {\n        this.logger.warn('Received null for autoRenewPeriod, skipping update.');\n      } else if (typeof params.autoRenewPeriod === 'number') {\n        transaction.setAutoRenewPeriod(params.autoRenewPeriod);\n      } else {\n        this.logger.warn(\n          `Invalid autoRenewPeriod format: ${JSON.stringify(\n            params.autoRenewPeriod\n          )}. Skipping.`\n        );\n      }\n    }\n\n    if (typeof params.receiverSignatureRequired !== 'undefined') {\n      if (params.receiverSignatureRequired === null) {\n        this.logger.warn(\n          'Received null for receiverSignatureRequired, skipping update.'\n        );\n      } else {\n        transaction.setReceiverSignatureRequired(\n          params.receiverSignatureRequired\n        );\n      }\n    }\n\n    if (typeof params.stakedAccountId !== 'undefined') {\n      if (params.stakedAccountId === null) {\n        this.logger.warn('Received null for stakedAccountId, skipping update.');\n      } else {\n        const saId = String(params.stakedAccountId);\n        if (saId === '0.0.0' || /^\\d+\\.\\d+\\.\\d+$/.test(saId)) {\n          transaction.setStakedAccountId(saId);\n        } else {\n          this.logger.warn(\n            `Invalid stakedAccountId format: ${saId}. Skipping.`\n          );\n        }\n      }\n    }\n\n    if (typeof params.stakedNodeId !== 'undefined') {\n      if (params.stakedNodeId === null) {\n        this.logger.warn('Received null for stakedNodeId, skipping update.');\n      } else {\n        transaction.setStakedNodeId(params.stakedNodeId);\n      }\n    }\n\n    if (typeof params.declineStakingReward !== 'undefined') {\n      if (params.declineStakingReward === null) {\n        this.logger.warn(\n          'Received null for declineStakingReward, skipping update.'\n        );\n      } else {\n        transaction.setDeclineStakingReward(params.declineStakingReward);\n      }\n    }\n\n    if (typeof params.memo !== 'undefined') {\n      if (params.memo === null) {\n        this.logger.warn('Received null for memo, skipping update.');\n      } else {\n        transaction.setAccountMemo(params.memo);\n      }\n    }\n\n    if (typeof params.maxAutomaticTokenAssociations !== 'undefined') {\n      if (params.maxAutomaticTokenAssociations === null) {\n        this.logger.warn(\n          'Received null for maxAutomaticTokenAssociations, skipping update.'\n        );\n      } else if (typeof params.maxAutomaticTokenAssociations === 'number') {\n        transaction.setMaxAutomaticTokenAssociations(\n          params.maxAutomaticTokenAssociations\n        );\n      } else {\n        this.logger.warn(\n          `Invalid type for maxAutomaticTokenAssociations: ${typeof params.maxAutomaticTokenAssociations}. Skipping.`\n        );\n      }\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Deletes an existing Hedera account.\n   * @param {DeleteAccountParams} params Parameters for deleting an account.\n   * @returns {this} The builder instance for chaining.\n   * @throws {Error} If required parameters are missing.\n   */\n  public deleteAccount(params: DeleteAccountParams): this {\n    if (!params.deleteAccountId) {\n      throw new Error('deleteAccountId is required for deleting an account.');\n    }\n    if (!params.transferAccountId) {\n      throw new Error('transferAccountId is required for deleting an account.');\n    }\n\n    const transaction = new AccountDeleteTransaction()\n      .setAccountId(params.deleteAccountId)\n      .setTransferAccountId(params.transferAccountId);\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Approves an HBAR allowance for a spender.\n   * @param {ApproveHbarAllowanceParams} params Parameters for approving HBAR allowance.\n   * @returns {this} The builder instance for chaining.\n   */\n  public approveHbarAllowance(params: ApproveHbarAllowanceParams): this {\n    const transaction =\n      new AccountAllowanceApproveTransaction().approveHbarAllowance(\n        params.ownerAccountId || this.kit.signer.getAccountId(),\n        params.spenderAccountId,\n        params.amount\n      );\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Approves an NFT allowance for a spender.\n   * @param {ApproveTokenNftAllowanceParams} params Parameters for approving NFT allowance.\n   * @returns {this} The builder instance for chaining.\n   * @throws {Error} If NFT allowance parameters are invalid.\n   */\n  public approveTokenNftAllowance(\n    params: ApproveTokenNftAllowanceParams\n  ): this {\n    const transaction = new AccountAllowanceApproveTransaction();\n    const owner = params.ownerAccountId || this.kit.signer.getAccountId();\n    const tokenId =\n      typeof params.tokenId === 'string'\n        ? TokenId.fromString(params.tokenId)\n        : params.tokenId;\n\n    if (params.allSerials) {\n      transaction.approveTokenNftAllowanceAllSerials(\n        tokenId,\n        owner,\n        params.spenderAccountId\n      );\n    } else if (params.serials && params.serials.length > 0) {\n      for (const serial of params.serials) {\n        let serialLong: Long;\n        if (typeof serial === 'number') {\n          serialLong = Long.fromNumber(serial);\n        } else if (serial instanceof BigNumber) {\n          serialLong = Long.fromString(serial.toString());\n        } else {\n          serialLong = serial as Long;\n        }\n        transaction.approveTokenNftAllowance(\n          new NftId(tokenId, serialLong),\n          owner,\n          params.spenderAccountId\n        );\n      }\n    } else {\n      throw new Error(\n        \"Either allSerials must be true or 'serials' (with serial numbers) must be provided for NFT allowance.\"\n      );\n    }\n\n    if (typeof params.memo !== 'undefined') {\n      if (params.memo === null) {\n        this.logger.warn('Received null for memo in approveTokenNftAllowance.');\n      } else {\n        transaction.setTransactionMemo(params.memo);\n      }\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Approves a fungible token allowance for a spender.\n   * @param {ApproveFungibleTokenAllowanceParams} params Parameters for approving fungible token allowance.\n   * @returns {this} The builder instance for chaining.\n   */\n  public approveFungibleTokenAllowance(\n    params: ApproveFungibleTokenAllowanceParams\n  ): this {\n    const tokenId =\n      typeof params.tokenId === 'string'\n        ? TokenId.fromString(params.tokenId)\n        : params.tokenId;\n    let amountLong: Long;\n\n    if (typeof params.amount === 'string') {\n      amountLong = Long.fromString(params.amount);\n    } else if (typeof params.amount === 'number') {\n      amountLong = Long.fromNumber(params.amount);\n    } else if (params.amount instanceof BigNumber) {\n      amountLong = Long.fromString(params.amount.toString());\n    } else {\n      amountLong = params.amount as Long;\n    }\n\n    const transaction =\n      new AccountAllowanceApproveTransaction().approveTokenAllowance(\n        tokenId,\n        params.ownerAccountId || this.kit.signer.getAccountId(),\n        params.spenderAccountId,\n        amountLong\n      );\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Deletes NFT allowances.\n   * Note: This method is currently stubbed and non-functional due to SDK considerations.\n   * @returns {this} The builder instance.\n   * @throws {Error} Method is temporarily disabled.\n   */\n  public deleteNftSpenderAllowance(\n    params: DeleteNftSpenderAllowanceParams\n  ): this {\n    const nftId =\n      typeof params.nftId === 'string'\n        ? NftId.fromString(params.nftId)\n        : params.nftId;\n    const owner = params.ownerAccountId || this.kit.signer.getAccountId();\n\n    const transaction =\n      new AccountAllowanceDeleteTransaction().deleteAllTokenNftAllowances(\n        nftId,\n        owner\n      );\n\n    if (typeof params.memo !== 'undefined') {\n      if (params.memo === null) {\n        this.logger.warn(\n          'Received null for memo in deleteNftSpenderAllowance.'\n        );\n      } else {\n        transaction.setTransactionMemo(params.memo);\n      }\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Revokes an HBAR allowance.\n   * @param {RevokeHbarAllowanceParams} params Parameters for revoking HBAR allowance.\n   * @returns {this} The builder instance for chaining.\n   */\n  public revokeHbarAllowance(params: RevokeHbarAllowanceParams): this {\n    const transaction =\n      new AccountAllowanceApproveTransaction().approveHbarAllowance(\n        params.ownerAccountId || this.kit.signer.getAccountId(),\n        params.spenderAccountId,\n        new Hbar(0)\n      );\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Revokes a fungible token allowance.\n   * @param {RevokeFungibleTokenAllowanceParams} params Parameters for revoking fungible token allowance.\n   * @returns {this} The builder instance for chaining.\n   */\n  public revokeFungibleTokenAllowance(\n    params: RevokeFungibleTokenAllowanceParams\n  ): this {\n    const tokenId =\n      typeof params.tokenId === 'string'\n        ? TokenId.fromString(params.tokenId)\n        : params.tokenId;\n    const transaction =\n      new AccountAllowanceApproveTransaction().approveTokenAllowance(\n        tokenId,\n        params.ownerAccountId || this.kit.signer.getAccountId(),\n        params.spenderAccountId,\n        0\n      );\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Deletes all allowances for a specific NFT serial (for all spenders), granted by an owner.\n   * The transaction must be signed by the owner of the NFTs.\n   * @param {DeleteNftSerialAllowancesParams} params - Parameters for the operation.\n   * @returns {this} The builder instance for chaining.\n   */\n  public deleteNftSerialAllowancesForAllSpenders(\n    params: DeleteNftSerialAllowancesParams\n  ): this {\n    let ownerAccId: AccountId;\n    if (params.ownerAccountId) {\n      if (typeof params.ownerAccountId === 'string') {\n        ownerAccId = AccountId.fromString(params.ownerAccountId);\n      } else {\n        ownerAccId = params.ownerAccountId;\n      }\n    } else {\n      ownerAccId = this.kit.signer.getAccountId();\n    }\n\n    const parts = params.nftIdString.split('.');\n    if (parts.length !== 4) {\n      throw new Error(\n        `Invalid nftIdString format: ${params.nftIdString}. Expected format like \"0.0.token.serial\".`\n      );\n    }\n    const sdkTokenId = TokenId.fromString(\n      `${parts[0]}.${parts[1]}.${parts[2]}`\n    );\n    const sdkSerial = Long.fromString(parts[3]);\n    const sdkNftId = new NftId(sdkTokenId, sdkSerial);\n\n    const transaction =\n      new AccountAllowanceDeleteTransaction().deleteAllTokenNftAllowances(\n        sdkNftId,\n        ownerAccId\n      );\n\n    if (params.memo) {\n      transaction.setTransactionMemo(params.memo);\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Deletes/revokes NFT allowances for specific serial numbers of a token for a specific spender.\n   * The transaction must be signed by the owner of the NFTs.\n   * @param {DeleteNftSpenderAllowanceToolParams} params - Parameters for the operation.\n   * @returns {this} The builder instance for chaining.\n   */\n  public deleteTokenNftAllowanceForSpender(\n    params: DeleteNftSpenderAllowanceToolParams\n  ): this {\n    let ownerAccIdToUse: AccountId;\n    if (params.ownerAccountId) {\n      ownerAccIdToUse =\n        typeof params.ownerAccountId === 'string'\n          ? AccountId.fromString(params.ownerAccountId)\n          : params.ownerAccountId;\n    } else {\n      ownerAccIdToUse = this.kit.signer.getAccountId();\n    }\n\n    const sdkTokenId =\n      typeof params.tokenId === 'string'\n        ? TokenId.fromString(params.tokenId)\n        : params.tokenId;\n\n    const sdkSerials: Long[] = params.serials.map(\n      (s: string | number | Long) => {\n        if (typeof s === 'string') return Long.fromString(s);\n        if (typeof s === 'number') return Long.fromNumber(s);\n        return s;\n      }\n    );\n\n    const transaction =\n      new AccountAllowanceDeleteTransaction().deleteAllTokenNftAllowances(\n        new NftId(sdkTokenId, sdkSerials[0]),\n        ownerAccIdToUse\n      );\n\n    if (params.memo) {\n      transaction.setTransactionMemo(params.memo);\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Prepares a ScheduleSignTransaction for a previously scheduled transaction.\n   * @param {SignScheduledTransactionParams} params Parameters for the ScheduleSign transaction.\n   * @returns {this} The builder instance for chaining.\n   */\n  public prepareSignScheduledTransaction(\n    params: SignScheduledTransactionParams\n  ): this {\n    if (!params.scheduleId) {\n      throw new Error(\n        'scheduleId is required to prepare a ScheduleSignTransaction.'\n      );\n    }\n\n    const scheduleId =\n      typeof params.scheduleId === 'string'\n        ? ScheduleId.fromString(params.scheduleId)\n        : params.scheduleId;\n\n    const transaction = new ScheduleSignTransaction().setScheduleId(scheduleId);\n\n    if (params.memo) {\n      transaction.setTransactionMemo(params.memo);\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n}\n","import {\n  ContractCreateTransaction,\n  ContractExecuteTransaction,\n  ContractUpdateTransaction,\n  ContractDeleteTransaction,\n  Hbar,\n  Long,\n  PrivateKey,\n  TransactionId,\n  ContractCallQuery,\n  ContractFunctionResult,\n} from '@hashgraph/sdk';\nimport { Buffer } from 'buffer';\nimport { detectKeyTypeFromString } from '@hashgraphonline/standards-sdk';\n\nimport {\n  CreateContractParams,\n  ExecuteContractParams,\n  UpdateContractParams,\n  DeleteContractParams,\n  ContractCallQueryParams,\n} from '../../types';\nimport { BaseServiceBuilder } from '../base-service-builder';\nimport { HederaAgentKit } from '../../agent/agent';\n\nconst DEFAULT_CONTRACT_AUTORENEW_PERIOD_SECONDS = 7776000;\n\n/**\n * ScsBuilder facilitates Hedera Smart Contract Service (SCS) transactions.\n */\nexport class ScsBuilder extends BaseServiceBuilder {\n  constructor(hederaKit: HederaAgentKit) {\n    super(hederaKit);\n  }\n\n  /**\n   * @param {CreateContractParams} params\n   * @returns {this}\n   * @throws {Error}\n   */\n  public createContract(params: CreateContractParams): this {\n    this.clearNotes();\n    const transaction = new ContractCreateTransaction();\n\n    if (params.bytecodeFileId) {\n      transaction.setBytecodeFileId(params.bytecodeFileId);\n    } else if (params.bytecode) {\n      if (typeof params.bytecode === 'string') {\n        transaction.setBytecode(Buffer.from(params.bytecode, 'hex'));\n      } else {\n        transaction.setBytecode(params.bytecode);\n      }\n    } else {\n      throw new Error(\n        'Either bytecodeFileId or bytecode must be provided to create a contract.'\n      );\n    }\n\n    if (params.adminKey) {\n      if (typeof params.adminKey === 'string') {\n        const keyDetection = detectKeyTypeFromString(params.adminKey);\n        transaction.setAdminKey(keyDetection.privateKey);\n      } else {\n        transaction.setAdminKey(params.adminKey);\n      }\n    }\n\n    if (typeof params.gas === 'number') {\n      transaction.setGas(params.gas);\n    } else {\n      transaction.setGas(Long.fromValue(params.gas));\n    }\n\n    if (params.initialBalance) {\n      let balance: Hbar;\n      if (typeof params.initialBalance === 'number') {\n        balance = new Hbar(params.initialBalance);\n      } else {\n        balance = Hbar.fromTinybars(\n          Long.fromString(params.initialBalance.toString())\n        );\n      }\n      transaction.setInitialBalance(balance);\n    }\n\n    if (params.constructorParameters) {\n      transaction.setConstructorParameters(params.constructorParameters);\n    }\n\n    if (params.memo) {\n      transaction.setContractMemo(params.memo);\n    }\n\n    if (params.autoRenewPeriod) {\n      transaction.setAutoRenewPeriod(params.autoRenewPeriod);\n    } else {\n      transaction.setAutoRenewPeriod(DEFAULT_CONTRACT_AUTORENEW_PERIOD_SECONDS);\n      this.addNote(`Default auto-renew period of ${DEFAULT_CONTRACT_AUTORENEW_PERIOD_SECONDS} seconds applied for contract.`);\n    }\n\n    if (params.stakedAccountId) {\n      transaction.setStakedAccountId(params.stakedAccountId);\n    }\n    if (params.stakedNodeId) {\n      transaction.setStakedNodeId(params.stakedNodeId);\n    }\n    if (params.declineStakingReward) {\n      transaction.setDeclineStakingReward(params.declineStakingReward);\n    }\n    if (params.maxAutomaticTokenAssociations) {\n      transaction.setMaxAutomaticTokenAssociations(\n        params.maxAutomaticTokenAssociations\n      );\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {ExecuteContractParams} params\n   * @returns {this}\n   */\n  public executeContract(params: ExecuteContractParams): this {\n    this.clearNotes();\n    let gasValue: Long | number;\n    if (typeof params.gas === 'number') {\n      gasValue = params.gas;\n    } else {\n      gasValue = Long.fromValue(params.gas);\n    }\n\n    const transaction = new ContractExecuteTransaction()\n      .setContractId(params.contractId)\n      .setGas(gasValue)\n      .setFunction(params.functionName, params.functionParameters);\n\n    if (params.payableAmount) {\n      let hbarAmount: Hbar;\n      if (params.payableAmount instanceof Hbar) {\n        hbarAmount = params.payableAmount;\n      } else if (typeof params.payableAmount === 'number') {\n        hbarAmount = new Hbar(params.payableAmount);\n      } else {\n        hbarAmount = Hbar.fromTinybars(\n          Long.fromString(params.payableAmount.toString())\n        );\n      }\n      transaction.setPayableAmount(hbarAmount);\n    }\n\n    if (params.memo) {\n      transaction.setTransactionMemo(params.memo);\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {UpdateContractParams} params\n   * @returns {this}\n   * @throws {Error}\n   */\n  public updateContract(params: UpdateContractParams): this {\n    this.clearNotes();\n    if (params.contractId === undefined) {\n      throw new Error('Contract ID is required to update a contract.');\n    }\n    const transaction = new ContractUpdateTransaction().setContractId(\n      params.contractId\n    );\n\n    if (params.adminKey) {\n      if (typeof params.adminKey === 'string') {\n        const keyDetection = detectKeyTypeFromString(params.adminKey);\n        transaction.setAdminKey(keyDetection.privateKey);\n      } else {\n        transaction.setAdminKey(params.adminKey);\n      }\n    }\n    if (params.autoRenewPeriod) {\n      transaction.setAutoRenewPeriod(params.autoRenewPeriod);\n    }\n\n    if (params.memo) {\n      transaction.setContractMemo(params.memo);\n    }\n\n    if (params.stakedAccountId) {\n      transaction.setStakedAccountId(params.stakedAccountId);\n    }\n    if (params.stakedNodeId) {\n      transaction.setStakedNodeId(params.stakedNodeId);\n    }\n\n    if (params.declineStakingReward) {\n      transaction.setDeclineStakingReward(params.declineStakingReward);\n    }\n    if (params.maxAutomaticTokenAssociations) {\n      transaction.setMaxAutomaticTokenAssociations(\n        params.maxAutomaticTokenAssociations\n      );\n    }\n\n    if (params.proxyAccountId) {\n      transaction.setProxyAccountId(params.proxyAccountId);\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {DeleteContractParams} params\n   * @returns {this}\n   * @throws {Error}\n   */\n  public deleteContract(params: DeleteContractParams): this {\n    this.clearNotes();\n    if (params.contractId === undefined) {\n      throw new Error('Contract ID is required to delete a contract.');\n    }\n    const transaction = new ContractDeleteTransaction().setContractId(\n      params.contractId\n    );\n\n    if (params.transferAccountId) {\n      transaction.setTransferAccountId(params.transferAccountId);\n    } else if (params.transferContractId) {\n      transaction.setTransferContractId(params.transferContractId);\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * Executes a local smart contract query (does not modify state, no consensus needed).\n   * @param {ContractCallQueryParams} params - Parameters for the contract query.\n   * @returns {Promise<ContractFunctionResult>} A promise that resolves to the result of the contract call.\n   * @throws {Error} If query execution fails.\n   */\n  public async callContract(\n    params: ContractCallQueryParams\n  ): Promise<ContractFunctionResult> {\n    const query = new ContractCallQuery().setContractId(params.contractId);\n\n    if (params.gas) {\n      if (typeof params.gas === 'number') {\n        query.setGas(params.gas);\n      } else {\n        query.setGas(Long.fromValue(params.gas));\n      }\n    }\n\n    if (params.functionName) {\n      if (params.functionParameters) {\n        query.setFunction(params.functionName, params.functionParameters);\n      } else {\n        query.setFunction(params.functionName);\n      }\n    }\n\n    if (params.maxQueryPayment) {\n      query.setQueryPayment(params.maxQueryPayment);\n    }\n\n    if (params.paymentTransactionId) {\n      if (typeof params.paymentTransactionId === 'string') {\n        query.setPaymentTransactionId(\n          TransactionId.fromString(params.paymentTransactionId)\n        );\n      } else {\n        query.setPaymentTransactionId(params.paymentTransactionId);\n      }\n    }\n\n    try {\n      this.logger.info(\n        `Executing ContractCallQuery for contract ${params.contractId.toString()}`\n      );\n      return await query.execute(this.kit.client);\n    } catch (error: unknown) {\n      this.logger.error(\n        `ContractCallQuery failed for contract ${params.contractId.toString()}: ${\n          error instanceof Error ? error.message : JSON.stringify(error)\n        }`\n      );\n      throw error;\n    }\n  }\n}\n","import {\n  FileCreateTransaction,\n  FileAppendTransaction,\n  FileUpdateTransaction,\n  FileDeleteTransaction,\n  PrivateKey,\n  PublicKey,\n} from '@hashgraph/sdk';\nimport { Buffer } from 'buffer';\nimport { detectKeyTypeFromString } from '@hashgraphonline/standards-sdk';\nimport {\n  CreateFileParams,\n  AppendFileParams,\n  UpdateFileParams,\n  DeleteFileParams,\n} from '../../types';\nimport { BaseServiceBuilder } from '../base-service-builder';\nimport { HederaAgentKit } from '../../agent/agent';\n\nconst MAX_FILE_APPEND_BYTES = 6000;\n\n/**\n * FileBuilder facilitates Hedera File Service transactions.\n */\nexport class FileBuilder extends BaseServiceBuilder {\n\n  constructor(hederaKit: HederaAgentKit) {\n    super(hederaKit);\n  }\n\n  /**\n   * @param {CreateFileParams} params\n   * @returns {this}\n   */\n  public createFile(params: CreateFileParams): this {\n    this.clearNotes();\n    const transaction = new FileCreateTransaction();\n\n    if (params.contents) {\n      if (typeof params.contents === 'string') {\n        transaction.setContents(Buffer.from(params.contents, 'utf8'));\n      } else {\n        transaction.setContents(params.contents);\n      }\n    }\n\n    if (params.keys) {\n      const publicKeys: PublicKey[] = params.keys\n        .map((keyInput) => {\n          if (typeof keyInput === 'string') {\n            const keyDetection = detectKeyTypeFromString(keyInput);\n            return keyDetection.privateKey.publicKey;\n          } else if (keyInput instanceof PublicKey) {\n            return keyInput;\n          }\n          this.logger.warn(\n            'FileBuilder: createFile expects keys to be string or PublicKey. Other types are ignored.'\n          );\n          return undefined;\n        })\n        .filter((key): key is PublicKey => key instanceof PublicKey);\n\n      if (publicKeys.length > 0) {\n        transaction.setKeys(publicKeys);\n      }\n    }\n\n    if (params.memo) {\n      transaction.setFileMemo(params.memo);\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {AppendFileParams} params\n   * @returns {this}\n   * @throws {Error}\n   */\n  public appendFile(params: AppendFileParams): this {\n    this.clearNotes();\n    if (!params.fileId) {\n      throw new Error('File ID is required to append to a file.');\n    }\n    const transaction = new FileAppendTransaction().setFileId(params.fileId);\n\n    if (params.contents) {\n      const contentsBytes =\n        typeof params.contents === 'string'\n          ? Buffer.from(params.contents, 'utf8')\n          : params.contents;\n\n      if (contentsBytes.length > MAX_FILE_APPEND_BYTES) {\n        console.warn(\n          `FileBuilder: Content size (${contentsBytes.length} bytes) for appendFile exceeds single transaction limit (${MAX_FILE_APPEND_BYTES} bytes). Only the first chunk will be prepared. Implement multi-transaction append for larger files.`\n        );\n        this.addNote(`Content for file append was truncated to ${MAX_FILE_APPEND_BYTES} bytes due to single transaction limit.`);\n        transaction.setContents(\n          contentsBytes.subarray(0, MAX_FILE_APPEND_BYTES)\n        );\n      } else {\n        transaction.setContents(contentsBytes);\n      }\n    }\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {UpdateFileParams} params\n   * @returns {this}\n   * @throws {Error}\n   */\n  public updateFile(params: UpdateFileParams): this {\n    this.clearNotes();\n    if (!params.fileId) {\n      throw new Error('File ID is required to update a file.');\n    }\n    const transaction = new FileUpdateTransaction().setFileId(params.fileId);\n\n    if (params.contents) {\n      if (typeof params.contents === 'string') {\n        transaction.setContents(Buffer.from(params.contents, 'utf8'));\n      } else {\n        transaction.setContents(params.contents);\n      }\n    }\n\n    if (params.keys) {\n      const publicKeys: PublicKey[] = params.keys\n        .map((keyInput) => {\n          if (typeof keyInput === 'string') {\n            const keyDetection = detectKeyTypeFromString(keyInput);\n            return keyDetection.privateKey.publicKey;\n          } else if (keyInput instanceof PublicKey) {\n            return keyInput;\n          }\n          this.logger.warn(\n            'FileBuilder: updateFile expects keys to be string or PublicKey. Other types are ignored.'\n          );\n          return undefined;\n        })\n        .filter((key): key is PublicKey => key instanceof PublicKey);\n\n      if (publicKeys.length > 0) {\n        transaction.setKeys(publicKeys);\n      }\n    }\n\n    if (params.memo) {\n      transaction.setFileMemo(params.memo);\n    }\n\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n\n  /**\n   * @param {DeleteFileParams} params\n   * @returns {this}\n   * @throws {Error}\n   */\n  public deleteFile(params: DeleteFileParams): this {\n    this.clearNotes();\n    if (!params.fileId) {\n      throw new Error('File ID is required to delete a file.');\n    }\n    const transaction = new FileDeleteTransaction().setFileId(params.fileId);\n    this.setCurrentTransaction(transaction);\n    return this;\n  }\n}\n","import {\n  HederaMirrorNode,\n  TopicResponse,\n  CustomFees,\n  TokenInfoResponse,\n  HCSMessage,\n  AccountResponse,\n  ScheduleInfo,\n  Transaction as HederaTransaction,\n  AccountTokenBalance,\n  NftDetail,\n  NftInfo,\n  ContractCallQueryResponse,\n  TokenAirdrop,\n  Block,\n  ContractResult,\n  ContractLog,\n  ContractAction,\n  NetworkStake,\n  NetworkSupply,\n  ContractEntity,\n  ContractState,\n  NetworkInfo,\n  NetworkFees,\n  OpcodesResponse,\n} from '@hashgraphonline/standards-sdk';\nimport { HederaAgentKit } from '../../agent';\nimport { TopicId, AccountId, PublicKey } from '@hashgraph/sdk';\n\n/**\n * Utility function to filter out undefined values from an object\n */\nfunction filterUndefined<T extends Record<string, unknown>>(\n  obj: T\n): Partial<T> {\n  const filtered: Partial<T> = {};\n  for (const [key, value] of Object.entries(obj)) {\n    if (value !== undefined) {\n      (filtered as Record<string, unknown>)[key] = value;\n    }\n  }\n  return filtered;\n}\n\n/**\n * Builder class for Hedera query operations.\n * Provides a fluent interface for querying the Hedera network via Mirror Node.\n */\nexport class QueryBuilder {\n  private hederaKit: HederaAgentKit;\n  private mirrorNode: HederaMirrorNode;\n\n  constructor(hederaKit: HederaAgentKit) {\n    this.hederaKit = hederaKit;\n    this.mirrorNode = hederaKit.mirrorNode;\n  }\n\n  /**\n   * Get topic information for a given topic ID\n   */\n  async getTopicInfo(topicId: string | TopicId): Promise<TopicResponse> {\n    const topicIdString =\n      typeof topicId === 'string' ? topicId : topicId.toString();\n    return await this.mirrorNode.getTopicInfo(topicIdString);\n  }\n\n  /**\n   * Get messages for a given topic ID\n   */\n  async getTopicMessages(topicId: string | TopicId): Promise<HCSMessage[]> {\n    const topicIdString =\n      typeof topicId === 'string' ? topicId : topicId.toString();\n    return await this.mirrorNode.getTopicMessages(topicIdString);\n  }\n\n  /**\n   * Get filtered topic messages with optional parameters\n   */\n  async getTopicMessagesByFilter(\n    topicId: string | TopicId,\n    options?: {\n      sequenceNumber?: string;\n      startTime?: string;\n      endTime?: string;\n      limit?: number;\n      order?: 'asc' | 'desc';\n    }\n  ): Promise<HCSMessage[] | null> {\n    const topicIdString =\n      typeof topicId === 'string' ? topicId : topicId.toString();\n    return await this.mirrorNode.getTopicMessagesByFilter(\n      topicIdString,\n      options\n    );\n  }\n\n  /**\n   * Get account information for a given account ID\n   */\n  async getAccountInfo(\n    accountId: string | AccountId\n  ): Promise<AccountResponse> {\n    const accountIdString =\n      typeof accountId === 'string' ? accountId : accountId.toString();\n    return await this.mirrorNode.requestAccount(accountIdString);\n  }\n\n  /**\n   * Get account balance in HBAR for a given account ID\n   */\n  async getAccountBalance(\n    accountId: string | AccountId\n  ): Promise<number | null> {\n    const accountIdString =\n      typeof accountId === 'string' ? accountId : accountId.toString();\n    return await this.mirrorNode.getAccountBalance(accountIdString);\n  }\n\n  /**\n   * Get account memo for a given account ID\n   */\n  async getAccountMemo(accountId: string | AccountId): Promise<string | null> {\n    const accountIdString =\n      typeof accountId === 'string' ? accountId : accountId.toString();\n    return await this.mirrorNode.getAccountMemo(accountIdString);\n  }\n\n  /**\n   * Get token information for a given token ID\n   */\n  async getTokenInfo(tokenId: string): Promise<TokenInfoResponse | null> {\n    return await this.mirrorNode.getTokenInfo(tokenId);\n  }\n\n  /**\n   * Get token balances for a given account ID\n   */\n  async getAccountTokens(\n    accountId: string | AccountId,\n    limit: number = 100\n  ): Promise<AccountTokenBalance[] | null> {\n    const accountIdString =\n      typeof accountId === 'string' ? accountId : accountId.toString();\n    return await this.mirrorNode.getAccountTokens(accountIdString, limit);\n  }\n\n  /**\n   * Get NFTs for a given account ID\n   */\n  async getAccountNfts(\n    accountId: string | AccountId,\n    tokenId?: string,\n    limit: number = 100\n  ): Promise<NftDetail[] | null> {\n    const accountIdString =\n      typeof accountId === 'string' ? accountId : accountId.toString();\n    return await this.mirrorNode.getAccountNfts(\n      accountIdString,\n      tokenId,\n      limit\n    );\n  }\n\n  /**\n   * Validate NFT ownership\n   */\n  async validateNftOwnership(\n    accountId: string | AccountId,\n    tokenId: string,\n    serialNumber: number\n  ): Promise<NftDetail | null> {\n    const accountIdString =\n      typeof accountId === 'string' ? accountId : accountId.toString();\n    return await this.mirrorNode.validateNFTOwnership(\n      accountIdString,\n      tokenId,\n      serialNumber\n    );\n  }\n\n  /**\n   * Get transaction details by ID or hash\n   */\n  async getTransaction(\n    transactionIdOrHash: string\n  ): Promise<HederaTransaction | null> {\n    return await this.mirrorNode.getTransaction(transactionIdOrHash);\n  }\n\n  /**\n   * Get transaction details by consensus timestamp\n   */\n  async getTransactionByTimestamp(\n    timestamp: string\n  ): Promise<HederaTransaction[]> {\n    return await this.mirrorNode.getTransactionByTimestamp(timestamp);\n  }\n\n  /**\n   * Get schedule information for a given schedule ID\n   */\n  async getScheduleInfo(scheduleId: string): Promise<ScheduleInfo | null> {\n    return await this.mirrorNode.getScheduleInfo(scheduleId);\n  }\n\n  /**\n   * Get scheduled transaction status\n   */\n  async getScheduledTransactionStatus(scheduleId: string): Promise<{\n    executed: boolean;\n    executedDate?: Date;\n    deleted: boolean;\n  }> {\n    return await this.mirrorNode.getScheduledTransactionStatus(scheduleId);\n  }\n\n  /**\n   * Get HBAR price for a given date\n   */\n  async getHbarPrice(date: Date): Promise<number | null> {\n    return await this.mirrorNode.getHBARPrice(date);\n  }\n\n  /**\n   * Read smart contract query (view/pure functions)\n   */\n  async readSmartContract(\n    contractIdOrAddress: string,\n    functionSelector: string,\n    payerAccountId: string | AccountId,\n    options?: {\n      estimate?: boolean;\n      block?: string;\n      value?: number;\n      gas?: number;\n      gasPrice?: number;\n    }\n  ): Promise<ContractCallQueryResponse | null> {\n    const payerIdString =\n      typeof payerAccountId === 'string'\n        ? payerAccountId\n        : payerAccountId.toString();\n    return await this.mirrorNode.readSmartContractQuery(\n      contractIdOrAddress,\n      functionSelector,\n      payerIdString,\n      options\n    );\n  }\n\n  /**\n   * Get public key for a given account ID\n   */\n  async getPublicKey(accountId: string | AccountId): Promise<PublicKey> {\n    const accountIdString =\n      typeof accountId === 'string' ? accountId : accountId.toString();\n    return await this.mirrorNode.getPublicKey(accountIdString);\n  }\n\n  /**\n   * Get custom fees for a given topic ID\n   */\n  async getTopicFees(topicId: string | TopicId): Promise<CustomFees | null> {\n    const topicIdString =\n      typeof topicId === 'string' ? topicId : topicId.toString();\n    return await this.mirrorNode.getTopicFees(topicIdString);\n  }\n\n  /**\n   * Check if a user has access to a given key list\n   */\n  async checkKeyListAccess(\n    keyBytes: Buffer,\n    userPublicKey: PublicKey\n  ): Promise<boolean> {\n    return await this.mirrorNode.checkKeyListAccess(keyBytes, userPublicKey);\n  }\n\n  /**\n   * Get outstanding token airdrops sent by an account\n   */\n  async getOutstandingTokenAirdrops(\n    accountIdOrArgs:\n      | string\n      | AccountId\n      | {\n          accountId: string;\n          limit?: number | undefined;\n          order?: 'asc' | 'desc' | undefined;\n          receiverId?: string | undefined;\n          serialNumber?: string | undefined;\n          tokenId?: string | undefined;\n        },\n    options?: {\n      limit?: number;\n      order?: 'asc' | 'desc';\n      receiverId?: string;\n      serialNumber?: string;\n      tokenId?: string;\n    }\n  ): Promise<TokenAirdrop[] | null> {\n    let accountIdString: string;\n    let finalOptions: typeof options;\n\n    if (typeof accountIdOrArgs === 'object' && 'accountId' in accountIdOrArgs) {\n      accountIdString = accountIdOrArgs.accountId;\n      finalOptions = filterUndefined({\n        limit: accountIdOrArgs.limit,\n        order: accountIdOrArgs.order,\n        receiverId: accountIdOrArgs.receiverId,\n        serialNumber: accountIdOrArgs.serialNumber,\n        tokenId: accountIdOrArgs.tokenId,\n      }) as typeof options;\n    } else {\n      accountIdString =\n        typeof accountIdOrArgs === 'string'\n          ? accountIdOrArgs\n          : accountIdOrArgs.toString();\n      finalOptions = options;\n    }\n\n    if (!finalOptions) {\n      return await this.mirrorNode.getOutstandingTokenAirdrops(accountIdString);\n    }\n\n    const filteredOptions = filterUndefined(finalOptions);\n    const hasFilters = Object.keys(filteredOptions).length > 0;\n    return await this.mirrorNode.getOutstandingTokenAirdrops(\n      accountIdString,\n      hasFilters ? filteredOptions : undefined\n    );\n  }\n\n  /**\n   * Get pending token airdrops received by an account\n   */\n  async getPendingTokenAirdrops(\n    accountIdOrArgs:\n      | string\n      | AccountId\n      | {\n          accountId: string;\n          limit?: number | undefined;\n          order?: 'asc' | 'desc' | undefined;\n          senderId?: string | undefined;\n          serialNumber?: string | undefined;\n          tokenId?: string | undefined;\n        },\n    options?: {\n      limit?: number;\n      order?: 'asc' | 'desc';\n      senderId?: string;\n      serialNumber?: string;\n      tokenId?: string;\n    }\n  ): Promise<TokenAirdrop[] | null> {\n    let accountIdString: string;\n    let finalOptions: typeof options;\n\n    if (typeof accountIdOrArgs === 'object' && 'accountId' in accountIdOrArgs) {\n      accountIdString = accountIdOrArgs.accountId;\n      finalOptions = filterUndefined({\n        limit: accountIdOrArgs.limit,\n        order: accountIdOrArgs.order,\n        senderId: accountIdOrArgs.senderId,\n        serialNumber: accountIdOrArgs.serialNumber,\n        tokenId: accountIdOrArgs.tokenId,\n      }) as typeof options;\n    } else {\n      accountIdString =\n        typeof accountIdOrArgs === 'string'\n          ? accountIdOrArgs\n          : accountIdOrArgs.toString();\n      finalOptions = options;\n    }\n\n    if (!finalOptions) {\n      return await this.mirrorNode.getPendingTokenAirdrops(accountIdString);\n    }\n\n    const filteredOptions = filterUndefined(finalOptions);\n    const hasFilters = Object.keys(filteredOptions).length > 0;\n    return await this.mirrorNode.getPendingTokenAirdrops(\n      accountIdString,\n      hasFilters ? filteredOptions : undefined\n    );\n  }\n\n  /**\n   * Get blocks with optional filtering\n   */\n  async getBlocks(options?: {\n    blockNumber?: string | undefined;\n    timestamp?: string | undefined;\n    limit?: number | undefined;\n    order?: 'asc' | 'desc' | undefined;\n  }): Promise<Block[] | null> {\n    if (!options) {\n      return await this.mirrorNode.getBlocks();\n    }\n\n    const filteredOptions = filterUndefined(options) as {\n      blockNumber?: string;\n      timestamp?: string;\n      limit?: number;\n      order?: 'asc' | 'desc';\n    };\n    const hasFilters = Object.keys(filteredOptions).length > 0;\n    return await this.mirrorNode.getBlocks(\n      hasFilters ? filteredOptions : undefined\n    );\n  }\n\n  /**\n   * Get a specific block by number or hash\n   */\n  async getBlock(blockNumberOrHash: string): Promise<Block | null> {\n    return await this.mirrorNode.getBlock(blockNumberOrHash);\n  }\n\n  /**\n   * Get contract results with optional filtering\n   */\n  async getContractResults(options?: {\n    from?: string;\n    blockHash?: string;\n    blockNumber?: string;\n    internal?: boolean;\n    limit?: number;\n    order?: 'asc' | 'desc';\n    timestamp?: string;\n    transactionIndex?: number;\n  }): Promise<ContractResult[] | null> {\n    return await this.mirrorNode.getContractResults(options);\n  }\n\n  /**\n   * Get contract result by transaction ID\n   */\n  async getContractResult(\n    transactionIdOrHash: string,\n    nonce?: number\n  ): Promise<ContractResult | null> {\n    return await this.mirrorNode.getContractResult(transactionIdOrHash, nonce);\n  }\n\n  /**\n   * Get contract logs with optional filtering\n   */\n  async getContractLogs(options?: {\n    index?: string;\n    limit?: number;\n    order?: 'asc' | 'desc';\n    timestamp?: string;\n    topic0?: string;\n    topic1?: string;\n    topic2?: string;\n    topic3?: string;\n    transactionHash?: string;\n  }): Promise<ContractLog[] | null> {\n    return await this.mirrorNode.getContractLogs(options);\n  }\n\n  /**\n   * Get contract actions for a transaction\n   */\n  async getContractActions(\n    transactionIdOrHash: string,\n    options?: {\n      index?: string;\n      limit?: number;\n      order?: 'asc' | 'desc';\n    }\n  ): Promise<ContractAction[] | null> {\n    return await this.mirrorNode.getContractActions(\n      transactionIdOrHash,\n      options\n    );\n  }\n\n  /**\n   * Get NFT information by token ID and serial number\n   */\n  async getNftInfo(\n    tokenId: string,\n    serialNumber: number\n  ): Promise<NftInfo | null> {\n    return await this.mirrorNode.getNftInfo(tokenId, serialNumber);\n  }\n\n  /**\n   * Get all NFTs for a token ID\n   */\n  async getNftsByToken(\n    tokenId: string,\n    options?: {\n      accountId?: string;\n      limit?: number;\n      order?: 'asc' | 'desc';\n      serialNumber?: string;\n    }\n  ): Promise<NftInfo[] | null> {\n    return await this.mirrorNode.getNftsByToken(tokenId, options);\n  }\n\n  /**\n   * Get network stake information\n   */\n  async getNetworkStake(timestamp?: string): Promise<NetworkStake | null> {\n    return await this.mirrorNode.getNetworkStake(timestamp);\n  }\n\n  /**\n   * Get network supply information\n   */\n  async getNetworkSupply(timestamp?: string): Promise<NetworkSupply | null> {\n    return await this.mirrorNode.getNetworkSupply(timestamp);\n  }\n\n  /**\n   * Get contract entities from the network\n   */\n  async getContracts(options?: {\n    contractId?: string | undefined;\n    limit?: number | undefined;\n    order?: 'asc' | 'desc' | undefined;\n  }): Promise<ContractEntity[] | null> {\n    if (!options) {\n      return await this.mirrorNode.getContracts();\n    }\n\n    const filteredOptions = filterUndefined(options) as {\n      contractId?: string;\n      limit?: number;\n      order?: 'asc' | 'desc';\n    };\n    const hasFilters = Object.keys(filteredOptions).length > 0;\n    return await this.mirrorNode.getContracts(\n      hasFilters ? filteredOptions : undefined\n    );\n  }\n\n  /**\n   * Get a specific contract by ID or address\n   */\n  async getContract(\n    contractIdOrAddress: string,\n    timestamp?: string,\n    includeBytecode?: boolean\n  ): Promise<ContractEntity | null> {\n    const response = await this.mirrorNode.getContract(\n      contractIdOrAddress,\n      timestamp\n    );\n    if (!includeBytecode) {\n      delete response?.bytecode;\n    }\n    return response;\n  }\n\n  /**\n   * Get contract results by contract\n   */\n  async getContractResultsByContract(\n    contractIdOrAddress: string,\n    options?: {\n      blockHash?: string;\n      blockNumber?: string;\n      from?: string;\n      internal?: boolean;\n      limit?: number;\n      order?: 'asc' | 'desc';\n      timestamp?: string;\n      transactionIndex?: number;\n    }\n  ): Promise<ContractResult[] | null> {\n    return await this.mirrorNode.getContractResultsByContract(\n      contractIdOrAddress,\n      options\n    );\n  }\n\n  /**\n   * Get contract state for a specific contract\n   */\n  async getContractState(\n    contractIdOrAddress: string,\n    options?: {\n      limit?: number;\n      order?: 'asc' | 'desc';\n      slot?: string;\n      timestamp?: string;\n    }\n  ): Promise<ContractState[] | null> {\n    return await this.mirrorNode.getContractState(contractIdOrAddress, options);\n  }\n\n  /**\n   * Get contract logs by contract\n   */\n  async getContractLogsByContract(\n    contractIdOrAddress: string,\n    options?: {\n      index?: string;\n      limit?: number;\n      order?: 'asc' | 'desc';\n      timestamp?: string;\n      topic0?: string;\n      topic1?: string;\n      topic2?: string;\n      topic3?: string;\n    }\n  ): Promise<ContractLog[] | null> {\n    return await this.mirrorNode.getContractLogsByContract(\n      contractIdOrAddress,\n      options\n    );\n  }\n\n  /**\n   * Get network information\n   */\n  async getNetworkInfo(): Promise<NetworkInfo | null> {\n    return await this.mirrorNode.getNetworkInfo();\n  }\n\n  /**\n   * Get network fees\n   */\n  async getNetworkFees(timestamp?: string): Promise<NetworkFees | null> {\n    return await this.mirrorNode.getNetworkFees(timestamp);\n  }\n\n  /**\n   * Get opcode traces for a specific transaction\n   */\n  async getOpcodeTraces(\n    transactionIdOrHash: string,\n    options?: {\n      stack?: boolean;\n      memory?: boolean;\n      storage?: boolean;\n    }\n  ): Promise<OpcodesResponse | null> {\n    return await this.mirrorNode.getOpcodeTraces(transactionIdOrHash, options);\n  }\n}\n","import { z } from 'zod';\nimport { StructuredTool, ToolParams } from '@langchain/core/tools';\nimport { HederaAgentKit } from '../../../agent/agent';\nimport { Logger as StandardsSdkLogger } from '@hashgraphonline/standards-sdk';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { AccountId, Key, TransactionId } from '@hashgraph/sdk';\nimport { parseKey } from '../../../utils/key-utils';\n\n/**\n * Zod schema for transaction meta options that can be used with any Hedera transaction tool.\n */\nexport const HederaTransactionMetaOptionsSchema = z\n  .object({\n    transactionMemo: z\n      .string()\n      .optional()\n      .describe('Optional memo for the Hedera transaction.'),\n    transactionId: z\n      .string()\n      .optional()\n      .describe(\n        'Optional transaction ID to use (e.g., for pre-generated IDs).'\n      ),\n    nodeAccountIds: z\n      .array(z.string())\n      .optional()\n      .describe(\n        'Optional specific node account IDs to target for the transaction.'\n      ),\n    schedule: z\n      .boolean()\n      .optional()\n      .describe(\n        'Set to true to schedule the transaction. If true, output will be for a ScheduleCreate transaction.'\n      ),\n    scheduleMemo: z\n      .string()\n      .optional()\n      .describe('Optional memo for the ScheduleCreate transaction itself.'),\n    schedulePayerAccountId: z\n      .string()\n      .optional()\n      .describe(\n        'Optional payer account ID for the ScheduleCreate transaction.'\n      ),\n    scheduleAdminKey: z\n      .string()\n      .optional()\n      .describe(\n        'Optional admin key (serialized string) for the ScheduleCreate transaction. Builder parses.'\n      ),\n  })\n  .optional();\n\nexport type HederaTransactionMetaOptions = z.infer<\n  typeof HederaTransactionMetaOptionsSchema\n>;\n\n/**\n * Parameters required to initialize a BaseHederaTransactionTool.\n */\nexport interface BaseHederaTransactionToolParams extends ToolParams {\n  hederaKit: HederaAgentKit;\n  logger?: StandardsSdkLogger;\n}\n\n/**\n * Schedule options used when executing transactions.\n */\ninterface ScheduleExecutionOptions {\n  schedule?: boolean;\n  scheduleMemo?: string;\n  schedulePayerAccountId?: string | AccountId;\n  scheduleAdminKey?: Key;\n}\n\n/**\n * Base class for all Hedera transaction tools.\n * Handles common transaction processing logic across different tool types.\n *\n * @template S - The Zod schema that defines the input parameters for the specific tool\n */\nexport abstract class BaseHederaTransactionTool<\n  //@ts-ignore\n  S extends z.ZodObject<any, any, any, any>\n> extends StructuredTool<\n  //@ts-ignore\n  z.ZodObject<\n    S['shape'] & { metaOptions: typeof HederaTransactionMetaOptionsSchema },\n    any,\n    any,\n    z.infer<S> & { metaOptions?: HederaTransactionMetaOptions },\n    z.infer<S> & { metaOptions?: HederaTransactionMetaOptions }\n  >\n> {\n  protected hederaKit: HederaAgentKit;\n  protected logger: StandardsSdkLogger;\n  protected neverScheduleThisTool: boolean = false;\n\n  abstract specificInputSchema: S;\n  abstract namespace: string;\n\n  //@ts-ignore: Ignoring complex type compatibility issues\n  get schema(): this['lc_kwargs']['schema'] {\n    //@ts-ignore: Ignoring complex type compatibility issues\n    return this.specificInputSchema.extend({\n      metaOptions: HederaTransactionMetaOptionsSchema,\n    });\n  }\n\n  constructor({ hederaKit, logger, ...rest }: BaseHederaTransactionToolParams) {\n    super(rest);\n    this.hederaKit = hederaKit;\n    this.logger = logger || hederaKit.logger;\n  }\n\n  /**\n   * Get the appropriate service builder for this tool's operations.\n   */\n  protected abstract getServiceBuilder(): BaseServiceBuilder;\n\n  /**\n   * Call the appropriate builder method with the tool-specific arguments.\n   */\n  protected abstract callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<S>,\n    runManager?: CallbackManagerForToolRun\n  ): Promise<void>;\n\n  /**\n   * Apply any meta options specified in the tool call to the service builder.\n   */\n  protected async _applyMetaOptions(\n    builder: BaseServiceBuilder,\n    metaOpts: HederaTransactionMetaOptions | undefined,\n    specificCallArgs: z.infer<S>\n  ): Promise<void> {\n    await this._substituteKeyFields(specificCallArgs);\n    this._applyTransactionOptions(builder, metaOpts);\n  }\n\n  /**\n   * Handle substitution of special key field values like 'current_signer'\n   */\n  private async _substituteKeyFields(\n    specificCallArgs: z.infer<S>\n  ): Promise<void> {\n    const keyFieldNames: (keyof typeof specificCallArgs)[] = [\n      'adminKey',\n      'kycKey',\n      'freezeKey',\n      'wipeKey',\n      'supplyKey',\n      'feeScheduleKey',\n      'pauseKey',\n    ];\n\n    for (const keyField of keyFieldNames) {\n      const originalKeyValue = (specificCallArgs as any)[keyField];\n\n      if (originalKeyValue === 'current_signer') {\n        try {\n          const operatorPubKey = await this.hederaKit.signer.getPublicKey();\n          const pubKeyString = operatorPubKey.toStringDer();\n          (specificCallArgs as any)[keyField] = pubKeyString;\n          this.logger.info(\n            `Substituted ${\n              keyField as string\n            } with current signer's public key.`\n          );\n        } catch (error) {\n          const typedError = error as Error;\n          this.logger.error(\n            `Failed to get current signer's public key for ${\n              keyField as string\n            } substitution: ${typedError.message}`,\n            error\n          );\n        }\n      }\n    }\n  }\n\n  /**\n   * Apply transaction-specific options from metaOptions\n   */\n  private _applyTransactionOptions(\n    builder: BaseServiceBuilder,\n    metaOptions?: HederaTransactionMetaOptions\n  ): void {\n    if (!metaOptions) return;\n\n    if (metaOptions.transactionId) {\n      try {\n        builder.setTransactionId(\n          TransactionId.fromString(metaOptions.transactionId)\n        );\n      } catch {\n        this.logger.warn(\n          `Invalid transactionId format in metaOptions: ${metaOptions.transactionId}, ignoring.`\n        );\n      }\n    }\n\n    if (metaOptions.nodeAccountIds && metaOptions.nodeAccountIds.length > 0) {\n      try {\n        builder.setNodeAccountIds(\n          metaOptions.nodeAccountIds.map((id: string) =>\n            AccountId.fromString(id)\n          )\n        );\n      } catch {\n        this.logger.warn(\n          `Invalid nodeAccountId format in metaOptions, ignoring.`\n        );\n      }\n    }\n\n    if (metaOptions.transactionMemo) {\n      builder.setTransactionMemo(metaOptions.transactionMemo);\n    }\n  }\n\n  /**\n   * Handle direct execution mode for the transaction\n   */\n  private async _handleDirectExecution(\n    builder: BaseServiceBuilder,\n    metaOpts: HederaTransactionMetaOptions | undefined,\n    allNotes: string[]\n  ): Promise<string> {\n    const execOptions = this._buildScheduleOptions(metaOpts);\n\n    this.logger.info(\n      `Executing transaction directly (mode: directExecution): ${this.name}`\n    );\n\n    const result = await builder.execute(execOptions);\n    return JSON.stringify({ ...result, notes: allNotes });\n  }\n\n  /**\n   * Handle providing transaction bytes mode\n   */\n  private async _handleProvideBytes(\n    builder: BaseServiceBuilder,\n    metaOpts: HederaTransactionMetaOptions | undefined,\n    allNotes: string[]\n  ): Promise<string> {\n    const shouldSchedule = this._shouldScheduleTransaction(metaOpts);\n\n    if (shouldSchedule) {\n      return this._handleScheduledTransaction(builder, metaOpts, allNotes);\n    } else {\n      return this._handleUnscheduledTransaction(builder, allNotes);\n    }\n  }\n\n  /**\n   * Determine if a transaction should be scheduled\n   */\n  private _shouldScheduleTransaction(\n    metaOptions?: HederaTransactionMetaOptions\n  ): boolean {\n    return (\n      !this.neverScheduleThisTool &&\n      (metaOptions?.schedule ??\n        (this.hederaKit.operationalMode === 'provideBytes' &&\n          this.hederaKit.scheduleUserTransactionsInBytesMode))\n    );\n  }\n\n  /**\n   * Handle creating a scheduled transaction\n   */\n  private async _handleScheduledTransaction(\n    builder: BaseServiceBuilder,\n    metaOpts: HederaTransactionMetaOptions | undefined,\n    allNotes: string[]\n  ): Promise<string> {\n    this.logger.info(\n      `Preparing scheduled transaction (mode: provideBytes, schedule: true): ${this.name}`\n    );\n\n    const execOptions = this._buildScheduleOptions(metaOpts, true);\n    execOptions.schedulePayerAccountId = this.hederaKit.signer.getAccountId();\n\n    const scheduleCreateResult = await builder.execute(execOptions);\n\n    if (scheduleCreateResult.success && scheduleCreateResult.scheduleId) {\n      const description =\n        metaOpts?.transactionMemo || `Scheduled ${this.name} operation.`;\n\n      const userInfo = this.hederaKit.userAccountId\n        ? ` User (${this.hederaKit.userAccountId}) will be payer of scheduled transaction.`\n        : '';\n\n      return JSON.stringify({\n        success: true,\n        op: 'schedule_create',\n        scheduleId: scheduleCreateResult.scheduleId.toString(),\n        description: description + userInfo,\n        payer_account_id_scheduled_tx:\n          this.hederaKit.userAccountId || 'unknown',\n        memo_scheduled_tx: metaOpts?.transactionMemo,\n        notes: allNotes,\n      });\n    } else {\n      return JSON.stringify({\n        success: false,\n        error:\n          scheduleCreateResult.error ||\n          'Failed to create schedule and retrieve ID.',\n        notes: allNotes,\n      });\n    }\n  }\n\n  /**\n   * Handle returning transaction bytes for an unscheduled transaction\n   */\n  private async _handleUnscheduledTransaction(\n    builder: BaseServiceBuilder,\n    allNotes: string[]\n  ): Promise<string> {\n    this.logger.info(\n      `Returning transaction bytes (mode: provideBytes, schedule: false): ${this.name}`\n    );\n\n    const bytes = await builder.getTransactionBytes({});\n    return JSON.stringify({\n      success: true,\n      transactionBytes: bytes,\n      transactionId: builder.getCurrentTransaction()?.transactionId?.toString(),\n      notes: allNotes,\n    });\n  }\n\n  /**\n   * Build schedule options from meta options\n   */\n  private _buildScheduleOptions(\n    metaOptions?: HederaTransactionMetaOptions,\n    forceSchedule = false\n  ): ScheduleExecutionOptions {\n    const options: ScheduleExecutionOptions = {};\n\n    if (forceSchedule || metaOptions?.schedule) {\n      options.schedule = true;\n\n      if (metaOptions?.scheduleMemo) {\n        options.scheduleMemo = metaOptions.scheduleMemo;\n      }\n\n      if (metaOptions?.schedulePayerAccountId) {\n        try {\n          options.schedulePayerAccountId = AccountId.fromString(\n            metaOptions.schedulePayerAccountId\n          );\n        } catch {\n          this.logger.warn('Invalid schedulePayerAccountId');\n        }\n      }\n\n      if (metaOptions?.scheduleAdminKey) {\n        try {\n          const parsedKey = parseKey(metaOptions.scheduleAdminKey);\n          if (parsedKey) options.scheduleAdminKey = parsedKey;\n        } catch {\n          this.logger.warn('Invalid scheduleAdminKey');\n        }\n      }\n    }\n\n    return options;\n  }\n\n  /**\n   * Optional method for concrete tools to provide a user-friendly note for a specific Zod-defaulted parameter.\n   * @param key The key of the parameter that was defaulted by Zod.\n   * @param schemaDefaultValue The default value defined in the Zod schema for this key.\n   * @param actualValue The current/final value of the parameter after Zod parsing.\n   * @returns A user-friendly string for the note, or undefined to use a generic note.\n   */\n  protected getNoteForKey?(\n    //eslint-disable-next-line @typescript-eslint/no-unused-vars\n    key: string,\n    //eslint-disable-next-line @typescript-eslint/no-unused-vars\n    schemaDefaultValue: unknown,\n    //eslint-disable-next-line @typescript-eslint/no-unused-vars\n    actualValue: unknown\n  ): string | undefined {\n    return undefined;\n  }\n\n  /**\n   * Main method called when the tool is executed.\n   * Processes arguments, calls the specific builder method, and handles\n   * transaction execution based on the kit's operational mode.\n   */\n  protected async _call(\n    args: z.infer<ReturnType<this['schema']>>,\n    runManager?: CallbackManagerForToolRun\n  ): Promise<string> {\n    const llmProvidedMetaOptions = args.metaOptions;\n    const specificCallArgs = this._extractSpecificArgsFromCombinedArgs(args);\n\n    this.logger.info(\n      `Executing ${this.name} with Zod-parsed specific args (schema defaults applied by LangChain):`,\n      JSON.parse(JSON.stringify(specificCallArgs)),\n      'and metaOptions:',\n      llmProvidedMetaOptions\n    );\n\n    const zodSchemaInfoNotes: string[] = [];\n    if (this.specificInputSchema && this.specificInputSchema.shape) {\n      for (const key in this.specificInputSchema.shape) {\n        if (\n          Object.prototype.hasOwnProperty.call(\n            this.specificInputSchema.shape,\n            key\n          )\n        ) {\n          const fieldSchema = this.specificInputSchema.shape[\n            key\n          ] as z.ZodTypeAny;\n\n          if (\n            fieldSchema._def &&\n            (fieldSchema._def as any).typeName === 'ZodDefault'\n          ) {\n            const defaultValueOrFn = (fieldSchema._def as any).defaultValue;\n            let schemaDefinedDefaultValue = defaultValueOrFn;\n            if (typeof defaultValueOrFn === 'function') {\n              try {\n                schemaDefinedDefaultValue = defaultValueOrFn();\n              } catch (eDefaultFn) {\n                this.logger.warn(\n                  `Could not execute default value function for key ${key}. Error: ${\n                    (eDefaultFn as Error).message\n                  }`\n                );\n                schemaDefinedDefaultValue = '[dynamic schema default]';\n              }\n            }\n\n            const currentValue =\n              specificCallArgs[key as keyof typeof specificCallArgs];\n            let noteMessage: string | undefined;\n\n            if (this.getNoteForKey) {\n              noteMessage = this.getNoteForKey(\n                key,\n                schemaDefinedDefaultValue,\n                currentValue\n              );\n            }\n\n            if (!noteMessage) {\n              noteMessage = `For the parameter '${key}', the value '${JSON.stringify(\n                currentValue\n              )}' was used. This field has a tool schema default of '${JSON.stringify(\n                schemaDefinedDefaultValue\n              )}'.`;\n            }\n            zodSchemaInfoNotes.push(noteMessage);\n          }\n        }\n      }\n    }\n\n    this.logger.debug('Zod Schema Default Info Notes:', zodSchemaInfoNotes);\n\n    try {\n      const builder = this.getServiceBuilder();\n      builder.clearNotes();\n\n      await this._applyMetaOptions(\n        builder,\n        llmProvidedMetaOptions,\n        specificCallArgs\n      );\n      await this.callBuilderMethod(builder, specificCallArgs, runManager);\n\n      const builderAppliedDefaultNotes = builder.getNotes();\n      this.logger.debug(\n        'Builder Applied Default Notes:',\n        builderAppliedDefaultNotes\n      );\n      const allNotes = [...zodSchemaInfoNotes, ...builderAppliedDefaultNotes];\n      this.logger.debug('All Notes combined:', allNotes);\n\n      if (this.hederaKit.operationalMode === 'directExecution') {\n        return this._handleDirectExecution(\n          builder,\n          llmProvidedMetaOptions,\n          allNotes\n        );\n      } else {\n        return this._handleProvideBytes(\n          builder,\n          llmProvidedMetaOptions,\n          allNotes\n        );\n      }\n    } catch (error) {\n      const builder = this.getServiceBuilder();\n      const builderNotesOnError = builder ? builder.getNotes() : [];\n      const allNotesOnError = [...zodSchemaInfoNotes, ...builderNotesOnError];\n      return this._handleError(error, allNotesOnError);\n    }\n  }\n\n  private _extractSpecificArgsFromCombinedArgs(\n    combinedArgs: z.infer<ReturnType<this['schema']>>\n  ): z.infer<S> {\n    const specificArgs: Record<string, any> = {};\n    if (this.specificInputSchema && this.specificInputSchema.shape) {\n      for (const key in this.specificInputSchema.shape) {\n        if (Object.prototype.hasOwnProperty.call(combinedArgs, key)) {\n          specificArgs[key] = (combinedArgs as any)[key];\n        }\n      }\n    }\n    return specificArgs as z.infer<S>;\n  }\n\n  private _handleError(error: unknown, notes?: string[]): string {\n    const errorMessage =\n      error instanceof Error ? error.message : JSON.stringify(error);\n    this.logger.error(`Error in ${this.name}: ${errorMessage}`, error);\n    return JSON.stringify({\n      success: false,\n      error: errorMessage,\n      notes: notes || [],\n    });\n  }\n}\n","import { Key, PublicKey } from '@hashgraph/sdk';\nimport { detectKeyTypeFromString } from '@hashgraphonline/standards-sdk';\n\n/**\n * Parses a string representation of a key into an SDK Key object.\n * Supports hex-encoded private keys (derives public key) or hex/DER-encoded public keys.\n * @param keyString The key string.\n * @returns An SDK Key object or null if parsing fails.\n */\nexport function parseKey(keyString: string): Key | null {\n  if (!keyString) {\n    return null;\n  }\n  try {\n    const keyDetection = detectKeyTypeFromString(keyString);\n    return keyDetection.privateKey.publicKey;\n  } catch {\n    try {\n      return PublicKey.fromString(keyString);\n    } catch {\n      return null;\n    }\n  }\n}\n","import { z } from 'zod';\nimport { CreateTopicParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { HcsBuilder } from '../../../builders/hcs/hcs-builder';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\n\n/**\n * Zod schema for the input structure of a single custom fee object.\n * This defines the structure the LLM should provide for each custom fee.\n */\nconst CustomFeeObjectSchema = z.object({\n  feeCollectorAccountId: z\n    .string()\n    .describe('The account ID to receive the custom fee.'),\n  denominatingTokenId: z\n    .string()\n    .optional()\n    .describe('The token ID for fee denomination (if not HBAR).'),\n  amount: z\n    .union([z.number(), z.string()])\n    .describe(\n      'The fee amount (smallest unit for tokens, or tinybars for HBAR).'\n    ),\n});\n\nconst CreateTopicZodSchemaCore = z.object({\n  memo: z.string().optional().describe('Optional. Memo for the topic.'),\n  adminKey: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Admin key for the topic (e.g., serialized public key string, or private key string for derivation by builder).'\n    ),\n  submitKey: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Submit key for the topic (e.g., serialized public key string, or private key string for derivation by builder).'\n    ),\n  autoRenewPeriod: z\n    .number()\n    .int()\n    .positive()\n    .optional()\n    .describe(\n      'Optional. Auto-renewal period in seconds (e.g., 7776000 for 90 days).'\n    ),\n  autoRenewAccountId: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Account ID for auto-renewal payments (e.g., \"0.0.xxxx\").'\n    ),\n  feeScheduleKey: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Fee schedule key for the topic (e.g., serialized public key string, or private key string for derivation by builder).'\n    ),\n  customFees: z\n    .array(CustomFeeObjectSchema)\n    .optional()\n    .describe(\n      'Optional. Array of custom fee objects to be applied to the topic.'\n    ),\n  exemptAccountIds: z\n    .array(z.string())\n    .optional()\n    .describe('Optional. Account IDs exempt from custom fees.'),\n});\n\nexport class HederaCreateTopicTool extends BaseHederaTransactionTool<\n  typeof CreateTopicZodSchemaCore\n> {\n  name = 'hedera-hcs-create-topic';\n  description =\n    'Creates a new Hedera Consensus Service (HCS) topic. Provide parameters as needed. The builder handles defaults and key parsing.';\n  specificInputSchema = CreateTopicZodSchemaCore;\n  namespace = 'hcs';\n\n  /**\n   *  Topic Creation cannot be scheduled yet.\n   */\n  protected override neverScheduleThisTool = true;\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hcs();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof CreateTopicZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HcsBuilder).createTopic(\n      specificArgs as unknown as CreateTopicParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { DeleteTopicParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { HcsBuilder } from '../../../builders/hcs/hcs-builder';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\n\nconst DeleteTopicZodSchemaCore = z.object({\n  topicId: z\n    .string()\n    .describe('The ID of the topic to be deleted (e.g., \"0.0.xxxx\").'),\n});\n\nexport class HederaDeleteTopicTool extends BaseHederaTransactionTool<\n  typeof DeleteTopicZodSchemaCore\n> {\n  name = 'hedera-hcs-delete-topic';\n  description = 'Deletes an HCS topic. Requires topicId.';\n  specificInputSchema = DeleteTopicZodSchemaCore;\n  namespace = 'hcs';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hcs();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof DeleteTopicZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HcsBuilder).deleteTopic(\n      specificArgs as unknown as DeleteTopicParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { SubmitMessageParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { HcsBuilder } from '../../../builders/hcs/hcs-builder';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\n\nconst SubmitMessageZodSchemaCore = z.object({\n  topicId: z.string().describe('The ID of the topic (e.g., \"0.0.xxxx\").'),\n  message: z\n    .string()\n    .describe(\n      'The message content. For binary data, provide as a base64 encoded string; the builder handles decoding.'\n    ),\n  maxChunks: z\n    .number()\n    .int()\n    .positive()\n    .optional()\n    .describe(\n      'Optional. Maximum number of chunks for messages exceeding single transaction limits. Builder handles chunking.'\n    ),\n  chunkSize: z\n    .number()\n    .int()\n    .positive()\n    .optional()\n    .describe(\n      'Optional. Size of each chunk in bytes if chunking is performed. Builder applies default if needed.'\n    ),\n  submitKey: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Submit key if required by the topic and different from the operator (e.g., serialized public key string, or private key string for derivation by builder).'\n    ),\n});\n\nexport class HederaSubmitMessageTool extends BaseHederaTransactionTool<\n  typeof SubmitMessageZodSchemaCore\n> {\n  name = 'hedera-hcs-submit-message';\n  description =\n    'Submits a message to a Hedera Consensus Service (HCS) topic. The builder handles chunking and base64 decoding for binary messages.';\n  specificInputSchema = SubmitMessageZodSchemaCore;\n  namespace = 'hcs';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hcs();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof SubmitMessageZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HcsBuilder).submitMessageToTopic(\n      specificArgs as unknown as SubmitMessageParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { ClaimAirdropParams } from '../../../types';\nimport { AccountId, TokenId, Long, PendingAirdropId, NftId } from '@hashgraph/sdk';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst ClaimAirdropZodSchemaCore = z.object({\n  pendingAirdrops: z\n    .array(\n      z.object({\n        senderAccountId: z\n          .string()\n          .describe('The account ID of the sender of the airdrop.'),\n        tokenId: z.string().describe('The token ID of the airdropped token.'),\n        serialNumber: z\n          .union([z.number(), z.string()])\n          .describe(\n            'The serial number for an NFT, or a string/number convertible to Long(0) for fungible token claims (representing the whole pending amount for that FT from that sender).'\n          ),\n      })\n    )\n    .min(1)\n    .max(10)\n    .describe(\n      'An array of pending airdrops to claim. Each object must have senderAccountId, tokenId, and serialNumber. Max 10 entries.'\n    ),\n});\n\nexport class HederaClaimAirdropTool extends BaseHederaTransactionTool<\n  typeof ClaimAirdropZodSchemaCore\n> {\n  name = 'hedera-hts-claim-airdrop';\n  description =\n    'Claims pending airdropped tokens (fungible or NFT serials). Requires an array of airdrop objects, each specifying senderAccountId, tokenId, and serialNumber. Use metaOptions for execution control.';\n  specificInputSchema = ClaimAirdropZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof ClaimAirdropZodSchemaCore>\n  ): Promise<void> {\n    const sdkPendingAirdropIds: PendingAirdropId[] =\n      specificArgs.pendingAirdrops.map((item, index: number) => {\n        const itemNumber = index + 1;\n\n        let serialValue: Long;\n        if (typeof item.serialNumber === 'string') {\n          try {\n            serialValue = Long.fromString(item.serialNumber);\n          } catch (e: unknown) {\n            const error = e as Error;\n            throw new Error(\n              `Pending airdrop item #${itemNumber} serialNumber string ('${item.serialNumber}') is not a valid Long: ${error.message}`\n            );\n          }\n        } else {\n          serialValue = Long.fromNumber(item.serialNumber);\n        }\n\n        try {\n          const senderId = AccountId.fromString(item.senderAccountId);\n          const tokId = TokenId.fromString(item.tokenId);\n          return new PendingAirdropId({\n            senderId,\n            tokenId: tokId,\n            nftId: NftId.fromString(serialValue.toString()),\n          });\n        } catch (e: unknown) {\n          const error = e as Error;\n          throw new Error(\n            `Error constructing PendingAirdropId for item #${itemNumber} (sender: ${item.senderAccountId}, token: ${item.tokenId}, serial: ${item.serialNumber}): ${error.message}`\n          );\n        }\n      });\n\n    const claimParams: ClaimAirdropParams = {\n      pendingAirdropIds: sdkPendingAirdropIds,\n    };\n\n    (builder as HtsBuilder).claimAirdrop(claimParams);\n  }\n}\n","import { z } from 'zod';\nimport { FTCreateParams } from '../../../types';\nimport { TokenSupplyType as SDKTokenSupplyType } from '@hashgraph/sdk';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst FixedFeeInputSchema = z.object({\n  type: z.enum(['FIXED', 'FIXED_FEE']),\n  feeCollectorAccountId: z.string().optional().describe(\"Fee collector's account ID. Defaults to user's account if in user-centric context and not specified.\"),\n  denominatingTokenId: z\n    .string()\n    .optional()\n    .describe('Denominating token ID for the fee (if not HBAR).'),\n  amount: z\n    .union([z.number(), z.string()])\n    .describe('Fee amount (smallest unit for tokens, or tinybars for HBAR).'),\n});\n\nconst FractionalFeeInputSchema = z.object({\n  type: z.enum(['FRACTIONAL', 'FRACTIONAL_FEE']),\n  feeCollectorAccountId: z.string().optional().describe(\"Fee collector's account ID. Defaults to user's account if in user-centric context and not specified.\"),\n  numerator: z.number().int().describe('Numerator of the fractional fee.'),\n  denominator: z\n    .number()\n    .int()\n    .positive()\n    .describe('Denominator of the fractional fee.'),\n  minAmount: z\n    .union([z.number(), z.string()])\n    .optional()\n    .describe('Minimum fractional fee amount.'),\n  maxAmount: z\n    .union([z.number(), z.string()])\n    .optional()\n    .describe('Maximum fractional fee amount (0 for no max).'),\n  assessmentMethodInclusive: z\n    .boolean()\n    .optional()\n    .describe('Fee is assessed on net amount (false) or gross (true).'),\n});\n\nconst RoyaltyFeeInputSchema = z.object({\n  type: z.enum(['ROYALTY', 'ROYALTY_FEE']),\n  feeCollectorAccountId: z.string().optional().describe(\"Fee collector's account ID. Defaults to user's account if in user-centric context and not specified.\"),\n  numerator: z.number().int().describe('Numerator of the royalty fee.'),\n  denominator: z\n    .number()\n    .int()\n    .positive()\n    .describe('Denominator of the royalty fee.'),\n  fallbackFee: FixedFeeInputSchema.omit({ type: true })\n    .optional()\n    .describe('Fallback fixed fee if royalty is not applicable.'),\n});\n\nconst CustomFeeInputUnionSchema = z.discriminatedUnion('type', [\n  FixedFeeInputSchema,\n  FractionalFeeInputSchema,\n  RoyaltyFeeInputSchema,\n]);\n\nexport type CustomFeeInputData = z.infer<typeof CustomFeeInputUnionSchema>;\n\nconst FTCreateZodSchemaCore = z.object({\n  tokenName: z.string().describe('The publicly visible name of the token.'),\n  tokenSymbol: z\n    .string()\n    .optional()\n    .describe('The publicly visible symbol of the token.'),\n  treasuryAccountId: z\n    .string()\n    .optional()\n    .describe('Treasury account ID (e.g., \"0.0.xxxx\").'),\n  initialSupply: z\n    .union([z.number(), z.string()])\n    .describe('Initial supply in the smallest denomination.'),\n  decimals: z\n    .number()\n    .int()\n    .optional()\n    .default(0)\n    .describe(\n      'Number of decimal places for the token. Defaults to 0 if not specified.'\n    ),\n  adminKey: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Admin key (serialized string). Builder handles parsing.'\n    ),\n  kycKey: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. KYC key (serialized string). Builder handles parsing.'\n    ),\n  freezeKey: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Freeze key (serialized string). Builder handles parsing.'\n    ),\n  wipeKey: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Wipe key (serialized string). Builder handles parsing.'\n    ),\n  supplyKey: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Supply key (serialized string). Builder handles parsing.'\n    ),\n  feeScheduleKey: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Fee schedule key (serialized string). Builder handles parsing.'\n    ),\n  pauseKey: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Pause key (serialized string). Builder handles parsing.'\n    ),\n  autoRenewAccountId: z\n    .string()\n    .optional()\n    .describe('Optional. Auto-renew account ID (e.g., \"0.0.xxxx\").'),\n  autoRenewPeriod: z\n    .number()\n    .int()\n    .positive()\n    .optional()\n    .describe('Optional. Auto-renewal period in seconds.'),\n  memo: z.string().optional().describe('Optional. Memo for the token.'),\n  freezeDefault: z\n    .boolean()\n    .optional()\n    .describe('Optional. Default freeze status for accounts.'),\n  customFees: z\n    .array(CustomFeeInputUnionSchema)\n    .optional()\n    .describe('Optional. Array of custom fee objects for the token.'),\n  supplyType: z\n    .enum([\n      SDKTokenSupplyType.Finite.toString(),\n      SDKTokenSupplyType.Infinite.toString(),\n    ])\n    .optional()\n    .default(SDKTokenSupplyType.Finite.toString())\n    .describe(\n      'Supply type: FINITE or INFINITE. Defaults to FINITE if not specified.'\n    ),\n  maxSupply: z\n    .union([z.number(), z.string()])\n    .optional()\n    .default(1000000000000000)\n    .describe(\n      'Max supply if supplyType is FINITE. Builder validates against initialSupply.'\n    ),\n});\n\nexport class HederaCreateFungibleTokenTool extends BaseHederaTransactionTool<\n  typeof FTCreateZodSchemaCore\n> {\n  name = 'hedera-hts-create-fungible-token';\n  description =\n    'Creates a new Hedera Fungible Token (FT). Builder handles key parsing, fee construction, and supply validation.';\n  specificInputSchema = FTCreateZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof FTCreateZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).createFungibleToken(\n      specificArgs as unknown as FTCreateParams\n    );\n  }\n\n  protected override getNoteForKey(\n    key: string,\n    schemaDefaultValue: unknown,\n    actualValue: unknown\n  ): string | undefined {\n    if (key === 'decimals') {\n      return `The number of decimal places for your token was automatically set to '${actualValue}'.`;\n    }\n    if (key === 'supplyType') {\n      return `Your token's supply type was set to '${actualValue}' by default.`;\n    }\n    if (key === 'maxSupply') {\n      try {\n        const num = BigInt(String(actualValue));\n        return `A maximum supply of '${num.toLocaleString()}' for the token was set by default.`;\n      } catch {\n        return `The maximum supply for the token was set to '${actualValue}' by default.`;\n      }\n    }\n    if (key === 'freezeDefault') {\n      return `By default, accounts holding this token will ${\n        actualValue ? 'be frozen' : 'not be frozen'\n      }.`;\n    }\n    return undefined;\n  }\n}\n","import { z } from 'zod';\nimport { NFTCreateParams } from '../../../types';\nimport { TokenSupplyType as SDKTokenSupplyType } from '@hashgraph/sdk';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\n/**\n * Zod schema for a fixed fee input object.\n */\nconst FixedFeeInputSchema = z.object({\n  type: z.enum(['FIXED', 'FIXED_FEE']),\n  feeCollectorAccountId: z.string().optional().describe(\"Fee collector's account ID. Defaults to user's account if in user-centric context and not specified.\"),\n  denominatingTokenId: z\n    .string()\n    .optional()\n    .describe('Denominating token ID for the fee (if not HBAR).'),\n  amount: z\n    .union([z.number(), z.string()])\n    .describe('Fee amount (smallest unit for tokens, or tinybars for HBAR).'),\n});\n\n/**\n * Zod schema for a fractional fee input object.\n */\nconst FractionalFeeInputSchema = z.object({\n  type: z.enum(['FRACTIONAL', 'FRACTIONAL_FEE']),\n  feeCollectorAccountId: z.string().optional().describe(\"Fee collector's account ID. Defaults to user's account if in user-centric context and not specified.\"),\n  numerator: z.number().int().describe('Numerator of the fractional fee.'),\n  denominator: z\n    .number()\n    .int()\n    .positive()\n    .describe('Denominator of the fractional fee.'),\n  minAmount: z\n    .union([z.number(), z.string()])\n    .optional()\n    .describe('Minimum fractional fee amount.'),\n  maxAmount: z\n    .union([z.number(), z.string()])\n    .optional()\n    .describe('Maximum fractional fee amount (0 for no max).'),\n  assessmentMethodInclusive: z\n    .boolean()\n    .optional()\n    .describe('Fee is assessed on net amount (false) or gross (true).'),\n});\n\n/**\n * Zod schema for a royalty fee input object.\n */\nconst RoyaltyFeeInputSchema = z.object({\n  type: z.enum(['ROYALTY', 'ROYALTY_FEE']),\n  feeCollectorAccountId: z.string().optional().describe(\"Fee collector's account ID. Defaults to user's account if in user-centric context and not specified.\"),\n  numerator: z.number().int().describe('Numerator of the royalty fee.'),\n  denominator: z\n    .number()\n    .int()\n    .positive()\n    .describe('Denominator of the royalty fee.'),\n  fallbackFee: FixedFeeInputSchema.omit({ type: true })\n    .optional()\n    .describe('Fallback fixed fee if royalty is not applicable.'),\n});\n\n/**\n * Zod schema for a discriminated union of custom fee input types.\n */\nconst CustomFeeInputUnionSchema = z.discriminatedUnion('type', [\n  FixedFeeInputSchema,\n  FractionalFeeInputSchema,\n  RoyaltyFeeInputSchema,\n]);\n\nconst NFTCreateZodSchemaCore = z.object({\n  tokenName: z\n    .string()\n    .describe('The publicly visible name of the NFT collection.'),\n  tokenSymbol: z\n    .string()\n    .optional()\n    .describe('The publicly visible symbol of the NFT collection.'),\n  treasuryAccountId: z\n    .string()\n    .optional()\n    .describe('Treasury account ID (e.g., \"0.0.xxxx\").'),\n  adminKey: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Admin key (serialized string). Builder handles parsing.'\n    ),\n  kycKey: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. KYC key (serialized string). Builder handles parsing.'\n    ),\n  freezeKey: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Freeze key (serialized string). Builder handles parsing.'\n    ),\n  wipeKey: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Wipe key (serialized string). Builder handles parsing.'\n    ),\n  supplyKey: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Supply key (serialized string). Builder handles parsing.'\n    ),\n  feeScheduleKey: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Fee schedule key (serialized string). Builder handles parsing.'\n    ),\n  pauseKey: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Pause key (serialized string). Builder handles parsing.'\n    ),\n  autoRenewAccountId: z\n    .string()\n    .optional()\n    .describe('Optional. Auto-renew account ID (e.g., \"0.0.xxxx\").'),\n  autoRenewPeriod: z\n    .number()\n    .int()\n    .positive()\n    .optional()\n    .describe('Optional. Auto-renewal period in seconds.'),\n  memo: z\n    .string()\n    .optional()\n    .describe('Optional. Memo for the NFT collection.'),\n  freezeDefault: z\n    .boolean()\n    .optional()\n    .describe('Optional. Default freeze status for accounts.'),\n  customFees: z\n    .array(CustomFeeInputUnionSchema)\n    .optional()\n    .describe('Optional. Array of custom fee objects for the token.'),\n  supplyType: z\n    .enum([\n      SDKTokenSupplyType.Finite.toString(),\n      SDKTokenSupplyType.Infinite.toString(),\n    ])\n    .optional()\n    .default(SDKTokenSupplyType.Finite.toString())\n    .describe(\n      'Supply type: FINITE or INFINITE. NFTs typically use FINITE. Defaults to FINITE if not specified.'\n    ),\n  maxSupply: z\n    .union([z.number(), z.string()])\n    .optional()\n    .describe(\n      'Max supply if supplyType is FINITE. Builder handles validation.'\n    ),\n});\n\nexport class HederaCreateNftTool extends BaseHederaTransactionTool<\n  typeof NFTCreateZodSchemaCore\n> {\n  name = 'hedera-hts-create-nft';\n  description =\n    'Creates a new Hedera Non-Fungible Token (NFT) collection. Builder handles key parsing, fee construction, and supply validation.';\n  specificInputSchema = NFTCreateZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof NFTCreateZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).createNonFungibleToken(\n      specificArgs as unknown as NFTCreateParams\n    );\n  }\n\n  protected override getNoteForKey(key: string, schemaDefaultValue: unknown, actualValue: unknown): string | undefined {\n    if (key === 'supplyType') {\n      return `Your NFT collection's supply type was set to '${actualValue}' by default.`;\n    }\n    if (key === 'maxSupply' && actualValue !== undefined) {\n      try {\n        const num = BigInt(String(actualValue));\n        return `A maximum supply of '${num.toLocaleString()}' for the NFT collection was set (tool schema default).`;\n      } catch {\n        return `The maximum supply for the NFT collection was set to '${actualValue}' (tool schema default).`;\n      }\n    }\n    return undefined;\n  }\n}\n","import { z } from 'zod';\nimport { MintFTParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst MintFTZodSchemaCore = z.object({\n  tokenId: z\n    .string()\n    .describe('The ID of the fungible token (e.g., \"0.0.xxxx\").'),\n  amount: z\n    .union([z.number(), z.string()])\n    .describe(\n      'Amount to mint (smallest unit). Number or string for large values. Builder handles conversion.'\n    ),\n});\n\nexport class HederaMintFungibleTokenTool extends BaseHederaTransactionTool<\n  typeof MintFTZodSchemaCore\n> {\n  name = 'hedera-hts-mint-fungible-token';\n  description = 'Mints more fungible tokens. Requires tokenId and amount.';\n  specificInputSchema = MintFTZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof MintFTZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).mintFungibleToken(\n      specificArgs as unknown as MintFTParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { MintNFTParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst MintNFTZodSchemaCore = z.object({\n  tokenId: z\n    .string()\n    .describe('The ID of the NFT collection (e.g., \"0.0.xxxx\").'),\n  metadata: z\n    .array(z.string())\n    .describe(\n      'Array of metadata for each NFT. Strings are treated as UTF-8, or base64 for binary. Builder handles decoding & validation.'\n    ),\n  batchSize: z\n    .number()\n    .int()\n    .positive()\n    .optional()\n    .describe(\n      'Optional. Max NFTs per transaction if chunking. Builder handles default/limits.'\n    ),\n});\n\nexport class HederaMintNftTool extends BaseHederaTransactionTool<\n  typeof MintNFTZodSchemaCore\n> {\n  name = 'hedera-hts-mint-nft';\n  description =\n    'Mints new Non-Fungible Tokens (NFTs). Builder handles metadata decoding and batching.';\n  specificInputSchema = MintNFTZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof MintNFTZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).mintNonFungibleToken(\n      specificArgs as unknown as MintNFTParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { RejectAirdropParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst RejectTokensZodSchemaCore = z.object({\n  tokenId: z\n    .string()\n    .describe(\n      'The ID of the token type to reject future associations with (e.g., \"0.0.xxxx\").'\n    ),\n  memo: z.string().optional().describe('Optional. Memo for the transaction.'),\n});\n\nexport class HederaRejectTokensTool extends BaseHederaTransactionTool<\n  typeof RejectTokensZodSchemaCore\n> {\n  name = 'hedera-hts-reject-tokens';\n  description =\n    'Configures the operator to reject future auto-associations with a specific token type.';\n  specificInputSchema = RejectTokensZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof RejectTokensZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).rejectTokens(\n      specificArgs as unknown as RejectAirdropParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { TransferTokensParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst FungibleTokenTransferInputSchema = z.object({\n  type: z.literal('fungible'),\n  tokenId: z.string().describe('Token ID (e.g., \"0.0.xxxx\").'),\n  accountId: z\n    .string()\n    .describe('Account ID for the transfer (e.g., \"0.0.yyyy\").'),\n  amount: z\n    .union([z.number(), z.string()])\n    .describe(\n      'Amount in smallest unit. Positive for credit, negative for debit. Builder handles conversion.'\n    ),\n});\n\nconst NftTransferInputSchema = z.object({\n  type: z.literal('nft'),\n  tokenId: z.string().describe('Token ID of the NFT (e.g., \"0.0.xxxx\").'),\n  serial: z\n    .union([z.number().int().positive(), z.string()])\n    .describe('Serial number of the NFT.'),\n  senderAccountId: z.string().describe('Sender account ID (e.g., \"0.0.ssss\").'),\n  receiverAccountId: z\n    .string()\n    .describe('Receiver account ID (e.g., \"0.0.rrrr\").'),\n  isApproved: z\n    .boolean()\n    .optional()\n    .describe('Optional. True if sender is an approved operator.'),\n});\n\nconst HbarTransferInputSchema = z.object({\n  accountId: z\n    .string()\n    .describe('Account ID for the HBAR transfer (e.g., \"0.0.zzzz\").'),\n  amount: z\n    .union([z.number(), z.string()])\n    .describe(\n      'HBAR amount in tinybars. Positive for credit, negative for debit. Builder handles Hbar unit conversion.'\n    ),\n});\n\nconst TransferTokensZodObjectSchema = z.object({\n  tokenTransfers: z\n    .array(\n      z.discriminatedUnion('type', [\n        FungibleTokenTransferInputSchema,\n        NftTransferInputSchema,\n      ])\n    )\n    .min(1)\n    .describe('Array of fungible token and/or NFT transfers.'),\n  hbarTransfers: z\n    .array(HbarTransferInputSchema)\n    .optional()\n    .describe(\n      'Optional. Array of HBAR transfers. Sum of amounts must be zero.'\n    ),\n  memo: z\n    .string()\n    .optional()\n    .describe('Optional. Memo for the entire transaction.'),\n});\n\nexport class HederaTransferTokensTool extends BaseHederaTransactionTool<\n  //@ts-ignore\n  typeof TransferTokensZodObjectSchema\n> {\n  name = 'hedera-hts-transfer-tokens';\n  description =\n    'Transfers multiple fungible tokens, NFTs, and/or HBAR in a single transaction. Builder handles parsing and validation.';\n  specificInputSchema = TransferTokensZodObjectSchema;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof TransferTokensZodObjectSchema>\n  ): Promise<void> {\n    await (builder as HtsBuilder).transferTokens(\n      specificArgs as unknown as TransferTokensParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { DissociateTokensParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst DissociateTokensZodSchemaCore = z.object({\n  accountId: z\n    .string()\n    .describe('The account ID to dissociate tokens from (e.g., \"0.0.xxxx\").'),\n  tokenIds: z\n    .array(z.string().describe('A token ID (e.g., \"0.0.yyyy\").'))\n    .min(1)\n    .describe('An array of one or more token IDs to dissociate.'),\n});\n\nexport class HederaDissociateTokensTool extends BaseHederaTransactionTool<\n  typeof DissociateTokensZodSchemaCore\n> {\n  name = 'hedera-hts-dissociate-tokens';\n  description = 'Dissociates one or more Hedera tokens from an account.';\n  specificInputSchema = DissociateTokensZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof DissociateTokensZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).dissociateTokens(\n      specificArgs as unknown as DissociateTokensParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { UpdateTokenParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder'; // Added HtsBuilder import\n\nconst UpdateTokenZodSchemaCore = z.object({\n  tokenId: z\n    .string()\n    .describe('The ID of the token to update (e.g., \"0.0.xxxx\").'),\n  tokenName: z\n    .string()\n    .nullable()\n    .optional()\n    .describe('Optional. New token name. Pass null to clear.'),\n  tokenSymbol: z\n    .string()\n    .nullable()\n    .optional()\n    .describe('Optional. New token symbol. Pass null to clear.'),\n  treasuryAccountId: z\n    .string()\n    .optional()\n    .describe('Optional. New treasury account ID (e.g., \"0.0.yyyy\").'),\n  adminKey: z\n    .string()\n    .nullable()\n    .optional()\n    .describe(\n      'Optional. New admin key (serialized string). Pass null to clear.'\n    ),\n  kycKey: z\n    .string()\n    .nullable()\n    .optional()\n    .describe('Optional. New KYC key (serialized string). Pass null to clear.'),\n  freezeKey: z\n    .string()\n    .nullable()\n    .optional()\n    .describe(\n      'Optional. New freeze key (serialized string). Pass null to clear.'\n    ),\n  wipeKey: z\n    .string()\n    .nullable()\n    .optional()\n    .describe(\n      'Optional. New wipe key (serialized string). Pass null to clear.'\n    ),\n  supplyKey: z\n    .string()\n    .nullable()\n    .optional()\n    .describe(\n      'Optional. New supply key (serialized string). Pass null to clear.'\n    ),\n  feeScheduleKey: z\n    .string()\n    .nullable()\n    .optional()\n    .describe(\n      'Optional. New fee schedule key (serialized string). Pass null to clear.'\n    ),\n  pauseKey: z\n    .string()\n    .nullable()\n    .optional()\n    .describe(\n      'Optional. New pause key (serialized string). Pass null to clear.'\n    ),\n  autoRenewAccountId: z\n    .string()\n    .nullable()\n    .optional()\n    .describe('Optional. New auto-renew account ID. Pass null to clear.'),\n  autoRenewPeriod: z\n    .number()\n    .int()\n    .positive()\n    .optional()\n    .describe('Optional. New auto-renewal period in seconds.'),\n  memo: z\n    .string()\n    .nullable()\n    .optional()\n    .describe('Optional. New token memo. Pass null to clear.'),\n});\n\nexport class HederaUpdateTokenTool extends BaseHederaTransactionTool<\n  typeof UpdateTokenZodSchemaCore\n> {\n  name = 'hedera-hts-update-token';\n  description =\n    'Updates an existing Hedera token. Requires tokenId. Other fields are optional. Null can be used to clear certain fields.';\n  specificInputSchema = UpdateTokenZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof UpdateTokenZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).updateToken(\n      specificArgs as unknown as UpdateTokenParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { DeleteTokenParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst DeleteTokenZodSchemaCore = z.object({\n  tokenId: z\n    .string()\n    .describe('The ID of the token to delete (e.g., \"0.0.xxxx\").'),\n});\n\nexport class HederaDeleteTokenTool extends BaseHederaTransactionTool<\n  typeof DeleteTokenZodSchemaCore\n> {\n  name = 'hedera-hts-delete-token';\n  description =\n    'Deletes a token. Requires the tokenId. Use metaOptions for execution control.';\n  specificInputSchema = DeleteTokenZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof DeleteTokenZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).deleteToken(\n      specificArgs as unknown as DeleteTokenParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { PauseTokenParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst PauseTokenZodSchemaCore = z.object({\n  tokenId: z\n    .string()\n    .describe('The ID of the token to pause (e.g., \"0.0.xxxx\").'),\n});\n\nexport class HederaPauseTokenTool extends BaseHederaTransactionTool<\n  typeof PauseTokenZodSchemaCore\n> {\n  name = 'hedera-hts-pause-token';\n  description =\n    'Pauses a token. Requires the tokenId. Use metaOptions for execution control.';\n  specificInputSchema = PauseTokenZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof PauseTokenZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).pauseToken(\n      specificArgs as unknown as PauseTokenParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { UnpauseTokenParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst UnpauseTokenZodSchemaCore = z.object({\n  tokenId: z\n    .string()\n    .describe('The ID of the token to unpause (e.g., \"0.0.xxxx\").'),\n});\n\nexport class HederaUnpauseTokenTool extends BaseHederaTransactionTool<\n  typeof UnpauseTokenZodSchemaCore\n> {\n  name = 'hedera-hts-unpause-token';\n  description =\n    'Unpauses a token. Requires the tokenId. Use metaOptions for execution control.';\n  specificInputSchema = UnpauseTokenZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof UnpauseTokenZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).unpauseToken(\n      specificArgs as unknown as UnpauseTokenParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { FreezeTokenAccountParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst FreezeTokenAccountZodSchemaCore = z.object({\n  tokenId: z.string().describe('The ID of the token (e.g., \"0.0.xxxx\").'),\n  accountId: z\n    .string()\n    .describe('The account ID to be frozen for the token (e.g., \"0.0.yyyy\").'),\n});\n\nexport class HederaFreezeTokenAccountTool extends BaseHederaTransactionTool<\n  typeof FreezeTokenAccountZodSchemaCore\n> {\n  name = 'hedera-hts-freeze-token-account';\n  description = 'Freezes an account for a specific token.';\n  specificInputSchema = FreezeTokenAccountZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof FreezeTokenAccountZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).freezeTokenAccount(\n      specificArgs as unknown as FreezeTokenAccountParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { UnfreezeTokenAccountParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst UnfreezeTokenAccountZodSchemaCore = z.object({\n  tokenId: z.string().describe('The ID of the token (e.g., \"0.0.xxxx\").'),\n  accountId: z\n    .string()\n    .describe(\n      'The account ID to be unfrozen for the token (e.g., \"0.0.yyyy\").'\n    ),\n});\n\nexport class HederaUnfreezeTokenAccountTool extends BaseHederaTransactionTool<\n  typeof UnfreezeTokenAccountZodSchemaCore\n> {\n  name = 'hedera-hts-unfreeze-token-account';\n  description = 'Unfreezes an account for a specific token.';\n  specificInputSchema = UnfreezeTokenAccountZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof UnfreezeTokenAccountZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).unfreezeTokenAccount(\n      specificArgs as unknown as UnfreezeTokenAccountParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { GrantKycTokenParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst GrantKycTokenZodSchemaCore = z.object({\n  tokenId: z.string().describe('The ID of the token (e.g., \"0.0.xxxx\").'),\n  accountId: z\n    .string()\n    .describe(\n      'The account ID to be granted KYC for the token (e.g., \"0.0.yyyy\").'\n    ),\n});\n\nexport class HederaGrantKycTokenTool extends BaseHederaTransactionTool<\n  typeof GrantKycTokenZodSchemaCore\n> {\n  name = 'hedera-hts-grant-kyc-token';\n  description = 'Grants KYC to an account for a specific token.';\n  specificInputSchema = GrantKycTokenZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof GrantKycTokenZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).grantKycToken(\n      specificArgs as unknown as GrantKycTokenParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { RevokeKycTokenParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst RevokeKycTokenZodSchemaCore = z.object({\n  tokenId: z.string().describe('The ID of the token (e.g., \"0.0.xxxx\").'),\n  accountId: z\n    .string()\n    .describe(\n      'The account ID to have KYC revoked for the token (e.g., \"0.0.yyyy\").'\n    ),\n});\n\nexport class HederaRevokeKycTokenTool extends BaseHederaTransactionTool<\n  typeof RevokeKycTokenZodSchemaCore\n> {\n  name = 'hedera-hts-revoke-kyc-token';\n  description = 'Revokes KYC from an account for a specific token.';\n  specificInputSchema = RevokeKycTokenZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof RevokeKycTokenZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).revokeKycToken(\n      specificArgs as RevokeKycTokenParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { WipeTokenAccountParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst WipeTokenAccountZodSchemaCore = z.object({\n  tokenId: z\n    .string()\n    .describe('The ID of the token to wipe (e.g., \"0.0.xxxx\").'),\n  accountId: z\n    .string()\n    .describe(\n      'The account ID from which tokens will be wiped (e.g., \"0.0.yyyy\").'\n    ),\n  amount: z\n    .union([z.number(), z.string()])\n    .optional()\n    .describe(\n      'For Fungible Tokens: amount to wipe (smallest unit). Builder handles conversion and validation.'\n    ),\n  serials: z\n    .array(z.union([z.number().int().positive(), z.string()]))\n    .optional()\n    .describe(\n      'For Non-Fungible Tokens: array of serial numbers to wipe. Builder handles conversion and validation.'\n    ),\n});\n\nexport class HederaWipeTokenAccountTool extends BaseHederaTransactionTool<\n  typeof WipeTokenAccountZodSchemaCore\n> {\n  name = 'hedera-hts-wipe-token-account';\n  description =\n    \"Wipes tokens (fungible or non-fungible) from an account. Provide 'amount' for FTs or 'serials' for NFTs. Builder validates inputs.\";\n  specificInputSchema = WipeTokenAccountZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof WipeTokenAccountZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).wipeTokenAccount(\n      specificArgs as unknown as WipeTokenAccountParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { TokenFeeScheduleUpdateParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\n/**\n * Zod schema for a fixed fee input object.\n */\nconst FixedFeeInputSchema = z.object({\n  type: z.literal('FIXED'),\n  feeCollectorAccountId: z.string().describe(\"Fee collector's account ID.\"),\n  denominatingTokenId: z\n    .string()\n    .optional()\n    .describe('Denominating token ID for the fee (if not HBAR).'),\n  amount: z\n    .union([z.number(), z.string()])\n    .describe('Fee amount (smallest unit for tokens, or tinybars for HBAR).'),\n});\n\n/**\n * Zod schema for a fractional fee input object.\n */\nconst FractionalFeeInputSchema = z.object({\n  type: z.literal('FRACTIONAL'),\n  feeCollectorAccountId: z.string().describe(\"Fee collector's account ID.\"),\n  numerator: z.number().int().describe('Numerator of the fractional fee.'),\n  denominator: z\n    .number()\n    .int()\n    .positive()\n    .describe('Denominator of the fractional fee.'),\n  assessmentMethodInclusive: z\n    .boolean()\n    .optional()\n    .describe('Fee is assessed on net amount (false) or gross (true).'),\n});\n\n/**\n * Zod schema for a royalty fee input object.\n */\nconst RoyaltyFeeInputSchema = z.object({\n  type: z.literal('ROYALTY'),\n  feeCollectorAccountId: z.string().describe(\"Fee collector's account ID.\"),\n  numerator: z.number().int().describe('Numerator of the royalty fee.'),\n  denominator: z\n    .number()\n    .int()\n    .positive()\n    .describe('Denominator of the royalty fee.'),\n  fallbackFee: FixedFeeInputSchema.omit({ type: true })\n    .optional()\n    .describe('Fallback fixed fee if royalty is not applicable.'),\n});\n\n/**\n * Zod schema for a discriminated union of custom fee input types.\n */\nconst CustomFeeInputUnionSchema = z.discriminatedUnion('type', [\n  FixedFeeInputSchema,\n  FractionalFeeInputSchema,\n  RoyaltyFeeInputSchema,\n]);\n\nconst TokenFeeScheduleUpdateZodSchemaCore = z.object({\n  tokenId: z\n    .string()\n    .describe(\n      'The ID of the token whose fee schedule is to be updated (e.g., \"0.0.xxxx\").'\n    ),\n  customFees: z\n    .array(CustomFeeInputUnionSchema)\n    .min(1)\n    .describe(\n      'An array of new custom fee objects. This will replace the existing fee schedule.'\n    ),\n});\n\nexport class HederaTokenFeeScheduleUpdateTool extends BaseHederaTransactionTool<\n  typeof TokenFeeScheduleUpdateZodSchemaCore\n> {\n  name = 'hedera-hts-token-fee-schedule-update';\n  description =\n    'Updates the fee schedule of a token. Requires tokenId and an array of custom fee objects.';\n  specificInputSchema = TokenFeeScheduleUpdateZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof TokenFeeScheduleUpdateZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).feeScheduleUpdate(\n      specificArgs as unknown as TokenFeeScheduleUpdateParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { TransferNFTParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst TransferNftZodSchemaCore = z.object({\n  tokenId: z.string().describe('The token ID of the NFT (e.g., \"0.0.xxxx\").'),\n  serial: z\n    .union([z.number().int().positive(), z.string()])\n    .describe('The serial number of the NFT.'),\n  senderAccountId: z\n    .string()\n    .describe('The sender account ID (e.g., \"0.0.xxxx\").'),\n  receiverAccountId: z\n    .string()\n    .describe('The receiver account ID (e.g., \"0.0.yyyy\").'),\n  isApproved: z\n    .boolean()\n    .optional()\n    .describe('Optional. True if sender is an approved operator for the NFT.'),\n  memo: z.string().optional().describe('Optional. Memo for the transaction.'),\n});\n\nexport class HederaTransferNftTool extends BaseHederaTransactionTool<\n  typeof TransferNftZodSchemaCore\n> {\n  name = 'hedera-hts-transfer-nft';\n  description = 'Transfers a single Non-Fungible Token (NFT).';\n  specificInputSchema = TransferNftZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof TransferNftZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).transferNft(\n      specificArgs as unknown as TransferNFTParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { BurnFTParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst BurnFTZodSchemaCore = z.object({\n  tokenId: z\n    .string()\n    .describe('The ID of the fungible token (e.g., \"0.0.xxxx\").'),\n  amount: z\n    .union([z.number(), z.string()])\n    .describe(\n      'Amount to burn (smallest unit). Number or string for large values. Builder handles conversion.'\n    ),\n});\n\nexport class HederaBurnFungibleTokenTool extends BaseHederaTransactionTool<\n  typeof BurnFTZodSchemaCore\n> {\n  name = 'hedera-hts-burn-fungible-token';\n  description = 'Burns fungible tokens. Requires tokenId and amount.';\n  specificInputSchema = BurnFTZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof BurnFTZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).burnFungibleToken(\n      specificArgs as unknown as BurnFTParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { BurnNFTParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst BurnNFTZodSchemaCore = z.object({\n  tokenId: z\n    .string()\n    .describe('The ID of the NFT collection (e.g., \"0.0.xxxx\").'),\n  serials: z\n    .array(z.union([z.number().int().positive(), z.string()]))\n    .min(1)\n    .describe(\n      'Array of serial numbers to burn. Numbers or strings for large serials. Builder handles conversion.'\n    ),\n});\n\nexport class HederaBurnNftTool extends BaseHederaTransactionTool<\n  typeof BurnNFTZodSchemaCore\n> {\n  name = 'hedera-hts-burn-nft';\n  description =\n    'Burns Non-Fungible Tokens (NFTs). Requires token ID and an array of serial numbers.';\n  specificInputSchema = BurnNFTZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof BurnNFTZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).burnNonFungibleToken(\n      specificArgs as unknown as BurnNFTParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { ApproveFungibleTokenAllowanceParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { AccountBuilder } from '../../../builders/account/account-builder';\n\nconst ApproveFungibleTokenAllowanceZodSchemaCore = z.object({\n  ownerAccountId: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. The token owner account ID (e.g., \"0.0.xxxx\"). Defaults to operator.'\n    ),\n  spenderAccountId: z\n    .string()\n    .describe('The spender account ID (e.g., \"0.0.yyyy\").'),\n  tokenId: z.string().describe('The fungible token ID (e.g., \"0.0.zzzz\").'),\n  amount: z\n    .union([z.number(), z.string()])\n    .describe(\n      'Max token amount (smallest unit) spender can use. Builder handles conversion.'\n    ),\n  memo: z.string().optional().describe('Optional. Memo for the transaction.'),\n});\n\nexport class HederaApproveFungibleTokenAllowanceTool extends BaseHederaTransactionTool<\n  typeof ApproveFungibleTokenAllowanceZodSchemaCore\n> {\n  name = 'hedera-account-approve-fungible-token-allowance';\n  description =\n    'Approves a fungible token allowance for a spender. Builder handles amount conversion.';\n  specificInputSchema = ApproveFungibleTokenAllowanceZodSchemaCore;\n  namespace = 'account';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.accounts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof ApproveFungibleTokenAllowanceZodSchemaCore>\n  ): Promise<void> {\n    await (builder as AccountBuilder).approveFungibleTokenAllowance(\n      specificArgs as unknown as ApproveFungibleTokenAllowanceParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { ApproveHbarAllowanceParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { AccountBuilder } from '../../../builders/account/account-builder';\n\nconst ApproveHbarAllowanceZodSchemaCore = z.object({\n  ownerAccountId: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. The HBAR owner account ID (e.g., \"0.0.xxxx\"). Defaults to operator if not provided.'\n    ),\n  spenderAccountId: z\n    .string()\n    .describe(\n      'The spender account ID being granted the allowance (e.g., \"0.0.yyyy\").'\n    ),\n  amount: z\n    .union([z.number(), z.string()])\n    .describe(\n      'Max HBAR amount spender can use (in HBARs). Builder handles Hbar object creation.'\n    ),\n  memo: z.string().optional().describe('Optional. Memo for the transaction.'),\n});\n\nexport class HederaApproveHbarAllowanceTool extends BaseHederaTransactionTool<\n  typeof ApproveHbarAllowanceZodSchemaCore\n> {\n  name = 'hedera-account-approve-hbar-allowance';\n  description =\n    'Approves an HBAR allowance for a spender. Builder handles Hbar unit conversion.';\n  specificInputSchema = ApproveHbarAllowanceZodSchemaCore;\n  namespace = 'account';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.accounts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof ApproveHbarAllowanceZodSchemaCore>\n  ): Promise<void> {\n    await (builder as AccountBuilder).approveHbarAllowance(\n      specificArgs as unknown as ApproveHbarAllowanceParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { ApproveTokenNftAllowanceParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { AccountBuilder } from '../../../builders/account/account-builder';\n\nconst ApproveTokenNftAllowanceZodSchemaCore = z.object({\n  ownerAccountId: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. The NFT owner account ID (e.g., \"0.0.xxxx\"). Defaults to operator.'\n    ),\n  spenderAccountId: z\n    .string()\n    .describe('The spender account ID (e.g., \"0.0.yyyy\").'),\n  tokenId: z.string().describe('The NFT collection ID (e.g., \"0.0.zzzz\").'),\n  serials: z\n    .array(z.union([z.number().int().positive(), z.string()]))\n    .optional()\n    .describe(\n      'Optional. Specific serial numbers to approve. Use this OR allSerials. Builder handles conversion.'\n    ),\n  allSerials: z\n    .boolean()\n    .optional()\n    .describe(\n      'Optional. If true, approves spender for all serials of the NFT ID. Use this OR serials.'\n    ),\n  memo: z.string().optional().describe('Optional. Memo for the transaction.'),\n});\n\nexport class HederaApproveTokenNftAllowanceTool extends BaseHederaTransactionTool<\n  typeof ApproveTokenNftAllowanceZodSchemaCore\n> {\n  name = 'hedera-account-approve-nft-allowance';\n  description =\n    'Approves an NFT allowance. Builder validates serials/allSerials logic and handles serial conversion.';\n  specificInputSchema = ApproveTokenNftAllowanceZodSchemaCore;\n  namespace = 'account';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.accounts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof ApproveTokenNftAllowanceZodSchemaCore>\n  ): Promise<void> {\n    await (builder as AccountBuilder).approveTokenNftAllowance(\n      specificArgs as unknown as ApproveTokenNftAllowanceParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { CreateAccountParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { AccountBuilder } from '../../../builders/account/account-builder';\n\nconst CreateAccountZodSchemaCore = z.object({\n  key: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Public key string (hex) or private key string for the new account. Used if alias is not set. Builder validates presence of key or alias.'\n    ),\n  alias: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Account alias (e.g., EVM address or serialized PublicKey string). Takes precedence over key. Builder validates presence of key or alias.'\n    ),\n  initialBalance: z\n    .union([z.number(), z.string()])\n    .optional()\n    .describe(\n      'Optional. Initial balance in HBAR. Builder handles conversion. Defaults to 0.'\n    ),\n  memo: z.string().optional().describe('Optional. Memo for the account.'),\n  autoRenewAccountId: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Account ID for auto-renewal payments (e.g., \"0.0.xxxx\").'\n    ),\n  autoRenewPeriod: z\n    .number()\n    .int()\n    .positive()\n    .optional()\n    .describe(\n      'Optional. Auto-renewal period in seconds (e.g., 7776000 for 90 days).'\n    ),\n  receiverSignatureRequired: z\n    .boolean()\n    .optional()\n    .describe('Optional. If true, account must sign transfers out of it.'),\n  maxAutomaticTokenAssociations: z\n    .number()\n    .int()\n    .optional()\n    .describe('Optional. Max automatic token associations for the account.'),\n  stakedAccountId: z\n    .string()\n    .optional()\n    .describe('Optional. Account ID to stake to (e.g., \"0.0.zzzz\").'),\n  stakedNodeId: z\n    .number()\n    .int()\n    .optional()\n    .describe(\n      'Optional. Node ID to stake to. Builder handles Long conversion.'\n    ),\n  declineStakingReward: z\n    .boolean()\n    .optional()\n    .describe('Optional. If true, decline staking rewards.'),\n});\n\nexport class HederaCreateAccountTool extends BaseHederaTransactionTool<\n  typeof CreateAccountZodSchemaCore\n> {\n  name = 'hedera-account-create';\n  description =\n    'Creates a new Hedera account. Requires key or alias (builder validates). Builder handles parsing and defaults.';\n  specificInputSchema = CreateAccountZodSchemaCore;\n  namespace = 'account';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.accounts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof CreateAccountZodSchemaCore>\n  ): Promise<void> {\n    await (builder as AccountBuilder).createAccount(\n      specificArgs as unknown as CreateAccountParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { DeleteAccountParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { AccountBuilder } from '../../../builders/account/account-builder';\n\nconst DeleteAccountZodSchemaCore = z.object({\n  deleteAccountId: z\n    .string()\n    .describe(\n      'The ID of the account to be deleted (e.g., \"0.0.xxxx\"). This account must sign.'\n    ),\n  transferAccountId: z\n    .string()\n    .describe(\n      'The ID of the account to transfer the remaining HBAR balance to (e.g., \"0.0.yyyy\").'\n    ),\n});\n\nexport class HederaDeleteAccountTool extends BaseHederaTransactionTool<\n  typeof DeleteAccountZodSchemaCore\n> {\n  name = 'hedera-account-delete';\n  description =\n    'Deletes an account, transferring its HBAR balance to another account.';\n  specificInputSchema = DeleteAccountZodSchemaCore;\n  namespace = 'account';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.accounts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof DeleteAccountZodSchemaCore>\n  ): Promise<void> {\n    await (builder as AccountBuilder).deleteAccount(\n      specificArgs as unknown as DeleteAccountParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { UpdateAccountParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { AccountBuilder } from '../../../builders/account/account-builder';\n\n/*\n * Zod schema defines the direct input expected from the LLM.\n * Omitted optional fields will result in no change to those account properties.\n * The builder translates provided values to SDK calls.\n */\nconst UpdateAccountZodSchemaCore = z.object({\n  accountIdToUpdate: z.string().describe('The ID of the account to update (e.g., \"0.0.12345\").'),\n  key: z.string().nullable().optional()\n    .describe('Optional. New key (serialized string). Pass null to clear (if allowed by SDK). Builder handles parsing.'),\n  autoRenewPeriod: z.number().int().positive().optional()\n    .describe('Optional. New auto-renewal period in seconds (e.g., 7776000 for 90 days).'),\n  memo: z.string().nullable().optional()\n    .describe('Optional. New memo. Pass null or empty string to clear.'),\n  maxAutomaticTokenAssociations: z.number().int().min(0).optional()\n    .describe('Optional. New max automatic token associations (0-5000).'),\n  stakedAccountId: z.string().nullable().optional()\n    .describe('Optional. New account ID to stake to. Pass \"0.0.0\" or null to clear.'),\n  stakedNodeId: z.number().int().nullable().optional()\n    .describe('Optional. New node ID to stake to. Pass -1 or null to clear. Builder handles Long conversion.'),\n  declineStakingReward: z.boolean().optional()\n    .describe('Optional. If true, account declines staking rewards.'),\n  receiverSignatureRequired: z.boolean().optional()\n    .describe('Optional. If true, account must sign transfers out of it.'),\n});\n\nexport class HederaUpdateAccountTool extends BaseHederaTransactionTool<\n  typeof UpdateAccountZodSchemaCore\n> {\n  name = 'hedera-account-update';\n  description =\n    'Updates an existing Hedera account. Specify accountIdToUpdate and fields to change. Builder handles parsing and clearing logic.';\n  specificInputSchema = UpdateAccountZodSchemaCore;\n  namespace = 'account';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.accounts();\n  }\n\n  /**\n   * Passes the validated arguments directly to the AccountBuilder's updateAccount method.\n   * The builder is responsible for all transformations and applying logic based on input values.\n   * Omitted optional fields from the LLM mean those properties will not be targeted for update.\n   */\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof UpdateAccountZodSchemaCore>\n  ): Promise<void> {\n    await (builder as AccountBuilder).updateAccount(\n      specificArgs as unknown as UpdateAccountParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { HbarTransferParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { AccountBuilder } from '../../../builders/account/account-builder';\n\nconst HbarTransferInputSchema = z.object({\n  accountId: z\n    .string()\n    .describe('Account ID for the transfer (e.g., \"0.0.xxxx\").'),\n  amount: z\n    .union([z.number(), z.string()])\n    .describe(\n      'HBAR amount. Positive for credit, negative for debit. Builder handles Hbar unit & sum validation.'\n    ),\n});\n\nconst TransferHbarZodSchemaCore = z.object({\n  transfers: z\n    .array(HbarTransferInputSchema)\n    .min(1)\n    .describe(\n      'Array of HBAR transfers, each with accountId and amount in HBARs.'\n    ),\n  memo: z.string().optional().describe('Optional. Memo for the transaction.'),\n});\n\nexport class HederaTransferHbarTool extends BaseHederaTransactionTool<\n  typeof TransferHbarZodSchemaCore\n> {\n  name = 'hedera-account-transfer-hbar';\n  description =\n    'Transfers HBAR between accounts. Builder validates amounts and sum.';\n  specificInputSchema = TransferHbarZodSchemaCore;\n  namespace = 'account';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.accounts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof TransferHbarZodSchemaCore>\n  ): Promise<void> {\n    await (builder as AccountBuilder).transferHbar(\n      specificArgs as unknown as HbarTransferParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { RevokeHbarAllowanceParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { AccountBuilder } from '../../../builders/account/account-builder';\n\nconst RevokeHbarAllowanceZodSchemaCore = z.object({\n  ownerAccountId: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. The HBAR owner account ID (e.g., \"0.0.xxxx\"). Defaults to operator.'\n    ),\n  spenderAccountId: z\n    .string()\n    .describe(\n      'The spender account ID whose HBAR allowance is to be revoked (e.g., \"0.0.yyyy\").'\n    ),\n  memo: z.string().optional().describe('Optional. Memo for the transaction.'),\n});\n\nexport class HederaRevokeHbarAllowanceTool extends BaseHederaTransactionTool<\n  typeof RevokeHbarAllowanceZodSchemaCore\n> {\n  name = 'hedera-account-revoke-hbar-allowance';\n  description =\n    'Revokes/clears an HBAR allowance for a specific spender by approving zero HBAR.';\n  specificInputSchema = RevokeHbarAllowanceZodSchemaCore;\n  namespace = 'account';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.accounts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof RevokeHbarAllowanceZodSchemaCore>\n  ): Promise<void> {\n    await (builder as AccountBuilder).revokeHbarAllowance(\n      specificArgs as unknown as RevokeHbarAllowanceParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { RevokeFungibleTokenAllowanceParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { AccountBuilder } from '../../../builders/account/account-builder';\n\nconst RevokeFungibleTokenAllowanceZodSchemaCore = z.object({\n  ownerAccountId: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. The token owner account ID (e.g., \"0.0.xxxx\"). Defaults to operator.'\n    ),\n  spenderAccountId: z\n    .string()\n    .describe(\n      'The spender account ID whose token allowance is to be revoked (e.g., \"0.0.yyyy\").'\n    ),\n  tokenId: z\n    .string()\n    .describe('The ID of the fungible token (e.g., \"0.0.zzzz\").'),\n  memo: z.string().optional().describe('Optional. Memo for the transaction.'),\n});\n\nexport class HederaRevokeFungibleTokenAllowanceTool extends BaseHederaTransactionTool<\n  typeof RevokeFungibleTokenAllowanceZodSchemaCore\n> {\n  name = 'hedera-account-revoke-fungible-token-allowance';\n  description =\n    'Revokes/clears a fungible token allowance for a specific spender by approving zero amount.';\n  specificInputSchema = RevokeFungibleTokenAllowanceZodSchemaCore;\n  namespace = 'account';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.accounts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof RevokeFungibleTokenAllowanceZodSchemaCore>\n  ): Promise<void> {\n    await (builder as AccountBuilder).revokeFungibleTokenAllowance(\n      specificArgs as unknown as RevokeFungibleTokenAllowanceParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { SignScheduledTransactionParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { AccountBuilder } from '../../../builders/account/account-builder';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\n\nconst signAndExecuteScheduledTransactionSchema = z.object({\n  scheduleId: z\n    .string()\n    .describe('The ID of the scheduled transaction (e.g., \"0.0.SCHEDID\").'),\n  memo: z\n    .string()\n    .optional()\n    .describe('Optional memo for the ScheduleSign transaction itself.'),\n});\n\nexport class SignAndExecuteScheduledTransactionTool extends BaseHederaTransactionTool<\n  typeof signAndExecuteScheduledTransactionSchema\n> {\n  name = 'hedera-sign-and-execute-scheduled-transaction';\n  description =\n    'Prepares a ScheduleSignTransaction to add a signature to an existing scheduled transaction. Depending on agent configuration, this will either return transaction bytes (for the user to sign and pay) or be executed directly by the agent (agent signs and pays).';\n  specificInputSchema = signAndExecuteScheduledTransactionSchema;\n  namespace = 'account';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n    this.neverScheduleThisTool = true; // Ensure this tool itself is never scheduled\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.accounts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof signAndExecuteScheduledTransactionSchema>\n  ): Promise<void> {\n    const accountBuilder = builder as AccountBuilder;\n    const params: SignScheduledTransactionParams = {\n      scheduleId: specificArgs.scheduleId,\n    };\n    if (specificArgs.memo && specificArgs.memo.trim() !== '') {\n      params.memo = specificArgs.memo;\n    }\n    await accountBuilder.prepareSignScheduledTransaction(params);\n  }\n}\n","import { z } from 'zod';\nimport { CreateFileParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { FileBuilder } from '../../../builders/file/file-builder';\n\nconst CreateFileZodSchemaCore = z.object({\n  contents: z\n    .string()\n    .describe(\n      'File contents. For binary data, provide as base64 encoded string. Builder handles decoding.'\n    ),\n  keys: z\n    .array(z.string())\n    .optional()\n    .describe(\n      'Optional. Array of serialized key strings (e.g., private key hex, public key hex/DER) that can modify/delete the file. Builder handles parsing.'\n    ),\n  memo: z.string().optional().describe('Optional. Memo for the file.'),\n});\n\nexport class HederaCreateFileTool extends BaseHederaTransactionTool<\n  typeof CreateFileZodSchemaCore\n> {\n  name = 'hedera-file-create';\n  description =\n    'Creates a new file. Builder handles content decoding and key parsing.';\n  specificInputSchema = CreateFileZodSchemaCore;\n  namespace = 'file';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.fs();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof CreateFileZodSchemaCore>\n  ): Promise<void> {\n    await (builder as FileBuilder).createFile(\n      specificArgs as unknown as CreateFileParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { AppendFileParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { FileBuilder } from '../../../builders/file/file-builder';\n\nconst AppendFileZodSchemaCore = z.object({\n  fileId: z\n    .string()\n    .describe('The ID of the file to append to (e.g., \"0.0.xxxx\").'),\n  contents: z\n    .string()\n    .describe(\n      'Content to append. For binary, use base64 string. Builder handles decoding & chunking.'\n    ),\n  maxChunks: z\n    .number()\n    .int()\n    .positive()\n    .optional()\n    .describe(\n      'Optional. Max chunks for large content. Builder handles default.'\n    ),\n  chunkSize: z\n    .number()\n    .int()\n    .positive()\n    .optional()\n    .describe('Optional. Chunk size in bytes. Builder handles default.'),\n});\n\nexport class HederaAppendFileTool extends BaseHederaTransactionTool<\n  typeof AppendFileZodSchemaCore\n> {\n  name = 'hedera-file-append';\n  description =\n    'Appends content to a file. Builder handles content decoding and chunking.';\n  specificInputSchema = AppendFileZodSchemaCore;\n  namespace = 'file';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.fs();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof AppendFileZodSchemaCore>\n  ): Promise<void> {\n    await (builder as FileBuilder).appendFile(specificArgs as AppendFileParams);\n  }\n}\n","import { z } from 'zod';\nimport { UpdateFileParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { FileBuilder } from '../../../builders/file/file-builder';\n\nconst UpdateFileZodSchemaCore = z.object({\n  fileId: z\n    .string()\n    .describe('The ID of the file to update (e.g., \"0.0.xxxx\").'),\n  contents: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. New file contents. For binary, use base64. Builder decodes & replaces content.'\n    ),\n  keys: z\n    .array(z.string())\n    .nullable()\n    .optional()\n    .describe(\n      'Optional. New keys (array of serialized strings). Pass null or empty array to clear. Builder parses.'\n    ),\n  memo: z\n    .string()\n    .nullable()\n    .optional()\n    .describe('Optional. New file memo. Pass null or empty string to clear.'),\n});\n\nexport class HederaUpdateFileTool extends BaseHederaTransactionTool<\n  typeof UpdateFileZodSchemaCore\n> {\n  name = 'hedera-file-update';\n  description =\n    \"Updates a file's attributes (contents, keys, memo). Builder handles parsing and clearing logic.\";\n  specificInputSchema = UpdateFileZodSchemaCore;\n  namespace = 'file';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.fs();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof UpdateFileZodSchemaCore>\n  ): Promise<void> {\n    await (builder as FileBuilder).updateFile(\n      specificArgs as unknown as UpdateFileParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { DeleteFileParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { FileBuilder } from '../../../builders/file/file-builder';\n\nconst DeleteFileZodSchemaCore = z.object({\n  fileId: z\n    .string()\n    .describe('The ID of the file to delete (e.g., \"0.0.xxxx\").'),\n});\n\nexport class HederaDeleteFileTool extends BaseHederaTransactionTool<\n  typeof DeleteFileZodSchemaCore\n> {\n  name = 'hedera-file-delete';\n  description = 'Deletes a file from the Hedera File Service.';\n  specificInputSchema = DeleteFileZodSchemaCore;\n  namespace = 'file';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.fs();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof DeleteFileZodSchemaCore>\n  ): Promise<void> {\n    await (builder as FileBuilder).deleteFile(\n      specificArgs as unknown as DeleteFileParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { CreateContractParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { ScsBuilder } from '../../../builders/scs/scs-builder';\n\nconst CreateContractZodSchemaCore = z.object({\n  bytecodeFileId: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. File ID of contract bytecode. Used if bytecodeHex not set. Builder validates choice.'\n    ),\n  bytecodeHex: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Contract bytecode as hex string. Used if bytecodeFileId not set. Builder validates choice & decodes.'\n    ),\n  adminKey: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Admin key (serialized string). Builder handles parsing.'\n    ),\n  gas: z\n    .union([z.number(), z.string()])\n    .describe(\n      'Gas to deploy (number or string). Builder handles Long conversion.'\n    ),\n  initialBalance: z\n    .union([z.number(), z.string()])\n    .optional()\n    .describe('Optional. Initial balance in HBAR. Builder handles conversion.'),\n  constructorParametersHex: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Constructor parameters as hex string. Builder decodes.'\n    ),\n  memo: z\n    .string()\n    .optional()\n    .describe('Optional. Memo for the contract creation transaction.'),\n  autoRenewPeriod: z\n    .number()\n    .int()\n    .positive()\n    .optional()\n    .describe('Optional. Auto-renewal period in seconds.'),\n  stakedAccountId: z\n    .string()\n    .optional()\n    .describe('Optional. Account ID to stake to (e.g., \"0.0.xxxx\").'),\n  stakedNodeId: z\n    .number()\n    .int()\n    .optional()\n    .describe(\n      'Optional. Node ID to stake to. Builder handles Long conversion.'\n    ),\n  declineStakingReward: z\n    .boolean()\n    .optional()\n    .describe('Optional. If true, contract declines staking rewards.'),\n  maxAutomaticTokenAssociations: z\n    .number()\n    .int()\n    .optional()\n    .describe('Optional. Max automatic token associations for the contract.'),\n});\n// Validation for bytecodeFileId vs bytecodeHex is builder's responsibility.\n\nexport class HederaCreateContractTool extends BaseHederaTransactionTool<\n  typeof CreateContractZodSchemaCore\n> {\n  name = 'hedera-scs-create-contract';\n  description =\n    'Creates/deploys a new Hedera smart contract. Builder handles parsing, conversions, and validation of inputs (e.g., bytecode source).';\n  specificInputSchema = CreateContractZodSchemaCore;\n  namespace = 'scs';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.scs();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof CreateContractZodSchemaCore>\n  ): Promise<void> {\n    await (builder as ScsBuilder).createContract(\n      specificArgs as unknown as CreateContractParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { UpdateContractParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { ScsBuilder } from '../../../builders/scs/scs-builder';\n\nconst UpdateContractZodSchemaCore = z.object({\n  contractId: z\n    .string()\n    .describe('The ID of the contract to update (e.g., \"0.0.xxxx\").'),\n  adminKey: z\n    .string()\n    .nullable()\n    .optional()\n    .describe(\n      'Optional. New admin key (serialized string). Pass null to clear.'\n    ),\n  autoRenewPeriod: z\n    .number()\n    .int()\n    .positive()\n    .optional()\n    .describe('Optional. New auto-renewal period in seconds.'),\n  memo: z\n    .string()\n    .nullable()\n    .optional()\n    .describe(\n      'Optional. New contract memo. Pass null or empty string to clear.'\n    ),\n  stakedAccountId: z\n    .string()\n    .nullable()\n    .optional()\n    .describe(\n      'Optional. New account ID to stake to. Pass \"0.0.0\" or null to clear.'\n    ),\n  stakedNodeId: z\n    .number()\n    .int()\n    .nullable()\n    .optional()\n    .describe(\n      'Optional. New node ID to stake to. Pass -1 or null to clear. Builder handles Long conversion.'\n    ),\n  declineStakingReward: z\n    .boolean()\n    .optional()\n    .describe('Optional. If true, contract declines staking rewards.'),\n  maxAutomaticTokenAssociations: z\n    .number()\n    .int()\n    .optional()\n    .describe('Optional. New max automatic token associations.'),\n  proxyAccountId: z\n    .string()\n    .nullable()\n    .optional()\n    .describe('Optional. New proxy account ID. Pass \"0.0.0\" or null to clear.'),\n});\n\nexport class HederaUpdateContractTool extends BaseHederaTransactionTool<\n  typeof UpdateContractZodSchemaCore\n> {\n  name = 'hedera-scs-update-contract';\n  description =\n    'Updates an existing Hedera smart contract. Builder handles parsing and clearing logic.';\n  specificInputSchema = UpdateContractZodSchemaCore;\n  namespace = 'scs';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.scs();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof UpdateContractZodSchemaCore>\n  ): Promise<void> {\n    await (builder as ScsBuilder).updateContract(\n      specificArgs as unknown as UpdateContractParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { DeleteContractParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { ScsBuilder } from '../../../builders/scs/scs-builder';\n\nconst DeleteContractZodSchemaCore = z.object({\n  contractId: z\n    .string()\n    .describe('The ID of the contract to delete (e.g., \"0.0.xxxx\").'),\n  transferAccountId: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Account ID to transfer balance to. Builder validates if needed.'\n    ),\n  transferContractId: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. Contract ID to transfer balance to. Builder validates if needed.'\n    ),\n});\n\nexport class HederaDeleteContractTool extends BaseHederaTransactionTool<\n  typeof DeleteContractZodSchemaCore\n> {\n  name = 'hedera-scs-delete-contract';\n  description =\n    'Deletes a smart contract. Optionally specify a transfer target for any remaining balance.';\n  specificInputSchema = DeleteContractZodSchemaCore;\n  namespace = 'scs';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.scs();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof DeleteContractZodSchemaCore>\n  ): Promise<void> {\n    await (builder as ScsBuilder).deleteContract(\n      specificArgs as unknown as DeleteContractParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { ExecuteContractParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { ScsBuilder } from '../../../builders/scs/scs-builder';\n\nconst FunctionParameterInputSchema = z.object({\n  type: z\n    .string()\n    .describe(\n      'Parameter type (e.g., string, bytes, bytes32, bool, int8, int32, int64, int256, uint8, uint32, uint64, uint256, address).'\n    ),\n  value: z\n    .any()\n    .describe(\n      'Parameter value. For bytes/bytes32, use hex string. For address, use \"0.0.xxxx\" string.'\n    ),\n});\n\nconst ExecuteContractZodSchemaCore = z.object({\n  contractId: z\n    .string()\n    .describe('The ID of the contract to call (e.g., \"0.0.xxxx\").'),\n  gas: z\n    .union([z.number(), z.string()])\n    .describe('Gas to use for the call. Builder handles Long conversion.'),\n  functionName: z\n    .string()\n    .describe(\n      'The function to call (e.g., \"myFunction\" or \"myFunction(uint32)\").'\n    ),\n  functionParameters: z\n    .array(FunctionParameterInputSchema)\n    .optional()\n    .describe(\n      'Optional. Array of function parameters, each with type and value. Builder parses and constructs.'\n    ),\n  payableAmount: z\n    .union([z.number(), z.string()])\n    .optional()\n    .describe(\n      'Optional. Amount in HBAR to send. Builder handles Hbar unit conversion.'\n    ),\n  memo: z.string().optional().describe('Optional. Memo for the transaction.'),\n});\n\nexport class HederaExecuteContractTool extends BaseHederaTransactionTool<\n  typeof ExecuteContractZodSchemaCore\n> {\n  name = 'hedera-scs-execute-contract';\n  description =\n    'Executes a smart contract function. Builder handles parameter parsing, type conversions, and Hbar unit logic.';\n  specificInputSchema = ExecuteContractZodSchemaCore;\n  namespace = 'scs';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.scs();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof ExecuteContractZodSchemaCore>\n  ): Promise<void> {\n    await (builder as ScsBuilder).executeContract(\n      specificArgs as unknown as ExecuteContractParams\n    );\n  }\n}\n","/**\n * Model capability profiles for response size handling\n */\nexport enum ModelCapability {\n  SMALL = 'SMALL',\n  MEDIUM = 'MEDIUM',\n  LARGE = 'LARGE',\n  UNLIMITED = 'UNLIMITED',\n}\n","import { ModelCapability } from '../types/model-capability';\n\n/**\n * Model capability configuration for different AI models\n */\ninterface ModelConfig {\n  capability: ModelCapability;\n  contextWindow: number;\n  description: string;\n}\n\n/**\n * OpenRouter API model response structure\n */\ninterface OpenRouterModel {\n  id: string;\n  name: string;\n  description: string;\n  context_length: number;\n  pricing: {\n    prompt: string;\n    completion: string;\n  };\n}\n\n/**\n * Static fallback registry for essential models (used when API is unavailable)\n */\nconst FALLBACK_MODEL_REGISTRY: Record<string, ModelConfig> = {\n  'gpt-3.5-turbo': {\n    capability: ModelCapability.SMALL,\n    contextWindow: 16385,\n    description: 'OpenAI GPT-3.5 Turbo',\n  },\n  'gpt-4': {\n    capability: ModelCapability.LARGE,\n    contextWindow: 8192,\n    description: 'OpenAI GPT-4',\n  },\n  'gpt-4-turbo': {\n    capability: ModelCapability.MEDIUM,\n    contextWindow: 128000,\n    description: 'OpenAI GPT-4 Turbo',\n  },\n  'gpt-4o': {\n    capability: ModelCapability.MEDIUM,\n    contextWindow: 128000,\n    description: 'OpenAI GPT-4o',\n  },\n  'gpt-4o-mini': {\n    capability: ModelCapability.SMALL,\n    contextWindow: 128000,\n    description: 'OpenAI GPT-4o Mini',\n  },\n  'o1-preview': {\n    capability: ModelCapability.LARGE,\n    contextWindow: 128000,\n    description: 'OpenAI o1 Preview',\n  },\n  'o1-mini': {\n    capability: ModelCapability.MEDIUM,\n    contextWindow: 128000,\n    description: 'OpenAI o1 Mini',\n  },\n  'o3-mini': {\n    capability: ModelCapability.MEDIUM,\n    contextWindow: 128000,\n    description: 'OpenAI o3 Mini',\n  },\n  'claude-3.5-sonnet': {\n    capability: ModelCapability.LARGE,\n    contextWindow: 200000,\n    description: 'Anthropic Claude 3.5 Sonnet',\n  },\n  'claude-4': {\n    capability: ModelCapability.LARGE,\n    contextWindow: 200000,\n    description: 'Anthropic Claude 4',\n  },\n  'gemini-1.5-pro': {\n    capability: ModelCapability.LARGE,\n    contextWindow: 2000000,\n    description: 'Google Gemini 1.5 Pro',\n  },\n};\n\n/**\n * Model capability detector that provides scalable model capability inference\n * Fetches comprehensive model data from OpenRouter API and caches it\n */\nexport class ModelCapabilityDetector {\n  private static instance: ModelCapabilityDetector;\n  private registry: Record<string, ModelConfig>;\n  private lastFetchTime: number = 0;\n  private readonly CACHE_DURATION = 24 * 60 * 60 * 1000;\n  private readonly OPENROUTER_API_URL = 'https://openrouter.ai/api/v1/models';\n\n  private constructor() {\n    this.registry = { ...FALLBACK_MODEL_REGISTRY };\n  }\n\n  /**\n   * Get singleton instance\n   */\n  public static getInstance(): ModelCapabilityDetector {\n    if (!ModelCapabilityDetector.instance) {\n      ModelCapabilityDetector.instance = new ModelCapabilityDetector();\n    }\n    return ModelCapabilityDetector.instance;\n  }\n\n  /**\n   * Determine model capability based on context window and model characteristics\n   */\n  private determineCapability(model: OpenRouterModel): ModelCapability {\n    const modelId = model.id.toLowerCase();\n    const contextLength = model.context_length;\n\n    if (\n      modelId.includes('mini') ||\n      modelId.includes('tiny') ||\n      modelId.includes('light') ||\n      modelId.includes('instant') ||\n      modelId.includes('3.5-turbo')\n    ) {\n      return ModelCapability.SMALL;\n    }\n\n    if (\n      modelId.includes('local') ||\n      modelId.includes('llama') ||\n      modelId.includes('mistral') ||\n      modelId.includes('yi-') ||\n      modelId.includes('qwen') ||\n      modelId.includes('deepseek') ||\n      modelId.includes('phi-') ||\n      modelId.includes('mythomax') ||\n      modelId.includes('valkyrie')\n    ) {\n      return ModelCapability.UNLIMITED;\n    }\n    if (contextLength <= 16000) {\n      return ModelCapability.SMALL;\n    } else if (contextLength <= 50000) {\n      return ModelCapability.MEDIUM;\n    } else {\n      return ModelCapability.LARGE;\n    }\n  }\n\n  /**\n   * Fetch models from OpenRouter API\n   */\n  private async fetchModelsFromAPI(): Promise<void> {\n    try {\n      const response = await fetch(this.OPENROUTER_API_URL, {\n        headers: {\n          Accept: 'application/json',\n          'User-Agent': 'hedera-agent-kit/1.0',\n        },\n      });\n\n      if (!response.ok) {\n        throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n      }\n\n      const data = await response.json();\n      const models: OpenRouterModel[] = data.data || [];\n\n      this.registry = { ...FALLBACK_MODEL_REGISTRY };\n\n      for (const model of models) {\n        const config: ModelConfig = {\n          capability: this.determineCapability(model),\n          contextWindow: model.context_length,\n          description: model.name,\n        };\n\n        this.registry[model.id] = config;\n\n        const simplifiedId = this.getSimplifiedModelId(model.id);\n        if (simplifiedId !== model.id) {\n          this.registry[simplifiedId] = config;\n        }\n      }\n\n      this.lastFetchTime = Date.now();\n      console.log(\n        `ModelCapabilityDetector: Loaded ${models.length} models from OpenRouter API`\n      );\n    } catch (error) {\n      console.warn(\n        `ModelCapabilityDetector: Failed to fetch from API, using fallback registry:`,\n        error\n      );\n    }\n  }\n\n  /**\n   * Get simplified model ID for common patterns\n   */\n  private getSimplifiedModelId(fullId: string): string {\n    if (fullId.startsWith('openai/')) {\n      return fullId.replace('openai/', '');\n    }\n    if (fullId.startsWith('anthropic/')) {\n      return fullId.replace('anthropic/', '');\n    }\n    if (fullId.startsWith('google/')) {\n      return fullId.replace('google/', '');\n    }\n    if (fullId.startsWith('mistralai/')) {\n      return fullId.replace('mistralai/', '');\n    }\n    if (fullId.startsWith('meta-llama/')) {\n      return fullId.replace('meta-llama/', '');\n    }\n\n    return fullId;\n  }\n\n  /**\n   * Ensure models are loaded and up-to-date\n   */\n  private async ensureModelsLoaded(): Promise<void> {\n    const now = Date.now();\n    const shouldRefresh = now - this.lastFetchTime > this.CACHE_DURATION;\n\n    if (shouldRefresh) {\n      await this.fetchModelsFromAPI();\n    }\n  }\n\n  /**\n   * Register a new model configuration\n   */\n  public registerModel(modelName: string, config: ModelConfig): void {\n    this.registry[modelName] = config;\n  }\n\n  /**\n   * Register multiple models at once\n   */\n  public registerModels(models: Record<string, ModelConfig>): void {\n    Object.assign(this.registry, models);\n  }\n\n  /**\n   * Get model capability for a given model name\n   */\n  public async getModelCapability(\n    modelName?: string\n  ): Promise<ModelCapability> {\n    if (!modelName) {\n      return ModelCapability.MEDIUM;\n    }\n\n    await this.ensureModelsLoaded();\n\n    const exactMatch = this.registry[modelName];\n    if (exactMatch) {\n      return exactMatch.capability;\n    }\n\n    const normalizedName = modelName.toLowerCase();\n\n    for (const [registeredName, config] of Object.entries(this.registry)) {\n      if (\n        normalizedName.includes(registeredName.toLowerCase()) ||\n        registeredName.toLowerCase().includes(normalizedName)\n      ) {\n        return config.capability;\n      }\n    }\n\n    return this.getCapabilityFromHeuristics(normalizedName);\n  }\n\n  /**\n   * Synchronous version that uses cached data only\n   */\n  public getModelCapabilitySync(modelName?: string): ModelCapability {\n    if (!modelName) {\n      return ModelCapability.MEDIUM;\n    }\n\n    const exactMatch = this.registry[modelName];\n    if (exactMatch) {\n      return exactMatch.capability;\n    }\n\n    const normalizedName = modelName.toLowerCase();\n\n    for (const [registeredName, config] of Object.entries(this.registry)) {\n      if (\n        normalizedName.includes(registeredName.toLowerCase()) ||\n        registeredName.toLowerCase().includes(normalizedName)\n      ) {\n        return config.capability;\n      }\n    }\n\n    return this.getCapabilityFromHeuristics(normalizedName);\n  }\n\n  /**\n   * Fallback heuristics for unknown models\n   */\n  private getCapabilityFromHeuristics(normalizedName: string): ModelCapability {\n    if (\n      normalizedName.includes('mini') ||\n      normalizedName.includes('3.5') ||\n      normalizedName.includes('tiny') ||\n      normalizedName.includes('light') ||\n      normalizedName.includes('instant')\n    ) {\n      return ModelCapability.SMALL;\n    }\n\n    if (\n      normalizedName.includes('turbo') ||\n      normalizedName.includes('4o') ||\n      normalizedName.includes('flash') ||\n      normalizedName.includes('small') ||\n      normalizedName.includes('medium') ||\n      normalizedName.includes('haiku') ||\n      normalizedName.includes('bison') ||\n      normalizedName.includes('palm')\n    ) {\n      return ModelCapability.MEDIUM;\n    }\n\n    if (\n      normalizedName.includes('claude') ||\n      normalizedName.includes('gpt-4') ||\n      normalizedName.includes('gemini') ||\n      normalizedName.includes('sonnet') ||\n      normalizedName.includes('opus') ||\n      normalizedName.includes('large') ||\n      normalizedName.includes('ultra') ||\n      normalizedName.includes('mixtral') ||\n      normalizedName.includes('command-r') ||\n      normalizedName.includes('o1') ||\n      normalizedName.includes('o3')\n    ) {\n      return ModelCapability.LARGE;\n    }\n\n    if (\n      normalizedName.includes('local') ||\n      normalizedName.includes('ollama') ||\n      normalizedName.includes('llama') ||\n      normalizedName.includes('mistral') ||\n      normalizedName.includes('yi-') ||\n      normalizedName.includes('qwen') ||\n      normalizedName.includes('deepseek') ||\n      normalizedName.includes('phi-')\n    ) {\n      return ModelCapability.UNLIMITED;\n    }\n\n    return ModelCapability.MEDIUM;\n  }\n\n  /**\n   * Get model configuration for a given model name\n   */\n  public async getModelConfig(\n    modelName: string\n  ): Promise<ModelConfig | undefined> {\n    await this.ensureModelsLoaded();\n    return this.registry[modelName];\n  }\n\n  /**\n   * Get context window size for a given model name\n   */\n  public async getContextWindow(modelName?: string): Promise<number> {\n    if (!modelName) {\n      return 16385;\n    }\n\n    await this.ensureModelsLoaded();\n\n    const exactMatch = this.registry[modelName];\n    if (exactMatch) {\n      return exactMatch.contextWindow;\n    }\n\n    const normalizedName = modelName.toLowerCase();\n\n    for (const [registeredName, config] of Object.entries(this.registry)) {\n      if (\n        normalizedName.includes(registeredName.toLowerCase()) ||\n        registeredName.toLowerCase().includes(normalizedName)\n      ) {\n        return config.contextWindow;\n      }\n    }\n\n    return 16385;\n  }\n\n  /**\n   * Synchronous version that uses cached data only for context window\n   */\n  public getContextWindowSync(modelName?: string): number {\n    if (!modelName) {\n      return 16385;\n    }\n\n    const exactMatch = this.registry[modelName];\n    if (exactMatch) {\n      return exactMatch.contextWindow;\n    }\n\n    const normalizedName = modelName.toLowerCase();\n\n    for (const [registeredName, config] of Object.entries(this.registry)) {\n      if (\n        normalizedName.includes(registeredName.toLowerCase()) ||\n        registeredName.toLowerCase().includes(normalizedName)\n      ) {\n        return config.contextWindow;\n      }\n    }\n\n    return 16385;\n  }\n\n  /**\n   * Get all registered models\n   */\n  public async getAllModels(): Promise<Record<string, ModelConfig>> {\n    await this.ensureModelsLoaded();\n    return { ...this.registry };\n  }\n\n  /**\n   * Check if a model is registered\n   */\n  public async isModelRegistered(modelName: string): Promise<boolean> {\n    await this.ensureModelsLoaded();\n    return modelName in this.registry;\n  }\n\n  /**\n   * Get models by capability\n   */\n  public async getModelsByCapability(\n    capability: ModelCapability\n  ): Promise<string[]> {\n    await this.ensureModelsLoaded();\n    return Object.entries(this.registry)\n      .filter(([, config]) => config.capability === capability)\n      .map(([name]) => name);\n  }\n\n  /**\n   * Force refresh models from API\n   */\n  public async refreshModels(): Promise<void> {\n    this.lastFetchTime = 0;\n    await this.fetchModelsFromAPI();\n  }\n\n  /**\n   * Get cache status\n   */\n  public getCacheStatus(): {\n    lastFetch: Date;\n    isStale: boolean;\n    modelCount: number;\n  } {\n    const now = Date.now();\n    const isStale = now - this.lastFetchTime > this.CACHE_DURATION;\n\n    return {\n      lastFetch: new Date(this.lastFetchTime),\n      isStale,\n      modelCount: Object.keys(this.registry).length,\n    };\n  }\n}\n","import { StructuredTool, ToolParams } from '@langchain/core/tools';\nimport { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';\nimport { z } from 'zod';\nimport { HederaAgentKit } from '../../../agent/agent';\nimport { Logger as StandardsSdkLogger } from '@hashgraphonline/standards-sdk';\nimport { ModelCapabilityDetector } from '../../../utils/model-capability-detector';\nimport { ModelCapability } from '../../../types/model-capability';\n\n/**\n * Field processing configuration\n */\nexport interface FieldProcessor {\n  maxLength?: number;\n  truncateMessage?: string;\n  summarize?: boolean;\n  exclude?: boolean;\n}\n\n/**\n * Response processing strategy\n */\nexport interface ResponseStrategy {\n  maxTokens: number;\n  summarizeArrays?: boolean;\n  maxArrayLength?: number;\n  includeMetadata?: boolean;\n}\n\n/**\n * Model-specific response strategies\n */\nconst MODEL_STRATEGIES: Record<ModelCapability, ResponseStrategy> = {\n  [ModelCapability.SMALL]: {\n    maxTokens: 4000,\n    summarizeArrays: true,\n    maxArrayLength: 3,\n    includeMetadata: true,\n  },\n  [ModelCapability.MEDIUM]: {\n    maxTokens: 12000,\n    summarizeArrays: false,\n    maxArrayLength: 10,\n    includeMetadata: true,\n  },\n  [ModelCapability.LARGE]: {\n    maxTokens: 32000,\n    summarizeArrays: false,\n    maxArrayLength: 50,\n    includeMetadata: false,\n  },\n  [ModelCapability.UNLIMITED]: {\n    maxTokens: Infinity,\n    summarizeArrays: false,\n    includeMetadata: false,\n  },\n};\n\n/**\n * Parameters required to initialize a BaseHederaQueryTool.\n */\nexport interface BaseHederaQueryToolParams extends ToolParams {\n  hederaKit: HederaAgentKit;\n  logger?: StandardsSdkLogger;\n  modelCapability?: ModelCapability;\n  customStrategy?: Partial<ResponseStrategy>;\n}\n\n/**\n * Base class for all Hedera query tools.\n * Handles common query processing logic across different tool types.\n * Unlike transaction tools, query tools are read-only and don't require signing.\n *\n * @template S - The Zod schema that defines the input parameters for the specific tool\n */\nexport abstract class BaseHederaQueryTool<\n  //@ts-ignore\n  S extends z.ZodObject<unknown, unknown, unknown, unknown>\n  //@ts-ignore\n> extends StructuredTool<S> {\n  protected hederaKit: HederaAgentKit;\n  protected logger: StandardsSdkLogger;\n  protected responseStrategy: ResponseStrategy;\n  protected modelCapability: ModelCapability;\n  private notes: string[] = [];\n\n  abstract specificInputSchema: S;\n  abstract namespace: string;\n\n  get schema(): S {\n    return this.specificInputSchema;\n  }\n\n  constructor({\n    hederaKit,\n    logger,\n    modelCapability = ModelCapability.MEDIUM,\n    customStrategy,\n    ...rest\n  }: BaseHederaQueryToolParams) {\n    super(rest);\n    this.hederaKit = hederaKit;\n    this.logger = logger || hederaKit.logger;\n    this.modelCapability = modelCapability;\n\n    const baseStrategy = MODEL_STRATEGIES[modelCapability];\n    this.responseStrategy = { ...baseStrategy, ...customStrategy };\n\n    this.logger.debug(\n      `Initialized query tool with ${modelCapability} capability strategy`\n    );\n  }\n\n  /**\n   * Execute the specific query operation.\n   * This method should be implemented by concrete query tools.\n   */\n  protected abstract executeQuery(\n    args: z.infer<S>,\n    runManager?: CallbackManagerForToolRun\n  ): Promise<unknown>;\n\n  /**\n   * Tools can define which fields should be processed for size optimization.\n   * Return a map of field paths to processing configurations.\n   * Field paths support dot notation (e.g., 'contract.bytecode') and wildcards (e.g., '*.bytecode')\n   */\n  protected getLargeFieldProcessors?(\n    args: z.infer<S>\n  ): Record<string, FieldProcessor>;\n\n  /**\n   * Allow tools to define custom response processing logic\n   */\n  protected processCustomResponse?(result: unknown, args: z.infer<S>): unknown;\n\n  /**\n   * Estimate token count (rough approximation: 1 token ≈ 4 characters)\n   */\n  private estimateTokens(text: string): number {\n    return Math.ceil(text.length / 4);\n  }\n\n  /**\n   * Check if a field path matches a pattern (supports wildcards)\n   */\n  private matchesPattern(fieldPath: string, pattern: string): boolean {\n    if (pattern === fieldPath) return true;\n    if (pattern.includes('*')) {\n      const regex = new RegExp('^' + pattern.replace(/\\*/g, '[^.]*') + '$');\n      return regex.test(fieldPath);\n    }\n    return false;\n  }\n\n  /**\n   * Process any data structure based on field processors and strategy\n   */\n  private processData(\n    data: unknown,\n    args: z.infer<S>,\n    path: string = ''\n  ): unknown {\n    if (this.responseStrategy.maxTokens === Infinity) {\n      return data;\n    }\n\n    const processors = this.getLargeFieldProcessors\n      ? this.getLargeFieldProcessors(args)\n      : {};\n\n    if (data === null || data === undefined) {\n      return data;\n    }\n\n    if (Array.isArray(data)) {\n      return this.processArray(data, args, path);\n    }\n\n    if (typeof data === 'object' && data !== null && !Array.isArray(data)) {\n      return this.processObject(\n        data as Record<string, unknown>,\n        args,\n        path,\n        processors\n      );\n    }\n\n    if (typeof data === 'string') {\n      return this.processString(data, path, processors);\n    }\n\n    return data;\n  }\n\n  /**\n   * Process array data\n   */\n  private processArray(\n    arr: unknown[],\n    args: z.infer<S>,\n    path: string\n  ): unknown[] {\n    const processedArray = arr.map((item, index) =>\n      this.processData(item, args, `${path}[${index}]`)\n    );\n\n    if (\n      this.responseStrategy.summarizeArrays &&\n      this.responseStrategy.maxArrayLength &&\n      arr.length > this.responseStrategy.maxArrayLength\n    ) {\n      const maxLength = this.responseStrategy.maxArrayLength;\n      const takeFirst = Math.floor(maxLength / 2);\n      const takeLast = maxLength - takeFirst - 1;\n\n      return [\n        ...processedArray.slice(0, takeFirst),\n        {\n          _summary: `[${arr.length - maxLength} items truncated]`,\n          _originalLength: arr.length,\n          _truncatedAt: path,\n        },\n        ...processedArray.slice(-takeLast),\n      ];\n    }\n\n    return processedArray;\n  }\n\n  /**\n   * Process object data\n   */\n  private processObject(\n    obj: Record<string, unknown>,\n    args: z.infer<S>,\n    path: string,\n    processors: Record<string, FieldProcessor>\n  ): Record<string, unknown> {\n    const result: Record<string, unknown> = {};\n\n    for (const [key, value] of Object.entries(obj)) {\n      const fieldPath = path ? `${path}.${key}` : key;\n\n      const matchingEntry = Object.entries(processors).find(([pattern]) =>\n        this.matchesPattern(fieldPath, pattern)\n      );\n      const matchingProcessor = matchingEntry ? matchingEntry[1] : undefined;\n\n      if (matchingProcessor && matchingProcessor.exclude) {\n        continue;\n      }\n\n      result[key] = this.processData(value, args, fieldPath);\n    }\n\n    return result;\n  }\n\n  /**\n   * Process string data\n   */\n  private processString(\n    str: string,\n    path: string,\n    processors: Record<string, FieldProcessor>\n  ): string {\n    const matchingEntry = Object.entries(processors).find(([pattern]) =>\n      this.matchesPattern(path, pattern)\n    );\n    const matchingProcessor = matchingEntry ? matchingEntry[1] : undefined;\n\n    if (\n      matchingProcessor &&\n      matchingProcessor.maxLength &&\n      str.length > matchingProcessor.maxLength\n    ) {\n      const truncated = str.substring(0, matchingProcessor.maxLength);\n      const message = matchingProcessor.truncateMessage\n        ? matchingProcessor.truncateMessage\n        : `[TRUNCATED: ${str.length} chars total]`;\n      return `${truncated}...${message}`;\n    }\n\n    return str;\n  }\n\n  /**\n   * Format the query result for return to the LLM.\n   * Override this method to customize result formatting.\n   */\n  protected formatResult(result: unknown, args?: z.infer<S>): string {\n    if (typeof result === 'string') {\n      return result;\n    }\n\n    let processedResult = result;\n\n    if (this.processCustomResponse && args) {\n      processedResult = this.processCustomResponse(processedResult, args);\n    }\n\n    processedResult = this.processData(\n      processedResult,\n      args || ({} as z.infer<S>)\n    );\n\n    const jsonString = JSON.stringify(processedResult, null, 2);\n    const estimatedTokens = this.estimateTokens(jsonString);\n\n    if (\n      this.responseStrategy.includeMetadata &&\n      estimatedTokens > this.responseStrategy.maxTokens * 0.8\n    ) {\n      const responseWithMeta = {\n        ...(typeof processedResult === 'object' && processedResult !== null\n          ? processedResult\n          : { data: processedResult }),\n        _meta: {\n          estimatedTokens,\n          maxTokens: this.responseStrategy.maxTokens,\n          capability: Object.keys(MODEL_STRATEGIES).find(\n            (key) =>\n              MODEL_STRATEGIES[key as ModelCapability] === this.responseStrategy\n          ),\n          note: 'Response may be truncated. Use higher model capability for full data.',\n        },\n      };\n      return JSON.stringify(responseWithMeta, null, 2);\n    }\n\n    return jsonString;\n  }\n\n  /**\n   * Handle errors that occur during query execution.\n   */\n  protected handleError(error: unknown): string {\n    const errorMessage =\n      error instanceof Error ? error.message : JSON.stringify(error);\n    this.logger.error(`Error in query tool: ${errorMessage}`, error);\n    return JSON.stringify({\n      success: false,\n      error: errorMessage,\n    });\n  }\n\n  /**\n   * Main method called when the tool is executed.\n   * Processes arguments, executes the query, and formats the result.\n   */\n  protected async _call(\n    args: z.infer<S>,\n    runManager?: CallbackManagerForToolRun\n  ): Promise<string> {\n    this.clearNotes();\n\n    try {\n      this.logger.info(\n        `Executing ${this.name} with model capability: ${this.modelCapability}`\n      );\n\n      const rawData = await this.executeQuery(args, runManager);\n      const processed = await this.processLargeFields(rawData, args);\n\n      const allNotes = this.getNotes();\n\n      if (\n        typeof processed.data === 'object' &&\n        processed.data !== null &&\n        'success' in processed.data\n      ) {\n        const toolResponse = processed.data as any;\n        const response = {\n          ...toolResponse,\n          ...(allNotes.length > 0 && {\n            notes: [...(toolResponse.notes || []), ...allNotes],\n          }),\n        };\n        return JSON.stringify(response);\n      }\n\n      const response = {\n        success: true,\n        data: processed.data,\n        ...(allNotes.length > 0 && { notes: allNotes }),\n      };\n\n      return JSON.stringify(response);\n    } catch (error) {\n      const errorMessage =\n        error instanceof Error ? error.message : String(error);\n      this.logger.error(`Error in ${this.name}: ${errorMessage}`, error);\n\n      const allNotes = this.getNotes();\n      return JSON.stringify({\n        success: false,\n        error: errorMessage,\n        ...(allNotes.length > 0 && { notes: allNotes }),\n      });\n    }\n  }\n\n  private async getModelCapabilityLimits(): Promise<{\n    maxTokens: number;\n    arrayLimit: number;\n  }> {\n    if (this.modelCapability === ModelCapability.UNLIMITED) {\n      return { maxTokens: Infinity, arrayLimit: Infinity };\n    }\n\n    try {\n      const detector = ModelCapabilityDetector.getInstance();\n\n      if (this.hederaKit.modelName) {\n        const contextWindow = await detector.getContextWindow(\n          this.hederaKit.modelName\n        );\n        if (contextWindow > 0) {\n          const toolDefinitionsReserve = Math.floor(contextWindow * 0.6);\n          const responseReserve = Math.floor(contextWindow * 0.2);\n          const availableTokens =\n            contextWindow - toolDefinitionsReserve - responseReserve;\n          const arrayLimit = this.calculateArrayLimit(availableTokens);\n\n          return {\n            maxTokens: Math.max(availableTokens, 1000),\n            arrayLimit,\n          };\n        }\n      }\n\n      const allModels = await detector.getAllModels();\n      let maxContextWindow = 0;\n      for (const [, config] of Object.entries(allModels)) {\n        if (\n          config.capability === this.modelCapability &&\n          config.contextWindow > maxContextWindow\n        ) {\n          maxContextWindow = config.contextWindow;\n        }\n      }\n\n      if (maxContextWindow > 0) {\n        const toolDefinitionsReserve = Math.floor(maxContextWindow * 0.6);\n        const responseReserve = Math.floor(maxContextWindow * 0.2);\n        const availableTokens =\n          maxContextWindow - toolDefinitionsReserve - responseReserve;\n        const arrayLimit = this.calculateArrayLimit(availableTokens);\n\n        return {\n          maxTokens: Math.max(availableTokens, 1000),\n          arrayLimit,\n        };\n      }\n    } catch (error) {\n      this.logger.warn(\n        'Failed to get model context window, using fallback limits',\n        error\n      );\n    }\n\n    switch (this.modelCapability) {\n      case ModelCapability.SMALL:\n        return { maxTokens: 1000, arrayLimit: 3 };\n      case ModelCapability.MEDIUM:\n        return { maxTokens: 4000, arrayLimit: 10 };\n      case ModelCapability.LARGE:\n        return { maxTokens: 12000, arrayLimit: 30 };\n      default:\n        return { maxTokens: 4000, arrayLimit: 10 };\n    }\n  }\n\n  private calculateArrayLimit(availableTokens: number): number {\n    if (availableTokens < 8000) {\n      return 5;\n    }\n    if (availableTokens < 50000) {\n      return 20;\n    }\n    if (availableTokens < 100000) {\n      return 50;\n    }\n    return 100;\n  }\n\n  private addNote(note: string): void {\n    this.notes.push(note);\n  }\n\n  private clearNotes(): void {\n    this.notes = [];\n  }\n\n  private getNotes(): string[] {\n    return [...this.notes];\n  }\n\n  private async processLargeFields(\n    data: unknown,\n    args?: z.infer<S>\n  ): Promise<{ data: unknown; notes: string[] }> {\n    const result: { data: unknown; notes: string[] } = {\n      data: JSON.parse(JSON.stringify(data)),\n      notes: [],\n    };\n\n    if (this.modelCapability === ModelCapability.UNLIMITED) {\n      return result;\n    }\n\n    const processors =\n      this.getLargeFieldProcessors && args\n        ? this.getLargeFieldProcessors(args)\n        : {};\n    const limits = await this.getModelCapabilityLimits();\n\n    for (const [path, processorConfig] of Object.entries(processors)) {\n      const value = this.getNestedValue(result.data, path);\n      if (\n        typeof value === 'string' &&\n        processorConfig.maxLength &&\n        value.length > processorConfig.maxLength\n      ) {\n        const truncated = value.substring(0, processorConfig.maxLength);\n        this.setNestedValue(result.data, path, truncated);\n\n        const userFriendlyMessage = processorConfig.truncateMessage\n          ? processorConfig.truncateMessage\n          : `Large data field was shortened to fit your model's capacity`;\n        this.addNote(\n          `${userFriendlyMessage}. Original size: ${value.length} characters, shown: ${processorConfig.maxLength} characters.`\n        );\n      }\n    }\n\n    result.data = this.processDataStructure(result.data, limits, result.notes);\n    return result;\n  }\n\n  private processDataStructure(\n    data: unknown,\n    limits: { maxTokens: number; arrayLimit: number },\n    notes: string[]\n  ): unknown {\n    if (Array.isArray(data)) {\n      if (data.length > limits.arrayLimit) {\n        const truncated = data.slice(0, limits.arrayLimit);\n        this.addNote(\n          `List was shortened to fit your model's capacity. Showing ${limits.arrayLimit} of ${data.length} items.`\n        );\n        return truncated.map((item) =>\n          this.processDataStructure(item, limits, notes)\n        );\n      }\n      return data.map((item) => this.processDataStructure(item, limits, notes));\n    }\n\n    if (data && typeof data === 'object' && !Array.isArray(data)) {\n      const processed: Record<string, unknown> = {};\n      for (const [key, value] of Object.entries(\n        data as Record<string, unknown>\n      )) {\n        processed[key] = this.processDataStructure(value, limits, notes);\n      }\n      return processed;\n    }\n\n    return data;\n  }\n\n  private getNestedValue(obj: unknown, path: string): unknown {\n    return path.split('.').reduce((current, key) => {\n      if (!current || typeof current !== 'object') {\n        return undefined;\n      }\n\n      const currentObj = current as Record<string, unknown>;\n\n      if (key.includes('[') && key.includes(']')) {\n        const [arrayKey, indexStr] = key.split('[');\n        const index = parseInt(indexStr.replace(']', ''));\n        const arrayValue = currentObj[arrayKey];\n        return Array.isArray(arrayValue) ? arrayValue[index] : undefined;\n      }\n\n      return currentObj[key];\n    }, obj);\n  }\n\n  private setNestedValue(obj: unknown, path: string, value: unknown): void {\n    if (!obj || typeof obj !== 'object') {\n      return;\n    }\n\n    const keys = path.split('.');\n    const lastKey = keys.pop()!;\n    const target = keys.reduce((current, key) => {\n      if (!current || typeof current !== 'object') {\n        return current;\n      }\n\n      const currentObj = current as Record<string, unknown>;\n\n      if (key.includes('[') && key.includes(']')) {\n        const [arrayKey, indexStr] = key.split('[');\n        const index = parseInt(indexStr.replace(']', ''));\n        const arrayValue = currentObj[arrayKey];\n        return Array.isArray(arrayValue) ? arrayValue[index] : undefined;\n      }\n\n      return currentObj[key];\n    }, obj);\n\n    if (!target || typeof target !== 'object') {\n      return;\n    }\n\n    const targetObj = target as Record<string, unknown>;\n\n    if (lastKey.includes('[') && lastKey.includes(']')) {\n      const [arrayKey, indexStr] = lastKey.split('[');\n      const index = parseInt(indexStr.replace(']', ''));\n      const arrayValue = targetObj[arrayKey];\n      if (Array.isArray(arrayValue)) {\n        arrayValue[index] = value;\n      }\n    } else {\n      targetObj[lastKey] = value;\n    }\n  }\n}\n","import { z } from 'zod';\nimport {\n  BaseHederaQueryTool,\n  BaseHederaQueryToolParams,\n} from '../common/base-hedera-query-tool';\n\nconst GetTopicInfoZodSchema = z.object({\n  topicId: z\n    .string()\n    .describe('The topic ID to get information for (e.g., \"0.0.12345\")'),\n});\n\n/**\n * Tool for retrieving Hedera Consensus Service topic information.\n * This is a read-only operation that queries the mirror node.\n */\nexport class HederaGetTopicInfoTool extends BaseHederaQueryTool<\n  typeof GetTopicInfoZodSchema\n> {\n  name = 'hedera-get-topic-info';\n  description =\n    'Retrieves information about a Hedera Consensus Service topic including admin key, submit key, memo, and other metadata.';\n  specificInputSchema = GetTopicInfoZodSchema;\n  namespace = 'hcs';\n\n  constructor(params: BaseHederaQueryToolParams) {\n    super(params);\n  }\n\n  protected async executeQuery(\n    args: z.infer<typeof GetTopicInfoZodSchema>\n  ): Promise<unknown> {\n    this.logger.info(`Getting topic info for topic ID: ${args.topicId}`);\n    \n    const topicInfo = await this.hederaKit.query().getTopicInfo(args.topicId);\n    \n    if (!topicInfo) {\n      return {\n        success: false,\n        error: `Topic ${args.topicId} not found`,\n      };\n    }\n\n    return {\n      success: true,\n      topicInfo,\n    };\n  }\n} \n ","import { z } from 'zod';\nimport {\n  BaseHederaQueryTool,\n  BaseHederaQueryToolParams,\n} from '../common/base-hedera-query-tool';\n\nconst GetTopicFeesZodSchema = z.object({\n  topicId: z\n    .string()\n    .describe('The topic ID to get custom fees for (e.g., \"0.0.12345\")'),\n});\n\n/**\n * Tool for retrieving custom fees for a Hedera Consensus Service topic.\n * This is a read-only operation that queries the mirror node.\n */\nexport class HederaGetTopicFeesTool extends BaseHederaQueryTool<\n  typeof GetTopicFeesZodSchema\n> {\n  name = 'hedera-get-topic-fees';\n  description =\n    'Retrieves custom fees associated with a Hedera Consensus Service topic.';\n  specificInputSchema = GetTopicFeesZodSchema;\n  namespace = 'hcs';\n\n  constructor(params: BaseHederaQueryToolParams) {\n    super(params);\n  }\n\n  protected async executeQuery(\n    args: z.infer<typeof GetTopicFeesZodSchema>\n  ): Promise<unknown> {\n    this.logger.info(`Getting custom fees for topic ID: ${args.topicId}`);\n    \n    const fees = await this.hederaKit.query().getTopicFees(args.topicId);\n    \n    if (!fees) {\n      return {\n        success: true,\n        topicId: args.topicId,\n        customFees: null,\n        message: 'No custom fees found for this topic',\n      };\n    }\n\n    return {\n      success: true,\n      topicId: args.topicId,\n      customFees: fees,\n    };\n  }\n} \n ","import { z } from 'zod';\nimport {\n  BaseHederaQueryTool,\n  BaseHederaQueryToolParams,\n} from '../common/base-hedera-query-tool';\n\nconst GetAccountBalanceZodSchema = z.object({\n  accountId: z\n    .string()\n    .describe('The account ID to get balance for (e.g., \"0.0.12345\")'),\n});\n\n/**\n * Tool for retrieving Hedera account HBAR balance.\n * This is a read-only operation that queries the mirror node.\n */\nexport class HederaGetAccountBalanceTool extends BaseHederaQueryTool<\n  typeof GetAccountBalanceZodSchema\n> {\n  name = 'hedera-get-account-balance';\n  description =\n    'Retrieves the HBAR balance for a Hedera account. Returns the balance in HBAR (not tinybars).';\n  specificInputSchema = GetAccountBalanceZodSchema;\n  namespace = 'account';\n\n  constructor(params: BaseHederaQueryToolParams) {\n    super(params);\n  }\n\n  protected async executeQuery(\n    args: z.infer<typeof GetAccountBalanceZodSchema>\n  ): Promise<unknown> {\n    this.logger.info(`Getting balance for account ID: ${args.accountId}`);\n\n    const balance = await this.hederaKit\n      .query()\n      .getAccountBalance(args.accountId);\n\n    if (balance === null) {\n      return {\n        success: false,\n        error: `Could not retrieve balance for account ${args.accountId}`,\n      };\n    }\n\n    return {\n      success: true,\n      accountId: args.accountId,\n      balance: balance,\n      unit: 'HBAR',\n    };\n  }\n}\n","import { z } from 'zod';\nimport {\n  BaseHederaQueryTool,\n  BaseHederaQueryToolParams,\n} from '../common/base-hedera-query-tool';\n\nconst GetAccountPublicKeyZodSchema = z.object({\n  accountId: z\n    .string()\n    .describe('The account ID to get the public key for (e.g., \"0.0.12345\")'),\n});\n\n/**\n * Tool for retrieving a Hedera account's public key.\n * This is a read-only operation that queries the mirror node.\n */\nexport class HederaGetAccountPublicKeyTool extends BaseHederaQueryTool<\n  typeof GetAccountPublicKeyZodSchema\n> {\n  name = 'hedera-get-account-public-key';\n  description =\n    'Retrieves the public key for a Hedera account. Returns the public key in string format.';\n  specificInputSchema = GetAccountPublicKeyZodSchema;\n  namespace = 'account';\n\n  constructor(params: BaseHederaQueryToolParams) {\n    super(params);\n  }\n\n  protected async executeQuery(\n    args: z.infer<typeof GetAccountPublicKeyZodSchema>\n  ): Promise<unknown> {\n    this.logger.info(`Getting public key for account ID: ${args.accountId}`);\n    \n    const publicKey = await this.hederaKit.query().getPublicKey(args.accountId);\n    \n    if (!publicKey) {\n      return {\n        success: false,\n        error: `Could not retrieve public key for account ${args.accountId}`,\n      };\n    }\n\n    return {\n      success: true,\n      accountId: args.accountId,\n      publicKey: publicKey.toString(),\n      publicKeyDer: publicKey.toStringDer(),\n      publicKeyRaw: publicKey.toStringRaw(),\n    };\n  }\n} \n ","import { z } from 'zod';\nimport {\n  BaseHederaQueryTool,\n  BaseHederaQueryToolParams,\n} from '../common/base-hedera-query-tool';\n\nconst GetAccountInfoZodSchema = z.object({\n  accountId: z\n    .string()\n    .describe('The account ID to get information for (e.g., \"0.0.12345\")'),\n});\n\n/**\n * Tool for retrieving full Hedera account information.\n * This is a read-only operation that queries the mirror node.\n */\nexport class HederaGetAccountInfoTool extends BaseHederaQueryTool<\n  typeof GetAccountInfoZodSchema\n> {\n  name = 'hedera-get-account-info';\n  description =\n    'Retrieves comprehensive information about a Hedera account including balance, key, memo, and other metadata.';\n  specificInputSchema = GetAccountInfoZodSchema;\n  namespace = 'account';\n\n  constructor(params: BaseHederaQueryToolParams) {\n    super(params);\n  }\n\n  protected async executeQuery(\n    args: z.infer<typeof GetAccountInfoZodSchema>\n  ): Promise<unknown> {\n    this.logger.info(`Getting account info for account ID: ${args.accountId}`);\n\n    const accountInfo = await this.hederaKit\n      .query()\n      .getAccountInfo(args.accountId);\n\n    if (!accountInfo) {\n      return {\n        success: false,\n        error: `Account ${args.accountId} not found`,\n      };\n    }\n\n    return {\n      success: true,\n      accountInfo,\n    };\n  }\n}\n","import { z } from 'zod';\nimport {\n  BaseHederaQueryTool,\n  BaseHederaQueryToolParams,\n} from '../common/base-hedera-query-tool';\n\nconst GetAccountTokensZodSchema = z.object({\n  accountId: z\n    .string()\n    .describe('The account ID to get token balances for (e.g., \"0.0.12345\")'),\n  limit: z\n    .number()\n    .int()\n    .positive()\n    .optional()\n    .default(100)\n    .describe('Maximum number of tokens to return (default: 100)'),\n});\n\n/**\n * Tool for retrieving token balances for a Hedera account.\n * This is a read-only operation that queries the mirror node.\n */\nexport class HederaGetAccountTokensTool extends BaseHederaQueryTool<\n  typeof GetAccountTokensZodSchema\n> {\n  name = 'hedera-get-account-tokens';\n  description =\n    'Retrieves all token balances for a Hedera account. Returns fungible and non-fungible token associations.';\n  specificInputSchema = GetAccountTokensZodSchema;\n  namespace = 'account';\n\n  constructor(params: BaseHederaQueryToolParams) {\n    super(params);\n  }\n\n  protected async executeQuery(\n    args: z.infer<typeof GetAccountTokensZodSchema>\n  ): Promise<unknown> {\n    this.logger.info(`Getting tokens for account ID: ${args.accountId}`);\n    \n    const tokens = await this.hederaKit.query().getAccountTokens(args.accountId, args.limit);\n    \n    if (!tokens) {\n      return {\n        success: false,\n        error: `Could not retrieve tokens for account ${args.accountId}`,\n      };\n    }\n\n    return {\n      success: true,\n      accountId: args.accountId,\n      tokenCount: tokens.length,\n      tokens,\n    };\n  }\n} \n ","import { z } from 'zod';\nimport {\n  BaseHederaQueryTool,\n  BaseHederaQueryToolParams,\n} from '../common/base-hedera-query-tool';\n\nconst GetAccountNftsZodSchema = z.object({\n  accountId: z\n    .string()\n    .describe('The account ID to get NFTs for (e.g., \"0.0.12345\")'),\n  tokenId: z\n    .string()\n    .optional()\n    .describe('Optional token ID to filter NFTs by (e.g., \"0.0.67890\")'),\n  limit: z\n    .number()\n    .int()\n    .positive()\n    .optional()\n    .default(100)\n    .describe('Maximum number of NFTs to return (default: 100)'),\n});\n\n/**\n * Tool for retrieving NFTs owned by a Hedera account.\n * This is a read-only operation that queries the mirror node.\n */\nexport class HederaGetAccountNftsTool extends BaseHederaQueryTool<\n  typeof GetAccountNftsZodSchema\n> {\n  name = 'hedera-get-account-nfts';\n  description =\n    'Retrieves all NFTs owned by a Hedera account. Optionally filter by token ID.';\n  specificInputSchema = GetAccountNftsZodSchema;\n  namespace = 'account';\n\n  constructor(params: BaseHederaQueryToolParams) {\n    super(params);\n  }\n\n  protected async executeQuery(\n    args: z.infer<typeof GetAccountNftsZodSchema>\n  ): Promise<unknown> {\n    this.logger.info(`Getting NFTs for account ID: ${args.accountId}`);\n    \n    const nfts = await this.hederaKit.query().getAccountNfts(\n      args.accountId,\n      args.tokenId,\n      args.limit\n    );\n    \n    if (!nfts) {\n      return {\n        success: false,\n        error: `Could not retrieve NFTs for account ${args.accountId}`,\n      };\n    }\n\n    return {\n      success: true,\n      accountId: args.accountId,\n      tokenId: args.tokenId,\n      nftCount: nfts.length,\n      nfts,\n    };\n  }\n} \n ","import { z } from 'zod';\nimport {\n  BaseHederaQueryTool,\n  BaseHederaQueryToolParams,\n} from '../common/base-hedera-query-tool';\n\nconst GetTokenInfoZodSchema = z.object({\n  tokenId: z\n    .string()\n    .describe('The token ID to get information for (e.g., \"0.0.12345\")'),\n});\n\n/**\n * Tool for retrieving Hedera Token Service token information.\n * This is a read-only operation that queries the mirror node.\n */\nexport class HederaGetTokenInfoTool extends BaseHederaQueryTool<\n  typeof GetTokenInfoZodSchema\n> {\n  name = 'hedera-get-token-info';\n  description =\n    'Retrieves comprehensive information about a Hedera token including name, symbol, supply, keys, and other metadata.';\n  specificInputSchema = GetTokenInfoZodSchema;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaQueryToolParams) {\n    super(params);\n  }\n\n  protected async executeQuery(\n    args: z.infer<typeof GetTokenInfoZodSchema>\n  ): Promise<unknown> {\n    this.logger.info(`Getting token info for token ID: ${args.tokenId}`);\n\n    const tokenInfo = await this.hederaKit.query().getTokenInfo(args.tokenId);\n\n    if (!tokenInfo) {\n      return {\n        success: false,\n        error: `Token ${args.tokenId} not found`,\n      };\n    }\n\n    return {\n      success: true,\n      tokenInfo,\n    };\n  }\n}\n\n ","import { z } from 'zod';\nimport {\n  BaseHederaQueryTool,\n  BaseHederaQueryToolParams,\n} from '../common/base-hedera-query-tool';\n\nconst ValidateNftOwnershipZodSchema = z.object({\n  accountId: z\n    .string()\n    .describe('The account ID to check ownership for (e.g., \"0.0.12345\")'),\n  tokenId: z\n    .string()\n    .describe('The NFT token ID (e.g., \"0.0.67890\")'),\n  serialNumber: z\n    .number()\n    .int()\n    .positive()\n    .describe('The serial number of the NFT'),\n});\n\n/**\n * Tool for validating NFT ownership on Hedera.\n * This is a read-only operation that queries the mirror node.\n */\nexport class HederaValidateNftOwnershipTool extends BaseHederaQueryTool<\n  typeof ValidateNftOwnershipZodSchema\n> {\n  name = 'hedera-validate-nft-ownership';\n  description =\n    'Validates whether a specific account owns a particular NFT by token ID and serial number.';\n  specificInputSchema = ValidateNftOwnershipZodSchema;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaQueryToolParams) {\n    super(params);\n  }\n\n  protected async executeQuery(\n    args: z.infer<typeof ValidateNftOwnershipZodSchema>\n  ): Promise<unknown> {\n    this.logger.info(\n      `Validating NFT ownership: account ${args.accountId}, token ${args.tokenId}, serial ${args.serialNumber}`\n    );\n    \n    const nftDetail = await this.hederaKit.query().validateNftOwnership(\n      args.accountId,\n      args.tokenId,\n      args.serialNumber\n    );\n    \n    const isOwned = nftDetail !== null;\n\n    return {\n      success: true,\n      accountId: args.accountId,\n      tokenId: args.tokenId,\n      serialNumber: args.serialNumber,\n      isOwned,\n      nftDetail: isOwned ? nftDetail : null,\n    };\n  }\n} \n ","import { z } from 'zod';\nimport {\n  BaseHederaQueryTool,\n  BaseHederaQueryToolParams,\n} from '../common/base-hedera-query-tool';\n\nconst GetHbarPriceZodSchema = z.object({\n  date: z\n    .string()\n    .optional()\n    .describe(\n      'Date to get HBAR price for in ISO format (e.g., \"2023-12-01T00:00:00Z\"). Defaults to current date.'\n    ),\n});\n\n/**\n * Tool for retrieving HBAR price from the Hedera network.\n * This is a read-only operation that queries the mirror node.\n */\nexport class HederaGetHbarPriceTool extends BaseHederaQueryTool<\n  typeof GetHbarPriceZodSchema\n> {\n  name = 'hedera-get-hbar-price';\n  description =\n    'Retrieves the HBAR price in USD for a specific date. Defaults to current date if no date provided.';\n  specificInputSchema = GetHbarPriceZodSchema;\n  namespace = 'network';\n\n  constructor(params: BaseHederaQueryToolParams) {\n    super(params);\n  }\n\n  protected async executeQuery(\n    args: z.infer<typeof GetHbarPriceZodSchema>\n  ): Promise<unknown> {\n    const date = args.date ? new Date(args.date) : new Date();\n\n    this.logger.info(`Getting HBAR price for date: ${date.toISOString()}`);\n\n    const price = await this.hederaKit.query().getHbarPrice(date);\n\n    if (price === null) {\n      return {\n        success: false,\n        error: `Could not retrieve HBAR price for date ${date.toISOString()}`,\n      };\n    }\n\n    return {\n      success: true,\n      date: date.toISOString(),\n      priceUsd: price,\n      currency: 'USD',\n    };\n  }\n}\n","import { z } from 'zod';\nimport {\n  BaseHederaQueryTool,\n  BaseHederaQueryToolParams,\n} from '../common/base-hedera-query-tool';\n\nconst GetTransactionZodSchema = z.object({\n  transactionIdOrHash: z\n    .string()\n    .describe(\n      'The transaction ID (e.g., \"0.0.12345-1234567890-123456789\") or hash to get details for'\n    ),\n});\n\n/**\n * Tool for retrieving Hedera transaction details.\n * This is a read-only operation that queries the mirror node.\n */\nexport class HederaGetTransactionTool extends BaseHederaQueryTool<\n  typeof GetTransactionZodSchema\n> {\n  name = 'hedera-get-transaction';\n  description =\n    'Retrieves detailed information about a Hedera transaction by transaction ID or hash.';\n  specificInputSchema = GetTransactionZodSchema;\n  namespace = 'transaction';\n\n  constructor(params: BaseHederaQueryToolParams) {\n    super(params);\n  }\n\n  protected async executeQuery(\n    args: z.infer<typeof GetTransactionZodSchema>\n  ): Promise<unknown> {\n    this.logger.info(\n      `Getting transaction details for: ${args.transactionIdOrHash}`\n    );\n\n    const transaction = await this.hederaKit\n      .query()\n      .getTransaction(args.transactionIdOrHash);\n\n    if (!transaction) {\n      return {\n        success: false,\n        error: `Transaction ${args.transactionIdOrHash} not found`,\n      };\n    }\n\n    return {\n      success: true,\n      transactionIdOrHash: args.transactionIdOrHash,\n      transaction,\n    };\n  }\n}\n","import { z } from 'zod';\nimport {\n  BaseHederaQueryTool,\n  BaseHederaQueryToolParams,\n} from '../common/base-hedera-query-tool';\n\nconst GetOutstandingAirdropsZodSchema = z.object({\n  accountId: z\n    .string()\n    .describe('The account ID that sent the airdrops (e.g., \"0.0.123\")'),\n  limit: z.number().optional().describe('Maximum number of airdrops to return'),\n  order: z.enum(['asc', 'desc']).optional().describe('Order of results'),\n  receiverId: z.string().optional().describe('Filter by receiver account ID'),\n  serialNumber: z.string().optional().describe('Filter by NFT serial number'),\n  tokenId: z.string().optional().describe('Filter by token ID'),\n});\n\n/**\n * Tool for retrieving outstanding token airdrops sent by an account.\n */\nexport class HederaGetOutstandingAirdropsTool extends BaseHederaQueryTool<\n  typeof GetOutstandingAirdropsZodSchema\n> {\n  name = 'hedera-get-outstanding-airdrops';\n  description =\n    'Retrieves outstanding token airdrops that have been sent by an account but not yet claimed.';\n  specificInputSchema = GetOutstandingAirdropsZodSchema;\n  namespace = 'account';\n\n  constructor(params: BaseHederaQueryToolParams) {\n    super(params);\n  }\n\n  protected async executeQuery(\n    args: z.infer<typeof GetOutstandingAirdropsZodSchema>\n  ): Promise<unknown> {\n    this.logger.info(\n      `Getting outstanding airdrops for account: ${args.accountId}`\n    );\n\n    const airdrops = await this.hederaKit\n      .query()\n      .getOutstandingTokenAirdrops(args);\n\n    if (airdrops === null) {\n      return {\n        success: false,\n        error: `Could not retrieve outstanding airdrops for account ${args.accountId}`,\n      };\n    }\n\n    return {\n      success: true,\n      accountId: args.accountId,\n      airdrops,\n      count: airdrops.length,\n    };\n  }\n}\n\n ","import { z } from 'zod';\nimport {\n  BaseHederaQueryTool,\n  BaseHederaQueryToolParams,\n} from '../common/base-hedera-query-tool';\n\nconst GetPendingAirdropsZodSchema = z.object({\n  accountId: z\n    .string()\n    .describe('The account ID that received the airdrops (e.g., \"0.0.123\")'),\n  limit: z\n    .number()\n    .optional()\n    .describe('Maximum number of airdrops to return'),\n  order: z\n    .enum(['asc', 'desc'])\n    .optional()\n    .describe('Order of results'),\n  senderId: z\n    .string()\n    .optional()\n    .describe('Filter by sender account ID'),\n  serialNumber: z\n    .string()\n    .optional()\n    .describe('Filter by NFT serial number'),\n  tokenId: z\n    .string()\n    .optional()\n    .describe('Filter by token ID'),\n});\n\n/**\n * Tool for retrieving pending token airdrops received by an account.\n */\nexport class HederaGetPendingAirdropsTool extends BaseHederaQueryTool<\n  typeof GetPendingAirdropsZodSchema\n> {\n  name = 'hedera-get-pending-airdrops';\n  description =\n    'Retrieves pending token airdrops that have been received by an account but not yet claimed.';\n  specificInputSchema = GetPendingAirdropsZodSchema;\n  namespace = 'account';\n\n  constructor(params: BaseHederaQueryToolParams) {\n    super(params);\n  }\n\n  protected async executeQuery(\n    args: z.infer<typeof GetPendingAirdropsZodSchema>\n  ): Promise<unknown> {\n    this.logger.info(`Getting pending airdrops for account: ${args.accountId}`);\n\n    const airdrops = await this.hederaKit\n      .query()\n      .getPendingTokenAirdrops(args);\n\n    if (!airdrops) {\n      return {\n        success: false,\n        error: `Could not retrieve pending airdrops for account ${args.accountId}`,\n      };\n    }\n\n    return {\n      success: true,\n      accountId: args.accountId,\n      airdrops,\n      count: airdrops.length,\n    };\n  }\n} \n ","import { z } from 'zod';\nimport {\n  BaseHederaQueryTool,\n  BaseHederaQueryToolParams,\n} from '../common/base-hedera-query-tool';\n\nconst GetBlocksZodSchema = z.object({\n  blockNumber: z\n    .string()\n    .optional()\n    .describe('Filter by block number'),\n  timestamp: z\n    .string()\n    .optional()\n    .describe('Filter by timestamp'),\n  limit: z\n    .number()\n    .optional()\n    .describe('Maximum number of blocks to return'),\n  order: z\n    .enum(['asc', 'desc'])\n    .optional()\n    .describe('Order of results'),\n});\n\n/**\n * Tool for retrieving blocks from the network.\n */\nexport class HederaGetBlocksTool extends BaseHederaQueryTool<\n  typeof GetBlocksZodSchema\n> {\n  name = 'hedera-get-blocks';\n  description = 'Retrieves blocks from the Hedera network with optional filtering.';\n  specificInputSchema = GetBlocksZodSchema;\n  namespace = 'network';\n\n  constructor(params: BaseHederaQueryToolParams) {\n    super(params);\n  }\n\n  protected async executeQuery(\n    args: z.infer<typeof GetBlocksZodSchema>\n  ): Promise<unknown> {\n    this.logger.info('Getting blocks from the network');\n\n    const blocks = await this.hederaKit.query().getBlocks(args);\n\n    if (blocks === null) {\n      return {\n        success: false,\n        error: 'Could not retrieve blocks from the network',\n      };\n    }\n\n    return {\n      success: true,\n      blocks,\n      count: blocks.length,\n    };\n  }\n} \n ","import { z } from 'zod';\nimport {\n  BaseHederaQueryTool,\n  BaseHederaQueryToolParams,\n} from '../common/base-hedera-query-tool';\n\nconst GetContractsZodSchema = z.object({\n  contractId: z.string().optional().describe('Filter by specific contract ID'),\n  limit: z\n    .number()\n    .optional()\n    .describe('Maximum number of contracts to return'),\n  order: z.enum(['asc', 'desc']).optional().describe('Order of results'),\n});\n\n/**\n * Tool for retrieving contract entities from the network.\n */\nexport class HederaGetContractsTool extends BaseHederaQueryTool<\n  typeof GetContractsZodSchema\n> {\n  name = 'hedera-get-contracts';\n  description =\n    'Retrieves contract entities from the Hedera network with optional filtering.';\n  specificInputSchema = GetContractsZodSchema;\n  namespace = 'scs';\n\n  constructor(params: BaseHederaQueryToolParams) {\n    super(params);\n  }\n\n  protected async executeQuery(\n    args: z.infer<typeof GetContractsZodSchema>\n  ): Promise<unknown> {\n    this.logger.info('Getting contracts from the network');\n\n    const contracts = await this.hederaKit.query().getContracts(args);\n\n    if (contracts === null) {\n      return {\n        success: false,\n        error: 'Could not retrieve contracts from the network',\n      };\n    }\n\n    return {\n      success: true,\n      contracts,\n      count: contracts.length,\n    };\n  }\n}\n","import { z } from 'zod';\nimport {\n  BaseHederaQueryTool,\n  BaseHederaQueryToolParams,\n  FieldProcessor,\n} from '../common/base-hedera-query-tool';\n\nconst GetContractZodSchema = z.object({\n  contractIdOrAddress: z.string().describe('The contract ID or EVM address'),\n  timestamp: z\n    .string()\n    .optional()\n    .describe('Optional timestamp for historical data'),\n  includeBytecode: z\n    .boolean()\n    .optional()\n    .default(false)\n    .describe(\n      'Whether to include full bytecode in response (may be very large)'\n    ),\n});\n\n/**\n * Tool for retrieving a specific contract by ID or address.\n */\nexport class HederaGetContractTool extends BaseHederaQueryTool<\n  typeof GetContractZodSchema\n> {\n  name = 'hedera-get-contract';\n  description =\n    'Retrieves a specific contract by ID or EVM address from the Hedera network. Use includeBytecode=true for full bytecode (may be large).';\n  specificInputSchema = GetContractZodSchema;\n  namespace = 'scs';\n\n  constructor(params: BaseHederaQueryToolParams) {\n    super(params);\n  }\n\n  protected override getLargeFieldProcessors(\n    args: z.infer<typeof GetContractZodSchema>\n  ): Record<string, FieldProcessor> {\n    if (args.includeBytecode) {\n      return {};\n    }\n\n    return {\n      'contract.bytecode': {\n        maxLength: 200,\n        truncateMessage: '[Use includeBytecode=true for full bytecode]',\n      },\n      'contract.runtime_bytecode': {\n        maxLength: 200,\n        truncateMessage: '[Use includeBytecode=true for full runtime bytecode]',\n      },\n      'contract.creation_bytecode': {\n        maxLength: 200,\n        truncateMessage:\n          '[Use includeBytecode=true for full creation bytecode]',\n      },\n      bytecode: {\n        maxLength: 200,\n        truncateMessage: '[Use includeBytecode=true for full bytecode]',\n      },\n      runtime_bytecode: {\n        maxLength: 200,\n        truncateMessage: '[Use includeBytecode=true for full runtime bytecode]',\n      },\n      creation_bytecode: {\n        maxLength: 200,\n        truncateMessage:\n          '[Use includeBytecode=true for full creation bytecode]',\n      },\n    };\n  }\n\n  protected async executeQuery(\n    args: z.infer<typeof GetContractZodSchema>\n  ): Promise<unknown> {\n    this.logger.info(`Getting contract: ${args.contractIdOrAddress}`);\n\n    const contract = await this.hederaKit\n      .query()\n      .getContract(args.contractIdOrAddress, args.timestamp);\n\n    if (contract === null) {\n      return {\n        success: false,\n        error: `Contract ${args.contractIdOrAddress} not found`,\n      };\n    }\n\n    return {\n      success: true,\n      contract,\n      summary: {\n        contractId: contract.contract_id,\n        evmAddress: contract.evm_address,\n        created: contract.created_timestamp,\n        expiration: contract.expiration_timestamp,\n        deleted: contract.deleted,\n        memo: contract.memo || 'No memo',\n        autoRenewPeriod: contract.auto_renew_period,\n        maxAutomaticTokenAssociations:\n          contract.max_automatic_token_associations,\n        hasAdminKey: Boolean(contract.admin_key),\n        hasBytecode: Boolean(contract.bytecode),\n        hasRuntimeBytecode: Boolean(contract.runtime_bytecode),\n        bytecodeIncluded: args.includeBytecode,\n      },\n    };\n  }\n}\n","import { z } from 'zod';\nimport {\n  BaseHederaQueryTool,\n  BaseHederaQueryToolParams,\n} from '../common/base-hedera-query-tool';\n\nconst GetNetworkInfoZodSchema = z.object({});\n\n/**\n * Tool for retrieving network information.\n */\nexport class HederaGetNetworkInfoTool extends BaseHederaQueryTool<\n  typeof GetNetworkInfoZodSchema\n> {\n  name = 'hedera-get-network-info';\n  description = 'Retrieves network information from the Hedera network.';\n  specificInputSchema = GetNetworkInfoZodSchema;\n  namespace = 'network';\n\n  constructor(params: BaseHederaQueryToolParams) {\n    super(params);\n  }\n\n  protected async executeQuery(): Promise<unknown> {\n    this.logger.info('Getting network information');\n\n    const networkInfo = await this.hederaKit.query().getNetworkInfo();\n\n    if (networkInfo === null) {\n      return {\n        success: false,\n        error: 'Could not retrieve network information',\n      };\n    }\n\n    return {\n      success: true,\n      networkInfo,\n    };\n  }\n}\n","import { z } from 'zod';\nimport {\n  BaseHederaQueryTool,\n  BaseHederaQueryToolParams,\n} from '../common/base-hedera-query-tool';\n\nconst GetNetworkFeesZodSchema = z.object({\n  timestamp: z\n    .string()\n    .optional()\n    .describe('Optional timestamp for historical fees'),\n});\n\n/**\n * Tool for retrieving network fees.\n */\nexport class HederaGetNetworkFeesTool extends BaseHederaQueryTool<\n  typeof GetNetworkFeesZodSchema\n> {\n  name = 'hedera-get-network-fees';\n  description = 'Retrieves network fees from the Hedera network.';\n  specificInputSchema = GetNetworkFeesZodSchema;\n  namespace = 'network';\n\n  constructor(params: BaseHederaQueryToolParams) {\n    super(params);\n  }\n\n  protected async executeQuery(\n    args: z.infer<typeof GetNetworkFeesZodSchema>\n  ): Promise<unknown> {\n    this.logger.info('Getting network fees');\n\n    const networkFees = await this.hederaKit\n      .query()\n      .getNetworkFees(args.timestamp);\n\n    if (networkFees === null) {\n      return {\n        success: false,\n        error: 'Could not retrieve network fees',\n      };\n    }\n\n    return {\n      success: true,\n      networkFees,\n    };\n  }\n}\n","import { z } from 'zod';\nimport { AirdropTokenParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst AirdropRecipientSchema = z.object({\n  accountId: z.string().describe('Recipient account ID (e.g., \"0.0.xxxx\").'),\n  amount: z\n    .union([z.number(), z.string()])\n    .describe('Amount in smallest unit. Builder handles Long conversion.'),\n});\n\nconst AirdropTokenZodSchemaCore = z.object({\n  tokenId: z\n    .string()\n    .describe('The ID of the fungible token to airdrop (e.g., \"0.0.yyyy\").'),\n  recipients: z\n    .array(AirdropRecipientSchema)\n    .min(1)\n    .describe('Array of recipient objects, each with accountId and amount.'),\n  memo: z.string().optional().describe('Optional. Memo for the transaction.'),\n});\n\nexport class HederaAirdropTokenTool extends BaseHederaTransactionTool<\n  typeof AirdropTokenZodSchemaCore\n> {\n  name = 'hedera-hts-airdrop-token';\n  description =\n    'Airdrops fungible tokens to multiple recipients. Builder handles parsing and validation.';\n  specificInputSchema = AirdropTokenZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof AirdropTokenZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).airdropToken(\n      specificArgs as unknown as AirdropTokenParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { AssociateTokensParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { HtsBuilder } from '../../../builders/hts/hts-builder';\n\nconst AssociateTokensZodSchemaCore = z.object({\n  accountId: z\n    .string()\n    .describe('The account ID to associate tokens with (e.g., \"0.0.xxxx\").'),\n  tokenIds: z\n    .array(z.string().describe('A token ID (e.g., \"0.0.yyyy\").'))\n    .min(1)\n    .describe('An array of one or more token IDs to associate.'),\n});\n\nexport class HederaAssociateTokensTool extends BaseHederaTransactionTool<\n  typeof AssociateTokensZodSchemaCore\n> {\n  name = 'hedera-hts-associate-tokens';\n  description = 'Associates one or more Hedera tokens with an account.';\n  specificInputSchema = AssociateTokensZodSchemaCore;\n  namespace = 'hts';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof AssociateTokensZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HtsBuilder).associateTokens(\n      specificArgs as unknown as AssociateTokensParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport { UpdateTopicParams } from '../../../types';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { HcsBuilder } from '../../../builders/hcs/hcs-builder';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\n\nconst UpdateTopicZodSchemaCore = z.object({\n  topicId: z\n    .string()\n    .describe('The ID of the topic to update (e.g., \"0.0.xxxx\").'),\n  memo: z\n    .string()\n    .nullable()\n    .optional()\n    .describe('Optional. New memo for the topic. Pass null to clear.'),\n  adminKey: z\n    .string()\n    .nullable()\n    .optional()\n    .describe(\n      'Optional. New admin key (serialized string). Pass null to clear.'\n    ),\n  submitKey: z\n    .string()\n    .nullable()\n    .optional()\n    .describe(\n      'Optional. New submit key (serialized string). Pass null to clear.'\n    ),\n  autoRenewPeriod: z\n    .number()\n    .int()\n    .positive()\n    .optional()\n    .describe('Optional. New auto-renewal period in seconds.'),\n  autoRenewAccountId: z\n    .string()\n    .nullable()\n    .optional()\n    .describe('Optional. New auto-renew account ID. Pass null to clear.'),\n  feeScheduleKey: z\n    .string()\n    .nullable()\n    .optional()\n    .describe(\n      'Optional. New fee schedule key (serialized string). Pass null to clear.'\n    ),\n  exemptAccountIds: z\n    .array(z.string())\n    .optional()\n    .describe(\n      'Optional. New list of exempt account IDs. An empty array clears all exemptions.'\n    ),\n});\n\nexport class HederaUpdateTopicTool extends BaseHederaTransactionTool<\n  typeof UpdateTopicZodSchemaCore\n> {\n  name = 'hedera-hcs-update-topic';\n  description =\n    'Updates an HCS topic. Requires topicId. Other fields are optional. Null can be used to clear certain fields.';\n  specificInputSchema = UpdateTopicZodSchemaCore;\n  namespace = 'hcs';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.hcs();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof UpdateTopicZodSchemaCore>\n  ): Promise<void> {\n    await (builder as HcsBuilder).updateTopic(\n      specificArgs as unknown as UpdateTopicParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport {\n  BaseHederaQueryTool,\n  BaseHederaQueryToolParams,\n} from '../common/base-hedera-query-tool';\n\nconst GetTopicMessagesByFilterZodSchema = z.object({\n  topicId: z\n    .string()\n    .describe('The topic ID to get messages for (e.g., \"0.0.12345\")'),\n  sequenceNumber: z\n    .string()\n    .optional()\n    .describe('Filter by sequence number (e.g., \"gt:10\", \"lte:20\")'),\n  startTime: z\n    .string()\n    .optional()\n    .describe('Filter by start consensus timestamp (e.g., \"1629400000.000000000\")'),\n  endTime: z\n    .string()\n    .optional()\n    .describe('Filter by end consensus timestamp (e.g., \"1629500000.000000000\")'),\n  limit: z\n    .number()\n    .int()\n    .positive()\n    .optional()\n    .describe('Maximum number of messages to return'),\n  order: z\n    .enum(['asc', 'desc'])\n    .optional()\n    .describe('Order of messages (ascending or descending)'),\n});\n\n/**\n * Tool for retrieving filtered messages from a Hedera Consensus Service topic.\n * This is a read-only operation that queries the mirror node.\n */\nexport class HederaGetTopicMessages extends BaseHederaQueryTool<\n  typeof GetTopicMessagesByFilterZodSchema\n> {\n  name = 'hedera-get-topic-messages-by-filter';\n  description =\n    'Retrieves filtered messages from a Hedera Consensus Service topic with optional filters for sequence number, time range, limit, and order.';\n  specificInputSchema = GetTopicMessagesByFilterZodSchema;\n  namespace = 'hcs';\n\n  constructor(params: BaseHederaQueryToolParams) {\n    super(params);\n  }\n\n  protected async executeQuery(\n    args: z.infer<typeof GetTopicMessagesByFilterZodSchema>\n  ): Promise<unknown> {\n    this.logger.info(`Getting filtered messages for topic ID: ${args.topicId}`);\n    \n    const options: {\n      sequenceNumber?: string;\n      startTime?: string;\n      endTime?: string;\n      limit?: number;\n      order?: 'asc' | 'desc';\n    } = {};\n\n    if (args.sequenceNumber) options.sequenceNumber = args.sequenceNumber;\n    if (args.startTime) options.startTime = args.startTime;\n    if (args.endTime) options.endTime = args.endTime;\n    if (args.limit) options.limit = args.limit;\n    if (args.order) options.order = args.order;\n\n    const messages = await this.hederaKit.query().getTopicMessagesByFilter(\n      args.topicId,\n      options\n    );\n    \n    if (!messages) {\n      return {\n        success: false,\n        error: `Could not retrieve messages for topic ${args.topicId}`,\n      };\n    }\n\n    return {\n      success: true,\n      topicId: args.topicId,\n      messageCount: messages.length,\n      filters: options,\n      messages,\n    };\n  }\n} ","import { z } from 'zod';\nimport { Tool, ToolParams } from '@langchain/core/tools';\nimport { HederaAgentKit } from '../../../agent/agent';\nimport { Logger as StandardsSdkLogger } from '@hashgraphonline/standards-sdk';\nimport { FileId, FileContentsQuery } from '@hashgraph/sdk';\nimport { Buffer } from 'buffer';\n\nconst GetFileContentsZodSchema = z.object({\n  fileId: z\n    .string()\n    .describe(\n      'The ID of the file to retrieve contents for (e.g., \"0.0.xxxx\").'\n    ),\n  outputEncoding: z\n    .enum(['utf8', 'base64'])\n    .optional()\n    .default('base64')\n    .describe(\n      'Encoding for the output contents (utf8 or base64). Defaults to base64.'\n    ),\n});\n\nexport interface HederaGetFileContentsToolParams extends ToolParams {\n  hederaKit: HederaAgentKit;\n  logger?: StandardsSdkLogger;\n}\n\nexport class HederaGetFileContentsTool extends Tool {\n  protected hederaKit: HederaAgentKit;\n  protected logger: StandardsSdkLogger;\n\n  name = 'hedera-file-get-contents';\n  description =\n    'Retrieves the contents of a file from the Hedera File Service. Requires fileId. Returns contents as base64 string by default, or utf8.';\n\n  constructor({ hederaKit, logger, ...rest }: HederaGetFileContentsToolParams) {\n    super(rest);\n    this.hederaKit = hederaKit;\n    this.logger = logger || hederaKit.logger;\n  }\n\n  protected async _call(\n    input: string | z.infer<typeof GetFileContentsZodSchema>\n  ): Promise<string> {\n    let args: z.infer<typeof GetFileContentsZodSchema>;\n    try {\n      if (typeof input === 'string') {\n        try {\n          args = GetFileContentsZodSchema.parse(JSON.parse(input));\n        } catch (e: unknown) {\n          const error = e as Error;\n          throw new Error(\n            `Error parsing input: ${error.message}. Expected JSON string with fileId and optional outputEncoding.`\n          );\n        }\n      } else {\n        args = GetFileContentsZodSchema.parse(input);\n      }\n    } catch (e: unknown) {\n      const error = e as Error;\n      return JSON.stringify({\n        success: false,\n        error: `Invalid input: ${error.message}`,\n      });\n    }\n\n    this.logger.info(`Executing ${this.name} with args:`, args);\n    try {\n      const fileId = FileId.fromString(args.fileId);\n      const query = new FileContentsQuery().setFileId(fileId);\n\n      const contentsBytes: Uint8Array = await query.execute(\n        this.hederaKit.client\n      );\n\n      let outputContents: string;\n      if (args.outputEncoding === 'utf8') {\n        outputContents = Buffer.from(contentsBytes).toString('utf8');\n      } else {\n        outputContents = Buffer.from(contentsBytes).toString('base64');\n      }\n      return JSON.stringify({\n        success: true,\n        fileId: args.fileId,\n        encoding: args.outputEncoding,\n        contents: outputContents,\n      });\n    } catch (error: unknown) {\n      const errorMessage =\n        error instanceof Error ? error.message : 'Unknown error';\n      this.logger.error(\n        `Error in ${this.name} for file ${args.fileId}: ${errorMessage}`,\n        error\n      );\n      return JSON.stringify({\n        success: false,\n        error: errorMessage,\n        fileId: args.fileId,\n      });\n    }\n  }\n}\n","import { z } from 'zod';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { AccountBuilder } from '../../../builders/account/account-builder';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\nimport { DeleteNftSpenderAllowanceToolParams } from '../../../types';\n\nconst DeleteNftSpenderAllowanceZodSchemaCore = z.object({\n  ownerAccountId: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. The ID of the NFT owner. Defaults to the operator/signer if not provided.'\n    ),\n  spenderAccountId: z\n    .string()\n    .describe(\n      'The ID of the spender whose allowance for specific NFTs will be deleted.'\n    ),\n\n  nftIdString: z\n    .string()\n    .describe(\n      'The NFT ID including serial number (e.g., \"0.0.token.serial\") for which the allowance will be deleted.'\n    ),\n\n  tokenId: z\n    .string()\n    .describe('The token ID of the NFT collection (e.g., \"0.0.xxxx\").'),\n  serials: z\n    .array(z.union([z.number().int().positive(), z.string()]))\n    .min(1)\n    .describe('An array of serial numbers of the NFT to remove allowance for.'),\n});\n\nexport class HederaDeleteNftSpenderAllowanceTool extends BaseHederaTransactionTool<\n  typeof DeleteNftSpenderAllowanceZodSchemaCore\n> {\n  name = 'hedera-account-delete-nft-spender-allowance';\n  description =\n    'Deletes/revokes NFT allowances for specific serial numbers of a token for a specific spender. The owner of the NFTs must sign.';\n  specificInputSchema = DeleteNftSpenderAllowanceZodSchemaCore;\n  namespace = 'account';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.accounts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof DeleteNftSpenderAllowanceZodSchemaCore>\n  ): Promise<void> {\n    await (builder as AccountBuilder).deleteTokenNftAllowanceForSpender(\n      specificArgs as unknown as DeleteNftSpenderAllowanceToolParams\n    );\n  }\n}\n","import { z } from 'zod';\nimport {\n  BaseHederaTransactionTool,\n  BaseHederaTransactionToolParams,\n} from '../common/base-hedera-transaction-tool';\nimport { AccountBuilder } from '../../../builders/account/account-builder';\nimport { BaseServiceBuilder } from '../../../builders/base-service-builder';\n\nconst DeleteNftSerialAllowancesZodSchemaCore = z.object({\n  ownerAccountId: z\n    .string()\n    .optional()\n    .describe(\n      'Optional. The ID of the NFT owner. Defaults to the operator/signer if not provided.'\n    ),\n  nftIdString: z\n    .string()\n    .describe(\n      'The specific NFT ID including serial number (e.g., \"0.0.token.serial\") for which all spender allowances will be deleted.'\n    ),\n  memo: z.string().optional().describe('Optional. Memo for the transaction.'),\n});\n\nexport class HederaDeleteNftSerialAllowancesTool extends BaseHederaTransactionTool<\n  typeof DeleteNftSerialAllowancesZodSchemaCore\n> {\n  name = 'hedera-account-delete-nft-serial-allowances-for-all-spenders';\n  description =\n    'Deletes all allowances for a specific NFT serial (for all spenders), granted by an owner. This action must be signed by the NFT owner.';\n  specificInputSchema = DeleteNftSerialAllowancesZodSchemaCore;\n  namespace = 'account';\n\n  constructor(params: BaseHederaTransactionToolParams) {\n    super(params);\n  }\n\n  protected getServiceBuilder(): BaseServiceBuilder {\n    return this.hederaKit.accounts();\n  }\n\n  protected async callBuilderMethod(\n    builder: BaseServiceBuilder,\n    specificArgs: z.infer<typeof DeleteNftSerialAllowancesZodSchemaCore>\n  ): Promise<void> {\n    await (builder as AccountBuilder).deleteNftSerialAllowancesForAllSpenders(\n      specificArgs as any\n    );\n  }\n}\n","import { StructuredTool } from '@langchain/core/tools';\nimport HederaAgentKit from '../agent/agent';\nimport * as dotenv from 'dotenv';\nimport { PrivateKey } from '@hashgraph/sdk';\nimport { HederaCreateTopicTool } from './tools/hcs/create-topic-tool';\nimport { HederaDeleteTopicTool } from './tools/hcs/delete-topic-tool';\nimport { HederaSubmitMessageTool } from './tools/hcs/submit-message-tool';\nimport { HederaClaimAirdropTool } from './tools/hts/claim-airdrop-tool';\nimport { HederaCreateFungibleTokenTool } from './tools/hts/create-fungible-token-tool';\nimport { HederaCreateNftTool } from './tools/hts/create-nft-tool';\nimport { HederaMintFungibleTokenTool } from './tools/hts/mint-fungible-token-tool';\nimport { HederaMintNftTool } from './tools/hts/mint-nft-tool';\nimport { HederaRejectTokensTool } from './tools/hts/reject-tokens-tool';\nimport { HederaTransferTokensTool } from './tools/hts/transfer-tokens-tool';\nimport { HederaDissociateTokensTool } from './tools/hts/dissociate-tokens-tool';\nimport { HederaUpdateTokenTool } from './tools/hts/update-token-tool';\nimport { HederaDeleteTokenTool } from './tools/hts/delete-token-tool';\nimport { HederaPauseTokenTool } from './tools/hts/pause-token-tool';\nimport { HederaUnpauseTokenTool } from './tools/hts/unpause-token-tool';\nimport { HederaFreezeTokenAccountTool } from './tools/hts/freeze-token-account-tool';\nimport { HederaUnfreezeTokenAccountTool } from './tools/hts/unfreeze-token-account-tool';\nimport { HederaGrantKycTokenTool } from './tools/hts/grant-kyc-token-tool';\nimport { HederaRevokeKycTokenTool } from './tools/hts/revoke-kyc-token-tool';\nimport { HederaWipeTokenAccountTool } from './tools/hts/wipe-token-account-tool';\nimport { HederaTokenFeeScheduleUpdateTool } from './tools/hts/token-fee-schedule-update-tool';\nimport { HederaTransferNftTool } from './tools/hts/transfer-nft-tool';\nimport { HederaBurnFungibleTokenTool } from './tools/hts/burn-fungible-token-tool';\nimport { HederaBurnNftTool } from './tools/hts/burn-nft-tool';\nimport { HederaApproveFungibleTokenAllowanceTool } from './tools/account/approve-fungible-token-allowance-tool';\nimport { HederaApproveHbarAllowanceTool } from './tools/account/approve-hbar-allowance-tool';\nimport { HederaApproveTokenNftAllowanceTool } from './tools/account/approve-token-nft-allowance-tool';\nimport { HederaCreateAccountTool } from './tools/account/create-account-tool';\nimport { HederaDeleteAccountTool } from './tools/account/delete-account-tool';\nimport { HederaUpdateAccountTool } from './tools/account/update-account-tool';\nimport { HederaTransferHbarTool } from './tools/account/transfer-hbar-tool';\nimport { HederaRevokeHbarAllowanceTool } from './tools/account/revoke-hbar-allowance-tool';\nimport { HederaRevokeFungibleTokenAllowanceTool } from './tools/account/revoke-fungible-token-allowance-tool';\nimport { SignAndExecuteScheduledTransactionTool } from './tools/account/sign-and-execute-scheduled-transaction-tool';\nimport { HederaCreateFileTool } from './tools/file/create-file-tool';\nimport { HederaAppendFileTool } from './tools/file/append-file-tool';\nimport { HederaUpdateFileTool } from './tools/file/update-file-tool';\nimport { HederaDeleteFileTool } from './tools/file/delete-file-tool';\nimport { HederaCreateContractTool } from './tools/scs/create-contract-tool';\nimport { HederaUpdateContractTool } from './tools/scs/update-contract-tool';\nimport { HederaDeleteContractTool } from './tools/scs/delete-contract-tool';\nimport { HederaExecuteContractTool } from './tools/scs/execute-contract-tool';\nimport { BaseHederaTransactionToolParams } from './tools/common/base-hedera-transaction-tool';\nimport { BaseHederaQueryToolParams } from './tools/common/base-hedera-query-tool';\nimport { ModelCapability } from '../types/model-capability';\nimport { HederaGetTopicInfoTool } from './tools/hcs/get-topic-info-tool';\nimport { HederaGetTopicFeesTool } from './tools/hcs/get-topic-fees-tool';\nimport { HederaGetAccountBalanceTool } from './tools/account/get-account-balance-tool';\nimport { HederaGetAccountPublicKeyTool } from './tools/account/get-account-public-key-tool';\nimport { HederaGetAccountInfoTool } from './tools/account/get-account-info-tool';\nimport { HederaGetAccountTokensTool } from './tools/account/get-account-tokens-tool';\nimport { HederaGetAccountNftsTool } from './tools/account/get-account-nfts-tool';\nimport { HederaGetTokenInfoTool } from './tools/hts/get-token-info-tool';\nimport { HederaValidateNftOwnershipTool } from './tools/hts/validate-nft-ownership-tool';\nimport { HederaGetHbarPriceTool } from './tools/network/get-hbar-price-tool';\nimport { HederaGetTransactionTool } from './tools/transaction/get-transaction-tool';\nimport { HederaGetOutstandingAirdropsTool } from './tools/account/get-outstanding-airdrops-tool';\nimport { HederaGetPendingAirdropsTool } from './tools/account/get-pending-airdrops-tool';\nimport { HederaGetBlocksTool } from './tools/network/get-blocks-tool';\nimport { HederaGetContractsTool } from './tools/scs/get-contracts-tool';\nimport { HederaGetContractTool } from './tools/scs/get-contract-tool';\nimport { HederaGetNetworkInfoTool } from './tools/network/get-network-info-tool';\nimport { HederaGetNetworkFeesTool } from './tools/network/get-network-fees-tool';\nimport { HederaAirdropTokenTool } from './tools/hts/airdrop-token-tool';\nimport { HederaAssociateTokensTool } from './tools/hts/associate-tokens-tool';\nimport { HederaUpdateTopicTool } from './tools/hcs/update-topic-tool';\nimport { HederaGetTopicMessages } from './tools/hcs/get-topic-messages-tool';\nimport { HederaGetFileContentsTool } from './tools/file/get-file-contents-tool';\nimport { HederaDeleteNftSpenderAllowanceTool } from './tools/account/delete-nft-spender-allowance-tool';\nimport { HederaDeleteNftSerialAllowancesTool } from './tools/account/delete-nft-allowance-all-serials-tool';\n\ndotenv.config();\n\n/**\n * @description Creates and aggregates all available Hedera LangChain tools.\n * This function is intended to be called by HederaAgentKit during its initialization.\n * @param {HederaAgentKit} hederaKit - The initialized HederaAgentKit instance.\n * @param {string} operatorId - The operator account ID.\n * @param {PrivateKey} operatorKey - The operator private key.\n * @param {ModelCapability} modelCapability - The model capability for response processing.\n * @returns {Tool[]} An array of LangChain Tool instances.\n */\nexport async function createHederaTools(\n  hederaKit: HederaAgentKit,\n  operatorId?: string,\n  operatorKey?: PrivateKey,\n  modelCapability: ModelCapability = ModelCapability.MEDIUM\n): Promise<StructuredTool[]> {\n  const toolParams: BaseHederaTransactionToolParams = {\n    hederaKit,\n    logger: hederaKit.logger,\n  };\n\n  const queryToolParams: BaseHederaQueryToolParams = {\n    hederaKit,\n    logger: hederaKit.logger,\n    modelCapability,\n  };\n\n  const hederaTools: StructuredTool[] = [\n    new HederaTransferHbarTool(toolParams),\n    new HederaApproveFungibleTokenAllowanceTool(toolParams),\n    new HederaApproveHbarAllowanceTool(toolParams),\n    new HederaApproveTokenNftAllowanceTool(toolParams),\n    new HederaCreateAccountTool(toolParams),\n    new HederaDeleteAccountTool(toolParams),\n    new HederaUpdateAccountTool(toolParams),\n    new HederaRevokeHbarAllowanceTool(toolParams),\n    new HederaRevokeFungibleTokenAllowanceTool(toolParams),\n    new HederaDeleteNftSpenderAllowanceTool(toolParams),\n    new HederaDeleteNftSerialAllowancesTool(toolParams),\n    new SignAndExecuteScheduledTransactionTool(toolParams),\n    new HederaCreateTopicTool(toolParams),\n    new HederaDeleteTopicTool(toolParams),\n    new HederaUpdateTopicTool(toolParams),\n    new HederaSubmitMessageTool(toolParams),\n    new HederaBurnFungibleTokenTool(toolParams),\n    new HederaBurnNftTool(toolParams),\n    new HederaAirdropTokenTool(toolParams),\n    new HederaAssociateTokensTool(toolParams),\n    new HederaClaimAirdropTool(toolParams),\n    new HederaCreateFungibleTokenTool(toolParams),\n    new HederaCreateNftTool(toolParams),\n    new HederaDeleteTokenTool(toolParams),\n    new HederaDissociateTokensTool(toolParams),\n    new HederaFreezeTokenAccountTool(toolParams),\n    new HederaGrantKycTokenTool(toolParams),\n    new HederaMintFungibleTokenTool(toolParams),\n    new HederaMintNftTool(toolParams),\n    new HederaPauseTokenTool(toolParams),\n    new HederaRejectTokensTool(toolParams),\n    new HederaRevokeKycTokenTool(toolParams),\n    new HederaTokenFeeScheduleUpdateTool(toolParams),\n    new HederaTransferNftTool(toolParams),\n    new HederaTransferTokensTool(toolParams),\n    new HederaUnfreezeTokenAccountTool(toolParams),\n    new HederaUnpauseTokenTool(toolParams),\n    new HederaUpdateTokenTool(toolParams),\n    new HederaWipeTokenAccountTool(toolParams),\n    new HederaCreateFileTool(toolParams),\n    new HederaAppendFileTool(toolParams),\n    new HederaUpdateFileTool(toolParams),\n    new HederaDeleteFileTool(toolParams),\n    new HederaCreateContractTool(toolParams),\n    new HederaUpdateContractTool(toolParams),\n    new HederaDeleteContractTool(toolParams),\n    new HederaExecuteContractTool(toolParams),\n    new HederaGetTopicInfoTool(queryToolParams) as StructuredTool,\n    new HederaGetTopicFeesTool(queryToolParams) as StructuredTool,\n    new HederaGetTopicMessages(queryToolParams) as StructuredTool,\n    new HederaGetAccountBalanceTool(queryToolParams) as StructuredTool,\n    new HederaGetAccountPublicKeyTool(queryToolParams) as StructuredTool,\n    new HederaGetAccountInfoTool(queryToolParams) as StructuredTool,\n    new HederaGetAccountTokensTool(queryToolParams) as StructuredTool,\n    new HederaGetAccountNftsTool(queryToolParams) as StructuredTool,\n    new HederaGetOutstandingAirdropsTool(queryToolParams) as StructuredTool,\n    new HederaGetPendingAirdropsTool(queryToolParams) as StructuredTool,\n    new HederaGetTokenInfoTool(queryToolParams) as StructuredTool,\n    new HederaValidateNftOwnershipTool(queryToolParams) as StructuredTool,\n    new HederaGetHbarPriceTool(queryToolParams) as StructuredTool,\n    new HederaGetTransactionTool(queryToolParams) as StructuredTool,\n    new HederaGetBlocksTool(queryToolParams) as StructuredTool,\n    new HederaGetContractsTool(queryToolParams) as StructuredTool,\n    new HederaGetContractTool(queryToolParams) as StructuredTool,\n    new HederaGetNetworkInfoTool(queryToolParams) as StructuredTool,\n    new HederaGetNetworkFeesTool(queryToolParams) as StructuredTool,\n    new HederaGetFileContentsTool(queryToolParams) as StructuredTool,\n  ];\n\n  hederaKit.logger.info(\n    `Created ${hederaTools.length} tools with model capability: ${modelCapability}`\n  );\n\n  return hederaTools;\n}\n\nexport { BaseHederaTransactionTool } from './tools/common/base-hedera-transaction-tool';\nexport { BaseHederaQueryTool } from './tools/common/base-hedera-query-tool';\nexport { HederaCreateTopicTool } from './tools/hcs/create-topic-tool';\nexport { HederaDeleteTopicTool } from './tools/hcs/delete-topic-tool';\nexport { HederaSubmitMessageTool } from './tools/hcs/submit-message-tool';\nexport { HederaUpdateTopicTool } from './tools/hcs/update-topic-tool';\nexport { HederaGetTopicInfoTool } from './tools/hcs/get-topic-info-tool';\nexport { HederaGetTopicFeesTool } from './tools/hcs/get-topic-fees-tool';\nexport { HederaGetTopicMessages } from './tools/hcs/get-topic-messages-tool';\n\nexport { HederaAirdropTokenTool } from './tools/hts/airdrop-token-tool';\nexport { HederaAssociateTokensTool } from './tools/hts/associate-tokens-tool';\nexport { HederaClaimAirdropTool } from './tools/hts/claim-airdrop-tool';\nexport { HederaCreateFungibleTokenTool } from './tools/hts/create-fungible-token-tool';\nexport { HederaCreateNftTool } from './tools/hts/create-nft-tool';\n\nexport { HederaMintFungibleTokenTool } from './tools/hts/mint-fungible-token-tool';\nexport { HederaMintNftTool } from './tools/hts/mint-nft-tool';\nexport { HederaRejectTokensTool } from './tools/hts/reject-tokens-tool';\nexport { HederaTransferTokensTool } from './tools/hts/transfer-tokens-tool';\nexport { HederaDissociateTokensTool } from './tools/hts/dissociate-tokens-tool';\nexport { HederaUpdateTokenTool } from './tools/hts/update-token-tool';\nexport { HederaDeleteTokenTool } from './tools/hts/delete-token-tool';\nexport { HederaPauseTokenTool } from './tools/hts/pause-token-tool';\nexport { HederaUnpauseTokenTool } from './tools/hts/unpause-token-tool';\nexport { HederaFreezeTokenAccountTool } from './tools/hts/freeze-token-account-tool';\nexport { HederaUnfreezeTokenAccountTool } from './tools/hts/unfreeze-token-account-tool';\nexport { HederaGrantKycTokenTool } from './tools/hts/grant-kyc-token-tool';\nexport { HederaRevokeKycTokenTool } from './tools/hts/revoke-kyc-token-tool';\nexport { HederaWipeTokenAccountTool } from './tools/hts/wipe-token-account-tool';\nexport { HederaTokenFeeScheduleUpdateTool } from './tools/hts/token-fee-schedule-update-tool';\nexport { HederaTransferNftTool } from './tools/hts/transfer-nft-tool';\nexport { HederaBurnFungibleTokenTool } from './tools/hts/burn-fungible-token-tool';\nexport { HederaBurnNftTool } from './tools/hts/burn-nft-tool';\nexport { HederaGetTokenInfoTool } from './tools/hts/get-token-info-tool';\nexport { HederaValidateNftOwnershipTool } from './tools/hts/validate-nft-ownership-tool';\n\nexport { HederaApproveFungibleTokenAllowanceTool } from './tools/account/approve-fungible-token-allowance-tool';\nexport { HederaApproveHbarAllowanceTool } from './tools/account/approve-hbar-allowance-tool';\nexport { HederaApproveTokenNftAllowanceTool } from './tools/account/approve-token-nft-allowance-tool';\nexport { HederaCreateAccountTool } from './tools/account/create-account-tool';\nexport { HederaDeleteAccountTool } from './tools/account/delete-account-tool';\nexport { HederaUpdateAccountTool } from './tools/account/update-account-tool';\nexport { HederaTransferHbarTool } from './tools/account/transfer-hbar-tool';\nexport { HederaRevokeHbarAllowanceTool } from './tools/account/revoke-hbar-allowance-tool';\nexport { HederaRevokeFungibleTokenAllowanceTool } from './tools/account/revoke-fungible-token-allowance-tool';\nexport { HederaGetAccountBalanceTool } from './tools/account/get-account-balance-tool';\nexport { HederaGetAccountPublicKeyTool } from './tools/account/get-account-public-key-tool';\nexport { HederaGetAccountInfoTool } from './tools/account/get-account-info-tool';\nexport { HederaGetAccountTokensTool } from './tools/account/get-account-tokens-tool';\nexport { HederaGetAccountNftsTool } from './tools/account/get-account-nfts-tool';\n\nexport { HederaCreateFileTool } from './tools/file/create-file-tool';\nexport { HederaAppendFileTool } from './tools/file/append-file-tool';\nexport { HederaUpdateFileTool } from './tools/file/update-file-tool';\nexport { HederaDeleteFileTool } from './tools/file/delete-file-tool';\nexport { HederaGetFileContentsTool } from './tools/file/get-file-contents-tool';\n\nexport { HederaCreateContractTool } from './tools/scs/create-contract-tool';\nexport { HederaUpdateContractTool } from './tools/scs/update-contract-tool';\nexport { HederaDeleteContractTool } from './tools/scs/delete-contract-tool';\nexport { HederaExecuteContractTool } from './tools/scs/execute-contract-tool';\n\nexport { HederaGetHbarPriceTool } from './tools/network/get-hbar-price-tool';\nexport { HederaGetTransactionTool } from './tools/transaction/get-transaction-tool';\n","import {\n  AccountId,\n  Client,\n  PublicKey,\n  TransactionId,\n  TransactionReceipt,\n  ScheduleSignTransaction,\n  ScheduleId,\n} from '@hashgraph/sdk';\nimport { AbstractSigner } from '../signer/abstract-signer';\nimport {\n  SignScheduledTransactionParams,\n  AgentOperationalMode,\n  HederaNetworkType,\n  MirrorNodeConfig,\n} from '../types';\nimport { HederaMirrorNode, Logger } from '@hashgraphonline/standards-sdk';\nimport {\n  IPlugin,\n  GenericPluginContext,\n  OpenConvaiState,\n  HCS10Client,\n} from '@hashgraphonline/standards-agent-kit';\nimport { Tool } from '@langchain/core/tools';\nimport { HcsBuilder } from '../builders/hcs/hcs-builder';\nimport { HtsBuilder } from '../builders/hts/hts-builder';\nimport { AccountBuilder } from '../builders/account/account-builder';\nimport { ScsBuilder } from '../builders/scs/scs-builder';\nimport { FileBuilder } from '../builders/file/file-builder';\nimport { QueryBuilder } from '../builders/query/query-builder';\nimport { ExecuteResult } from '../builders/base-service-builder';\nimport { createHederaTools } from '../langchain';\nimport { ModelCapability } from '../types/model-capability';\nimport { OpenConvAIPlugin } from '@hashgraphonline/standards-agent-kit';\n\nexport interface PluginConfig {\n  plugins?: IPlugin[];\n  appConfig?: Record<string, unknown> | undefined;\n}\nconst NOT_INITIALIZED_ERROR =\n  'HederaAgentKit not initialized. Call await kit.initialize() first.';\n\n/**\n * HederaAgentKit provides a simplified interface for interacting with the Hedera network,\n * abstracting away the complexities of the underlying SDK for common use cases.\n * It supports various operations related to HCS, HTS, and HBAR transfers through a Signer and Builders.\n * The kit must be initialized using the async `initialize()` method before its tools can be accessed.\n */\nexport class HederaAgentKit {\n  public readonly client: Client;\n  public readonly network: HederaNetworkType;\n  public readonly signer: AbstractSigner;\n  public readonly mirrorNode: HederaMirrorNode;\n  private loadedPlugins: IPlugin[];\n  private aggregatedTools: Tool[];\n  private pluginConfigInternal?: PluginConfig | undefined;\n  private isInitialized: boolean = false;\n  public readonly logger: Logger;\n  public operationalMode: AgentOperationalMode;\n  public userAccountId?: string | undefined;\n  public scheduleUserTransactionsInBytesMode: boolean;\n  public modelCapability: ModelCapability;\n  public modelName?: string | undefined;\n\n  constructor(\n    signer: AbstractSigner,\n    pluginConfigInput?: PluginConfig | undefined,\n    initialOperationalMode: AgentOperationalMode = 'provideBytes',\n    userAccountId?: string,\n    scheduleUserTransactionsInBytesMode: boolean = true,\n    modelCapability: ModelCapability = ModelCapability.MEDIUM,\n    modelName?: string,\n    mirrorNodeConfig?: MirrorNodeConfig,\n    disableLogging: boolean = false\n  ) {\n    this.signer = signer;\n    this.network = this.signer.getNetwork();\n\n    const shouldDisableLogs =\n      disableLogging || process.env.DISABLE_LOGS === 'true';\n\n    this.logger = new Logger({\n      level: shouldDisableLogs ? 'silent' : 'info',\n      module: 'HederaAgentKit',\n      silent: shouldDisableLogs,\n    });\n\n    if (this.network === 'mainnet') {\n      this.client = Client.forMainnet();\n    } else if (this.network === 'testnet') {\n      this.client = Client.forTestnet();\n    } else {\n      throw new Error(`Unsupported network type: ${this.network}`);\n    }\n    this.client.setOperator(\n      this.signer.getAccountId(),\n      this.signer.getOperatorPrivateKey()\n    );\n\n    this.mirrorNode = new HederaMirrorNode(\n      this.network,\n      new Logger({\n        level: shouldDisableLogs ? ('silent' as any) : 'info',\n        module: 'HederaAgentKit-MirrorNode',\n        silent: shouldDisableLogs,\n      }),\n      mirrorNodeConfig\n    );\n\n    this.pluginConfigInternal = pluginConfigInput;\n    this.loadedPlugins = [];\n    this.aggregatedTools = [];\n    this.operationalMode = initialOperationalMode;\n    this.userAccountId = userAccountId;\n    this.scheduleUserTransactionsInBytesMode =\n      scheduleUserTransactionsInBytesMode;\n    this.modelCapability = modelCapability;\n    this.modelName = modelName;\n  }\n\n  /**\n   * Initializes the HederaAgentKit, including loading any configured plugins and aggregating tools.\n   * This method must be called before `getAggregatedLangChainTools()` can be used.\n   */\n  public async initialize(): Promise<void> {\n    if (this.isInitialized) {\n      this.logger.warn('HederaAgentKit is already initialized.');\n      return;\n    }\n\n    this.loadedPlugins = [];\n\n    const contextForPlugins: GenericPluginContext = {\n      logger: this.logger as any,\n      config: this.pluginConfigInternal?.appConfig || {},\n      client: {\n        getNetwork: () => this.network,\n      },\n    };\n\n    if (this.pluginConfigInternal?.plugins) {\n      for (const pluginInstance of this.pluginConfigInternal.plugins) {\n        try {\n          this.logger.info(\n            `Initializing directly provided plugin: ${pluginInstance.name}`\n          );\n          await pluginInstance.initialize(contextForPlugins);\n          this.loadedPlugins.push(pluginInstance);\n          this.logger.info(\n            `Successfully initialized and added directly provided plugin: ${pluginInstance.name}`\n          );\n        } catch (error: unknown) {\n          this.logger.error(\n            `Failed to initialize directly provided plugin ${\n              pluginInstance.name\n            }: ${error instanceof Error ? error.message : String(error)}`\n          );\n        }\n      }\n    }\n\n    const signerAccountId = this.signer?.getAccountId()?.toString();\n    const signerPrivateKey = this.signer?.getOperatorPrivateKey();\n    const coreKitTools = await createHederaTools(\n      this,\n      signerAccountId,\n      signerPrivateKey,\n      this.modelCapability\n    );\n    const pluginTools: Tool[] = this.loadedPlugins.flatMap((plugin) => {\n      return plugin.getTools();\n    }) as unknown as Tool[];\n    const openConvAIPlugin = new OpenConvAIPlugin();\n    await openConvAIPlugin.initialize({\n      logger: this.logger,\n      config: this.pluginConfigInternal?.appConfig || {},\n      client: new HCS10Client(\n        this.signer.getAccountId().toString(),\n        this.signer.getOperatorPrivateKey()?.toStringRaw(),\n        this.network,\n      ),\n      stateManager: new OpenConvaiState(),\n    });\n\n    const hcs10Tools = openConvAIPlugin.getTools();\n\n    this.aggregatedTools = [\n      ...coreKitTools,\n      ...pluginTools,\n      ...hcs10Tools,\n    ] as unknown as Tool[];\n\n    this.isInitialized = true;\n    this.logger.info(\n      'HederaAgentKit initialized successfully with all tools aggregated.'\n    );\n  }\n\n  public async getOperator(): Promise<{ id: AccountId; publicKey: PublicKey }> {\n    return {\n      id: this.signer.getAccountId(),\n      publicKey: await this.signer.getPublicKey(),\n    };\n  }\n\n  /**\n   * Retrieves the aggregated list of LangChain tools from the kit, core tools, and plugins.\n   * The HederaAgentKit instance must be initialized via `await kit.initialize()` before calling this method.\n   * @returns {Tool[]} An array of LangChain Tool objects.\n   * @throws {Error} If the kit has not been initialized.\n   */\n  public getAggregatedLangChainTools(): Tool[] {\n    if (!this.isInitialized) {\n      throw new Error(\n        'HederaAgentKit not initialized. Call await kit.initialize() before accessing tools.'\n      );\n    }\n    return this.aggregatedTools;\n  }\n\n  /**\n   * Provides access to the Hedera Consensus Service (HCS) builder.\n   * @returns {HcsBuilder} An instance of HcsBuilder.\n   * @throws {Error} If HederaAgentKit has not been initialized via `await initialize()`.\n   */\n  public hcs(): HcsBuilder {\n    if (!this.isInitialized) {\n      throw new Error(NOT_INITIALIZED_ERROR);\n    }\n    return new HcsBuilder(this);\n  }\n\n  /**\n   * Provides access to the Hedera Token Service (HTS) builder.\n   * @returns {HtsBuilder} An instance of HtsBuilder.\n   * @throws {Error} If HederaAgentKit has not been initialized via `await initialize()`.\n   */\n  public hts(): HtsBuilder {\n    if (!this.isInitialized) {\n      throw new Error(NOT_INITIALIZED_ERROR);\n    }\n    return new HtsBuilder(this);\n  }\n\n  /**\n   * Provides access to the Hedera Account Service builder.\n   * @returns {AccountBuilder} An instance of AccountBuilder.\n   * @throws {Error} If HederaAgentKit has not been initialized via `await initialize()`.\n   */\n  public accounts(): AccountBuilder {\n    if (!this.isInitialized) {\n      throw new Error(NOT_INITIALIZED_ERROR);\n    }\n    return new AccountBuilder(this);\n  }\n\n  /**\n   * Provides access to the Hedera Smart Contract Service (SCS) builder.\n   * @returns {ScsBuilder} An instance of ScsBuilder.\n   * @throws {Error} If HederaAgentKit has not been initialized via `await initialize()`.\n   */\n  public scs(): ScsBuilder {\n    if (!this.isInitialized) {\n      throw new Error(NOT_INITIALIZED_ERROR);\n    }\n    return new ScsBuilder(this);\n  }\n\n  /**\n   * Provides access to the Hedera File Service (HFS) builder.\n   * @returns {FileBuilder} An instance of FileBuilder.\n   * @throws {Error} If HederaAgentKit has not been initialized via `await initialize()`.\n   */\n  public fs(): FileBuilder {\n    if (!this.isInitialized) {\n      throw new Error(NOT_INITIALIZED_ERROR);\n    }\n    return new FileBuilder(this);\n  }\n\n  /**\n   * Provides access to the Hedera Query builder for read-only operations.\n   * @returns {QueryBuilder} An instance of QueryBuilder.\n   * @throws {Error} If HederaAgentKit has not been initialized via `await initialize()`.\n   */\n  public query(): QueryBuilder {\n    if (!this.isInitialized) {\n      throw new Error(NOT_INITIALIZED_ERROR);\n    }\n    return new QueryBuilder(this);\n  }\n\n  /**\n   * Retrieves the transaction receipt for a given transaction ID string.\n   * @param {string} transactionIdString - The transaction ID (e.g., \"0.0.xxxx@16666666.77777777\").\n   * @returns {Promise<TransactionReceipt>} A promise that resolves to the TransactionReceipt.\n   * @throws {Error} If the transaction ID is invalid or receipt cannot be fetched.\n   */\n  public async getTransactionReceipt(\n    transactionIdInput: TransactionId | string\n  ): Promise<TransactionReceipt> {\n    const transactionId =\n      typeof transactionIdInput === 'string'\n        ? TransactionId.fromString(transactionIdInput)\n        : transactionIdInput;\n    try {\n      return await transactionId.getReceipt(this.client);\n    } catch (error: unknown) {\n      this.logger.error(\n        `Failed to get transaction receipt for ${transactionId.toString()}: ${\n          error instanceof Error ? error.message : String(error)\n        }`\n      );\n      throw error;\n    }\n  }\n\n  /**\n   * Signs a scheduled transaction.\n   * The transaction is signed by the operator configured in the current signer.\n   * @param {SignScheduledTransactionParams} params - Parameters for the ScheduleSign transaction.\n   * @returns {Promise<ExecuteResult>} A promise that resolves to an object indicating success, receipt, and transactionId.\n   * @throws {Error} If the execution fails.\n   */\n  public async signScheduledTransaction(\n    params: SignScheduledTransactionParams\n  ): Promise<ExecuteResult> {\n    if (!this.isInitialized) {\n      throw new Error(\n        'HederaAgentKit not initialized. Call await kit.initialize() first.'\n      );\n    }\n    this.logger.info(\n      `Attempting to sign scheduled transaction: ${params.scheduleId.toString()}`\n    );\n\n    const scheduleId =\n      typeof params.scheduleId === 'string'\n        ? ScheduleId.fromString(params.scheduleId)\n        : params.scheduleId;\n\n    const transaction = new ScheduleSignTransaction().setScheduleId(scheduleId);\n\n    if (params.memo) {\n      transaction.setTransactionMemo(params.memo);\n    }\n\n    let transactionIdToReport: string | undefined;\n    if (!transaction.transactionId) {\n      transaction.freezeWith(this.client);\n    }\n    transactionIdToReport = transaction.transactionId?.toString();\n\n    try {\n      const receipt = await this.signer.signAndExecuteTransaction(transaction);\n\n      return {\n        success: true,\n        receipt: receipt,\n        transactionId: transactionIdToReport,\n      };\n    } catch (error: unknown) {\n      this.logger.error(\n        `Failed to sign scheduled transaction ${params.scheduleId.toString()}: ${\n          error instanceof Error ? error.message : String(error)\n        }`\n      );\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : String(error),\n        transactionId: transactionIdToReport,\n      };\n    }\n  }\n}\n\nexport default HederaAgentKit;\n","import { BaseCallbackHandler } from '@langchain/core/callbacks/base';\nimport { LLMResult } from '@langchain/core/outputs';\nimport { Logger } from '@hashgraphonline/standards-sdk';\n\n/**\n * Token usage data structure\n */\nexport interface TokenUsage {\n  promptTokens: number;\n  completionTokens: number;\n  totalTokens: number;\n  modelName?: string | undefined;\n  timestamp?: Date | undefined;\n}\n\n/**\n * Cost calculation result\n */\nexport interface CostCalculation {\n  promptCost: number;\n  completionCost: number;\n  totalCost: number;\n  currency: string;\n}\n\n/**\n * OpenRouter model pricing structure\n */\nexport interface OpenRouterModel {\n  id: string;\n  name: string;\n  pricing: {\n    prompt: string;\n    completion: string;\n  };\n}\n\n/**\n * Model pricing manager that fetches and caches pricing from OpenRouter API\n */\nexport class ModelPricingManager {\n  private static instance: ModelPricingManager;\n  private pricingCache: Map<string, { prompt: number; completion: number }> =\n    new Map();\n  private lastFetchTime: number = 0;\n  private readonly CACHE_DURATION = 24 * 60 * 60 * 1000;\n  private readonly OPENROUTER_API_URL = 'https://openrouter.ai/api/v1/models';\n  private logger: Logger;\n\n  private constructor() {\n    this.logger = new Logger({ module: 'ModelPricingManager', level: 'info' });\n    this.initializeFallbackPricing();\n  }\n\n  public static getInstance(): ModelPricingManager {\n    if (!ModelPricingManager.instance) {\n      ModelPricingManager.instance = new ModelPricingManager();\n    }\n    return ModelPricingManager.instance;\n  }\n\n  private initializeFallbackPricing(): void {\n    const fallbackPricing = {\n      'gpt-4o': { prompt: 0.005, completion: 0.015 },\n      'gpt-4o-mini': { prompt: 0.00015, completion: 0.0006 },\n      'gpt-4-turbo': { prompt: 0.01, completion: 0.03 },\n      'gpt-4': { prompt: 0.03, completion: 0.06 },\n      'gpt-3.5-turbo': { prompt: 0.0005, completion: 0.0015 },\n    };\n\n    for (const [model, pricing] of Object.entries(fallbackPricing)) {\n      this.pricingCache.set(model, pricing);\n    }\n  }\n\n  private async fetchPricingFromAPI(): Promise<void> {\n    try {\n      const response = await fetch(this.OPENROUTER_API_URL, {\n        headers: {\n          Accept: 'application/json',\n          'User-Agent': 'hedera-agent-kit/1.0',\n        },\n      });\n\n      if (!response.ok) {\n        throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n      }\n\n      const data = await response.json();\n      const models: OpenRouterModel[] = data.data || [];\n\n      for (const model of models) {\n        if (model.pricing?.prompt && model.pricing?.completion) {\n          const promptPrice = parseFloat(model.pricing.prompt);\n          const completionPrice = parseFloat(model.pricing.completion);\n\n          if (!isNaN(promptPrice) && !isNaN(completionPrice)) {\n            this.pricingCache.set(model.id, {\n              prompt: promptPrice * 1000,\n              completion: completionPrice * 1000,\n            });\n\n            const simplifiedId = this.getSimplifiedModelId(model.id);\n            if (simplifiedId !== model.id) {\n              this.pricingCache.set(simplifiedId, {\n                prompt: promptPrice * 1000,\n                completion: completionPrice * 1000,\n              });\n            }\n          }\n        }\n      }\n\n      this.lastFetchTime = Date.now();\n      this.logger.info(\n        `Loaded pricing for ${models.length} models from OpenRouter API`\n      );\n    } catch (error) {\n      this.logger.warn(\n        'Failed to fetch pricing from API, using fallback pricing',\n        error\n      );\n    }\n  }\n\n  private getSimplifiedModelId(fullId: string): string {\n    const prefixes = [\n      'openai/',\n      'anthropic/',\n      'google/',\n      'mistralai/',\n      'meta-llama/',\n    ];\n    for (const prefix of prefixes) {\n      if (fullId.startsWith(prefix)) {\n        return fullId.replace(prefix, '');\n      }\n    }\n    return fullId;\n  }\n\n  private async ensurePricingLoaded(): Promise<void> {\n    const now = Date.now();\n    const shouldRefresh = now - this.lastFetchTime > this.CACHE_DURATION;\n\n    if (shouldRefresh || this.pricingCache.size < 10) {\n      await this.fetchPricingFromAPI();\n    }\n  }\n\n  public async getPricing(\n    modelName: string\n  ): Promise<{ prompt: number; completion: number }> {\n    await this.ensurePricingLoaded();\n\n    const exactMatch = this.pricingCache.get(modelName);\n    if (exactMatch) {\n      return exactMatch;\n    }\n\n    const normalizedName = modelName.toLowerCase();\n    for (const [key, value] of this.pricingCache.entries()) {\n      if (\n        key.toLowerCase().includes(normalizedName) ||\n        normalizedName.includes(key.toLowerCase())\n      ) {\n        return value;\n      }\n    }\n\n    return (\n      this.pricingCache.get('gpt-4o-mini') || {\n        prompt: 0.00015,\n        completion: 0.0006,\n      }\n    );\n  }\n\n  public getPricingSync(modelName: string): {\n    prompt: number;\n    completion: number;\n  } {\n    const exactMatch = this.pricingCache.get(modelName);\n    if (exactMatch) {\n      return exactMatch;\n    }\n\n    const normalizedName = modelName.toLowerCase();\n    for (const [key, value] of this.pricingCache.entries()) {\n      if (\n        key.toLowerCase().includes(normalizedName) ||\n        normalizedName.includes(key.toLowerCase())\n      ) {\n        return value;\n      }\n    }\n\n    return (\n      this.pricingCache.get('gpt-4o-mini') || {\n        prompt: 0.00015,\n        completion: 0.0006,\n      }\n    );\n  }\n}\n\n/**\n * Callback handler to track token usage from OpenAI API responses\n */\nexport class TokenUsageCallbackHandler extends BaseCallbackHandler {\n  name = 'TokenUsageCallbackHandler';\n  private tokenUsageHistory: TokenUsage[] = [];\n  private currentTokenUsage: TokenUsage | undefined = undefined;\n  private logger: Logger;\n  private modelName?: string | undefined;\n\n  constructor(modelName?: string, logger?: Logger) {\n    super();\n    this.modelName = modelName;\n    this.logger =\n      logger || new Logger({ module: 'TokenUsageTracker', level: 'info' });\n  }\n\n  override async handleLLMEnd(output: LLMResult): Promise<void> {\n    try {\n      if (output.llmOutput?.tokenUsage) {\n        this.currentTokenUsage = {\n          promptTokens: output.llmOutput.tokenUsage.promptTokens || 0,\n          completionTokens: output.llmOutput.tokenUsage.completionTokens || 0,\n          totalTokens: output.llmOutput.tokenUsage.totalTokens || 0,\n          modelName: this.modelName,\n          timestamp: new Date(),\n        };\n\n        this.tokenUsageHistory.push(this.currentTokenUsage);\n\n        this.logger.debug('Token usage tracked:', {\n          promptTokens: this.currentTokenUsage.promptTokens,\n          completionTokens: this.currentTokenUsage.completionTokens,\n          totalTokens: this.currentTokenUsage.totalTokens,\n          model: this.modelName,\n        });\n      }\n    } catch (error) {\n      this.logger.error('Failed to track token usage:', error);\n    }\n  }\n\n  getLatestTokenUsage(): TokenUsage | undefined {\n    return this.currentTokenUsage;\n  }\n\n  getTokenUsageHistory(): TokenUsage[] {\n    return [...this.tokenUsageHistory];\n  }\n\n  getTotalTokenUsage(): TokenUsage {\n    const total = this.tokenUsageHistory.reduce(\n      (acc, usage) => ({\n        promptTokens: acc.promptTokens + usage.promptTokens,\n        completionTokens: acc.completionTokens + usage.completionTokens,\n        totalTokens: acc.totalTokens + usage.totalTokens,\n      }),\n      { promptTokens: 0, completionTokens: 0, totalTokens: 0 }\n    );\n\n    return {\n      ...total,\n      modelName: this.modelName,\n      timestamp: new Date(),\n    };\n  }\n\n  reset(): void {\n    this.currentTokenUsage = undefined;\n    this.tokenUsageHistory = [];\n  }\n}\n\n/**\n * Calculate cost based on token usage and model with dynamic pricing\n */\nexport async function calculateTokenCost(\n  tokenUsage: TokenUsage,\n  modelName?: string\n): Promise<CostCalculation> {\n  const model = modelName || tokenUsage.modelName || 'gpt-4o-mini';\n  const pricingManager = ModelPricingManager.getInstance();\n  const pricing = await pricingManager.getPricing(model);\n\n  const promptCost = (tokenUsage.promptTokens / 1000) * pricing.prompt;\n  const completionCost =\n    (tokenUsage.completionTokens / 1000) * pricing.completion;\n\n  return {\n    promptCost,\n    completionCost,\n    totalCost: promptCost + completionCost,\n    currency: 'USD',\n  };\n}\n\n/**\n * Synchronous version of calculateTokenCost using cached pricing\n */\nexport function calculateTokenCostSync(\n  tokenUsage: TokenUsage,\n  modelName?: string\n): CostCalculation {\n  const model = modelName || tokenUsage.modelName || 'gpt-4o-mini';\n  const pricingManager = ModelPricingManager.getInstance();\n  const pricing = pricingManager.getPricingSync(model);\n\n  const promptCost = (tokenUsage.promptTokens / 1000) * pricing.prompt;\n  const completionCost =\n    (tokenUsage.completionTokens / 1000) * pricing.completion;\n\n  return {\n    promptCost,\n    completionCost,\n    totalCost: promptCost + completionCost,\n    currency: 'USD',\n  };\n}\n\n/**\n * Format cost for display\n */\nexport function formatCost(\n  cost: CostCalculation,\n  precision: number = 6\n): string {\n  return `$${cost.totalCost.toFixed(precision)} ${cost.currency}`;\n}\n\n/**\n * Estimate tokens from text (rough approximation)\n */\nexport function estimateTokens(text: string): number {\n  return Math.ceil(text.length / 4);\n}\n","import {\n  AccountId,\n  PublicKey,\n  Transaction,\n  TransactionReceipt,\n  PrivateKey,\n  Client,\n} from '@hashgraph/sdk';\nimport {\n  HederaMirrorNode,\n  Logger as StandardsSdkLogger,\n  NetworkType as StandardsSdkNetworkType,\n} from '@hashgraphonline/standards-sdk';\nimport { HederaNetworkType } from '../types';\n\n/**\n * AbstractSigner provides a common interface and shared functionality for different signing mechanisms.\n * Concrete implementations will handle specifics for server-side, browser (WalletConnect), etc.\n */\nexport abstract class AbstractSigner {\n  public mirrorNode!: HederaMirrorNode;\n\n  /**\n   * Retrieves the Hedera account ID associated with this signer.\n   * This must be implemented by concrete classes.\n   * @returns {AccountId} The Hedera AccountId object.\n   */\n  public abstract getAccountId(): AccountId;\n\n  /**\n   * Retrieves the public key associated with this signer's account using the Hedera Mirror Node.\n   * This method relies on the `mirrorNode` property being initialized by the concrete signer.\n   * @returns {Promise<PublicKey>} A promise that resolves to the Hedera PublicKey object.\n   * @throws {Error} If the public key cannot be retrieved from the mirror node or if mirrorNode is not initialized.\n   */\n  public async getPublicKey(): Promise<PublicKey> {\n    if (!this.mirrorNode) {\n      throw new Error(\n        'AbstractSigner: HederaMirrorNode has not been initialized by the concrete signer implementation. This is an internal error.'\n      );\n    }\n    const accountIdToQuery = this.getAccountId();\n    try {\n      return await this.mirrorNode.getPublicKey(accountIdToQuery.toString());\n    } catch (error) {\n      const errorMessage =\n        error instanceof Error ? error.message : String(error);\n      throw new Error(\n        `Failed to retrieve public key from mirror node for account ${accountIdToQuery.toString()}: ${errorMessage}`\n      );\n    }\n  }\n\n  /**\n   * Signs and executes a Hedera transaction, returning its receipt.\n   * Concrete implementations will manage their own client interactions for this process.\n   * @param {Transaction} transaction - The transaction to sign and execute.\n   * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n   */\n  public abstract signAndExecuteTransaction(\n    transaction: Transaction\n  ): Promise<TransactionReceipt>;\n\n  /**\n   * Retrieves the Hedera network type this signer is configured for.\n   * This must be implemented by concrete classes.\n   * @returns {HederaNetworkType} The configured Hedera network type ('mainnet' or 'testnet').\n   */\n  public abstract getNetwork(): HederaNetworkType;\n\n  /**\n   * Retrieves the operator's private key.\n   * This is needed by HederaAgentKit to set the operator on its internal client.\n   * Concrete implementations must provide this.\n   * @returns {PrivateKey} The operator's private key.\n   */\n  public abstract getOperatorPrivateKey(): PrivateKey;\n\n  /**\n   * Retrieves the client instance configured for this signer.\n   * This is needed for operations like freezing transactions with the correct payer.\n   * @returns {Client} The Hedera Client object.\n   */\n  public abstract getClient(): Client;\n\n  /**\n   * Initializes the HederaMirrorNode instance for the signer.\n   * Concrete classes must call this in their constructor.\n   * @param {HederaNetworkType} network - The network for the mirror node.\n   * @param {string} moduleName - A descriptive name for the logger module (e.g., 'ServerSigner', 'BrowserSigner').\n   */\n  protected initializeMirrorNode(\n    network: HederaNetworkType,\n    moduleName: string\n  ): void {\n    this.mirrorNode = new HederaMirrorNode(\n      network as StandardsSdkNetworkType,\n      new StandardsSdkLogger({\n        level: 'info',\n        module: `${moduleName}-MirrorNode`,\n      })\n    );\n  }\n}\n","import BigNumber from 'bignumber.js';\nimport {\n  PublicKey,\n  AccountId,\n  TopicId,\n  PrivateKey,\n  CustomFee,\n  TokenType,\n  TokenSupplyType,\n  TokenId,\n  Long,\n  NftId,\n  CustomFixedFee,\n  Key,\n  FileId,\n  ContractFunctionParameters,\n  KeyList,\n  ContractId,\n  Hbar,\n  EvmAddress,\n  PendingAirdropId,\n  TransactionId,\n  ScheduleId,\n} from '@hashgraph/sdk';\n\nexport {\n  PublicKey,\n  AccountId,\n  TopicId,\n  PrivateKey,\n  CustomFee,\n  TokenType,\n  TokenSupplyType,\n  TokenId,\n  Long,\n  NftId,\n  CustomFixedFee,\n  Key,\n  FileId,\n  ContractFunctionParameters,\n  KeyList,\n  ContractId,\n  Hbar,\n  EvmAddress,\n  PendingAirdropId,\n  TransactionId,\n  ScheduleId,\n};\n\nexport type AgentOperationalMode = 'directExecution' | 'provideBytes';\nexport type HederaNetworkType = 'mainnet' | 'testnet';\n\n/**\n * Configuration for custom mirror node providers.\n *\n * @example\n * // Using HGraph with API key in URL\n * const config = {\n *   customUrl: 'https://mainnet.hedera.api.hgraph.dev/v1/<API-KEY>',\n *   apiKey: 'your-api-key-here'\n * };\n *\n * @example\n * // Using custom provider with API key in headers\n * const config = {\n *   customUrl: 'https://custom-mirror-node.com',\n *   apiKey: 'your-api-key',\n *   headers: {\n *     'X-Custom-Header': 'value'\n *   }\n * };\n */\nexport interface MirrorNodeConfig {\n  /** Custom mirror node URL. Can include <API-KEY> placeholder for URL-based API keys. */\n  customUrl?: string;\n  /** API key for authentication. Will be used in both Authorization header and URL replacement. */\n  apiKey?: string;\n  /** Additional custom headers to include with requests. */\n  headers?: Record<string, string>;\n}\n\nexport type TokenBalance = {\n  account: string;\n  balance: number;\n  decimals: number;\n};\n\nexport type TokenHoldersBalancesApiResponse = {\n  timestamp: string;\n  balances: TokenBalance[];\n  links: {\n    next: string;\n  };\n};\n\nexport type DetailedTokenBalance = {\n  tokenId: string;\n  tokenSymbol: string;\n  tokenName: string;\n  tokenDecimals: string;\n  balance: number;\n  balanceInDisplayUnit: BigNumber;\n  timestamp: string;\n  balances: {\n    account: string;\n    balance: number;\n    tokens: {\n      token_id: string;\n      balance: number;\n    }[];\n  }[];\n  links: {\n    next: string | null;\n  };\n};\n\nexport type HtsTokenBalanceApiReponse = {\n  timestamp: string;\n  balances: TokenBalance[];\n  links: {\n    next: string;\n  };\n};\n\ntype ProtobufEncodedKey = {\n  _type: 'ProtobufEncoded';\n  key: string;\n};\n\ntype CustomFees = {\n  created_timestamp: string;\n  fixed_fees: any[];\n  fractional_fees: any[];\n};\n\nexport type HtsTokenDetails = {\n  admin_key: ProtobufEncodedKey;\n  auto_renew_account: string;\n  auto_renew_period: number;\n  created_timestamp: string;\n  custom_fees: CustomFees;\n  decimals: string;\n  deleted: boolean;\n  expiry_timestamp: number;\n  fee_schedule_key: ProtobufEncodedKey;\n  freeze_default: boolean;\n  freeze_key: ProtobufEncodedKey;\n  initial_supply: string;\n  kyc_key: ProtobufEncodedKey;\n  max_supply: string;\n  memo: string;\n  metadata: string;\n  metadata_key: ProtobufEncodedKey | null;\n  modified_timestamp: string;\n  name: string;\n  pause_key: ProtobufEncodedKey;\n  pause_status: 'PAUSED' | 'UNPAUSED';\n  supply_key: ProtobufEncodedKey;\n  supply_type: 'FINITE' | 'INFINITE';\n  symbol: string;\n  token_id: string;\n  total_supply: string;\n  treasury_account_id: string;\n  type: 'FUNGIBLE_COMMON' | 'NON_FUNGIBLE_UNIQUE';\n  wipe_key: ProtobufEncodedKey;\n  supplyType: TokenSupplyType;\n  maxSupply?: number | BigNumber;\n};\n\nexport type AllTokensBalancesApiResponse = {\n  timestamp: string;\n  balances: {\n    account: string; // Account ID in the format \"0.0.x\"\n    balance: number; // Total balance equivalent in HBAR\n    tokens: {\n      token_id: string; // Token ID in the format \"0.0.x\"\n      balance: number; // Balance of the specific token\n    }[];\n  }[];\n  links: {\n    next: string | null; // link to next page\n  };\n};\n\nexport type Airdrop = {\n  amount: number;\n  receiver_id: string;\n  sender_id: string;\n  token_id: string;\n};\n\nexport type PendingAirdropsApiResponse = {\n  airdrops: Airdrop[];\n  links: {\n    next: string | null;\n  };\n};\n\ntype TimestampRange = {\n  from: string;\n  to?: string | null;\n};\n\nexport type TopicInfoApiResponse = {\n  admin_key?: Key | null;\n  auto_renew_account?: string | null;\n  auto_renew_period?: number | null;\n  created_timestamp?: string | null;\n  deleted?: boolean | null;\n  memo?: string;\n  submit_key?: Key | null;\n  timestamp?: TimestampRange;\n  topic_id?: string | null;\n};\n\nexport type HCSMessage = {\n  chunk_info: null | any;\n  consensus_timestamp: string;\n  message: string;\n  payer_account_id: string;\n  running_hash: string;\n  running_hash_version: number;\n  sequence_number: number;\n  topic_id: string;\n  supplyType: TokenSupplyType;\n  maxSupply?: number | BigNumber;\n};\n\nexport type HCSMessageApiResponse = {\n  messages: HCSMessage[];\n  links: {\n    next: string | null;\n  };\n};\n\nexport enum AgentKitActionName {\n  CREATE_TOPIC_CUSTODIAL = 'createTopicCustodial',\n  CREATE_TOPIC_NON_CUSTODIAL = 'createTopicNonCustodial',\n  DELETE_TOPIC_CUSTODIAL = 'deleteTopicCustodial',\n  DELETE_TOPIC_NON_CUSTODIAL = 'deleteTopicNonCustodial',\n  SUBMIT_TOPIC_MESSAGE_CUSTODIAL = 'submitTopicMessageCustodial',\n  SUBMIT_TOPIC_MESSAGE_NON_CUSTODIAL = 'submitTopicMessageCustodial',\n  CREATE_TOKEN_CUSTODIAL = 'createTokenCustodial',\n  CREATE_TOKEN_NON_CUSTODIAL = 'createTokenNonCustodial',\n  ASSOCIATE_TOKEN_CUSTODIAL = 'associateTokenCustodial',\n  ASSOCIATE_TOKEN_NON_CUSTODIAL = 'associateTokenNonCustodial',\n  DISSOCIATE_TOKEN_CUSTODIAL = 'dissociateTokenCustodial',\n  DISSOCIATE_TOKEN_NON_CUSTODIAL = 'dissociateTokenNonCustodial',\n  AIRDROP_TOKEN_CUSTODIAL = 'airdropTokenCustodial',\n  AIRDROP_TOKEN_NON_CUSTODIAL = 'airdropTokenNonCustodial',\n  REJECT_TOKEN_CUSTODIAL = 'rejectedTokenCustodial',\n  REJECT_TOKEN_NON_CUSTODIAL = 'rejectedTokenNonCustodial',\n  MINT_TOKEN_CUSTODIAL = 'mintTokenCustodial',\n  MINT_TOKEN_NON_CUSTODIAL = 'mintTokenNonCustodial',\n  MINT_NFT_TOKEN_CUSTODIAL = 'mintNFTTokenCustodial',\n  MINT_NFT_TOKEN_NON_CUSTODIAL = 'mintNFTTokenNonCustodial',\n  CLAIM_AIRDROP_CUSTODIAL = 'claimAirdropCustodial',\n  CLAIM_AIRDROP_NON_CUSTODIAL = 'claimAirdropNonCustodial',\n  TRANSFER_TOKEN_CUSTODIAL = 'transferTokenCustodial',\n  TRANSFER_TOKEN_NON_CUSTODIAL = 'transferTokenNonCustodial',\n  TRANSFER_HBAR_CUSTODIAL = 'transferHbarCustodial',\n  TRANSFER_HBAR_NON_CUSTODIAL = 'transferHbarNonCustodial',\n  ASSET_ALLOWANCE_CUSTODIAL = 'assetAllowedCustodial',\n  ASSET_ALLOWANCE_NON_CUSTODIAL = 'assetAllowedNonCustodial',\n}\n\n/**\n * Parameters for creating a new Hedera Consensus Service (HCS) topic.\n */\nexport interface CreateTopicParams {\n  /** Optional. The publicly visible memo for the topic. */\n  memo?: string;\n  /**\n   * Optional. The administrative key for the topic.\n   * Can be a PrivateKey string (for the builder to derive public key and potentially sign if different from operator)\n   * or a PublicKey object.\n   * If not provided, the topic might be immutable depending on Hedera defaults, or operator may become admin.\n   */\n  adminKey?: string | Key;\n  /**\n   * Optional. The key authorized to submit messages to the topic.\n   * Can be a PrivateKey string or a PublicKey object.\n   * If not provided, anyone can submit.\n   */\n  submitKey?: string | Key;\n  /**\n   * Optional. The auto-renewal period for the topic, in seconds.\n   * Defaults to 7776000 (approximately 90 days) if not specified by the user; the builder will apply this default.\n   */\n  autoRenewPeriod?: number;\n  /**\n   * Optional. The account ID to be used for auto-renewal payments.\n   * If not provided, and if an adminKey is the current signer, the signer's account may be used by default by Hedera.\n   * Can be an AccountId object or a string representation (e.g., \"0.0.xxxx\").\n   */\n  autoRenewAccountId?: string | AccountId;\n  /** Optional. The key which can change the token's custom fee schedule. If not set, the adminKey may control this. */\n  feeScheduleKey?: string | Key;\n  /** Optional. A list of account IDs that should be exempt from custom fees. */\n  exemptAccountIds?: string[];\n  /** Optional. A list of custom fees to be applied to the topic. */\n  customFees?: CustomFixedFee[];\n}\n\n/**\n * Parameters for submitting a message to an HCS topic.\n */\nexport interface SubmitMessageParams {\n  /** The ID of the topic to submit the message to. */\n  topicId: string | TopicId;\n  /** The message content. Can be a string or Uint8Array for binary data. */\n  message: string | Uint8Array;\n  /**\n   * Optional. The maximum number of chunks to divide the message into if it exceeds single transaction limits.\n   * The builder will handle chunking if necessary.\n   */\n  maxChunks?: number;\n  /**\n   * Optional. The size of each chunk in bytes if chunking is performed.\n   * Defaults to a reasonable value (e.g., 1024 bytes) if not specified and chunking is needed.\n   */\n  chunkSize?: number;\n  /**\n   * Optional. A specific private key to sign message submission if the topic requires it\n   * and it's different from the main operator/signer.\n   * Can be a PrivateKey object or its string representation.\n   */\n  submitKey?: string | PrivateKey;\n}\n\n/**\n * Parameters for deleting an HCS topic.\n */\nexport interface DeleteTopicParams {\n  /** The ID of the topic to be deleted. */\n  topicId: string | TopicId;\n}\n\n/**\n * Represents a single hbar transfer operation.\n * Amount is in hbars (positive for credit, negative for debit).\n */\nexport interface HbarTransfer {\n  accountId: string | AccountId;\n  amount: Hbar;\n}\n\n/**\n * Parameters for an HBAR transfer operation, potentially involving multiple accounts.\n * The sum of all transfer amounts must be zero.\n */\nexport interface HbarTransferParams {\n  transfers: HbarTransfer[];\n  /** Optional memo for the transaction. */\n  memo?: string;\n}\n\n/**\n * Parameters for creating a new Hedera Fungible Token.\n */\nexport interface FTCreateParams {\n  /** The publicly visible name of the token. Max 100 characters. */\n  tokenName: string;\n  /** The publicly visible symbol of the token. Max 100 characters. */\n  tokenSymbol: string;\n  /** The account which will act as a treasury for the token. This account will receive the initial supply. */\n  treasuryAccountId: string | AccountId;\n  /** The initial supply of tokens to be minted to the treasury account. In the smallest denomination. */\n  initialSupply: number | BigNumber;\n  /** The number of decimal places a token is divisible by. */\n  decimals: number;\n  /** The key which can perform update/delete operations on the token. */\n  adminKey?: string | Key;\n  /** The key which can grant or revoke KYC of an account for the token. */\n  kycKey?: string | Key;\n  /** The key which can sign to freeze or unfreeze an account for token transactions. */\n  freezeKey?: string | Key;\n  /** The key which can wipe the token balance of an account. */\n  wipeKey?: string | Key;\n  /** The key which can change the total supply of a token. */\n  supplyKey?: string | Key;\n  /** The key which can change the token's custom fee schedule. */\n  feeScheduleKey?: string | Key;\n  /** The key which can pause or unpause the token. */\n  pauseKey?: string | Key;\n  /** The account which will be automatically charged to renew the token's expiration. */\n  autoRenewAccountId?: string | AccountId;\n  /** The period that the auto-renew account will be charged to extend the token's expiry. In seconds. Defaults to 7776000 (90 days). */\n  autoRenewPeriod?: number;\n  /** The memo associated with the token. Max 100 characters. */\n  memo?: string;\n  /** The default freeze status (frozen or unfrozen) of accounts signed up for this token. Defaults to false (unfrozen). */\n  freezeDefault?: boolean;\n  /** The custom fees to be assessed during atomic swaps for this token. */\n  customFees?: CustomFee[] | undefined;\n  /** The supply type of the token (Finite or Infinite). */\n  supplyType: TokenSupplyType;\n  /** The maximum number of tokens that can be in circulation. Required if supplyType is Finite. */\n  maxSupply?: number | BigNumber;\n}\n\n/**\n * Parameters for creating a new Hedera Non-Fungible Token (NFT).\n */\nexport interface NFTCreateParams {\n  /** The publicly visible name of the token. Max 100 characters. */\n  tokenName: string;\n  /** The publicly visible symbol of the token. Max 100 characters. */\n  tokenSymbol: string;\n  /** The account which will act as a treasury for the token. */\n  treasuryAccountId: string | AccountId;\n  /** The key which can perform update/delete operations on the token. */\n  adminKey?: string | Key;\n  /** The key which can grant or revoke KYC of an account for the token. */\n  kycKey?: string | Key;\n  /** The key which can sign to freeze or unfreeze an account for token transactions. */\n  freezeKey?: string | Key;\n  /** The key which can wipe the token balance of an account. */\n  wipeKey?: string | Key;\n  /** The key which can change the total supply of a token (mint/burn). */\n  supplyKey?: string | Key;\n  /** The key which can change the token's custom fee schedule. */\n  feeScheduleKey?: string | Key;\n  /** The key which can pause or unpause the token. */\n  pauseKey?: string | Key;\n  /** The account which will be automatically charged to renew the token's expiration. */\n  autoRenewAccountId?: string | AccountId;\n  /** The period that the auto-renew account will be charged to extend the token's expiry. In seconds. Defaults to 7776000 (90 days). */\n  autoRenewPeriod?: number;\n  /** The memo associated with the token. Max 100 characters. */\n  memo?: string;\n  /** The default freeze status (frozen or unfrozen) of accounts signed up for this token. Defaults to false (unfrozen). */\n  freezeDefault?: boolean;\n  /** The custom fees to be assessed. Instances of FixedFee, FractionalFee, RoyaltyFee (all extend CustomFee). */\n  customFees?: CustomFee[];\n  /** The supply type, typically Finite for NFTs. Max supply also needed for Finite. */\n  supplyType: TokenSupplyType; // e.g., TokenSupplyType.Finite\n  /** The maximum number of NFTs that can be minted. Required if supplyType is Finite. */\n  maxSupply?: number | BigNumber; // BigNumber for consistency, though NFTs are u64\n}\n\n/**\n * Parameters for minting new NFTs for a given NFT token.\n */\nexport interface MintNFTParams {\n  /** The ID of the NFT token to mint for. */\n  tokenId: string | TokenId;\n  /** An array of metadata for each NFT to be minted. Each Uint8Array is one NFT's metadata (max 100 bytes each). */\n  metadata: Uint8Array[];\n  /** Optional. The batch size for minting transactions if many NFTs are minted. Defaults to 10. */\n  batchSize?: number;\n  nftId: NftId;\n  senderAccountId: string | AccountId;\n  receiverAccountId: string | AccountId;\n  isApproved?: boolean;\n  memo?: string;\n}\n\n/**\n * Parameters for updating an existing HCS topic.\n * All fields are optional except topicId. Providing `null` to a key field typically clears it.\n * Using an empty string for memo clears it.\n */\nexport interface UpdateTopicParams {\n  /** The ID of the topic to update. */\n  topicId: string | TopicId;\n  /** New memo for the topic. An empty string effectively clears the memo. `null` can also be used to signal clearing. */\n  memo?: string | null;\n  /** New admin key for the topic. `null` to clear the admin key (if permissible). */\n  adminKey?: string | Key | null;\n  /** New submit key for the topic. `null` to clear the submit key. */\n  submitKey?: string | Key | null;\n  /** New auto-renewal period in seconds. */\n  autoRenewPeriod?: number;\n  /** New account ID for auto-renewal. `null` to clear the auto-renew account. */\n  autoRenewAccountId?: string | AccountId | null;\n  /** New fee schedule key for the topic. `null` to clear. */\n  feeScheduleKey?: string | Key | null;\n  /** Optional. A list of account IDs that should be exempt from custom fees. This will overwrite any existing exemptions. To clear all exemptions, provide an empty array. */\n  exemptAccountIds?: string[];\n}\n\n/**\n * Parameters for minting more fungible tokens.\n */\nexport interface MintFTParams {\n  /** The ID of the fungible token to mint for. */\n  tokenId: string | TokenId;\n  /** The amount of tokens to mint, in the smallest unit of the token. */\n  amount: number | BigNumber;\n}\n\n/**\n * Parameters for burning fungible tokens.\n */\nexport interface BurnFTParams {\n  /** The ID of the fungible token to burn. */\n  tokenId: string | TokenId;\n  /** The amount of tokens to burn, in the smallest unit of the token. */\n  amount: number | BigNumber;\n}\n\n/**\n * Parameters for burning Non-Fungible Tokens.\n */\nexport interface BurnNFTParams {\n  /** The ID of the NFT token whose serials are to be burned. */\n  tokenId: string | TokenId;\n  /** An array of serial numbers to burn. Values can be number, Long, or BigNumber for large serials. */\n  serials: Array<number | Long | BigNumber>;\n}\n\n/**\n * Parameters for transferring a single Non-Fungible Token (NFT).\n */\nexport interface TransferNFTParams {\n  /** The specific NFT to transfer, identified by its token ID and serial number. */\n  nftId: NftId; // Using NftId directly, e.g., TokenId.fromString(id).nft(serial)\n  /** The account ID of the sender. */\n  senderAccountId: string | AccountId;\n  /** The account ID of the receiver. */\n  receiverAccountId: string | AccountId;\n  /**\n   * Optional. Set to true if the sender is not the owner of the NFT but is an approved operator for it (or for all of owner's NFTs).\n   * Defaults to false, indicating the sender is the owner.\n   */\n  isApproved?: boolean;\n  /** Optional memo for the transaction. */\n  memo?: string;\n}\n\n/**\n * Parameters for associating tokens with an account.\n */\nexport interface AssociateTokensParams {\n  /** The account ID to associate tokens with. */\n  accountId: string | AccountId;\n  /** An array of token IDs to associate. */\n  tokenIds: Array<string | TokenId>;\n  initialBalance?: number | BigNumber | undefined;\n  key: string | PublicKey;\n  memo?: string;\n  autoRenewAccountId?: string | AccountId;\n  autoRenewPeriod?: number;\n  receiverSignatureRequired?: boolean;\n  maxAutomaticTokenAssociations?: number;\n  stakedAccountId?: string | AccountId;\n  stakedNodeId?: number | Long;\n  declineStakingReward?: boolean;\n  alias?: EvmAddress | string;\n}\n\n/**\n * Parameters for dissociating tokens from an account.\n */\nexport interface DissociateTokensParams {\n  /** The account ID to dissociate tokens from. */\n  accountId: string | AccountId;\n  /** An array of token IDs to dissociate. */\n  tokenIds: Array<string | TokenId>;\n}\n\n/**\n * Represents a single fungible token transfer operation.\n * Amount is in the smallest unit (positive for credit, negative for debit).\n */\nexport interface FungibleTokenTransferSpec {\n  type: 'fungible';\n  tokenId: string | TokenId;\n  accountId: string | AccountId;\n  amount: number | BigNumber;\n}\n\n/**\n * Represents a single non-fungible token (NFT) transfer operation.\n */\nexport interface NonFungibleTokenTransferSpec {\n  type: 'nft';\n  nftId: NftId;\n  senderAccountId: string | AccountId;\n  receiverAccountId: string | AccountId;\n  isApproved?: boolean;\n}\n\n/**\n * Union type for different kinds of token transfers.\n */\nexport type TokenTransferSpec =\n  | FungibleTokenTransferSpec\n  | NonFungibleTokenTransferSpec;\n\n/**\n * Parameters for a generic token transfer operation, potentially involving multiple tokens and NFTs.\n */\nexport interface TransferTokensParams {\n  /** An array of token transfer specifications (fungible or NFT). */\n  tokenTransfers: TokenTransferSpec[];\n  /** Optional. An array of HBAR transfer specifications. */\n  hbarTransfers?: HbarTransfer[];\n  /** Optional memo for the transaction. */\n  memo?: string;\n}\n\n/**\n * Parameters for wiping tokens (fungible or non-fungible) from an account.\n */\nexport interface WipeTokenAccountParams {\n  /** The ID of the token to wipe. */\n  tokenId: string | TokenId;\n  /** The account ID from which tokens will be wiped. */\n  accountId: string | AccountId;\n  /** For Fungible Tokens: the amount to wipe. In the smallest unit. */\n  amount?: number | BigNumber;\n  /** For Non-Fungible Tokens: an array of serial numbers to wipe. */\n  serials?: Array<number | Long | BigNumber>;\n}\n\n/**\n * Parameters for freezing an account for a specific token.\n */\nexport interface FreezeTokenAccountParams {\n  /** The ID of the token. */\n  tokenId: string | TokenId;\n  /** The account ID to be frozen for the token. */\n  accountId: string | AccountId;\n}\n\n/**\n * Parameters for unfreezing an account for a specific token.\n */\nexport interface UnfreezeTokenAccountParams {\n  /** The ID of the token. */\n  tokenId: string | TokenId;\n  /** The account ID to be unfrozen for the token. */\n  accountId: string | AccountId;\n}\n\n/**\n * Parameters for granting KYC to an account for a specific token.\n */\nexport interface GrantKycTokenParams {\n  /** The ID of the token. */\n  tokenId: string | TokenId;\n  /** The account ID to be granted KYC for the token. */\n  accountId: string | AccountId;\n}\n\n/**\n * Parameters for revoking KYC from an account for a specific token.\n */\nexport interface RevokeKycTokenParams {\n  /** The ID of the token. */\n  tokenId: string | TokenId;\n  /** The account ID to have KYC revoked for the token. */\n  accountId: string | AccountId;\n}\n\n/**\n * Parameters for pausing a token.\n */\nexport interface PauseTokenParams {\n  /** The ID of the token to pause. */\n  tokenId: string | TokenId;\n}\n\n/**\n * Parameters for unpausing a token.\n */\nexport interface UnpauseTokenParams {\n  /** The ID of the token to unpause. */\n  tokenId: string | TokenId;\n}\n\n/**\n * Parameters for updating an existing Hedera token (fungible or non-fungible).\n * All fields are optional except `tokenId`. Providing `null` to a key field clears it.\n * Using an empty string for memo/name/symbol clears them if applicable by SDK.\n */\nexport interface UpdateTokenParams {\n  /** The ID of the token to update. */\n  tokenId: string | TokenId;\n  /** New name for the token. */\n  tokenName?: string | null; // null or empty to clear/reset if SDK allows\n  /** New symbol for the token. */\n  tokenSymbol?: string | null; // null or empty to clear/reset if SDK allows\n  /** New treasury account for the token. */\n  treasuryAccountId?: string | AccountId;\n  /** New admin key for the token. `null` to clear. */\n  adminKey?: string | Key | null;\n  /** New KYC key for the token. `null` to clear. */\n  kycKey?: string | Key | null;\n  /** New freeze key for the token. `null` to clear. */\n  freezeKey?: string | Key | null;\n  /** New wipe key for the token. `null` to clear. */\n  wipeKey?: string | Key | null;\n  /** New supply key for the token. `null` to clear. */\n  supplyKey?: string | Key | null;\n  /** New fee schedule key for the token. `null` to clear. */\n  feeScheduleKey?: string | Key | null;\n  /** New pause key for the token. `null` to clear. */\n  pauseKey?: string | Key | null;\n  /** New auto-renew account for the token. `null` to clear. */\n  autoRenewAccountId?: string | AccountId | null;\n  /** New auto-renewal period in seconds. */\n  autoRenewPeriod?: number;\n  /** New memo for the token. An empty string or `null` to clear. */\n  memo?: string | null;\n  // Note: Custom fees are not updated via TokenUpdateTransaction. Use TokenFeeScheduleUpdateTransaction.\n}\n\n/**\n * Parameters for deleting a token.\n */\nexport interface DeleteTokenParams {\n  /** The ID of the token to delete. */\n  tokenId: string | TokenId;\n}\n\n/**\n * Parameters for updating the fee schedule of a token.\n */\nexport interface TokenFeeScheduleUpdateParams {\n  /** The ID of the token whose fee schedule is to be updated. */\n  tokenId: string | TokenId;\n  /** An array of new custom fees for the token. This will replace the existing fee schedule. */\n  customFees: CustomFee[];\n}\n\n/**\n * Parameters for creating a new Hedera account.\n */\nexport interface CreateAccountParams {\n  /** The initial balance of the new account in HBAR. Defaults to 0 if not specified. */\n  initialBalance?: number | BigNumber | undefined;\n  /**\n   * The public key for the new account.\n   * Can be a PublicKey object or a string representation of a PrivateKey\n   * from which the PublicKey will be derived by the builder.\n   * If a PrivateKey string is provided, it is used ONLY to derive the public key for account creation\n   * and is NOT stored or used for signing by the builder itself.\n   */\n  key: string | PublicKey;\n  /** Optional. The memo for the account. */\n  memo?: string;\n  /** Optional. The account to be used for auto-renewal payments. */\n  autoRenewAccountId?: string | AccountId;\n  /** Optional. The auto-renewal period for the account, in seconds. Defaults to ~90 days. */\n  autoRenewPeriod?: number;\n  /** Optional. If true, the account must sign any transaction transferring hbar out of this account. Defaults to false. */\n  receiverSignatureRequired?: boolean;\n  /** Optional. The maximum number of tokens that an Account can be implicitly associated with. Defaults to 0. */\n  maxAutomaticTokenAssociations?: number;\n  /** Optional. The account to which this account is staked. */\n  stakedAccountId?: string | AccountId;\n  /** Optional. The node ID to which this account is staked. */\n  stakedNodeId?: number | Long;\n  /** Optional. If true, the account declines receiving a staking reward. Defaults to false. */\n  declineStakingReward?: boolean;\n  /** Optional. The alias for the account. If an alias is set, the key property is not used. */\n  alias?: EvmAddress | string; // string could be an EVM address string\n}\n\n/**\n * Parameters for querying a smart contract function (local call).\n */\nexport interface ContractCallQueryParams {\n  /** The ID of the contract to call. */\n  contractId: string | ContractId;\n  /** The gas to use for the query. Often less critical for local queries but can be set. */\n  gas?: number | Long; // Optional, as SDK might default or it might not be needed for all local queries\n  /** The function name and optionally its parameter types, e.g., \"getBalance(address)\". */\n  functionName: string;\n  /** The parameters to pass to the function. */\n  functionParameters?: ContractFunctionParameters;\n  /** Optional: The maximum payment allowed for this query. If not set, defaults to a value set by the SDK or node. */\n  maxQueryPayment?: Hbar;\n  /** Optional: Payment transaction ID for this query. */\n  paymentTransactionId?: string | TransactionId;\n}\n\n/**\n * Parameters for creating a new smart contract.\n */\nexport interface CreateContractParams {\n  /** The ID of the file containing the contract bytecode. Use this OR `bytecode`. */\n  bytecodeFileId?: string | FileId;\n  /** The contract bytecode as a hex-encoded string or Uint8Array. Use this OR `bytecodeFileId`. */\n  bytecode?: string | Uint8Array;\n  /** The admin key for the contract. */\n  adminKey?: string | Key;\n  /** The gas to deploy the contract. */\n  gas: number | Long;\n  /** Initial balance to send to the contract (payable constructor). In HBAR. */\n  initialBalance?: number | BigNumber;\n  /** The parameters to pass to the constructor. */\n  constructorParameters?: Uint8Array | ContractFunctionParameters;\n  /** Memo for the contract creation transaction. */\n  memo?: string;\n  /** Auto-renewal period for the contract. In seconds. */\n  autoRenewPeriod?: number;\n  /** Account to which this contract is staked. */\n  stakedAccountId?: string | AccountId;\n  /** Node ID to which this contract is staked. */\n  stakedNodeId?: number | Long;\n  /** If true, the contract declines receiving a staking reward. */\n  declineStakingReward?: boolean;\n  /** Max automatic token associations for the contract. */\n  maxAutomaticTokenAssociations?: number;\n  contractId: string | ContractId;\n  functionName: string;\n  functionParameters?: ContractFunctionParameters;\n  payableAmount?: number | BigNumber | Hbar;\n}\n\n/**\n * Parameters for executing a function of a smart contract.\n */\nexport interface ExecuteContractParams {\n  /** The ID of the contract to call. */\n  contractId: string | ContractId; // ContractId from SDK\n  /** The gas to use for the call. */\n  gas: number | Long;\n  /** The function to call. Can be just the name or name with parameters like \"functionName(uint32,string)\". */\n  functionName: string;\n  /** The parameters to pass to the function. */\n  functionParameters?: ContractFunctionParameters;\n  /** Amount of HBAR to send with the call (for payable functions). */\n  payableAmount?: number | BigNumber | Hbar;\n  /** Optional memo for the transaction. */\n  memo?: string;\n}\n\n/**\n * Parameters for creating a new file on Hedera File Service.\n */\nexport interface CreateFileParams {\n  /** The contents of the file. */\n  contents: string | Uint8Array;\n  /**\n   * The keys that must sign any transaction to modify or delete the file.\n   * If not set, the file is immutable (except for append if no keys are set at all).\n   * Each element can be a PrivateKey string (to derive PublicKey), a PublicKey object, or a KeyList object.\n   */\n  keys?: Array<string | Key | KeyList>;\n  /** A memo associated with the file. Max 100 characters. */\n  adminKey?: string | Key | null;\n  autoRenewPeriod?: number;\n  memo?: string | null;\n  stakedAccountId?: string | AccountId | '0.0.0' | null;\n  stakedNodeId?: number | Long | null;\n  declineStakingReward?: boolean;\n  maxAutomaticTokenAssociations?: number;\n  proxyAccountId?: string | AccountId | '0.0.0' | null;\n}\n\n/**\n * Parameters for appending content to an existing file on Hedera File Service.\n */\nexport interface AppendFileParams {\n  /** The ID of the file to append to. */\n  fileId: string | FileId;\n  /** The content to append. */\n  contents: string | Uint8Array;\n  /** Optional. The number of chunks to break the content into if it exceeds the transaction size limit. */\n  maxChunks?: number;\n  /** Optional. The size of each chunk in bytes. Defaults to a value like 4KB or 6KB minus overhead. */\n  chunkSize?: number;\n}\n\n/**\n * Parameters for updating the attributes of an existing file on Hedera File Service.\n * Note: This does not replace file contents; use FileAppend or recreate for that.\n */\nexport interface UpdateFileParams {\n  /** The ID of the file to update. */\n  fileId: string | FileId;\n  /** New keys for the file. An empty array can be used to remove all keys, making the file immutable. */\n  keys?: Array<string | Key | KeyList> | null; // null or empty array to clear keys\n  /** New memo for the file. An empty string or `null` to clear. */\n  memo?: string | null;\n  /** New contents for the file. */\n  contents?: string | Uint8Array;\n}\n\n/**\n * Parameters for deleting a file from Hedera File Service.\n */\nexport interface DeleteFileParams {\n  /** The ID of the file to delete. */\n  fileId: string | FileId;\n}\n\n/**\n * Parameters for updating an existing smart contract.\n * All fields are optional except `contractId`.\n */\nexport interface UpdateContractParams {\n  /** The ID of the contract to update. */\n  contractId: string | ContractId;\n  /** New admin key for the contract. `null` to clear. */\n  adminKey?: string | Key | null;\n  /** New auto-renewal period in seconds. */\n  autoRenewPeriod?: number;\n  /** New memo for the contract. An empty string or `null` to clear. */\n  memo?: string | null;\n  /** New account to which this contract is staked. `null` to unstake. */\n  stakedAccountId?: string | AccountId | '0.0.0' | null; // \"0.0.0\" to remove staking\n  /** New node ID to which this contract is staked. `-1` to remove staking. */\n  stakedNodeId?: number | Long | null;\n  /** If true, the contract declines receiving a staking reward. */\n  declineStakingReward?: boolean;\n  /** New max automatic token associations for the contract. */\n  maxAutomaticTokenAssociations?: number;\n  /** New proxy account ID for the contract. `null` or `\"0.0.0\"` to clear. */\n  proxyAccountId?: string | AccountId | '0.0.0' | null;\n  // Updating bytecode (bytecodeFileId) is not part of ContractUpdateTransaction.\n}\n\n/**\n * Parameters for deleting a smart contract.\n */\nexport interface DeleteContractParams {\n  /** The ID of the contract to delete. */\n  contractId: string | ContractId;\n  /**\n   * Optional. The account ID to transfer the contract's remaining HBAR balance to.\n   * Required if the contract has a non-zero balance. Use this OR `transferContractId`.\n   */\n  transferAccountId?: string | AccountId;\n  /**\n   * Optional. The contract ID to transfer the contract's remaining HBAR balance to.\n   * Required if the contract has a non-zero balance. Use this OR `transferAccountId`.\n   */\n  transferContractId?: string | ContractId;\n  // Note: If contract has balance, one of transferAccountId or transferContractId must be set.\n  // The builder method will need to enforce this or document it clearly.\n}\n\n/**\n * Parameters for updating an existing Hedera account.\n * All fields are optional except `accountIdToUpdate`.\n */\nexport interface UpdateAccountParams {\n  /** The ID of the account to update. */\n  accountIdToUpdate: string | AccountId;\n  /** New key for the account. `null` to clear (not typically allowed unless other conditions met). */\n  key?: string | Key | null;\n  /** New auto-renewal period in seconds. */\n  autoRenewPeriod?: number;\n  /** New memo for the account. An empty string or `null` to clear. */\n  memo?: string | null;\n  /** New max automatic token associations for the account. */\n  maxAutomaticTokenAssociations?: number;\n  /** New account to which this account is staked. \"0.0.0\" or `null` to remove staking. */\n  stakedAccountId?: string | AccountId | '0.0.0' | null;\n  /** New node ID to which this account is staked. `-1` or `null` to remove staking. */\n  stakedNodeId?: number | Long | null;\n  /** If true, the account declines receiving a staking reward. */\n  declineStakingReward?: boolean;\n  /** If true, the account must sign any transaction transferring hbar out of this account. */\n  receiverSignatureRequired?: boolean;\n  amount: number | Long;\n}\n\n/**\n * Parameters for deleting an account.\n */\nexport interface DeleteAccountParams {\n  /** The ID of the account to be deleted. This account must sign the transaction. */\n  deleteAccountId: string | AccountId;\n  /** The ID of the account to transfer the remaining HBAR balance to. */\n  transferAccountId: string | AccountId;\n}\n\n/**\n * Parameters for approving an HBAR allowance.\n */\nexport interface ApproveHbarAllowanceParams {\n  /** The account ID of the HBAR owner. Defaults to the operator/signer account ID if not provided. */\n  ownerAccountId?: string | AccountId;\n  /** The account ID of the spender who is being granted the allowance. */\n  spenderAccountId: string | AccountId;\n  /** The maximum HBAR amount that the spender can use from the owner's account. */\n  amount: Hbar;\n  /** Optional. A memo for the transaction. */\n  memo?: string;\n}\n\n/**\n * Parameters for approving an NFT allowance.\n */\nexport interface ApproveTokenNftAllowanceParams {\n  /** The account ID of the NFT owner. Defaults to the operator/signer account ID if not provided. */\n  ownerAccountId?: string | AccountId;\n  /** The account ID of the spender who is being granted the allowance. */\n  spenderAccountId: string | AccountId;\n  /** The ID of the NFT collection. */\n  tokenId: string | TokenId;\n  /** Optional. Specific serial numbers to approve. Use this OR `allSerials`. */\n  serials?: Array<number | Long | BigNumber>;\n  /** Optional. If true, approves the spender for all serials of the given NFT ID owned by the owner. Use this OR `serials`. */\n  allSerials?: boolean;\n  /** Optional. A memo for the transaction. */\n  memo?: string;\n}\n\n/**\n * Parameters for approving a fungible token allowance.\n */\nexport interface ApproveFungibleTokenAllowanceParams {\n  /** The account ID of the token owner. Defaults to the operator/signer account ID if not provided. */\n  ownerAccountId?: string | AccountId;\n  /** The account ID of the spender who is being granted the allowance. */\n  spenderAccountId: string | AccountId;\n  /** The ID of the fungible token. */\n  tokenId: string | TokenId;\n  /** The maximum amount of the token that the spender can use from the owner's account. In smallest unit. */\n  amount: number | BigNumber;\n  /** Optional. A memo for the transaction. */\n  memo?: string;\n}\n\n/**\n * Parameters for deleting all NFT allowances for a specific token collection granted by an owner.\n * This removes allowances for all spenders for all serials of the specified token type from this owner.\n */\nexport interface DeleteNftAllowanceAllSerialsParams {\n  /** The account ID of the NFT owner whose allowances are being deleted. Defaults to the operator/signer account ID if not provided. */\n  ownerAccountId?: string | AccountId;\n  /** The ID of the NFT collection (token ID) for which all serial allowances will be deleted. */\n  tokenId: string | TokenId;\n  /** Optional. A memo for the transaction. */\n  memo?: string;\n}\n\n/**\n * Parameters for revoking/clearing an HBAR allowance for a specific spender.\n */\nexport interface RevokeHbarAllowanceParams {\n  /** The account ID of the HBAR owner. Defaults to the operator/signer account ID if not provided. */\n  ownerAccountId?: string | AccountId;\n  /** The account ID of the spender whose HBAR allowance is to be revoked (set to zero). */\n  spenderAccountId: string | AccountId;\n  /** Optional. A memo for the transaction. */\n  memo?: string;\n}\n\n/**\n * Parameters for revoking/clearing a fungible token allowance for a specific spender.\n */\nexport interface RevokeFungibleTokenAllowanceParams {\n  /** The account ID of the token owner. Defaults to the operator/signer account ID if not provided. */\n  ownerAccountId?: string | AccountId;\n  /** The account ID of the spender whose token allowance is to be revoked (set to zero). */\n  spenderAccountId: string | AccountId;\n  /** The ID of the fungible token. */\n  tokenId: string | TokenId;\n  /** Optional. A memo for the transaction. */\n  memo?: string;\n}\n\n/**\n * Represents a recipient for a token airdrop.\n */\nexport interface AirdropRecipient {\n  /** The account ID of the recipient. */\n  accountId: string | AccountId;\n  /** The amount of tokens to send (in smallest denomination). */\n  amount: number | Long; // Consistent with other token amounts\n}\n\n/**\n * Parameters for airdropping fungible tokens from the operator's account.\n * The operator (signer) is implicitly the sender of all amounts.\n */\nexport interface AirdropTokenParams {\n  /** The ID of the fungible token to airdrop. */\n  tokenId: string | TokenId;\n  /** An array of recipient objects, each specifying an account and an amount. */\n  recipients: AirdropRecipient[];\n  /** Optional memo for the transaction. */\n  memo?: string;\n  pendingAirdropIds: PendingAirdropId[];\n}\n\n/**\n * Parameters for rejecting a pending airdrop or future tokens.\n */\nexport interface RejectAirdropParams {\n  /** The ID of the token that was airdropped. */\n  tokenId: string | TokenId;\n  /** Optional memo for the transaction. */\n  memo?: string;\n}\n\n/**\n * Parameters for claiming pending airdrops.\n */\nexport interface ClaimAirdropParams {\n  /** An array of SDK PendingAirdropId objects to claim. The operator (signer) is the recipient. */\n  pendingAirdropIds: PendingAirdropId[]; // Assuming PendingAirdropId is imported from @hashgraph/sdk\n  /** Optional memo for the transaction. */\n  memo?: string;\n}\n\n/**\n * Parameters for cancelling previously sent (but still pending) airdrops.\n */\nexport interface CancelAirdropParams {\n  /** An array of SDK PendingAirdropId objects to cancel. The operator (signer) must be the original sender. */\n  pendingAirdropIds: PendingAirdropId[]; // Assuming PendingAirdropId is imported from @hashgraph/sdk\n  /** Optional memo for the transaction. */\n  memo?: string;\n}\n\n/**\n * Parameters for rejecting future auto-associations with specified token types.\n */\nexport interface RejectFutureAssociationsParams {\n  // Implementation of this parameter is not provided in the original file or the code block\n  // This parameter is mentioned in the RejectAirdropParams, but its implementation is not clear\n  // It's assumed to exist as it's called in the RejectAirdropParams\n}\n\n/**\n * Parameters for signing a scheduled transaction.\n */\nexport interface SignScheduledTransactionParams {\n  /** The ID of the schedule to add a signature to. */\n  scheduleId: string | ScheduleId;\n  /** Optional memo for the ScheduleSign transaction itself. */\n  memo?: string;\n}\n\n/**\n * Parameters for querying topic information.\n */\nexport interface GetTopicInfoParams {\n  /** The ID of the topic to query. */\n  topicId: string | TopicId;\n  /** Optional. Maximum number of retries for the query. */\n  maxRetries?: number;\n}\n\n/**\n * Result of querying topic information.\n */\nexport interface TopicInfoResult {\n  topicId: string;\n  topicMemo: string;\n  runningHash: string; // hex encoded\n  sequenceNumber: string; // string representation of u64\n  expirationTime?: string; // ISO string format\n  adminKey?: string; // string representation of the key\n  autoRenewAccount?: string;\n  autoRenewPeriod?: string; // string representation of seconds\n  ledgerId?: string;\n}\n\n/**\n * Parameters for deleting/revoking NFT allowances for a *specific spender* for a token collection.\n * This uses AccountAllowanceDeleteTransaction.deleteAllTokenNftAllowances(tokenId, owner, spender).\n */\nexport interface DeleteNftSpenderAllowanceParams {\n  /** The account ID of the NFT owner. Defaults to the operator/signer account ID if not provided. */\n  ownerAccountId?: string | AccountId;\n  /** The ID of the NFT collection (token ID). */\n  nftId: string | NftId;\n  /** Optional. A memo for the transaction. */\n  memo?: string;\n}\n\n/**\n * Parameters for deleting/revoking NFT allowances for specific serials for a specific spender.\n */\nexport interface DeleteNftSpenderAllowanceToolParams {\n  ownerAccountId?: string | AccountId;\n  spenderAccountId: string | AccountId;\n  tokenId: string | TokenId;\n  serials: Array<number | string | Long>;\n  memo?: string;\n}\n\n/**\n * Parameters for deleting all spender allowances for a specific NFT serial, granted by an owner.\n */\nexport interface DeleteNftSerialAllowancesParams {\n  ownerAccountId?: string | AccountId;\n  nftIdString: string; // e.g., \"0.0.tokenid.serial\"\n  memo?: string;\n  pendingAirdropIds: PendingAirdropId[];\n}\n\n// Added for ClaimAirdropTool\n/**\n * Parameters for claiming pending airdrops.\n * The SDK's PendingAirdropId is an object. For the tool's input,\n * we'll expect the structure that the SDK uses or a string that can be parsed into it.\n * The current HederaClaimAirdropTool Zod schema expects an array of strings.\n */\nexport interface ClaimAirdropParams {\n  /**\n   * An array of pending airdrop IDs to claim.\n   * These are expected to be strings that can be parsed into SDK PendingAirdropId objects if needed,\n   * or directly match the structure if SDK PendingAirdropId is serializable/deserializable simply.\n   * The @hashgraph/sdk PendingAirdropId is constructed with (accountId, tokenId, serialNumber).\n   * For simplicity in the tool input, we might expect an array of objects or structured strings.\n   * The tool placeholder Zod schema uses `z.array(z.string())` - this will need careful implementation\n   * in the actual tool to parse these strings into proper SDK PendingAirdropId objects.\n   * Let's align the type with the SDK's actual PendingAirdropId for now for builder methods.\n   */\n  pendingAirdropIds: PendingAirdropId[];\n  /** Optional memo for the transaction. */\n  memo?: string;\n}\n\n// Added for GetFileContentsTool\n/**\n * Parameters for querying file contents.\n */\nexport interface GetFileContentsParams {\n  fileId: string | FileId;\n  // maxRetries, payment, etc. could be added if BaseHederaQueryTool supports them\n}\n\n/**\n * Result of querying file contents.\n */\nexport interface FileContentsResult {\n  fileId: string;\n  contents: string; // Assuming string representation for simplicity, could be Uint8Array\n  // Could also include other file info if the query returns more\n}\n\n// Added for CallContractQueryTool\n/**\n * Parameters for calling a smart contract query function.\n * This aligns with SDK's ContractExecuteTransaction but for queries (ContractCallQuery).\n */\nexport interface CallContractQueryParams {\n  contractId: string | ContractId;\n  gas?: number | Long; // SDK: Long\n  functionName: string; // For query, this is often just the function selector or name\n  functionParameters?: ContractFunctionParameters;\n  maxQueryPayment?: Hbar; // For queries\n  paymentTransactionId?: TransactionId; // For queries\n  // senderAccountId?: string | AccountId; // For queries, client usually pays\n}\n\n/**\n * Result of a smart contract query call.\n */\nexport interface ContractQueryResult {\n  // Based on ContractFunctionResult from SDK\n  contractId?: string;\n  errorMessage?: string;\n  gasUsed?: string; // u64\n  // Various ways to get results based on type, e.getString, getInt32, etc.\n  // For a generic tool, might return raw bytes or a common representation.\n  resultAsBytes?: Uint8Array; // Raw result\n  resultDecoded?: any; // If ABI is available and decoding is attempted by the tool\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport {\n  MCPToolResult,\n  CreditBalance,\n  CreditBalanceResponse,\n  PaymentTransaction,\n  PaymentVerification,\n  PaymentStatus,\n  PaymentHistory,\n  CreditHistory,\n  PricingConfiguration,\n  AuthChallenge,\n  AuthSignatureParams,\n  AuthResponse,\n  ApiKeyList,\n  RotateKeyResponse,\n  RevokeKeyResponse,\n  MCPClientConfig,\n  HealthCheckResult,\n  ServerInfo,\n  GenerateTransactionParams,\n  GenerateTransactionResult,\n  ScheduleTransactionParams,\n  ScheduleTransactionResult,\n  ExecuteTransactionParams,\n  ExecuteTransactionResult,\n  ProcessPaymentParams,\n  ProcessPaymentResult,\n  ProfileRefreshResult,\n  ExecuteQueryParams,\n  ExecuteQueryResult,\n} from './types';\n\n/**\n * MCP Client for communicating with the Hedera MCP Server\n * Provides access to credit management, authentication, and tool execution\n */\nexport class MCPClient {\n  private client: Client | null = null;\n  private isConnected: boolean = false;\n  private logger: Logger;\n  private apiKey: string | null = null;\n  private serverUrl: string;\n  private clientName: string;\n  private clientVersion: string;\n\n  private static instance: MCPClient | null = null;\n\n  public static getInstance(config: MCPClientConfig = {}): MCPClient {\n    if (!MCPClient.instance) {\n      MCPClient.instance = new MCPClient(config);\n    }\n    return MCPClient.instance;\n  }\n\n  public static setInstance(instance: MCPClient | null): void {\n    MCPClient.instance = instance;\n  }\n\n  constructor(config: MCPClientConfig = {}) {\n    this.serverUrl =\n      config.serverUrl ||\n      process.env.HEDERA_MCP_SERVER_URL ||\n      'http://localhost:3000/stream';\n    this.apiKey = config.apiKey || null;\n    this.clientName = config.clientName || 'hedera-agent-kit';\n    this.clientVersion = config.clientVersion || '1.0.0';\n\n    this.logger = new Logger({\n      module: 'MCPClient',\n      level: process.env.DEBUG === 'true' ? 'debug' : 'info',\n    });\n\n    this.logger.info('MCPClient initialized', {\n      serverUrl: this.serverUrl,\n      hasApiKey: !!this.apiKey,\n      clientName: this.clientName,\n      envUrl: process.env.HEDERA_MCP_SERVER_URL,\n      isSSR: typeof window === 'undefined',\n    });\n  }\n\n  /**\n   * Set the API key for authentication\n   * @param apiKey The API key to use for authentication\n   */\n  setApiKey(apiKey: string | null): void {\n    if (this.apiKey === apiKey) {\n      return;\n    }\n    this.apiKey = apiKey;\n    if (this.isConnected) {\n      this.logger.debug(\n        'API key changed, disconnecting to force reconnection',\n        {\n          hadApiKey: !!this.apiKey,\n          hasNewApiKey: !!apiKey,\n        }\n      );\n      this.isConnected = false;\n      this.client = null;\n    }\n  }\n\n  /**\n   * Get the current API key\n   * @returns The current API key or null\n   */\n  getApiKey(): string | null {\n    return this.apiKey;\n  }\n\n  /**\n   * Connects to the MCP server using streaming HTTP transport\n   * @returns Promise that resolves when connected\n   */\n  async connect(): Promise<void> {\n    if (this.isConnected && this.client) {\n      this.logger.debug('Already connected, checking if API key matches', {\n        hasClient: true,\n        hasApiKey: !!this.apiKey,\n      });\n      return;\n    }\n\n    try {\n      this.logger.debug('Creating transport', {\n        url: this.serverUrl,\n        hasApiKey: !!this.apiKey,\n        apiKeyPrefix: this.apiKey ? this.apiKey.substring(0, 8) + '...' : null,\n      });\n\n      const requestInit: RequestInit = {};\n      if (this.apiKey) {\n        requestInit.headers = {\n          Authorization: `Bearer ${this.apiKey}`,\n        };\n      }\n\n      const transport = new StreamableHTTPClientTransport(\n        new URL(this.serverUrl),\n        { requestInit }\n      );\n\n      this.client = new Client(\n        {\n          name: this.clientName,\n          version: this.clientVersion,\n        },\n        {\n          capabilities: {},\n        }\n      );\n\n      await this.client.connect(transport as any);\n\n      this.isConnected = true;\n      this.logger.info('Connected to MCP server with streaming transport', {\n        hasApiKey: !!this.apiKey,\n      });\n    } catch (error) {\n      this.logger.error('Failed to connect to MCP server', {\n        error,\n        message: error instanceof Error ? error.message : 'Unknown error',\n        serverUrl: this.serverUrl,\n        transportType: 'StreamableHTTPClientTransport',\n        hasApiKey: !!this.apiKey,\n      });\n      this.isConnected = false;\n      this.client = null;\n      throw error;\n    }\n  }\n\n  /**\n   * Calls a tool on the MCP server\n   * @param toolName The name of the tool to call\n   * @param args Arguments to pass to the tool\n   * @returns The tool result\n   */\n  async callTool<T = unknown>(\n    toolName: string,\n    args: Record<string, unknown> = {}\n  ): Promise<T> {\n    this.logger.debug('Calling MCP tool', { toolName, args });\n\n    if (!this.isConnected || !this.client) {\n      this.logger.debug('Client not connected, connecting now');\n      await this.connect();\n    }\n\n    try {\n      this.logger.debug('Attempting tool call', {\n        toolName,\n        isConnected: this.isConnected,\n        hasClient: !!this.client,\n        hasApiKey: !!this.apiKey,\n        clientState: this.client ? 'exists' : 'null',\n      });\n\n      if (!this.client) {\n        throw new Error('Client is null after connection attempt');\n      }\n\n      const result = (await this.client.callTool({\n        name: toolName,\n        arguments: args,\n      })) as MCPToolResult;\n\n      this.logger.debug('Tool result received', { toolName, result });\n\n      if (result.content && result.content.length > 0) {\n        const textContent = result.content.find((c) => c.type === 'text');\n        if (textContent) {\n          try {\n            const parsed = JSON.parse(textContent.text) as T;\n            this.logger.debug('Tool result parsed', { toolName, parsed });\n            return parsed;\n          } catch {\n            this.logger.debug('Tool returning raw text', {\n              toolName,\n              text: textContent.text,\n            });\n            return textContent.text as T;\n          }\n        }\n      }\n\n      this.logger.debug('Tool returning full result', { toolName, result });\n      return result as T;\n    } catch (error) {\n      this.logger.error('Failed to call tool', { toolName, error });\n\n      if (error instanceof Error && error.message.includes('Not connected')) {\n        this.logger.warn('Connection lost, attempting to reconnect and retry');\n        this.isConnected = false;\n        this.client = null;\n\n        try {\n          await this.connect();\n          const result = (await this.client!.callTool({\n            name: toolName,\n            arguments: args,\n          })) as MCPToolResult;\n\n          this.logger.debug('Tool result received after reconnect', {\n            toolName,\n            result,\n          });\n\n          if (result.content && result.content.length > 0) {\n            const textContent = result.content.find((c) => c.type === 'text');\n            if (textContent) {\n              try {\n                const parsed = JSON.parse(textContent.text) as T;\n                return parsed;\n              } catch {\n                return textContent.text as T;\n              }\n            }\n          }\n\n          return result as T;\n        } catch (retryError) {\n          this.logger.error('Failed to call tool after reconnect', {\n            toolName,\n            error: retryError,\n          });\n          throw retryError;\n        }\n      }\n\n      throw error;\n    }\n  }\n\n  /**\n   * Gets credit balance for an account\n   * @param accountId The Hedera account ID\n   * @returns The credit balance information\n   */\n  async getCreditBalance(accountId: string): Promise<CreditBalance> {\n    const result = await this.callTool<CreditBalanceResponse>(\n      'check_credit_balance',\n      { accountId }\n    );\n    if (result.error) {\n      throw new Error(result.error);\n    }\n    return result.balance;\n  }\n\n  /**\n   * Creates a payment transaction for purchasing credits\n   * @param payerAccountId The payer's Hedera account ID\n   * @param amount The amount of HBAR to pay\n   * @param memo Optional transaction memo\n   * @returns Transaction details including bytes and ID\n   */\n  async createPaymentTransaction(\n    payerAccountId: string,\n    amount: number,\n    memo?: string\n  ): Promise<PaymentTransaction> {\n    const result = await this.callTool<PaymentTransaction>('purchase_credits', {\n      payer_account_id: payerAccountId,\n      amount,\n      memo,\n    });\n\n    this.logger.info('Payment transaction result', {\n      result,\n      hasTransactionBytes: !!result.transaction_bytes,\n      transactionBytesLength: result.transaction_bytes?.length,\n    });\n\n    return result;\n  }\n\n  /**\n   * Verifies a payment transaction and allocates credits\n   * @param transactionId The transaction ID to verify\n   * @returns Verification result\n   */\n  async verifyPayment(transactionId: string): Promise<PaymentVerification> {\n    return await this.callTool<PaymentVerification>('verify_payment', {\n      transaction_id: transactionId,\n    });\n  }\n\n  /**\n   * Checks payment status\n   * @param transactionId The transaction ID to check\n   * @returns Payment status\n   */\n  async checkPaymentStatus(transactionId: string): Promise<PaymentStatus> {\n    return await this.callTool<PaymentStatus>('check_payment_status', {\n      transaction_id: transactionId,\n    });\n  }\n\n  /**\n   * Gets payment history for an account\n   * @param accountId The Hedera account ID\n   * @param limit Maximum number of records to return\n   * @returns Payment history with transactions\n   */\n  async getPaymentHistory(\n    accountId: string,\n    limit: number = 50\n  ): Promise<PaymentHistory> {\n    return await this.callTool<PaymentHistory>('get_payment_history', {\n      account_id: accountId,\n      limit,\n    });\n  }\n\n  /**\n   * Gets pricing configuration\n   * @returns Pricing tiers and configuration\n   */\n  async getPricingConfiguration(): Promise<PricingConfiguration> {\n    const result = await this.callTool<PricingConfiguration>(\n      'get_pricing_configuration',\n      {}\n    );\n    if (result.error) {\n      throw new Error(result.error);\n    }\n    return result;\n  }\n\n  /**\n   * Request authentication challenge from MCP server\n   * @param hederaAccountId The Hedera account ID requesting authentication\n   * @returns Authentication challenge details\n   */\n  async requestAuthChallenge(hederaAccountId: string): Promise<AuthChallenge> {\n    const result = await this.callTool<AuthChallenge>(\n      'request_auth_challenge',\n      {\n        hederaAccountId,\n      }\n    );\n    if (result.error) {\n      throw new Error(result.error);\n    }\n    return result;\n  }\n\n  /**\n   * Verify signature and authenticate with MCP server\n   * @param params Authentication parameters including signature and challenge\n   * @returns API key and authentication details\n   */\n  async verifyAuthSignature(\n    params: AuthSignatureParams\n  ): Promise<AuthResponse> {\n    const result = await this.callTool<AuthResponse>(\n      'verify_auth_signature',\n      params\n    );\n    if (result.error) {\n      throw new Error(result.error);\n    }\n    return result;\n  }\n\n  /**\n   * Get API keys for the authenticated account\n   * @param hederaAccountId The Hedera account ID (optional, uses authenticated account if not provided)\n   * @returns List of API keys for the account\n   */\n  async getApiKeys(hederaAccountId?: string): Promise<ApiKeyList> {\n    const params = hederaAccountId ? { hederaAccountId } : {};\n    const result = await this.callTool<ApiKeyList>('get_api_keys', params);\n    if (result.error) {\n      throw new Error(result.error);\n    }\n    return result;\n  }\n\n  /**\n   * Rotate an API key\n   * @param params Rotation parameters\n   * @returns New API key details\n   */\n  async rotateApiKey(params: {\n    keyId: string;\n    hederaAccountId: string;\n  }): Promise<RotateKeyResponse> {\n    const result = await this.callTool<RotateKeyResponse>(\n      'rotate_api_key',\n      params\n    );\n    if (result.error) {\n      throw new Error(result.error);\n    }\n    return result;\n  }\n\n  /**\n   * Revoke an API key\n   * @param params Revocation parameters\n   * @returns Revocation status\n   */\n  async revokeApiKey(params: {\n    keyId: string;\n    hederaAccountId: string;\n  }): Promise<RevokeKeyResponse> {\n    const result = await this.callTool<RevokeKeyResponse>(\n      'revoke_api_key',\n      params\n    );\n    if (result.error) {\n      throw new Error(result.error);\n    }\n    return result;\n  }\n\n  /**\n   * Gets credit transaction history\n   * @param accountId The Hedera account ID\n   * @param limit Maximum number of records to return\n   * @returns Credit transaction history\n   */\n  async getCreditHistory(\n    accountId: string,\n    limit: number = 20\n  ): Promise<CreditHistory> {\n    const result = await this.callTool<CreditHistory>('get_credit_history', {\n      accountId,\n      limit,\n    });\n    if (result.error) {\n      throw new Error(result.error);\n    }\n    return result;\n  }\n\n  /**\n   * Check server health and status\n   * @returns Server health information\n   */\n  async healthCheck(): Promise<HealthCheckResult> {\n    return await this.callTool<HealthCheckResult>('health_check', {});\n  }\n\n  /**\n   * Get server configuration and capabilities\n   * @returns Server information including version and capabilities\n   */\n  async getServerInfo(): Promise<ServerInfo> {\n    return await this.callTool<ServerInfo>('get_server_info', {});\n  }\n\n  /**\n   * Generate transaction bytes for any Hedera operation without execution\n   * @param params Transaction parameters\n   * @returns Transaction bytes and metadata\n   */\n  async generateTransactionBytes(\n    params: GenerateTransactionParams\n  ): Promise<GenerateTransactionResult> {\n    const result = await this.callTool<GenerateTransactionResult>(\n      'generate_transaction_bytes',\n      params\n    );\n    if (result.error) {\n      throw new Error(result.error);\n    }\n    return result;\n  }\n\n  /**\n   * Create scheduled transaction for any Hedera operation\n   * @param params Schedule transaction parameters\n   * @returns Scheduled transaction details\n   */\n  async scheduleTransaction(\n    params: ScheduleTransactionParams\n  ): Promise<ScheduleTransactionResult> {\n    const result = await this.callTool<ScheduleTransactionResult>(\n      'schedule_transaction',\n      params\n    );\n    if (result.error) {\n      throw new Error(result.error);\n    }\n    return result;\n  }\n\n  /**\n   * Execute any Hedera transaction immediately\n   * @param params Transaction execution parameters\n   * @returns Transaction result\n   */\n  async executeTransaction(\n    params: ExecuteTransactionParams\n  ): Promise<ExecuteTransactionResult> {\n    const result = await this.callTool<ExecuteTransactionResult>(\n      'execute_transaction',\n      params\n    );\n    if (result.error) {\n      throw new Error(result.error);\n    }\n    return result;\n  }\n\n  /**\n   * Manually process an HBAR payment for credit allocation\n   * @param params Payment processing parameters\n   * @returns Payment processing result\n   */\n  async processHbarPayment(\n    params: ProcessPaymentParams\n  ): Promise<ProcessPaymentResult> {\n    const result = await this.callTool<ProcessPaymentResult>(\n      'process_hbar_payment',\n      params\n    );\n    if (result.error) {\n      throw new Error(result.error);\n    }\n    return result;\n  }\n\n  /**\n   * Refresh server HCS-11 profile and registration status\n   * @returns Profile refresh result\n   */\n  async refreshProfile(): Promise<ProfileRefreshResult> {\n    const result = await this.callTool<ProfileRefreshResult>(\n      'refresh_profile',\n      {}\n    );\n    if (result.error) {\n      throw new Error(result.error);\n    }\n    return result;\n  }\n\n  /**\n   * Execute read-only queries on Hedera network\n   * @param params Query parameters\n   * @returns Query result\n   */\n  async executeQuery(params: ExecuteQueryParams): Promise<ExecuteQueryResult> {\n    const result = await this.callTool<ExecuteQueryResult>(\n      'execute_query',\n      params\n    );\n    if (result.error) {\n      throw new Error(result.error);\n    }\n    return result;\n  }\n\n  /**\n   * Gets the current connection status\n   * @returns True if connected, false otherwise\n   */\n  get connected(): boolean {\n    return this.isConnected;\n  }\n\n  /**\n   * Disconnects from the MCP server\n   * @returns Promise that resolves when disconnected\n   */\n  async disconnect(): Promise<void> {\n    if (this.client && this.isConnected) {\n      try {\n        await this.client.close();\n      } catch (error) {\n        this.logger.error('Error closing MCP client', { error });\n      }\n      this.client = null;\n      this.isConnected = false;\n      this.logger.info('Disconnected from MCP server');\n    }\n  }\n}\n\n/**\n * Gets the singleton MCP client instance for communicating with the Hedera MCP Server\n * @param config Optional configuration to override defaults\n * @returns The singleton MCPClient instance\n */\nexport function getMCPClient(config?: MCPClientConfig): MCPClient {\n  if (!MCPClient.getInstance()) {\n    MCPClient.getInstance(config);\n  }\n  return MCPClient.getInstance();\n}\n\n/**\n * Resets the MCP client instance by disconnecting the current client and clearing the singleton\n * @returns A promise that resolves when the client has been disconnected and reset\n */\nexport async function resetMCPClient(): Promise<void> {\n  if (MCPClient.getInstance()) {\n    await MCPClient.getInstance().disconnect();\n    MCPClient.setInstance(null);\n  }\n}\n","import {\n  AccountId,\n  Transaction,\n  TransactionReceipt,\n  Signer as HederaSdkSigner,\n  PrivateKey,\n} from '@hashgraph/sdk';\nimport { AbstractSigner } from './abstract-signer';\nimport { HederaNetworkType } from '../types';\nimport { HashinalsWalletConnectSDK } from '@hashgraphonline/hashinal-wc';\n\n/**\n * A signer implementation for browser environments that uses HashConnect for signing.\n * It delegates signing operations to an instance of HashinalsWalletConnectSDK.\n */\nexport class BrowserSigner extends AbstractSigner {\n  private networkInternal: HederaNetworkType;\n  private accountIdInternal: AccountId;\n  private hwcSdk: HashinalsWalletConnectSDK;\n\n  /**\n   * Constructs a BrowserSigner instance.\n   * @param {HashinalsWalletConnectSDK} hwcSdk - An initialized HashinalsWalletConnectSDK instance.\n   * @param {HederaNetworkType} network - The Hedera network ('mainnet' or 'testnet').\n   * @param {string | AccountId} accountId - The Hedera account ID this signer will represent (must be paired with hwcSdk).\n   */\n  constructor(\n    hwcSdk: HashinalsWalletConnectSDK,\n    network: HederaNetworkType,\n    accountId: string | AccountId\n  ) {\n    super();\n    this.hwcSdk = hwcSdk;\n    this.networkInternal = network;\n    this.accountIdInternal = AccountId.fromString(accountId.toString());\n\n    const foundSigner = this.hwcSdk.dAppConnector?.signers?.find((s) => {\n      const hederaSigner = s as HederaSdkSigner;\n      const signerAccount = hederaSigner.getAccountId();\n      if (signerAccount) {\n        return signerAccount.toString() === this.accountIdInternal.toString();\n      }\n      return false;\n    });\n\n    if (!foundSigner) {\n      throw new Error(\n        `No HashConnect signer (HederaSdkSigner) could be found or initialized within HashinalsWalletConnectSDK for account ID ${this.accountIdInternal.toString()}. ` +\n          `Ensure the account is paired and selected in HashPack for the dApp on network ${this.networkInternal}.`\n      );\n    }\n\n    this.initializeMirrorNode(this.networkInternal, 'BrowserSigner');\n  }\n\n  /**\n   * Retrieves the Hedera account ID associated with this signer.\n   * @returns {AccountId} The Hedera AccountId object.\n   */\n  public getAccountId(): AccountId {\n    return this.accountIdInternal;\n  }\n\n  /**\n   * Signs and executes a Hedera transaction using the HashinalsWalletConnectSDK,\n   * returning the transaction receipt. Transaction freezing is handled by HashinalsWalletConnectSDK.\n   * @param {Transaction} transaction - The transaction to sign and execute.\n   * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n   * @throws {Error} If the transaction fails or is rejected.\n   */\n  public async signAndExecuteTransaction(\n    transaction: Transaction\n  ): Promise<TransactionReceipt> {\n    const outcome = await this.hwcSdk.executeTransactionWithErrorHandling(\n      transaction,\n      false\n    );\n\n    if (outcome.error) {\n      throw new Error(`Transaction failed: ${outcome.error}`);\n    }\n\n    if (outcome.result) {\n      return outcome.result;\n    }\n\n    throw new Error(\n      'Transaction execution with HashinalsWalletConnectSDK yielded no result or error.'\n    );\n  }\n\n  /**\n   * Retrieves the Hedera network type this signer is configured for.\n   * @returns {HederaNetworkType} The configured Hedera network type ('mainnet' or 'testnet').\n   */\n  public getNetwork(): HederaNetworkType {\n    return this.networkInternal;\n  }\n\n  /**\n   * Retrieves the operator's private key.\n   * For BrowserSigner, this is not available as signing is delegated to the user's wallet via WalletConnect.\n   * @returns {string | PrivateKey} Throws an error as private key is not accessible.\n   * @throws {Error} Always, as BrowserSigner does not hold private keys.\n   */\n  //@ts-ignore\n  public getOperatorPrivateKey(): string | PrivateKey {\n    throw new Error(\n      \"BrowserSigner does not have direct access to private keys. Signing is delegated to the user's wallet.\"\n    );\n  }\n\n  /**\n   * Retrieves the Hedera client instance.\n   * @returns {Client} The Hedera client instance.\n   */\n  //@ts-ignore\n  public getClient(): any {\n    throw new Error('BrowserSigner does not have a Hedera client instance.');\n  }\n}\n","import { AbstractSigner } from '../signer/abstract-signer';\nimport { HederaAgentKit, PluginConfig } from './agent';\nimport { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport { ChatOpenAI, ChatOpenAIFields } from '@langchain/openai';\nimport { AgentExecutor, createOpenAIToolsAgent } from 'langchain/agents';\nimport {\n  ChatPromptTemplate,\n  MessagesPlaceholder,\n} from '@langchain/core/prompts';\nimport { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport { TransactionReceipt } from '@hashgraph/sdk';\nimport { StructuredTool } from '@langchain/core/tools';\nimport { AgentOperationalMode, MirrorNodeConfig } from '../types';\nimport { ModelCapability } from '../types/model-capability';\nimport { ModelCapabilityDetector } from '../utils/model-capability-detector';\nimport {\n  TokenUsageCallbackHandler,\n  TokenUsage,\n  CostCalculation,\n  calculateTokenCostSync,\n} from '../utils/token-usage-tracker';\n\n/**\n * Configuration for the HederaConversationalAgent.\n */\nexport interface HederaConversationalAgentConfig {\n  operationalMode?: AgentOperationalMode;\n  pluginConfig?: PluginConfig;\n  userAccountId?: string;\n  customSystemMessagePreamble?: string;\n  customSystemMessagePostamble?: string;\n  verbose?: boolean;\n  llm?: BaseChatModel;\n  openAIApiKey?: string;\n  openAIModelName?: string;\n  scheduleUserTransactionsInBytesMode?: boolean;\n  modelCapability?: ModelCapability;\n  mirrorNodeConfig?: MirrorNodeConfig;\n  disableLogging?: boolean;\n  toolFilter?: (tool: StructuredTool) => boolean;\n}\n\n/**\n * Defines the structured response from the HederaConversationalAgent's processMessage method.\n */\nexport interface AgentResponse {\n  output: string;\n  message?: string;\n  transactionBytes?: string | undefined;\n  receipt?: TransactionReceipt | object | undefined;\n  scheduleId?: string | undefined;\n  transactionId?: string | undefined;\n  notes?: string[];\n  error?: string | undefined;\n  intermediateSteps?: unknown;\n  rawToolOutput?: unknown;\n  tokenUsage?: TokenUsage | undefined;\n  cost?: CostCalculation | undefined;\n  [key: string]: any;\n}\n\n/**\n * Expected structure of a successful JSON output from BaseHederaTransactionTool.\n */\ninterface SuccessfulToolOutput {\n  success: true;\n  transactionBytes?: string;\n  receipt?: TransactionReceipt | object;\n  scheduleId?: string;\n  transactionId?: string;\n  notes?: string[];\n  op?: string;\n  description?: string;\n  output?: string;\n  [key: string]: unknown;\n}\n\n/**\n * Expected structure of a failed JSON output from BaseHederaTransactionTool.\n */\ninterface FailedToolOutput {\n  success: false;\n  error: string;\n  transactionId?: string;\n  notes?: string[];\n  output?: string;\n  [key: string]: unknown;\n}\n\ntype ParsedToolOutput = SuccessfulToolOutput | FailedToolOutput;\n\n/**\n * HederaConversationalAgent orchestrates interactions between an LLM, HederaAgentKit tools,\n * and the user to facilitate Hedera Network operations via a conversational interface.\n */\nexport class HederaConversationalAgent {\n  private hederaKit: HederaAgentKit;\n  private llm: BaseChatModel;\n  private agentExecutor!: AgentExecutor;\n  private logger: Logger;\n  private config: HederaConversationalAgentConfig;\n  private systemMessage!: string;\n  private tokenUsageHandler: TokenUsageCallbackHandler;\n\n  /**\n   * Creates an instance of HederaConversationalAgent.\n   * @param {AbstractSigner} signer - The signer implementation for Hedera transactions.\n   * @param {HederaConversationalAgentConfig} [config={}] - Configuration options for the agent.\n   */\n  constructor(\n    signer: AbstractSigner,\n    config: HederaConversationalAgentConfig = {}\n  ) {\n    this.config = {\n      operationalMode: 'provideBytes',\n      verbose: false,\n      scheduleUserTransactionsInBytesMode: true,\n      ...config,\n    };\n\n    const initialModelCapability =\n      this.config.modelCapability ||\n      ModelCapabilityDetector.getInstance().getModelCapabilitySync(\n        config.openAIModelName\n      );\n\n    const shouldDisableLogs =\n      this.config.disableLogging || process.env.DISABLE_LOGS === 'true';\n    const defaultLogLevel = this.config.verbose ? 'debug' : 'info';\n    const logLevel = shouldDisableLogs ? 'silent' : defaultLogLevel;\n\n    this.logger = new Logger({\n      level: logLevel,\n      module: 'HederaConversationalAgent',\n      silent: shouldDisableLogs,\n    });\n\n    this.hederaKit = new HederaAgentKit(\n      signer,\n      this.config.pluginConfig,\n      this.config.operationalMode,\n      this.config.userAccountId,\n      this.config.scheduleUserTransactionsInBytesMode,\n      initialModelCapability,\n      this.config.openAIModelName ||\n        process.env.OPENAI_MODEL_NAME ||\n        'gpt-4o-mini',\n      this.config.mirrorNodeConfig,\n      shouldDisableLogs\n    );\n\n    const modelName =\n      this.config.openAIModelName ||\n      process.env.OPENAI_MODEL_NAME ||\n      'gpt-4o-mini';\n\n    this.tokenUsageHandler = new TokenUsageCallbackHandler(\n      modelName,\n      this.logger\n    );\n\n    if (this.config.llm) {\n      this.llm = this.config.llm;\n    } else {\n      const apiKey = this.config.openAIApiKey || process.env.OPENAI_API_KEY;\n      if (!apiKey) {\n        throw new Error(\n          'OpenAI API key is required. Provide it in config or via OPENAI_API_KEY env variable.'\n        );\n      }\n      this.llm = new ChatOpenAI({\n        apiKey: apiKey,\n        modelName: modelName,\n        temperature: 0.1,\n        callbacks: [this.tokenUsageHandler],\n      } as ChatOpenAIFields);\n    }\n  }\n\n  /**\n   * Constructs the system message for the LLM based on configuration.\n   * @returns {string} The system message string.\n   */\n  private constructSystemMessage(): string {\n    let messageParts: string[] = [];\n    const agentOperatorId = this.hederaKit.signer.getAccountId().toString();\n    const userAccId = this.config.userAccountId;\n\n    if (this.config.customSystemMessagePreamble) {\n      messageParts.push(this.config.customSystemMessagePreamble);\n    }\n    messageParts.push(\n      `You are a helpful Hedera assistant. Your primary operator account is ${agentOperatorId}. ` +\n        `You have tools to interact with the Hedera network. ` +\n        `When using any tool, provide all necessary parameters as defined by that tool's schema and description.`\n    );\n    if (userAccId) {\n      messageParts.push(\n        `The user you are assisting has a personal Hedera account ID: ${userAccId}. ` +\n          `IMPORTANT: When the user says things like \"I want to send HBAR\" or \"transfer my tokens\", you MUST use ${userAccId} as the sender/from account. ` +\n          `For example, if user says \"I want to send 2 HBAR to 0.0.800\", you must set up a transfer where ${userAccId} sends the HBAR, not your operator account.`\n      );\n    }\n    if (this.hederaKit.operationalMode === 'directExecution') {\n      messageParts.push(\n        `\\nOPERATIONAL MODE: 'directExecution'. Your goal is to execute transactions directly using your tools. ` +\n          `Your account ${agentOperatorId} will be the payer for these transactions. ` +\n          `Even if the user's account (${\n            userAccId || 'a specified account'\n          }) is the actor in the transaction body (e.g., sender of HBAR), ` +\n          `you (the agent with operator ${agentOperatorId}) are still executing and paying. For HBAR transfers, ensure the amounts in the 'transfers' array sum to zero (as per tool schema), balancing with your operator account if necessary.`\n      );\n    } else {\n      if (this.config.scheduleUserTransactionsInBytesMode && userAccId) {\n        messageParts.push(\n          `\\nOPERATIONAL MODE: 'provideBytes' with scheduled transactions for user actions. ` +\n            `When a user asks for a transaction to be prepared (e.g., creating a token, topic, transferring assets for them to sign, etc), ` +\n            `you MUST default to creating a Scheduled Transaction using the appropriate tool with the metaOption 'schedule: true'. ` +\n            `The user (with account ID ${userAccId}) will be the one to ultimately pay for and (if needed) sign the inner transaction. ` +\n            `Your operator account (${agentOperatorId}) will pay for creating the schedule entity itself. ` +\n            `You MUST return the ScheduleId and details of the scheduled operation in a structured JSON format with these fields: success, op, schedule_id, description, payer_account_id_scheduled_tx, and scheduled_transaction_details.` +\n            `\\nOnce a transaction is scheduled and you\\'ve provided the Schedule ID, you should ask the user if they want to sign and execute it. If they agree, use the \\'hedera-sign-and-execute-scheduled-transaction\\' tool, providing the Schedule ID. This tool will prepare a ScheduleSignTransaction. If the agent is also configured for \\'provideBytes\\', this ScheduleSignTransaction will be returned as bytes for the user to sign and submit using their account ${userAccId}. If the agent is in \\'directExecution\\' mode for the ScheduleSign part (not typical for user-scheduled flows but possible), the agent would sign and submit it.`\n        );\n      } else {\n        messageParts.push(\n          `\\nOPERATIONAL MODE: 'provideBytes'. Your goal is to provide transaction bytes directly. ` +\n            `When a user asks for a transaction to be prepared (e.g., for them to sign, or for scheduling without the default scheduling flow), ` +\n            `you MUST call the appropriate tool. If you want raw bytes for the user to sign for their own account ${\n              userAccId || 'if specified'\n            }, ensure the tool constructs the transaction body accordingly and use metaOption 'returnBytes: true' if available, or ensure the builder is configured for the user. ` +\n            (userAccId\n              ? `If the transaction body was constructed to reflect the user's account ${userAccId} as the actor, also inform the user the application can adapt these bytes for their signing and payment using their account ${userAccId}.`\n              : '')\n        );\n      }\n    }\n    messageParts.push(\n      '\\nAlways be concise. If the tool provides a JSON string as its primary output (especially in provideBytes mode), make your accompanying text brief. If the tool does not provide JSON output or an error occurs, your narrative becomes primary; if notes were generated by the tool in such cases, append them to your textual response.'\n    );\n    if (this.config.customSystemMessagePostamble) {\n      messageParts.push(this.config.customSystemMessagePostamble);\n    }\n    return messageParts.join('\\n');\n  }\n\n  /**\n   * Initializes the conversational agent, including its internal HederaAgentKit and LangChain components.\n   * Must be called before `processMessage`.\n   */\n  public async initialize(): Promise<void> {\n    const detectedCapability =\n      await ModelCapabilityDetector.getInstance().getModelCapability(\n        this.config.openAIModelName\n      );\n    if (detectedCapability !== this.hederaKit.modelCapability) {\n      this.hederaKit.modelCapability = detectedCapability;\n      this.logger.info(\n        `Updated model capability to ${detectedCapability} after API fetch`\n      );\n    }\n\n    await this.hederaKit.initialize();\n    this.systemMessage = this.constructSystemMessage();\n    let toolsFromKit =\n      this.hederaKit.getAggregatedLangChainTools() as StructuredTool[];\n\n    if (this.config.toolFilter) {\n      const originalCount = toolsFromKit.length;\n      toolsFromKit = toolsFromKit.filter(this.config.toolFilter);\n      const filteredCount = originalCount - toolsFromKit.length;\n      if (filteredCount > 0) {\n        this.logger.info(\n          `Filtered out ${filteredCount} tools based on provided filter`\n        );\n      }\n    }\n\n    if (toolsFromKit.length === 0) {\n      this.logger.warn(\n        'No tools were loaded into HederaAgentKit. The agent may not function correctly.'\n      );\n    }\n\n    this.logger.info(\n      `Loaded ${toolsFromKit.length} tools for model capability: ${this.hederaKit.modelCapability}`\n    );\n\n    const prompt = ChatPromptTemplate.fromMessages([\n      ['system', this.systemMessage],\n      new MessagesPlaceholder('chat_history'),\n      ['human', '{input}'],\n      new MessagesPlaceholder('agent_scratchpad'),\n    ]);\n    const agent = await createOpenAIToolsAgent({\n      llm: this.llm,\n      tools: toolsFromKit as StructuredTool[],\n      prompt,\n    });\n    this.agentExecutor = new AgentExecutor({\n      agent,\n      tools: toolsFromKit as StructuredTool[],\n      verbose: this.config.verbose ?? false,\n      returnIntermediateSteps: true,\n    });\n    this.logger.info('HederaConversationalAgent initialized.');\n  }\n\n  /**\n   * Processes a user's input message and returns the agent's response.\n   * @param {string} userInput - The user's input string.\n   * @param {Array<{ type: 'human' | 'ai'; content: string }>} [chatHistoryInput] - Optional existing chat history.\n   * @returns {Promise<AgentResponse>} The agent's structured response.\n   */\n  public async processMessage(\n    userInput: string,\n    chatHistoryInput?: Array<{ type: 'human' | 'ai'; content: string }>\n  ): Promise<AgentResponse> {\n    if (!this.agentExecutor) {\n      throw new Error(\n        'HederaConversationalAgent not initialized. Call await initialize() first.'\n      );\n    }\n\n    const langchainChatHistory: BaseMessage[] = (chatHistoryInput || []).map(\n      (msg) =>\n        msg.type === 'human'\n          ? new HumanMessage(msg.content)\n          : new AIMessage(msg.content)\n    );\n\n    let response: AgentResponse = {\n      output: '',\n      message: '',\n      notes: [],\n      transactionBytes: undefined,\n      receipt: undefined,\n      scheduleId: undefined,\n      transactionId: undefined,\n      error: undefined,\n      intermediateSteps: undefined,\n      rawToolOutput: undefined,\n      tokenUsage: undefined,\n      cost: undefined,\n    };\n\n    try {\n      const result = await this.agentExecutor.invoke({\n        input: userInput,\n        chat_history: langchainChatHistory,\n      });\n\n      response.message = result.output || '';\n      let parsedSteps = result?.intermediateSteps?.[0]\n        ?.observation as ParsedToolOutput[];\n      if (parsedSteps) {\n        try {\n          response = {\n            ...response,\n            ...JSON.parse(parsedSteps as unknown as string),\n          };\n        } catch (e) {\n          this.logger.error('Error parsing intermediate steps:', e);\n        }\n      }\n\n      if (!response.output || response.output.trim() === '') {\n        response.output = 'Agent action complete.';\n      }\n\n      const tokenUsage = this.tokenUsageHandler.getLatestTokenUsage();\n      if (tokenUsage) {\n        response.tokenUsage = tokenUsage;\n        response.cost = calculateTokenCostSync(tokenUsage);\n\n        this.logger.debug('Token usage for request:', {\n          promptTokens: tokenUsage.promptTokens,\n          completionTokens: tokenUsage.completionTokens,\n          totalTokens: tokenUsage.totalTokens,\n          cost: response.cost.totalCost,\n        });\n      }\n\n      return response;\n    } catch (error: unknown) {\n      const errorMessage =\n        error instanceof Error ? error.message : 'Unknown error';\n      this.logger.error(\n        `Error in HederaConversationalAgent.processMessage: ${errorMessage}`,\n        error\n      );\n\n      const tokenUsage = this.tokenUsageHandler.getLatestTokenUsage();\n      let cost: CostCalculation | undefined;\n      if (tokenUsage) {\n        cost = calculateTokenCostSync(tokenUsage);\n      }\n\n      return {\n        output: 'Sorry, I encountered an error processing your request.',\n        message: response.message || '',\n        notes: response.notes || [],\n        error: errorMessage,\n        transactionBytes: response?.transactionBytes,\n        receipt: response.receipt,\n        scheduleId: response.scheduleId,\n        transactionId: response.transactionId,\n        intermediateSteps: response.intermediateSteps,\n        rawToolOutput: response.rawToolOutput,\n        tokenUsage: tokenUsage || undefined,\n        cost,\n      };\n    }\n  }\n\n  /**\n   * Allows updating the operational mode of the agent after instantiation.\n   * This also updates the underlying HederaAgentKit's mode and reconstructs the system message for the LLM.\n   * Note: For the new system prompt to take full effect with the existing LangChain agent,\n   * re-initialization (calling `initialize()`) or recreation of the agent executor might be needed.\n   * @param {AgentOperationalMode} mode - The new operational mode.\n   */\n  public setOperationalMode(mode: AgentOperationalMode): void {\n    this.config.operationalMode = mode;\n    this.hederaKit.operationalMode = mode;\n    this.systemMessage = this.constructSystemMessage();\n    this.logger.info(\n      `Operational mode set to: ${mode}. System message and kit mode updated.`\n    );\n    if (this.agentExecutor) {\n      this.logger.warn(\n        'Operational mode changed. For the new system prompt to fully take effect, re-initialization (call initialize()) or recreation of the agent executor is needed.'\n      );\n    }\n  }\n\n  /**\n   * Get cumulative token usage across all requests\n   * @returns {TokenUsage & { cost: CostCalculation }} Total token usage and cost\n   */\n  public getTotalTokenUsage(): TokenUsage & { cost: CostCalculation } {\n    const totalUsage = this.tokenUsageHandler.getTotalTokenUsage();\n    const cost = calculateTokenCostSync(totalUsage);\n    return { ...totalUsage, cost };\n  }\n\n  /**\n   * Get token usage history for all requests\n   * @returns {Array<TokenUsage & { cost: CostCalculation }>} Array of token usage records with costs\n   */\n  public getTokenUsageHistory(): Array<TokenUsage & { cost: CostCalculation }> {\n    return this.tokenUsageHandler.getTokenUsageHistory().map((usage) => ({\n      ...usage,\n      cost: calculateTokenCostSync(usage),\n    }));\n  }\n\n  /**\n   * Reset token usage tracking\n   */\n  public resetTokenUsageTracking(): void {\n    this.tokenUsageHandler.reset();\n    this.logger.info('Token usage tracking has been reset');\n  }\n}\n","import {\n  AccountId,\n  Client,\n  PrivateKey,\n  Transaction,\n  TransactionResponse,\n  TransactionReceipt,\n} from '@hashgraph/sdk';\nimport {\n  detectKeyTypeFromString,\n  Logger,\n} from '@hashgraphonline/standards-sdk';\nimport { AbstractSigner } from './abstract-signer';\nimport { HederaNetworkType } from '../types';\n\n/**\n * A signer implementation for server-side environments that uses a private key for signing.\n * It directly interacts with the Hedera network using an operator-configured client.\n */\nexport class ServerSigner extends AbstractSigner {\n  private client: Client;\n  private accountIdInternal: AccountId;\n  private privateKey: PrivateKey;\n  private networkInternal: HederaNetworkType;\n  private keyType: 'ed25519' | 'ecdsa' = 'ed25519';\n  private logger: Logger;\n  private privateKeyString: string;\n  private keyTypeVerified: boolean = false;\n\n  /**\n   * Constructs a ServerSigner instance.\n   * @param {string | AccountId} accountId - The Hedera account ID.\n   * @param {string | PrivateKey} privateKey - The private key for the account.\n   * @param {HederaNetworkType} network - The Hedera network to connect to ('mainnet' or 'testnet').\n   */\n  constructor(\n    accountId: string | AccountId,\n    privateKey: string | PrivateKey,\n    network: HederaNetworkType\n  ) {\n    super();\n    this.accountIdInternal = AccountId.fromString(accountId.toString());\n    this.networkInternal = network;\n    this.logger = new Logger({ \n      module: 'ServerSigner', \n      level: process.env.DEBUG === 'true' ? 'debug' : 'warn' \n    });\n\n    this.initializeMirrorNode(this.networkInternal, 'ServerSigner');\n\n    if (network === 'mainnet') {\n      this.client = Client.forMainnet();\n    } else if (network === 'testnet') {\n      this.client = Client.forTestnet();\n    } else {\n      throw new Error(\n        `Unsupported Hedera network type specified: ${network}. Only 'mainnet' or 'testnet' are supported.`\n      );\n    }\n\n    if (typeof privateKey === 'string') {\n      this.privateKeyString = privateKey;\n      try {\n        const keyDetection = detectKeyTypeFromString(privateKey);\n        this.privateKey = keyDetection.privateKey;\n        this.keyType = keyDetection.detectedType;\n        this.initializeOperator();\n        this.logger.debug(`Detected key type from string: ${this.keyType}`);\n      } catch (error: unknown) {\n        this.logger.warn(\n          'Failed to detect key type from private key format, will query mirror node',\n          (error as Error).message\n        );\n        this.privateKey = PrivateKey.fromStringED25519(privateKey);\n        this.keyType = 'ed25519';\n      }\n    } else {\n      this.privateKey = privateKey;\n      this.privateKeyString = privateKey.toString();\n    }\n\n    this.client.setOperator(this.accountIdInternal, this.privateKey);\n  }\n\n  /**\n   * Initializes the operator by verifying the key type against the mirror node.\n   * This follows the pattern from standards-sdk to ensure the correct key type is used.\n   */\n  private async initializeOperator(): Promise<void> {\n    try {\n      const account = await this.mirrorNode.requestAccount(\n        this.accountIdInternal.toString()\n      );\n      const keyType = account?.key?._type;\n\n      let actualKeyType: 'ed25519' | 'ecdsa' = 'ed25519';\n\n      if (keyType?.includes('ECDSA')) {\n        actualKeyType = 'ecdsa';\n      } else if (keyType?.includes('ED25519')) {\n        actualKeyType = 'ed25519';\n      }\n\n      if (actualKeyType !== this.keyType) {\n        this.logger.debug(\n          `Key type mismatch detected. String detection: ${this.keyType}, Mirror node: ${actualKeyType}. Using mirror node result.`\n        );\n\n        this.keyType = actualKeyType;\n\n        if (this.privateKeyString) {\n          this.privateKey =\n            actualKeyType === 'ecdsa'\n              ? PrivateKey.fromStringECDSA(this.privateKeyString)\n              : PrivateKey.fromStringED25519(this.privateKeyString);\n\n          this.client.setOperator(this.accountIdInternal, this.privateKey);\n\n          this.logger.debug(\n            `Updated operator with verified key type: ${this.keyType}`\n          );\n        }\n      } else {\n        this.logger.debug(`Key type verification successful: ${this.keyType}`);\n      }\n      this.keyTypeVerified = true;\n    } catch (error) {\n      this.logger.error(\n        `Failed to verify key type from mirror node: ${\n          (error as Error).message\n        }`\n      );\n      this.keyTypeVerified = true;\n    }\n  }\n\n  /**\n   * Retrieves the Hedera account ID associated with this signer.\n   * @returns {AccountId} The Hedera AccountId object.\n   */\n  public getAccountId(): AccountId {\n    return this.accountIdInternal;\n  }\n\n  /**\n   * Signs and executes a Hedera transaction using the configured client and private key,\n   * and returns the transaction receipt.\n   * @param {Transaction} transaction - The transaction to sign and execute.\n   * @returns {Promise<TransactionReceipt>} A promise that resolves to the transaction receipt.\n   */\n  public async signAndExecuteTransaction(\n    transaction: Transaction\n  ): Promise<TransactionReceipt> {\n    if (!transaction.isFrozen()) {\n      if (transaction.transactionId) {\n        await transaction.freezeWith(this.client);\n      } else {\n        await transaction.freezeWith(this.client);\n      }\n    }\n    if (transaction.getSignatures().size === 0) {\n      await transaction.sign(this.privateKey);\n    }\n    const response: TransactionResponse = await transaction.execute(\n      this.client\n    );\n    return response.getReceipt(this.client);\n  }\n\n  /**\n   * Retrieves the Hedera network type this signer is configured for.\n   * @returns {HederaNetworkType} The configured Hedera network type ('mainnet' or 'testnet').\n   */\n  public getNetwork(): HederaNetworkType {\n    return this.networkInternal;\n  }\n\n  /**\n   * Retrieves the operator's private key associated with this signer.\n   * @returns {PrivateKey} The Hedera PrivateKey object.\n   */\n  public getOperatorPrivateKey(): PrivateKey {\n    return this.privateKey;\n  }\n\n  /**\n   * Retrieves the client instance configured for this ServerSigner.\n   * @returns {Client} The Hedera Client object.\n   */\n  public getClient(): Client {\n    return this.client;\n  }\n\n  /**\n   * Retrieves the key type of the operator's private key.\n   * @returns {Promise<'ed25519' | 'ecdsa'>} The key type.\n   */\n  public async getKeyType(): Promise<'ed25519' | 'ecdsa'> {\n    if (!this.keyTypeVerified && this.privateKeyString) {\n      await this.initializeOperator();\n    }\n    return this.keyType;\n  }\n\n  /**\n   * Retrieves the key type synchronously (without mirror node verification).\n   * @returns {'ed25519' | 'ecdsa'} The key type.\n   */\n  public getKeyTypeSync(): 'ed25519' | 'ecdsa' {\n    return this.keyType;\n  }\n}\n","import { HederaNetworkType } from \"../types\";\n\nexport const createBaseMirrorNodeApiUrl = (networkType: HederaNetworkType) => {\n    const networkBase = networkType === 'mainnet' ? `${networkType}-public` : networkType;\n    return `https://${networkBase}.mirrornode.hedera.com`\n}\n"],"names":["BaseServiceBuilder","constructor","hederaKit","this","currentTransaction","notes","kit","shouldDisableLogs","process","env","DISABLE_LOGS","logger","Logger","module","level","silent","getEffectiveSenderAccountId","userAccountId","AccountId","fromString","signer","getAccountId","getTransferSourceAccount","isUserInitiated","setTransactionMemo","memo","Error","setTransactionId","transactionId","setNodeAccountIds","nodeAccountIds","execute","options","innerTx","success","error","transactionToExecute","originalTransactionIdForReporting","toString","schedule","isFrozen","TransactionId","generate","scheduleCreateTx","ScheduleCreateTransaction","setScheduledTransaction","scheduleMemo","setScheduleMemo","setPayerAccountId","schedulePayerAccountId","payerForScheduleCreate","addNote","agentOperator","getOperator","adminKeyList","KeyList","setThreshold","publicKey","push","mirrorNode","userAccountInfo","requestAccount","key","PublicKey","e","warn","message","Array","from","length","setAdminKey","freezeWith","client","receipt","signAndExecuteTransaction","result","scheduleId","console","log","getTransactionBytes","transactionForBytes","payerAccountId","scheduleAdminKey","Buffer","toBytes","executeWithSigner","newSigner","setCurrentTransaction","transaction","getCurrentTransaction","note","getNotes","clearNotes","parseKey","keyInput","PrivateKey","toLowerCase","info","getPublicKey","detectKeyTypeFromString","privateKey","e2","error2","substring","JSON","stringify","parseAmount","amount","Long","fromNumber","BigNumber","DEFAULT_AUTORENEW_PERIOD_SECONDS","HcsBuilder","super","createTopic","params","TopicCreateTransaction","setTopicMemo","adminKey","parsedAdminKey","feeScheduleKey","parsedFeeScheduleKey","setFeeScheduleKey","submitKey","parsedSubmitKey","setSubmitKey","autoRenewPeriod","setAutoRenewPeriod","autoRenewAccountId","setAutoRenewAccountId","customFees","setCustomFees","exemptAccountIds","publicKeys","accountIdStr","submitMessageToTopic","topicId","TopicId","messageContents","messageBytesLength","TopicMessageSubmitTransaction","setTopicId","setMessage","maxChunks","setMaxChunks","chunkSize","setChunkSize","deleteTopic","TopicDeleteTransaction","updateTopic","TopicUpdateTransaction","Object","prototype","hasOwnProperty","call","setFeeExemptKeys","generateDefaultSymbol","tokenName","symbol","replace","toUpperCase","mapToSdkCustomFees","fees","parseAmountFn","kitUserAccountId","kitOperationalMode","addNoteFn","map","feeData","feeCollectorSdkAccountId","feeCollectorStringToParse","feeCollectorAccountId","feeTypeForNote","type","fixedFee","CustomFixedFee","setFeeCollectorAccountId","setAmount","denominatingTokenId","setDenominatingTokenId","TokenId","fractionalFee","CustomFractionalFee","setNumerator","numerator","toNumber","setDenominator","denominator","minAmount","setMin","maxAmount","setMax","fractionalFeeData","assessmentMethodInclusive","setAssessmentMethod","FeeAssessmentMethod","Inclusive","Exclusive","royaltyFee","CustomRoyaltyFee","royaltyFeeData","fallbackFee","fallbackFeeCollectorSdkAccountId","fallbackFeeCollectorStringToParse","fallback","setFallbackFee","exhaustiveCheck","HtsBuilder","createFungibleToken","treasuryAccId","treasuryAccountId","operationalMode","sdkSupplyType","tokenSymbolToUse","tokenSymbol","supplyType","supplyTypeString","TokenSupplyType","Finite","Infinite","TokenCreateTransaction","setTokenName","setTokenSymbol","setTreasuryAccountId","setTokenType","TokenType","FungibleCommon","setSupplyType","setInitialSupply","initialSupply","setDecimals","decimals","maxSupply","setMaxSupply","parsedKey","kycKey","setKycKey","freezeKey","setFreezeKey","wipeKey","setWipeKey","supplyKey","setSupplyKey","pauseKey","setPauseKey","setTokenMemo","sdkCustomFees","bind","createNonFungibleToken","NonFungibleUnique","operator","query","getAccountInfo","mintFungibleToken","TokenMintTransaction","setTokenId","tokenId","burnFungibleToken","TokenBurnTransaction","mintNonFungibleToken","setMetadata","metadata","m","burnNonFungibleToken","serials","serialsAsLong","s","setSerials","transferNft","TransferTransaction","isApproved","addApprovedNftTransfer","nftId","senderAccountId","receiverAccountId","addNftTransfer","associateTokens","TokenAssociateTransaction","setAccountId","accountId","setTokenIds","tokenIds","id","dissociateTokens","TokenDissociateTransaction","transferTokens","tokenTransfers","transferInput","fungibleTransfer","addTokenTransfer","toolNftInput","sdkTokenId","serialValueForLong","serial","parseInt","sdkSerial","fromValue","sdkNftId","NftId","hbarTransfers","hbarInput","sdkHbarAmount","Hbar","addHbarTransfer","wipeTokenAccount","TokenWipeTransaction","freezeTokenAccount","TokenFreezeTransaction","unfreezeTokenAccount","TokenUnfreezeTransaction","grantKycToken","TokenGrantKycTransaction","revokeKycToken","TokenRevokeKycTransaction","pauseToken","TokenPauseTransaction","unpauseToken","TokenUnpauseTransaction","updateToken","TokenUpdateTransaction","pk","autoRenewId","deleteToken","TokenDeleteTransaction","feeScheduleUpdate","TokenFeeScheduleUpdateTransaction","airdropToken","recipients","TokenAirdropTransaction","operatorAccountId","validTransfersMade","recipient","transferAmount","isZero","isNegative","negate","claimAirdrop","pendingAirdropIds","TokenClaimAirdropTransaction","pendingId","addPendingAirdropId","cancelAirdrop","TokenCancelAirdropTransaction","setPendingAirdropIds","rejectTokens","TokenRejectTransaction","setOwnerId","tokenToReject","addTokenId","DEFAULT_ACCOUNT_AUTORENEW_PERIOD_SECONDS","AccountBuilder","createAccount","AccountCreateTransaction","autoRenewPeriodSetByUser","keyDetection","setKeyWithoutAlias","initialBalance","setInitialBalance","receiverSignatureRequired","setReceiverSignatureRequired","seconds","setAccountMemo","maxAutomaticTokenAssociations","setMaxAutomaticTokenAssociations","stakedAccountId","setStakedAccountId","stakedNodeId","setStakedNodeId","declineStakingReward","setDeclineStakingReward","alias","setAlias","transferHbar","transfers","netZeroInTinybars","userTransferProcessedForScheduling","receiverTransfer","amountValue","isPositive","recipientAccountId","negated","tinybarsContribution","toTinybars","plus","updateAccount","accountIdToUpdate","AccountUpdateTransaction","setKey","saId","String","test","deleteAccount","deleteAccountId","transferAccountId","AccountDeleteTransaction","setTransferAccountId","approveHbarAllowance","AccountAllowanceApproveTransaction","ownerAccountId","spenderAccountId","approveTokenNftAllowance","owner","allSerials","approveTokenNftAllowanceAllSerials","serialLong","approveFungibleTokenAllowance","amountLong","approveTokenAllowance","deleteNftSpenderAllowance","AccountAllowanceDeleteTransaction","deleteAllTokenNftAllowances","revokeHbarAllowance","revokeFungibleTokenAllowance","deleteNftSerialAllowancesForAllSpenders","ownerAccId","parts","nftIdString","split","deleteTokenNftAllowanceForSpender","ownerAccIdToUse","sdkSerials","prepareSignScheduledTransaction","ScheduleId","ScheduleSignTransaction","setScheduleId","DEFAULT_CONTRACT_AUTORENEW_PERIOD_SECONDS","ScsBuilder","createContract","ContractCreateTransaction","bytecodeFileId","setBytecodeFileId","bytecode","setBytecode","gas","setGas","balance","fromTinybars","constructorParameters","setConstructorParameters","setContractMemo","executeContract","gasValue","ContractExecuteTransaction","setContractId","contractId","setFunction","functionName","functionParameters","payableAmount","hbarAmount","setPayableAmount","updateContract","ContractUpdateTransaction","proxyAccountId","setProxyAccountId","deleteContract","ContractDeleteTransaction","transferContractId","setTransferContractId","callContract","ContractCallQuery","maxQueryPayment","setQueryPayment","paymentTransactionId","setPaymentTransactionId","MAX_FILE_APPEND_BYTES","FileBuilder","createFile","FileCreateTransaction","contents","setContents","keys","filter","setKeys","setFileMemo","appendFile","fileId","FileAppendTransaction","setFileId","contentsBytes","subarray","updateFile","FileUpdateTransaction","deleteFile","FileDeleteTransaction","filterUndefined","obj","filtered","value","entries","QueryBuilder","getTopicInfo","topicIdString","getTopicMessages","getTopicMessagesByFilter","accountIdString","getAccountBalance","getAccountMemo","getTokenInfo","getAccountTokens","limit","getAccountNfts","validateNftOwnership","serialNumber","validateNFTOwnership","getTransaction","transactionIdOrHash","getTransactionByTimestamp","timestamp","getScheduleInfo","getScheduledTransactionStatus","getHbarPrice","date","getHBARPrice","readSmartContract","contractIdOrAddress","functionSelector","payerIdString","readSmartContractQuery","getTopicFees","checkKeyListAccess","keyBytes","userPublicKey","getOutstandingTokenAirdrops","accountIdOrArgs","finalOptions","order","receiverId","filteredOptions","hasFilters","getPendingTokenAirdrops","senderId","getBlocks","getBlock","blockNumberOrHash","getContractResults","getContractResult","nonce","getContractLogs","getContractActions","getNftInfo","getNftsByToken","getNetworkStake","getNetworkSupply","getContracts","getContract","includeBytecode","response","getContractResultsByContract","getContractState","getContractLogsByContract","getNetworkInfo","getNetworkFees","getOpcodeTraces","HederaTransactionMetaOptionsSchema","z","object","transactionMemo","string","optional","describe","array","boolean","BaseHederaTransactionTool","StructuredTool","rest","neverScheduleThisTool","schema","specificInputSchema","extend","metaOptions","_applyMetaOptions","builder","metaOpts","specificCallArgs","_substituteKeyFields","_applyTransactionOptions","keyFieldNames","keyField","pubKeyString","toStringDer","typedError","_handleDirectExecution","allNotes","execOptions","_buildScheduleOptions","name","_handleProvideBytes","_shouldScheduleTransaction","_handleScheduledTransaction","_handleUnscheduledTransaction","scheduleUserTransactionsInBytesMode","scheduleCreateResult","description","userInfo","op","payer_account_id_scheduled_tx","memo_scheduled_tx","bytes","transactionBytes","forceSchedule","keyString","getNoteForKey","schemaDefaultValue","actualValue","_call","args","runManager","llmProvidedMetaOptions","_extractSpecificArgsFromCombinedArgs","parse","zodSchemaInfoNotes","shape","fieldSchema","_def","typeName","defaultValueOrFn","defaultValue","schemaDefinedDefaultValue","eDefaultFn","currentValue","noteMessage","debug","getServiceBuilder","callBuilderMethod","builderAppliedDefaultNotes","builderNotesOnError","allNotesOnError","_handleError","combinedArgs","specificArgs","errorMessage","CustomFeeObjectSchema","union","number","CreateTopicZodSchemaCore","int","positive","HederaCreateTopicTool","namespace","hcs","DeleteTopicZodSchemaCore","HederaDeleteTopicTool","SubmitMessageZodSchemaCore","HederaSubmitMessageTool","ClaimAirdropZodSchemaCore","pendingAirdrops","min","max","HederaClaimAirdropTool","hts","claimParams","item","index","itemNumber","serialValue","tokId","PendingAirdropId","FixedFeeInputSchema","enum","FractionalFeeInputSchema","RoyaltyFeeInputSchema","omit","CustomFeeInputUnionSchema","discriminatedUnion","FTCreateZodSchemaCore","default","freezeDefault","SDKTokenSupplyType","HederaCreateFungibleTokenTool","BigInt","toLocaleString","NFTCreateZodSchemaCore","HederaCreateNftTool","MintFTZodSchemaCore","HederaMintFungibleTokenTool","MintNFTZodSchemaCore","batchSize","HederaMintNftTool","RejectTokensZodSchemaCore","HederaRejectTokensTool","FungibleTokenTransferInputSchema","literal","NftTransferInputSchema","HbarTransferInputSchema","TransferTokensZodObjectSchema","HederaTransferTokensTool","DissociateTokensZodSchemaCore","HederaDissociateTokensTool","UpdateTokenZodSchemaCore","nullable","HederaUpdateTokenTool","DeleteTokenZodSchemaCore","HederaDeleteTokenTool","PauseTokenZodSchemaCore","HederaPauseTokenTool","UnpauseTokenZodSchemaCore","HederaUnpauseTokenTool","FreezeTokenAccountZodSchemaCore","HederaFreezeTokenAccountTool","UnfreezeTokenAccountZodSchemaCore","HederaUnfreezeTokenAccountTool","GrantKycTokenZodSchemaCore","HederaGrantKycTokenTool","RevokeKycTokenZodSchemaCore","HederaRevokeKycTokenTool","WipeTokenAccountZodSchemaCore","HederaWipeTokenAccountTool","TokenFeeScheduleUpdateZodSchemaCore","HederaTokenFeeScheduleUpdateTool","TransferNftZodSchemaCore","HederaTransferNftTool","BurnFTZodSchemaCore","HederaBurnFungibleTokenTool","BurnNFTZodSchemaCore","HederaBurnNftTool","ApproveFungibleTokenAllowanceZodSchemaCore","HederaApproveFungibleTokenAllowanceTool","accounts","ApproveHbarAllowanceZodSchemaCore","HederaApproveHbarAllowanceTool","ApproveTokenNftAllowanceZodSchemaCore","HederaApproveTokenNftAllowanceTool","CreateAccountZodSchemaCore","HederaCreateAccountTool","DeleteAccountZodSchemaCore","HederaDeleteAccountTool","UpdateAccountZodSchemaCore","HederaUpdateAccountTool","TransferHbarZodSchemaCore","HederaTransferHbarTool","RevokeHbarAllowanceZodSchemaCore","HederaRevokeHbarAllowanceTool","RevokeFungibleTokenAllowanceZodSchemaCore","HederaRevokeFungibleTokenAllowanceTool","signAndExecuteScheduledTransactionSchema","SignAndExecuteScheduledTransactionTool","accountBuilder","trim","CreateFileZodSchemaCore","HederaCreateFileTool","fs","AppendFileZodSchemaCore","HederaAppendFileTool","UpdateFileZodSchemaCore","HederaUpdateFileTool","DeleteFileZodSchemaCore","HederaDeleteFileTool","CreateContractZodSchemaCore","bytecodeHex","constructorParametersHex","HederaCreateContractTool","scs","UpdateContractZodSchemaCore","HederaUpdateContractTool","DeleteContractZodSchemaCore","HederaDeleteContractTool","FunctionParameterInputSchema","any","ExecuteContractZodSchemaCore","HederaExecuteContractTool","ModelCapability","FALLBACK_MODEL_REGISTRY","capability","SMALL","contextWindow","LARGE","MEDIUM","ModelCapabilityDetector","lastFetchTime","CACHE_DURATION","OPENROUTER_API_URL","registry","getInstance","instance","determineCapability","model","modelId","contextLength","context_length","includes","UNLIMITED","fetchModelsFromAPI","fetch","headers","Accept","ok","status","statusText","models","json","data","config","simplifiedId","getSimplifiedModelId","Date","now","fullId","startsWith","ensureModelsLoaded","registerModel","modelName","registerModels","assign","getModelCapability","exactMatch","normalizedName","registeredName","getCapabilityFromHeuristics","getModelCapabilitySync","getModelConfig","getContextWindow","getContextWindowSync","getAllModels","isModelRegistered","getModelsByCapability","refreshModels","getCacheStatus","isStale","lastFetch","modelCount","MODEL_STRATEGIES","maxTokens","summarizeArrays","maxArrayLength","includeMetadata","Infinity","BaseHederaQueryTool","modelCapability","customStrategy","baseStrategy","responseStrategy","estimateTokens","text","Math","ceil","matchesPattern","fieldPath","pattern","RegExp","processData","path","processors","getLargeFieldProcessors","isArray","processArray","processString","processObject","arr","processedArray","maxLength","takeFirst","floor","takeLast","slice","_summary","_originalLength","_truncatedAt","matchingEntry","find","matchingProcessor","exclude","str","truncateMessage","formatResult","processedResult","processCustomResponse","jsonString","estimatedTokens","responseWithMeta","_meta","handleError","rawData","executeQuery","processed","processLargeFields","toolResponse","getModelCapabilityLimits","arrayLimit","detector","toolDefinitionsReserve","availableTokens","calculateArrayLimit","allModels","maxContextWindow","limits","processorConfig","getNestedValue","truncated","setNestedValue","userFriendlyMessage","processDataStructure","reduce","current","currentObj","arrayKey","indexStr","arrayValue","lastKey","pop","target","targetObj","GetTopicInfoZodSchema","HederaGetTopicInfoTool","topicInfo","GetTopicFeesZodSchema","HederaGetTopicFeesTool","GetAccountBalanceZodSchema","HederaGetAccountBalanceTool","unit","GetAccountPublicKeyZodSchema","HederaGetAccountPublicKeyTool","publicKeyDer","publicKeyRaw","toStringRaw","GetAccountInfoZodSchema","HederaGetAccountInfoTool","accountInfo","GetAccountTokensZodSchema","HederaGetAccountTokensTool","tokens","tokenCount","GetAccountNftsZodSchema","HederaGetAccountNftsTool","nfts","nftCount","GetTokenInfoZodSchema","HederaGetTokenInfoTool","tokenInfo","ValidateNftOwnershipZodSchema","HederaValidateNftOwnershipTool","nftDetail","isOwned","GetHbarPriceZodSchema","HederaGetHbarPriceTool","toISOString","price","priceUsd","currency","GetTransactionZodSchema","HederaGetTransactionTool","GetOutstandingAirdropsZodSchema","HederaGetOutstandingAirdropsTool","airdrops","count","GetPendingAirdropsZodSchema","HederaGetPendingAirdropsTool","GetBlocksZodSchema","blockNumber","HederaGetBlocksTool","blocks","GetContractsZodSchema","HederaGetContractsTool","contracts","GetContractZodSchema","HederaGetContractTool","runtime_bytecode","creation_bytecode","contract","summary","contract_id","evmAddress","evm_address","created","created_timestamp","expiration","expiration_timestamp","deleted","auto_renew_period","max_automatic_token_associations","hasAdminKey","Boolean","admin_key","hasBytecode","hasRuntimeBytecode","bytecodeIncluded","GetNetworkInfoZodSchema","HederaGetNetworkInfoTool","networkInfo","GetNetworkFeesZodSchema","HederaGetNetworkFeesTool","networkFees","AirdropRecipientSchema","AirdropTokenZodSchemaCore","HederaAirdropTokenTool","AssociateTokensZodSchemaCore","HederaAssociateTokensTool","UpdateTopicZodSchemaCore","HederaUpdateTopicTool","GetTopicMessagesByFilterZodSchema","sequenceNumber","startTime","endTime","HederaGetTopicMessages","messages","messageCount","filters","GetFileContentsZodSchema","outputEncoding","HederaGetFileContentsTool","Tool","input","FileId","FileContentsQuery","outputContents","encoding","DeleteNftSpenderAllowanceZodSchemaCore","HederaDeleteNftSpenderAllowanceTool","DeleteNftSerialAllowancesZodSchemaCore","HederaDeleteNftSerialAllowancesTool","async","createHederaTools","operatorId","operatorKey","toolParams","queryToolParams","hederaTools","dotenv","NOT_INITIALIZED_ERROR","HederaAgentKit","pluginConfigInput","initialOperationalMode","mirrorNodeConfig","disableLogging","isInitialized","network","getNetwork","Client","forMainnet","forTestnet","setOperator","getOperatorPrivateKey","HederaMirrorNode","pluginConfigInternal","loadedPlugins","aggregatedTools","initialize","contextForPlugins","appConfig","plugins","pluginInstance","coreKitTools","signerAccountId","signerPrivateKey","pluginTools","flatMap","plugin","getTools","openConvAIPlugin","OpenConvAIPlugin","HCS10Client","stateManager","OpenConvaiState","hcs10Tools","getAggregatedLangChainTools","getTransactionReceipt","transactionIdInput","getReceipt","signScheduledTransaction","transactionIdToReport","ModelPricingManager","pricingCache","Map","initializeFallbackPricing","fallbackPricing","prompt","completion","pricing","set","fetchPricingFromAPI","promptPrice","parseFloat","completionPrice","isNaN","prefixes","prefix","ensurePricingLoaded","size","getPricing","get","getPricingSync","TokenUsageCallbackHandler","BaseCallbackHandler","tokenUsageHistory","currentTokenUsage","handleLLMEnd","output","llmOutput","tokenUsage","promptTokens","completionTokens","totalTokens","getLatestTokenUsage","getTokenUsageHistory","getTotalTokenUsage","acc","usage","reset","calculateTokenCostSync","promptCost","completionCost","totalCost","AbstractSigner","accountIdToQuery","initializeMirrorNode","moduleName","StandardsSdkLogger","AgentKitActionName","_MCPClient","isConnected","apiKey","serverUrl","HEDERA_MCP_SERVER_URL","clientName","clientVersion","DEBUG","hasApiKey","envUrl","isSSR","window","setInstance","setApiKey","hadApiKey","hasNewApiKey","getApiKey","connect","hasClient","url","apiKeyPrefix","requestInit","Authorization","transport","StreamableHTTPClientTransport","URL","version","capabilities","transportType","callTool","toolName","clientState","arguments","content","textContent","c","parsed","retryError","getCreditBalance","createPaymentTransaction","payer_account_id","hasTransactionBytes","transaction_bytes","transactionBytesLength","verifyPayment","transaction_id","checkPaymentStatus","getPaymentHistory","account_id","getPricingConfiguration","requestAuthChallenge","hederaAccountId","verifyAuthSignature","getApiKeys","rotateApiKey","revokeApiKey","getCreditHistory","healthCheck","getServerInfo","generateTransactionBytes","scheduleTransaction","executeTransaction","processHbarPayment","refreshProfile","connected","disconnect","close","MCPClient","hwcSdk","networkInternal","accountIdInternal","foundSigner","dAppConnector","signers","signerAccount","outcome","executeTransactionWithErrorHandling","getClient","verbose","initialModelCapability","openAIModelName","defaultLogLevel","logLevel","pluginConfig","OPENAI_MODEL_NAME","tokenUsageHandler","llm","openAIApiKey","OPENAI_API_KEY","ChatOpenAI","temperature","callbacks","constructSystemMessage","messageParts","agentOperatorId","userAccId","customSystemMessagePreamble","customSystemMessagePostamble","join","detectedCapability","systemMessage","toolsFromKit","toolFilter","originalCount","filteredCount","ChatPromptTemplate","fromMessages","MessagesPlaceholder","agent","createOpenAIToolsAgent","tools","agentExecutor","AgentExecutor","returnIntermediateSteps","processMessage","userInput","chatHistoryInput","langchainChatHistory","msg","HumanMessage","AIMessage","intermediateSteps","rawToolOutput","cost","invoke","chat_history","parsedSteps","observation","setOperationalMode","mode","totalUsage","resetTokenUsageTracking","keyType","keyTypeVerified","privateKeyString","detectedType","initializeOperator","fromStringED25519","account","_type","actualKeyType","fromStringECDSA","getSignatures","sign","getKeyType","getKeyTypeSync","pricingManager","networkType","precision","toFixed"],"mappings":"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"}