From e9caad004bccb0182cc49b3ea635ec983ae8df90 Mon Sep 17 00:00:00 2001 From: Satan-web3 Date: Tue, 15 Oct 2024 17:30:34 +0800 Subject: [PATCH] feat: deserialize all data in raw_data_hex --- package-lock.json | 4 ++-- src/utils/transaction.ts | 35 +++++++++++++++++++++++++++++----- test/utils/transaction.test.ts | 32 ++++++++++++++++++++++--------- 3 files changed, 55 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index ddaa312b..74a6a20b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "tronweb", - "version": "6.0.0", + "version": "6.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "tronweb", - "version": "6.0.0", + "version": "6.0.1", "license": "MIT", "dependencies": { "@babel/runtime": "^7.0.0", diff --git a/src/utils/transaction.ts b/src/utils/transaction.ts index 62207ce3..34f53708 100644 --- a/src/utils/transaction.ts +++ b/src/utils/transaction.ts @@ -989,15 +989,39 @@ const txPbToTxID = (transactionPb) => { return txID; }; -const getValueFromRawDataHex = (rawDataHex: string): Uint8Array => { + + +const DCommonData = (rawDataHex: string) => { const pb = Transaction.raw.deserializeBinary(hexStr2byteArray(rawDataHex)); - return pb.getContractList()[0].getParameter().getValue(); + const contract = pb.getContractList()[0]; + const valuePb = contract.getParameter().getValue(); + return [ + { + contract: [ + { + parameter: { + value: {}, + type_url: contract.getParameter().getTypeUrl(), + }, + type: contract.getType(), + Permission_id: contract.getPermissionId(), + }, + ], + data: pb.getData(), + fee_limit: pb.getFeeLimit(), + ref_block_bytes: byteArray2hexStr(pb.getRefBlockBytes_asU8()), + ref_block_hash: byteArray2hexStr(pb.getRefBlockHash_asU8()), + expiration: pb.getExpiration(), + timestamp: pb.getTimestamp(), + }, + valuePb, + ]; }; const DTriggerSmartContract = (rawDataHex: string) => { - const value = getValueFromRawDataHex(rawDataHex); - const triggerSmartContract = TriggerSmartContract.deserializeBinary(value); - return { + const [commonData, valuePb] = DCommonData(rawDataHex); + const triggerSmartContract = TriggerSmartContract.deserializeBinary(valuePb); + commonData.contract[0].parameter.value = { owner_address: byteArray2hexStr(triggerSmartContract.getOwnerAddress_asU8()), contract_address: byteArray2hexStr(triggerSmartContract.getContractAddress_asU8()), call_value: triggerSmartContract.getCallValue(), @@ -1005,6 +1029,7 @@ const DTriggerSmartContract = (rawDataHex: string) => { call_token_value: triggerSmartContract.getCallTokenValue(), token_id: triggerSmartContract.getTokenId(), }; + return commonData; }; export { txJsonToPb, txPbToTxID, txPbToRawDataHex, txJsonToPbWithArgs, txCheckWithArgs, txCheck, DTriggerSmartContract }; diff --git a/test/utils/transaction.test.ts b/test/utils/transaction.test.ts index 9c0bc504..d93ef682 100644 --- a/test/utils/transaction.test.ts +++ b/test/utils/transaction.test.ts @@ -4,7 +4,7 @@ import tronWebBuilder from '../helpers/tronWebBuilder.js'; // @ts-ignore import { decodeRlp } from 'ethers/utils'; -describe.only('#TronWeb.utils.transaction', function() { +describe('#TronWeb.utils.transaction', function() { let tronWeb: TronWeb; describe('DTriggerSmartContract', async () => { @@ -23,6 +23,7 @@ describe.only('#TronWeb.utils.transaction', function() { txLocal: true, tokenId: '1000008', tokenValue: 100, + feeLimit: 100 * (10 ** 6), }, [ { type: "address", value: account2.address.base58 }, @@ -33,11 +34,12 @@ describe.only('#TronWeb.utils.transaction', function() { }); it('should deserialize the right result', async () => { const dResult = utils.transaction.DTriggerSmartContract(tx.raw_data_hex); - assert.equal(dResult.owner_address, account.address.hex); - assert.equal(dResult.contract_address, utils.address.toHex(contractAddress).toUpperCase()); - assert.equal(dResult.call_value, 0); - assert.equal(dResult.call_token_value, 100); - assert.equal(dResult.token_id, '1000008'); + const value = dResult.contract[0].parameter.value; + assert.equal(value.owner_address, account.address.hex); + assert.equal(value.contract_address, utils.address.toHex(contractAddress).toUpperCase()); + assert.equal(value.call_value, 0); + assert.equal(value.call_token_value, 100); + assert.equal(value.token_id, '1000008'); const getFunctionSelectorHex = (functionSelector: string) => { return utils.ethersUtils.keccak256(Buffer.from(functionSelector, 'utf-8')).toString().substring(2, 10); @@ -77,7 +79,7 @@ describe.only('#TronWeb.utils.transaction', function() { const getData = (functionSelector: string, parameters: { type: string; value: unknown }[]) => { return getFunctionSelectorHex(functionSelector) + encodeParameters(parameters); }; - assert.equal(dResult.data, getData( + assert.equal(value.data, getData( 'transfer(address,uint256)', [ { type: "address", value: account2.address.base58 }, @@ -86,12 +88,24 @@ describe.only('#TronWeb.utils.transaction', function() { ).toUpperCase()); const abiCoder = new utils.ethersUtils.AbiCoder(); const functionSelector = getFunctionSelectorHex('transfer(address,uint256)'); - const data = abiCoder.decode(['address', 'uint256'], '0x' + dResult.data.slice(8)); + const data = abiCoder.decode(['address', 'uint256'], '0x' + value.data.slice(8)); const address = tronWeb.address.fromHex(data[0].replace('0x', '41')); const amount = data[1]; - assert.equal(functionSelector, dResult.data.slice(0, 8).toLowerCase()); + assert.equal(functionSelector, value.data.slice(0, 8).toLowerCase()); assert.equal(address, account2.address.base58); assert.equal(amount, 100000000); + + assert.equal(dResult.contract[0].Permission_id, 0); + assert.equal(dResult.contract[0].parameter.type_url, tx.raw_data.contract[0].parameter.type_url); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + assert.equal(dResult.contract[0].type, TronWebProto.Transaction.Contract.ContractType.TRIGGERSMARTCONTRACT); + assert.equal(dResult.expiration, tx.raw_data.expiration); + assert.equal(dResult.timestamp, tx.raw_data.timestamp); + assert.equal(dResult.ref_block_bytes.toLowerCase(), tx.raw_data.ref_block_bytes); + assert.equal(dResult.ref_block_hash.toLowerCase(), tx.raw_data.ref_block_hash); + assert.equal(dResult.data, tx.raw_data.data || ''); + assert.equal(dResult.fee_limit, tx.raw_data.fee_limit); }); }); }) \ No newline at end of file