@hashgraphonline/standards-sdk 0.1.141-canary.38 → 0.1.141-canary.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/dist/cjs/hcs-11/client.d.ts.map +1 -1
  2. package/dist/cjs/hcs-11/types.d.ts +1 -0
  3. package/dist/cjs/hcs-11/types.d.ts.map +1 -1
  4. package/dist/cjs/hcs-21/browser.d.ts +17 -7
  5. package/dist/cjs/hcs-21/browser.d.ts.map +1 -1
  6. package/dist/cjs/hcs-21/sdk.d.ts.map +1 -1
  7. package/dist/cjs/hcs-21/types.d.ts +3 -0
  8. package/dist/cjs/hcs-21/types.d.ts.map +1 -1
  9. package/dist/cjs/hcs-21/verify.d.ts.map +1 -1
  10. package/dist/cjs/inscribe/inscriber.d.ts +2 -1
  11. package/dist/cjs/inscribe/inscriber.d.ts.map +1 -1
  12. package/dist/cjs/inscribe/types.d.ts +5 -0
  13. package/dist/cjs/inscribe/types.d.ts.map +1 -1
  14. package/dist/cjs/services/registry-broker/client.d.ts.map +1 -1
  15. package/dist/cjs/services/registry-broker/schemas.d.ts +14 -14
  16. package/dist/cjs/standards-sdk.cjs +2 -2
  17. package/dist/cjs/standards-sdk.cjs.map +1 -1
  18. package/dist/es/hcs-11/client.d.ts.map +1 -1
  19. package/dist/es/hcs-11/types.d.ts +1 -0
  20. package/dist/es/hcs-11/types.d.ts.map +1 -1
  21. package/dist/es/hcs-21/browser.d.ts +17 -7
  22. package/dist/es/hcs-21/browser.d.ts.map +1 -1
  23. package/dist/es/hcs-21/sdk.d.ts.map +1 -1
  24. package/dist/es/hcs-21/types.d.ts +3 -0
  25. package/dist/es/hcs-21/types.d.ts.map +1 -1
  26. package/dist/es/hcs-21/verify.d.ts.map +1 -1
  27. package/dist/es/inscribe/inscriber.d.ts +2 -1
  28. package/dist/es/inscribe/inscriber.d.ts.map +1 -1
  29. package/dist/es/inscribe/types.d.ts +5 -0
  30. package/dist/es/inscribe/types.d.ts.map +1 -1
  31. package/dist/es/services/registry-broker/client.d.ts.map +1 -1
  32. package/dist/es/services/registry-broker/schemas.d.ts +14 -14
  33. package/dist/es/standards-sdk.es100.js +1 -1
  34. package/dist/es/standards-sdk.es104.js +1 -1
  35. package/dist/es/standards-sdk.es110.js +1 -1
  36. package/dist/es/standards-sdk.es111.js +5 -5
  37. package/dist/es/standards-sdk.es121.js +1 -1
  38. package/dist/es/standards-sdk.es122.js +1 -1
  39. package/dist/es/standards-sdk.es123.js +5 -5
  40. package/dist/es/standards-sdk.es125.js +93 -5
  41. package/dist/es/standards-sdk.es125.js.map +1 -1
  42. package/dist/es/standards-sdk.es126.js +1 -1
  43. package/dist/es/standards-sdk.es128.js +2 -2
  44. package/dist/es/standards-sdk.es128.js.map +1 -1
  45. package/dist/es/standards-sdk.es129.js +1 -1
  46. package/dist/es/standards-sdk.es13.js +1 -1
  47. package/dist/es/standards-sdk.es135.js +28 -82
  48. package/dist/es/standards-sdk.es135.js.map +1 -1
  49. package/dist/es/standards-sdk.es136.js +766 -28
  50. package/dist/es/standards-sdk.es136.js.map +1 -1
  51. package/dist/es/standards-sdk.es137.js +12269 -12
  52. package/dist/es/standards-sdk.es137.js.map +1 -1
  53. package/dist/es/standards-sdk.es139.js +34 -12266
  54. package/dist/es/standards-sdk.es139.js.map +1 -1
  55. package/dist/es/standards-sdk.es140.js +17 -766
  56. package/dist/es/standards-sdk.es140.js.map +1 -1
  57. package/dist/es/standards-sdk.es141.js +168 -38
  58. package/dist/es/standards-sdk.es141.js.map +1 -1
  59. package/dist/es/standards-sdk.es142.js +321 -55
  60. package/dist/es/standards-sdk.es142.js.map +1 -1
  61. package/dist/es/standards-sdk.es143.js +294 -120
  62. package/dist/es/standards-sdk.es143.js.map +1 -1
  63. package/dist/es/standards-sdk.es144.js +322 -191
  64. package/dist/es/standards-sdk.es144.js.map +1 -1
  65. package/dist/es/standards-sdk.es145.js +279 -294
  66. package/dist/es/standards-sdk.es145.js.map +1 -1
  67. package/dist/es/standards-sdk.es146.js +63 -440
  68. package/dist/es/standards-sdk.es146.js.map +1 -1
  69. package/dist/es/standards-sdk.es147.js +55 -330
  70. package/dist/es/standards-sdk.es147.js.map +1 -1
  71. package/dist/es/standards-sdk.es148.js +66 -60
  72. package/dist/es/standards-sdk.es148.js.map +1 -1
  73. package/dist/es/standards-sdk.es17.js +1 -1
  74. package/dist/es/standards-sdk.es19.js +3 -3
  75. package/dist/es/standards-sdk.es2.js +72 -26
  76. package/dist/es/standards-sdk.es2.js.map +1 -1
  77. package/dist/es/standards-sdk.es20.js +2 -2
  78. package/dist/es/standards-sdk.es23.js +1 -1
  79. package/dist/es/standards-sdk.es28.js +7 -5
  80. package/dist/es/standards-sdk.es28.js.map +1 -1
  81. package/dist/es/standards-sdk.es29.js.map +1 -1
  82. package/dist/es/standards-sdk.es31.js +1 -1
  83. package/dist/es/standards-sdk.es32.js +1 -1
  84. package/dist/es/standards-sdk.es36.js +3 -2
  85. package/dist/es/standards-sdk.es36.js.map +1 -1
  86. package/dist/es/standards-sdk.es37.js +2 -2
  87. package/dist/es/standards-sdk.es38.js +1 -1
  88. package/dist/es/standards-sdk.es54.js +1 -1
  89. package/dist/es/standards-sdk.es57.js +1 -1
  90. package/dist/es/standards-sdk.es59.js +1 -1
  91. package/dist/es/standards-sdk.es60.js +1 -1
  92. package/dist/es/standards-sdk.es61.js +1 -1
  93. package/dist/es/standards-sdk.es63.js +1 -1
  94. package/dist/es/standards-sdk.es65.js +1 -1
  95. package/dist/es/standards-sdk.es66.js +1 -1
  96. package/dist/es/standards-sdk.es69.js +1 -1
  97. package/dist/es/standards-sdk.es70.js +1 -1
  98. package/dist/es/standards-sdk.es72.js +1 -1
  99. package/dist/es/standards-sdk.es78.js +1 -1
  100. package/dist/es/standards-sdk.es79.js +1 -1
  101. package/dist/es/standards-sdk.es8.js +1 -1
  102. package/dist/es/standards-sdk.es80.js.map +1 -1
  103. package/dist/es/standards-sdk.es82.js +1 -1
  104. package/dist/es/standards-sdk.es84.js +3 -1
  105. package/dist/es/standards-sdk.es84.js.map +1 -1
  106. package/dist/es/standards-sdk.es85.js +256 -9
  107. package/dist/es/standards-sdk.es85.js.map +1 -1
  108. package/dist/es/standards-sdk.es86.js.map +1 -1
  109. package/dist/es/standards-sdk.es92.js +1 -1
  110. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es144.js","sources":["../../src/utils/parsers/file-parser.ts"],"sourcesContent":["import { proto } from '@hashgraph/proto';\nimport { Long, Transaction } from '@hashgraph/sdk';\nimport {\n FileCreateData,\n FileAppendData,\n FileUpdateData,\n FileDeleteData,\n} from '../transaction-parser-types';\nimport {\n parseKey,\n extractTransactionBody,\n hasTransactionType,\n} from './parser-utils';\nimport { Buffer } from 'buffer';\nimport { FileId } from '@hashgraph/sdk';\n\n/**\n * File Service Parser\n *\n * Handles parsing for all file-related transaction types including:\n * - File creation, updates, append, and deletion\n * - Proper dual-branch parsing (regular vs signed transactions)\n * - Comprehensive protobuf extraction\n * - Enhanced content handling with type detection\n */\nexport class FileParser {\n /**\n * Parse File Service transaction using unified dual-branch approach\n * This handles both regular transactions and signed transaction variants\n */\n static parseFileTransaction(\n transaction: Transaction,\n originalBytes?: Uint8Array,\n ): {\n type?: string;\n humanReadableType?: string;\n fileCreate?: FileCreateData;\n fileAppend?: FileAppendData;\n fileUpdate?: FileUpdateData;\n fileDelete?: FileDeleteData;\n [key: string]: unknown;\n } {\n try {\n if (originalBytes || transaction.toBytes) {\n try {\n const bytesToParse = originalBytes || transaction.toBytes();\n const decoded = proto.TransactionList.decode(bytesToParse);\n\n if (decoded.transactionList && decoded.transactionList.length > 0) {\n const tx = decoded.transactionList[0];\n let txBody: proto.ITransactionBody | null = null;\n\n if (tx.bodyBytes && tx.bodyBytes.length > 0) {\n txBody = proto.TransactionBody.decode(tx.bodyBytes);\n } else if (\n tx.signedTransactionBytes &&\n tx.signedTransactionBytes.length > 0\n ) {\n const signedTx = proto.SignedTransaction.decode(\n tx.signedTransactionBytes,\n );\n if (signedTx.bodyBytes) {\n txBody = proto.TransactionBody.decode(signedTx.bodyBytes);\n }\n }\n\n if (txBody) {\n const protoResult = this.parseFromProtobufTxBody(txBody);\n if (protoResult.type && protoResult.type !== 'UNKNOWN') {\n return protoResult;\n }\n }\n }\n } catch (protoError) {}\n }\n\n return this.parseFromTransactionInternals(transaction);\n } catch (error) {\n return { type: 'UNKNOWN', humanReadableType: 'Unknown File Transaction' };\n }\n }\n\n /**\n * Parse file transaction from protobuf TransactionBody\n * Handles all file operations from decoded protobuf data\n */\n private static parseFromProtobufTxBody(txBody: proto.ITransactionBody): {\n type?: string;\n humanReadableType?: string;\n [key: string]: unknown;\n } {\n if (txBody.fileCreate) {\n const fileCreate = this.parseFileCreate(txBody.fileCreate);\n if (fileCreate) {\n return {\n type: 'FILECREATE',\n humanReadableType: 'File Create',\n fileCreate,\n };\n }\n }\n\n if (txBody.fileAppend) {\n const fileAppend = this.parseFileAppend(txBody.fileAppend);\n if (fileAppend) {\n return {\n type: 'FILEAPPEND',\n humanReadableType: 'File Append',\n fileAppend,\n };\n }\n }\n\n if (txBody.fileUpdate) {\n const fileUpdate = this.parseFileUpdate(txBody.fileUpdate);\n if (fileUpdate) {\n return {\n type: 'FILEUPDATE',\n humanReadableType: 'File Update',\n fileUpdate,\n };\n }\n }\n\n if (txBody.fileDelete) {\n const fileDelete = this.parseFileDelete(txBody.fileDelete);\n if (fileDelete) {\n return {\n type: 'FILEDELETE',\n humanReadableType: 'File Delete',\n fileDelete,\n };\n }\n }\n\n return {};\n }\n\n /**\n * Extract file data from Transaction internal fields\n * This handles cases where data is stored in Transaction object internals\n */\n private static parseFromTransactionInternals(transaction: Transaction): {\n type?: string;\n humanReadableType?: string;\n [key: string]: unknown;\n } {\n try {\n const tx = transaction as unknown as {\n _fileId?: { toString(): string };\n _contents?: Uint8Array;\n _keys?: unknown[];\n _expirationTime?: { toString(): string };\n _memo?: string;\n constructor?: { name?: string };\n };\n\n if (hasTransactionType(transaction, 'fileCreate')) {\n const fileCreate: FileCreateData = {};\n\n if (tx._contents) {\n const contentInfo = this.analyzeContent(tx._contents);\n fileCreate.contents = contentInfo.encoded;\n if (contentInfo.contentType) {\n fileCreate.contentType = contentInfo.contentType;\n }\n if (contentInfo.size) {\n fileCreate.contentSize = contentInfo.size;\n }\n }\n\n if (tx._keys && tx._keys.length > 0) {\n const keyList: proto.IKeyList = {\n keys: tx._keys as unknown as proto.IKey[],\n };\n fileCreate.keys = parseKey({ keyList });\n }\n\n if (tx._expirationTime) {\n fileCreate.expirationTime = tx._expirationTime.toString();\n }\n\n if (tx._memo) {\n fileCreate.memo = tx._memo;\n }\n\n return {\n type: 'FILECREATE',\n humanReadableType: 'File Create',\n fileCreate,\n };\n }\n\n if (hasTransactionType(transaction, 'fileAppend')) {\n const fileAppend: FileAppendData = {\n fileId: tx._fileId.toString(),\n };\n\n if (tx._contents) {\n const contentInfo = this.analyzeContent(tx._contents);\n fileAppend.contents = contentInfo.encoded;\n if (contentInfo.size) {\n fileAppend.contentSize = contentInfo.size;\n }\n }\n\n return {\n type: 'FILEAPPEND',\n humanReadableType: 'File Append',\n fileAppend,\n };\n }\n\n if (hasTransactionType(transaction, 'fileUpdate')) {\n const fileUpdate: FileUpdateData = {\n fileId: tx._fileId.toString(),\n };\n\n if (tx._contents) {\n const contentInfo = this.analyzeContent(tx._contents);\n fileUpdate.contents = contentInfo.encoded;\n if (contentInfo.size) {\n fileUpdate.contentSize = contentInfo.size;\n }\n }\n\n if (tx._keys && tx._keys.length > 0) {\n const keyList: proto.IKeyList = {\n keys: tx._keys as unknown as proto.IKey[],\n };\n fileUpdate.keys = parseKey({ keyList });\n }\n\n if (tx._expirationTime) {\n fileUpdate.expirationTime = tx._expirationTime.toString();\n }\n\n if (tx._memo) {\n fileUpdate.memo = tx._memo;\n }\n\n return {\n type: 'FILEUPDATE',\n humanReadableType: 'File Update',\n fileUpdate,\n };\n }\n\n if (hasTransactionType(transaction, 'fileDelete')) {\n const fileDelete: FileDeleteData = {\n fileId: tx._fileId.toString(),\n };\n\n return {\n type: 'FILEDELETE',\n humanReadableType: 'File Delete',\n fileDelete,\n };\n }\n\n return {};\n } catch (error) {\n return {};\n }\n }\n\n /**\n * Enhanced content analysis with type detection and metadata\n */\n private static analyzeContent(contents: Uint8Array): {\n encoded: string;\n contentType?: string;\n size: number;\n } {\n const size = contents.length;\n const contentBuffer = Buffer.from(contents);\n\n let contentType: string | undefined;\n\n if (size >= 4) {\n const header = contentBuffer.subarray(0, 4);\n const headerHex = header.toString('hex');\n\n const signatures: Record<string, string> = {\n '89504e47': 'image/png',\n ffd8ffe0: 'image/jpeg',\n ffd8ffe1: 'image/jpeg',\n '47494638': 'image/gif',\n '25504446': 'application/pdf',\n '504b0304': 'application/zip',\n '7f454c46': 'application/x-executable',\n d0cf11e0: 'application/msoffice',\n };\n\n contentType = signatures[headerHex.toLowerCase()];\n }\n\n if (!contentType) {\n try {\n const textContent = contentBuffer.toString('utf8');\n const hasControlChars = /[\\x00-\\x08\\x0B\\x0E-\\x1F\\x7F]/.test(\n textContent,\n );\n const hasReplacementChars = textContent.includes('\\uFFFD');\n\n if (!hasControlChars && !hasReplacementChars) {\n if (\n textContent.trim().startsWith('{') &&\n textContent.trim().endsWith('}')\n ) {\n contentType = 'application/json';\n } else if (\n textContent.includes('<?xml') ||\n textContent.includes('<html')\n ) {\n contentType = 'text/xml';\n } else if (textContent.includes('<!DOCTYPE html')) {\n contentType = 'text/html';\n } else {\n contentType = 'text/plain';\n }\n } else {\n contentType = 'application/octet-stream';\n }\n } catch {\n contentType = 'application/octet-stream';\n }\n }\n\n let encoded: string;\n if (\n contentType?.startsWith('text/') ||\n contentType === 'application/json'\n ) {\n try {\n encoded = contentBuffer.toString('utf8');\n if (\n encoded.includes('\\uFFFD') ||\n /[\\x00-\\x08\\x0B\\x0E-\\x1F\\x7F]/.test(encoded)\n ) {\n encoded = contentBuffer.toString('base64');\n }\n } catch {\n encoded = contentBuffer.toString('base64');\n }\n } else {\n encoded = contentBuffer.toString('base64');\n }\n\n return {\n encoded,\n contentType,\n size,\n };\n }\n static parseFileCreate(\n body: proto.IFileCreateTransactionBody,\n ): FileCreateData | undefined {\n if (!body) return undefined;\n const data: FileCreateData = {};\n if (body.expirationTime?.seconds) {\n data.expirationTime = `${Long.fromValue(\n body.expirationTime.seconds,\n ).toString()}.${body.expirationTime.nanos}`;\n }\n if (body.keys) {\n data.keys = parseKey({ keyList: body.keys });\n }\n if (body.contents) {\n data.contents = Buffer.from(body.contents).toString('base64');\n }\n if (body.memo) {\n data.memo = body.memo;\n }\n return data;\n }\n\n static parseFileAppend(\n body: proto.IFileAppendTransactionBody,\n ): FileAppendData | undefined {\n if (!body) return undefined;\n const data: FileAppendData = {};\n if (body.fileID) {\n data.fileId = `${body.fileID.shardNum ?? 0}.${\n body.fileID.realmNum ?? 0\n }.${body.fileID.fileNum ?? 0}`;\n }\n if (body.contents) {\n data.contents = Buffer.from(body.contents).toString('base64');\n }\n return data;\n }\n\n static parseFileUpdate(\n body: proto.IFileUpdateTransactionBody,\n ): FileUpdateData | undefined {\n if (!body) return undefined;\n const data: FileUpdateData = {};\n if (body.fileID) {\n data.fileId = `${body.fileID.shardNum ?? 0}.${\n body.fileID.realmNum ?? 0\n }.${body.fileID.fileNum ?? 0}`;\n }\n if (body.expirationTime?.seconds) {\n data.expirationTime = `${Long.fromValue(\n body.expirationTime.seconds,\n ).toString()}.${body.expirationTime.nanos}`;\n }\n if (body.keys) {\n data.keys = parseKey({ keyList: body.keys });\n }\n if (body.contents) {\n data.contents = Buffer.from(body.contents).toString('base64');\n }\n if (body.memo?.value !== undefined) {\n data.memo = body.memo.value;\n }\n return data;\n }\n\n static parseFileDelete(\n body: proto.IFileDeleteTransactionBody,\n ): FileDeleteData | undefined {\n if (!body) return undefined;\n const data: FileDeleteData = {};\n if (body.fileID) {\n data.fileId = `${body.fileID.shardNum ?? 0}.${\n body.fileID.realmNum ?? 0\n }.${body.fileID.fileNum ?? 0}`;\n }\n return data;\n }\n\n /**\n * Parse File Service transaction from Transaction object\n * This is the unified entry point that delegates to the comprehensive parsing logic\n */\n static parseFromTransactionObject(transaction: Transaction): {\n type?: string;\n humanReadableType?: string;\n [key: string]: unknown;\n } {\n return this.parseFileTransaction(transaction);\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es144.js","sources":["../../src/utils/parsers/scs-parser.ts"],"sourcesContent":["import { proto } from '@hashgraph/proto';\nimport { ContractId, Hbar, HbarUnit, Long, Transaction } from '@hashgraph/sdk';\nimport {\n ContractCallData,\n ContractCreateData,\n ContractUpdateData,\n ContractDeleteData,\n} from '../transaction-parser-types';\nimport { Buffer } from 'buffer';\nimport {\n parseKey,\n extractTransactionBody,\n hasTransactionType,\n} from './parser-utils';\nimport { AccountId, FileId } from '@hashgraph/sdk';\n\n/**\n * Smart Contract Service (SCS) Parser\n *\n * Handles parsing for all contract-related transaction types including:\n * - Contract calls (including EthereumTransaction)\n * - Contract creation, updates, and deletion\n * - Proper dual-branch parsing (regular vs signed transactions)\n * - Comprehensive protobuf extraction\n */\nexport class SCSParser {\n /**\n * Parse Smart Contract Service transaction using unified dual-branch approach\n * This handles both regular transactions and signed transaction variants\n */\n static parseSCSTransaction(\n transaction: Transaction,\n originalBytes?: Uint8Array,\n ): {\n type?: string;\n humanReadableType?: string;\n contractCall?: ContractCallData;\n contractCreate?: ContractCreateData;\n contractUpdate?: ContractUpdateData;\n contractDelete?: ContractDeleteData;\n [key: string]: unknown;\n } {\n try {\n if (originalBytes || transaction.toBytes) {\n try {\n const bytesToParse = originalBytes || transaction.toBytes();\n const decoded = proto.TransactionList.decode(bytesToParse);\n\n if (decoded.transactionList && decoded.transactionList.length > 0) {\n const tx = decoded.transactionList[0];\n let txBody: proto.ITransactionBody | null = null;\n\n if (tx.bodyBytes && tx.bodyBytes.length > 0) {\n txBody = proto.TransactionBody.decode(tx.bodyBytes);\n } else if (\n tx.signedTransactionBytes &&\n tx.signedTransactionBytes.length > 0\n ) {\n const signedTx = proto.SignedTransaction.decode(\n tx.signedTransactionBytes,\n );\n if (signedTx.bodyBytes) {\n txBody = proto.TransactionBody.decode(signedTx.bodyBytes);\n }\n }\n\n if (txBody) {\n const protoResult = this.parseFromProtobufTxBody(txBody);\n if (protoResult.type && protoResult.type !== 'UNKNOWN') {\n return protoResult;\n }\n }\n }\n } catch (protoError) {}\n }\n\n return this.parseFromTransactionInternals(transaction);\n } catch (error) {\n return {\n type: 'UNKNOWN',\n humanReadableType: 'Unknown Contract Transaction',\n };\n }\n }\n\n /**\n * Parse contract transaction from protobuf TransactionBody\n * Handles all contract operations from decoded protobuf data\n */\n private static parseFromProtobufTxBody(txBody: proto.ITransactionBody): {\n type?: string;\n humanReadableType?: string;\n [key: string]: unknown;\n } {\n if (txBody.contractCall) {\n const contractCall = this.parseContractCall(txBody.contractCall);\n if (contractCall) {\n return {\n type: 'CONTRACTCALL',\n humanReadableType: 'Contract Call',\n contractCall,\n };\n }\n }\n\n if (txBody.contractCreateInstance) {\n const contractCreate = this.parseContractCreate(\n txBody.contractCreateInstance,\n );\n if (contractCreate) {\n return {\n type: 'CONTRACTCREATE',\n humanReadableType: 'Contract Create',\n contractCreate,\n };\n }\n }\n\n if (txBody.contractUpdateInstance) {\n const contractUpdate = this.parseContractUpdate(\n txBody.contractUpdateInstance,\n );\n if (contractUpdate) {\n return {\n type: 'CONTRACTUPDATE',\n humanReadableType: 'Contract Update',\n contractUpdate,\n };\n }\n }\n\n if (txBody.contractDeleteInstance) {\n const contractDelete = this.parseContractDelete(\n txBody.contractDeleteInstance,\n );\n if (contractDelete) {\n return {\n type: 'CONTRACTDELETE',\n humanReadableType: 'Contract Delete',\n contractDelete,\n };\n }\n }\n\n if (txBody.ethereumTransaction) {\n const ethereumCall = this.parseEthereumTransaction(\n txBody.ethereumTransaction,\n );\n if (ethereumCall) {\n return {\n type: 'ETHEREUMTRANSACTION',\n humanReadableType: 'Ethereum Transaction',\n ethereumTransaction: ethereumCall,\n };\n }\n }\n\n return {};\n }\n\n /**\n * Extract contract data from Transaction internal fields\n * This handles cases where data is stored in Transaction object internals\n */\n private static parseFromTransactionInternals(transaction: Transaction): {\n type?: string;\n humanReadableType?: string;\n [key: string]: unknown;\n } {\n try {\n const tx = transaction as unknown as {\n _contractId?: { toString(): string };\n _gas?: number | Long;\n _amount?: { toString(): string };\n _functionParameters?: Uint8Array;\n _initialBalance?: { toString(): string };\n _adminKey?: unknown;\n _memo?: string;\n _fileId?: { toString(): string };\n _bytecode?: Uint8Array;\n _constructorParameters?: Uint8Array;\n _maxAutomaticTokenAssociations?: number;\n _stakedAccountId?: { toString(): string };\n _stakedNodeId?: number | Long;\n _declineReward?: boolean;\n _autoRenewPeriod?: { toString(): string };\n _transferAccountId?: { toString(): string };\n _transferContractId?: { toString(): string };\n constructor?: { name?: string };\n };\n\n if (tx._contractId && tx._gas) {\n const contractCall: ContractCallData = {\n contractId: tx._contractId.toString(),\n gas:\n typeof tx._gas === 'number'\n ? tx._gas\n : Long.fromValue(tx._gas).toNumber(),\n amount: tx._amount ? parseFloat(tx._amount.toString()) : 0,\n };\n\n if (tx._functionParameters) {\n const funcParams = Buffer.from(tx._functionParameters).toString(\n 'hex',\n );\n contractCall.functionParameters = funcParams;\n contractCall.functionName = this.extractFunctionName(funcParams);\n }\n\n return {\n type: 'CONTRACTCALL',\n humanReadableType: 'Contract Call',\n contractCall,\n };\n }\n\n if (hasTransactionType(transaction, 'contractCreateInstance')) {\n const contractCreate: ContractCreateData = {\n gas: tx._gas.toString(),\n initialBalance: tx._initialBalance?.toString() || '0',\n };\n\n if (tx._fileId) {\n contractCreate.initcodeSource = 'fileID';\n contractCreate.initcode = tx._fileId.toString();\n } else if (tx._bytecode) {\n contractCreate.initcodeSource = 'bytes';\n contractCreate.initcode = Buffer.from(tx._bytecode).toString('hex');\n }\n\n if (tx._constructorParameters) {\n contractCreate.constructorParameters = Buffer.from(\n tx._constructorParameters,\n ).toString('hex');\n }\n\n if (tx._memo) contractCreate.memo = tx._memo;\n if (tx._adminKey) contractCreate.adminKey = parseKey(tx._adminKey);\n if (tx._maxAutomaticTokenAssociations !== undefined) {\n contractCreate.maxAutomaticTokenAssociations =\n tx._maxAutomaticTokenAssociations;\n }\n if (tx._stakedAccountId) {\n contractCreate.stakedAccountId = tx._stakedAccountId.toString();\n } else if (\n tx._stakedNodeId !== null &&\n tx._stakedNodeId !== undefined\n ) {\n contractCreate.stakedNodeId = Long.fromValue(\n tx._stakedNodeId,\n ).toString();\n }\n if (tx._declineReward !== undefined)\n contractCreate.declineReward = tx._declineReward;\n if (tx._autoRenewPeriod)\n contractCreate.autoRenewPeriod = tx._autoRenewPeriod.toString();\n\n return {\n type: 'CONTRACTCREATE',\n humanReadableType: 'Contract Create',\n contractCreate,\n };\n }\n\n if (hasTransactionType(transaction, 'contractUpdateInstance')) {\n const contractUpdate: ContractUpdateData = {\n contractIdToUpdate: tx._contractId.toString(),\n };\n\n if (tx._memo) contractUpdate.memo = tx._memo;\n if (tx._adminKey) contractUpdate.adminKey = parseKey(tx._adminKey);\n if (tx._maxAutomaticTokenAssociations !== undefined) {\n contractUpdate.maxAutomaticTokenAssociations =\n tx._maxAutomaticTokenAssociations;\n }\n if (tx._stakedAccountId) {\n contractUpdate.stakedAccountId = tx._stakedAccountId.toString();\n } else if (\n tx._stakedNodeId !== null &&\n tx._stakedNodeId !== undefined\n ) {\n contractUpdate.stakedNodeId = Long.fromValue(\n tx._stakedNodeId,\n ).toString();\n }\n if (tx._declineReward !== undefined)\n contractUpdate.declineReward = tx._declineReward;\n if (tx._autoRenewPeriod)\n contractUpdate.autoRenewPeriod = tx._autoRenewPeriod.toString();\n\n return {\n type: 'CONTRACTUPDATE',\n humanReadableType: 'Contract Update',\n contractUpdate,\n };\n }\n\n if (hasTransactionType(transaction, 'contractDeleteInstance')) {\n const contractDelete: ContractDeleteData = {\n contractIdToDelete: tx._contractId.toString(),\n };\n\n if (tx._transferAccountId) {\n contractDelete.transferAccountId = tx._transferAccountId.toString();\n } else if (tx._transferContractId) {\n contractDelete.transferContractId = tx._transferContractId.toString();\n }\n\n return {\n type: 'CONTRACTDELETE',\n humanReadableType: 'Contract Delete',\n contractDelete,\n };\n }\n\n return {};\n } catch (error) {\n return {};\n }\n }\n\n /**\n * Enhanced function name extraction from contract call parameters\n * Attempts to decode function selector and map to known function names\n */\n private static extractFunctionName(functionParameters: string): string {\n if (functionParameters.length < 8) return 'unknown';\n\n const selector = functionParameters.substring(0, 8);\n\n const commonSelectors: Record<string, string> = {\n a9059cbb: 'transfer',\n '095ea7b3': 'approve',\n '23b872dd': 'transferFrom',\n '70a08231': 'balanceOf',\n dd62ed3e: 'allowance',\n '18160ddd': 'totalSupply',\n '06fdde03': 'name',\n '95d89b41': 'symbol',\n '313ce567': 'decimals',\n '42842e0e': 'safeTransferFrom',\n b88d4fde: 'safeTransferFrom',\n e985e9c5: 'isApprovedForAll',\n a22cb465: 'setApprovalForAll',\n '6352211e': 'ownerOf',\n c87b56dd: 'tokenURI',\n '01ffc9a7': 'supportsInterface',\n '40c10f19': 'mint',\n '42966c68': 'burn',\n f2fde38b: 'transferOwnership',\n '715018a6': 'renounceOwnership',\n '8da5cb5b': 'owner',\n };\n\n return commonSelectors[selector] || selector;\n }\n\n /**\n * Parse Ethereum Transaction (was completely missing from original parser)\n */\n static parseEthereumTransaction(\n body: proto.IEthereumTransactionBody,\n ): ContractCallData | undefined {\n if (!body) return undefined;\n\n const data: ContractCallData = {\n contractId: 'EVM',\n gas: body.maxGasAllowance\n ? Long.fromValue(body.maxGasAllowance).toNumber()\n : 0,\n amount: 0,\n };\n\n if (body.ethereumData && body.ethereumData.length > 0) {\n const ethData = Buffer.from(body.ethereumData).toString('hex');\n data.functionParameters = ethData;\n\n if (ethData.length >= 8) {\n data.functionName = this.extractFunctionName(ethData);\n }\n }\n\n return data;\n }\n\n static parseContractCall(\n body: proto.IContractCallTransactionBody,\n ): ContractCallData | undefined {\n if (!body) return undefined;\n const hbarAmount = Hbar.fromTinybars(Long.fromValue(body.amount ?? 0));\n const data: ContractCallData = {\n contractId: new ContractId(\n body.contractID!.shardNum ?? 0,\n body.contractID!.realmNum ?? 0,\n body.contractID!.contractNum ?? 0,\n ).toString(),\n gas: Long.fromValue(body.gas ?? 0).toNumber(),\n amount: parseFloat(hbarAmount.toString(HbarUnit.Hbar)),\n };\n if (body.functionParameters) {\n data.functionParameters = Buffer.from(body.functionParameters).toString(\n 'hex',\n );\n if (data.functionParameters.length >= 8) {\n data.functionName = this.extractFunctionName(data.functionParameters);\n }\n }\n return data;\n }\n\n static parseContractCreate(\n body: proto.IContractCreateTransactionBody,\n ): ContractCreateData | undefined {\n if (!body) return undefined;\n const data: ContractCreateData = {};\n if (body.initialBalance) {\n data.initialBalance = Hbar.fromTinybars(\n Long.fromValue(body.initialBalance),\n ).toString(HbarUnit.Hbar);\n }\n if (body.gas) {\n data.gas = Long.fromValue(body.gas).toString();\n }\n if (body.adminKey) {\n data.adminKey = parseKey(body.adminKey);\n }\n if (body.constructorParameters) {\n data.constructorParameters = Buffer.from(\n body.constructorParameters,\n ).toString('hex');\n }\n if (body.memo) {\n data.memo = body.memo;\n }\n if (body.autoRenewPeriod?.seconds) {\n data.autoRenewPeriod = Long.fromValue(\n body.autoRenewPeriod.seconds,\n ).toString();\n }\n if (body.stakedAccountId) {\n data.stakedAccountId = new AccountId(\n body.stakedAccountId.shardNum ?? 0,\n body.stakedAccountId.realmNum ?? 0,\n body.stakedAccountId.accountNum ?? 0,\n ).toString();\n } else if (body.stakedNodeId !== null && body.stakedNodeId !== undefined) {\n data.stakedNodeId = Long.fromValue(body.stakedNodeId).toString();\n }\n if (body.declineReward !== undefined) {\n data.declineReward = body.declineReward;\n }\n if (body.maxAutomaticTokenAssociations !== undefined) {\n data.maxAutomaticTokenAssociations = body.maxAutomaticTokenAssociations;\n }\n if (body.fileID) {\n data.initcodeSource = 'fileID';\n data.initcode = new FileId(\n body.fileID.shardNum ?? 0,\n body.fileID.realmNum ?? 0,\n body.fileID.fileNum ?? 0,\n ).toString();\n } else if (body.initcode && body.initcode.length > 0) {\n data.initcodeSource = 'bytes';\n data.initcode = Buffer.from(body.initcode).toString('hex');\n }\n return data;\n }\n\n static parseContractUpdate(\n body: proto.IContractUpdateTransactionBody,\n ): ContractUpdateData | undefined {\n if (!body) return undefined;\n const data: ContractUpdateData = {};\n if (body.contractID) {\n data.contractIdToUpdate = new ContractId(\n body.contractID.shardNum ?? 0,\n body.contractID.realmNum ?? 0,\n body.contractID.contractNum ?? 0,\n ).toString();\n }\n if (body.adminKey) {\n data.adminKey = parseKey(body.adminKey);\n }\n if (body.expirationTime?.seconds) {\n data.expirationTime = `${Long.fromValue(\n body.expirationTime.seconds,\n ).toString()}.${body.expirationTime.nanos}`;\n }\n if (body.autoRenewPeriod?.seconds) {\n data.autoRenewPeriod = Long.fromValue(\n body.autoRenewPeriod.seconds,\n ).toString();\n }\n\n if (body.memo) {\n const memoUnion = body.memo as unknown;\n if (\n memoUnion &&\n typeof memoUnion === 'object' &&\n Object.prototype.hasOwnProperty.call(memoUnion, 'value')\n ) {\n const value = (memoUnion as { value: unknown }).value;\n if (value === null || value === undefined) {\n data.memo = undefined;\n } else {\n data.memo = String(value);\n }\n } else if (typeof memoUnion === 'string') {\n data.memo = memoUnion;\n } else {\n data.memo = undefined;\n }\n } else {\n data.memo = undefined;\n }\n\n if (body.stakedAccountId) {\n data.stakedAccountId = new AccountId(\n body.stakedAccountId.shardNum ?? 0,\n body.stakedAccountId.realmNum ?? 0,\n body.stakedAccountId.accountNum ?? 0,\n ).toString();\n data.stakedNodeId = undefined;\n } else if (\n body.stakedNodeId !== null &&\n body.stakedNodeId !== undefined &&\n Long.fromValue(body.stakedNodeId).notEquals(-1)\n ) {\n data.stakedNodeId = Long.fromValue(body.stakedNodeId).toString();\n data.stakedAccountId = undefined;\n } else {\n data.stakedNodeId = undefined;\n data.stakedAccountId = undefined;\n }\n if (body.declineReward?.value !== undefined) {\n data.declineReward = body.declineReward.value;\n }\n if (body.maxAutomaticTokenAssociations?.value !== undefined) {\n data.maxAutomaticTokenAssociations =\n body.maxAutomaticTokenAssociations.value;\n }\n if (body.autoRenewAccountId) {\n data.autoRenewAccountId = new AccountId(\n body.autoRenewAccountId.shardNum ?? 0,\n body.autoRenewAccountId.realmNum ?? 0,\n body.autoRenewAccountId.accountNum ?? 0,\n ).toString();\n }\n return data;\n }\n\n static parseContractDelete(\n body: proto.IContractDeleteTransactionBody,\n ): ContractDeleteData | undefined {\n if (!body) return undefined;\n const data: ContractDeleteData = {};\n if (body.contractID) {\n data.contractIdToDelete = new ContractId(\n body.contractID.shardNum ?? 0,\n body.contractID.realmNum ?? 0,\n body.contractID.contractNum ?? 0,\n ).toString();\n }\n if (body.transferAccountID) {\n data.transferAccountId = new AccountId(\n body.transferAccountID.shardNum ?? 0,\n body.transferAccountID.realmNum ?? 0,\n body.transferAccountID.accountNum ?? 0,\n ).toString();\n } else if (body.transferContractID) {\n data.transferContractId = new ContractId(\n body.transferContractID.shardNum ?? 0,\n body.transferContractID.realmNum ?? 0,\n body.transferContractID.contractNum ?? 0,\n ).toString();\n }\n return data;\n }\n\n /**\n * Parse SCS (Smart Contract Service) transaction from Transaction object\n * This is the unified entry point that delegates to the comprehensive parsing logic\n */\n static parseFromTransactionObject(transaction: Transaction): {\n type?: string;\n humanReadableType?: string;\n [key: string]: unknown;\n } {\n return this.parseSCSTransaction(transaction);\n }\n}\n"],"names":[],"mappings":"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"}