a61f3b892d
* Filtered logs based param criteria * addded PublicFilterAPI * added filter logs func to filter based on params * added Unmarshal func from go-ethereum * Linted * made requested changes
80 lines
2.2 KiB
Go
80 lines
2.2 KiB
Go
package rpc
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
|
|
"github.com/cosmos/cosmos-sdk/client/context"
|
|
"github.com/cosmos/ethermint/x/evm/types"
|
|
|
|
"math/big"
|
|
|
|
ethtypes "github.com/ethereum/go-ethereum/core/types"
|
|
"github.com/ethereum/go-ethereum/eth/filters"
|
|
"github.com/ethereum/go-ethereum/rpc"
|
|
)
|
|
|
|
// PublicFilterAPI is the eth_ prefixed set of APIs in the Web3 JSON-RPC spec.
|
|
type PublicFilterAPI struct {
|
|
cliCtx context.CLIContext
|
|
}
|
|
|
|
// NewPublicEthAPI creates an instance of the public ETH Web3 API.
|
|
func NewPublicFilterAPI(cliCtx context.CLIContext) *PublicFilterAPI {
|
|
return &PublicFilterAPI{
|
|
cliCtx: cliCtx,
|
|
}
|
|
}
|
|
|
|
// GetLogs returns logs matching the given argument that are stored within the state.
|
|
//
|
|
// https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getlogs
|
|
func (e *PublicFilterAPI) GetLogs(criteria filters.FilterCriteria) ([]*ethtypes.Log, error) {
|
|
var filter *Filter
|
|
if criteria.BlockHash != nil {
|
|
/*
|
|
Still need to add blockhash in prepare function for log entry
|
|
*/
|
|
filter = NewBlockFilter(*criteria.BlockHash, criteria.Addresses, criteria.Topics)
|
|
results := e.getLogs()
|
|
logs := filterLogs(results, nil, nil, filter.addresses, filter.topics)
|
|
return logs, nil
|
|
} else {
|
|
// Convert the RPC block numbers into internal representations
|
|
begin := rpc.LatestBlockNumber.Int64()
|
|
if criteria.FromBlock != nil {
|
|
begin = criteria.FromBlock.Int64()
|
|
}
|
|
from := big.NewInt(begin)
|
|
end := rpc.LatestBlockNumber.Int64()
|
|
if criteria.ToBlock != nil {
|
|
end = criteria.ToBlock.Int64()
|
|
}
|
|
to := big.NewInt(end)
|
|
results := e.getLogs()
|
|
logs := filterLogs(results, from, to, criteria.Addresses, criteria.Topics)
|
|
|
|
return returnLogs(logs), nil
|
|
}
|
|
}
|
|
|
|
func (e *PublicFilterAPI) getLogs() (results []*ethtypes.Log) {
|
|
l, _, err := e.cliCtx.QueryWithData(fmt.Sprintf("custom/%s/logs", types.ModuleName), nil)
|
|
if err != nil {
|
|
fmt.Printf("error from querier %e ", err)
|
|
}
|
|
|
|
if err := json.Unmarshal(l, &results); err != nil {
|
|
panic(err)
|
|
}
|
|
return results
|
|
}
|
|
|
|
// returnLogs is a helper that will return an empty log array in case the given logs array is nil,
|
|
// otherwise the given logs array is returned.
|
|
func returnLogs(logs []*ethtypes.Log) []*ethtypes.Log {
|
|
if logs == nil {
|
|
return []*ethtypes.Log{}
|
|
}
|
|
return logs
|
|
} |