eth

package
v1.1.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 14, 2022 License: MIT Imports: 25 Imported by: 0

Documentation

Index

Constants

View Source
const (
	NonceTooLow = iota
	ReplacementTransactionUnderpriced
	LimitReached
	TransactionAlreadyInMempool
	TerminallyUnderpriced
	InsufficientEth
	TooExpensive
	FeeTooLow
	FeeTooHigh
	Fatal
)
View Source
const (
	NodeStateUndialed = NodeState(iota)
	NodeStateDialed
	NodeStateInvalidChainID
	NodeStateAlive
	NodeStateDead
	NodeStateClosed
)
View Source
const FunctionSelectorLength = 4

FunctionSelectorLength should always be a length of 4 as a byte.

View Source
const NullClientChainID = 0

NullClientChainID the ChainID that nullclient will return 0 is never used as a real chain ID so makes sense as a dummy value here

Variables

View Source
var ChainlinkFulfilledTopic = utils.MustHash("ChainlinkFulfilled(bytes32)")

ChainlinkFulfilledTopic is the signature for the event emitted after calling ChainlinkClient.validateChainlinkCallback(requestId). See ../../contracts/src/v0.6/ChainlinkClient.sol

View Source
var WeiPerEth = new(big.Int).Exp(big.NewInt(10), big.NewInt(18), nil)

WeiPerEth is amount of Wei currency units in one Eth.

Functions

func DefaultQueryCtx added in v0.10.4

func DefaultQueryCtx(ctxs ...context.Context) (ctx context.Context, cancel context.CancelFunc)

DefaultQueryCtx returns a context with a sensible sanity limit timeout for queries to the eth node

func ExtractRevertReasonFromRPCError added in v0.10.7

func ExtractRevertReasonFromRPCError(err error) (string, error)

ExtractRevertReasonFromRPCError attempts to extract the revert reason from the response of an RPC eth_call that reverted by parsing the message from the "data" field ex: kovan (parity) { "error": { "code" : -32015, "data": "Reverted 0xABC123...", "message": "VM execution error." } } // revert reason always omitted rinkeby / ropsten (geth) { "error": { "code": 3, "data": "0x0xABC123...", "message": "execution reverted: hello world" } } // revert reason included in message

func MustGetABI added in v0.10.3

func MustGetABI(json string) abi.ABI

func NewClientWithNodes added in v1.1.0

func NewClientWithNodes(logger logger.Logger, primaryNodes []Node, sendOnlyNodes []SendOnlyNode, chainID *big.Int) (*client, error)

NewClientWithNodes instantiates a client from a list of nodes Currently only supports one primary

func ReceiptIndicatesRunLogFulfillment added in v1.1.0

func ReceiptIndicatesRunLogFulfillment(txr types.Receipt) bool

ReceiptIndicatesRunLogFulfillment returns true if this tx receipt is the result of a fulfilled run log.

func ToBlockNumArg added in v1.1.0

func ToBlockNumArg(number *big.Int) string

Types

type CallArgs added in v0.8.8

type CallArgs struct {
	To   common.Address `json:"to"`
	Data hexutil.Bytes  `json:"data"`
}

CallArgs represents the data used to call the balance method of a contract. "To" is the address of the ERC contract. "Data" is the message sent to the contract.

type Client added in v0.8.8

type Client interface {
	Dial(ctx context.Context) error
	Close()
	ChainID() *big.Int

	GetERC20Balance(address common.Address, contractAddress common.Address) (*big.Int, error)
	GetLINKBalance(linkAddress common.Address, address common.Address) (*assets.Link, error)
	GetEthBalance(ctx context.Context, account common.Address, blockNumber *big.Int) (*assets.Eth, error)

	// Wrapped RPC methods
	Call(result interface{}, method string, args ...interface{}) error
	CallContext(ctx context.Context, result interface{}, method string, args ...interface{}) error
	BatchCallContext(ctx context.Context, b []rpc.BatchElem) error

	// HeadByNumber is a reimplemented version of HeaderByNumber due to a
	// difference in how block header hashes are calculated by Parity nodes
	// running on Kovan.  We have to return our own wrapper type to capture the
	// correct hash from the RPC response.
	HeadByNumber(ctx context.Context, n *big.Int) (*Head, error)
	SubscribeNewHead(ctx context.Context, ch chan<- *Head) (ethereum.Subscription, error)

	// Wrapped Geth client methods
	SendTransaction(ctx context.Context, tx *types.Transaction) error
	PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error)
	PendingNonceAt(ctx context.Context, account common.Address) (uint64, error)
	NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error)
	TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error)
	BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error)
	BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error)
	FilterLogs(ctx context.Context, q ethereum.FilterQuery) ([]types.Log, error)
	SubscribeFilterLogs(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error)
	EstimateGas(ctx context.Context, call ethereum.CallMsg) (uint64, error)
	SuggestGasPrice(ctx context.Context) (*big.Int, error)
	CallContract(ctx context.Context, msg ethereum.CallMsg, blockNumber *big.Int) ([]byte, error)
	CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error)

	// bind.ContractBackend methods
	HeaderByNumber(context.Context, *big.Int) (*types.Header, error)
	SuggestGasTipCap(ctx context.Context) (*big.Int, error)
}

Client is the interface used to interact with an ethereum node.

type ClientErrors added in v0.10.9

type ClientErrors = map[int]*regexp.Regexp

type FunctionSelector added in v1.1.0

type FunctionSelector [FunctionSelectorLength]byte

FunctionSelector is the first four bytes of the call data for a function call and specifies the function to be called.

func BytesToFunctionSelector added in v1.1.0

func BytesToFunctionSelector(b []byte) FunctionSelector

BytesToFunctionSelector converts the given bytes to a FunctionSelector.

func HexToFunctionSelector added in v1.1.0

func HexToFunctionSelector(s string) FunctionSelector

HexToFunctionSelector converts the given string to a FunctionSelector.

func (FunctionSelector) Bytes added in v1.1.0

func (f FunctionSelector) Bytes() []byte

Bytes returns the FunctionSelector as a byte slice

func (FunctionSelector) MarshalJSON added in v1.1.0

func (f FunctionSelector) MarshalJSON() ([]byte, error)

MarshalJSON returns the JSON encoding of f

func (*FunctionSelector) Scan added in v1.1.0

func (f *FunctionSelector) Scan(value interface{}) error

Scan returns the selector from its serialization in the database

func (*FunctionSelector) SetBytes added in v1.1.0

func (f *FunctionSelector) SetBytes(b []byte)

SetBytes sets the FunctionSelector to that of the given bytes (will trim).

func (FunctionSelector) String added in v1.1.0

func (f FunctionSelector) String() string

String returns the FunctionSelector as a string type.

func (*FunctionSelector) UnmarshalJSON added in v1.1.0

func (f *FunctionSelector) UnmarshalJSON(input []byte) error

UnmarshalJSON parses the raw FunctionSelector and sets the FunctionSelector type to the given input.

func (FunctionSelector) Value added in v1.1.0

func (f FunctionSelector) Value() (driver.Value, error)

Value returns this instance serialized for database storage

type Head struct {
	ID            uint64
	Hash          common.Hash
	Number        int64
	L1BlockNumber null.Int64
	ParentHash    common.Hash
	Parent        *Head
	EVMChainID    *utils.Big
	Timestamp     time.Time
	CreatedAt     time.Time
	BaseFeePerGas *utils.Big
}

Head represents a BlockNumber, BlockHash.

func AsHead added in v1.1.0

func AsHead(i interface{}) *Head

func NewHead added in v1.1.0

func NewHead(number *big.Int, blockHash common.Hash, parentHash common.Hash, timestamp uint64, chainID *utils.Big) Head

NewHead returns a Head instance.

func (*Head) ChainHashes added in v1.1.0

func (h *Head) ChainHashes() []common.Hash

ChainHashes returns an array of block hashes by recursively looking up parents

func (*Head) ChainLength added in v1.1.0

func (h *Head) ChainLength() uint32

ChainLength returns the length of the chain followed by recursively looking up parents

func (*Head) ChainString added in v1.1.0

func (h *Head) ChainString() string

func (*Head) EarliestInChain added in v1.1.0

func (h *Head) EarliestInChain() *Head

EarliestInChain recurses through parents until it finds the earliest one

func (*Head) GreaterThan added in v1.1.0

func (h *Head) GreaterThan(r *Head) bool

GreaterThan compares BlockNumbers and returns true if the receiver BlockNumber is greater than the supplied BlockNumber

func (*Head) HashAtHeight added in v1.1.0

func (h *Head) HashAtHeight(blockNum int64) common.Hash

HashAtHeight returns the hash of the block at the given heigh, if it is in the chain. If not in chain, returns the zero hash

func (*Head) IsInChain added in v1.1.0

func (h *Head) IsInChain(blockHash common.Hash) bool

IsInChain returns true if the given hash matches the hash of a head in the chain

func (*Head) MarshalJSON added in v1.1.0

func (h *Head) MarshalJSON() ([]byte, error)

func (*Head) NextInt added in v1.1.0

func (h *Head) NextInt() *big.Int

NextInt returns the next BlockNumber as big.int, or nil if nil to represent latest.

func (Head) String added in v1.1.0

func (h Head) String() string

String returns a string representation of this head

func (*Head) ToInt added in v1.1.0

func (h *Head) ToInt() *big.Int

ToInt return the height as a *big.Int. Also handles nil by returning nil.

func (*Head) UnmarshalJSON added in v1.1.0

func (h *Head) UnmarshalJSON(bs []byte) error

type JsonError added in v0.10.7

type JsonError struct {
	Code    int         `json:"code"`
	Message string      `json:"message"`
	Data    interface{} `json:"data,omitempty"`
}

go-ethereum@v1.10.0/rpc/json.go

func ExtractRPCError added in v1.1.0

func ExtractRPCError(err error) *JsonError

func (*JsonError) Error added in v0.10.7

func (err *JsonError) Error() string

func (*JsonError) String added in v1.1.0

func (err *JsonError) String() string

type Node added in v1.1.0

type Node interface {
	Dial(ctx context.Context) error
	Close()
	Verify(ctx context.Context, expectedChainID *big.Int) (err error)

	State() NodeState

	CallContext(ctx context.Context, result interface{}, method string, args ...interface{}) error
	BatchCallContext(ctx context.Context, b []rpc.BatchElem) error
	SendTransaction(ctx context.Context, tx *types.Transaction) error
	PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error)
	PendingNonceAt(ctx context.Context, account common.Address) (uint64, error)
	NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error)
	TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error)
	BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error)
	BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error)
	FilterLogs(ctx context.Context, q ethereum.FilterQuery) ([]types.Log, error)
	SubscribeFilterLogs(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error)
	EstimateGas(ctx context.Context, call ethereum.CallMsg) (uint64, error)
	SuggestGasPrice(ctx context.Context) (*big.Int, error)
	CallContract(ctx context.Context, msg ethereum.CallMsg, blockNumber *big.Int) ([]byte, error)
	CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error)
	HeaderByNumber(context.Context, *big.Int) (*types.Header, error)
	SuggestGasTipCap(ctx context.Context) (*big.Int, error)
	EthSubscribe(ctx context.Context, channel interface{}, args ...interface{}) (ethereum.Subscription, error)
	ChainID(ctx context.Context) (chainID *big.Int, err error)

	String() string
}

func NewNode added in v1.1.0

func NewNode(lggr logger.Logger, wsuri url.URL, httpuri *url.URL, name string) Node

type NodeState added in v1.1.0

type NodeState int

type NullClient added in v0.9.3

type NullClient struct {
	// contains filtered or unexported fields
}

NullClient satisfies the Client but has no side effects

func NewNullClient added in v1.1.0

func NewNullClient(cid *big.Int, lggr logger.Logger) *NullClient

func (*NullClient) BalanceAt added in v0.9.3

func (nc *NullClient) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error)

func (*NullClient) BatchCallContext added in v0.10.0

func (nc *NullClient) BatchCallContext(ctx context.Context, b []rpc.BatchElem) error

func (*NullClient) BlockByNumber added in v0.9.3

func (nc *NullClient) BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error)

func (*NullClient) Call added in v0.9.3

func (nc *NullClient) Call(result interface{}, method string, args ...interface{}) error

func (*NullClient) CallContext added in v0.9.3

func (nc *NullClient) CallContext(ctx context.Context, result interface{}, method string, args ...interface{}) error

func (*NullClient) CallContract added in v0.9.3

func (nc *NullClient) CallContract(ctx context.Context, msg ethereum.CallMsg, blockNumber *big.Int) ([]byte, error)

func (*NullClient) ChainID added in v0.9.3

func (nc *NullClient) ChainID() *big.Int

func (*NullClient) Close added in v0.9.3

func (nc *NullClient) Close()

func (*NullClient) CodeAt added in v0.9.3

func (nc *NullClient) CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error)

func (*NullClient) Dial added in v0.9.3

func (nc *NullClient) Dial(context.Context) error

func (*NullClient) EstimateGas added in v0.9.3

func (nc *NullClient) EstimateGas(ctx context.Context, call ethereum.CallMsg) (uint64, error)

func (*NullClient) FilterLogs added in v0.9.3

func (nc *NullClient) FilterLogs(ctx context.Context, q ethereum.FilterQuery) ([]types.Log, error)

func (*NullClient) GetERC20Balance added in v0.9.3

func (nc *NullClient) GetERC20Balance(address common.Address, contractAddress common.Address) (*big.Int, error)

func (*NullClient) GetEthBalance added in v0.9.9

func (nc *NullClient) GetEthBalance(context.Context, common.Address, *big.Int) (*assets.Eth, error)

func (*NullClient) GetLINKBalance added in v0.9.6

func (nc *NullClient) GetLINKBalance(linkAddress common.Address, address common.Address) (*assets.Link, error)

func (*NullClient) HeadByNumber added in v0.10.10

func (nc *NullClient) HeadByNumber(ctx context.Context, n *big.Int) (*Head, error)

func (*NullClient) HeaderByNumber added in v0.9.3

func (nc *NullClient) HeaderByNumber(ctx context.Context, n *big.Int) (*types.Header, error)

func (*NullClient) NonceAt added in v0.10.6

func (nc *NullClient) NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error)

func (*NullClient) PendingCodeAt added in v0.9.3

func (nc *NullClient) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error)

func (*NullClient) PendingNonceAt added in v0.9.3

func (nc *NullClient) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error)

func (*NullClient) SendTransaction added in v0.9.3

func (nc *NullClient) SendTransaction(ctx context.Context, tx *types.Transaction) error

func (*NullClient) SubscribeFilterLogs added in v0.9.3

func (nc *NullClient) SubscribeFilterLogs(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error)

func (*NullClient) SubscribeNewHead added in v0.9.3

func (nc *NullClient) SubscribeNewHead(ctx context.Context, ch chan<- *Head) (ethereum.Subscription, error)

func (*NullClient) SuggestGasPrice added in v0.9.3

func (nc *NullClient) SuggestGasPrice(ctx context.Context) (*big.Int, error)

func (*NullClient) SuggestGasTipCap added in v0.10.10

func (nc *NullClient) SuggestGasTipCap(ctx context.Context) (tipCap *big.Int, err error)

func (*NullClient) TransactionReceipt added in v0.9.3

func (nc *NullClient) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error)

type Pool added in v1.1.0

type Pool struct {
	utils.StartStopOnce
	// contains filtered or unexported fields
}

Pool represents an abstraction over one or more primary nodes It is responsible for liveness checking and balancing queries across live nodes

func NewPool added in v1.1.0

func NewPool(logger logger.Logger, nodes []Node, sendonlys []SendOnlyNode, chainID *big.Int) *Pool

func (*Pool) BalanceAt added in v1.1.0

func (p *Pool) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error)

func (*Pool) BatchCallContext added in v1.1.0

func (p *Pool) BatchCallContext(ctx context.Context, b []rpc.BatchElem) error

func (*Pool) BlockByNumber added in v1.1.0

func (p *Pool) BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error)

func (*Pool) CallContext added in v1.1.0

func (p *Pool) CallContext(ctx context.Context, result interface{}, method string, args ...interface{}) error

func (*Pool) CallContract added in v1.1.0

func (p *Pool) CallContract(ctx context.Context, msg ethereum.CallMsg, blockNumber *big.Int) ([]byte, error)

func (*Pool) ChainID added in v1.1.0

func (p *Pool) ChainID() *big.Int

func (*Pool) Close added in v1.1.0

func (p *Pool) Close()

func (*Pool) CodeAt added in v1.1.0

func (p *Pool) CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error)

func (*Pool) Dial added in v1.1.0

func (p *Pool) Dial(ctx context.Context) error

Dial dials every node in the pool and verifies their chain IDs are consistent.

func (*Pool) EstimateGas added in v1.1.0

func (p *Pool) EstimateGas(ctx context.Context, call ethereum.CallMsg) (uint64, error)

func (*Pool) EthSubscribe added in v1.1.0

func (p *Pool) EthSubscribe(ctx context.Context, channel interface{}, args ...interface{}) (ethereum.Subscription, error)

func (*Pool) FilterLogs added in v1.1.0

func (p *Pool) FilterLogs(ctx context.Context, q ethereum.FilterQuery) ([]types.Log, error)

func (*Pool) HeaderByNumber added in v1.1.0

func (p *Pool) HeaderByNumber(ctx context.Context, n *big.Int) (*types.Header, error)

bind.ContractBackend methods

func (*Pool) NonceAt added in v1.1.0

func (p *Pool) NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error)

func (*Pool) PendingCodeAt added in v1.1.0

func (p *Pool) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error)

func (*Pool) PendingNonceAt added in v1.1.0

func (p *Pool) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error)

func (*Pool) SendTransaction added in v1.1.0

func (p *Pool) SendTransaction(ctx context.Context, tx *types.Transaction) error

Wrapped Geth client methods

func (*Pool) SubscribeFilterLogs added in v1.1.0

func (p *Pool) SubscribeFilterLogs(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error)

func (*Pool) SuggestGasPrice added in v1.1.0

func (p *Pool) SuggestGasPrice(ctx context.Context) (*big.Int, error)

func (*Pool) SuggestGasTipCap added in v1.1.0

func (p *Pool) SuggestGasTipCap(ctx context.Context) (*big.Int, error)

func (*Pool) TransactionReceipt added in v1.1.0

func (p *Pool) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error)

type SendError added in v0.9.0

type SendError struct {
	// contains filtered or unexported fields
}

fatal means this transaction can never be accepted even with a different nonce or higher gas price

func NewFatalSendError added in v0.9.0

func NewFatalSendError(e error) *SendError

func NewSendError added in v0.9.0

func NewSendError(e error) *SendError

func NewSendErrorS added in v0.9.0

func NewSendErrorS(s string) *SendError

func (*SendError) CauseStr added in v0.10.6

func (s *SendError) CauseStr() string

CauseStr returns the string of the original error

func (*SendError) Error added in v0.9.0

func (s *SendError) Error() string

func (*SendError) Fatal added in v0.9.0

func (s *SendError) Fatal() bool

Fatal indicates whether the error should be considered fatal or not Fatal errors mean that no matter how many times the send is retried, no node will ever accept it

func (*SendError) IsFeeTooHigh added in v0.10.10

func (s *SendError) IsFeeTooHigh() bool

IsFeeTooHigh is an optimism-specific error returned when total fee is too high

func (*SendError) IsFeeTooLow added in v0.10.10

func (s *SendError) IsFeeTooLow() bool

IsFeeTooLow is an optimism-specific error returned when total fee is too low

func (*SendError) IsInsufficientEth added in v0.9.0

func (s *SendError) IsInsufficientEth() bool

func (*SendError) IsNonceTooLowError added in v0.9.0

func (s *SendError) IsNonceTooLowError() bool

func (*SendError) IsReplacementUnderpriced added in v0.9.0

func (s *SendError) IsReplacementUnderpriced() bool

IsReplacementUnderpriced indicates that a transaction already exists in the mempool with this nonce but a different gas price or payload

func (*SendError) IsTemporarilyUnderpriced added in v0.9.0

func (s *SendError) IsTemporarilyUnderpriced() bool

func (*SendError) IsTerminallyUnderpriced added in v0.9.0

func (s *SendError) IsTerminallyUnderpriced() bool

IsTerminallyUnderpriced indicates that this transaction is so far underpriced the node won't even accept it in the first place

func (*SendError) IsTooExpensive added in v0.10.3

func (s *SendError) IsTooExpensive() bool

IsTooExpensive returns true if the transaction and gas price are combined in some way that makes the total transaction too expensive for the eth node to accept at all. No amount of retrying at this or higher gas prices can ever succeed.

func (*SendError) IsTransactionAlreadyInMempool added in v0.9.0

func (s *SendError) IsTransactionAlreadyInMempool() bool

Geth/parity returns this error if the transaction is already in the node's mempool

type SendOnlyNode added in v1.1.0

type SendOnlyNode interface {
	Dial(context.Context) error
	Verify(ctx context.Context, expectedChainID *big.Int) (err error)
	ChainID(ctx context.Context) (chainID *big.Int, err error)

	SendTransaction(ctx context.Context, tx *types.Transaction) error
	BatchCallContext(ctx context.Context, b []rpc.BatchElem) error

	String() string
}

SendOnlyNode represents one ethereum node used as a sendonly

func NewSendOnlyNode added in v1.1.0

func NewSendOnlyNode(lggr logger.Logger, httpuri url.URL, name string) SendOnlyNode

type Subscription added in v0.8.8

type Subscription interface {
	Err() <-chan error
	Unsubscribe()
}

This interface only exists so that we can generate a mock for it. It is identical to `ethereum.Subscription`.

type UntrustedBytes added in v1.1.0

type UntrustedBytes []byte

This data can contain anything and is submitted by user on-chain, so we must be extra careful how we interact with it

func (UntrustedBytes) SafeByteSlice added in v1.1.0

func (ary UntrustedBytes) SafeByteSlice(start int, end int) ([]byte, error)

SafeByteSlice returns an error on out of bounds access to a byte array, where a normal slice would panic instead

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL