Implements eth_getTransactionByHash (#108)
* Implement eth_getTransactionByHash and add function for converting bytes to eth tx * Fix nil return on invalid hash * Fix error check
This commit is contained in:
		
							parent
							
								
									9383c743dd
								
							
						
					
					
						commit
						cfca4d10e6
					
				| @ -387,10 +387,8 @@ func convertTransactionsToRPC(cliCtx context.CLIContext, txs []tmtypes.Tx, block | ||||
| 	transactions := make([]interface{}, len(txs)) | ||||
| 	gasUsed := big.NewInt(0) | ||||
| 	for i, tx := range txs { | ||||
| 		var stdTx sdk.Tx | ||||
| 		err := cliCtx.Codec.UnmarshalBinaryLengthPrefixed(tx, &stdTx) | ||||
| 		ethTx, ok := stdTx.(*types.EthereumTxMsg) | ||||
| 		if !ok || err != nil { | ||||
| 		ethTx, err := bytesToEthTx(cliCtx, tx) | ||||
| 		if err != nil { | ||||
| 			continue | ||||
| 		} | ||||
| 		// TODO: Remove gas usage calculation if saving gasUsed per block
 | ||||
| @ -418,6 +416,16 @@ type Transaction struct { | ||||
| 	S                *hexutil.Big    `json:"s"` | ||||
| } | ||||
| 
 | ||||
| func bytesToEthTx(cliCtx context.CLIContext, bz []byte) (*types.EthereumTxMsg, error) { | ||||
| 	var stdTx sdk.Tx | ||||
| 	err := cliCtx.Codec.UnmarshalBinaryLengthPrefixed(bz, &stdTx) | ||||
| 	ethTx, ok := stdTx.(*types.EthereumTxMsg) | ||||
| 	if !ok || err != nil { | ||||
| 		return nil, fmt.Errorf("Invalid transaction type, must be an amino encoded Ethereum transaction") | ||||
| 	} | ||||
| 	return ethTx, nil | ||||
| } | ||||
| 
 | ||||
| // newRPCTransaction returns a transaction that will serialize to the RPC
 | ||||
| // representation, with the given location metadata set (if available).
 | ||||
| func newRPCTransaction(tx *types.EthereumTxMsg, blockHash common.Hash, blockNumber uint64, index uint64) *Transaction { | ||||
| @ -446,8 +454,26 @@ func newRPCTransaction(tx *types.EthereumTxMsg, blockHash common.Hash, blockNumb | ||||
| } | ||||
| 
 | ||||
| // GetTransactionByHash returns the transaction identified by hash.
 | ||||
| func (e *PublicEthAPI) GetTransactionByHash(hash common.Hash) *Transaction { | ||||
| 	return nil | ||||
| func (e *PublicEthAPI) GetTransactionByHash(hash common.Hash) (*Transaction, error) { | ||||
| 	tx, err := e.cliCtx.Client.Tx(hash.Bytes(), false) | ||||
| 	if err != nil { | ||||
| 		// Return nil for transaction when not found
 | ||||
| 		return nil, nil | ||||
| 	} | ||||
| 
 | ||||
| 	// Can either cache or just leave this out if not necessary
 | ||||
| 	block, err := e.cliCtx.Client.Block(&tx.Height) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	blockHash := common.BytesToHash(block.BlockMeta.Header.ConsensusHash) | ||||
| 
 | ||||
| 	ethTx, err := bytesToEthTx(e.cliCtx, tx.Tx) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return newRPCTransaction(ethTx, blockHash, uint64(tx.Height), uint64(tx.Index)), nil | ||||
| } | ||||
| 
 | ||||
| // GetTransactionByBlockHashAndIndex returns the transaction identified by hash and index.
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user