@hashgraphonline/standards-sdk 0.0.174 → 0.0.176

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 (93) hide show
  1. package/dist/cjs/{index-xQfUfn20.cjs → index-DBI7RYzm.cjs} +19 -19
  2. package/dist/cjs/{index-xQfUfn20.cjs.map → index-DBI7RYzm.cjs.map} +1 -1
  3. package/dist/cjs/{index-DNOBUKZd-g0uNa1rQ.cjs → index-DNOBUKZd-PuaZE8zI.cjs} +2 -2
  4. package/dist/cjs/{index-DNOBUKZd-g0uNa1rQ.cjs.map → index-DNOBUKZd-PuaZE8zI.cjs.map} +1 -1
  5. package/dist/cjs/standards-sdk.cjs +1 -1
  6. package/dist/cjs/{standards-sdk.es47-LpJXpYet-fj1bqMZs.cjs → standards-sdk.es47-LpJXpYet-Dn0a_M7H.cjs} +2 -2
  7. package/dist/cjs/{standards-sdk.es47-LpJXpYet-fj1bqMZs.cjs.map → standards-sdk.es47-LpJXpYet-Dn0a_M7H.cjs.map} +1 -1
  8. package/dist/cjs/{standards-sdk.es48-PT6ZHlCU-vkSluOOc.cjs → standards-sdk.es48-PT6ZHlCU-CpnblkfW.cjs} +2 -2
  9. package/dist/cjs/{standards-sdk.es48-PT6ZHlCU-vkSluOOc.cjs.map → standards-sdk.es48-PT6ZHlCU-CpnblkfW.cjs.map} +1 -1
  10. package/dist/cjs/{standards-sdk.es49-BoFc-ELK-DC0zfqT0.cjs → standards-sdk.es49-BoFc-ELK-AFqdqMBQ.cjs} +2 -2
  11. package/dist/cjs/{standards-sdk.es49-BoFc-ELK-DC0zfqT0.cjs.map → standards-sdk.es49-BoFc-ELK-AFqdqMBQ.cjs.map} +1 -1
  12. package/dist/cjs/{standards-sdk.es50-miBtNmtl-B2MpsQnf.cjs → standards-sdk.es50-miBtNmtl-BXhMfUtd.cjs} +2 -2
  13. package/dist/cjs/{standards-sdk.es50-miBtNmtl-B2MpsQnf.cjs.map → standards-sdk.es50-miBtNmtl-BXhMfUtd.cjs.map} +1 -1
  14. package/dist/cjs/{standards-sdk.es51-rS2UvvV5-CRkd1bF-.cjs → standards-sdk.es51-rS2UvvV5-Bh2x7xrp.cjs} +2 -2
  15. package/dist/cjs/{standards-sdk.es51-rS2UvvV5-CRkd1bF-.cjs.map → standards-sdk.es51-rS2UvvV5-Bh2x7xrp.cjs.map} +1 -1
  16. package/dist/cjs/{standards-sdk.es52-D-lvSMBY-DdUJIqZX.cjs → standards-sdk.es52-D-lvSMBY-DvI5ClIb.cjs} +2 -2
  17. package/dist/cjs/{standards-sdk.es52-D-lvSMBY-DdUJIqZX.cjs.map → standards-sdk.es52-D-lvSMBY-DvI5ClIb.cjs.map} +1 -1
  18. package/dist/cjs/utils/parsers/crypto-parser.d.ts +37 -0
  19. package/dist/cjs/utils/parsers/crypto-parser.d.ts.map +1 -1
  20. package/dist/cjs/utils/parsers/file-parser.d.ts +46 -0
  21. package/dist/cjs/utils/parsers/file-parser.d.ts.map +1 -1
  22. package/dist/cjs/utils/parsers/hcs-parser.d.ts +10 -0
  23. package/dist/cjs/utils/parsers/hcs-parser.d.ts.map +1 -1
  24. package/dist/cjs/utils/parsers/hts-parser.d.ts +23 -5
  25. package/dist/cjs/utils/parsers/hts-parser.d.ts.map +1 -1
  26. package/dist/cjs/utils/parsers/parser-utils.d.ts +11 -0
  27. package/dist/cjs/utils/parsers/parser-utils.d.ts.map +1 -1
  28. package/dist/cjs/utils/parsers/schedule-parser.d.ts +56 -11
  29. package/dist/cjs/utils/parsers/schedule-parser.d.ts.map +1 -1
  30. package/dist/cjs/utils/parsers/scs-parser.d.ts +51 -0
  31. package/dist/cjs/utils/parsers/scs-parser.d.ts.map +1 -1
  32. package/dist/cjs/utils/parsers/util-parser.d.ts +72 -1
  33. package/dist/cjs/utils/parsers/util-parser.d.ts.map +1 -1
  34. package/dist/cjs/utils/transaction-parser-types.d.ts +60 -0
  35. package/dist/cjs/utils/transaction-parser-types.d.ts.map +1 -1
  36. package/dist/cjs/utils/transaction-parser.d.ts +16 -14
  37. package/dist/cjs/utils/transaction-parser.d.ts.map +1 -1
  38. package/dist/es/standards-sdk.es35.js +388 -387
  39. package/dist/es/standards-sdk.es35.js.map +1 -1
  40. package/dist/es/standards-sdk.es36.js.map +1 -1
  41. package/dist/es/standards-sdk.es39.js +385 -18
  42. package/dist/es/standards-sdk.es39.js.map +1 -1
  43. package/dist/es/standards-sdk.es40.js +209 -86
  44. package/dist/es/standards-sdk.es40.js.map +1 -1
  45. package/dist/es/standards-sdk.es50.js +55 -0
  46. package/dist/es/standards-sdk.es50.js.map +1 -1
  47. package/dist/es/standards-sdk.es51.js +249 -1
  48. package/dist/es/standards-sdk.es51.js.map +1 -1
  49. package/dist/es/standards-sdk.es52.js +90 -0
  50. package/dist/es/standards-sdk.es52.js.map +1 -1
  51. package/dist/es/standards-sdk.es53.js +268 -9
  52. package/dist/es/standards-sdk.es53.js.map +1 -1
  53. package/dist/es/standards-sdk.es54.js +306 -0
  54. package/dist/es/standards-sdk.es54.js.map +1 -1
  55. package/dist/es/standards-sdk.es55.js +32 -0
  56. package/dist/es/standards-sdk.es55.js.map +1 -1
  57. package/dist/es/utils/parsers/crypto-parser.d.ts +37 -0
  58. package/dist/es/utils/parsers/crypto-parser.d.ts.map +1 -1
  59. package/dist/es/utils/parsers/file-parser.d.ts +46 -0
  60. package/dist/es/utils/parsers/file-parser.d.ts.map +1 -1
  61. package/dist/es/utils/parsers/hcs-parser.d.ts +10 -0
  62. package/dist/es/utils/parsers/hcs-parser.d.ts.map +1 -1
  63. package/dist/es/utils/parsers/hts-parser.d.ts +23 -5
  64. package/dist/es/utils/parsers/hts-parser.d.ts.map +1 -1
  65. package/dist/es/utils/parsers/parser-utils.d.ts +11 -0
  66. package/dist/es/utils/parsers/parser-utils.d.ts.map +1 -1
  67. package/dist/es/utils/parsers/schedule-parser.d.ts +56 -11
  68. package/dist/es/utils/parsers/schedule-parser.d.ts.map +1 -1
  69. package/dist/es/utils/parsers/scs-parser.d.ts +51 -0
  70. package/dist/es/utils/parsers/scs-parser.d.ts.map +1 -1
  71. package/dist/es/utils/parsers/util-parser.d.ts +72 -1
  72. package/dist/es/utils/parsers/util-parser.d.ts.map +1 -1
  73. package/dist/es/utils/transaction-parser-types.d.ts +60 -0
  74. package/dist/es/utils/transaction-parser-types.d.ts.map +1 -1
  75. package/dist/es/utils/transaction-parser.d.ts +16 -14
  76. package/dist/es/utils/transaction-parser.d.ts.map +1 -1
  77. package/package.json +1 -1
  78. package/dist/cjs/utils/__tests__/hts-parser.test.d.ts +0 -2
  79. package/dist/cjs/utils/__tests__/hts-parser.test.d.ts.map +0 -1
  80. package/dist/cjs/utils/__tests__/schedule-parser.test.d.ts +0 -2
  81. package/dist/cjs/utils/__tests__/schedule-parser.test.d.ts.map +0 -1
  82. package/dist/cjs/utils/__tests__/token-create-parsing.test.d.ts +0 -2
  83. package/dist/cjs/utils/__tests__/token-create-parsing.test.d.ts.map +0 -1
  84. package/dist/cjs/utils/__tests__/transaction-parser.test.d.ts +0 -2
  85. package/dist/cjs/utils/__tests__/transaction-parser.test.d.ts.map +0 -1
  86. package/dist/es/utils/__tests__/hts-parser.test.d.ts +0 -2
  87. package/dist/es/utils/__tests__/hts-parser.test.d.ts.map +0 -1
  88. package/dist/es/utils/__tests__/schedule-parser.test.d.ts +0 -2
  89. package/dist/es/utils/__tests__/schedule-parser.test.d.ts.map +0 -1
  90. package/dist/es/utils/__tests__/token-create-parsing.test.d.ts +0 -2
  91. package/dist/es/utils/__tests__/token-create-parsing.test.d.ts.map +0 -1
  92. package/dist/es/utils/__tests__/transaction-parser.test.d.ts +0 -2
  93. package/dist/es/utils/__tests__/transaction-parser.test.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es52.js","sources":["../../src/utils/parsers/crypto-parser.ts"],"sourcesContent":["import { proto } from '@hashgraph/proto';\nimport { AccountId, TokenId, Hbar, HbarUnit, Long } 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"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es52.js","sources":["../../src/utils/parsers/crypto-parser.ts"],"sourcesContent":["import { proto } from '@hashgraph/proto';\nimport { AccountId, TokenId, Hbar, HbarUnit, Long, Transaction } 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 = (transaction as unknown as {\n _hbarTransfers?: Array<{\n accountId?: AccountId;\n amount?: Hbar;\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(\n transaction: Transaction,\n ): 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 = (transaction as unknown as {\n _tokenTransfers?: Array<{\n tokenId?: { toString(): string };\n transfers?: Array<{\n accountId?: AccountId;\n amount?: number | Long;\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<{ accountId: string; amount: string; isDecimal?: boolean }>;\n tokenTransfers?: Array<{ tokenId: string; accountId: string; amount: number }>;\n [key: string]: unknown;\n } {\n try {\n const hbarTransfers = this.extractHbarTransfersFromTransaction(transaction);\n const tokenTransfers = 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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"}
@@ -1,7 +1,255 @@
1
- import { Hbar, Long, HbarUnit, ContractId, AccountId, FileId } from "@hashgraph/sdk";
1
+ import { proto } from "@hashgraph/proto";
2
+ import { Long, Hbar, HbarUnit, ContractId, AccountId, FileId } from "@hashgraph/sdk";
2
3
  import { Buffer } from "buffer";
3
- import { parseKey } from "./standards-sdk.es55.js";
4
+ import { hasTransactionType, parseKey } from "./standards-sdk.es55.js";
4
5
  class SCSParser {
6
+ /**
7
+ * Parse Smart Contract Service transaction using unified dual-branch approach
8
+ * This handles both regular transactions and signed transaction variants
9
+ */
10
+ static parseSCSTransaction(transaction, originalBytes) {
11
+ try {
12
+ if (originalBytes || transaction.toBytes) {
13
+ try {
14
+ const bytesToParse = originalBytes || transaction.toBytes();
15
+ const decoded = proto.TransactionList.decode(bytesToParse);
16
+ if (decoded.transactionList && decoded.transactionList.length > 0) {
17
+ const tx = decoded.transactionList[0];
18
+ let txBody = null;
19
+ if (tx.bodyBytes && tx.bodyBytes.length > 0) {
20
+ txBody = proto.TransactionBody.decode(tx.bodyBytes);
21
+ } else if (tx.signedTransactionBytes && tx.signedTransactionBytes.length > 0) {
22
+ const signedTx = proto.SignedTransaction.decode(tx.signedTransactionBytes);
23
+ if (signedTx.bodyBytes) {
24
+ txBody = proto.TransactionBody.decode(signedTx.bodyBytes);
25
+ }
26
+ }
27
+ if (txBody) {
28
+ const protoResult = this.parseFromProtobufTxBody(txBody);
29
+ if (protoResult.type && protoResult.type !== "UNKNOWN") {
30
+ return protoResult;
31
+ }
32
+ }
33
+ }
34
+ } catch (protoError) {
35
+ }
36
+ }
37
+ return this.parseFromTransactionInternals(transaction);
38
+ } catch (error) {
39
+ return { type: "UNKNOWN", humanReadableType: "Unknown Contract Transaction" };
40
+ }
41
+ }
42
+ /**
43
+ * Parse contract transaction from protobuf TransactionBody
44
+ * Handles all contract operations from decoded protobuf data
45
+ */
46
+ static parseFromProtobufTxBody(txBody) {
47
+ if (txBody.contractCall) {
48
+ const contractCall = this.parseContractCall(txBody.contractCall);
49
+ if (contractCall) {
50
+ return {
51
+ type: "CONTRACTCALL",
52
+ humanReadableType: "Contract Call",
53
+ contractCall
54
+ };
55
+ }
56
+ }
57
+ if (txBody.contractCreateInstance) {
58
+ const contractCreate = this.parseContractCreate(txBody.contractCreateInstance);
59
+ if (contractCreate) {
60
+ return {
61
+ type: "CONTRACTCREATE",
62
+ humanReadableType: "Contract Create",
63
+ contractCreate
64
+ };
65
+ }
66
+ }
67
+ if (txBody.contractUpdateInstance) {
68
+ const contractUpdate = this.parseContractUpdate(txBody.contractUpdateInstance);
69
+ if (contractUpdate) {
70
+ return {
71
+ type: "CONTRACTUPDATE",
72
+ humanReadableType: "Contract Update",
73
+ contractUpdate
74
+ };
75
+ }
76
+ }
77
+ if (txBody.contractDeleteInstance) {
78
+ const contractDelete = this.parseContractDelete(txBody.contractDeleteInstance);
79
+ if (contractDelete) {
80
+ return {
81
+ type: "CONTRACTDELETE",
82
+ humanReadableType: "Contract Delete",
83
+ contractDelete
84
+ };
85
+ }
86
+ }
87
+ if (txBody.ethereumTransaction) {
88
+ const ethereumCall = this.parseEthereumTransaction(txBody.ethereumTransaction);
89
+ if (ethereumCall) {
90
+ return {
91
+ type: "ETHEREUMTRANSACTION",
92
+ humanReadableType: "Ethereum Transaction",
93
+ contractCall: ethereumCall
94
+ // Map to contractCall structure for consistency
95
+ };
96
+ }
97
+ }
98
+ return {};
99
+ }
100
+ /**
101
+ * Extract contract data from Transaction internal fields
102
+ * This handles cases where data is stored in Transaction object internals
103
+ */
104
+ static parseFromTransactionInternals(transaction) {
105
+ try {
106
+ const tx = transaction;
107
+ if (tx._contractId && tx._gas) {
108
+ const contractCall = {
109
+ contractId: tx._contractId.toString(),
110
+ gas: typeof tx._gas === "number" ? tx._gas : Long.fromValue(tx._gas).toNumber(),
111
+ amount: tx._amount ? parseFloat(tx._amount.toString()) : 0
112
+ };
113
+ if (tx._functionParameters) {
114
+ const funcParams = Buffer.from(tx._functionParameters).toString("hex");
115
+ contractCall.functionParameters = funcParams;
116
+ contractCall.functionName = this.extractFunctionName(funcParams);
117
+ }
118
+ return {
119
+ type: "CONTRACTCALL",
120
+ humanReadableType: "Contract Call",
121
+ contractCall
122
+ };
123
+ }
124
+ if (hasTransactionType(transaction, "contractCreateInstance")) {
125
+ const contractCreate = {
126
+ gas: tx._gas.toString(),
127
+ initialBalance: tx._initialBalance?.toString() || "0"
128
+ };
129
+ if (tx._fileId) {
130
+ contractCreate.initcodeSource = "fileID";
131
+ contractCreate.initcode = tx._fileId.toString();
132
+ } else if (tx._bytecode) {
133
+ contractCreate.initcodeSource = "bytes";
134
+ contractCreate.initcode = Buffer.from(tx._bytecode).toString("hex");
135
+ }
136
+ if (tx._constructorParameters) {
137
+ contractCreate.constructorParameters = Buffer.from(tx._constructorParameters).toString("hex");
138
+ }
139
+ if (tx._memo) contractCreate.memo = tx._memo;
140
+ if (tx._adminKey) contractCreate.adminKey = parseKey(tx._adminKey);
141
+ if (tx._maxAutomaticTokenAssociations !== void 0) {
142
+ contractCreate.maxAutomaticTokenAssociations = tx._maxAutomaticTokenAssociations;
143
+ }
144
+ if (tx._stakedAccountId) {
145
+ contractCreate.stakedAccountId = tx._stakedAccountId.toString();
146
+ } else if (tx._stakedNodeId !== null && tx._stakedNodeId !== void 0) {
147
+ contractCreate.stakedNodeId = Long.fromValue(tx._stakedNodeId).toString();
148
+ }
149
+ if (tx._declineReward !== void 0) contractCreate.declineReward = tx._declineReward;
150
+ if (tx._autoRenewPeriod) contractCreate.autoRenewPeriod = tx._autoRenewPeriod.toString();
151
+ return {
152
+ type: "CONTRACTCREATE",
153
+ humanReadableType: "Contract Create",
154
+ contractCreate
155
+ };
156
+ }
157
+ if (hasTransactionType(transaction, "contractUpdateInstance")) {
158
+ const contractUpdate = {
159
+ contractIdToUpdate: tx._contractId.toString()
160
+ };
161
+ if (tx._memo) contractUpdate.memo = tx._memo;
162
+ if (tx._adminKey) contractUpdate.adminKey = parseKey(tx._adminKey);
163
+ if (tx._maxAutomaticTokenAssociations !== void 0) {
164
+ contractUpdate.maxAutomaticTokenAssociations = tx._maxAutomaticTokenAssociations;
165
+ }
166
+ if (tx._stakedAccountId) {
167
+ contractUpdate.stakedAccountId = tx._stakedAccountId.toString();
168
+ } else if (tx._stakedNodeId !== null && tx._stakedNodeId !== void 0) {
169
+ contractUpdate.stakedNodeId = Long.fromValue(tx._stakedNodeId).toString();
170
+ }
171
+ if (tx._declineReward !== void 0) contractUpdate.declineReward = tx._declineReward;
172
+ if (tx._autoRenewPeriod) contractUpdate.autoRenewPeriod = tx._autoRenewPeriod.toString();
173
+ return {
174
+ type: "CONTRACTUPDATE",
175
+ humanReadableType: "Contract Update",
176
+ contractUpdate
177
+ };
178
+ }
179
+ if (hasTransactionType(transaction, "contractDeleteInstance")) {
180
+ const contractDelete = {
181
+ contractIdToDelete: tx._contractId.toString()
182
+ };
183
+ if (tx._transferAccountId) {
184
+ contractDelete.transferAccountId = tx._transferAccountId.toString();
185
+ } else if (tx._transferContractId) {
186
+ contractDelete.transferContractId = tx._transferContractId.toString();
187
+ }
188
+ return {
189
+ type: "CONTRACTDELETE",
190
+ humanReadableType: "Contract Delete",
191
+ contractDelete
192
+ };
193
+ }
194
+ return {};
195
+ } catch (error) {
196
+ return {};
197
+ }
198
+ }
199
+ /**
200
+ * Enhanced function name extraction from contract call parameters
201
+ * Attempts to decode function selector and map to known function names
202
+ */
203
+ static extractFunctionName(functionParameters) {
204
+ if (functionParameters.length < 8) return "unknown";
205
+ const selector = functionParameters.substring(0, 8);
206
+ const commonSelectors = {
207
+ "a9059cbb": "transfer",
208
+ "095ea7b3": "approve",
209
+ "23b872dd": "transferFrom",
210
+ "70a08231": "balanceOf",
211
+ "dd62ed3e": "allowance",
212
+ "18160ddd": "totalSupply",
213
+ "06fdde03": "name",
214
+ "95d89b41": "symbol",
215
+ "313ce567": "decimals",
216
+ "42842e0e": "safeTransferFrom",
217
+ "b88d4fde": "safeTransferFrom",
218
+ "e985e9c5": "isApprovedForAll",
219
+ "a22cb465": "setApprovalForAll",
220
+ "6352211e": "ownerOf",
221
+ "c87b56dd": "tokenURI",
222
+ "01ffc9a7": "supportsInterface",
223
+ "40c10f19": "mint",
224
+ "42966c68": "burn",
225
+ "f2fde38b": "transferOwnership",
226
+ "715018a6": "renounceOwnership",
227
+ "8da5cb5b": "owner"
228
+ };
229
+ return commonSelectors[selector] || selector;
230
+ }
231
+ /**
232
+ * Parse Ethereum Transaction (was completely missing from original parser)
233
+ */
234
+ static parseEthereumTransaction(body) {
235
+ if (!body) return void 0;
236
+ const data = {
237
+ contractId: "EVM",
238
+ // Ethereum transactions don't have Hedera contract IDs
239
+ gas: body.maxGasAllowance ? Long.fromValue(body.maxGasAllowance).toNumber() : 0,
240
+ amount: 0
241
+ // Will be extracted from ethereum data if present
242
+ };
243
+ if (body.ethereumData && body.ethereumData.length > 0) {
244
+ const ethData = Buffer.from(body.ethereumData).toString("hex");
245
+ data.functionParameters = ethData;
246
+ if (ethData.length >= 8) {
247
+ data.functionName = this.extractFunctionName(ethData);
248
+ }
249
+ }
250
+ return data;
251
+ }
252
+ // Original parsing methods with enhanced function name extraction
5
253
  static parseContractCall(body) {
6
254
  if (!body) return void 0;
7
255
  const hbarAmount = Hbar.fromTinybars(Long.fromValue(body.amount ?? 0));
@@ -19,7 +267,7 @@ class SCSParser {
19
267
  "hex"
20
268
  );
21
269
  if (data.functionParameters.length >= 8) {
22
- data.functionName = data.functionParameters.substring(0, 8);
270
+ data.functionName = this.extractFunctionName(data.functionParameters);
23
271
  }
24
272
  }
25
273
  return data;
@@ -103,12 +351,16 @@ class SCSParser {
103
351
  ).toString();
104
352
  }
105
353
  if (body.memo) {
106
- const memoAsAny = body.memo;
107
- if (memoAsAny && typeof memoAsAny === "object" && memoAsAny.hasOwnProperty("value")) {
108
- const memoVal = memoAsAny.value;
109
- data.memo = memoVal === null || memoVal === void 0 ? void 0 : String(memoVal);
110
- } else if (typeof memoAsAny === "string") {
111
- data.memo = memoAsAny;
354
+ const memoUnion = body.memo;
355
+ if (memoUnion && typeof memoUnion === "object" && Object.prototype.hasOwnProperty.call(memoUnion, "value")) {
356
+ const value = memoUnion.value;
357
+ if (value === null || value === void 0) {
358
+ data.memo = void 0;
359
+ } else {
360
+ data.memo = String(value);
361
+ }
362
+ } else if (typeof memoUnion === "string") {
363
+ data.memo = memoUnion;
112
364
  } else {
113
365
  data.memo = void 0;
114
366
  }
@@ -169,6 +421,13 @@ class SCSParser {
169
421
  }
170
422
  return data;
171
423
  }
424
+ /**
425
+ * Parse SCS (Smart Contract Service) transaction from Transaction object
426
+ * This is the unified entry point that delegates to the comprehensive parsing logic
427
+ */
428
+ static parseFromTransactionObject(transaction) {
429
+ return this.parseSCSTransaction(transaction);
430
+ }
172
431
  }
173
432
  export {
174
433
  SCSParser
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es53.js","sources":["../../src/utils/parsers/scs-parser.ts"],"sourcesContent":["import { proto } from '@hashgraph/proto';\nimport { ContractId, Hbar, HbarUnit, Long } from '@hashgraph/sdk';\nimport {\n ContractCallData,\n ContractCreateData,\n ContractUpdateData,\n ContractDeleteData,\n} from '../transaction-parser-types';\nimport { Buffer } from 'buffer';\nimport { parseKey } from './parser-utils';\nimport { AccountId, FileId } from '@hashgraph/sdk';\n\nexport class SCSParser {\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 = data.functionParameters.substring(0, 8);\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 memoAsAny = body.memo as any;\n if (\n memoAsAny &&\n typeof memoAsAny === 'object' &&\n memoAsAny.hasOwnProperty('value')\n ) {\n const memoVal = memoAsAny.value;\n data.memo =\n memoVal === null || memoVal === undefined\n ? undefined\n : String(memoVal);\n } else if (typeof memoAsAny === 'string') {\n data.memo = memoAsAny;\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"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es53.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 { parseKey, extractTransactionBody, hasTransactionType } 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 // First, try to parse from protobuf data if available\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 // Handle regular transaction branch\n if (tx.bodyBytes && tx.bodyBytes.length > 0) {\n txBody = proto.TransactionBody.decode(tx.bodyBytes);\n }\n // Handle signed transaction branch (was missing in original)\n else if (tx.signedTransactionBytes && tx.signedTransactionBytes.length > 0) {\n const signedTx = proto.SignedTransaction.decode(tx.signedTransactionBytes);\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 // Continue to Transaction object parsing\n }\n }\n \n // Fallback to Transaction object parsing\n return this.parseFromTransactionInternals(transaction);\n } catch (error) {\n return { type: 'UNKNOWN', humanReadableType: 'Unknown Contract Transaction' };\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(\n txBody: proto.ITransactionBody\n ): {\n type?: string;\n humanReadableType?: string;\n [key: string]: unknown;\n } {\n // Contract Call\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 // Contract Create\n if (txBody.contractCreateInstance) {\n const contractCreate = this.parseContractCreate(txBody.contractCreateInstance);\n if (contractCreate) {\n return {\n type: 'CONTRACTCREATE',\n humanReadableType: 'Contract Create',\n contractCreate,\n };\n }\n }\n \n // Contract Update\n if (txBody.contractUpdateInstance) {\n const contractUpdate = this.parseContractUpdate(txBody.contractUpdateInstance);\n if (contractUpdate) {\n return {\n type: 'CONTRACTUPDATE',\n humanReadableType: 'Contract Update',\n contractUpdate,\n };\n }\n }\n \n // Contract Delete\n if (txBody.contractDeleteInstance) {\n const contractDelete = this.parseContractDelete(txBody.contractDeleteInstance);\n if (contractDelete) {\n return {\n type: 'CONTRACTDELETE',\n humanReadableType: 'Contract Delete',\n contractDelete,\n };\n }\n }\n \n // Ethereum Transaction (was completely missing)\n if (txBody.ethereumTransaction) {\n const ethereumCall = this.parseEthereumTransaction(txBody.ethereumTransaction);\n if (ethereumCall) {\n return {\n type: 'ETHEREUMTRANSACTION',\n humanReadableType: 'Ethereum Transaction',\n contractCall: ethereumCall, // Map to contractCall structure for consistency\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(\n transaction: Transaction\n ): {\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 // Contract Call (most common)\n if (tx._contractId && tx._gas) {\n const contractCall: ContractCallData = {\n contractId: tx._contractId.toString(),\n gas: typeof tx._gas === 'number' ? tx._gas : 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('hex');\n contractCall.functionParameters = funcParams;\n // Enhanced function name extraction\n contractCall.functionName = this.extractFunctionName(funcParams);\n }\n \n return {\n type: 'CONTRACTCALL',\n humanReadableType: 'Contract Call',\n contractCall,\n };\n }\n \n // Contract Create\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(tx._constructorParameters).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 = tx._maxAutomaticTokenAssociations;\n }\n if (tx._stakedAccountId) {\n contractCreate.stakedAccountId = tx._stakedAccountId.toString();\n } else if (tx._stakedNodeId !== null && tx._stakedNodeId !== undefined) {\n contractCreate.stakedNodeId = Long.fromValue(tx._stakedNodeId).toString();\n }\n if (tx._declineReward !== undefined) contractCreate.declineReward = tx._declineReward;\n if (tx._autoRenewPeriod) contractCreate.autoRenewPeriod = tx._autoRenewPeriod.toString();\n \n return {\n type: 'CONTRACTCREATE',\n humanReadableType: 'Contract Create',\n contractCreate,\n };\n }\n \n // Contract Update\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 = tx._maxAutomaticTokenAssociations;\n }\n if (tx._stakedAccountId) {\n contractUpdate.stakedAccountId = tx._stakedAccountId.toString();\n } else if (tx._stakedNodeId !== null && tx._stakedNodeId !== undefined) {\n contractUpdate.stakedNodeId = Long.fromValue(tx._stakedNodeId).toString();\n }\n if (tx._declineReward !== undefined) contractUpdate.declineReward = tx._declineReward;\n if (tx._autoRenewPeriod) contractUpdate.autoRenewPeriod = tx._autoRenewPeriod.toString();\n \n return {\n type: 'CONTRACTUPDATE',\n humanReadableType: 'Contract Update',\n contractUpdate,\n };\n }\n \n // Contract Delete\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 // Common ERC-20/ERC-721 function selectors\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 private static parseEthereumTransaction(\n body: proto.IEthereumTransactionBody\n ): ContractCallData | undefined {\n if (!body) return undefined;\n \n // Extract data from Ethereum transaction\n const data: ContractCallData = {\n contractId: 'EVM', // Ethereum transactions don't have Hedera contract IDs\n gas: body.maxGasAllowance ? Long.fromValue(body.maxGasAllowance).toNumber() : 0,\n amount: 0, // Will be extracted from ethereum data if present\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 // Try to extract function selector from ethereum data\n if (ethData.length >= 8) {\n data.functionName = this.extractFunctionName(ethData);\n }\n }\n \n return data;\n }\n\n // Original parsing methods with enhanced function name extraction\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 // Use enhanced function name extraction\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}"],"names":[],"mappings":"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"}