Skip to content

Commit eddb3b8

Browse files
authored
Merge pull request #155 from xpladev/fix/auth
fix: auth query
2 parents b822403 + cf5f40a commit eddb3b8

File tree

9 files changed

+356
-7
lines changed

9 files changed

+356
-7
lines changed

app/keepers/keepers.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,11 @@ import (
7373
wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types"
7474

7575
etherminttypes "github.com/xpladev/ethermint/types"
76-
ethermintauthkeeper "github.com/xpladev/ethermint/x/auth/keeper"
7776
evmkeeper "github.com/xpladev/ethermint/x/evm/keeper"
7877
evmtypes "github.com/xpladev/ethermint/x/evm/types"
7978
feemarketkeeper "github.com/xpladev/ethermint/x/feemarket/keeper"
8079
feemarkettypes "github.com/xpladev/ethermint/x/feemarket/types"
80+
xplaauthkeeper "github.com/xpladev/xpla/x/auth/keeper"
8181

8282
rewardkeeper "github.com/xpladev/xpla/x/reward/keeper"
8383
rewardtypes "github.com/xpladev/xpla/x/reward/types"
@@ -93,7 +93,7 @@ type AppKeepers struct {
9393
memKeys map[string]*storetypes.MemoryStoreKey
9494

9595
// keepers
96-
AccountKeeper ethermintauthkeeper.AccountKeeper
96+
AccountKeeper xplaauthkeeper.AccountKeeper
9797
BankKeeper bankkeeper.Keeper
9898
CapabilityKeeper *capabilitykeeper.Keeper
9999
StakingKeeper *xplastakingkeeper.Keeper
@@ -215,7 +215,7 @@ func NewAppKeeper(
215215
)
216216

217217
// Add normal keepers
218-
appKeepers.AccountKeeper = ethermintauthkeeper.NewAccountKeeper(
218+
appKeepers.AccountKeeper = xplaauthkeeper.NewAccountKeeper(
219219
appCodec,
220220
runtime.NewKVStoreService(appKeepers.keys[authtypes.StoreKey]),
221221
etherminttypes.ProtoAccount,

app/modules.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@ import (
5555
"github.com/CosmWasm/wasmd/x/wasm"
5656
wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types"
5757

58-
ethermintauth "github.com/xpladev/ethermint/x/auth"
5958
"github.com/xpladev/ethermint/x/evm"
6059
evmtypes "github.com/xpladev/ethermint/x/evm/types"
6160
"github.com/xpladev/ethermint/x/feemarket"
6261
feemarkettypes "github.com/xpladev/ethermint/x/feemarket/types"
62+
xplaauth "github.com/xpladev/xpla/x/auth"
6363

6464
"github.com/xpladev/xpla/x/reward"
6565
rewardtypes "github.com/xpladev/xpla/x/reward/types"
@@ -97,7 +97,7 @@ func appModules(
9797
app,
9898
txConfig,
9999
),
100-
ethermintauth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)),
100+
xplaauth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)),
101101
bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper, app.GetSubspace(banktypes.ModuleName)),
102102
capability.NewAppModule(appCodec, *app.CapabilityKeeper, false),
103103
crisis.NewAppModule(app.CrisisKeeper, skipGenesisInvariants, app.GetSubspace(crisistypes.ModuleName)),
@@ -152,7 +152,7 @@ func simulationModules(
152152
_ bool,
153153
) []module.AppModuleSimulation {
154154
return []module.AppModuleSimulation{
155-
ethermintauth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)),
155+
xplaauth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)),
156156
bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper, app.GetSubspace(banktypes.ModuleName)),
157157
capability.NewAppModule(appCodec, *app.CapabilityKeeper, false),
158158
feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry),

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ go 1.23.2
55
require (
66
cosmossdk.io/api v0.7.6
77
cosmossdk.io/client/v2 v2.0.0-beta.1
8+
cosmossdk.io/collections v0.4.0
89
cosmossdk.io/core v0.12.0
910
cosmossdk.io/errors v1.0.1
1011
cosmossdk.io/log v1.4.1
@@ -48,7 +49,6 @@ require (
4849
cloud.google.com/go/compute/metadata v0.3.0 // indirect
4950
cloud.google.com/go/iam v1.1.6 // indirect
5051
cloud.google.com/go/storage v1.38.0 // indirect
51-
cosmossdk.io/collections v0.4.0 // indirect
5252
cosmossdk.io/depinject v1.0.0 // indirect
5353
cosmossdk.io/x/circuit v0.1.1 // indirect
5454
filippo.io/edwards25519 v1.0.0 // indirect

x/auth/keeper/account.go

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package keeper
2+
3+
import (
4+
"context"
5+
"errors"
6+
7+
"cosmossdk.io/collections"
8+
errorsmod "cosmossdk.io/errors"
9+
10+
sdk "github.com/cosmos/cosmos-sdk/types"
11+
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
12+
)
13+
14+
// HasAccount implements AccountKeeperI.
15+
func (ak AccountKeeper) HasAccount(ctx context.Context, addr sdk.AccAddress) bool {
16+
addr, err := ak.getSliceAddress(ctx, addr)
17+
if err != nil {
18+
return false
19+
}
20+
has, err := ak.Accounts.Has(ctx, addr)
21+
if err != nil {
22+
return false
23+
}
24+
25+
return has
26+
}
27+
28+
// GetAccount implements AccountKeeperI.
29+
func (ak AccountKeeper) GetAccount(ctx context.Context, addr sdk.AccAddress) (acc sdk.AccountI) {
30+
addr, err := ak.getSliceAddress(ctx, addr)
31+
if err != nil {
32+
panic(err)
33+
}
34+
return ak.AccountKeeper.GetAccount(ctx, addr)
35+
}
36+
37+
// GetSequence Returns the Sequence of the account at address
38+
func (ak AccountKeeper) GetSequence(ctx context.Context, addr sdk.AccAddress) (uint64, error) {
39+
acc := ak.GetAccount(ctx, addr)
40+
if acc == nil {
41+
return 0, errorsmod.Wrapf(sdkerrors.ErrUnknownAddress, "account %s does not exist", addr)
42+
}
43+
44+
return acc.GetSequence(), nil
45+
}
46+
47+
// SetAccount implements AccountKeeperI.
48+
func (ak AccountKeeper) SetAccount(ctx context.Context, acc sdk.AccountI) {
49+
address := acc.GetAddress()
50+
if len(address) != 20 {
51+
sliceAddress := address[len(address)-20:]
52+
ak.SliceAddresses.Set(ctx, sliceAddress, address)
53+
}
54+
ak.AccountKeeper.SetAccount(ctx, acc)
55+
}
56+
57+
func (ak AccountKeeper) getSliceAddress(ctx context.Context, addr sdk.AccAddress) (sdk.AccAddress, error) {
58+
originalAddress, err := ak.SliceAddresses.Get(ctx, addr)
59+
if err != nil {
60+
if errors.Is(err, collections.ErrNotFound) {
61+
return addr, nil
62+
}
63+
return nil, err
64+
}
65+
66+
return originalAddress, nil
67+
}

x/auth/keeper/account_test.go

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package keeper
2+
3+
import (
4+
"testing"
5+
6+
storetypes "cosmossdk.io/store/types"
7+
"github.com/cosmos/cosmos-sdk/codec"
8+
ctestutil "github.com/cosmos/cosmos-sdk/codec/testutil"
9+
"github.com/cosmos/cosmos-sdk/runtime"
10+
"github.com/cosmos/cosmos-sdk/testutil"
11+
sdk "github.com/cosmos/cosmos-sdk/types"
12+
authcodec "github.com/cosmos/cosmos-sdk/x/auth/codec"
13+
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
14+
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
15+
"github.com/stretchr/testify/assert"
16+
)
17+
18+
func TestGetSliceAddress(t *testing.T) {
19+
20+
storeKey := storetypes.NewKVStoreKey(authtypes.ModuleName)
21+
tKey := storetypes.NewTransientStoreKey("transient_test")
22+
ctx := testutil.DefaultContext(storeKey, tKey)
23+
24+
interfaceRegistry := ctestutil.CodecOptions{}.NewInterfaceRegistry()
25+
authtypes.RegisterInterfaces(interfaceRegistry)
26+
cdc := codec.NewProtoCodec(interfaceRegistry)
27+
accountKeeper := NewAccountKeeper(
28+
cdc,
29+
runtime.NewKVStoreService(storeKey),
30+
authtypes.ProtoBaseAccount,
31+
map[string][]string{},
32+
authcodec.NewBech32Codec(sdk.Bech32MainPrefix),
33+
sdk.Bech32MainPrefix,
34+
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
35+
)
36+
37+
original := sdk.MustAccAddressFromBech32("cosmos1qg5ega6dykkxc307y25pecuufrjkxkaggkkxh7nad0vhyhtuhw3s6ufdm4")
38+
valid := sdk.MustAccAddressFromBech32("cosmos1rn3ecj89vdd6s3dvd0a8667ewfwhewarkkd5wr")
39+
invalid := sdk.MustAccAddressFromBech32("cosmos1qg5ega6dykkxc307y25pecuufrjkxkags0q9gu")
40+
41+
accountKeeper.SetAccount(ctx, authtypes.NewBaseAccount(original, nil, 0, 0))
42+
43+
assert.True(t, accountKeeper.HasAccount(ctx, original))
44+
assert.True(t, accountKeeper.HasAccount(ctx, valid))
45+
assert.False(t, accountKeeper.HasAccount(ctx, invalid))
46+
47+
}

x/auth/keeper/grpc_query.go

+126
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package keeper
2+
3+
import (
4+
"context"
5+
6+
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
7+
authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
8+
"github.com/cosmos/cosmos-sdk/x/auth/types"
9+
"google.golang.org/grpc/codes"
10+
"google.golang.org/grpc/status"
11+
)
12+
13+
var _ types.QueryServer = queryServer{}
14+
15+
func NewQueryServer(k AccountKeeper) types.QueryServer {
16+
qs := authkeeper.NewQueryServer(k.AccountKeeper)
17+
return queryServer{
18+
qs,
19+
k,
20+
}
21+
}
22+
23+
type queryServer struct {
24+
types.QueryServer
25+
26+
k AccountKeeper
27+
}
28+
29+
func (s queryServer) AccountAddressByID(ctx context.Context, req *types.QueryAccountAddressByIDRequest) (*types.QueryAccountAddressByIDResponse, error) {
30+
return s.QueryServer.AccountAddressByID(ctx, req)
31+
}
32+
33+
func (s queryServer) Accounts(ctx context.Context, req *types.QueryAccountsRequest) (*types.QueryAccountsResponse, error) {
34+
return s.QueryServer.Accounts(ctx, req)
35+
}
36+
37+
// Account returns account details based on address
38+
func (s queryServer) Account(ctx context.Context, req *types.QueryAccountRequest) (*types.QueryAccountResponse, error) {
39+
if req == nil {
40+
return nil, status.Errorf(codes.InvalidArgument, "empty request")
41+
}
42+
43+
if req.Address == "" {
44+
return nil, status.Error(codes.InvalidArgument, "Address cannot be empty")
45+
}
46+
47+
addr, err := s.k.addressCodec.StringToBytes(req.Address)
48+
if err != nil {
49+
return nil, err
50+
}
51+
account := s.k.GetAccount(ctx, addr)
52+
if account == nil {
53+
return nil, status.Errorf(codes.NotFound, "account %s not found", req.Address)
54+
}
55+
56+
any, err := codectypes.NewAnyWithValue(account)
57+
if err != nil {
58+
return nil, status.Errorf(codes.Internal, err.Error())
59+
}
60+
61+
return &types.QueryAccountResponse{Account: any}, nil
62+
}
63+
64+
func (s queryServer) Params(c context.Context, req *types.QueryParamsRequest) (*types.QueryParamsResponse, error) {
65+
return s.QueryServer.Params(c, req)
66+
}
67+
68+
func (s queryServer) ModuleAccounts(c context.Context, req *types.QueryModuleAccountsRequest) (*types.QueryModuleAccountsResponse, error) {
69+
return s.QueryServer.ModuleAccounts(c, req)
70+
}
71+
72+
func (s queryServer) ModuleAccountByName(c context.Context, req *types.QueryModuleAccountByNameRequest) (*types.QueryModuleAccountByNameResponse, error) {
73+
return s.QueryServer.ModuleAccountByName(c, req)
74+
}
75+
76+
func (s queryServer) Bech32Prefix(ctx context.Context, req *types.Bech32PrefixRequest) (*types.Bech32PrefixResponse, error) {
77+
return s.QueryServer.Bech32Prefix(ctx, req)
78+
}
79+
80+
func (s queryServer) AddressBytesToString(ctx context.Context, req *types.AddressBytesToStringRequest) (*types.AddressBytesToStringResponse, error) {
81+
return s.QueryServer.AddressBytesToString(ctx, req)
82+
}
83+
84+
func (s queryServer) AddressStringToBytes(ctx context.Context, req *types.AddressStringToBytesRequest) (*types.AddressStringToBytesResponse, error) {
85+
return s.QueryServer.AddressStringToBytes(ctx, req)
86+
}
87+
88+
// AccountInfo implements the AccountInfo query.
89+
func (s queryServer) AccountInfo(ctx context.Context, req *types.QueryAccountInfoRequest) (*types.QueryAccountInfoResponse, error) {
90+
if req == nil {
91+
return nil, status.Errorf(codes.InvalidArgument, "empty request")
92+
}
93+
94+
if req.Address == "" {
95+
return nil, status.Error(codes.InvalidArgument, "address cannot be empty")
96+
}
97+
98+
addr, err := s.k.addressCodec.StringToBytes(req.Address)
99+
if err != nil {
100+
return nil, err
101+
}
102+
103+
account := s.k.GetAccount(ctx, addr)
104+
if account == nil {
105+
return nil, status.Errorf(codes.NotFound, "account %s not found", req.Address)
106+
}
107+
108+
// if there is no public key, avoid serializing the nil value
109+
pubKey := account.GetPubKey()
110+
var pkAny *codectypes.Any
111+
if pubKey != nil {
112+
pkAny, err = codectypes.NewAnyWithValue(account.GetPubKey())
113+
if err != nil {
114+
return nil, status.Errorf(codes.Internal, err.Error())
115+
}
116+
}
117+
118+
return &types.QueryAccountInfoResponse{
119+
Info: &types.BaseAccount{
120+
Address: req.Address,
121+
PubKey: pkAny,
122+
AccountNumber: account.GetAccountNumber(),
123+
Sequence: account.GetSequence(),
124+
},
125+
}, nil
126+
}

x/auth/keeper/keeper.go

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package keeper
2+
3+
import (
4+
"cosmossdk.io/collections"
5+
ccodec "cosmossdk.io/collections/codec"
6+
"cosmossdk.io/core/address"
7+
"cosmossdk.io/core/store"
8+
9+
"github.com/cosmos/cosmos-sdk/codec"
10+
sdk "github.com/cosmos/cosmos-sdk/types"
11+
authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
12+
13+
"github.com/xpladev/xpla/x/auth/types"
14+
)
15+
16+
type AccountKeeper struct {
17+
authkeeper.AccountKeeper
18+
19+
addressCodec address.Codec
20+
21+
cdc codec.BinaryCodec
22+
storeService store.KVStoreService
23+
24+
// State
25+
SliceAddresses collections.Map[sdk.AccAddress, sdk.AccAddress]
26+
}
27+
28+
func NewAccountKeeper(
29+
cdc codec.BinaryCodec, storeService store.KVStoreService, proto func() sdk.AccountI,
30+
maccPerms map[string][]string, ac address.Codec, bech32Prefix, authority string,
31+
) AccountKeeper {
32+
33+
sb := collections.NewSchemaBuilder(storeService)
34+
35+
ak := AccountKeeper{
36+
AccountKeeper: authkeeper.NewAccountKeeper(cdc, storeService, proto, maccPerms, ac, bech32Prefix, authority),
37+
addressCodec: ac,
38+
cdc: cdc,
39+
storeService: storeService,
40+
SliceAddresses: collections.NewMap(sb, types.SliceAddressStoreKeyPrefix, "sliceAddresses", sdk.AccAddressKey, ccodec.KeyToValueCodec(sdk.AccAddressKey)),
41+
}
42+
43+
return ak
44+
}

0 commit comments

Comments
 (0)