round trip receipt
This commit is contained in:
parent
1e3eae57ce
commit
660539b3bf
@ -38,10 +38,9 @@ type HealthzConfig struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type WalletConfig struct {
|
type WalletConfig struct {
|
||||||
// default: 420 (Optimism Goerli)
|
|
||||||
ChainID big.Int `toml:"chain_id"`
|
ChainID big.Int `toml:"chain_id"`
|
||||||
|
|
||||||
// signer | static, default: signer
|
// signer | static
|
||||||
SignerMethod string `toml:"signer_method"`
|
SignerMethod string `toml:"signer_method"`
|
||||||
Address string `toml:"address"`
|
Address string `toml:"address"`
|
||||||
// private key is used for static signing
|
// private key is used for static signing
|
||||||
@ -55,12 +54,14 @@ type WalletConfig struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ProviderConfig struct {
|
type ProviderConfig struct {
|
||||||
Disabled bool `toml:"disabled"`
|
Disabled bool `toml:"disabled"`
|
||||||
URL string `toml:"url"`
|
URL string `toml:"url"`
|
||||||
Wallet string `toml:"wallet"`
|
ReadOnly bool `toml:"read_only"`
|
||||||
ReadOnly bool `toml:"read_only"`
|
ReadInterval TOMLDuration `toml:"read_interval"`
|
||||||
ReadInterval TOMLDuration `toml:"read_interval"`
|
SendInterval TOMLDuration `toml:"send_interval"`
|
||||||
SendInterval TOMLDuration `toml:"send_interval"`
|
Wallet string `toml:"wallet"`
|
||||||
|
ReceiptRetrievalInterval TOMLDuration `toml:"receipt_retrieval_interval"`
|
||||||
|
ReceiptRetrievalTimeout TOMLDuration `toml:"receipt_retrieval_timeout"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(file string) (*Config, error) {
|
func New(file string) (*Config, error) {
|
||||||
@ -120,6 +121,15 @@ func (c *Config) Validate() error {
|
|||||||
if wallet.Address == "" {
|
if wallet.Address == "" {
|
||||||
return errors.Errorf("wallet [%s] address is missing", name)
|
return errors.Errorf("wallet [%s] address is missing", name)
|
||||||
}
|
}
|
||||||
|
if wallet.TxValue.BitLen() == 0 {
|
||||||
|
return errors.Errorf("wallet [%s] tx_value is missing", name)
|
||||||
|
}
|
||||||
|
if wallet.GasLimit == 0 {
|
||||||
|
return errors.Errorf("wallet [%s] gas_limit is missing", name)
|
||||||
|
}
|
||||||
|
if wallet.GasFeeCap.BitLen() == 0 {
|
||||||
|
return errors.Errorf("wallet [%s] gas_fee_cap is missing", name)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for name, provider := range c.Providers {
|
for name, provider := range c.Providers {
|
||||||
@ -127,14 +137,20 @@ func (c *Config) Validate() error {
|
|||||||
return errors.Errorf("provider [%s] url is missing", name)
|
return errors.Errorf("provider [%s] url is missing", name)
|
||||||
}
|
}
|
||||||
if provider.ReadInterval == 0 {
|
if provider.ReadInterval == 0 {
|
||||||
return errors.Errorf("provider [%s] read interval is missing", name)
|
return errors.Errorf("provider [%s] read_interval is missing", name)
|
||||||
}
|
}
|
||||||
if provider.SendInterval == 0 {
|
if provider.SendInterval == 0 {
|
||||||
return errors.Errorf("provider [%s] send interval is missing", name)
|
return errors.Errorf("provider [%s] send_interval is missing", name)
|
||||||
}
|
}
|
||||||
if provider.Wallet == "" {
|
if provider.Wallet == "" {
|
||||||
return errors.Errorf("provider [%s] wallet is missing", name)
|
return errors.Errorf("provider [%s] wallet is missing", name)
|
||||||
}
|
}
|
||||||
|
if provider.SendInterval == 0 {
|
||||||
|
return errors.Errorf("provider [%s] receipt_retrieval_interval is missing", name)
|
||||||
|
}
|
||||||
|
if provider.SendInterval == 0 {
|
||||||
|
return errors.Errorf("provider [%s] receipt_retrieval_timeout is missing", name)
|
||||||
|
}
|
||||||
if _, ok := c.Wallets[provider.Wallet]; !ok {
|
if _, ok := c.Wallets[provider.Wallet]; !ok {
|
||||||
return errors.Errorf("provider [%s] has an invalid wallet [%s]", name, provider.Wallet)
|
return errors.Errorf("provider [%s] has an invalid wallet [%s]", name, provider.Wallet)
|
||||||
}
|
}
|
||||||
|
@ -2,9 +2,11 @@ package provider
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/ethereum-optimism/optimism/op-service/tls"
|
"github.com/ethereum-optimism/optimism/op-service/tls"
|
||||||
signer "github.com/ethereum-optimism/optimism/op-signer/client"
|
signer "github.com/ethereum-optimism/optimism/op-signer/client"
|
||||||
|
"github.com/ethereum/go-ethereum"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/ethereum/go-ethereum/ethclient"
|
"github.com/ethereum/go-ethereum/ethclient"
|
||||||
@ -39,7 +41,35 @@ func (p *Provider) Heartbeat(ctx context.Context) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("cant send transaction", "provider", p.name, "err", err)
|
log.Error("cant send transaction", "provider", p.name, "err", err)
|
||||||
}
|
}
|
||||||
log.Info("transaction sent", "hash", signedTx.Hash().Hex())
|
txHash := signedTx.Hash()
|
||||||
|
log.Info("transaction sent", "hash", txHash.Hex())
|
||||||
|
|
||||||
|
sentAt := time.Now()
|
||||||
|
var receipt *types.Receipt
|
||||||
|
attempt := 0
|
||||||
|
for receipt == nil {
|
||||||
|
if time.Since(sentAt) >= time.Duration(p.config.ReceiptRetrievalTimeout) {
|
||||||
|
log.Error("receipt retrieval timedout", "provider", p.name, "hash", "ellapsed", time.Since(sentAt))
|
||||||
|
break
|
||||||
|
}
|
||||||
|
time.Sleep(time.Duration(p.config.ReceiptRetrievalInterval))
|
||||||
|
if attempt%10 == 0 {
|
||||||
|
log.Debug("checking for receipt...", "attempt", attempt, "ellapsed", time.Since(sentAt))
|
||||||
|
}
|
||||||
|
receipt, err = ethClient.TransactionReceipt(ctx, txHash)
|
||||||
|
if err != nil && !errors.Is(err, ethereum.NotFound) {
|
||||||
|
log.Error("cant get receipt for transaction", "provider", p.name, "hash", txHash.Hex(), "err", err)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
attempt++
|
||||||
|
}
|
||||||
|
roundtrip := time.Since(sentAt)
|
||||||
|
|
||||||
|
log.Info("got transaction receipt", "hash", txHash.Hex(),
|
||||||
|
"roundtrip", roundtrip,
|
||||||
|
"blockNumber", receipt.BlockNumber,
|
||||||
|
"blockHash", receipt.BlockHash,
|
||||||
|
"gasUsed", receipt.GasUsed)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Provider) dial(ctx context.Context) (*ethclient.Client, error) {
|
func (p *Provider) dial(ctx context.Context) (*ethclient.Client, error) {
|
||||||
|
Loading…
Reference in New Issue
Block a user