@hashgraphonline/standards-sdk 0.1.173 → 0.1.175

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 (114) hide show
  1. package/dist/browser/inscribe/inscriber.d.ts.map +1 -1
  2. package/dist/browser/services/registry-broker/client/base-client.d.ts +5 -1
  3. package/dist/browser/services/registry-broker/client/base-client.d.ts.map +1 -1
  4. package/dist/browser/services/registry-broker/client/skills.d.ts +5 -1
  5. package/dist/browser/services/registry-broker/client/skills.d.ts.map +1 -1
  6. package/dist/browser/services/registry-broker/schemas.d.ts +1184 -1
  7. package/dist/browser/services/registry-broker/schemas.d.ts.map +1 -1
  8. package/dist/browser/services/registry-broker/types.d.ts +8 -1
  9. package/dist/browser/services/registry-broker/types.d.ts.map +1 -1
  10. package/dist/browser/standards-sdk.browser.js +75 -16
  11. package/dist/browser/standards-sdk.browser.js.map +1 -1
  12. package/dist/browser-root/inscribe/inscriber.d.ts.map +1 -1
  13. package/dist/browser-root/services/registry-broker/client/base-client.d.ts +5 -1
  14. package/dist/browser-root/services/registry-broker/client/base-client.d.ts.map +1 -1
  15. package/dist/browser-root/services/registry-broker/client/skills.d.ts +5 -1
  16. package/dist/browser-root/services/registry-broker/client/skills.d.ts.map +1 -1
  17. package/dist/browser-root/services/registry-broker/schemas.d.ts +1184 -1
  18. package/dist/browser-root/services/registry-broker/schemas.d.ts.map +1 -1
  19. package/dist/browser-root/services/registry-broker/types.d.ts +8 -1
  20. package/dist/browser-root/services/registry-broker/types.d.ts.map +1 -1
  21. package/dist/browser-root/standards-sdk.root-browser.js +84 -2
  22. package/dist/browser-root/standards-sdk.root-browser.js.map +1 -1
  23. package/dist/cjs/inscribe/inscriber.d.ts.map +1 -1
  24. package/dist/cjs/services/registry-broker/client/base-client.d.ts +5 -1
  25. package/dist/cjs/services/registry-broker/client/base-client.d.ts.map +1 -1
  26. package/dist/cjs/services/registry-broker/client/skills.d.ts +5 -1
  27. package/dist/cjs/services/registry-broker/client/skills.d.ts.map +1 -1
  28. package/dist/cjs/services/registry-broker/schemas.d.ts +1184 -1
  29. package/dist/cjs/services/registry-broker/schemas.d.ts.map +1 -1
  30. package/dist/cjs/services/registry-broker/types.d.ts +8 -1
  31. package/dist/cjs/services/registry-broker/types.d.ts.map +1 -1
  32. package/dist/cjs/standards-sdk.cjs +1 -1
  33. package/dist/cjs/standards-sdk.cjs.map +1 -1
  34. package/dist/es/inscribe/inscriber.d.ts.map +1 -1
  35. package/dist/es/services/registry-broker/client/base-client.d.ts +5 -1
  36. package/dist/es/services/registry-broker/client/base-client.d.ts.map +1 -1
  37. package/dist/es/services/registry-broker/client/skills.d.ts +5 -1
  38. package/dist/es/services/registry-broker/client/skills.d.ts.map +1 -1
  39. package/dist/es/services/registry-broker/schemas.d.ts +1184 -1
  40. package/dist/es/services/registry-broker/schemas.d.ts.map +1 -1
  41. package/dist/es/services/registry-broker/types.d.ts +8 -1
  42. package/dist/es/services/registry-broker/types.d.ts.map +1 -1
  43. package/dist/es/standards-sdk.es116.js +1 -1
  44. package/dist/es/standards-sdk.es121.js +1 -1
  45. package/dist/es/standards-sdk.es127.js +1 -1
  46. package/dist/es/standards-sdk.es128.js +5 -5
  47. package/dist/es/standards-sdk.es138.js +1 -1
  48. package/dist/es/standards-sdk.es139.js +1 -1
  49. package/dist/es/standards-sdk.es140.js +5 -5
  50. package/dist/es/standards-sdk.es142.js +19 -17
  51. package/dist/es/standards-sdk.es142.js.map +1 -1
  52. package/dist/es/standards-sdk.es143.js +1 -1
  53. package/dist/es/standards-sdk.es145.js +6 -3
  54. package/dist/es/standards-sdk.es145.js.map +1 -1
  55. package/dist/es/standards-sdk.es147.js +1 -1
  56. package/dist/es/standards-sdk.es148.js +1 -1
  57. package/dist/es/standards-sdk.es16.js +1 -1
  58. package/dist/es/standards-sdk.es160.js +12461 -1543
  59. package/dist/es/standards-sdk.es160.js.map +1 -1
  60. package/dist/es/standards-sdk.es161.js +1608 -12461
  61. package/dist/es/standards-sdk.es161.js.map +1 -1
  62. package/dist/es/standards-sdk.es163.js +167 -51
  63. package/dist/es/standards-sdk.es163.js.map +1 -1
  64. package/dist/es/standards-sdk.es164.js +306 -88
  65. package/dist/es/standards-sdk.es164.js.map +1 -1
  66. package/dist/es/standards-sdk.es165.js +336 -71
  67. package/dist/es/standards-sdk.es165.js.map +1 -1
  68. package/dist/es/standards-sdk.es166.js +439 -186
  69. package/dist/es/standards-sdk.es166.js.map +1 -1
  70. package/dist/es/standards-sdk.es167.js +323 -65
  71. package/dist/es/standards-sdk.es167.js.map +1 -1
  72. package/dist/es/standards-sdk.es168.js +69 -543
  73. package/dist/es/standards-sdk.es168.js.map +1 -1
  74. package/dist/es/standards-sdk.es169.js +90 -158
  75. package/dist/es/standards-sdk.es169.js.map +1 -1
  76. package/dist/es/standards-sdk.es170.js +65 -314
  77. package/dist/es/standards-sdk.es170.js.map +1 -1
  78. package/dist/es/standards-sdk.es171.js +55 -345
  79. package/dist/es/standards-sdk.es171.js.map +1 -1
  80. package/dist/es/standards-sdk.es172.js +71 -443
  81. package/dist/es/standards-sdk.es172.js.map +1 -1
  82. package/dist/es/standards-sdk.es173.js +184 -315
  83. package/dist/es/standards-sdk.es173.js.map +1 -1
  84. package/dist/es/standards-sdk.es174.js +565 -68
  85. package/dist/es/standards-sdk.es174.js.map +1 -1
  86. package/dist/es/standards-sdk.es175.js +1 -1
  87. package/dist/es/standards-sdk.es176.js +1 -1
  88. package/dist/es/standards-sdk.es178.js +2 -2
  89. package/dist/es/standards-sdk.es179.js +1 -1
  90. package/dist/es/standards-sdk.es18.js +2 -2
  91. package/dist/es/standards-sdk.es180.js +1 -1
  92. package/dist/es/standards-sdk.es181.js +2 -2
  93. package/dist/es/standards-sdk.es182.js +1 -1
  94. package/dist/es/standards-sdk.es183.js +1 -1
  95. package/dist/es/standards-sdk.es19.js +2 -2
  96. package/dist/es/standards-sdk.es27.js +2 -2
  97. package/dist/es/standards-sdk.es30.js +1 -1
  98. package/dist/es/standards-sdk.es31.js +1 -1
  99. package/dist/es/standards-sdk.es35.js +2 -2
  100. package/dist/es/standards-sdk.es36.js +1 -1
  101. package/dist/es/standards-sdk.es37.js +1 -1
  102. package/dist/es/standards-sdk.es56.js +1 -1
  103. package/dist/es/standards-sdk.es59.js +1 -1
  104. package/dist/es/standards-sdk.es60.js +1 -1
  105. package/dist/es/standards-sdk.es62.js +1 -1
  106. package/dist/es/standards-sdk.es63.js +2 -2
  107. package/dist/es/standards-sdk.es64.js +1 -1
  108. package/dist/es/standards-sdk.es65.js +1 -1
  109. package/dist/es/standards-sdk.es66.js +1 -1
  110. package/dist/es/standards-sdk.es67.js +1 -1
  111. package/dist/es/standards-sdk.es69.js +1 -1
  112. package/dist/es/standards-sdk.es75.js +1 -1
  113. package/dist/es/standards-sdk.es84.js +1 -1
  114. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es164.js","sources":["../../src/utils/dynamic-import.ts"],"sourcesContent":["import { isBrowser } from './is-browser';\n\nlet nodeRequire: NodeRequire | null | undefined;\n\nconst isNodeRuntime = (): boolean =>\n typeof process !== 'undefined' && Boolean(process.versions?.node);\n\ntype NodeModuleNamespace = {\n createRequire: (path: string | URL) => NodeRequire;\n};\n\nfunction getNodeRequireSync(): NodeRequire | null {\n try {\n const moduleNamespace = (\n process as typeof process & {\n getBuiltinModule?: (name: string) => unknown;\n }\n ).getBuiltinModule?.('module') as Partial<NodeModuleNamespace> | undefined;\n if (typeof moduleNamespace?.createRequire === 'function') {\n const requireFromModule = moduleNamespace.createRequire(import.meta.url);\n if (typeof requireFromModule.resolve === 'function') {\n return requireFromModule;\n }\n }\n\n const globalObject =\n typeof global !== 'undefined'\n ? (global as typeof globalThis)\n : globalThis;\n const runtimeRequire =\n globalObject.process?.mainModule?.require ??\n (globalObject as { require?: NodeRequire }).require ??\n Function('return typeof require === \"function\" ? require : undefined;')();\n\n if (\n typeof runtimeRequire === 'function' &&\n typeof (runtimeRequire as NodeRequire).resolve === 'function'\n ) {\n return runtimeRequire as NodeRequire;\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nfunction isModuleNotFound(specifier: string, error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n const code = Reflect.get(error, 'code');\n const message = Reflect.get(error, 'message');\n const messageText = typeof message === 'string' ? message : '';\n\n if (typeof code === 'string' && code.includes('MODULE_NOT_FOUND')) {\n return messageText.includes(specifier);\n }\n\n if (messageText) {\n const lowered = messageText.toLowerCase();\n if (\n lowered.includes('cannot find module') ||\n lowered.includes('module not found') ||\n lowered.includes('cannot find package')\n ) {\n return lowered.includes(specifier.toLowerCase());\n }\n }\n\n return false;\n}\n\nasync function resolveNodeRequire(): Promise<NodeRequire | null> {\n if (nodeRequire !== undefined) {\n return nodeRequire;\n }\n\n if (isBrowser && !isNodeRuntime()) {\n nodeRequire = null;\n return nodeRequire;\n }\n\n try {\n nodeRequire = getNodeRequireSync();\n } catch {\n nodeRequire = null;\n }\n\n return nodeRequire;\n}\n\nasync function dynamicImport<T>(specifier: string): Promise<T | null> {\n try {\n return (await import(/* webpackIgnore: true */ specifier)) as T;\n } catch (error) {\n if (isModuleNotFound(specifier, error)) {\n return null;\n }\n throw error as Error;\n }\n}\n\ntype OptionalImportOptions = {\n preferImport?: boolean;\n};\n\nexport async function optionalImport<T>(\n specifier: string,\n options: OptionalImportOptions = {},\n): Promise<T | null> {\n if (isBrowser && !isNodeRuntime()) {\n return dynamicImport<T>(specifier);\n }\n\n if (!options.preferImport) {\n const requireFn = await resolveNodeRequire();\n if (requireFn) {\n try {\n return requireFn(specifier) as T;\n } catch (error) {\n if (!isModuleNotFound(specifier, error)) {\n throw error as Error;\n }\n }\n }\n }\n\n return dynamicImport<T>(specifier);\n}\n\nexport function optionalImportSync<T>(specifier: string): T | null {\n if (isBrowser && !isNodeRuntime()) {\n return null;\n }\n\n try {\n const requireFn = getNodeRequireSync();\n if (requireFn) {\n return requireFn(specifier) as T;\n }\n } catch (error) {\n if (!isModuleNotFound(specifier, error)) {\n throw error as Error;\n }\n }\n\n return null;\n}\n"],"names":[],"mappings":";AAEA,IAAI;AAEJ,MAAM,gBAAgB,MACpB,OAAO,YAAY,eAAe,QAAQ,QAAQ,UAAU,IAAI;AAMlE,SAAS,qBAAyC;AAChD,MAAI;AACF,UAAM,kBACJ,QAGA,mBAAmB,QAAQ;AAC7B,QAAI,OAAO,iBAAiB,kBAAkB,YAAY;AACxD,YAAM,oBAAoB,gBAAgB,cAAc,YAAY,GAAG;AACvE,UAAI,OAAO,kBAAkB,YAAY,YAAY;AACnD,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,eACJ,OAAO,WAAW,cACb,SACD;AACN,UAAM,iBACJ,aAAa,SAAS,YAAY,WACjC,aAA2C,WAC5C,SAAS,6DAA6D,EAAA;AAExE,QACE,OAAO,mBAAmB,cAC1B,OAAQ,eAA+B,YAAY,YACnD;AACA,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,WAAmB,OAAyB;AACpE,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AACA,QAAM,OAAO,QAAQ,IAAI,OAAO,MAAM;AACtC,QAAM,UAAU,QAAQ,IAAI,OAAO,SAAS;AAC5C,QAAM,cAAc,OAAO,YAAY,WAAW,UAAU;AAE5D,MAAI,OAAO,SAAS,YAAY,KAAK,SAAS,kBAAkB,GAAG;AACjE,WAAO,YAAY,SAAS,SAAS;AAAA,EACvC;AAEA,MAAI,aAAa;AACf,UAAM,UAAU,YAAY,YAAA;AAC5B,QACE,QAAQ,SAAS,oBAAoB,KACrC,QAAQ,SAAS,kBAAkB,KACnC,QAAQ,SAAS,qBAAqB,GACtC;AACA,aAAO,QAAQ,SAAS,UAAU,YAAA,CAAa;AAAA,IACjD;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,qBAAkD;AAC/D,MAAI,gBAAgB,QAAW;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,CAAC,iBAAiB;AACjC,kBAAc;AACd,WAAO;AAAA,EACT;AAEA,MAAI;AACF,kBAAc,mBAAA;AAAA,EAChB,QAAQ;AACN,kBAAc;AAAA,EAChB;AAEA,SAAO;AACT;AAEA,eAAe,cAAiB,WAAsC;AACpE,MAAI;AACF,WAAQ,MAAM;AAAA;AAAA,MAAiC;AAAA;AAAA,EACjD,SAAS,OAAO;AACd,QAAI,iBAAiB,WAAW,KAAK,GAAG;AACtC,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AAMA,eAAsB,eACpB,WACA,UAAiC,IACd;AACnB,MAAI,aAAa,CAAC,iBAAiB;AACjC,WAAO,cAAiB,SAAS;AAAA,EACnC;AAEA,MAAI,CAAC,QAAQ,cAAc;AACzB,UAAM,YAAY,MAAM,mBAAA;AACxB,QAAI,WAAW;AACb,UAAI;AACF,eAAO,UAAU,SAAS;AAAA,MAC5B,SAAS,OAAO;AACd,YAAI,CAAC,iBAAiB,WAAW,KAAK,GAAG;AACvC,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,cAAiB,SAAS;AACnC;AAEO,SAAS,mBAAsB,WAA6B;AACjE,MAAI,aAAa,CAAC,iBAAiB;AACjC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,YAAY,mBAAA;AAClB,QAAI,WAAW;AACb,aAAO,UAAU,SAAS;AAAA,IAC5B;AAAA,EACF,SAAS,OAAO;AACd,QAAI,CAAC,iBAAiB,WAAW,KAAK,GAAG;AACvC,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;"}
1
+ {"version":3,"file":"standards-sdk.es164.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,84 +1,349 @@
1
- const orderedParamKeys = [
2
- "uid",
3
- "registry",
4
- "proto",
5
- "nativeId",
6
- "domain",
7
- "src"
8
- ];
9
- const fqdnLabelRegex = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i;
10
- function uaidTargetFromParsed(parsed) {
11
- return parsed.method === "aid" ? "aid" : "did";
12
- }
13
- function normalizeDomain(value) {
14
- return value.trim().replace(/\.$/, "").toLowerCase();
15
- }
16
- function isFqdn(value) {
17
- const normalized = normalizeDomain(value);
18
- if (!normalized || normalized.length > 253 || !normalized.includes(".")) {
19
- return false;
1
+ import { AccountId, Hbar, Long, HbarUnit, TokenId } from "@hashgraph/sdk";
2
+ import { parseKey } from "./standards-sdk.es168.js";
3
+ class CryptoParser {
4
+ static parseCryptoTransfers(cryptoTransfer, result) {
5
+ if (cryptoTransfer.transfers?.accountAmounts) {
6
+ result.transfers = cryptoTransfer.transfers.accountAmounts.map((aa) => {
7
+ const accountId = new AccountId(
8
+ aa.accountID.shardNum ?? 0,
9
+ aa.accountID.realmNum ?? 0,
10
+ aa.accountID.accountNum ?? 0
11
+ );
12
+ const hbarAmount = Hbar.fromTinybars(Long.fromValue(aa.amount));
13
+ return {
14
+ accountId: accountId.toString(),
15
+ amount: hbarAmount.toString(HbarUnit.Hbar),
16
+ isDecimal: true
17
+ };
18
+ });
19
+ }
20
+ if (cryptoTransfer.tokenTransfers) {
21
+ for (const tokenTransferList of cryptoTransfer.tokenTransfers) {
22
+ const tokenId = new TokenId(
23
+ tokenTransferList.token.shardNum ?? 0,
24
+ tokenTransferList.token.realmNum ?? 0,
25
+ tokenTransferList.token.tokenNum ?? 0
26
+ );
27
+ if (tokenTransferList.transfers) {
28
+ for (const transfer of tokenTransferList.transfers) {
29
+ const accountId = new AccountId(
30
+ transfer.accountID.shardNum ?? 0,
31
+ transfer.accountID.realmNum ?? 0,
32
+ transfer.accountID.accountNum ?? 0
33
+ );
34
+ const tokenAmount = Long.fromValue(transfer.amount).toNumber();
35
+ result.tokenTransfers.push({
36
+ tokenId: tokenId.toString(),
37
+ accountId: accountId.toString(),
38
+ amount: tokenAmount
39
+ });
40
+ }
41
+ }
42
+ }
43
+ }
20
44
  }
21
- const labels = normalized.split(".");
22
- for (const label of labels) {
23
- if (!label || label.length > 63 || !fqdnLabelRegex.test(label)) {
24
- return false;
45
+ static parseCryptoDelete(body) {
46
+ if (!body) return void 0;
47
+ const data = {};
48
+ if (body.deleteAccountID) {
49
+ data.deleteAccountId = new AccountId(
50
+ body.deleteAccountID.shardNum ?? 0,
51
+ body.deleteAccountID.realmNum ?? 0,
52
+ body.deleteAccountID.accountNum ?? 0
53
+ ).toString();
54
+ }
55
+ if (body.transferAccountID) {
56
+ data.transferAccountId = new AccountId(
57
+ body.transferAccountID.shardNum ?? 0,
58
+ body.transferAccountID.realmNum ?? 0,
59
+ body.transferAccountID.accountNum ?? 0
60
+ ).toString();
25
61
  }
62
+ return data;
26
63
  }
27
- return true;
28
- }
29
- function normalizeTxtValue(value) {
30
- const trimmed = value.trim();
31
- if (trimmed.length >= 2 && trimmed.startsWith('"') && trimmed.endsWith('"')) {
32
- return trimmed.slice(1, -1);
64
+ static parseCryptoCreateAccount(body) {
65
+ if (!body) return void 0;
66
+ const data = {};
67
+ if (body.initialBalance) {
68
+ data.initialBalance = Hbar.fromTinybars(
69
+ Long.fromValue(body.initialBalance)
70
+ ).toString(HbarUnit.Hbar);
71
+ }
72
+ if (body.key) {
73
+ data.key = parseKey(body.key);
74
+ }
75
+ if (body.receiverSigRequired !== void 0) {
76
+ data.receiverSigRequired = body.receiverSigRequired;
77
+ }
78
+ if (body.autoRenewPeriod?.seconds) {
79
+ data.autoRenewPeriod = Long.fromValue(
80
+ body.autoRenewPeriod.seconds
81
+ ).toString();
82
+ }
83
+ if (body.memo) {
84
+ data.memo = body.memo;
85
+ }
86
+ if (body.maxAutomaticTokenAssociations !== void 0) {
87
+ data.maxAutomaticTokenAssociations = body.maxAutomaticTokenAssociations;
88
+ }
89
+ if (body.stakedAccountId) {
90
+ data.stakedAccountId = new AccountId(
91
+ body.stakedAccountId.shardNum ?? 0,
92
+ body.stakedAccountId.realmNum ?? 0,
93
+ body.stakedAccountId.accountNum ?? 0
94
+ ).toString();
95
+ } else if (body.stakedNodeId !== null && body.stakedNodeId !== void 0) {
96
+ data.stakedNodeId = Long.fromValue(body.stakedNodeId).toString();
97
+ }
98
+ if (body.declineReward !== void 0) {
99
+ data.declineReward = body.declineReward;
100
+ }
101
+ if (body.alias && body.alias.length > 0) {
102
+ data.alias = Buffer.from(body.alias).toString("hex");
103
+ }
104
+ return data;
105
+ }
106
+ static parseCryptoUpdateAccount(body) {
107
+ if (!body) return void 0;
108
+ const data = {};
109
+ if (body.accountIDToUpdate) {
110
+ data.accountIdToUpdate = new AccountId(
111
+ body.accountIDToUpdate.shardNum ?? 0,
112
+ body.accountIDToUpdate.realmNum ?? 0,
113
+ body.accountIDToUpdate.accountNum ?? 0
114
+ ).toString();
115
+ }
116
+ if (body.key) {
117
+ data.key = parseKey(body.key);
118
+ }
119
+ if (body.expirationTime?.seconds) {
120
+ data.expirationTime = `${Long.fromValue(
121
+ body.expirationTime.seconds
122
+ ).toString()}.${body.expirationTime.nanos}`;
123
+ }
124
+ if (body.receiverSigRequired !== null && body.receiverSigRequired !== void 0) {
125
+ data.receiverSigRequired = Boolean(body.receiverSigRequired);
126
+ }
127
+ if (body.autoRenewPeriod?.seconds) {
128
+ data.autoRenewPeriod = Long.fromValue(
129
+ body.autoRenewPeriod.seconds
130
+ ).toString();
131
+ }
132
+ if (body.memo?.value !== void 0) {
133
+ data.memo = body.memo.value;
134
+ }
135
+ if (body.maxAutomaticTokenAssociations?.value !== void 0) {
136
+ data.maxAutomaticTokenAssociations = body.maxAutomaticTokenAssociations.value;
137
+ }
138
+ if (body.stakedAccountId) {
139
+ data.stakedAccountId = new AccountId(
140
+ body.stakedAccountId.shardNum ?? 0,
141
+ body.stakedAccountId.realmNum ?? 0,
142
+ body.stakedAccountId.accountNum ?? 0
143
+ ).toString();
144
+ data.stakedNodeId = void 0;
145
+ } else if (body.stakedNodeId !== null && body.stakedNodeId !== void 0) {
146
+ data.stakedNodeId = Long.fromValue(body.stakedNodeId).toString();
147
+ data.stakedAccountId = void 0;
148
+ } else {
149
+ data.stakedAccountId = void 0;
150
+ data.stakedNodeId = void 0;
151
+ }
152
+ if (body.declineReward !== null && body.declineReward !== void 0) {
153
+ data.declineReward = Boolean(body.declineReward);
154
+ }
155
+ return data;
33
156
  }
34
- const markdownLinkMatch = trimmed.match(/^\[(.+)\]\((.+)\)$/);
35
- if (markdownLinkMatch) {
36
- return markdownLinkMatch[2].trim();
157
+ static parseCryptoApproveAllowance(body) {
158
+ if (!body) return void 0;
159
+ const data = {};
160
+ if (body.cryptoAllowances && body.cryptoAllowances.length > 0) {
161
+ data.hbarAllowances = body.cryptoAllowances.map((a) => ({
162
+ ownerAccountId: new AccountId(
163
+ a.owner.shardNum ?? 0,
164
+ a.owner.realmNum ?? 0,
165
+ a.owner.accountNum ?? 0
166
+ ).toString(),
167
+ spenderAccountId: new AccountId(
168
+ a.spender.shardNum ?? 0,
169
+ a.spender.realmNum ?? 0,
170
+ a.spender.accountNum ?? 0
171
+ ).toString(),
172
+ amount: Hbar.fromTinybars(Long.fromValue(a.amount)).toString(
173
+ HbarUnit.Hbar
174
+ )
175
+ }));
176
+ }
177
+ if (body.tokenAllowances && body.tokenAllowances.length > 0) {
178
+ data.tokenAllowances = body.tokenAllowances.map((a) => ({
179
+ tokenId: new TokenId(
180
+ a.tokenId.shardNum ?? 0,
181
+ a.tokenId.realmNum ?? 0,
182
+ a.tokenId.tokenNum ?? 0
183
+ ).toString(),
184
+ ownerAccountId: new AccountId(
185
+ a.owner.shardNum ?? 0,
186
+ a.owner.realmNum ?? 0,
187
+ a.owner.accountNum ?? 0
188
+ ).toString(),
189
+ spenderAccountId: new AccountId(
190
+ a.spender.shardNum ?? 0,
191
+ a.spender.realmNum ?? 0,
192
+ a.spender.accountNum ?? 0
193
+ ).toString(),
194
+ amount: Long.fromValue(a.amount).toString()
195
+ }));
196
+ }
197
+ if (body.nftAllowances && body.nftAllowances.length > 0) {
198
+ data.nftAllowances = body.nftAllowances.map((a) => {
199
+ const allowance = {};
200
+ if (a.tokenId)
201
+ allowance.tokenId = new TokenId(
202
+ a.tokenId.shardNum ?? 0,
203
+ a.tokenId.realmNum ?? 0,
204
+ a.tokenId.tokenNum ?? 0
205
+ ).toString();
206
+ if (a.owner)
207
+ allowance.ownerAccountId = new AccountId(
208
+ a.owner.shardNum ?? 0,
209
+ a.owner.realmNum ?? 0,
210
+ a.owner.accountNum ?? 0
211
+ ).toString();
212
+ if (a.spender)
213
+ allowance.spenderAccountId = new AccountId(
214
+ a.spender.shardNum ?? 0,
215
+ a.spender.realmNum ?? 0,
216
+ a.spender.accountNum ?? 0
217
+ ).toString();
218
+ if (a.serialNumbers && a.serialNumbers.length > 0)
219
+ allowance.serialNumbers = a.serialNumbers.map(
220
+ (sn) => Long.fromValue(sn).toString()
221
+ );
222
+ if (a.approvedForAll?.value !== void 0)
223
+ allowance.approvedForAll = a.approvedForAll.value;
224
+ if (a.delegatingSpender)
225
+ allowance.delegatingSpender = new AccountId(
226
+ a.delegatingSpender.shardNum ?? 0,
227
+ a.delegatingSpender.realmNum ?? 0,
228
+ a.delegatingSpender.accountNum ?? 0
229
+ ).toString();
230
+ return allowance;
231
+ });
232
+ }
233
+ return data;
37
234
  }
38
- return trimmed;
39
- }
40
- function parseSemicolonFields(input) {
41
- const fields = {};
42
- for (const part of input.split(";")) {
43
- const trimmed = part.trim();
44
- if (!trimmed) {
45
- continue;
46
- }
47
- const equalsIndex = trimmed.indexOf("=");
48
- if (equalsIndex <= 0) {
49
- continue;
50
- }
51
- const key = trimmed.slice(0, equalsIndex).trim();
52
- const value = normalizeTxtValue(trimmed.slice(equalsIndex + 1));
53
- if (!key || !value) {
54
- continue;
55
- }
56
- fields[key] = value;
235
+ static parseCryptoDeleteAllowance(body) {
236
+ if (!body) return void 0;
237
+ const data = {};
238
+ if (body.nftAllowances && body.nftAllowances.length > 0) {
239
+ data.nftAllowancesToRemove = body.nftAllowances.map((a) => ({
240
+ ownerAccountId: new AccountId(
241
+ a.owner.shardNum ?? 0,
242
+ a.owner.realmNum ?? 0,
243
+ a.owner.accountNum ?? 0
244
+ ).toString(),
245
+ tokenId: new TokenId(
246
+ a.tokenId.shardNum ?? 0,
247
+ a.tokenId.realmNum ?? 0,
248
+ a.tokenId.tokenNum ?? 0
249
+ ).toString(),
250
+ serialNumbers: a.serialNumbers ? a.serialNumbers.map((sn) => Long.fromValue(sn).toString()) : []
251
+ }));
252
+ }
253
+ return data;
57
254
  }
58
- return fields;
59
- }
60
- function buildCanonicalUaid(target, id, params) {
61
- const entries = [];
62
- const usedKeys = /* @__PURE__ */ new Set();
63
- for (const key of orderedParamKeys) {
64
- const value = params[key];
65
- if (value) {
66
- entries.push(`${key}=${value}`);
67
- usedKeys.add(key);
255
+ /**
256
+ * Extract HBAR transfers from Transaction object
257
+ */
258
+ static extractHbarTransfersFromTransaction(transaction) {
259
+ const transfers = [];
260
+ try {
261
+ const hbarTransfers = transaction._hbarTransfers;
262
+ if (Array.isArray(hbarTransfers)) {
263
+ hbarTransfers.forEach((transfer) => {
264
+ if (transfer.accountId && transfer.amount) {
265
+ const amountInTinybars = transfer.amount.toTinybars();
266
+ const amountInHbar = Number(amountInTinybars) / 1e8;
267
+ transfers.push({
268
+ accountId: transfer.accountId.toString(),
269
+ amount: amountInHbar
270
+ });
271
+ }
272
+ });
273
+ }
274
+ } catch (error) {
275
+ }
276
+ return transfers;
277
+ }
278
+ /**
279
+ * Extract token transfers from Transaction object
280
+ */
281
+ static extractTokenTransfersFromTransaction(transaction) {
282
+ const tokenTransfers = [];
283
+ try {
284
+ const tokenTransfersList = transaction._tokenTransfers;
285
+ if (Array.isArray(tokenTransfersList)) {
286
+ tokenTransfersList.forEach((tokenTransfer) => {
287
+ if (tokenTransfer.tokenId && Array.isArray(tokenTransfer.transfers)) {
288
+ const transfers = tokenTransfer.transfers.map((transfer) => ({
289
+ accountId: transfer.accountId?.toString() || "Unknown",
290
+ amount: Number(transfer.amount || 0)
291
+ }));
292
+ tokenTransfers.push({
293
+ tokenId: tokenTransfer.tokenId.toString(),
294
+ transfers
295
+ });
296
+ }
297
+ });
298
+ }
299
+ } catch (error) {
68
300
  }
301
+ return tokenTransfers;
69
302
  }
70
- const extraKeys = Object.keys(params).filter((key) => !usedKeys.has(key) && params[key]).sort((a, b) => a.localeCompare(b));
71
- for (const key of extraKeys) {
72
- entries.push(`${key}=${params[key]}`);
303
+ /**
304
+ * Parse crypto transaction from Transaction object with comprehensive extraction
305
+ * This is the unified entry point that handles both protobuf and internal field extraction
306
+ */
307
+ static parseFromTransactionObject(transaction) {
308
+ try {
309
+ const hbarTransfers = this.extractHbarTransfersFromTransaction(transaction);
310
+ const tokenTransfers = this.extractTokenTransfersFromTransaction(transaction);
311
+ if (hbarTransfers.length > 0 || tokenTransfers.length > 0) {
312
+ const convertedTransfers = hbarTransfers.map((transfer) => ({
313
+ accountId: transfer.accountId,
314
+ amount: transfer.amount.toString() + " ℏ",
315
+ isDecimal: true
316
+ }));
317
+ const convertedTokenTransfers = tokenTransfers.flatMap(
318
+ (tokenGroup) => tokenGroup.transfers.map((transfer) => ({
319
+ tokenId: tokenGroup.tokenId,
320
+ accountId: transfer.accountId,
321
+ amount: transfer.amount
322
+ }))
323
+ );
324
+ if (hbarTransfers.length > 0) {
325
+ return {
326
+ type: "CRYPTOTRANSFER",
327
+ humanReadableType: "Crypto Transfer",
328
+ transfers: convertedTransfers,
329
+ tokenTransfers: convertedTokenTransfers
330
+ };
331
+ } else if (tokenTransfers.length > 0) {
332
+ return {
333
+ type: "TOKENTRANSFER",
334
+ humanReadableType: "Token Transfer",
335
+ transfers: convertedTransfers,
336
+ tokenTransfers: convertedTokenTransfers
337
+ };
338
+ }
339
+ }
340
+ return {};
341
+ } catch (error) {
342
+ return {};
343
+ }
73
344
  }
74
- return entries.length > 0 ? `uaid:${target}:${id};${entries.join(";")}` : `uaid:${target}:${id}`;
75
345
  }
76
346
  export {
77
- buildCanonicalUaid,
78
- isFqdn,
79
- normalizeDomain,
80
- normalizeTxtValue,
81
- parseSemicolonFields,
82
- uaidTargetFromParsed
347
+ CryptoParser
83
348
  };
84
349
  //# sourceMappingURL=standards-sdk.es165.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es165.js","sources":["../../src/hcs-14/resolvers/profile-utils.ts"],"sourcesContent":["import type { ParsedHcs14Did } from '../types';\n\nconst orderedParamKeys = [\n 'uid',\n 'registry',\n 'proto',\n 'nativeId',\n 'domain',\n 'src',\n] as const;\n\nconst fqdnLabelRegex = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i;\n\nexport function uaidTargetFromParsed(parsed: ParsedHcs14Did): 'aid' | 'did' {\n return parsed.method === 'aid' ? 'aid' : 'did';\n}\n\nexport function normalizeDomain(value: string): string {\n return value.trim().replace(/\\.$/, '').toLowerCase();\n}\n\nexport function isFqdn(value: string): boolean {\n const normalized = normalizeDomain(value);\n if (!normalized || normalized.length > 253 || !normalized.includes('.')) {\n return false;\n }\n const labels = normalized.split('.');\n for (const label of labels) {\n if (!label || label.length > 63 || !fqdnLabelRegex.test(label)) {\n return false;\n }\n }\n return true;\n}\n\nexport function normalizeTxtValue(value: string): string {\n const trimmed = value.trim();\n if (trimmed.length >= 2 && trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return trimmed.slice(1, -1);\n }\n const markdownLinkMatch = trimmed.match(/^\\[(.+)\\]\\((.+)\\)$/);\n if (markdownLinkMatch) {\n return markdownLinkMatch[2].trim();\n }\n return trimmed;\n}\n\nexport function parseSemicolonFields(input: string): Record<string, string> {\n const fields: Record<string, string> = {};\n for (const part of input.split(';')) {\n const trimmed = part.trim();\n if (!trimmed) {\n continue;\n }\n const equalsIndex = trimmed.indexOf('=');\n if (equalsIndex <= 0) {\n continue;\n }\n const key = trimmed.slice(0, equalsIndex).trim();\n const value = normalizeTxtValue(trimmed.slice(equalsIndex + 1));\n if (!key || !value) {\n continue;\n }\n fields[key] = value;\n }\n return fields;\n}\n\nexport function buildCanonicalUaid(\n target: 'aid' | 'did',\n id: string,\n params: Record<string, string>,\n): string {\n const entries: string[] = [];\n const usedKeys = new Set<string>();\n\n for (const key of orderedParamKeys) {\n const value = params[key];\n if (value) {\n entries.push(`${key}=${value}`);\n usedKeys.add(key);\n }\n }\n\n const extraKeys = Object.keys(params)\n .filter(key => !usedKeys.has(key) && params[key])\n .sort((a, b) => a.localeCompare(b));\n\n for (const key of extraKeys) {\n entries.push(`${key}=${params[key]}`);\n }\n\n return entries.length > 0\n ? `uaid:${target}:${id};${entries.join(';')}`\n : `uaid:${target}:${id}`;\n}\n\nexport function canonicalizeUaidFromParsed(parsed: ParsedHcs14Did): string {\n return buildCanonicalUaid(\n uaidTargetFromParsed(parsed),\n parsed.id,\n parsed.params,\n );\n}\n"],"names":[],"mappings":"AAEA,MAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,iBAAiB;AAEhB,SAAS,qBAAqB,QAAuC;AAC1E,SAAO,OAAO,WAAW,QAAQ,QAAQ;AAC3C;AAEO,SAAS,gBAAgB,OAAuB;AACrD,SAAO,MAAM,OAAO,QAAQ,OAAO,EAAE,EAAE,YAAA;AACzC;AAEO,SAAS,OAAO,OAAwB;AAC7C,QAAM,aAAa,gBAAgB,KAAK;AACxC,MAAI,CAAC,cAAc,WAAW,SAAS,OAAO,CAAC,WAAW,SAAS,GAAG,GAAG;AACvE,WAAO;AAAA,EACT;AACA,QAAM,SAAS,WAAW,MAAM,GAAG;AACnC,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,SAAS,MAAM,SAAS,MAAM,CAAC,eAAe,KAAK,KAAK,GAAG;AAC9D,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,OAAuB;AACvD,QAAM,UAAU,MAAM,KAAA;AACtB,MAAI,QAAQ,UAAU,KAAK,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AAC3E,WAAO,QAAQ,MAAM,GAAG,EAAE;AAAA,EAC5B;AACA,QAAM,oBAAoB,QAAQ,MAAM,oBAAoB;AAC5D,MAAI,mBAAmB;AACrB,WAAO,kBAAkB,CAAC,EAAE,KAAA;AAAA,EAC9B;AACA,SAAO;AACT;AAEO,SAAS,qBAAqB,OAAuC;AAC1E,QAAM,SAAiC,CAAA;AACvC,aAAW,QAAQ,MAAM,MAAM,GAAG,GAAG;AACnC,UAAM,UAAU,KAAK,KAAA;AACrB,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,UAAM,cAAc,QAAQ,QAAQ,GAAG;AACvC,QAAI,eAAe,GAAG;AACpB;AAAA,IACF;AACA,UAAM,MAAM,QAAQ,MAAM,GAAG,WAAW,EAAE,KAAA;AAC1C,UAAM,QAAQ,kBAAkB,QAAQ,MAAM,cAAc,CAAC,CAAC;AAC9D,QAAI,CAAC,OAAO,CAAC,OAAO;AAClB;AAAA,IACF;AACA,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO;AACT;AAEO,SAAS,mBACd,QACA,IACA,QACQ;AACR,QAAM,UAAoB,CAAA;AAC1B,QAAM,+BAAe,IAAA;AAErB,aAAW,OAAO,kBAAkB;AAClC,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,OAAO;AACT,cAAQ,KAAK,GAAG,GAAG,IAAI,KAAK,EAAE;AAC9B,eAAS,IAAI,GAAG;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,YAAY,OAAO,KAAK,MAAM,EACjC,OAAO,CAAA,QAAO,CAAC,SAAS,IAAI,GAAG,KAAK,OAAO,GAAG,CAAC,EAC/C,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAEpC,aAAW,OAAO,WAAW;AAC3B,YAAQ,KAAK,GAAG,GAAG,IAAI,OAAO,GAAG,CAAC,EAAE;AAAA,EACtC;AAEA,SAAO,QAAQ,SAAS,IACpB,QAAQ,MAAM,IAAI,EAAE,IAAI,QAAQ,KAAK,GAAG,CAAC,KACzC,QAAQ,MAAM,IAAI,EAAE;AAC1B;"}
1
+ {"version":3,"file":"standards-sdk.es165.js","sources":["../../src/utils/parsers/crypto-parser.ts"],"sourcesContent":["import { proto } from '@hashgraph/proto';\nimport {\n AccountId,\n TokenId,\n Hbar,\n HbarUnit,\n Long,\n Transaction,\n} from '@hashgraph/sdk';\nimport {\n AccountAmount,\n TokenAmount,\n CryptoDeleteData,\n CryptoCreateAccountData,\n CryptoUpdateAccountData,\n CryptoApproveAllowanceData,\n CryptoDeleteAllowanceData,\n NftAllowance,\n} from '../transaction-parser-types';\nimport { parseKey } from './parser-utils';\n\nexport class CryptoParser {\n static parseCryptoTransfers(\n cryptoTransfer: proto.ICryptoTransferTransactionBody,\n result: { transfers: AccountAmount[]; tokenTransfers: TokenAmount[] },\n ): void {\n if (cryptoTransfer.transfers?.accountAmounts) {\n result.transfers = cryptoTransfer.transfers.accountAmounts.map(aa => {\n const accountId = new AccountId(\n aa.accountID!.shardNum ?? 0,\n aa.accountID!.realmNum ?? 0,\n aa.accountID!.accountNum ?? 0,\n );\n const hbarAmount = Hbar.fromTinybars(Long.fromValue(aa.amount!));\n return {\n accountId: accountId.toString(),\n amount: hbarAmount.toString(HbarUnit.Hbar),\n isDecimal: true,\n };\n });\n }\n if (cryptoTransfer.tokenTransfers) {\n for (const tokenTransferList of cryptoTransfer.tokenTransfers) {\n const tokenId = new TokenId(\n tokenTransferList.token!.shardNum ?? 0,\n tokenTransferList.token!.realmNum ?? 0,\n tokenTransferList.token!.tokenNum ?? 0,\n );\n if (tokenTransferList.transfers) {\n for (const transfer of tokenTransferList.transfers) {\n const accountId = new AccountId(\n transfer.accountID!.shardNum ?? 0,\n transfer.accountID!.realmNum ?? 0,\n transfer.accountID!.accountNum ?? 0,\n );\n const tokenAmount = Long.fromValue(transfer.amount!).toNumber();\n result.tokenTransfers.push({\n tokenId: tokenId.toString(),\n accountId: accountId.toString(),\n amount: tokenAmount,\n });\n }\n }\n }\n }\n }\n\n static parseCryptoDelete(\n body: proto.ICryptoDeleteTransactionBody,\n ): CryptoDeleteData | undefined {\n if (!body) return undefined;\n const data: CryptoDeleteData = {};\n if (body.deleteAccountID) {\n data.deleteAccountId = new AccountId(\n body.deleteAccountID.shardNum ?? 0,\n body.deleteAccountID.realmNum ?? 0,\n body.deleteAccountID.accountNum ?? 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 }\n return data;\n }\n\n static parseCryptoCreateAccount(\n body: proto.ICryptoCreateTransactionBody,\n ): CryptoCreateAccountData | undefined {\n if (!body) return undefined;\n const data: CryptoCreateAccountData = {};\n if (body.initialBalance) {\n data.initialBalance = Hbar.fromTinybars(\n Long.fromValue(body.initialBalance),\n ).toString(HbarUnit.Hbar);\n }\n if (body.key) {\n data.key = parseKey(body.key);\n }\n if (body.receiverSigRequired !== undefined) {\n data.receiverSigRequired = body.receiverSigRequired;\n }\n if (body.autoRenewPeriod?.seconds) {\n data.autoRenewPeriod = Long.fromValue(\n body.autoRenewPeriod.seconds,\n ).toString();\n }\n if (body.memo) {\n data.memo = body.memo;\n }\n if (body.maxAutomaticTokenAssociations !== undefined) {\n data.maxAutomaticTokenAssociations = body.maxAutomaticTokenAssociations;\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.alias && body.alias.length > 0) {\n data.alias = Buffer.from(body.alias).toString('hex');\n }\n return data;\n }\n\n static parseCryptoUpdateAccount(\n body: proto.ICryptoUpdateTransactionBody,\n ): CryptoUpdateAccountData | undefined {\n if (!body) return undefined;\n const data: CryptoUpdateAccountData = {};\n if (body.accountIDToUpdate) {\n data.accountIdToUpdate = new AccountId(\n body.accountIDToUpdate.shardNum ?? 0,\n body.accountIDToUpdate.realmNum ?? 0,\n body.accountIDToUpdate.accountNum ?? 0,\n ).toString();\n }\n if (body.key) {\n data.key = parseKey(body.key);\n }\n if (body.expirationTime?.seconds) {\n data.expirationTime = `${Long.fromValue(\n body.expirationTime.seconds,\n ).toString()}.${body.expirationTime.nanos}`;\n }\n if (\n body.receiverSigRequired !== null &&\n body.receiverSigRequired !== undefined\n ) {\n data.receiverSigRequired = Boolean(body.receiverSigRequired);\n }\n if (body.autoRenewPeriod?.seconds) {\n data.autoRenewPeriod = Long.fromValue(\n body.autoRenewPeriod.seconds,\n ).toString();\n }\n if (body.memo?.value !== undefined) {\n data.memo = body.memo.value;\n }\n if (body.maxAutomaticTokenAssociations?.value !== undefined) {\n data.maxAutomaticTokenAssociations =\n body.maxAutomaticTokenAssociations.value;\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 (body.stakedNodeId !== null && body.stakedNodeId !== undefined) {\n data.stakedNodeId = Long.fromValue(body.stakedNodeId).toString();\n data.stakedAccountId = undefined;\n } else {\n data.stakedAccountId = undefined;\n data.stakedNodeId = undefined;\n }\n if (body.declineReward !== null && body.declineReward !== undefined) {\n data.declineReward = Boolean(body.declineReward);\n }\n return data;\n }\n\n static parseCryptoApproveAllowance(\n body: proto.ICryptoApproveAllowanceTransactionBody,\n ): CryptoApproveAllowanceData | undefined {\n if (!body) return undefined;\n const data: CryptoApproveAllowanceData = {};\n if (body.cryptoAllowances && body.cryptoAllowances.length > 0) {\n data.hbarAllowances = body.cryptoAllowances.map(a => ({\n ownerAccountId: new AccountId(\n a.owner!.shardNum ?? 0,\n a.owner!.realmNum ?? 0,\n a.owner!.accountNum ?? 0,\n ).toString(),\n spenderAccountId: new AccountId(\n a.spender!.shardNum ?? 0,\n a.spender!.realmNum ?? 0,\n a.spender!.accountNum ?? 0,\n ).toString(),\n amount: Hbar.fromTinybars(Long.fromValue(a.amount!)).toString(\n HbarUnit.Hbar,\n ),\n }));\n }\n if (body.tokenAllowances && body.tokenAllowances.length > 0) {\n data.tokenAllowances = body.tokenAllowances.map(a => ({\n tokenId: new TokenId(\n a.tokenId!.shardNum ?? 0,\n a.tokenId!.realmNum ?? 0,\n a.tokenId!.tokenNum ?? 0,\n ).toString(),\n ownerAccountId: new AccountId(\n a.owner!.shardNum ?? 0,\n a.owner!.realmNum ?? 0,\n a.owner!.accountNum ?? 0,\n ).toString(),\n spenderAccountId: new AccountId(\n a.spender!.shardNum ?? 0,\n a.spender!.realmNum ?? 0,\n a.spender!.accountNum ?? 0,\n ).toString(),\n amount: Long.fromValue(a.amount!).toString(),\n }));\n }\n if (body.nftAllowances && body.nftAllowances.length > 0) {\n data.nftAllowances = body.nftAllowances.map(a => {\n const allowance: NftAllowance = {};\n if (a.tokenId)\n allowance.tokenId = new TokenId(\n a.tokenId.shardNum ?? 0,\n a.tokenId.realmNum ?? 0,\n a.tokenId.tokenNum ?? 0,\n ).toString();\n if (a.owner)\n allowance.ownerAccountId = new AccountId(\n a.owner.shardNum ?? 0,\n a.owner.realmNum ?? 0,\n a.owner.accountNum ?? 0,\n ).toString();\n if (a.spender)\n allowance.spenderAccountId = new AccountId(\n a.spender.shardNum ?? 0,\n a.spender.realmNum ?? 0,\n a.spender.accountNum ?? 0,\n ).toString();\n if (a.serialNumbers && a.serialNumbers.length > 0)\n allowance.serialNumbers = a.serialNumbers.map(sn =>\n Long.fromValue(sn).toString(),\n );\n if (a.approvedForAll?.value !== undefined)\n allowance.approvedForAll = a.approvedForAll.value;\n if (a.delegatingSpender)\n allowance.delegatingSpender = new AccountId(\n a.delegatingSpender.shardNum ?? 0,\n a.delegatingSpender.realmNum ?? 0,\n a.delegatingSpender.accountNum ?? 0,\n ).toString();\n return allowance;\n });\n }\n return data;\n }\n\n static parseCryptoDeleteAllowance(\n body: proto.ICryptoDeleteAllowanceTransactionBody,\n ): CryptoDeleteAllowanceData | undefined {\n if (!body) return undefined;\n const data: CryptoDeleteAllowanceData = {};\n if (body.nftAllowances && body.nftAllowances.length > 0) {\n data.nftAllowancesToRemove = body.nftAllowances.map(a => ({\n ownerAccountId: new AccountId(\n a.owner!.shardNum ?? 0,\n a.owner!.realmNum ?? 0,\n a.owner!.accountNum ?? 0,\n ).toString(),\n tokenId: new TokenId(\n a.tokenId!.shardNum ?? 0,\n a.tokenId!.realmNum ?? 0,\n a.tokenId!.tokenNum ?? 0,\n ).toString(),\n serialNumbers: a.serialNumbers\n ? a.serialNumbers.map(sn => Long.fromValue(sn).toString())\n : [],\n }));\n }\n return data;\n }\n\n /**\n * Extract HBAR transfers from Transaction object\n */\n static extractHbarTransfersFromTransaction(\n transaction: Transaction,\n ): Array<{ accountId: string; amount: number }> {\n const transfers: Array<{ accountId: string; amount: number }> = [];\n\n try {\n const hbarTransfers = (\n transaction as unknown as {\n _hbarTransfers?: Array<{\n accountId?: AccountId;\n amount?: Hbar;\n }>;\n }\n )._hbarTransfers;\n\n if (Array.isArray(hbarTransfers)) {\n hbarTransfers.forEach(transfer => {\n if (transfer.accountId && transfer.amount) {\n const amountInTinybars = transfer.amount.toTinybars();\n const amountInHbar = Number(amountInTinybars) / 100000000;\n\n transfers.push({\n accountId: transfer.accountId.toString(),\n amount: amountInHbar,\n });\n }\n });\n }\n } catch (error) {}\n\n return transfers;\n }\n\n /**\n * Extract token transfers from Transaction object\n */\n static extractTokenTransfersFromTransaction(transaction: Transaction): Array<{\n tokenId: string;\n transfers: Array<{ accountId: string; amount: number }>;\n }> {\n const tokenTransfers: Array<{\n tokenId: string;\n transfers: Array<{ accountId: string; amount: number }>;\n }> = [];\n\n try {\n const tokenTransfersList = (\n transaction as unknown as {\n _tokenTransfers?: Array<{\n tokenId?: { toString(): string };\n transfers?: Array<{\n accountId?: AccountId;\n amount?: number | Long;\n }>;\n }>;\n }\n )._tokenTransfers;\n\n if (Array.isArray(tokenTransfersList)) {\n tokenTransfersList.forEach(tokenTransfer => {\n if (tokenTransfer.tokenId && Array.isArray(tokenTransfer.transfers)) {\n const transfers = tokenTransfer.transfers.map(transfer => ({\n accountId: transfer.accountId?.toString() || 'Unknown',\n amount: Number(transfer.amount || 0),\n }));\n\n tokenTransfers.push({\n tokenId: tokenTransfer.tokenId.toString(),\n transfers: transfers,\n });\n }\n });\n }\n } catch (error) {}\n\n return tokenTransfers;\n }\n\n /**\n * Parse crypto transaction from Transaction object with comprehensive extraction\n * This is the unified entry point that handles both protobuf and internal field extraction\n */\n static parseFromTransactionObject(transaction: Transaction): {\n type?: string;\n humanReadableType?: string;\n transfers?: Array<{\n accountId: string;\n amount: string;\n isDecimal?: boolean;\n }>;\n tokenTransfers?: Array<{\n tokenId: string;\n accountId: string;\n amount: number;\n }>;\n [key: string]: unknown;\n } {\n try {\n const hbarTransfers =\n this.extractHbarTransfersFromTransaction(transaction);\n const tokenTransfers =\n this.extractTokenTransfersFromTransaction(transaction);\n\n if (hbarTransfers.length > 0 || tokenTransfers.length > 0) {\n const convertedTransfers = hbarTransfers.map(transfer => ({\n accountId: transfer.accountId,\n amount: transfer.amount.toString() + ' ℏ',\n isDecimal: true,\n }));\n\n const convertedTokenTransfers = tokenTransfers.flatMap(tokenGroup =>\n tokenGroup.transfers.map(transfer => ({\n tokenId: tokenGroup.tokenId,\n accountId: transfer.accountId,\n amount: transfer.amount,\n })),\n );\n\n if (hbarTransfers.length > 0) {\n return {\n type: 'CRYPTOTRANSFER',\n humanReadableType: 'Crypto Transfer',\n transfers: convertedTransfers,\n tokenTransfers: convertedTokenTransfers,\n };\n } else if (tokenTransfers.length > 0) {\n return {\n type: 'TOKENTRANSFER',\n humanReadableType: 'Token Transfer',\n transfers: convertedTransfers,\n tokenTransfers: convertedTokenTransfers,\n };\n }\n }\n\n return {};\n } catch (error) {\n return {};\n }\n }\n}\n"],"names":[],"mappings":"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"}