Skip to content

Commit

Permalink
feat: deserialize all data in raw_data_hex
Browse files Browse the repository at this point in the history
  • Loading branch information
Satan-web3 authored and Satan-web3 committed Oct 15, 2024
1 parent 5562c0f commit e9caad0
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 16 deletions.
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

35 changes: 30 additions & 5 deletions src/utils/transaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -989,22 +989,47 @@ 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(),
data: byteArray2hexStr(triggerSmartContract.getData_asU8()),
call_token_value: triggerSmartContract.getCallTokenValue(),
token_id: triggerSmartContract.getTokenId(),
};
return commonData;
};

export { txJsonToPb, txPbToTxID, txPbToRawDataHex, txJsonToPbWithArgs, txCheckWithArgs, txCheck, DTriggerSmartContract };
32 changes: 23 additions & 9 deletions test/utils/transaction.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 () => {
Expand All @@ -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 },
Expand All @@ -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);
Expand Down Expand Up @@ -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 },
Expand All @@ -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);
});
});
})

0 comments on commit e9caad0

Please sign in to comment.