Skip to content

Commit

Permalink
decoded transaction info
Browse files Browse the repository at this point in the history
  • Loading branch information
idanya committed Jul 16, 2023
1 parent 6359824 commit 1dfa901
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 9 deletions.
2 changes: 1 addition & 1 deletion cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ func Execute(decompiler *decompiler.Decompiler) {
viper.BindPFlag("chainId", rootCmd.PersistentFlags().Lookup("chain-id"))
viper.BindPFlag("rpcUrl", rootCmd.PersistentFlags().Lookup("rpc-url"))

tx := NewTransactionCommands()
tx := NewTransactionCommands(decompiler)
rootCmd.AddCommand(tx.GetRootCommand())

accountCmd := NewAccountCommands()
Expand Down
17 changes: 12 additions & 5 deletions cmd/tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,17 @@ import (
"log"

"github.com/idanya/evm-cli/clients/directory/openchain"
decompiler "github.com/idanya/evm-cli/decompiler"
"github.com/idanya/evm-cli/services"
"github.com/spf13/cobra"
)

type TransactionCommands struct {
decompiler *decompiler.Decompiler
}

func NewTransactionCommands() *TransactionCommands {
return &TransactionCommands{}
func NewTransactionCommands(decompiler *decompiler.Decompiler) *TransactionCommands {
return &TransactionCommands{decompiler}
}

func (tx *TransactionCommands) GetRootCommand() *cobra.Command {
Expand All @@ -37,7 +39,7 @@ func (tx *TransactionCommands) GetTransactionDataCommand() *cobra.Command {
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {

tx, err := NodeClientFromViper().GetTransactionByHash(context.Background(), args[0])
tx, err := tx.getTransactionService().GetTransactionByHash(context.Background(), args[0])
if err != nil {
log.Fatal(err)
}
Expand All @@ -54,8 +56,7 @@ func (tx *TransactionCommands) GetTransactionReceiptCommand() *cobra.Command {
Short: "Get transaction receipt by hash",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
transactionService := services.NewTransactionService(NodeClientFromViper(), openchain.NewClient())
receipt, err := transactionService.GetTransactionReceipt(context.Background(), args[0])
receipt, err := tx.getTransactionService().GetTransactionReceipt(context.Background(), args[0])
if err != nil {
log.Fatal(err)
}
Expand All @@ -65,3 +66,9 @@ func (tx *TransactionCommands) GetTransactionReceiptCommand() *cobra.Command {
},
}
}

func (tx *TransactionCommands) getTransactionService() *services.TransactionService {
openchainClient := openchain.NewClient()
contractService := services.NewContractService(NodeClientFromViper(), tx.decompiler, openchainClient)
return services.NewTransactionService(NodeClientFromViper(), openchainClient, contractService)
}
46 changes: 46 additions & 0 deletions entities/enriched_tx_info.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package entities

import (
"encoding/json"
"math/big"

"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
)

type EnrichedTxInfo struct {
*types.Transaction
DecodedData *DecodeResult
}

func (et *EnrichedTxInfo) MarshalJSON() ([]byte, error) {
return json.Marshal(&struct {
TxType byte
ChainID *big.Int
AccessList types.AccessList
Data []byte
Gas uint64
GasPrice *big.Int
GasTipCap *big.Int
GasFeeCap *big.Int
Value *big.Int
Nonce uint64
Hash common.Hash
To *common.Address `json:"to"`
DecodedData *DecodeResult `json:"decodedData,omitempty"`
}{
TxType: byte(et.Type()),
ChainID: et.Transaction.ChainId(),
AccessList: et.Transaction.AccessList(),
Data: et.Transaction.Data(),
Gas: et.Transaction.Gas(),
GasPrice: et.Transaction.GasPrice(),
GasTipCap: et.Transaction.GasTipCap(),
GasFeeCap: et.Transaction.GasFeeCap(),
Value: et.Transaction.Value(),
Nonce: et.Transaction.Nonce(),
Hash: et.Transaction.Hash(),
To: et.Transaction.To(),
DecodedData: et.DecodedData,
})
}
22 changes: 20 additions & 2 deletions services/transaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package services
import (
"context"

"github.com/ethereum/go-ethereum/common"
"github.com/idanya/evm-cli/clients/directory"
"github.com/idanya/evm-cli/clients/nodes"
"github.com/idanya/evm-cli/entities"
Expand All @@ -11,10 +12,13 @@ import (
type TransactionService struct {
nodeClient nodes.NodeClient
directoryClient directory.DirectoryClient
contractService *ContractService
}

func NewTransactionService(nodeClient nodes.NodeClient, directoryClient directory.DirectoryClient) *TransactionService {
return &TransactionService{nodeClient, directoryClient}
func NewTransactionService(nodeClient nodes.NodeClient,
directoryClient directory.DirectoryClient,
contractService *ContractService) *TransactionService {
return &TransactionService{nodeClient, directoryClient, contractService}
}

func (ts *TransactionService) GetTransactionReceipt(context context.Context, txHash string) (*entities.EnrichedReceipt, error) {
Expand All @@ -41,3 +45,17 @@ func (ts *TransactionService) GetTransactionReceipt(context context.Context, txH

return enrichedReceipt, nil
}

func (ts *TransactionService) GetTransactionByHash(context context.Context, txHash string) (*entities.EnrichedTxInfo, error) {
transaction, err := ts.nodeClient.GetTransactionByHash(context, txHash)
if err != nil {
return nil, err
}

decoded, err := ts.contractService.DecodeContractCallData(context, common.Bytes2Hex(transaction.Data()))
if err == nil {
return &entities.EnrichedTxInfo{Transaction: transaction, DecodedData: decoded}, nil
}

return &entities.EnrichedTxInfo{Transaction: transaction}, nil
}
6 changes: 5 additions & 1 deletion services/transaction_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,19 @@ import (
"github.com/ethereum/go-ethereum/core/types"
dirmock "github.com/idanya/evm-cli/clients/directory/mocks"
"github.com/idanya/evm-cli/clients/nodes/mocks"
decompiler "github.com/idanya/evm-cli/decompiler"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
)

func TestTransactionService_GetTransactionReceipt(t *testing.T) {
directoryClientMock := dirmock.NewDirectoryClient(t)
decompilerClient := decompiler.NewDecompiler(directoryClientMock)

nodeClientMock := mocks.NewNodeClient(t)
transactionService := NewTransactionService(nodeClientMock, directoryClientMock)
contractService := NewContractService(nodeClientMock, decompilerClient, directoryClientMock)

transactionService := NewTransactionService(nodeClientMock, directoryClientMock, contractService)

topicHash := common.HexToHash("0xdb80dd488acf86d17c747445b0eabb5d57c541d3bd7b6b87af987858e5066b2b")
txHash := "0xec8ecd56dca115adcc8de346ffe054841f810964a68afc81faf764f8a0ae7c26"
Expand Down

0 comments on commit 1dfa901

Please sign in to comment.