From 85c06ebfe092b2aa52f0fc0a5c69ef36921f56c6 Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Fri, 19 Feb 2021 10:59:40 +1100 Subject: [PATCH 1/2] chain/cosmos: use provided context --- chain/cosmos/client.go | 75 +++++++++++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 26 deletions(-) diff --git a/chain/cosmos/client.go b/chain/cosmos/client.go index e47120e3..12b423c7 100644 --- a/chain/cosmos/client.go +++ b/chain/cosmos/client.go @@ -182,58 +182,81 @@ func (client *Client) SubmitTx(ctx context.Context, tx account.Tx) error { // AccountNonce returns the current nonce of the account. This is the nonce to // be used while building a new transaction. -func (client *Client) AccountNonce(_ context.Context, addr address.Address) (pack.U256, error) { +func (client *Client) AccountNonce(ctx context.Context, addr address.Address) (pack.U256, error) { cosmosAddr, err := types.AccAddressFromBech32(string(addr)) if err != nil { return pack.U256{}, fmt.Errorf("bad address: '%v': %v", addr, err) } - accGetter := auth.NewAccountRetriever(client.cliCtx) - acc, err := accGetter.GetAccount(Address(cosmosAddr).AccAddress()) - if err != nil { - return pack.U256{}, err - } + for { + select { + case <-ctx.Done(): + return pack.U256{}, ctx.Err() + default: + } + + accGetter := auth.NewAccountRetriever(client.cliCtx) + acc, err := accGetter.GetAccount(Address(cosmosAddr).AccAddress()) + if err != nil { + continue + } - return pack.NewU256FromU64(pack.NewU64(acc.GetSequence())), nil + return pack.NewU256FromU64(pack.NewU64(acc.GetSequence())), nil + } } // AccountNumber returns the account number for a given address. -func (client *Client) AccountNumber(_ context.Context, addr address.Address) (pack.U64, error) { +func (client *Client) AccountNumber(ctx context.Context, addr address.Address) (pack.U64, error) { cosmosAddr, err := types.AccAddressFromBech32(string(addr)) if err != nil { return 0, fmt.Errorf("bad address: '%v': %v", addr, err) } - accGetter := auth.NewAccountRetriever(client.cliCtx) - acc, err := accGetter.GetAccount(Address(cosmosAddr).AccAddress()) - if err != nil { - return 0, err + for { + select { + case <-ctx.Done(): + return 0, ctx.Err() + default: + } + + accGetter := auth.NewAccountRetriever(client.cliCtx) + acc, err := accGetter.GetAccount(Address(cosmosAddr).AccAddress()) + if err != nil { + continue + } + return pack.U64(acc.GetAccountNumber()), nil } - - return pack.U64(acc.GetAccountNumber()), nil } // AccountBalance returns the account balancee for a given address. -func (client *Client) AccountBalance(_ context.Context, addr address.Address) (pack.U256, error) { +func (client *Client) AccountBalance(ctx context.Context, addr address.Address) (pack.U256, error) { cosmosAddr, err := types.AccAddressFromBech32(string(addr)) if err != nil { return pack.U256{}, fmt.Errorf("bad address: '%v': %v", addr, err) } - accGetter := auth.NewAccountRetriever(client.cliCtx) - acc, err := accGetter.GetAccount(Address(cosmosAddr).AccAddress()) - if err != nil { - return pack.U256{}, err - } + for { + select { + case <-ctx.Done(): + return pack.U256{}, ctx.Err() + default: + } - balance := acc.GetCoins().AmountOf(string(client.opts.CoinDenom)).BigInt() + accGetter := auth.NewAccountRetriever(client.cliCtx) + acc, err := accGetter.GetAccount(Address(cosmosAddr).AccAddress()) + if err != nil { + continue + } - // If the balance exceeds `MaxU256`, return an error. - if pack.MaxU256.Int().Cmp(balance) == -1 { - return pack.U256{}, fmt.Errorf("balance %v for %v exceeds MaxU256", balance.String(), addr) - } + balance := acc.GetCoins().AmountOf(string(client.opts.CoinDenom)).BigInt() - return pack.NewU256FromInt(balance), nil + // If the balance exceeds `MaxU256`, return an error. + if pack.MaxU256.Int().Cmp(balance) == -1 { + return pack.U256{}, fmt.Errorf("balance %v for %v exceeds MaxU256", balance.String(), addr) + } + + return pack.NewU256FromInt(balance), nil + } } type transport struct { From fbe8b6b3566fa6ff10885eed5528c7ee856ffc62 Mon Sep 17 00:00:00 2001 From: Jaz Gulati Date: Mon, 22 Feb 2021 13:59:36 +1100 Subject: [PATCH 2/2] chain/cosmos: add retry timeout --- chain/cosmos/client.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/chain/cosmos/client.go b/chain/cosmos/client.go index 12b423c7..ddeb2c86 100644 --- a/chain/cosmos/client.go +++ b/chain/cosmos/client.go @@ -198,6 +198,7 @@ func (client *Client) AccountNonce(ctx context.Context, addr address.Address) (p accGetter := auth.NewAccountRetriever(client.cliCtx) acc, err := accGetter.GetAccount(Address(cosmosAddr).AccAddress()) if err != nil { + time.Sleep(client.opts.TimeoutRetry) continue } @@ -222,6 +223,7 @@ func (client *Client) AccountNumber(ctx context.Context, addr address.Address) ( accGetter := auth.NewAccountRetriever(client.cliCtx) acc, err := accGetter.GetAccount(Address(cosmosAddr).AccAddress()) if err != nil { + time.Sleep(client.opts.TimeoutRetry) continue } return pack.U64(acc.GetAccountNumber()), nil @@ -245,6 +247,7 @@ func (client *Client) AccountBalance(ctx context.Context, addr address.Address) accGetter := auth.NewAccountRetriever(client.cliCtx) acc, err := accGetter.GetAccount(Address(cosmosAddr).AccAddress()) if err != nil { + time.Sleep(client.opts.TimeoutRetry) continue }