Signed-off-by: jsvisa <delweng@gmail.com>
This commit is contained in:
jsvisa 2024-08-21 16:31:22 +00:00
parent 0c6e9a2207
commit b62bf22cb9

View file

@ -4,10 +4,14 @@ import (
"context" "context"
"errors" "errors"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/eth/tracers" "github.com/ethereum/go-ethereum/eth/tracers"
"github.com/ethereum/go-ethereum/internal/ethapi"
"github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/rpc"
) )
var errTxNotFound = errors.New("transaction not found")
type filterAPI struct { type filterAPI struct {
backend tracers.Backend backend tracers.Backend
filter *filter filter *filter
@ -27,13 +31,9 @@ func (api *filterAPI) isSupportedTracer(tracer string) bool {
} }
func (api *filterAPI) Block(ctx context.Context, blockNr rpc.BlockNumber, cfg *traceConfig) ([]interface{}, error) { func (api *filterAPI) Block(ctx context.Context, blockNr rpc.BlockNumber, cfg *traceConfig) ([]interface{}, error) {
tracer := defaultTraceConfig.Tracer tracer, err := api.getTracerOrDefault(cfg)
if cfg != nil { if err != nil {
tracer = cfg.Tracer return nil, err
}
if !api.isSupportedTracer(tracer) {
return nil, errors.New("tracer not found")
} }
blknum := uint64(blockNr.Int64()) blknum := uint64(blockNr.Int64())
@ -56,3 +56,40 @@ func (api *filterAPI) Block(ctx context.Context, blockNr rpc.BlockNumber, cfg *t
return results, nil return results, nil
} }
func (api *filterAPI) getTracerOrDefault(cfg *traceConfig) (string, error) {
if cfg == nil {
return defaultTraceConfig.Tracer, nil
}
tracer := cfg.Tracer
if !api.isSupportedTracer(tracer) {
return "", errors.New("tracer not found")
}
return tracer, nil
}
func (api *filterAPI) Transaction(ctx context.Context, hash common.Hash, cfg *traceConfig) (interface{}, error) {
tracer, err := api.getTracerOrDefault(cfg)
if err != nil {
return nil, err
}
found, _, _, blknum, index, err := api.backend.GetTransaction(ctx, hash)
if err != nil {
return nil, ethapi.NewTxIndexingError()
}
if !found {
return nil, errTxNotFound
}
traces, err := api.filter.readBlockTraces(ctx, tracer, blknum)
if err != nil {
return nil, err
}
if index >= uint64(len(traces)) {
return nil, nil
}
return traces[index].Result, nil
}