-
Notifications
You must be signed in to change notification settings - Fork 122
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[BP: v7 <- #1009]
feat: replace broadcaster's account retriever to …
…use chain's bech32 prefix when converting AccAddress to string (#1010) * feat: replace broadcaster's account retriever to use chain's bech32 prefix when converting AccAddress to string (#1009) * feat: replace broadcaster's account retriever to use chain's bech32 prefix when converting AccAddress to string * refactor: enhance AccountRetriever (cherry picked from commit 1d1b837) # Conflicts: # chain/cosmos/broadcaster.go * fix: resolve conflicts (#1016) --------- Co-authored-by: MadReza <[email protected]>
- Loading branch information
1 parent
8be1782
commit a6233c1
Showing
3 changed files
with
94 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
package cosmos | ||
|
||
import ( | ||
"context" | ||
"fmt" | ||
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" | ||
"strconv" | ||
|
||
grpc "google.golang.org/grpc" | ||
"google.golang.org/grpc/metadata" | ||
|
||
"github.com/cosmos/cosmos-sdk/client" | ||
sdk "github.com/cosmos/cosmos-sdk/types" | ||
grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" | ||
) | ||
|
||
var ( | ||
_ client.Account = authtypes.AccountI(nil) | ||
_ client.AccountRetriever = AccountRetriever{} | ||
) | ||
|
||
// AccountRetriever defines the properties of a type that can be used to | ||
// retrieve accounts. | ||
type AccountRetriever struct { | ||
chain *CosmosChain | ||
} | ||
|
||
// GetAccount queries for an account given an address and a block height. An | ||
// error is returned if the query or decoding fails. | ||
func (ar AccountRetriever) GetAccount(clientCtx client.Context, addr sdk.AccAddress) (client.Account, error) { | ||
account, _, err := ar.GetAccountWithHeight(clientCtx, addr) | ||
return account, err | ||
} | ||
|
||
// GetAccountWithHeight queries for an account given an address. Returns the | ||
// height of the query with the account. An error is returned if the query | ||
// or decoding fails. | ||
func (ar AccountRetriever) GetAccountWithHeight(clientCtx client.Context, addr sdk.AccAddress) (client.Account, int64, error) { | ||
var header metadata.MD | ||
|
||
bech32Address, err := ar.chain.AccAddressToBech32(addr) | ||
if err != nil { | ||
return nil, 0, err | ||
} | ||
|
||
queryClient := authtypes.NewQueryClient(clientCtx) | ||
res, err := queryClient.Account(context.Background(), &authtypes.QueryAccountRequest{Address: bech32Address}, grpc.Header(&header)) | ||
if err != nil { | ||
return nil, 0, err | ||
} | ||
|
||
blockHeight := header.Get(grpctypes.GRPCBlockHeightHeader) | ||
if l := len(blockHeight); l != 1 { | ||
return nil, 0, fmt.Errorf("unexpected '%s' header length; got %d, expected: %d", grpctypes.GRPCBlockHeightHeader, l, 1) | ||
} | ||
|
||
nBlockHeight, err := strconv.Atoi(blockHeight[0]) | ||
if err != nil { | ||
return nil, 0, fmt.Errorf("failed to parse block height: %w", err) | ||
} | ||
|
||
var acc authtypes.AccountI | ||
if err := clientCtx.InterfaceRegistry.UnpackAny(res.Account, &acc); err != nil { | ||
return nil, 0, err | ||
} | ||
|
||
return acc, int64(nBlockHeight), nil | ||
} | ||
|
||
// EnsureExists returns an error if no account exists for the given address else nil. | ||
func (ar AccountRetriever) EnsureExists(clientCtx client.Context, addr sdk.AccAddress) error { | ||
if _, err := ar.GetAccount(clientCtx, addr); err != nil { | ||
return err | ||
} | ||
|
||
return nil | ||
} | ||
|
||
// GetAccountNumberSequence returns sequence and account number for the given address. | ||
// It returns an error if the account couldn't be retrieved from the state. | ||
func (ar AccountRetriever) GetAccountNumberSequence(clientCtx client.Context, addr sdk.AccAddress) (uint64, uint64, error) { | ||
acc, err := ar.GetAccount(clientCtx, addr) | ||
if err != nil { | ||
return 0, 0, err | ||
} | ||
|
||
return acc.GetAccountNumber(), acc.GetSequence(), nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters