46 lines
1.4 KiB
Go
46 lines
1.4 KiB
Go
package optimism
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/ethereum/go-ethereum/rpc"
|
|
"github.com/trezor/blockbook/bchain"
|
|
)
|
|
|
|
// OptimismRPCClient wraps an rpc client to implement the EVMRPCClient interface
|
|
type OptimismRPCClient struct {
|
|
*rpc.Client
|
|
}
|
|
|
|
// EthSubscribe subscribes to events and returns a client subscription that implements the EVMClientSubscription interface
|
|
func (c *OptimismRPCClient) EthSubscribe(ctx context.Context, channel interface{}, args ...interface{}) (bchain.EVMClientSubscription, error) {
|
|
sub, err := c.Client.EthSubscribe(ctx, channel, args...)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &OptimismClientSubscription{ClientSubscription: sub}, nil
|
|
}
|
|
|
|
// CallContext performs a JSON-RPC call with the given arguments
|
|
func (c *OptimismRPCClient) CallContext(ctx context.Context, result interface{}, method string, args ...interface{}) error {
|
|
if err := c.Client.CallContext(ctx, result, method, args...); err != nil {
|
|
return err
|
|
}
|
|
|
|
// special case to handle empty gas price for a valid rpc transaction
|
|
// (https://goerli-optimism.etherscan.io/tx/0x9b62094073147508471e3371920b68070979beea32100acdc49c721350b69cb9)
|
|
if r, ok := result.(*bchain.RpcTransaction); ok {
|
|
if *r != (bchain.RpcTransaction{}) && r.GasPrice == "" {
|
|
r.GasPrice = "0x0"
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// OptimismClientSubscription wraps a client subcription to implement the EVMClientSubscription interface
|
|
type OptimismClientSubscription struct {
|
|
*rpc.ClientSubscription
|
|
}
|