transaction.ts 45 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199
  1. // eslint-disable-next-line @typescript-eslint/ban-ts-comment
  2. // @ts-nocheck
  3. import google_protobuf_any_pb from 'google-protobuf/google/protobuf/any_pb.js';
  4. import '../protocol/core/Tron_pb.cjs';
  5. const { Transaction, Permission, Key } = globalThis.TronWebProto;
  6. import '../protocol/core/contract/balance_contract_pb.cjs';
  7. const {
  8. TransferContract,
  9. FreezeBalanceContract,
  10. UnfreezeBalanceContract,
  11. WithdrawBalanceContract,
  12. FreezeBalanceV2Contract,
  13. UnfreezeBalanceV2Contract,
  14. CancelAllUnfreezeV2Contract,
  15. WithdrawExpireUnfreezeContract,
  16. DelegateResourceContract,
  17. UnDelegateResourceContract,
  18. } = globalThis.TronWebProto;
  19. import '../protocol/core/contract/asset_issue_contract_pb.cjs';
  20. const { TransferAssetContract, ParticipateAssetIssueContract, AssetIssueContract, UpdateAssetContract } = globalThis.TronWebProto;
  21. import '../protocol/core/contract/smart_contract_pb.cjs';
  22. const {
  23. TriggerSmartContract,
  24. ClearABIContract,
  25. UpdateEnergyLimitContract,
  26. UpdateSettingContract,
  27. CreateSmartContract,
  28. SmartContract,
  29. } = globalThis.TronWebProto;
  30. import '../protocol/core/contract/common_pb.cjs';
  31. const { ResourceCode } = globalThis.TronWebProto;
  32. import '../protocol/core/contract/witness_contract_pb.cjs';
  33. const { WitnessCreateContract, VoteWitnessContract } = globalThis.TronWebProto;
  34. import '../protocol/core/contract/storage_contract_pb.cjs';
  35. const { UpdateBrokerageContract } = globalThis.TronWebProto;
  36. import '../protocol/core/contract/account_contract_pb.cjs';
  37. const { AccountCreateContract, AccountUpdateContract, SetAccountIdContract, AccountPermissionUpdateContract } =
  38. globalThis.TronWebProto;
  39. import '../protocol/core/contract/proposal_contract_pb.cjs';
  40. const { ProposalCreateContract, ProposalDeleteContract, ProposalApproveContract } = globalThis.TronWebProto;
  41. import '../protocol/core/contract/exchange_contract_pb.cjs';
  42. const { ExchangeCreateContract, ExchangeInjectContract, ExchangeWithdrawContract, ExchangeTransactionContract } =
  43. globalThis.TronWebProto;
  44. import { byteArray2hexStr } from './bytes.js';
  45. import { hexStr2byteArray } from './code.js';
  46. import { sha256, keccak256 } from './ethersUtils.js';
  47. import TronWeb from '../tronweb.js';
  48. import { isHex } from './validations.js';
  49. const fromHexString = (hexString: string) => {
  50. if (!hexString || hexString.length === 0) return new Uint8Array([]);
  51. return new Uint8Array(
  52. TronWeb.address
  53. .toHex(hexString)
  54. .match(/.{1,2}/g)
  55. .map((byte: string) => parseInt(byte, 16))
  56. );
  57. };
  58. const stringToUint8Array = (hexString: string) => {
  59. if (!hexString || hexString.length === 0) return new Uint8Array([]);
  60. return new Uint8Array(
  61. (isHex(hexString) ? hexString : TronWeb.toHex(hexString))
  62. .replace(/^0x/, '')
  63. .match(/.{1,2}/g)
  64. .map((byte: string) => parseInt(byte, 16))
  65. );
  66. };
  67. const flexToUint8Array = (str: string, visible: boolean) => {
  68. if (!visible) return stringToUint8Array(str.replace(/^0x/, ''));
  69. return stringToUint8Array(TronWeb.fromUtf8(str).replace(/^0x/, ''));
  70. };
  71. const sha3 = (string: string, prefix = true) => {
  72. return (prefix ? '0x' : '') + keccak256(Buffer.from(string, 'utf-8')).toString().substring(2);
  73. };
  74. const buildCommonTransaction = (message, contractType, typeName, permissionId) => {
  75. const anyValue = new google_protobuf_any_pb.Any();
  76. anyValue.pack(message.serializeBinary(), 'protocol.' + typeName);
  77. const contract = new Transaction.Contract();
  78. contract.setType(contractType);
  79. contract.setParameter(anyValue);
  80. if (permissionId) {
  81. contract.setPermissionId(permissionId);
  82. }
  83. const raw = new Transaction.raw();
  84. raw.addContract(contract);
  85. const transaction = new Transaction();
  86. transaction.setRawData(raw);
  87. return transaction;
  88. };
  89. // wallet/createtransaction for sendTrx
  90. const buildTransferContract = (value, options) => {
  91. const { to_address, owner_address, amount } = value;
  92. const transferContract = new TransferContract();
  93. transferContract.setToAddress(fromHexString(to_address));
  94. transferContract.setOwnerAddress(fromHexString(owner_address));
  95. transferContract.setAmount(amount);
  96. return buildCommonTransaction(
  97. transferContract,
  98. Transaction.Contract.ContractType.TRANSFERCONTRACT,
  99. 'TransferContract',
  100. options.Permission_id
  101. );
  102. };
  103. // wallet/transferasset for sendToken
  104. const buildTransferAssetContract = (value, options) => {
  105. const { to_address, owner_address, amount, asset_name } = value;
  106. const transferContract = new TransferAssetContract();
  107. transferContract.setToAddress(fromHexString(to_address));
  108. transferContract.setOwnerAddress(fromHexString(owner_address));
  109. transferContract.setAssetName(flexToUint8Array(asset_name, options.visible));
  110. transferContract.setAmount(amount);
  111. return buildCommonTransaction(
  112. transferContract,
  113. Transaction.Contract.ContractType.TRANSFERASSETCONTRACT,
  114. 'TransferAssetContract',
  115. options.Permission_id
  116. );
  117. };
  118. // wallet/participateassetissue for purchaseToken
  119. const buildParticipateAssetIssueContract = (value, options) => {
  120. const pbObj = new ParticipateAssetIssueContract();
  121. pbObj.setToAddress(fromHexString(value.to_address));
  122. pbObj.setOwnerAddress(fromHexString(value.owner_address));
  123. pbObj.setAssetName(flexToUint8Array(value.asset_name, options.visible));
  124. pbObj.setAmount(value.amount);
  125. return buildCommonTransaction(
  126. pbObj,
  127. Transaction.Contract.ContractType.PARTICIPATEASSETISSUECONTRACT,
  128. 'ParticipateAssetIssueContract',
  129. options.Permission_id
  130. );
  131. };
  132. const buildTriggerSmartContract = (value, options) => {
  133. const triggerSmartContract = new TriggerSmartContract();
  134. const {
  135. owner_address,
  136. contract_address,
  137. parameter = '',
  138. function_selector,
  139. call_value,
  140. call_token_value,
  141. token_id,
  142. data,
  143. } = value;
  144. triggerSmartContract.setOwnerAddress(fromHexString(owner_address));
  145. triggerSmartContract.setContractAddress(fromHexString(contract_address));
  146. triggerSmartContract.setCallValue(call_value);
  147. if (data) {
  148. triggerSmartContract.setData(stringToUint8Array(data));
  149. } else if (function_selector) {
  150. const contractData = sha3(function_selector).substring(2, 10) + parameter;
  151. triggerSmartContract.setData(stringToUint8Array(contractData));
  152. }
  153. if (token_id) {
  154. triggerSmartContract.setTokenId(token_id);
  155. }
  156. if (call_token_value) {
  157. triggerSmartContract.setCallTokenValue(call_token_value);
  158. }
  159. return buildCommonTransaction(
  160. triggerSmartContract,
  161. Transaction.Contract.ContractType.TRIGGERSMARTCONTRACT,
  162. 'TriggerSmartContract',
  163. options.Permission_id
  164. );
  165. };
  166. const buildFreezeBalanceContract = (value, options) => {
  167. const freezeBalanceContract = new FreezeBalanceContract();
  168. const { owner_address, frozen_balance, frozen_duration, resource, receiver_address } = value;
  169. freezeBalanceContract.setOwnerAddress(fromHexString(owner_address));
  170. freezeBalanceContract.setFrozenBalance(frozen_balance);
  171. freezeBalanceContract.setFrozenDuration(frozen_duration);
  172. if (resource) {
  173. freezeBalanceContract.setResource(ResourceCode[resource]);
  174. }
  175. if (receiver_address) {
  176. freezeBalanceContract.setReceiverAddress(fromHexString(receiver_address));
  177. }
  178. return buildCommonTransaction(
  179. freezeBalanceContract,
  180. Transaction.Contract.ContractType.FREEZEBALANCECONTRACT,
  181. 'FreezeBalanceContract',
  182. options.Permission_id
  183. );
  184. };
  185. const buildUnfreezeBalanceContract = (value, options) => {
  186. const unfreezeBalanceContract = new UnfreezeBalanceContract();
  187. const { owner_address, resource, receiver_address } = value;
  188. unfreezeBalanceContract.setOwnerAddress(fromHexString(owner_address));
  189. if (resource) {
  190. unfreezeBalanceContract.setResource(ResourceCode[resource]);
  191. }
  192. if (receiver_address) {
  193. unfreezeBalanceContract.setReceiverAddress(fromHexString(receiver_address));
  194. }
  195. return buildCommonTransaction(
  196. unfreezeBalanceContract,
  197. Transaction.Contract.ContractType.UNFREEZEBALANCECONTRACT,
  198. 'UnfreezeBalanceContract',
  199. options.Permission_id
  200. );
  201. };
  202. const buildWithdrawBalanceContract = (value, options) => {
  203. const withdrawbalanceContract = new WithdrawBalanceContract();
  204. const { owner_address } = value;
  205. withdrawbalanceContract.setOwnerAddress(fromHexString(owner_address));
  206. return buildCommonTransaction(
  207. withdrawbalanceContract,
  208. Transaction.Contract.ContractType.WITHDRAWBALANCECONTRACT,
  209. 'WithdrawBalanceContract',
  210. options.Permission_id
  211. );
  212. };
  213. const buildFreezeBalanceV2Contract = (value, options) => {
  214. const freezeBalanceV2Contract = new FreezeBalanceV2Contract();
  215. const { owner_address, frozen_balance, resource } = value;
  216. freezeBalanceV2Contract.setOwnerAddress(fromHexString(owner_address));
  217. freezeBalanceV2Contract.setFrozenBalance(frozen_balance);
  218. freezeBalanceV2Contract.setResource(ResourceCode[resource]);
  219. return buildCommonTransaction(
  220. freezeBalanceV2Contract,
  221. Transaction.Contract.ContractType.FREEZEBALANCEV2CONTRACT,
  222. 'FreezeBalanceV2Contract',
  223. options.Permission_id
  224. );
  225. };
  226. const buildCancelFreezeBalanceV2Contract = (value, options) => {
  227. const cancelAllUnfreezeV2Contract = new CancelAllUnfreezeV2Contract();
  228. const { owner_address } = value;
  229. cancelAllUnfreezeV2Contract.setOwnerAddress(fromHexString(owner_address));
  230. return buildCommonTransaction(
  231. cancelAllUnfreezeV2Contract,
  232. Transaction.Contract.ContractType.CANCELALLUNFREEZEV2CONTRACT,
  233. 'CancelAllUnfreezeV2Contract',
  234. options.Permission_id
  235. );
  236. };
  237. const buildUnfreezeBalanceV2Contract = (value, options) => {
  238. const unfreezeBalanceV2Contract = new UnfreezeBalanceV2Contract();
  239. const { owner_address, unfreeze_balance, resource } = value;
  240. unfreezeBalanceV2Contract.setOwnerAddress(fromHexString(owner_address));
  241. unfreezeBalanceV2Contract.setUnfreezeBalance(unfreeze_balance);
  242. unfreezeBalanceV2Contract.setResource(ResourceCode[resource]);
  243. return buildCommonTransaction(
  244. unfreezeBalanceV2Contract,
  245. Transaction.Contract.ContractType.UNFREEZEBALANCEV2CONTRACT,
  246. 'UnfreezeBalanceV2Contract',
  247. options.Permission_id
  248. );
  249. };
  250. const buildDelegateResourceContract = (value, options) => {
  251. const delegateResourceContract = new DelegateResourceContract();
  252. const { owner_address, receiver_address, balance, resource, lock = false, lock_period } = value;
  253. delegateResourceContract.setOwnerAddress(fromHexString(owner_address));
  254. delegateResourceContract.setBalance(balance);
  255. delegateResourceContract.setResource(ResourceCode[resource]);
  256. delegateResourceContract.setLock(lock);
  257. delegateResourceContract.setLockPeriod(lock_period);
  258. delegateResourceContract.setReceiverAddress(fromHexString(receiver_address));
  259. return buildCommonTransaction(
  260. delegateResourceContract,
  261. Transaction.Contract.ContractType.DELEGATERESOURCECONTRACT,
  262. 'DelegateResourceContract',
  263. options.Permission_id
  264. );
  265. };
  266. const buildUnDelegateResourceContract = (value, options) => {
  267. const unDelegateResourceContract = new UnDelegateResourceContract();
  268. const { owner_address, receiver_address, balance, resource } = value;
  269. unDelegateResourceContract.setOwnerAddress(fromHexString(owner_address));
  270. unDelegateResourceContract.setBalance(balance);
  271. unDelegateResourceContract.setResource(ResourceCode[resource]);
  272. unDelegateResourceContract.setReceiverAddress(fromHexString(receiver_address));
  273. return buildCommonTransaction(
  274. unDelegateResourceContract,
  275. Transaction.Contract.ContractType.UNDELEGATERESOURCECONTRACT,
  276. 'UnDelegateResourceContract',
  277. options.Permission_id
  278. );
  279. };
  280. const buildWithdrawExpireUnfreezeContract = (value, options) => {
  281. const withdrawExpireUnfreeze = new WithdrawExpireUnfreezeContract();
  282. const { owner_address } = value;
  283. withdrawExpireUnfreeze.setOwnerAddress(fromHexString(owner_address));
  284. return buildCommonTransaction(
  285. withdrawExpireUnfreeze,
  286. Transaction.Contract.ContractType.WITHDRAWEXPIREUNFREEZECONTRACT,
  287. 'WithdrawExpireUnfreezeContract',
  288. options.Permission_id
  289. );
  290. };
  291. // applyForSR
  292. const buildCreateWitness = (value, options) => {
  293. const createWitnessContract = new WitnessCreateContract();
  294. const { owner_address, url } = value;
  295. createWitnessContract.setOwnerAddress(fromHexString(owner_address));
  296. createWitnessContract.setUrl(stringToUint8Array(url.replace(/^0x/, '')));
  297. return buildCommonTransaction(
  298. createWitnessContract,
  299. Transaction.Contract.ContractType.WITNESSCREATECONTRACT,
  300. 'WitnessCreateContract',
  301. options.Permission_id
  302. );
  303. };
  304. // vote
  305. const buildVoteWitnessAccount = (value, options) => {
  306. const voteWitnessContract = new VoteWitnessContract();
  307. const { owner_address, votes } = value;
  308. voteWitnessContract.setOwnerAddress(fromHexString(owner_address));
  309. votes.forEach((voteItem) => {
  310. const vote = new VoteWitnessContract.Vote();
  311. const { vote_address, vote_count } = voteItem;
  312. vote.setVoteAddress(fromHexString(vote_address));
  313. const numberOfVotes = parseInt(vote_count);
  314. vote.setVoteCount(numberOfVotes);
  315. voteWitnessContract.addVotes(vote);
  316. });
  317. return buildCommonTransaction(
  318. voteWitnessContract,
  319. Transaction.Contract.ContractType.VOTEWITNESSCONTRACT,
  320. 'VoteWitnessContract',
  321. options.Permission_id
  322. );
  323. };
  324. const buildCreateSmartContract = (value, options) => {
  325. const params = value?.new_contract
  326. ? {
  327. ...{
  328. owner_address: value.owner_address,
  329. call_token_value: value.call_token_value,
  330. token_id: value.token_id,
  331. },
  332. ...value.new_contract,
  333. }
  334. : value;
  335. const {
  336. owner_address,
  337. consume_user_resource_percent,
  338. origin_energy_limit,
  339. abi,
  340. bytecode = '',
  341. parameter = '',
  342. call_value,
  343. call_token_value,
  344. token_id,
  345. name: contracName,
  346. } = params;
  347. let { origin_address } = params;
  348. const createSmartContract = new CreateSmartContract();
  349. createSmartContract.setOwnerAddress(fromHexString(owner_address));
  350. if (token_id) {
  351. createSmartContract.setTokenId(token_id);
  352. }
  353. if (call_token_value) {
  354. createSmartContract.setCallTokenValue(call_token_value);
  355. }
  356. const smartContractBuilder = new SmartContract();
  357. if (abi) {
  358. let abiJson;
  359. if (typeof abi === 'string') {
  360. abiJson = JSON.parse(abi);
  361. } else {
  362. abiJson = abi?.entrys || []; // abi could be an empty object if origin abi is `[]`;
  363. }
  364. const abiBuilder = new SmartContract.ABI();
  365. const buildEntryParam = (data) => {
  366. const param = new SmartContract.ABI.Entry.Param();
  367. const { indexed, name, type } = data;
  368. if (indexed === true) {
  369. param.setIndexed(true);
  370. }
  371. param.setName(name);
  372. param.setType(type);
  373. return param;
  374. };
  375. const entryBuilders = abiJson.map((entry) => {
  376. const { anonymous, constant, name, inputs, outputs, type, payable, stateMutability } = entry;
  377. const entryBuilder = new SmartContract.ABI.Entry();
  378. entryBuilder.setAnonymous(anonymous);
  379. entryBuilder.setConstant(constant);
  380. entryBuilder.setName(name);
  381. if (inputs) {
  382. entryBuilder.setInputsList(inputs.map((input) => buildEntryParam(input)));
  383. }
  384. if (outputs) {
  385. entryBuilder.setOutputsList(outputs.map((output) => buildEntryParam(output)));
  386. }
  387. if (type) {
  388. entryBuilder.setType(SmartContract.ABI.Entry.EntryType[type.toUpperCase()]);
  389. }
  390. entryBuilder.setPayable(payable);
  391. if (stateMutability) {
  392. entryBuilder.setStatemutability(SmartContract.ABI.Entry.StateMutabilityType[stateMutability.toUpperCase()]);
  393. }
  394. return entryBuilder;
  395. });
  396. abiBuilder.setEntrysList(entryBuilders);
  397. smartContractBuilder.setAbi(abiBuilder);
  398. }
  399. if (call_value) {
  400. smartContractBuilder.setCallValue(call_value);
  401. }
  402. smartContractBuilder.setConsumeUserResourcePercent(consume_user_resource_percent);
  403. smartContractBuilder.setOriginEnergyLimit(origin_energy_limit);
  404. if (!origin_address) {
  405. origin_address = owner_address;
  406. }
  407. smartContractBuilder.setOriginAddress(fromHexString(origin_address));
  408. if (bytecode) {
  409. const bytecodeParameter = bytecode.replace(/^0x/, '') + parameter.replace(/^0x/, '');
  410. smartContractBuilder.setBytecode(stringToUint8Array(bytecodeParameter));
  411. }
  412. smartContractBuilder.setName(contracName);
  413. createSmartContract.setNewContract(smartContractBuilder);
  414. return buildCommonTransaction(
  415. createSmartContract,
  416. Transaction.Contract.ContractType.CREATESMARTCONTRACT,
  417. 'CreateSmartContract',
  418. options.Permission_id
  419. );
  420. };
  421. const buildClearABIContract = (value, options) => {
  422. const { contract_address, owner_address } = value;
  423. const clearABIContract = new ClearABIContract();
  424. clearABIContract.setOwnerAddress(fromHexString(owner_address));
  425. clearABIContract.setContractAddress(fromHexString(contract_address));
  426. return buildCommonTransaction(
  427. clearABIContract,
  428. Transaction.Contract.ContractType.CLEARABICONTRACT,
  429. 'ClearABIContract',
  430. options.Permission_id
  431. );
  432. };
  433. // updateBrokerage
  434. const buildUpdateBrokerageContract = (value, options) => {
  435. const { brokerage, owner_address } = value;
  436. const updateBrokerageContract = new UpdateBrokerageContract();
  437. updateBrokerageContract.setOwnerAddress(fromHexString(owner_address));
  438. updateBrokerageContract.setBrokerage(brokerage);
  439. return buildCommonTransaction(
  440. updateBrokerageContract,
  441. Transaction.Contract.ContractType.UPDATEBROKERAGECONTRACT,
  442. 'UpdateBrokerageContract',
  443. options.Permission_id
  444. );
  445. };
  446. // createToken
  447. const buildAssetIssueContract = (value, options) => {
  448. const {
  449. owner_address,
  450. name,
  451. abbr,
  452. description,
  453. url,
  454. total_supply,
  455. trx_num,
  456. num,
  457. start_time,
  458. end_time,
  459. precision,
  460. free_asset_net_limit,
  461. public_free_asset_net_limit,
  462. public_free_asset_net_usage = 0,
  463. public_latest_free_net_time = 0,
  464. vote_score = 0,
  465. frozen_supply,
  466. } = value;
  467. const assetIssueContract = new AssetIssueContract();
  468. assetIssueContract.setOwnerAddress(fromHexString(owner_address));
  469. if (name) {
  470. assetIssueContract.setName(stringToUint8Array(name.replace(/^0x/, '')));
  471. }
  472. if (abbr) {
  473. assetIssueContract.setAbbr(stringToUint8Array(abbr.replace(/^0x/, '')));
  474. }
  475. assetIssueContract.setTotalSupply(total_supply);
  476. assetIssueContract.setNum(num);
  477. assetIssueContract.setEndTime(end_time);
  478. assetIssueContract.setStartTime(start_time);
  479. assetIssueContract.setTrxNum(trx_num);
  480. assetIssueContract.setVoteScore(vote_score);
  481. if (precision) {
  482. assetIssueContract.setPrecision(precision);
  483. }
  484. if (public_latest_free_net_time) {
  485. assetIssueContract.setPublicLatestFreeNetTime(public_latest_free_net_time);
  486. }
  487. if (description) {
  488. assetIssueContract.setDescription(stringToUint8Array(description.replace(/^0x/, '')));
  489. }
  490. if (url) {
  491. assetIssueContract.setUrl(stringToUint8Array(url.replace(/^0x/, '')));
  492. }
  493. assetIssueContract.setPublicFreeAssetNetUsage(public_free_asset_net_usage);
  494. assetIssueContract.setFreeAssetNetLimit(free_asset_net_limit);
  495. assetIssueContract.setPublicFreeAssetNetLimit(public_free_asset_net_limit);
  496. if (frozen_supply) {
  497. const frozenSupplyContract = new AssetIssueContract.FrozenSupply();
  498. frozenSupplyContract.setFrozenAmount(frozen_supply.length ? frozen_supply[0].frozen_amount : frozen_supply.frozen_amount);
  499. frozenSupplyContract.setFrozenDays(frozen_supply.length ? frozen_supply[0].frozen_days : frozen_supply.frozen_days);
  500. assetIssueContract.addFrozenSupply(frozenSupplyContract);
  501. }
  502. return buildCommonTransaction(
  503. assetIssueContract,
  504. Transaction.Contract.ContractType.ASSETISSUECONTRACT,
  505. 'AssetIssueContract',
  506. options.Permission_id
  507. );
  508. };
  509. //createAccount
  510. const buildAccountCreateContract = (value, options) => {
  511. const accountCreateContract = new AccountCreateContract();
  512. const { account_address, owner_address } = value;
  513. accountCreateContract.setOwnerAddress(fromHexString(owner_address));
  514. accountCreateContract.setAccountAddress(fromHexString(account_address.replace(/^0x/, '')));
  515. return buildCommonTransaction(
  516. accountCreateContract,
  517. Transaction.Contract.ContractType.ACCOUNTCREATECONTRACT,
  518. 'AccountCreateContract',
  519. options.Permission_id
  520. );
  521. };
  522. // updateAccount
  523. const buildAccountUpdateContract = (value, options) => {
  524. const accountUpdateContract = new AccountUpdateContract();
  525. const { account_name, owner_address } = value;
  526. accountUpdateContract.setOwnerAddress(fromHexString(owner_address));
  527. accountUpdateContract.setAccountName(stringToUint8Array(account_name.replace(/^0x/, '')));
  528. return buildCommonTransaction(
  529. accountUpdateContract,
  530. Transaction.Contract.ContractType.ACCOUNTUPDATECONTRACT,
  531. 'AccountUpdateContract',
  532. options.Permission_id
  533. );
  534. };
  535. // setAccountId
  536. const buildSetAccountIdContract = (value, options) => {
  537. const setAccountIdContract = new SetAccountIdContract();
  538. const { account_id, owner_address } = value;
  539. setAccountIdContract.setOwnerAddress(fromHexString(owner_address));
  540. setAccountIdContract.setAccountId(stringToUint8Array(account_id.replace(/^0x/, '')));
  541. return buildCommonTransaction(
  542. setAccountIdContract,
  543. Transaction.Contract.ContractType.SETACCOUNTIDCONTRACT,
  544. 'SetAccountIdContract',
  545. options.Permission_id
  546. );
  547. };
  548. const buildProposalCreateContract = (value, options) => {
  549. const proposalCreateContract = new ProposalCreateContract();
  550. const { owner_address, parameters } = value;
  551. proposalCreateContract.setOwnerAddress(fromHexString(owner_address));
  552. parameters.forEach((parameter) => {
  553. proposalCreateContract.getParametersMap().set(parameter.key, parameter.value);
  554. });
  555. return buildCommonTransaction(
  556. proposalCreateContract,
  557. Transaction.Contract.ContractType.PROPOSALCREATECONTRACT,
  558. 'ProposalCreateContract',
  559. options.Permission_id
  560. );
  561. };
  562. const buildProposalDeleteContract = (value, options) => {
  563. const proposalDeleteContract = new ProposalDeleteContract();
  564. const { owner_address, proposal_id } = value;
  565. proposalDeleteContract.setOwnerAddress(fromHexString(owner_address));
  566. proposalDeleteContract.setProposalId(proposal_id);
  567. return buildCommonTransaction(
  568. proposalDeleteContract,
  569. Transaction.Contract.ContractType.PROPOSALDELETECONTRACT,
  570. 'ProposalDeleteContract',
  571. options.Permission_id
  572. );
  573. };
  574. const buildVoteProposalContract = (value, options) => {
  575. const proposalVoteContract = new ProposalApproveContract();
  576. const { owner_address, proposal_id, is_add_approval } = value;
  577. proposalVoteContract.setOwnerAddress(fromHexString(owner_address));
  578. proposalVoteContract.setProposalId(proposal_id);
  579. proposalVoteContract.setIsAddApproval(is_add_approval);
  580. return buildCommonTransaction(
  581. proposalVoteContract,
  582. Transaction.Contract.ContractType.PROPOSALAPPROVECONTRACT,
  583. 'ProposalApproveContract',
  584. options.Permission_id
  585. );
  586. };
  587. const buildExchangeCreateContract = (value, options) => {
  588. const exchangeCreateContract = new ExchangeCreateContract();
  589. const { owner_address, first_token_id, first_token_balance, second_token_id, second_token_balance } = value;
  590. exchangeCreateContract.setOwnerAddress(fromHexString(owner_address));
  591. exchangeCreateContract.setFirstTokenId(flexToUint8Array(first_token_id, options.visible));
  592. exchangeCreateContract.setFirstTokenBalance(first_token_balance);
  593. exchangeCreateContract.setSecondTokenId(flexToUint8Array(second_token_id, options.visible));
  594. exchangeCreateContract.setSecondTokenBalance(second_token_balance);
  595. return buildCommonTransaction(
  596. exchangeCreateContract,
  597. Transaction.Contract.ContractType.EXCHANGECREATECONTRACT,
  598. 'ExchangeCreateContract',
  599. options.Permission_id
  600. );
  601. };
  602. const buildExchangeInjectContract = (value, options) => {
  603. const exchangeInjectContract = new ExchangeInjectContract();
  604. const { owner_address, exchange_id, token_id, quant } = value;
  605. exchangeInjectContract.setOwnerAddress(fromHexString(owner_address));
  606. exchangeInjectContract.setExchangeId(exchange_id);
  607. exchangeInjectContract.setTokenId(flexToUint8Array(token_id, options.visible));
  608. exchangeInjectContract.setQuant(quant);
  609. return buildCommonTransaction(
  610. exchangeInjectContract,
  611. Transaction.Contract.ContractType.EXCHANGEINJECTCONTRACT,
  612. 'ExchangeInjectContract',
  613. options.Permission_id
  614. );
  615. };
  616. const buildExchangeWithdrawContract = (value, options) => {
  617. const exchangeWithdrawContract = new ExchangeWithdrawContract();
  618. const { owner_address, exchange_id, token_id, quant } = value;
  619. exchangeWithdrawContract.setOwnerAddress(fromHexString(owner_address));
  620. exchangeWithdrawContract.setExchangeId(exchange_id);
  621. exchangeWithdrawContract.setTokenId(flexToUint8Array(token_id, options.visible));
  622. exchangeWithdrawContract.setQuant(quant);
  623. return buildCommonTransaction(
  624. exchangeWithdrawContract,
  625. Transaction.Contract.ContractType.EXCHANGEWITHDRAWCONTRACT,
  626. 'ExchangeWithdrawContract',
  627. options.Permission_id
  628. );
  629. };
  630. const buildExchangeTransactionContract = (value, options) => {
  631. const exchangeTransactionContract = new ExchangeTransactionContract();
  632. const { owner_address, exchange_id, token_id, quant, expected } = value;
  633. exchangeTransactionContract.setOwnerAddress(fromHexString(owner_address));
  634. exchangeTransactionContract.setExchangeId(exchange_id);
  635. exchangeTransactionContract.setTokenId(flexToUint8Array(token_id, options.visible));
  636. exchangeTransactionContract.setQuant(quant);
  637. exchangeTransactionContract.setExpected(expected);
  638. return buildCommonTransaction(
  639. exchangeTransactionContract,
  640. Transaction.Contract.ContractType.EXCHANGETRANSACTIONCONTRACT,
  641. 'ExchangeTransactionContract',
  642. options.Permission_id
  643. );
  644. };
  645. const buildUpdateSettingContract = (value, options) => {
  646. const updateSettingContract = new UpdateSettingContract();
  647. const { owner_address, contract_address, consume_user_resource_percent } = value;
  648. updateSettingContract.setOwnerAddress(fromHexString(owner_address));
  649. updateSettingContract.setContractAddress(fromHexString(contract_address));
  650. updateSettingContract.setConsumeUserResourcePercent(consume_user_resource_percent);
  651. return buildCommonTransaction(
  652. updateSettingContract,
  653. Transaction.Contract.ContractType.UPDATESETTINGCONTRACT,
  654. 'UpdateSettingContract',
  655. options.Permission_id
  656. );
  657. };
  658. const buildUpdateEnergyLimitContract = (value, options) => {
  659. const updateEnergyLimitContract = new UpdateEnergyLimitContract();
  660. const { owner_address, contract_address, origin_energy_limit } = value;
  661. updateEnergyLimitContract.setOwnerAddress(fromHexString(owner_address));
  662. updateEnergyLimitContract.setContractAddress(fromHexString(contract_address));
  663. updateEnergyLimitContract.setOriginEnergyLimit(origin_energy_limit);
  664. return buildCommonTransaction(
  665. updateEnergyLimitContract,
  666. Transaction.Contract.ContractType.UPDATEENERGYLIMITCONTRACT,
  667. 'UpdateEnergyLimitContract',
  668. options.Permission_id
  669. );
  670. };
  671. const buildAccountPermissionUpdateContract = (value, options) => {
  672. const accountPermissionUpdateContract = new AccountPermissionUpdateContract();
  673. const { owner_address, owner, witness, actives } = value;
  674. accountPermissionUpdateContract.setOwnerAddress(fromHexString(owner_address));
  675. const getType = (type) => {
  676. // no type when permission_name is owner
  677. if (isNaN(type)) return type === 'Active' ? 2 : type === 'Witness' ? 1 : 0;
  678. return type;
  679. };
  680. const buildPermission = (data) => {
  681. // no type when permission_name is owner
  682. const permission = new Permission();
  683. const { type, id, permission_name, threshold, parentId, operations, keys } = data;
  684. permission.setType(getType(type));
  685. permission.setId(id);
  686. permission.setPermissionName(permission_name);
  687. permission.setThreshold(threshold);
  688. if (parentId) {
  689. permission.setParentId(parentId);
  690. }
  691. if (operations) {
  692. permission.setOperations(stringToUint8Array(operations));
  693. }
  694. if (keys) {
  695. permission.setKeysList(
  696. keys.map((key) => {
  697. const keyBuilder = new Key();
  698. keyBuilder.setAddress(fromHexString(key.address));
  699. keyBuilder.setWeight(key.weight);
  700. return keyBuilder;
  701. })
  702. );
  703. }
  704. return permission;
  705. };
  706. if (owner) {
  707. accountPermissionUpdateContract.setOwner(buildPermission(owner));
  708. }
  709. if (witness) {
  710. accountPermissionUpdateContract.setWitness(buildPermission(witness));
  711. }
  712. if (actives) {
  713. if (Array.isArray(actives)) {
  714. accountPermissionUpdateContract.setActivesList(actives.map((active) => buildPermission(active)));
  715. } else {
  716. accountPermissionUpdateContract.setActivesList([buildPermission(actives)]);
  717. }
  718. }
  719. return buildCommonTransaction(
  720. accountPermissionUpdateContract,
  721. Transaction.Contract.ContractType.ACCOUNTPERMISSIONUPDATECONTRACT,
  722. 'AccountPermissionUpdateContract',
  723. options.Permission_id
  724. );
  725. };
  726. const buildUpdateAssetContract = (value, options) => {
  727. const updateAssetContract = new UpdateAssetContract();
  728. const { owner_address, description, url, new_limit, new_public_limit } = value;
  729. updateAssetContract.setOwnerAddress(fromHexString(owner_address));
  730. if (description) {
  731. updateAssetContract.setDescription(stringToUint8Array(description.replace(/^0x/, '')));
  732. }
  733. if (url) {
  734. updateAssetContract.setUrl(stringToUint8Array(url.replace(/^0x/, '')));
  735. }
  736. if (new_limit) {
  737. updateAssetContract.setNewLimit(new_limit);
  738. }
  739. if (new_public_limit) {
  740. updateAssetContract.setNewPublicLimit(new_public_limit);
  741. }
  742. return buildCommonTransaction(
  743. updateAssetContract,
  744. Transaction.Contract.ContractType.UPDATEASSETCONTRACT,
  745. 'UpdateAssetContract',
  746. options.Permission_id
  747. );
  748. };
  749. const contractJsonToProtobuf = (contract, value, options) => {
  750. switch (contract.type) {
  751. case 'TransferContract':
  752. return buildTransferContract(value, options);
  753. case 'TransferAssetContract':
  754. return buildTransferAssetContract(value, options);
  755. case 'ParticipateAssetIssueContract':
  756. return buildParticipateAssetIssueContract(value, options);
  757. case 'TriggerSmartContract':
  758. return buildTriggerSmartContract(value, options);
  759. case 'FreezeBalanceContract':
  760. return buildFreezeBalanceContract(value, options);
  761. case 'UnfreezeBalanceContract':
  762. return buildUnfreezeBalanceContract(value, options);
  763. case 'WithdrawBalanceContract':
  764. return buildWithdrawBalanceContract(value, options);
  765. case 'FreezeBalanceV2Contract':
  766. return buildFreezeBalanceV2Contract(value, options);
  767. case 'CancelAllUnfreezeV2Contract':
  768. return buildCancelFreezeBalanceV2Contract(value, options);
  769. case 'UnfreezeBalanceV2Contract':
  770. return buildUnfreezeBalanceV2Contract(value, options);
  771. case 'DelegateResourceContract':
  772. return buildDelegateResourceContract(value, options);
  773. case 'UnDelegateResourceContract':
  774. return buildUnDelegateResourceContract(value, options);
  775. case 'WithdrawExpireUnfreezeContract':
  776. return buildWithdrawExpireUnfreezeContract(value, options);
  777. case 'WitnessCreateContract':
  778. return buildCreateWitness(value, options);
  779. case 'VoteWitnessContract':
  780. return buildVoteWitnessAccount(value, options);
  781. case 'CreateSmartContract':
  782. return buildCreateSmartContract(value, options);
  783. case 'ClearABIContract':
  784. return buildClearABIContract(value, options);
  785. case 'UpdateBrokerageContract':
  786. return buildUpdateBrokerageContract(value, options);
  787. case 'AssetIssueContract':
  788. return buildAssetIssueContract(value, options);
  789. case 'AccountCreateContract':
  790. return buildAccountCreateContract(value, options);
  791. case 'AccountUpdateContract':
  792. return buildAccountUpdateContract(value, options);
  793. case 'SetAccountIdContract':
  794. return buildSetAccountIdContract(value, options);
  795. case 'ProposalCreateContract':
  796. return buildProposalCreateContract(value, options);
  797. case 'ProposalDeleteContract':
  798. return buildProposalDeleteContract(value, options);
  799. case 'ProposalApproveContract':
  800. return buildVoteProposalContract(value, options);
  801. case 'ExchangeCreateContract':
  802. return buildExchangeCreateContract(value, options);
  803. case 'ExchangeInjectContract':
  804. return buildExchangeInjectContract(value, options);
  805. case 'ExchangeWithdrawContract':
  806. return buildExchangeWithdrawContract(value, options);
  807. case 'ExchangeTransactionContract':
  808. return buildExchangeTransactionContract(value, options);
  809. case 'UpdateSettingContract':
  810. return buildUpdateSettingContract(value, options);
  811. case 'UpdateEnergyLimitContract':
  812. return buildUpdateEnergyLimitContract(value, options);
  813. case 'AccountPermissionUpdateContract':
  814. return buildAccountPermissionUpdateContract(value, options);
  815. case 'UpdateAssetContract':
  816. return buildUpdateAssetContract(value, options);
  817. }
  818. };
  819. const txJsonToPb = (transaction) => {
  820. const rawData = transaction['raw_data'];
  821. const contractJson = rawData.contract[0];
  822. const data = contractJson.parameter.value;
  823. const options = { Permission_id: contractJson.Permission_id, visible: transaction.visible };
  824. const transactionObj = contractJsonToProtobuf(contractJson, data, options) as any;
  825. const rawDataObj = transactionObj.getRawData();
  826. rawDataObj.setRefBlockBytes(stringToUint8Array(rawData.ref_block_bytes));
  827. rawDataObj.setRefBlockHash(stringToUint8Array(rawData.ref_block_hash));
  828. if (rawData.data) {
  829. rawDataObj.setData(stringToUint8Array(rawData.data));
  830. }
  831. if (rawData.fee_limit) {
  832. rawDataObj.setFeeLimit(rawData.fee_limit);
  833. }
  834. if (rawData.expiration) {
  835. rawDataObj.setExpiration(rawData.expiration);
  836. }
  837. if (rawData.timestamp) {
  838. rawDataObj.setTimestamp(rawData.timestamp);
  839. }
  840. transactionObj.setRawData(rawDataObj);
  841. return transactionObj;
  842. };
  843. const txJsonToPbWithArgs = (transaction, args: any = {}, options: any = {}) => {
  844. const rawData = transaction['raw_data'];
  845. const contractJson = rawData.contract[0];
  846. const transactionObj = contractJsonToProtobuf(contractJson, args, {
  847. Permission_id: args?.Permission_id,
  848. }) as any;
  849. const rawDataObj = transactionObj.getRawData();
  850. rawDataObj.setRefBlockBytes(stringToUint8Array(rawData.ref_block_bytes));
  851. rawDataObj.setRefBlockHash(stringToUint8Array(rawData.ref_block_hash));
  852. // for memo
  853. if (options.data) {
  854. rawDataObj.setData(stringToUint8Array(options.data.replace(/^0x/, '')));
  855. }
  856. if (options.fee_limit || args.fee_limit) {
  857. rawDataObj.setFeeLimit(options.fee_limit || args.fee_limit);
  858. }
  859. if (rawData.expiration) {
  860. rawDataObj.setExpiration(rawData.expiration);
  861. }
  862. if (rawData.timestamp) {
  863. rawDataObj.setTimestamp(rawData.timestamp);
  864. }
  865. transactionObj.setRawData(rawDataObj);
  866. return transactionObj;
  867. };
  868. const compareTransaction = (transaction, transactionPb) => {
  869. const rawDataBytes = transactionPb.getRawData().serializeBinary();
  870. const rawDataHex = byteArray2hexStr(rawDataBytes);
  871. const txID = sha256(rawDataBytes);
  872. return (
  873. rawDataHex.toLowerCase() === transaction.raw_data_hex.toLowerCase() &&
  874. txID.replace(/^0x/, '').toLowerCase() === transaction.txID.replace(/^0x/, '').toLowerCase()
  875. );
  876. };
  877. const txPbToRawDataHex = (pb) => {
  878. return byteArray2hexStr(pb.getRawData().serializeBinary());
  879. };
  880. const txCheck = (transaction) => {
  881. const transactionPb = txJsonToPb(transaction);
  882. return compareTransaction(transaction, transactionPb);
  883. };
  884. const txCheckWithArgs = (transaction, args, options) => {
  885. const transactionPb = txJsonToPbWithArgs(transaction, args, options);
  886. return compareTransaction(transaction, transactionPb);
  887. };
  888. const txPbToTxID = (transactionPb) => {
  889. const rawDataBytes = transactionPb.getRawData().serializeBinary();
  890. const txID = sha256(rawDataBytes);
  891. return txID;
  892. };
  893. const ContractTypeMap = {
  894. '0': 'AccountCreateContract',
  895. '1': 'TransferContract',
  896. '2': 'TransferAssetContract',
  897. '4': 'VoteWitnessContract',
  898. '5': 'WitnessCreateContract',
  899. '6': 'AssetIssueContract',
  900. '9': 'ParticipateAssetIssueContract',
  901. '10': 'AccountUpdateContract',
  902. '11': 'FreezeBalanceContract',
  903. '12': 'UnfreezeBalanceContract',
  904. '13': 'WithdrawBalanceContract',
  905. '15': 'UpdateAssetContract',
  906. '16': 'ProposalCreateContract',
  907. '17': 'ProposalApproveContract',
  908. '18': 'ProposalDeleteContract',
  909. '19': 'SetAccountIdContract',
  910. '30': 'CreateSmartContract',
  911. '31': 'TriggerSmartContract',
  912. '33': 'UpdateSettingContract',
  913. '41': 'ExchangeCreateContract',
  914. '42': 'ExchangeInjectContract',
  915. '43': 'ExchangeWithdrawContract',
  916. '44': 'ExchangeTransactionContract',
  917. '45': 'UpdateEnergyLimitContract',
  918. '46': 'AccountPermissionUpdateContract',
  919. '48': 'ClearABIContract',
  920. '49': 'UpdateBrokerageContract',
  921. '54': 'FreezeBalanceV2Contract',
  922. '55': 'UnfreezeBalanceV2Contract',
  923. '56': 'WithdrawExpireUnfreezeContract',
  924. '57': 'DelegateResourceContract',
  925. '58': 'UnDelegateResourceContract',
  926. '59': 'CancelAllUnfreezeV2Contract',
  927. };
  928. const getAuthsList = (pb) => {
  929. const authsList = pb.getAuthsList();
  930. return authsList.map((authPb) => {
  931. const permission_name = byteArray2hexStr(authPb.getPermissionName_asU8());
  932. const accountPb = authPb.getAccount();
  933. const account = {
  934. name: byteArray2hexStr(accountPb.getName_asU8()),
  935. address: byteArray2hexStr(accountPb.getAddress_asU8()),
  936. };
  937. return {
  938. permission_name,
  939. account,
  940. };
  941. });
  942. }
  943. const DCommonData = (type: string, rawDataHex: string) => {
  944. const pb = Transaction.raw.deserializeBinary(hexStr2byteArray(rawDataHex));
  945. const contract = pb.getContractList()[0];
  946. const valuePb = contract.getParameter().getValue();
  947. const contractType = ContractTypeMap[contract.getType()];
  948. if (type !== contractType) {
  949. throw new Error(`type ${type} dismatches with rawDataHex type ${contractType}`);
  950. }
  951. return [
  952. {
  953. contract: [
  954. {
  955. parameter: {
  956. value: {},
  957. type_url: contract.getParameter().getTypeUrl(),
  958. },
  959. type,
  960. Permission_id: contract.getPermissionId(),
  961. },
  962. ],
  963. data: byteArray2hexStr(pb.getData()),
  964. fee_limit: pb.getFeeLimit(),
  965. ref_block_bytes: byteArray2hexStr(pb.getRefBlockBytes_asU8()),
  966. ref_block_hash: byteArray2hexStr(pb.getRefBlockHash_asU8()),
  967. expiration: pb.getExpiration(),
  968. timestamp: pb.getTimestamp(),
  969. scripts: byteArray2hexStr(pb.getScripts_asU8()),
  970. auths: getAuthsList(pb),
  971. },
  972. valuePb,
  973. ];
  974. };
  975. const DTriggerSmartContract = (type, rawDataHex) => {
  976. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  977. const triggerSmartContract = TriggerSmartContract.deserializeBinary(valuePb);
  978. commonData.contract[0].parameter.value = {
  979. owner_address: byteArray2hexStr(triggerSmartContract.getOwnerAddress_asU8()),
  980. contract_address: byteArray2hexStr(triggerSmartContract.getContractAddress_asU8()),
  981. call_value: triggerSmartContract.getCallValue(),
  982. data: byteArray2hexStr(triggerSmartContract.getData_asU8()),
  983. call_token_value: triggerSmartContract.getCallTokenValue(),
  984. token_id: triggerSmartContract.getTokenId(),
  985. };
  986. return commonData;
  987. };
  988. const getResourceName = (type) => {
  989. switch (type) {
  990. case 0:
  991. return 'BANDWIDTH';
  992. case 1:
  993. return 'ENERGY';
  994. default:
  995. return 'BANDWIDTH';
  996. }
  997. };
  998. const DFreezeBalanceV2Contract = (type, rawDataHex) => {
  999. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  1000. const freezeBalanceV2Contract = FreezeBalanceV2Contract.deserializeBinary(valuePb);
  1001. commonData.contract[0].parameter.value = {
  1002. owner_address: byteArray2hexStr(freezeBalanceV2Contract.getOwnerAddress_asU8()),
  1003. frozen_balance: freezeBalanceV2Contract.getFrozenBalance(),
  1004. resource: getResourceName(freezeBalanceV2Contract.getResource()),
  1005. };
  1006. return commonData;
  1007. };
  1008. const DUnfreezeBalanceV2Contract = (type, rawDataHex) => {
  1009. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  1010. const unfreezeBalanceV2Contract = UnfreezeBalanceV2Contract.deserializeBinary(valuePb);
  1011. commonData.contract[0].parameter.value = {
  1012. owner_address: byteArray2hexStr(unfreezeBalanceV2Contract.getOwnerAddress_asU8()),
  1013. unfreeze_balance: unfreezeBalanceV2Contract.getUnfreezeBalance(),
  1014. resource: getResourceName(unfreezeBalanceV2Contract.getResource()),
  1015. };
  1016. return commonData;
  1017. };
  1018. const DCancelAllUnfreezeV2Contract = (type, rawDataHex) => {
  1019. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  1020. const cancelAllUnfreezeV2Contract = CancelAllUnfreezeV2Contract.deserializeBinary(valuePb);
  1021. commonData.contract[0].parameter.value = {
  1022. owner_address: byteArray2hexStr(cancelAllUnfreezeV2Contract.getOwnerAddress_asU8()),
  1023. };
  1024. return commonData;
  1025. };
  1026. const DDelegateResourceContract = (type, rawDataHex) => {
  1027. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  1028. const delegateResourceContract = DelegateResourceContract.deserializeBinary(valuePb);
  1029. commonData.contract[0].parameter.value = {
  1030. owner_address: byteArray2hexStr(delegateResourceContract.getOwnerAddress_asU8()),
  1031. balance: delegateResourceContract.getBalance(),
  1032. lock: delegateResourceContract.getLock(),
  1033. lock_period: delegateResourceContract.getLockPeriod(),
  1034. receiver_address: byteArray2hexStr(delegateResourceContract.getReceiverAddress_asU8()),
  1035. resource: getResourceName(delegateResourceContract.getResource())
  1036. };
  1037. return commonData;
  1038. };
  1039. const DUnDelegateResourceContract = (type, rawDataHex) => {
  1040. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  1041. const undelegateResourceContract = UnDelegateResourceContract.deserializeBinary(valuePb);
  1042. commonData.contract[0].parameter.value = {
  1043. owner_address: byteArray2hexStr(undelegateResourceContract.getOwnerAddress_asU8()),
  1044. balance: undelegateResourceContract.getBalance(),
  1045. receiver_address: byteArray2hexStr(undelegateResourceContract.getReceiverAddress_asU8()),
  1046. resource: getResourceName(undelegateResourceContract.getResource()),
  1047. };
  1048. return commonData;
  1049. };
  1050. const DWithdrawExpireUnfreezeContract = (type, rawDataHex) => {
  1051. const [commonData, valuePb] = DCommonData(type, rawDataHex);
  1052. const withdrawExpireUnfreezeContract = WithdrawExpireUnfreezeContract.deserializeBinary(valuePb);
  1053. commonData.contract[0].parameter.value = {
  1054. owner_address: byteArray2hexStr(withdrawExpireUnfreezeContract.getOwnerAddress_asU8()),
  1055. };
  1056. return commonData;
  1057. };
  1058. const DeserializeTransaction = (type: string, rawDataHex: string) => {
  1059. if (!rawDataHex) {
  1060. throw new Error('rawDataHex cannot be empty');
  1061. }
  1062. if (!isHex(rawDataHex)) {
  1063. throw new Error('rawDataHex is not a valid hex string');
  1064. }
  1065. switch (type) {
  1066. case 'TriggerSmartContract':
  1067. return DTriggerSmartContract(type, rawDataHex);
  1068. case 'FreezeBalanceV2Contract':
  1069. return DFreezeBalanceV2Contract(type, rawDataHex);
  1070. case 'UnfreezeBalanceV2Contract':
  1071. return DUnfreezeBalanceV2Contract(type, rawDataHex);
  1072. case 'CancelAllUnfreezeV2Contract':
  1073. return DCancelAllUnfreezeV2Contract(type, rawDataHex);
  1074. case 'DelegateResourceContract':
  1075. return DDelegateResourceContract(type, rawDataHex);
  1076. case 'UnDelegateResourceContract':
  1077. return DUnDelegateResourceContract(type, rawDataHex);
  1078. case 'WithdrawExpireUnfreezeContract':
  1079. return DWithdrawExpireUnfreezeContract(type, rawDataHex);
  1080. default:
  1081. throw new Error(`trasaction ${type} not supported`);
  1082. }
  1083. }
  1084. export { txJsonToPb, txPbToTxID, txPbToRawDataHex, txJsonToPbWithArgs, txCheckWithArgs, txCheck,
  1085. DeserializeTransaction };