Skip to content

Commit 580df6c

Browse files
committed
fix fee grant for os keyring backend
1 parent e6fc6c2 commit 580df6c

File tree

6 files changed

+70
-40
lines changed

6 files changed

+70
-40
lines changed

cmd/git-credential-gitopia/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func handleGetAction() {
5151
return
5252
}
5353

54-
wallet, err := wallet.InitWallet()
54+
wallet, err := wallet.InitWallet(nil)
5555
if err != nil {
5656
log.Debugf(err.Error())
5757
return

cmd/git-remote-gitopia/gitopia.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
sdk "github.com/cosmos/cosmos-sdk/types"
1616
"github.com/cosmos/cosmos-sdk/types/query"
1717
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
18+
"github.com/cosmos/cosmos-sdk/x/feegrant"
1819
"github.com/gitopia/git-remote-gitopia/config"
1920
core "github.com/gitopia/git-remote-gitopia/core"
2021
"github.com/gitopia/git-remote-gitopia/core/wallet"
@@ -35,8 +36,9 @@ const (
3536
)
3637

3738
type GitopiaHandler struct {
38-
grpcConn *grpc.ClientConn
39-
queryClient gitopiatypes.QueryClient
39+
grpcConn *grpc.ClientConn
40+
queryClient gitopiatypes.QueryClient
41+
feegrantClient feegrant.QueryClient
4042

4143
chainId string
4244
remoteUserId string
@@ -66,6 +68,7 @@ func (h *GitopiaHandler) Initialize(remote *core.Remote) error {
6668

6769
h.queryClient = gitopiatypes.NewQueryClient(h.grpcConn)
6870
serviceClient := tmservice.NewServiceClient(h.grpcConn)
71+
h.feegrantClient = feegrant.NewQueryClient(h.grpcConn)
6972

7073
// Get chain id for signing transaction
7174
nodeInfoRes, err := serviceClient.GetNodeInfo(context.Background(), &tmservice.GetNodeInfoRequest{})
@@ -173,7 +176,7 @@ func (h *GitopiaHandler) Push(remote *core.Remote, refsToPush []core.RefToPush)
173176
var err error
174177

175178
if h.wallet == nil {
176-
h.wallet, err = wallet.InitWallet()
179+
h.wallet, err = wallet.InitWallet(h.feegrantClient)
177180
if err != nil {
178181
return nil, err
179182
}

core/wallet/gitopia_wallet.go

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,14 @@ type GitopiaWalletFile struct {
4545
}
4646

4747
type GitopiaWallet struct {
48-
walletFile GitopiaWalletFile
49-
privateKey cryptotypes.PrivKey
50-
address string
51-
secType secretType
48+
walletFile GitopiaWalletFile
49+
privateKey cryptotypes.PrivKey
50+
address string
51+
secType secretType
52+
feeGranterAddr string
5253
}
5354

54-
func InitGitopiaWallet() (Wallet, error) {
55+
func InitGitopiaWallet(feegrantClient feegrant.QueryClient) (Wallet, error) {
5556
var buffer []byte
5657
var err error
5758
gw := GitopiaWallet{}
@@ -84,6 +85,15 @@ func InitGitopiaWallet() (Wallet, error) {
8485
}
8586
gw.address = sdk.AccAddress(gw.privateKey.PubKey().Address()).String()
8687

88+
fr, _ := feegrantClient.Allowance(context.Background(), &feegrant.QueryAllowanceRequest{
89+
Granter: config.FeeGranterAddr,
90+
Grantee: gw.address,
91+
})
92+
93+
if fr != nil {
94+
gw.feeGranterAddr = fr.Allowance.Granter
95+
}
96+
8797
return gw, nil
8898
}
8999

@@ -170,15 +180,8 @@ func (gw GitopiaWallet) SignAndBroadcast(grpcConn *grpc.ClientConn, msgs []sdk.M
170180
}
171181
txBuilder.SetFeeAmount(fee)
172182

173-
// check fee grant exists
174-
fqc := feegrant.NewQueryClient(grpcConn)
175-
fr, _ := fqc.Allowance(context.Background(), &feegrant.QueryAllowanceRequest{
176-
Granter: config.FeeGranterAddr,
177-
Grantee: gw.Address(),
178-
})
179-
180-
if fr != nil {
181-
feeGranterAddr, err := sdk.AccAddressFromBech32(config.FeeGranterAddr)
183+
if gw.feeGranterAddr != "" {
184+
feeGranterAddr, err := sdk.AccAddressFromBech32(gw.feeGranterAddr)
182185
if err != nil {
183186
return err
184187
}

core/wallet/ledger.go

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,13 @@ import (
3030
)
3131

3232
type Ledger struct {
33-
privateKey cryptotypes.LedgerPrivKey
34-
address string
35-
secType secretType
33+
privateKey cryptotypes.LedgerPrivKey
34+
address string
35+
secType secretType
36+
feeGranterAddr string
3637
}
3738

38-
func InitLedgerWallet() (Wallet, error) {
39+
func InitLedgerWallet(feegrantClient feegrant.QueryClient) (Wallet, error) {
3940
ledgerPrivKey, err := ledger.NewPrivKeySecp256k1Unsafe(hd.BIP44Params{
4041
Purpose: 44,
4142
CoinType: 118,
@@ -47,10 +48,23 @@ func InitLedgerWallet() (Wallet, error) {
4748
return nil, errors.Wrap(err, "error generating ledger key")
4849
}
4950

51+
addr := sdk.AccAddress(ledgerPrivKey.PubKey().Address()).String()
52+
53+
fr, _ := feegrantClient.Allowance(context.Background(), &feegrant.QueryAllowanceRequest{
54+
Granter: config.FeeGranterAddr,
55+
Grantee: addr,
56+
})
57+
58+
feeGranter := ""
59+
if fr != nil {
60+
feeGranter = fr.Allowance.Granter
61+
}
62+
5063
return Ledger{
51-
privateKey: ledgerPrivKey,
52-
secType: LEDGER,
53-
address: sdk.AccAddress(ledgerPrivKey.PubKey().Address()).String(),
64+
privateKey: ledgerPrivKey,
65+
secType: LEDGER,
66+
address: addr,
67+
feeGranterAddr: feeGranter,
5468
}, nil
5569
}
5670

@@ -147,15 +161,8 @@ func (l Ledger) SignAndBroadcast(grpcConn *grpc.ClientConn, msgs []sdk.Msg) erro
147161
}
148162
txBuilder.SetFeeAmount(fee)
149163

150-
// check fee grant exists
151-
fqc := feegrant.NewQueryClient(grpcConn)
152-
fr, _ := fqc.Allowance(context.Background(), &feegrant.QueryAllowanceRequest{
153-
Granter: config.FeeGranterAddr,
154-
Grantee: l.Address(),
155-
})
156-
157-
if fr != nil {
158-
feeGranterAddr, err := sdk.AccAddressFromBech32(config.FeeGranterAddr)
164+
if l.feeGranterAddr != "" {
165+
feeGranterAddr, err := sdk.AccAddressFromBech32(l.feeGranterAddr)
159166
if err != nil {
160167
return err
161168
}

core/wallet/os_keyring.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
sdkkeyring "github.com/cosmos/cosmos-sdk/crypto/keyring"
1414
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
1515
sdk "github.com/cosmos/cosmos-sdk/types"
16+
"github.com/cosmos/cosmos-sdk/x/feegrant"
1617
"github.com/gitopia/git-remote-gitopia/config"
1718
glib "github.com/gitopia/gitopia-go"
1819
"github.com/gitopia/gitopia-go/logger"
@@ -59,7 +60,7 @@ type OSKeyring struct {
5960
secType secretType
6061
}
6162

62-
func InitOSKeyringWallet() (Wallet, error) {
63+
func InitOSKeyringWallet(feegrantClient feegrant.QueryClient) (Wallet, error) {
6364
var key string
6465
var backend string
6566

@@ -84,12 +85,26 @@ func InitOSKeyringWallet() (Wallet, error) {
8485
l := logrus.New()
8586
l.SetOutput(os.Stderr)
8687
ctx := logger.ContextWithValue(context.Background(), l)
87-
glib.WithGitopiaAddr(config.GRPCHost)
88+
glib.WithAppName(AppName)
8889
glib.WithGasPrices(config.GasPrices)
90+
glib.WithGitopiaAddr(config.GRPCHost)
91+
glib.WithChainId(config.ChainId)
92+
glib.WithTmAddr(config.TmAddr)
93+
8994
cc, err := glib.GetClientContextWithOptions(AppName, key, backend)
9095
if err != nil {
9196
return nil, errors.Wrap(err, "error creating cosmos client context")
9297
}
98+
99+
fr, _ := feegrantClient.Allowance(context.Background(), &feegrant.QueryAllowanceRequest{
100+
Granter: config.FeeGranterAddr,
101+
Grantee: cc.FromAddress.String(),
102+
})
103+
104+
if fr != nil {
105+
cc.WithFeeGranterAddress(sdk.MustAccAddressFromBech32(fr.Allowance.Granter))
106+
}
107+
93108
txf := tx.NewFactoryCLI(cc, &pflag.FlagSet{}).WithGasAdjustment(GAS_ADJUSTMENT)
94109
gc, err := glib.NewClient(ctx, cc, txf)
95110
if err != nil {

core/wallet/wallet.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66

77
sdk "github.com/cosmos/cosmos-sdk/types"
8+
"github.com/cosmos/cosmos-sdk/x/feegrant"
89
"google.golang.org/grpc"
910
)
1011

@@ -25,12 +26,13 @@ type Wallet interface {
2526
Address() string
2627
}
2728

28-
func InitWallet() (Wallet, error) {
29-
wallet, err := InitOSKeyringWallet()
29+
// TODO: make options optional
30+
func InitWallet(feegrantClient feegrant.QueryClient) (Wallet, error) {
31+
wallet, err := InitOSKeyringWallet(feegrantClient)
3032
if errors.Is(err, ErrGitopiaKeyNotConfigured) {
31-
wallet, err = InitGitopiaWallet()
33+
wallet, err = InitGitopiaWallet(feegrantClient)
3234
if err != nil {
33-
wallet, err = InitLedgerWallet()
35+
wallet, err = InitLedgerWallet(feegrantClient)
3436
if err != nil {
3537
return nil, fmt.Errorf("fatal: Gitopia wallet is not configured! Set gitopia key or use Ledger")
3638
}

0 commit comments

Comments
 (0)