package commands import ( "context" "github.com/ledgerwatch/turbo-geth/params" "github.com/ledgerwatch/turbo-geth/cmd/rpcdaemon/cli" "github.com/ledgerwatch/turbo-geth/common" "github.com/ledgerwatch/turbo-geth/common/hexutil" "github.com/ledgerwatch/turbo-geth/core/rawdb" "github.com/ledgerwatch/turbo-geth/core/types" "github.com/ledgerwatch/turbo-geth/ethdb" "github.com/ledgerwatch/turbo-geth/rpc" ) // TraceAPI RPC interface into tracing API type TraceAPI interface { // Ad-hoc ReplayBlockTransactions(ctx context.Context, blockNr rpc.BlockNumber, traceTypes []string) ([]interface{}, error) ReplayTransaction(ctx context.Context, txHash common.Hash, traceTypes []string) ([]interface{}, error) Call(ctx context.Context, call CallParam, blockNr rpc.BlockNumber) ([]interface{}, error) CallMany(ctx context.Context, calls CallParams) ([]interface{}, error) RawTransaction(ctx context.Context, txHash common.Hash, traceTypes []string) ([]interface{}, error) // Filtering Transaction(ctx context.Context, txHash common.Hash) (ParityTraces, error) Get(ctx context.Context, txHash common.Hash, txIndicies []hexutil.Uint64) (*ParityTrace, error) Block(ctx context.Context, blockNr rpc.BlockNumber) (ParityTraces, error) Filter(ctx context.Context, req TraceFilterRequest) (ParityTraces, error) // Custom (turbo geth exclusive) BlockReward(ctx context.Context, blockNr rpc.BlockNumber) (Issuance, error) UncleReward(ctx context.Context, blockNr rpc.BlockNumber) (Issuance, error) Issuance(ctx context.Context, blockNr rpc.BlockNumber) (Issuance, error) } // TraceAPIImpl is implementation of the TraceAPI interface based on remote Db access type TraceAPIImpl struct { db ethdb.KV dbReader ethdb.Getter maxTraces uint64 traceType string chainConfig *params.ChainConfig } // NewTraceAPI returns NewTraceAPI instance func NewTraceAPI(db ethdb.KV, dbReader ethdb.Getter, cfg *cli.Flags, chainConfig *params.ChainConfig) *TraceAPIImpl { return &TraceAPIImpl{ db: db, dbReader: dbReader, maxTraces: cfg.MaxTraces, traceType: cfg.TraceType, chainConfig: chainConfig, } } func (api *TraceAPIImpl) getBlockByRPCNumber(blockNr rpc.BlockNumber) (*types.Block, error) { blockNum, err := getBlockNumber(blockNr, api.dbReader) if err != nil { return nil, err } return rawdb.ReadBlockByNumber(api.dbReader, blockNum), nil }