deserializeTx.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. // eslint-disable-next-line @typescript-eslint/ban-ts-comment
  2. // @ts-nocheck
  3. import '../protocol/core/Tron_pb.cjs';
  4. const { Transaction } = globalThis.TronWebProto;
  5. import '../protocol/core/contract/balance_contract_pb.cjs';
  6. const { TransferContract, WithdrawBalanceContract, WitnessCreateContract, FreezeBalanceV2Contract, UnfreezeBalanceV2Contract, CancelAllUnfreezeV2Contract, WithdrawExpireUnfreezeContract, DelegateResourceContract, UnDelegateResourceContract, } = globalThis.TronWebProto;
  7. import '../protocol/core/contract/asset_issue_contract_pb.cjs';
  8. const { TransferAssetContract, ParticipateAssetIssueContract, AssetIssueContract, UpdateAssetContract } = globalThis.TronWebProto;
  9. import '../protocol/core/contract/smart_contract_pb.cjs';
  10. const { TriggerSmartContract } = globalThis.TronWebProto;
  11. import { byteArray2hexStr } from './bytes.js';
  12. import { hexStr2byteArray } from './code.js';
  13. import { isHex } from './validations.js';
  14. const ContractTypeMap = {
  15. '0': 'AccountCreateContract',
  16. '1': 'TransferContract',
  17. '2': 'TransferAssetContract',
  18. '4': 'VoteWitnessContract',
  19. '5': 'WitnessCreateContract',
  20. '6': 'AssetIssueContract',
  21. '9': 'ParticipateAssetIssueContract',
  22. '10': 'AccountUpdateContract',
  23. '11': 'FreezeBalanceContract',
  24. '12': 'UnfreezeBalanceContract',
  25. '13': 'WithdrawBalanceContract',
  26. '15': 'UpdateAssetContract',
  27. '16': 'ProposalCreateContract',
  28. '17': 'ProposalApproveContract',
  29. '18': 'ProposalDeleteContract',
  30. '19': 'SetAccountIdContract',
  31. '30': 'CreateSmartContract',
  32. '31': 'TriggerSmartContract',
  33. '33': 'UpdateSettingContract',
  34. '41': 'ExchangeCreateContract',
  35. '42': 'ExchangeInjectContract',
  36. '43': 'ExchangeWithdrawContract',
  37. '44': 'ExchangeTransactionContract',
  38. '45': 'UpdateEnergyLimitContract',
  39. '46': 'AccountPermissionUpdateContract',
  40. '48': 'ClearABIContract',
  41. '49': 'UpdateBrokerageContract',
  42. '54': 'FreezeBalanceV2Contract',
  43. '55': 'UnfreezeBalanceV2Contract',
  44. '56': 'WithdrawExpireUnfreezeContract',
  45. '57': 'DelegateResourceContract',
  46. '58': 'UnDelegateResourceContract',
  47. '59': 'CancelAllUnfreezeV2Contract',
  48. };
  49. const getAuthsList = (pb) => {
  50. const authsList = pb.getAuthsList();
  51. return authsList.map((authPb) => {
  52. const permission_name = byteArray2hexStr(authPb.getPermissionName_asU8());
  53. const accountPb = authPb.getAccount();
  54. const account = {
  55. name: byteArray2hexStr(accountPb.getName_asU8()),
  56. address: byteArray2hexStr(accountPb.getAddress_asU8()),
  57. };
  58. return {
  59. permission_name,
  60. account,
  61. };
  62. });
  63. };
  64. const DCommonData = (type, rawDataHex) => {
  65. const pb = Transaction.raw.deserializeBinary(hexStr2byteArray(rawDataHex));
  66. const contract = pb.getContractList()[0];
  67. const valuePb = contract.getParameter().getValue();
  68. const contractType = ContractTypeMap[contract.getType()];
  69. if (type !== contractType) {
  70. throw new Error(`type ${type} dismatches with rawDataHex type ${contractType}`);
  71. }
  72. return [
  73. {
  74. contract: [
  75. {
  76. parameter: {
  77. value: {},
  78. type_url: contract.getParameter().getTypeUrl(),
  79. },
  80. type,
  81. Permission_id: contract.getPermissionId(),
  82. },
  83. ],
  84. data: byteArray2hexStr(pb.getData()),
  85. fee_limit: pb.getFeeLimit(),
  86. ref_block_bytes: byteArray2hexStr(pb.getRefBlockBytes_asU8()),
  87. ref_block_hash: byteArray2hexStr(pb.getRefBlockHash_asU8()),
  88. expiration: pb.getExpiration(),
  89. timestamp: pb.getTimestamp(),
  90. scripts: byteArray2hexStr(pb.getScripts_asU8()),
  91. auths: getAuthsList(pb),
  92. },
  93. valuePb,
  94. ];
  95. };
  96. const DTriggerSmartContract = (type, rawDataHex) => {
  97. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  98. const triggerSmartContract = TriggerSmartContract.deserializeBinary(valuePb);
  99. commonData.contract[0].parameter.value = {
  100. owner_address: byteArray2hexStr(triggerSmartContract.getOwnerAddress_asU8()),
  101. contract_address: byteArray2hexStr(triggerSmartContract.getContractAddress_asU8()),
  102. call_value: triggerSmartContract.getCallValue(),
  103. data: byteArray2hexStr(triggerSmartContract.getData_asU8()),
  104. call_token_value: triggerSmartContract.getCallTokenValue(),
  105. token_id: triggerSmartContract.getTokenId(),
  106. };
  107. return commonData;
  108. };
  109. const getResourceName = (type) => {
  110. switch (type) {
  111. case 0:
  112. return 'BANDWIDTH';
  113. case 1:
  114. return 'ENERGY';
  115. default:
  116. return 'BANDWIDTH';
  117. }
  118. };
  119. const DFreezeBalanceV2Contract = (type, rawDataHex) => {
  120. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  121. const freezeBalanceV2Contract = FreezeBalanceV2Contract.deserializeBinary(valuePb);
  122. commonData.contract[0].parameter.value = {
  123. owner_address: byteArray2hexStr(freezeBalanceV2Contract.getOwnerAddress_asU8()),
  124. frozen_balance: freezeBalanceV2Contract.getFrozenBalance(),
  125. resource: getResourceName(freezeBalanceV2Contract.getResource()),
  126. };
  127. return commonData;
  128. };
  129. const DUnfreezeBalanceV2Contract = (type, rawDataHex) => {
  130. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  131. const unfreezeBalanceV2Contract = UnfreezeBalanceV2Contract.deserializeBinary(valuePb);
  132. commonData.contract[0].parameter.value = {
  133. owner_address: byteArray2hexStr(unfreezeBalanceV2Contract.getOwnerAddress_asU8()),
  134. unfreeze_balance: unfreezeBalanceV2Contract.getUnfreezeBalance(),
  135. resource: getResourceName(unfreezeBalanceV2Contract.getResource()),
  136. };
  137. return commonData;
  138. };
  139. const DCancelAllUnfreezeV2Contract = (type, rawDataHex) => {
  140. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  141. const cancelAllUnfreezeV2Contract = CancelAllUnfreezeV2Contract.deserializeBinary(valuePb);
  142. commonData.contract[0].parameter.value = {
  143. owner_address: byteArray2hexStr(cancelAllUnfreezeV2Contract.getOwnerAddress_asU8()),
  144. };
  145. return commonData;
  146. };
  147. const DDelegateResourceContract = (type, rawDataHex) => {
  148. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  149. const delegateResourceContract = DelegateResourceContract.deserializeBinary(valuePb);
  150. commonData.contract[0].parameter.value = {
  151. owner_address: byteArray2hexStr(delegateResourceContract.getOwnerAddress_asU8()),
  152. balance: delegateResourceContract.getBalance(),
  153. lock: delegateResourceContract.getLock(),
  154. lock_period: delegateResourceContract.getLockPeriod(),
  155. receiver_address: byteArray2hexStr(delegateResourceContract.getReceiverAddress_asU8()),
  156. resource: getResourceName(delegateResourceContract.getResource()),
  157. };
  158. return commonData;
  159. };
  160. const DUnDelegateResourceContract = (type, rawDataHex) => {
  161. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  162. const undelegateResourceContract = UnDelegateResourceContract.deserializeBinary(valuePb);
  163. commonData.contract[0].parameter.value = {
  164. owner_address: byteArray2hexStr(undelegateResourceContract.getOwnerAddress_asU8()),
  165. balance: undelegateResourceContract.getBalance(),
  166. receiver_address: byteArray2hexStr(undelegateResourceContract.getReceiverAddress_asU8()),
  167. resource: getResourceName(undelegateResourceContract.getResource()),
  168. };
  169. return commonData;
  170. };
  171. const DWithdrawExpireUnfreezeContract = (type, rawDataHex) => {
  172. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  173. const withdrawExpireUnfreezeContract = WithdrawExpireUnfreezeContract.deserializeBinary(valuePb);
  174. commonData.contract[0].parameter.value = {
  175. owner_address: byteArray2hexStr(withdrawExpireUnfreezeContract.getOwnerAddress_asU8()),
  176. };
  177. return commonData;
  178. };
  179. const DTransferContract = (type, rawDataHex) => {
  180. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  181. const transferContract = TransferContract.deserializeBinary(valuePb);
  182. commonData.contract[0].parameter.value = {
  183. owner_address: byteArray2hexStr(transferContract.getOwnerAddress_asU8()),
  184. to_address: byteArray2hexStr(transferContract.getToAddress_asU8()),
  185. amount: transferContract.getAmount(),
  186. };
  187. return commonData;
  188. };
  189. const DWithdrawBalanceContract = (type, rawDataHex) => {
  190. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  191. const withdrawBalanceContract = WithdrawBalanceContract.deserializeBinary(valuePb);
  192. commonData.contract[0].parameter.value = {
  193. owner_address: byteArray2hexStr(withdrawBalanceContract.getOwnerAddress_asU8()),
  194. };
  195. return commonData;
  196. };
  197. const DWitnessCreateContract = (type, rawDataHex) => {
  198. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  199. const witnessCreateContract = WitnessCreateContract.deserializeBinary(valuePb);
  200. commonData.contract[0].parameter.value = {
  201. owner_address: byteArray2hexStr(witnessCreateContract.getOwnerAddress_asU8()),
  202. url: byteArray2hexStr(witnessCreateContract.getUrl_asU8()),
  203. };
  204. return commonData;
  205. };
  206. const DTransferAssetContract = (type, rawDataHex) => {
  207. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  208. const transferAssetContract = TransferAssetContract.deserializeBinary(valuePb);
  209. commonData.contract[0].parameter.value = {
  210. owner_address: byteArray2hexStr(transferAssetContract.getOwnerAddress_asU8()),
  211. to_address: byteArray2hexStr(transferAssetContract.getToAddress_asU8()),
  212. asset_name: byteArray2hexStr(transferAssetContract.getAssetName_asU8()),
  213. amount: transferAssetContract.getAmount(),
  214. };
  215. return commonData;
  216. };
  217. const DParticipateAssetIssueContract = (type, rawDataHex) => {
  218. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  219. const participateAssetIssueContract = ParticipateAssetIssueContract.deserializeBinary(valuePb);
  220. commonData.contract[0].parameter.value = {
  221. owner_address: byteArray2hexStr(participateAssetIssueContract.getOwnerAddress_asU8()),
  222. to_address: byteArray2hexStr(participateAssetIssueContract.getToAddress_asU8()),
  223. asset_name: byteArray2hexStr(participateAssetIssueContract.getAssetName_asU8()),
  224. amount: participateAssetIssueContract.getAmount(),
  225. };
  226. return commonData;
  227. };
  228. const DAssetIssueContract = (type, rawDataHex) => {
  229. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  230. const assetIssueContract = AssetIssueContract.deserializeBinary(valuePb);
  231. commonData.contract[0].parameter.value = {
  232. owner_address: byteArray2hexStr(assetIssueContract.getOwnerAddress_asU8()),
  233. name: byteArray2hexStr(assetIssueContract.getName_asU8()),
  234. abbr: byteArray2hexStr(assetIssueContract.getAbbr_asU8()),
  235. description: byteArray2hexStr(assetIssueContract.getDescription_asU8()),
  236. url: byteArray2hexStr(assetIssueContract.getUrl_asU8()),
  237. total_supply: assetIssueContract.getTotalSupply(),
  238. trx_num: assetIssueContract.getTrxNum(),
  239. num: assetIssueContract.getNum(),
  240. start_time: assetIssueContract.getStartTime(),
  241. end_time: assetIssueContract.getEndTime(),
  242. frozen_supply: assetIssueContract.getFrozenSupplyList().map((frozenPb) => ({
  243. frozen_amount: frozenPb.getFrozenAmount(),
  244. frozen_days: frozenPb.getFrozenDays(),
  245. })),
  246. free_asset_net_limit: assetIssueContract.getFreeAssetNetLimit(),
  247. public_free_asset_net_limit: assetIssueContract.getPublicFreeAssetNetLimit(),
  248. precision: assetIssueContract.getPrecision(),
  249. vote_score: assetIssueContract.getVoteScore(),
  250. };
  251. return commonData;
  252. };
  253. const DUpdateAssetContract = (type, rawDataHex) => {
  254. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  255. const updateAssetContract = UpdateAssetContract.deserializeBinary(valuePb);
  256. commonData.contract[0].parameter.value = {
  257. owner_address: byteArray2hexStr(updateAssetContract.getOwnerAddress_asU8()),
  258. description: byteArray2hexStr(updateAssetContract.getDescription_asU8()),
  259. url: byteArray2hexStr(updateAssetContract.getUrl_asU8()),
  260. new_limit: updateAssetContract.getNewLimit(),
  261. new_public_limit: updateAssetContract.getNewPublicLimit(),
  262. };
  263. return commonData;
  264. };
  265. const deserializeTransaction = (type, rawDataHex) => {
  266. if (!rawDataHex) {
  267. throw new Error('rawDataHex cannot be empty');
  268. }
  269. if (!isHex(rawDataHex)) {
  270. throw new Error('rawDataHex is not a valid hex string');
  271. }
  272. switch (type) {
  273. case 'TriggerSmartContract':
  274. return DTriggerSmartContract(type, rawDataHex);
  275. case 'FreezeBalanceV2Contract':
  276. return DFreezeBalanceV2Contract(type, rawDataHex);
  277. case 'UnfreezeBalanceV2Contract':
  278. return DUnfreezeBalanceV2Contract(type, rawDataHex);
  279. case 'CancelAllUnfreezeV2Contract':
  280. return DCancelAllUnfreezeV2Contract(type, rawDataHex);
  281. case 'DelegateResourceContract':
  282. return DDelegateResourceContract(type, rawDataHex);
  283. case 'UnDelegateResourceContract':
  284. return DUnDelegateResourceContract(type, rawDataHex);
  285. case 'WithdrawExpireUnfreezeContract':
  286. return DWithdrawExpireUnfreezeContract(type, rawDataHex);
  287. case 'TransferContract':
  288. return DTransferContract(type, rawDataHex);
  289. case 'WithdrawBalanceContract':
  290. return DWithdrawBalanceContract(type, rawDataHex);
  291. case 'WitnessCreateContract':
  292. return DWitnessCreateContract(type, rawDataHex);
  293. case 'TransferAssetContract':
  294. return DTransferAssetContract(type, rawDataHex);
  295. case 'ParticipateAssetIssueContract':
  296. return DParticipateAssetIssueContract(type, rawDataHex);
  297. case 'AssetIssueContract':
  298. return DAssetIssueContract(type, rawDataHex);
  299. case 'UpdateAssetContract':
  300. return DUpdateAssetContract(type, rawDataHex);
  301. default:
  302. throw new Error(`trasaction ${type} not supported`);
  303. }
  304. };
  305. export { deserializeTransaction };
  306. //# sourceMappingURL=deserializeTx.js.map