forked from cerc-io/plugeth
78a3c32ef4
This change simplifies the logic for indexing transactions and enhances the UX when transaction is not found by returning more information to users. Transaction indexing is now considered as a part of the initial sync, and `eth.syncing` will thus be `true` if transaction indexing is not yet finished. API consumers can use the syncing status to determine if the node is ready to serve users.
79 lines
2.6 KiB
Go
79 lines
2.6 KiB
Go
// Copyright 2024 The go-ethereum Authors
|
|
// This file is part of the go-ethereum library.
|
|
//
|
|
// The go-ethereum library is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Lesser General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// The go-ethereum library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
package ethapi
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/ethereum/go-ethereum/accounts/abi"
|
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
|
"github.com/ethereum/go-ethereum/core/vm"
|
|
)
|
|
|
|
// revertError is an API error that encompasses an EVM revert with JSON error
|
|
// code and a binary data blob.
|
|
type revertError struct {
|
|
error
|
|
reason string // revert reason hex encoded
|
|
}
|
|
|
|
// ErrorCode returns the JSON error code for a revert.
|
|
// See: https://github.com/ethereum/wiki/wiki/JSON-RPC-Error-Codes-Improvement-Proposal
|
|
func (e *revertError) ErrorCode() int {
|
|
return 3
|
|
}
|
|
|
|
// ErrorData returns the hex encoded revert reason.
|
|
func (e *revertError) ErrorData() interface{} {
|
|
return e.reason
|
|
}
|
|
|
|
// newRevertError creates a revertError instance with the provided revert data.
|
|
func newRevertError(revert []byte) *revertError {
|
|
err := vm.ErrExecutionReverted
|
|
|
|
reason, errUnpack := abi.UnpackRevert(revert)
|
|
if errUnpack == nil {
|
|
err = fmt.Errorf("%w: %v", vm.ErrExecutionReverted, reason)
|
|
}
|
|
return &revertError{
|
|
error: err,
|
|
reason: hexutil.Encode(revert),
|
|
}
|
|
}
|
|
|
|
// TxIndexingError is an API error that indicates the transaction indexing is not
|
|
// fully finished yet with JSON error code and a binary data blob.
|
|
type TxIndexingError struct{}
|
|
|
|
// NewTxIndexingError creates a TxIndexingError instance.
|
|
func NewTxIndexingError() *TxIndexingError { return &TxIndexingError{} }
|
|
|
|
// Error implement error interface, returning the error message.
|
|
func (e *TxIndexingError) Error() string {
|
|
return "transaction indexing is in progress"
|
|
}
|
|
|
|
// ErrorCode returns the JSON error code for a revert.
|
|
// See: https://github.com/ethereum/wiki/wiki/JSON-RPC-Error-Codes-Improvement-Proposal
|
|
func (e *TxIndexingError) ErrorCode() int {
|
|
return 3 // TODO tbd
|
|
}
|
|
|
|
// ErrorData returns the hex encoded revert reason.
|
|
func (e *TxIndexingError) ErrorData() interface{} { return "transaction indexing is in progress" }
|