How to correct parse full message-graph for smart-contract call?
How to correct parse full message-graph for smart-contract call?
Hi everione
I try to understand logic of work API v4.
In general I have a aim to get full graph of messages for some smart-contract call.
I use next algorithm:
0. I have a TonClient4 and my Address;
1. Get last block info: `const lastBlockInfo = await client.getLastBlock();`
2. Get account on this block: `const accountInfo = await client.getAccount(lastBlockInfo.last.seqno, address);`
3. Get account transactions: `const accountTransactions = await client.getAccountTransactions(address, BigInt(accountInfo.account.last.lt), Buffer.from(accountInfo.account.last.hash, 'base64'));`
4. From the list of transactions I get any transaction, for example this index=1: `const targetTransaction = accountTransactions[1]`;
There is two fields: `targetTransaction.tx` and `targetTransaction.block`.
In `targetTransaction.tx` field there is `targetTransaction.tx.inMessage` field.
If type of this message is `internal`, I have to find "parent" message of this, message. But it looks that I have only address of source of this message and it logical time.
So I need get list of transaction of source account and in this list find transaction which has outMessage with the same logical time.
But for this I have to call `client.getAccount(???, targetTransaction.tx.inMessage.src)` - here ??? - it's a block number.
Of course I can use `lastBlockInfo.last.seqno`, but it is not universal solution for historical messages.
At first I thought, that I can use `targetTransaction.block.seqno`, but as I understud it's a number of block on `workchain=0`, but `getAccount` method requires block number on `workchain=-1`;
I decided to check method getBlockByUtime: `const blockByTime = await client.getBlockByUtime(targetTransaction.tx.inMessage.info.createdAt);`
In the result I see two shards: one for `workchain=0`, and one for `workchain=-1`. It seems that `seqno` from shard with `workchain=-1` can be used, but I surprised that for `workchain=0` I see block number not equal to `targetTransaction.block.seqno`, but previous one.
So from this point I have a questions:
1. Is it realy so complicated to get parent message, or I missed some method or something else?
2. How much can I trust method `getBlockByUtime`? Is it possible that for some unix time I will (not get block)/(get next block)/(any options)?
Thanks for your attention. I will be grateful for any help.
Hi everione
I try to understand logic of work API v4.
In general I have a aim to get full graph of messages for some smart-contract call.
I use next algorithm:
0. I have a TonClient4 and my Address;
1. Get last block info: `const lastBlockInfo = await client.getLastBlock();`
2. Get account on this block: `const accountInfo = await client.getAccount(lastBlockInfo.last.seqno, address);`
3. Get account transactions: `const accountTransactions = await client.getAccountTransactions(address, BigInt(accountInfo.account.last.lt), Buffer.from(accountInfo.account.last.hash, 'base64'));`
4. From the list of transactions I get any transaction, for example this index=1: `const targetTransaction = accountTransactions[1]`;
There is two fields: `targetTransaction.tx` and `targetTransaction.block`.
In `targetTransaction.tx` field there is `targetTransaction.tx.inMessage` field.
If type of this message is `internal`, I have to find "parent" message of this, message. But it looks that I have only address of source of this message and it logical time.
So I need get list of transaction of source account and in this list find transaction which has outMessage with the same logical time.
But for this I have to call `client.getAccount(???, targetTransaction.tx.inMessage.src)` - here ??? - it's a block number.
Of course I can use `lastBlockInfo.last.seqno`, but it is not universal solution for historical messages.
At first I thought, that I can use `targetTransaction.block.seqno`, but as I understud it's a number of block on `workchain=0`, but `getAccount` method requires block number on `workchain=-1`;
I decided to check method getBlockByUtime: `const blockByTime = await client.getBlockByUtime(targetTransaction.tx.inMessage.info.createdAt);`
In the result I see two shards: one for `workchain=0`, and one for `workchain=-1`. It seems that `seqno` from shard with `workchain=-1` can be used, but I surprised that for `workchain=0` I see block number not equal to `targetTransaction.block.seqno`, but previous one.
So from this point I have a questions:
1. Is it realy so complicated to get parent message, or I missed some method or something else?
2. How much can I trust method `getBlockByUtime`? Is it possible that for some unix time I will (not get block)/(get next block)/(any options)?
Thanks for your attention. I will be grateful for any help.
#ton-v4-api
How to correct parse full message-graph for smart-contract call?
Hi everione
I try to understand logic of work API v4.
In general I have a aim to get full graph of messages for some smart-contract call.
I use next algorithm:
0. I have a TonClient4 and my Address;
1. Get last block info: `const lastBlockInfo = await client.getLastBlock();`
2. Get account on this block: `const accountInfo = await client.getAccount(lastBlockInfo.last.seqno, address);`
3. Get account transactions: `const accountTransactions = await client.getAccountTransactions(address, BigInt(accountInfo.account.last.lt), Buffer.from(accountInfo.account.last.hash, 'base64'));`
4. From the list of transactions I get any transaction, for example this index=1: `const targetTransaction = accountTransactions[1]`;
There is two fields: `targetTransaction.tx` and `targetTransaction.block`.
In `targetTransaction.tx` field there is `targetTransaction.tx.inMessage` field.
If type of this message is `internal`, I have to find "parent" message of this, message. But it looks that I have only address of source of this message and it logical time.
So I need get list of transaction of source account and in this list find transaction which has outMessage with the same logical time.
But for this I have to call `client.getAccount(???, targetTransaction.tx.inMessage.src)` - here ??? - it's a block number.
Of course I can use `lastBlockInfo.last.seqno`, but it is not universal solution for historical messages.
At first I thought, that I can use `targetTransaction.block.seqno`, but as I understud it's a number of block on `workchain=0`, but `getAccount` method requires block number on `workchain=-1`;
I decided to check method getBlockByUtime: `const blockByTime = await client.getBlockByUtime(targetTransaction.tx.inMessage.info.createdAt);`
In the result I see two shards: one for `workchain=0`, and one for `workchain=-1`. It seems that `seqno` from shard with `workchain=-1` can be used, but I surprised that for `workchain=0` I see block number not equal to `targetTransaction.block.seqno`, but previous one.
So from this point I have a questions:
1. Is it realy so complicated to get parent message, or I missed some method or something else?
2. How much can I trust method `getBlockByUtime`? Is it possible that for some unix time I will (not get block)/(get next block)/(any options)?
Thanks for your attention. I will be grateful for any help.