transaction.js 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.txCheck = exports.txCheckWithArgs = exports.txJsonToPbWithArgs = exports.txPbToRawDataHex = exports.txPbToTxID = exports.txJsonToPb = void 0;
  4. const tslib_1 = require("tslib");
  5. // eslint-disable-next-line @typescript-eslint/ban-ts-comment
  6. // @ts-nocheck
  7. const any_pb_js_1 = tslib_1.__importDefault(require("google-protobuf/google/protobuf/any_pb.js"));
  8. require("../protocol/core/Tron_pb.cjs");
  9. const { Transaction, Permission, Key } = globalThis.TronWebProto;
  10. require("../protocol/core/contract/balance_contract_pb.cjs");
  11. const { TransferContract, FreezeBalanceContract, UnfreezeBalanceContract, WithdrawBalanceContract, FreezeBalanceV2Contract, UnfreezeBalanceV2Contract, CancelAllUnfreezeV2Contract, WithdrawExpireUnfreezeContract, DelegateResourceContract, UnDelegateResourceContract, } = globalThis.TronWebProto;
  12. require("../protocol/core/contract/asset_issue_contract_pb.cjs");
  13. const { TransferAssetContract, ParticipateAssetIssueContract, AssetIssueContract, UpdateAssetContract } = globalThis.TronWebProto;
  14. require("../protocol/core/contract/smart_contract_pb.cjs");
  15. const { TriggerSmartContract, ClearABIContract, UpdateEnergyLimitContract, UpdateSettingContract, CreateSmartContract, SmartContract, } = globalThis.TronWebProto;
  16. require("../protocol/core/contract/common_pb.cjs");
  17. const { ResourceCode } = globalThis.TronWebProto;
  18. require("../protocol/core/contract/witness_contract_pb.cjs");
  19. const { WitnessCreateContract, VoteWitnessContract } = globalThis.TronWebProto;
  20. require("../protocol/core/contract/storage_contract_pb.cjs");
  21. const { UpdateBrokerageContract } = globalThis.TronWebProto;
  22. require("../protocol/core/contract/account_contract_pb.cjs");
  23. const { AccountCreateContract, AccountUpdateContract, SetAccountIdContract, AccountPermissionUpdateContract } = globalThis.TronWebProto;
  24. require("../protocol/core/contract/proposal_contract_pb.cjs");
  25. const { ProposalCreateContract, ProposalDeleteContract, ProposalApproveContract } = globalThis.TronWebProto;
  26. require("../protocol/core/contract/exchange_contract_pb.cjs");
  27. const { ExchangeCreateContract, ExchangeInjectContract, ExchangeWithdrawContract, ExchangeTransactionContract } = globalThis.TronWebProto;
  28. const bytes_js_1 = require("./bytes.js");
  29. const ethersUtils_js_1 = require("./ethersUtils.js");
  30. const tronweb_js_1 = tslib_1.__importDefault(require("../tronweb.js"));
  31. const validations_js_1 = require("./validations.js");
  32. const fromHexString = (hexString) => {
  33. if (!hexString || hexString.length === 0)
  34. return new Uint8Array([]);
  35. return new Uint8Array(tronweb_js_1.default.address
  36. .toHex(hexString)
  37. .match(/.{1,2}/g)
  38. .map((byte) => parseInt(byte, 16)));
  39. };
  40. const stringToUint8Array = (hexString) => {
  41. if (!hexString || hexString.length === 0)
  42. return new Uint8Array([]);
  43. return new Uint8Array(((0, validations_js_1.isHex)(hexString) ? hexString : tronweb_js_1.default.toHex(hexString))
  44. .replace(/^0x/, '')
  45. .match(/.{1,2}/g)
  46. .map((byte) => parseInt(byte, 16)));
  47. };
  48. const flexToUint8Array = (str, visible) => {
  49. if (!visible)
  50. return stringToUint8Array(str.replace(/^0x/, ''));
  51. return stringToUint8Array(tronweb_js_1.default.fromUtf8(str).replace(/^0x/, ''));
  52. };
  53. const sha3 = (string, prefix = true) => {
  54. return (prefix ? '0x' : '') + (0, ethersUtils_js_1.keccak256)(Buffer.from(string, 'utf-8')).toString().substring(2);
  55. };
  56. const buildCommonTransaction = (message, contractType, typeName, permissionId) => {
  57. const anyValue = new any_pb_js_1.default.Any();
  58. anyValue.pack(message.serializeBinary(), 'protocol.' + typeName);
  59. const contract = new Transaction.Contract();
  60. contract.setType(contractType);
  61. contract.setParameter(anyValue);
  62. if (permissionId) {
  63. contract.setPermissionId(permissionId);
  64. }
  65. const raw = new Transaction.raw();
  66. raw.addContract(contract);
  67. const transaction = new Transaction();
  68. transaction.setRawData(raw);
  69. return transaction;
  70. };
  71. // wallet/createtransaction for sendTrx
  72. const buildTransferContract = (value, options) => {
  73. const { to_address, owner_address, amount } = value;
  74. const transferContract = new TransferContract();
  75. transferContract.setToAddress(fromHexString(to_address));
  76. transferContract.setOwnerAddress(fromHexString(owner_address));
  77. transferContract.setAmount(amount);
  78. return buildCommonTransaction(transferContract, Transaction.Contract.ContractType.TRANSFERCONTRACT, 'TransferContract', options.Permission_id);
  79. };
  80. // wallet/transferasset for sendToken
  81. const buildTransferAssetContract = (value, options) => {
  82. const { to_address, owner_address, amount, asset_name } = value;
  83. const transferContract = new TransferAssetContract();
  84. transferContract.setToAddress(fromHexString(to_address));
  85. transferContract.setOwnerAddress(fromHexString(owner_address));
  86. transferContract.setAssetName(flexToUint8Array(asset_name, options.visible));
  87. transferContract.setAmount(amount);
  88. return buildCommonTransaction(transferContract, Transaction.Contract.ContractType.TRANSFERASSETCONTRACT, 'TransferAssetContract', options.Permission_id);
  89. };
  90. // wallet/participateassetissue for purchaseToken
  91. const buildParticipateAssetIssueContract = (value, options) => {
  92. const pbObj = new ParticipateAssetIssueContract();
  93. pbObj.setToAddress(fromHexString(value.to_address));
  94. pbObj.setOwnerAddress(fromHexString(value.owner_address));
  95. pbObj.setAssetName(flexToUint8Array(value.asset_name, options.visible));
  96. pbObj.setAmount(value.amount);
  97. return buildCommonTransaction(pbObj, Transaction.Contract.ContractType.PARTICIPATEASSETISSUECONTRACT, 'ParticipateAssetIssueContract', options.Permission_id);
  98. };
  99. const buildTriggerSmartContract = (value, options) => {
  100. const triggerSmartContract = new TriggerSmartContract();
  101. const { owner_address, contract_address, parameter = '', function_selector, call_value, call_token_value, token_id, data, } = value;
  102. triggerSmartContract.setOwnerAddress(fromHexString(owner_address));
  103. triggerSmartContract.setContractAddress(fromHexString(contract_address));
  104. triggerSmartContract.setCallValue(call_value);
  105. if (data) {
  106. triggerSmartContract.setData(stringToUint8Array(data));
  107. }
  108. else if (function_selector) {
  109. const contractData = sha3(function_selector).substring(2, 10) + parameter;
  110. triggerSmartContract.setData(stringToUint8Array(contractData));
  111. }
  112. if (token_id) {
  113. triggerSmartContract.setTokenId(token_id);
  114. }
  115. if (call_token_value) {
  116. triggerSmartContract.setCallTokenValue(call_token_value);
  117. }
  118. return buildCommonTransaction(triggerSmartContract, Transaction.Contract.ContractType.TRIGGERSMARTCONTRACT, 'TriggerSmartContract', options.Permission_id);
  119. };
  120. const buildFreezeBalanceContract = (value, options) => {
  121. const freezeBalanceContract = new FreezeBalanceContract();
  122. const { owner_address, frozen_balance, frozen_duration, resource, receiver_address } = value;
  123. freezeBalanceContract.setOwnerAddress(fromHexString(owner_address));
  124. freezeBalanceContract.setFrozenBalance(frozen_balance);
  125. freezeBalanceContract.setFrozenDuration(frozen_duration);
  126. if (resource) {
  127. freezeBalanceContract.setResource(ResourceCode[resource]);
  128. }
  129. if (receiver_address) {
  130. freezeBalanceContract.setReceiverAddress(fromHexString(receiver_address));
  131. }
  132. return buildCommonTransaction(freezeBalanceContract, Transaction.Contract.ContractType.FREEZEBALANCECONTRACT, 'FreezeBalanceContract', options.Permission_id);
  133. };
  134. const buildUnfreezeBalanceContract = (value, options) => {
  135. const unfreezeBalanceContract = new UnfreezeBalanceContract();
  136. const { owner_address, resource, receiver_address } = value;
  137. unfreezeBalanceContract.setOwnerAddress(fromHexString(owner_address));
  138. if (resource) {
  139. unfreezeBalanceContract.setResource(ResourceCode[resource]);
  140. }
  141. if (receiver_address) {
  142. unfreezeBalanceContract.setReceiverAddress(fromHexString(receiver_address));
  143. }
  144. return buildCommonTransaction(unfreezeBalanceContract, Transaction.Contract.ContractType.UNFREEZEBALANCECONTRACT, 'UnfreezeBalanceContract', options.Permission_id);
  145. };
  146. const buildWithdrawBalanceContract = (value, options) => {
  147. const withdrawbalanceContract = new WithdrawBalanceContract();
  148. const { owner_address } = value;
  149. withdrawbalanceContract.setOwnerAddress(fromHexString(owner_address));
  150. return buildCommonTransaction(withdrawbalanceContract, Transaction.Contract.ContractType.WITHDRAWBALANCECONTRACT, 'WithdrawBalanceContract', options.Permission_id);
  151. };
  152. const buildFreezeBalanceV2Contract = (value, options) => {
  153. const freezeBalanceV2Contract = new FreezeBalanceV2Contract();
  154. const { owner_address, frozen_balance, resource } = value;
  155. freezeBalanceV2Contract.setOwnerAddress(fromHexString(owner_address));
  156. freezeBalanceV2Contract.setFrozenBalance(frozen_balance);
  157. freezeBalanceV2Contract.setResource(ResourceCode[resource]);
  158. return buildCommonTransaction(freezeBalanceV2Contract, Transaction.Contract.ContractType.FREEZEBALANCEV2CONTRACT, 'FreezeBalanceV2Contract', options.Permission_id);
  159. };
  160. const buildCancelFreezeBalanceV2Contract = (value, options) => {
  161. const cancelAllUnfreezeV2Contract = new CancelAllUnfreezeV2Contract();
  162. const { owner_address } = value;
  163. cancelAllUnfreezeV2Contract.setOwnerAddress(fromHexString(owner_address));
  164. return buildCommonTransaction(cancelAllUnfreezeV2Contract, Transaction.Contract.ContractType.CANCELALLUNFREEZEV2CONTRACT, 'CancelAllUnfreezeV2Contract', options.Permission_id);
  165. };
  166. const buildUnfreezeBalanceV2Contract = (value, options) => {
  167. const unfreezeBalanceV2Contract = new UnfreezeBalanceV2Contract();
  168. const { owner_address, unfreeze_balance, resource } = value;
  169. unfreezeBalanceV2Contract.setOwnerAddress(fromHexString(owner_address));
  170. unfreezeBalanceV2Contract.setUnfreezeBalance(unfreeze_balance);
  171. unfreezeBalanceV2Contract.setResource(ResourceCode[resource]);
  172. return buildCommonTransaction(unfreezeBalanceV2Contract, Transaction.Contract.ContractType.UNFREEZEBALANCEV2CONTRACT, 'UnfreezeBalanceV2Contract', options.Permission_id);
  173. };
  174. const buildDelegateResourceContract = (value, options) => {
  175. const delegateResourceContract = new DelegateResourceContract();
  176. const { owner_address, receiver_address, balance, resource, lock = false, lock_period } = value;
  177. delegateResourceContract.setOwnerAddress(fromHexString(owner_address));
  178. delegateResourceContract.setBalance(balance);
  179. delegateResourceContract.setResource(ResourceCode[resource]);
  180. delegateResourceContract.setLock(lock);
  181. delegateResourceContract.setLockPeriod(lock_period);
  182. delegateResourceContract.setReceiverAddress(fromHexString(receiver_address));
  183. return buildCommonTransaction(delegateResourceContract, Transaction.Contract.ContractType.DELEGATERESOURCECONTRACT, 'DelegateResourceContract', options.Permission_id);
  184. };
  185. const buildUnDelegateResourceContract = (value, options) => {
  186. const unDelegateResourceContract = new UnDelegateResourceContract();
  187. const { owner_address, receiver_address, balance, resource } = value;
  188. unDelegateResourceContract.setOwnerAddress(fromHexString(owner_address));
  189. unDelegateResourceContract.setBalance(balance);
  190. unDelegateResourceContract.setResource(ResourceCode[resource]);
  191. unDelegateResourceContract.setReceiverAddress(fromHexString(receiver_address));
  192. return buildCommonTransaction(unDelegateResourceContract, Transaction.Contract.ContractType.UNDELEGATERESOURCECONTRACT, 'UnDelegateResourceContract', options.Permission_id);
  193. };
  194. const buildWithdrawExpireUnfreezeContract = (value, options) => {
  195. const withdrawExpireUnfreeze = new WithdrawExpireUnfreezeContract();
  196. const { owner_address } = value;
  197. withdrawExpireUnfreeze.setOwnerAddress(fromHexString(owner_address));
  198. return buildCommonTransaction(withdrawExpireUnfreeze, Transaction.Contract.ContractType.WITHDRAWEXPIREUNFREEZECONTRACT, 'WithdrawExpireUnfreezeContract', options.Permission_id);
  199. };
  200. // applyForSR
  201. const buildCreateWitness = (value, options) => {
  202. const createWitnessContract = new WitnessCreateContract();
  203. const { owner_address, url } = value;
  204. createWitnessContract.setOwnerAddress(fromHexString(owner_address));
  205. createWitnessContract.setUrl(stringToUint8Array(url.replace(/^0x/, '')));
  206. return buildCommonTransaction(createWitnessContract, Transaction.Contract.ContractType.WITNESSCREATECONTRACT, 'WitnessCreateContract', options.Permission_id);
  207. };
  208. // vote
  209. const buildVoteWitnessAccount = (value, options) => {
  210. const voteWitnessContract = new VoteWitnessContract();
  211. const { owner_address, votes } = value;
  212. voteWitnessContract.setOwnerAddress(fromHexString(owner_address));
  213. votes.forEach((voteItem) => {
  214. const vote = new VoteWitnessContract.Vote();
  215. const { vote_address, vote_count } = voteItem;
  216. vote.setVoteAddress(fromHexString(vote_address));
  217. const numberOfVotes = parseInt(vote_count);
  218. vote.setVoteCount(numberOfVotes);
  219. voteWitnessContract.addVotes(vote);
  220. });
  221. return buildCommonTransaction(voteWitnessContract, Transaction.Contract.ContractType.VOTEWITNESSCONTRACT, 'VoteWitnessContract', options.Permission_id);
  222. };
  223. const buildCreateSmartContract = (value, options) => {
  224. const params = value?.new_contract
  225. ? {
  226. ...{
  227. owner_address: value.owner_address,
  228. call_token_value: value.call_token_value,
  229. token_id: value.token_id,
  230. },
  231. ...value.new_contract,
  232. }
  233. : value;
  234. const { owner_address, consume_user_resource_percent, origin_energy_limit, abi, bytecode = '', parameter = '', call_value, call_token_value, token_id, name: contracName, } = params;
  235. let { origin_address } = params;
  236. const createSmartContract = new CreateSmartContract();
  237. createSmartContract.setOwnerAddress(fromHexString(owner_address));
  238. if (token_id) {
  239. createSmartContract.setTokenId(token_id);
  240. }
  241. if (call_token_value) {
  242. createSmartContract.setCallTokenValue(call_token_value);
  243. }
  244. const smartContractBuilder = new SmartContract();
  245. if (abi) {
  246. let abiJson;
  247. if (typeof abi === 'string') {
  248. abiJson = JSON.parse(abi);
  249. }
  250. else {
  251. abiJson = abi?.entrys || []; // abi could be an empty object if origin abi is `[]`;
  252. }
  253. const abiBuilder = new SmartContract.ABI();
  254. const buildEntryParam = (data) => {
  255. const param = new SmartContract.ABI.Entry.Param();
  256. const { indexed, name, type } = data;
  257. if (indexed === true) {
  258. param.setIndexed(true);
  259. }
  260. param.setName(name);
  261. param.setType(type);
  262. return param;
  263. };
  264. const entryBuilders = abiJson.map((entry) => {
  265. const { anonymous, constant, name, inputs, outputs, type, payable, stateMutability } = entry;
  266. const entryBuilder = new SmartContract.ABI.Entry();
  267. entryBuilder.setAnonymous(anonymous);
  268. entryBuilder.setConstant(constant);
  269. entryBuilder.setName(name);
  270. if (inputs) {
  271. entryBuilder.setInputsList(inputs.map((input) => buildEntryParam(input)));
  272. }
  273. if (outputs) {
  274. entryBuilder.setOutputsList(outputs.map((output) => buildEntryParam(output)));
  275. }
  276. if (type) {
  277. entryBuilder.setType(SmartContract.ABI.Entry.EntryType[type.toUpperCase()]);
  278. }
  279. entryBuilder.setPayable(payable);
  280. if (stateMutability) {
  281. entryBuilder.setStatemutability(SmartContract.ABI.Entry.StateMutabilityType[stateMutability.toUpperCase()]);
  282. }
  283. return entryBuilder;
  284. });
  285. abiBuilder.setEntrysList(entryBuilders);
  286. smartContractBuilder.setAbi(abiBuilder);
  287. }
  288. if (call_value) {
  289. smartContractBuilder.setCallValue(call_value);
  290. }
  291. smartContractBuilder.setConsumeUserResourcePercent(consume_user_resource_percent);
  292. smartContractBuilder.setOriginEnergyLimit(origin_energy_limit);
  293. if (!origin_address) {
  294. origin_address = owner_address;
  295. }
  296. smartContractBuilder.setOriginAddress(fromHexString(origin_address));
  297. if (bytecode) {
  298. const bytecodeParameter = bytecode.replace(/^0x/, '') + parameter.replace(/^0x/, '');
  299. smartContractBuilder.setBytecode(stringToUint8Array(bytecodeParameter));
  300. }
  301. smartContractBuilder.setName(contracName);
  302. createSmartContract.setNewContract(smartContractBuilder);
  303. return buildCommonTransaction(createSmartContract, Transaction.Contract.ContractType.CREATESMARTCONTRACT, 'CreateSmartContract', options.Permission_id);
  304. };
  305. const buildClearABIContract = (value, options) => {
  306. const { contract_address, owner_address } = value;
  307. const clearABIContract = new ClearABIContract();
  308. clearABIContract.setOwnerAddress(fromHexString(owner_address));
  309. clearABIContract.setContractAddress(fromHexString(contract_address));
  310. return buildCommonTransaction(clearABIContract, Transaction.Contract.ContractType.CLEARABICONTRACT, 'ClearABIContract', options.Permission_id);
  311. };
  312. // updateBrokerage
  313. const buildUpdateBrokerageContract = (value, options) => {
  314. const { brokerage, owner_address } = value;
  315. const updateBrokerageContract = new UpdateBrokerageContract();
  316. updateBrokerageContract.setOwnerAddress(fromHexString(owner_address));
  317. updateBrokerageContract.setBrokerage(brokerage);
  318. return buildCommonTransaction(updateBrokerageContract, Transaction.Contract.ContractType.UPDATEBROKERAGECONTRACT, 'UpdateBrokerageContract', options.Permission_id);
  319. };
  320. // createToken
  321. const buildAssetIssueContract = (value, options) => {
  322. const { owner_address, name, abbr, description, url, total_supply, trx_num, num, start_time, end_time, precision, free_asset_net_limit, public_free_asset_net_limit, public_free_asset_net_usage = 0, public_latest_free_net_time = 0, vote_score = 0, frozen_supply, } = value;
  323. const assetIssueContract = new AssetIssueContract();
  324. assetIssueContract.setOwnerAddress(fromHexString(owner_address));
  325. if (name) {
  326. assetIssueContract.setName(stringToUint8Array(name.replace(/^0x/, '')));
  327. }
  328. if (abbr) {
  329. assetIssueContract.setAbbr(stringToUint8Array(abbr.replace(/^0x/, '')));
  330. }
  331. assetIssueContract.setTotalSupply(total_supply);
  332. assetIssueContract.setNum(num);
  333. assetIssueContract.setEndTime(end_time);
  334. assetIssueContract.setStartTime(start_time);
  335. assetIssueContract.setTrxNum(trx_num);
  336. assetIssueContract.setVoteScore(vote_score);
  337. if (precision) {
  338. assetIssueContract.setPrecision(precision);
  339. }
  340. if (public_latest_free_net_time) {
  341. assetIssueContract.setPublicLatestFreeNetTime(public_latest_free_net_time);
  342. }
  343. if (description) {
  344. assetIssueContract.setDescription(stringToUint8Array(description.replace(/^0x/, '')));
  345. }
  346. if (url) {
  347. assetIssueContract.setUrl(stringToUint8Array(url.replace(/^0x/, '')));
  348. }
  349. assetIssueContract.setPublicFreeAssetNetUsage(public_free_asset_net_usage);
  350. assetIssueContract.setFreeAssetNetLimit(free_asset_net_limit);
  351. assetIssueContract.setPublicFreeAssetNetLimit(public_free_asset_net_limit);
  352. if (frozen_supply) {
  353. const frozenSupplyContract = new AssetIssueContract.FrozenSupply();
  354. frozenSupplyContract.setFrozenAmount(frozen_supply.length ? frozen_supply[0].frozen_amount : frozen_supply.frozen_amount);
  355. frozenSupplyContract.setFrozenDays(frozen_supply.length ? frozen_supply[0].frozen_days : frozen_supply.frozen_days);
  356. assetIssueContract.addFrozenSupply(frozenSupplyContract);
  357. }
  358. return buildCommonTransaction(assetIssueContract, Transaction.Contract.ContractType.ASSETISSUECONTRACT, 'AssetIssueContract', options.Permission_id);
  359. };
  360. //createAccount
  361. const buildAccountCreateContract = (value, options) => {
  362. const accountCreateContract = new AccountCreateContract();
  363. const { account_address, owner_address } = value;
  364. accountCreateContract.setOwnerAddress(fromHexString(owner_address));
  365. accountCreateContract.setAccountAddress(fromHexString(account_address.replace(/^0x/, '')));
  366. return buildCommonTransaction(accountCreateContract, Transaction.Contract.ContractType.ACCOUNTCREATECONTRACT, 'AccountCreateContract', options.Permission_id);
  367. };
  368. // updateAccount
  369. const buildAccountUpdateContract = (value, options) => {
  370. const accountUpdateContract = new AccountUpdateContract();
  371. const { account_name, owner_address } = value;
  372. accountUpdateContract.setOwnerAddress(fromHexString(owner_address));
  373. accountUpdateContract.setAccountName(stringToUint8Array(account_name.replace(/^0x/, '')));
  374. return buildCommonTransaction(accountUpdateContract, Transaction.Contract.ContractType.ACCOUNTUPDATECONTRACT, 'AccountUpdateContract', options.Permission_id);
  375. };
  376. // setAccountId
  377. const buildSetAccountIdContract = (value, options) => {
  378. const setAccountIdContract = new SetAccountIdContract();
  379. const { account_id, owner_address } = value;
  380. setAccountIdContract.setOwnerAddress(fromHexString(owner_address));
  381. setAccountIdContract.setAccountId(stringToUint8Array(account_id.replace(/^0x/, '')));
  382. return buildCommonTransaction(setAccountIdContract, Transaction.Contract.ContractType.SETACCOUNTIDCONTRACT, 'SetAccountIdContract', options.Permission_id);
  383. };
  384. const buildProposalCreateContract = (value, options) => {
  385. const proposalCreateContract = new ProposalCreateContract();
  386. const { owner_address, parameters } = value;
  387. proposalCreateContract.setOwnerAddress(fromHexString(owner_address));
  388. parameters.forEach((parameter) => {
  389. proposalCreateContract.getParametersMap().set(parameter.key, parameter.value);
  390. });
  391. return buildCommonTransaction(proposalCreateContract, Transaction.Contract.ContractType.PROPOSALCREATECONTRACT, 'ProposalCreateContract', options.Permission_id);
  392. };
  393. const buildProposalDeleteContract = (value, options) => {
  394. const proposalDeleteContract = new ProposalDeleteContract();
  395. const { owner_address, proposal_id } = value;
  396. proposalDeleteContract.setOwnerAddress(fromHexString(owner_address));
  397. proposalDeleteContract.setProposalId(proposal_id);
  398. return buildCommonTransaction(proposalDeleteContract, Transaction.Contract.ContractType.PROPOSALDELETECONTRACT, 'ProposalDeleteContract', options.Permission_id);
  399. };
  400. const buildVoteProposalContract = (value, options) => {
  401. const proposalVoteContract = new ProposalApproveContract();
  402. const { owner_address, proposal_id, is_add_approval } = value;
  403. proposalVoteContract.setOwnerAddress(fromHexString(owner_address));
  404. proposalVoteContract.setProposalId(proposal_id);
  405. proposalVoteContract.setIsAddApproval(is_add_approval);
  406. return buildCommonTransaction(proposalVoteContract, Transaction.Contract.ContractType.PROPOSALAPPROVECONTRACT, 'ProposalApproveContract', options.Permission_id);
  407. };
  408. const buildExchangeCreateContract = (value, options) => {
  409. const exchangeCreateContract = new ExchangeCreateContract();
  410. const { owner_address, first_token_id, first_token_balance, second_token_id, second_token_balance } = value;
  411. exchangeCreateContract.setOwnerAddress(fromHexString(owner_address));
  412. exchangeCreateContract.setFirstTokenId(flexToUint8Array(first_token_id, options.visible));
  413. exchangeCreateContract.setFirstTokenBalance(first_token_balance);
  414. exchangeCreateContract.setSecondTokenId(flexToUint8Array(second_token_id, options.visible));
  415. exchangeCreateContract.setSecondTokenBalance(second_token_balance);
  416. return buildCommonTransaction(exchangeCreateContract, Transaction.Contract.ContractType.EXCHANGECREATECONTRACT, 'ExchangeCreateContract', options.Permission_id);
  417. };
  418. const buildExchangeInjectContract = (value, options) => {
  419. const exchangeInjectContract = new ExchangeInjectContract();
  420. const { owner_address, exchange_id, token_id, quant } = value;
  421. exchangeInjectContract.setOwnerAddress(fromHexString(owner_address));
  422. exchangeInjectContract.setExchangeId(exchange_id);
  423. exchangeInjectContract.setTokenId(flexToUint8Array(token_id, options.visible));
  424. exchangeInjectContract.setQuant(quant);
  425. return buildCommonTransaction(exchangeInjectContract, Transaction.Contract.ContractType.EXCHANGEINJECTCONTRACT, 'ExchangeInjectContract', options.Permission_id);
  426. };
  427. const buildExchangeWithdrawContract = (value, options) => {
  428. const exchangeWithdrawContract = new ExchangeWithdrawContract();
  429. const { owner_address, exchange_id, token_id, quant } = value;
  430. exchangeWithdrawContract.setOwnerAddress(fromHexString(owner_address));
  431. exchangeWithdrawContract.setExchangeId(exchange_id);
  432. exchangeWithdrawContract.setTokenId(flexToUint8Array(token_id, options.visible));
  433. exchangeWithdrawContract.setQuant(quant);
  434. return buildCommonTransaction(exchangeWithdrawContract, Transaction.Contract.ContractType.EXCHANGEWITHDRAWCONTRACT, 'ExchangeWithdrawContract', options.Permission_id);
  435. };
  436. const buildExchangeTransactionContract = (value, options) => {
  437. const exchangeTransactionContract = new ExchangeTransactionContract();
  438. const { owner_address, exchange_id, token_id, quant, expected } = value;
  439. exchangeTransactionContract.setOwnerAddress(fromHexString(owner_address));
  440. exchangeTransactionContract.setExchangeId(exchange_id);
  441. exchangeTransactionContract.setTokenId(flexToUint8Array(token_id, options.visible));
  442. exchangeTransactionContract.setQuant(quant);
  443. exchangeTransactionContract.setExpected(expected);
  444. return buildCommonTransaction(exchangeTransactionContract, Transaction.Contract.ContractType.EXCHANGETRANSACTIONCONTRACT, 'ExchangeTransactionContract', options.Permission_id);
  445. };
  446. const buildUpdateSettingContract = (value, options) => {
  447. const updateSettingContract = new UpdateSettingContract();
  448. const { owner_address, contract_address, consume_user_resource_percent } = value;
  449. updateSettingContract.setOwnerAddress(fromHexString(owner_address));
  450. updateSettingContract.setContractAddress(fromHexString(contract_address));
  451. updateSettingContract.setConsumeUserResourcePercent(consume_user_resource_percent);
  452. return buildCommonTransaction(updateSettingContract, Transaction.Contract.ContractType.UPDATESETTINGCONTRACT, 'UpdateSettingContract', options.Permission_id);
  453. };
  454. const buildUpdateEnergyLimitContract = (value, options) => {
  455. const updateEnergyLimitContract = new UpdateEnergyLimitContract();
  456. const { owner_address, contract_address, origin_energy_limit } = value;
  457. updateEnergyLimitContract.setOwnerAddress(fromHexString(owner_address));
  458. updateEnergyLimitContract.setContractAddress(fromHexString(contract_address));
  459. updateEnergyLimitContract.setOriginEnergyLimit(origin_energy_limit);
  460. return buildCommonTransaction(updateEnergyLimitContract, Transaction.Contract.ContractType.UPDATEENERGYLIMITCONTRACT, 'UpdateEnergyLimitContract', options.Permission_id);
  461. };
  462. const buildAccountPermissionUpdateContract = (value, options) => {
  463. const accountPermissionUpdateContract = new AccountPermissionUpdateContract();
  464. const { owner_address, owner, witness, actives } = value;
  465. accountPermissionUpdateContract.setOwnerAddress(fromHexString(owner_address));
  466. const getType = (type) => {
  467. // no type when permission_name is owner
  468. if (isNaN(type))
  469. return type === 'Active' ? 2 : type === 'Witness' ? 1 : 0;
  470. return type;
  471. };
  472. const buildPermission = (data) => {
  473. // no type when permission_name is owner
  474. const permission = new Permission();
  475. const { type, id, permission_name, threshold, parentId, operations, keys } = data;
  476. permission.setType(getType(type));
  477. permission.setId(id);
  478. permission.setPermissionName(permission_name);
  479. permission.setThreshold(threshold);
  480. if (parentId) {
  481. permission.setParentId(parentId);
  482. }
  483. if (operations) {
  484. permission.setOperations(stringToUint8Array(operations));
  485. }
  486. if (keys) {
  487. permission.setKeysList(keys.map((key) => {
  488. const keyBuilder = new Key();
  489. keyBuilder.setAddress(fromHexString(key.address));
  490. keyBuilder.setWeight(key.weight);
  491. return keyBuilder;
  492. }));
  493. }
  494. return permission;
  495. };
  496. if (owner) {
  497. accountPermissionUpdateContract.setOwner(buildPermission(owner));
  498. }
  499. if (witness) {
  500. accountPermissionUpdateContract.setWitness(buildPermission(witness));
  501. }
  502. if (actives) {
  503. if (Array.isArray(actives)) {
  504. accountPermissionUpdateContract.setActivesList(actives.map((active) => buildPermission(active)));
  505. }
  506. else {
  507. accountPermissionUpdateContract.setActivesList([buildPermission(actives)]);
  508. }
  509. }
  510. return buildCommonTransaction(accountPermissionUpdateContract, Transaction.Contract.ContractType.ACCOUNTPERMISSIONUPDATECONTRACT, 'AccountPermissionUpdateContract', options.Permission_id);
  511. };
  512. const buildUpdateAssetContract = (value, options) => {
  513. const updateAssetContract = new UpdateAssetContract();
  514. const { owner_address, description, url, new_limit, new_public_limit } = value;
  515. updateAssetContract.setOwnerAddress(fromHexString(owner_address));
  516. if (description) {
  517. updateAssetContract.setDescription(stringToUint8Array(description.replace(/^0x/, '')));
  518. }
  519. if (url) {
  520. updateAssetContract.setUrl(stringToUint8Array(url.replace(/^0x/, '')));
  521. }
  522. if (new_limit) {
  523. updateAssetContract.setNewLimit(new_limit);
  524. }
  525. if (new_public_limit) {
  526. updateAssetContract.setNewPublicLimit(new_public_limit);
  527. }
  528. return buildCommonTransaction(updateAssetContract, Transaction.Contract.ContractType.UPDATEASSETCONTRACT, 'UpdateAssetContract', options.Permission_id);
  529. };
  530. const contractJsonToProtobuf = (contract, value, options) => {
  531. switch (contract.type) {
  532. case 'TransferContract':
  533. return buildTransferContract(value, options);
  534. case 'TransferAssetContract':
  535. return buildTransferAssetContract(value, options);
  536. case 'ParticipateAssetIssueContract':
  537. return buildParticipateAssetIssueContract(value, options);
  538. case 'TriggerSmartContract':
  539. return buildTriggerSmartContract(value, options);
  540. case 'FreezeBalanceContract':
  541. return buildFreezeBalanceContract(value, options);
  542. case 'UnfreezeBalanceContract':
  543. return buildUnfreezeBalanceContract(value, options);
  544. case 'WithdrawBalanceContract':
  545. return buildWithdrawBalanceContract(value, options);
  546. case 'FreezeBalanceV2Contract':
  547. return buildFreezeBalanceV2Contract(value, options);
  548. case 'CancelAllUnfreezeV2Contract':
  549. return buildCancelFreezeBalanceV2Contract(value, options);
  550. case 'UnfreezeBalanceV2Contract':
  551. return buildUnfreezeBalanceV2Contract(value, options);
  552. case 'DelegateResourceContract':
  553. return buildDelegateResourceContract(value, options);
  554. case 'UnDelegateResourceContract':
  555. return buildUnDelegateResourceContract(value, options);
  556. case 'WithdrawExpireUnfreezeContract':
  557. return buildWithdrawExpireUnfreezeContract(value, options);
  558. case 'WitnessCreateContract':
  559. return buildCreateWitness(value, options);
  560. case 'VoteWitnessContract':
  561. return buildVoteWitnessAccount(value, options);
  562. case 'CreateSmartContract':
  563. return buildCreateSmartContract(value, options);
  564. case 'ClearABIContract':
  565. return buildClearABIContract(value, options);
  566. case 'UpdateBrokerageContract':
  567. return buildUpdateBrokerageContract(value, options);
  568. case 'AssetIssueContract':
  569. return buildAssetIssueContract(value, options);
  570. case 'AccountCreateContract':
  571. return buildAccountCreateContract(value, options);
  572. case 'AccountUpdateContract':
  573. return buildAccountUpdateContract(value, options);
  574. case 'SetAccountIdContract':
  575. return buildSetAccountIdContract(value, options);
  576. case 'ProposalCreateContract':
  577. return buildProposalCreateContract(value, options);
  578. case 'ProposalDeleteContract':
  579. return buildProposalDeleteContract(value, options);
  580. case 'ProposalApproveContract':
  581. return buildVoteProposalContract(value, options);
  582. case 'ExchangeCreateContract':
  583. return buildExchangeCreateContract(value, options);
  584. case 'ExchangeInjectContract':
  585. return buildExchangeInjectContract(value, options);
  586. case 'ExchangeWithdrawContract':
  587. return buildExchangeWithdrawContract(value, options);
  588. case 'ExchangeTransactionContract':
  589. return buildExchangeTransactionContract(value, options);
  590. case 'UpdateSettingContract':
  591. return buildUpdateSettingContract(value, options);
  592. case 'UpdateEnergyLimitContract':
  593. return buildUpdateEnergyLimitContract(value, options);
  594. case 'AccountPermissionUpdateContract':
  595. return buildAccountPermissionUpdateContract(value, options);
  596. case 'UpdateAssetContract':
  597. return buildUpdateAssetContract(value, options);
  598. }
  599. };
  600. const txJsonToPb = (transaction) => {
  601. const rawData = transaction['raw_data'];
  602. const contractJson = rawData.contract[0];
  603. const data = contractJson.parameter.value;
  604. const options = { Permission_id: contractJson.Permission_id, visible: transaction.visible };
  605. const transactionObj = contractJsonToProtobuf(contractJson, data, options);
  606. const rawDataObj = transactionObj.getRawData();
  607. rawDataObj.setRefBlockBytes(stringToUint8Array(rawData.ref_block_bytes));
  608. rawDataObj.setRefBlockHash(stringToUint8Array(rawData.ref_block_hash));
  609. if (rawData.data) {
  610. rawDataObj.setData(stringToUint8Array(rawData.data));
  611. }
  612. if (rawData.fee_limit) {
  613. rawDataObj.setFeeLimit(rawData.fee_limit);
  614. }
  615. if (rawData.expiration) {
  616. rawDataObj.setExpiration(rawData.expiration);
  617. }
  618. if (rawData.timestamp) {
  619. rawDataObj.setTimestamp(rawData.timestamp);
  620. }
  621. transactionObj.setRawData(rawDataObj);
  622. return transactionObj;
  623. };
  624. exports.txJsonToPb = txJsonToPb;
  625. const txJsonToPbWithArgs = (transaction, args = {}, options = {}) => {
  626. const rawData = transaction['raw_data'];
  627. const contractJson = rawData.contract[0];
  628. const transactionObj = contractJsonToProtobuf(contractJson, args, {
  629. Permission_id: args?.Permission_id,
  630. });
  631. const rawDataObj = transactionObj.getRawData();
  632. rawDataObj.setRefBlockBytes(stringToUint8Array(rawData.ref_block_bytes));
  633. rawDataObj.setRefBlockHash(stringToUint8Array(rawData.ref_block_hash));
  634. // for memo
  635. if (options.data) {
  636. rawDataObj.setData(stringToUint8Array(options.data.replace(/^0x/, '')));
  637. }
  638. if (options.fee_limit || args.fee_limit) {
  639. rawDataObj.setFeeLimit(options.fee_limit || args.fee_limit);
  640. }
  641. if (rawData.expiration) {
  642. rawDataObj.setExpiration(rawData.expiration);
  643. }
  644. if (rawData.timestamp) {
  645. rawDataObj.setTimestamp(rawData.timestamp);
  646. }
  647. transactionObj.setRawData(rawDataObj);
  648. return transactionObj;
  649. };
  650. exports.txJsonToPbWithArgs = txJsonToPbWithArgs;
  651. const compareTransaction = (transaction, transactionPb) => {
  652. const rawDataBytes = transactionPb.getRawData().serializeBinary();
  653. const rawDataHex = (0, bytes_js_1.byteArray2hexStr)(rawDataBytes);
  654. const txID = (0, ethersUtils_js_1.sha256)(rawDataBytes);
  655. return (rawDataHex.toLowerCase() === transaction.raw_data_hex.toLowerCase() &&
  656. txID.replace(/^0x/, '').toLowerCase() === transaction.txID.replace(/^0x/, '').toLowerCase());
  657. };
  658. const txPbToRawDataHex = (pb) => {
  659. return (0, bytes_js_1.byteArray2hexStr)(pb.getRawData().serializeBinary());
  660. };
  661. exports.txPbToRawDataHex = txPbToRawDataHex;
  662. const txCheck = (transaction) => {
  663. const transactionPb = txJsonToPb(transaction);
  664. return compareTransaction(transaction, transactionPb);
  665. };
  666. exports.txCheck = txCheck;
  667. const txCheckWithArgs = (transaction, args, options) => {
  668. const transactionPb = txJsonToPbWithArgs(transaction, args, options);
  669. return compareTransaction(transaction, transactionPb);
  670. };
  671. exports.txCheckWithArgs = txCheckWithArgs;
  672. const txPbToTxID = (transactionPb) => {
  673. const rawDataBytes = transactionPb.getRawData().serializeBinary();
  674. const txID = (0, ethersUtils_js_1.sha256)(rawDataBytes);
  675. return txID;
  676. };
  677. exports.txPbToTxID = txPbToTxID;
  678. //# sourceMappingURL=transaction.js.map