From 2492a9598ede3873ec846591acc32eab786442db Mon Sep 17 00:00:00 2001 From: Rafal Leszko Date: Thu, 24 Feb 2022 11:43:50 +0100 Subject: [PATCH 1/5] eth,cmd: Add timeout while waiting for the transaction receipt in `client.CheckTx()` --- cmd/devtool/devtool.go | 6 ++++-- cmd/livepeer/livepeer.go | 1 + eth/client.go | 9 ++++++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/cmd/devtool/devtool.go b/cmd/devtool/devtool.go index 8c9988d682..858a805076 100644 --- a/cmd/devtool/devtool.go +++ b/cmd/devtool/devtool.go @@ -31,7 +31,7 @@ const ( ) var ( - ethTxTimeout = 600 * time.Second + ethTxTimeout = 5 * time.Minute endpoint = "http://localhost:8545/" gethMiningAccount = "87da6a8c6e9eff15d703fc2773e32f6af8dbe301" gethMiningAccountOverride = false @@ -188,7 +188,8 @@ func ethSetup(ethAcctAddr, keystoreDir string, isBroadcaster bool) { return } - tm := eth.NewTransactionManager(backend, gpm, am, 5*time.Minute, 0) + maxTxReplacements := 0 + tm := eth.NewTransactionManager(backend, gpm, am, ethTxTimeout, maxTxReplacements) go tm.Start() defer tm.Stop() @@ -199,6 +200,7 @@ func ethSetup(ethAcctAddr, keystoreDir string, isBroadcaster bool) { GasPriceMonitor: gpm, TransactionManager: tm, Signer: types.LatestSignerForChainID(chainID), + CheckTxTimeout: time.Duration(int64(ethTxTimeout) * int64(maxTxReplacements+1)), } client, err := eth.NewClient(ethCfg) diff --git a/cmd/livepeer/livepeer.go b/cmd/livepeer/livepeer.go index 710912074c..f82747bc0f 100644 --- a/cmd/livepeer/livepeer.go +++ b/cmd/livepeer/livepeer.go @@ -478,6 +478,7 @@ func main() { GasPriceMonitor: gpm, TransactionManager: tm, Signer: types.LatestSignerForChainID(chainID), + CheckTxTimeout: time.Duration(int64(*txTimeout) * int64(*maxTxReplacements+1)), } client, err := eth.NewClient(ethCfg) diff --git a/eth/client.go b/eth/client.go index 1e9ed240c4..3618dd8b67 100644 --- a/eth/client.go +++ b/eth/client.go @@ -155,7 +155,7 @@ type client struct { gasLimit uint64 gasPrice *big.Int - txTimeout time.Duration + checkTxTimeout time.Duration } type LivepeerEthClientConfig struct { @@ -165,6 +165,7 @@ type LivepeerEthClientConfig struct { TransactionManager *TransactionManager Signer types.Signer ControllerAddr ethcommon.Address + CheckTxTimeout time.Duration } func NewClient(cfg LivepeerEthClientConfig) (LivepeerEthClient, error) { @@ -176,6 +177,7 @@ func NewClient(cfg LivepeerEthClientConfig) (LivepeerEthClient, error) { backend: backend, tm: cfg.TransactionManager, controllerAddr: cfg.ControllerAddr, + checkTxTimeout: cfg.CheckTxTimeout, }, nil } @@ -1099,8 +1101,13 @@ func (c *client) CheckTx(tx *types.Transaction) error { txSub := c.tm.Subscribe(receipts) defer txSub.Unsubscribe() + timer := time.NewTimer(c.checkTxTimeout) + defer timer.Stop() + for { select { + case <-timer.C: + return fmt.Errorf("timed out waiting for transaction receipt txHash=%v", tx.Hash().Hex()) case err := <-txSub.Err(): return err case receipt := <-receipts: From 357a1f9d75b16b2de4b8ac1d9d3b9bf9db0e75ab Mon Sep 17 00:00:00 2001 From: Rafal Leszko Date: Thu, 24 Feb 2022 13:07:45 +0100 Subject: [PATCH 2/5] eth: Add timeout for all ETH RPC calls --- eth/client.go | 94 +++++++++++++++++++++++++++++---------------------- 1 file changed, 54 insertions(+), 40 deletions(-) diff --git a/eth/client.go b/eth/client.go index 3618dd8b67..f34ee4fc71 100644 --- a/eth/client.go +++ b/eth/client.go @@ -39,6 +39,7 @@ var ( ErrReplacingMinedTx = fmt.Errorf("trying to replace already mined tx") ErrCurrentRoundLocked = fmt.Errorf("current round locked") ErrMissingBackend = fmt.Errorf("missing Ethereum client backend") + ethRpcTimeout = 5 * time.Minute ) type LivepeerEthClient interface { @@ -395,9 +396,22 @@ func (c *client) transactOpts() *bind.TransactOpts { opts := c.transOpts c.transOptsMu.RUnlock() + opts.Context = newEthRpcContext() + return &opts } +func (c *client) callOpts() *bind.CallOpts { + return &bind.CallOpts{ + Context: newEthRpcContext(), + } +} + +func newEthRpcContext() context.Context { + ctx, _ := context.WithTimeout(context.Background(), ethRpcTimeout) + return ctx +} + func (c *client) Account() accounts.Account { return c.accountManager.Account() } @@ -408,16 +422,16 @@ func (c *client) Backend() Backend { // Controller func (c *client) GetContract(hash ethcommon.Hash) (ethcommon.Address, error) { - return c.controllerSess.GetContract(hash) + return c.controllerSess.Contract.GetContract(c.callOpts(), hash) } func (c *client) Paused() (bool, error) { - return c.controllerSess.Paused() + return c.controllerSess.Contract.Paused(c.callOpts()) } // Rounds func (c *client) InitializeRound() (*types.Transaction, error) { - i, err := c.roundsManagerSess.CurrentRoundInitialized() + i, err := c.roundsManagerSess.Contract.CurrentRoundInitialized(c.callOpts()) if err != nil { return nil, err } @@ -430,56 +444,56 @@ func (c *client) InitializeRound() (*types.Transaction, error) { } func (c *client) CurrentRound() (*big.Int, error) { - return c.roundsManagerSess.CurrentRound() + return c.roundsManagerSess.Contract.CurrentRound(c.callOpts()) } func (c *client) CurrentRoundLocked() (bool, error) { - return c.roundsManagerSess.CurrentRoundLocked() + return c.roundsManagerSess.Contract.CurrentRoundLocked(c.callOpts()) } func (c *client) LastInitializedRound() (*big.Int, error) { - return c.roundsManagerSess.LastInitializedRound() + return c.roundsManagerSess.Contract.LastInitializedRound(c.callOpts()) } func (c *client) BlockHashForRound(round *big.Int) ([32]byte, error) { - return c.roundsManagerSess.BlockHashForRound(round) + return c.roundsManagerSess.Contract.BlockHashForRound(c.callOpts(), round) } func (c *client) CurrentRoundInitialized() (bool, error) { - return c.roundsManagerSess.CurrentRoundInitialized() + return c.roundsManagerSess.Contract.CurrentRoundInitialized(c.callOpts()) } func (c *client) CurrentRoundStartBlock() (*big.Int, error) { - return c.roundsManagerSess.CurrentRoundStartBlock() + return c.roundsManagerSess.Contract.CurrentRoundStartBlock(c.callOpts()) } func (c *client) RoundLength() (*big.Int, error) { - return c.roundsManagerSess.RoundLength() + return c.roundsManagerSess.Contract.RoundLength(c.callOpts()) } func (c *client) RoundLockAmount() (*big.Int, error) { - return c.roundsManagerSess.RoundLockAmount() + return c.roundsManagerSess.Contract.RoundLockAmount(c.callOpts()) } // Minter func (c *client) Inflation() (*big.Int, error) { - return c.minterSess.Inflation() + return c.minterSess.Contract.Inflation(c.callOpts()) } func (c *client) InflationChange() (*big.Int, error) { - return c.minterSess.InflationChange() + return c.minterSess.Contract.InflationChange(c.callOpts()) } func (c *client) TargetBondingRate() (*big.Int, error) { - return c.minterSess.TargetBondingRate() + return c.minterSess.Contract.TargetBondingRate(c.callOpts()) } func (c *client) GetGlobalTotalSupply() (*big.Int, error) { - return c.minterSess.GetGlobalTotalSupply() + return c.minterSess.Contract.GetGlobalTotalSupply(c.callOpts()) } func (c *client) CurrentMintableTokens() (*big.Int, error) { - return c.minterSess.CurrentMintableTokens() + return c.minterSess.Contract.CurrentMintableTokens(c.callOpts()) } // Token @@ -488,7 +502,7 @@ func (c *client) Transfer(toAddr ethcommon.Address, amount *big.Int) (*types.Tra } func (c *client) Allowance(owner ethcommon.Address, spender ethcommon.Address) (*big.Int, error) { - return c.livepeerTokenSess.Allowance(owner, spender) + return c.livepeerTokenSess.Contract.Allowance(c.callOpts(), owner, spender) } func (c *client) Request() (*types.Transaction, error) { @@ -496,15 +510,15 @@ func (c *client) Request() (*types.Transaction, error) { } func (c *client) BalanceOf(address ethcommon.Address) (*big.Int, error) { - return c.livepeerTokenSess.BalanceOf(address) + return c.livepeerTokenSess.Contract.BalanceOf(c.callOpts(), address) } func (c *client) TotalSupply() (*big.Int, error) { - return c.livepeerTokenSess.TotalSupply() + return c.livepeerTokenSess.Contract.TotalSupply(c.callOpts()) } func (c *client) NextValidRequest(addr ethcommon.Address) (*big.Int, error) { - return c.livepeerTokenFaucetSess.NextValidRequest(addr) + return c.livepeerTokenFaucetSess.Contract.NextValidRequest(c.callOpts(), addr) } // Service Registry @@ -513,7 +527,7 @@ func (c *client) SetServiceURI(serviceURI string) (*types.Transaction, error) { } func (c *client) GetServiceURI(addr ethcommon.Address) (string, error) { - return c.serviceRegistrySess.GetServiceURI(addr) + return c.serviceRegistrySess.Contract.GetServiceURI(c.callOpts(), addr) } // Staking @@ -740,55 +754,55 @@ func (c *client) ClaimEarnings(endRound *big.Int) (*types.Transaction, error) { } func (c *client) GetTranscoderPoolMaxSize() (*big.Int, error) { - return c.bondingManagerSess.GetTranscoderPoolMaxSize() + return c.bondingManagerSess.Contract.GetTranscoderPoolMaxSize(c.callOpts()) } func (c *client) TranscoderTotalStake(to ethcommon.Address) (*big.Int, error) { - return c.bondingManagerSess.TranscoderTotalStake(to) + return c.bondingManagerSess.Contract.TranscoderTotalStake(c.callOpts(), to) } func (c *client) GetTotalBonded() (*big.Int, error) { - return c.bondingManagerSess.GetTotalBonded() + return c.bondingManagerSess.Contract.GetTotalBonded(c.callOpts()) } func (c *client) PendingStake(delegator ethcommon.Address, endRound *big.Int) (*big.Int, error) { - return c.bondingManagerSess.PendingStake(delegator, endRound) + return c.bondingManagerSess.Contract.PendingStake(c.callOpts(), delegator, endRound) } func (c *client) TranscoderStatus(transcoder ethcommon.Address) (uint8, error) { - return c.bondingManagerSess.TranscoderStatus(transcoder) + return c.bondingManagerSess.Contract.TranscoderStatus(c.callOpts(), transcoder) } func (c *client) DelegatorStatus(delegator ethcommon.Address) (uint8, error) { - return c.bondingManagerSess.DelegatorStatus(delegator) + return c.bondingManagerSess.Contract.DelegatorStatus(c.callOpts(), delegator) } func (c *client) GetFirstTranscoderInPool() (ethcommon.Address, error) { - return c.bondingManagerSess.GetFirstTranscoderInPool() + return c.bondingManagerSess.Contract.GetFirstTranscoderInPool(c.callOpts()) } func (c *client) PendingFees(delegator ethcommon.Address, endRound *big.Int) (*big.Int, error) { - return c.bondingManagerSess.PendingFees(delegator, endRound) + return c.bondingManagerSess.Contract.PendingFees(c.callOpts(), delegator, endRound) } func (c *client) GetNextTranscoderInPool(transcoder ethcommon.Address) (ethcommon.Address, error) { - return c.bondingManagerSess.GetNextTranscoderInPool(transcoder) + return c.bondingManagerSess.Contract.GetNextTranscoderInPool(c.callOpts(), transcoder) } func (c *client) GetTranscoderPoolSize() (*big.Int, error) { - return c.bondingManagerSess.GetTranscoderPoolSize() + return c.bondingManagerSess.Contract.GetTranscoderPoolSize(c.callOpts()) } func (c *client) UnbondingPeriod() (uint64, error) { - return c.bondingManagerSess.UnbondingPeriod() + return c.bondingManagerSess.Contract.UnbondingPeriod(c.callOpts()) } func (c *client) IsActiveTranscoder() (bool, error) { - return c.bondingManagerSess.IsActiveTranscoder(c.Account().Address) + return c.bondingManagerSess.Contract.IsActiveTranscoder(c.callOpts(), c.Account().Address) } func (c *client) GetTranscoder(addr ethcommon.Address) (*lpTypes.Transcoder, error) { - tInfo, err := c.bondingManagerSess.GetTranscoder(addr) + tInfo, err := c.bondingManagerSess.Contract.GetTranscoder(c.callOpts(), addr) if err != nil { return nil, err } @@ -808,7 +822,7 @@ func (c *client) GetTranscoder(addr ethcommon.Address) (*lpTypes.Transcoder, err return nil, err } - active, err := c.bondingManagerSess.IsActiveTranscoder(addr) + active, err := c.bondingManagerSess.Contract.IsActiveTranscoder(c.callOpts(), addr) if err != nil { return nil, err } @@ -834,7 +848,7 @@ func (c *client) GetTranscoder(addr ethcommon.Address) (*lpTypes.Transcoder, err } func (c *client) GetTranscoderEarningsPoolForRound(addr ethcommon.Address, round *big.Int) (*lpTypes.TokenPools, error) { - tp, err := c.bondingManagerSess.GetTranscoderEarningsPoolForRound(addr, round) + tp, err := c.bondingManagerSess.Contract.GetTranscoderEarningsPoolForRound(c.callOpts(), addr, round) if err != nil { return nil, err } @@ -849,7 +863,7 @@ func (c *client) GetTranscoderEarningsPoolForRound(addr ethcommon.Address, round } func (c *client) GetDelegator(addr ethcommon.Address) (*lpTypes.Delegator, error) { - dInfo, err := c.bondingManagerSess.GetDelegator(addr) + dInfo, err := c.bondingManagerSess.Contract.GetDelegator(c.callOpts(), addr) if err != nil { glog.Errorf("Error getting delegator from bonding manager: %v", err) return nil, err @@ -907,7 +921,7 @@ func (c *client) GetDelegator(addr ethcommon.Address) (*lpTypes.Delegator, error } func (c *client) GetDelegatorUnbondingLock(addr ethcommon.Address, unbondingLockId *big.Int) (*lpTypes.UnbondingLock, error) { - lock, err := c.bondingManagerSess.GetDelegatorUnbondingLock(addr, unbondingLockId) + lock, err := c.bondingManagerSess.Contract.GetDelegatorUnbondingLock(c.callOpts(), addr, unbondingLockId) if err != nil { return nil, err } @@ -934,11 +948,11 @@ func (c *client) Withdraw() (*types.Transaction, error) { } func (c *client) UnlockPeriod() (*big.Int, error) { - return c.ticketBrokerSess.UnlockPeriod() + return c.ticketBrokerSess.Contract.UnlockPeriod(c.callOpts()) } func (c *client) ClaimedReserve(reserveHolder ethcommon.Address, claimant ethcommon.Address) (*big.Int, error) { - return c.ticketBrokerSess.ClaimedReserve(reserveHolder, claimant) + return c.ticketBrokerSess.Contract.ClaimedReserve(c.callOpts(), reserveHolder, claimant) } func (c *client) TranscoderPool() ([]*lpTypes.Transcoder, error) { From 41857d9de2f0aea8104df3fd4648b9ba3b34102b Mon Sep 17 00:00:00 2001 From: Rafal Leszko Date: Thu, 24 Feb 2022 13:20:14 +0100 Subject: [PATCH 3/5] eth: Refactor client to not include contract sessions --- eth/client.go | 182 ++++++++++++++++--------------------- eth/client_ticketbroker.go | 12 +-- 2 files changed, 83 insertions(+), 111 deletions(-) diff --git a/eth/client.go b/eth/client.go index f34ee4fc71..6bbf6d8377 100644 --- a/eth/client.go +++ b/eth/client.go @@ -140,18 +140,18 @@ type client struct { verifierAddr ethcommon.Address faucetAddr ethcommon.Address - // Contract sessions - controllerSess *contracts.ControllerSession - livepeerTokenSess *contracts.LivepeerTokenSession - serviceRegistrySess *contracts.ServiceRegistrySession - bondingManagerSess *contracts.BondingManagerSession - ticketBrokerSess *contracts.TicketBrokerSession - roundsManagerSess *contracts.RoundsManagerSession - minterSess *contracts.MinterSession - livepeerTokenFaucetSess *contracts.LivepeerTokenFaucetSession + // Contracts + controller *contracts.Controller + livepeerToken *contracts.LivepeerToken + serviceRegistry *contracts.ServiceRegistry + bondingManager *contracts.BondingManager + ticketBroker *contracts.TicketBroker + roundsManager *contracts.RoundsManager + minter *contracts.Minter + livepeerTokenFaucet *contracts.LivepeerTokenFaucet // for L1 contracts backwards-compatibility - l1BondingManagerSess *contracts.L1BondingManagerSession + l1BondingManager *contracts.L1BondingManager gasLimit uint64 gasPrice *big.Int @@ -190,10 +190,7 @@ func (c *client) setContracts(opts *bind.TransactOpts) error { glog.Errorf("Error creating Controller binding: %v", err) return err } - - c.controllerSess = &contracts.ControllerSession{ - Contract: controller, - } + c.controller = controller glog.V(common.SHORT).Infof("Controller: %v", c.controllerAddr.Hex()) @@ -210,10 +207,7 @@ func (c *client) setContracts(opts *bind.TransactOpts) error { glog.Errorf("Error creating LivpeerToken binding: %v", err) return err } - - c.livepeerTokenSess = &contracts.LivepeerTokenSession{ - Contract: token, - } + c.livepeerToken = token glog.V(common.SHORT).Infof("LivepeerToken: %v", c.tokenAddr.Hex()) @@ -230,10 +224,7 @@ func (c *client) setContracts(opts *bind.TransactOpts) error { glog.Errorf("Error creating ServiceRegistry binding: %v", err) return err } - - c.serviceRegistrySess = &contracts.ServiceRegistrySession{ - Contract: serviceRegistry, - } + c.serviceRegistry = serviceRegistry glog.V(common.SHORT).Infof("ServiceRegistry: %v", c.serviceRegistryAddr.Hex()) @@ -250,10 +241,7 @@ func (c *client) setContracts(opts *bind.TransactOpts) error { glog.Errorf("Error creating BondingManager binding: %v", err) return err } - - c.bondingManagerSess = &contracts.BondingManagerSession{ - Contract: bondingManager, - } + c.bondingManager = bondingManager // for L1 contracts backwards-compatibility l1BondingManager, err := contracts.NewL1BondingManager(bondingManagerAddr, c.backend) @@ -261,10 +249,7 @@ func (c *client) setContracts(opts *bind.TransactOpts) error { glog.Errorf("Error creating L1BondingManager binding: %v", err) return err } - - c.l1BondingManagerSess = &contracts.L1BondingManagerSession{ - Contract: l1BondingManager, - } + c.l1BondingManager = l1BondingManager glog.V(common.SHORT).Infof("BondingManager: %v", c.bondingManagerAddr.Hex()) @@ -281,10 +266,7 @@ func (c *client) setContracts(opts *bind.TransactOpts) error { glog.Errorf("Error creating TicketBroker binding: %v", err) return err } - - c.ticketBrokerSess = &contracts.TicketBrokerSession{ - Contract: broker, - } + c.ticketBroker = broker glog.V(common.SHORT).Infof("TicketBroker: %v", c.ticketBrokerAddr.Hex()) @@ -301,10 +283,7 @@ func (c *client) setContracts(opts *bind.TransactOpts) error { glog.Errorf("Error creating RoundsManager binding: %v", err) return err } - - c.roundsManagerSess = &contracts.RoundsManagerSession{ - Contract: roundsManager, - } + c.roundsManager = roundsManager glog.V(common.SHORT).Infof("RoundsManager: %v", c.roundsManagerAddr.Hex()) @@ -321,11 +300,7 @@ func (c *client) setContracts(opts *bind.TransactOpts) error { glog.Errorf("Error creating Minter binding: %v", err) return err } - - // Client should never transact with the Minter directly so we don't include transact opts - c.minterSess = &contracts.MinterSession{ - Contract: minter, - } + c.minter = minter glog.V(common.SHORT).Infof("Minter: %v", c.minterAddr.Hex()) @@ -342,10 +317,7 @@ func (c *client) setContracts(opts *bind.TransactOpts) error { glog.Errorf("Error creating LivepeerTokenFaucet binding: %v", err) return err } - - c.livepeerTokenFaucetSess = &contracts.LivepeerTokenFaucetSession{ - Contract: faucet, - } + c.livepeerTokenFaucet = faucet glog.V(common.SHORT).Infof("LivepeerTokenFaucet: %v", c.faucetAddr.Hex()) @@ -422,16 +394,16 @@ func (c *client) Backend() Backend { // Controller func (c *client) GetContract(hash ethcommon.Hash) (ethcommon.Address, error) { - return c.controllerSess.Contract.GetContract(c.callOpts(), hash) + return c.controller.GetContract(c.callOpts(), hash) } func (c *client) Paused() (bool, error) { - return c.controllerSess.Contract.Paused(c.callOpts()) + return c.controller.Paused(c.callOpts()) } // Rounds func (c *client) InitializeRound() (*types.Transaction, error) { - i, err := c.roundsManagerSess.Contract.CurrentRoundInitialized(c.callOpts()) + i, err := c.roundsManager.CurrentRoundInitialized(c.callOpts()) if err != nil { return nil, err } @@ -439,95 +411,95 @@ func (c *client) InitializeRound() (*types.Transaction, error) { glog.V(common.SHORT).Infof("Round already initialized") return nil, errors.New("ErrRoundInitialized") } else { - return c.roundsManagerSess.Contract.InitializeRound(c.transactOpts()) + return c.roundsManager.InitializeRound(c.transactOpts()) } } func (c *client) CurrentRound() (*big.Int, error) { - return c.roundsManagerSess.Contract.CurrentRound(c.callOpts()) + return c.roundsManager.CurrentRound(c.callOpts()) } func (c *client) CurrentRoundLocked() (bool, error) { - return c.roundsManagerSess.Contract.CurrentRoundLocked(c.callOpts()) + return c.roundsManager.CurrentRoundLocked(c.callOpts()) } func (c *client) LastInitializedRound() (*big.Int, error) { - return c.roundsManagerSess.Contract.LastInitializedRound(c.callOpts()) + return c.roundsManager.LastInitializedRound(c.callOpts()) } func (c *client) BlockHashForRound(round *big.Int) ([32]byte, error) { - return c.roundsManagerSess.Contract.BlockHashForRound(c.callOpts(), round) + return c.roundsManager.BlockHashForRound(c.callOpts(), round) } func (c *client) CurrentRoundInitialized() (bool, error) { - return c.roundsManagerSess.Contract.CurrentRoundInitialized(c.callOpts()) + return c.roundsManager.CurrentRoundInitialized(c.callOpts()) } func (c *client) CurrentRoundStartBlock() (*big.Int, error) { - return c.roundsManagerSess.Contract.CurrentRoundStartBlock(c.callOpts()) + return c.roundsManager.CurrentRoundStartBlock(c.callOpts()) } func (c *client) RoundLength() (*big.Int, error) { - return c.roundsManagerSess.Contract.RoundLength(c.callOpts()) + return c.roundsManager.RoundLength(c.callOpts()) } func (c *client) RoundLockAmount() (*big.Int, error) { - return c.roundsManagerSess.Contract.RoundLockAmount(c.callOpts()) + return c.roundsManager.RoundLockAmount(c.callOpts()) } // Minter func (c *client) Inflation() (*big.Int, error) { - return c.minterSess.Contract.Inflation(c.callOpts()) + return c.minter.Inflation(c.callOpts()) } func (c *client) InflationChange() (*big.Int, error) { - return c.minterSess.Contract.InflationChange(c.callOpts()) + return c.minter.InflationChange(c.callOpts()) } func (c *client) TargetBondingRate() (*big.Int, error) { - return c.minterSess.Contract.TargetBondingRate(c.callOpts()) + return c.minter.TargetBondingRate(c.callOpts()) } func (c *client) GetGlobalTotalSupply() (*big.Int, error) { - return c.minterSess.Contract.GetGlobalTotalSupply(c.callOpts()) + return c.minter.GetGlobalTotalSupply(c.callOpts()) } func (c *client) CurrentMintableTokens() (*big.Int, error) { - return c.minterSess.Contract.CurrentMintableTokens(c.callOpts()) + return c.minter.CurrentMintableTokens(c.callOpts()) } // Token func (c *client) Transfer(toAddr ethcommon.Address, amount *big.Int) (*types.Transaction, error) { - return c.livepeerTokenSess.Contract.Transfer(c.transactOpts(), toAddr, amount) + return c.livepeerToken.Transfer(c.transactOpts(), toAddr, amount) } func (c *client) Allowance(owner ethcommon.Address, spender ethcommon.Address) (*big.Int, error) { - return c.livepeerTokenSess.Contract.Allowance(c.callOpts(), owner, spender) + return c.livepeerToken.Allowance(c.callOpts(), owner, spender) } func (c *client) Request() (*types.Transaction, error) { - return c.livepeerTokenFaucetSess.Contract.Request(c.transactOpts()) + return c.livepeerTokenFaucet.Request(c.transactOpts()) } func (c *client) BalanceOf(address ethcommon.Address) (*big.Int, error) { - return c.livepeerTokenSess.Contract.BalanceOf(c.callOpts(), address) + return c.livepeerToken.BalanceOf(c.callOpts(), address) } func (c *client) TotalSupply() (*big.Int, error) { - return c.livepeerTokenSess.Contract.TotalSupply(c.callOpts()) + return c.livepeerToken.TotalSupply(c.callOpts()) } func (c *client) NextValidRequest(addr ethcommon.Address) (*big.Int, error) { - return c.livepeerTokenFaucetSess.Contract.NextValidRequest(c.callOpts(), addr) + return c.livepeerTokenFaucet.NextValidRequest(c.callOpts(), addr) } // Service Registry func (c *client) SetServiceURI(serviceURI string) (*types.Transaction, error) { - return c.serviceRegistrySess.Contract.SetServiceURI(c.transactOpts(), serviceURI) + return c.serviceRegistry.SetServiceURI(c.transactOpts(), serviceURI) } func (c *client) GetServiceURI(addr ethcommon.Address) (string, error) { - return c.serviceRegistrySess.Contract.GetServiceURI(c.callOpts(), addr) + return c.serviceRegistry.GetServiceURI(c.callOpts(), addr) } // Staking @@ -540,7 +512,7 @@ func (c *client) Transcoder(blockRewardCut, feeShare *big.Int) (*types.Transacti if locked { return nil, ErrCurrentRoundLocked } else { - return c.bondingManagerSess.Contract.Transcoder(c.transactOpts(), blockRewardCut, feeShare) + return c.bondingManager.Transcoder(c.transactOpts(), blockRewardCut, feeShare) } } @@ -554,7 +526,7 @@ func (c *client) Bond(amount *big.Int, to ethcommon.Address) (*types.Transaction // If existing allowance set by account for BondingManager is // less than the bond amount, approve the necessary amount if allowance.Cmp(amount) == -1 { - tx, err := c.livepeerTokenSess.Contract.Approve(c.transactOpts(), c.bondingManagerAddr, amount) + tx, err := c.livepeerToken.Approve(c.transactOpts(), c.bondingManagerAddr, amount) if err != nil { return nil, err } @@ -620,7 +592,7 @@ func (c *client) Bond(amount *big.Int, to ethcommon.Address) (*types.Transaction newHints := simulateTranscoderPoolUpdate(to, newStake, transcoders, isFull) - return c.bondingManagerSess.Contract.BondWithHint( + return c.bondingManager.BondWithHint( c.transactOpts(), amount, to, @@ -664,7 +636,7 @@ func (c *client) Unbond(amount *big.Int) (*types.Transaction, error) { hints := simulateTranscoderPoolUpdate(delegator.DelegateAddress, newStake, transcoders, isFull) - return c.bondingManagerSess.Contract.UnbondWithHint(c.transactOpts(), amount, hints.PosPrev, hints.PosNext) + return c.bondingManager.UnbondWithHint(c.transactOpts(), amount, hints.PosPrev, hints.PosNext) } func (c *client) RebondFromUnbonded(to ethcommon.Address, unbondingLockID *big.Int) (*types.Transaction, error) { @@ -698,7 +670,7 @@ func (c *client) RebondFromUnbonded(to ethcommon.Address, unbondingLockID *big.I hints := simulateTranscoderPoolUpdate(to, newStake, transcoders, isFull) - return c.bondingManagerSess.Contract.RebondFromUnbondedWithHint(c.transactOpts(), to, unbondingLockID, hints.PosPrev, hints.PosNext) + return c.bondingManager.RebondFromUnbondedWithHint(c.transactOpts(), to, unbondingLockID, hints.PosPrev, hints.PosNext) } func (c *client) Rebond(unbondingLockID *big.Int) (*types.Transaction, error) { @@ -738,71 +710,71 @@ func (c *client) Rebond(unbondingLockID *big.Int) (*types.Transaction, error) { hints := simulateTranscoderPoolUpdate(delegator.DelegateAddress, newStake, transcoders, isFull) - return c.bondingManagerSess.Contract.RebondWithHint(c.transactOpts(), unbondingLockID, hints.PosPrev, hints.PosNext) + return c.bondingManager.RebondWithHint(c.transactOpts(), unbondingLockID, hints.PosPrev, hints.PosNext) } func (c *client) WithdrawStake(unbondingLockID *big.Int) (*types.Transaction, error) { - return c.bondingManagerSess.Contract.WithdrawStake(c.transactOpts(), unbondingLockID) + return c.bondingManager.WithdrawStake(c.transactOpts(), unbondingLockID) } func (c *client) L1WithdrawFees() (*types.Transaction, error) { - return c.l1BondingManagerSess.Contract.WithdrawFees(c.transactOpts()) + return c.l1BondingManager.WithdrawFees(c.transactOpts()) } func (c *client) ClaimEarnings(endRound *big.Int) (*types.Transaction, error) { - return c.bondingManagerSess.Contract.ClaimEarnings(c.transactOpts(), endRound) + return c.bondingManager.ClaimEarnings(c.transactOpts(), endRound) } func (c *client) GetTranscoderPoolMaxSize() (*big.Int, error) { - return c.bondingManagerSess.Contract.GetTranscoderPoolMaxSize(c.callOpts()) + return c.bondingManager.GetTranscoderPoolMaxSize(c.callOpts()) } func (c *client) TranscoderTotalStake(to ethcommon.Address) (*big.Int, error) { - return c.bondingManagerSess.Contract.TranscoderTotalStake(c.callOpts(), to) + return c.bondingManager.TranscoderTotalStake(c.callOpts(), to) } func (c *client) GetTotalBonded() (*big.Int, error) { - return c.bondingManagerSess.Contract.GetTotalBonded(c.callOpts()) + return c.bondingManager.GetTotalBonded(c.callOpts()) } func (c *client) PendingStake(delegator ethcommon.Address, endRound *big.Int) (*big.Int, error) { - return c.bondingManagerSess.Contract.PendingStake(c.callOpts(), delegator, endRound) + return c.bondingManager.PendingStake(c.callOpts(), delegator, endRound) } func (c *client) TranscoderStatus(transcoder ethcommon.Address) (uint8, error) { - return c.bondingManagerSess.Contract.TranscoderStatus(c.callOpts(), transcoder) + return c.bondingManager.TranscoderStatus(c.callOpts(), transcoder) } func (c *client) DelegatorStatus(delegator ethcommon.Address) (uint8, error) { - return c.bondingManagerSess.Contract.DelegatorStatus(c.callOpts(), delegator) + return c.bondingManager.DelegatorStatus(c.callOpts(), delegator) } func (c *client) GetFirstTranscoderInPool() (ethcommon.Address, error) { - return c.bondingManagerSess.Contract.GetFirstTranscoderInPool(c.callOpts()) + return c.bondingManager.GetFirstTranscoderInPool(c.callOpts()) } func (c *client) PendingFees(delegator ethcommon.Address, endRound *big.Int) (*big.Int, error) { - return c.bondingManagerSess.Contract.PendingFees(c.callOpts(), delegator, endRound) + return c.bondingManager.PendingFees(c.callOpts(), delegator, endRound) } func (c *client) GetNextTranscoderInPool(transcoder ethcommon.Address) (ethcommon.Address, error) { - return c.bondingManagerSess.Contract.GetNextTranscoderInPool(c.callOpts(), transcoder) + return c.bondingManager.GetNextTranscoderInPool(c.callOpts(), transcoder) } func (c *client) GetTranscoderPoolSize() (*big.Int, error) { - return c.bondingManagerSess.Contract.GetTranscoderPoolSize(c.callOpts()) + return c.bondingManager.GetTranscoderPoolSize(c.callOpts()) } func (c *client) UnbondingPeriod() (uint64, error) { - return c.bondingManagerSess.Contract.UnbondingPeriod(c.callOpts()) + return c.bondingManager.UnbondingPeriod(c.callOpts()) } func (c *client) IsActiveTranscoder() (bool, error) { - return c.bondingManagerSess.Contract.IsActiveTranscoder(c.callOpts(), c.Account().Address) + return c.bondingManager.IsActiveTranscoder(c.callOpts(), c.Account().Address) } func (c *client) GetTranscoder(addr ethcommon.Address) (*lpTypes.Transcoder, error) { - tInfo, err := c.bondingManagerSess.Contract.GetTranscoder(c.callOpts(), addr) + tInfo, err := c.bondingManager.GetTranscoder(c.callOpts(), addr) if err != nil { return nil, err } @@ -822,7 +794,7 @@ func (c *client) GetTranscoder(addr ethcommon.Address) (*lpTypes.Transcoder, err return nil, err } - active, err := c.bondingManagerSess.Contract.IsActiveTranscoder(c.callOpts(), addr) + active, err := c.bondingManager.IsActiveTranscoder(c.callOpts(), addr) if err != nil { return nil, err } @@ -848,7 +820,7 @@ func (c *client) GetTranscoder(addr ethcommon.Address) (*lpTypes.Transcoder, err } func (c *client) GetTranscoderEarningsPoolForRound(addr ethcommon.Address, round *big.Int) (*lpTypes.TokenPools, error) { - tp, err := c.bondingManagerSess.Contract.GetTranscoderEarningsPoolForRound(c.callOpts(), addr, round) + tp, err := c.bondingManager.GetTranscoderEarningsPoolForRound(c.callOpts(), addr, round) if err != nil { return nil, err } @@ -863,7 +835,7 @@ func (c *client) GetTranscoderEarningsPoolForRound(addr ethcommon.Address, round } func (c *client) GetDelegator(addr ethcommon.Address) (*lpTypes.Delegator, error) { - dInfo, err := c.bondingManagerSess.Contract.GetDelegator(c.callOpts(), addr) + dInfo, err := c.bondingManager.GetDelegator(c.callOpts(), addr) if err != nil { glog.Errorf("Error getting delegator from bonding manager: %v", err) return nil, err @@ -921,7 +893,7 @@ func (c *client) GetDelegator(addr ethcommon.Address) (*lpTypes.Delegator, error } func (c *client) GetDelegatorUnbondingLock(addr ethcommon.Address, unbondingLockId *big.Int) (*lpTypes.UnbondingLock, error) { - lock, err := c.bondingManagerSess.Contract.GetDelegatorUnbondingLock(c.callOpts(), addr, unbondingLockId) + lock, err := c.bondingManager.GetDelegatorUnbondingLock(c.callOpts(), addr, unbondingLockId) if err != nil { return nil, err } @@ -936,23 +908,23 @@ func (c *client) GetDelegatorUnbondingLock(addr ethcommon.Address, unbondingLock // TicketBroker func (c *client) Unlock() (*types.Transaction, error) { - return c.ticketBrokerSess.Contract.Unlock(c.transactOpts()) + return c.ticketBroker.Unlock(c.transactOpts()) } func (c *client) CancelUnlock() (*types.Transaction, error) { - return c.ticketBrokerSess.Contract.CancelUnlock(c.transactOpts()) + return c.ticketBroker.CancelUnlock(c.transactOpts()) } func (c *client) Withdraw() (*types.Transaction, error) { - return c.ticketBrokerSess.Contract.Withdraw(c.transactOpts()) + return c.ticketBroker.Withdraw(c.transactOpts()) } func (c *client) UnlockPeriod() (*big.Int, error) { - return c.ticketBrokerSess.Contract.UnlockPeriod(c.callOpts()) + return c.ticketBroker.UnlockPeriod(c.callOpts()) } func (c *client) ClaimedReserve(reserveHolder ethcommon.Address, claimant ethcommon.Address) (*big.Int, error) { - return c.ticketBrokerSess.Contract.ClaimedReserve(c.callOpts(), reserveHolder, claimant) + return c.ticketBroker.ClaimedReserve(c.callOpts(), reserveHolder, claimant) } func (c *client) TranscoderPool() ([]*lpTypes.Transcoder, error) { @@ -1035,11 +1007,11 @@ func (c *client) Reward() (*types.Transaction, error) { hints := simulateTranscoderPoolUpdate(addr, reward.Add(reward, tr.DelegatedStake), transcoders, len(transcoders) == int(maxSize.Int64())) - return c.bondingManagerSess.Contract.RewardWithHint(c.transactOpts(), hints.PosPrev, hints.PosNext) + return c.bondingManager.RewardWithHint(c.transactOpts(), hints.PosPrev, hints.PosNext) } func (c *client) WithdrawFees(addr ethcommon.Address, amount *big.Int) (*types.Transaction, error) { - return c.bondingManagerSess.Contract.WithdrawFees(c.transactOpts(), addr, amount) + return c.bondingManager.WithdrawFees(c.transactOpts(), addr, amount) } // Helpers diff --git a/eth/client_ticketbroker.go b/eth/client_ticketbroker.go index b4f6db4b98..7d62884dba 100644 --- a/eth/client_ticketbroker.go +++ b/eth/client_ticketbroker.go @@ -16,7 +16,7 @@ func (c *client) FundDepositAndReserve(depositAmount, reserveAmount *big.Int) (* opts := c.transactOpts() opts.Value = new(big.Int).Add(depositAmount, reserveAmount) - return c.ticketBrokerSess.Contract.FundDepositAndReserve(opts, depositAmount, reserveAmount) + return c.ticketBroker.FundDepositAndReserve(opts, depositAmount, reserveAmount) } // FundDeposit funds a sender's deposit @@ -26,7 +26,7 @@ func (c *client) FundDeposit(amount *big.Int) (*types.Transaction, error) { opts := c.transactOpts() opts.Value = amount - return c.ticketBrokerSess.Contract.FundDeposit(opts) + return c.ticketBroker.FundDeposit(opts) } // FundReserve funds a sender's reserve @@ -36,7 +36,7 @@ func (c *client) FundReserve(amount *big.Int) (*types.Transaction, error) { opts := c.transactOpts() opts.Value = amount - return c.ticketBrokerSess.Contract.FundReserve(opts) + return c.ticketBroker.FundReserve(opts) } // RedeemWinningTicket submits a ticket to be validated by the broker and if a valid winning ticket @@ -45,7 +45,7 @@ func (c *client) RedeemWinningTicket(ticket *pm.Ticket, sig []byte, recipientRan var recipientRandHash [32]byte copy(recipientRandHash[:], ticket.RecipientRandHash.Bytes()[:32]) - return c.ticketBrokerSess.Contract.RedeemWinningTicket( + return c.ticketBroker.RedeemWinningTicket( c.transactOpts(), contracts.MTicketBrokerCoreTicket{ Recipient: ticket.Recipient, @@ -63,7 +63,7 @@ func (c *client) RedeemWinningTicket(ticket *pm.Ticket, sig []byte, recipientRan // GetSenderInfo returns the info for a sender func (c *client) GetSenderInfo(addr ethcommon.Address) (*pm.SenderInfo, error) { - info, err := c.ticketBrokerSess.GetSenderInfo(addr) + info, err := c.ticketBroker.GetSenderInfo(c.callOpts(), addr) if err != nil { return nil, err } @@ -85,5 +85,5 @@ func (c *client) IsUsedTicket(ticket *pm.Ticket) (bool, error) { var ticketHash [32]byte copy(ticketHash[:], ticket.Hash().Bytes()[:32]) - return c.ticketBrokerSess.UsedTickets(ticketHash) + return c.ticketBroker.UsedTickets(c.callOpts(), ticketHash) } From 93b87ba4da48374640d6bbb8f7e5245ba95082e6 Mon Sep 17 00:00:00 2001 From: Rafal Leszko Date: Thu, 24 Feb 2022 13:20:46 +0100 Subject: [PATCH 4/5] eth: Change ethRpcTimeout to 10 min --- eth/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eth/client.go b/eth/client.go index 6bbf6d8377..cf88301b4c 100644 --- a/eth/client.go +++ b/eth/client.go @@ -39,7 +39,7 @@ var ( ErrReplacingMinedTx = fmt.Errorf("trying to replace already mined tx") ErrCurrentRoundLocked = fmt.Errorf("current round locked") ErrMissingBackend = fmt.Errorf("missing Ethereum client backend") - ethRpcTimeout = 5 * time.Minute + ethRpcTimeout = 2 * time.Minute ) type LivepeerEthClient interface { From adeb0609ce40364178176dd54e9107aeb030ac33 Mon Sep 17 00:00:00 2001 From: Rafal Leszko Date: Thu, 24 Feb 2022 13:53:27 +0100 Subject: [PATCH 5/5] Update CHANGELOG_PENDING.md --- CHANGELOG_PENDING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md index f8572123fe..f0a4369c95 100644 --- a/CHANGELOG_PENDING.md +++ b/CHANGELOG_PENDING.md @@ -7,6 +7,7 @@ ### Features ⚒ #### General +- \#2289 Add timeouts to ETH client (@leszko) #### Broadcaster