Skip to content

Commit ed54ee6

Browse files
Merge pull request #117 from oraichain/add-query-prices
Add query prices
2 parents c897b12 + 628c889 commit ed54ee6

File tree

7 files changed

+682
-26
lines changed

7 files changed

+682
-26
lines changed

proto/cosmwasm/txfees/v1/query.proto

+19
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ syntax = "proto3";
22
package cosmwasm.txfees.v1;
33

44
import "gogoproto/gogo.proto";
5+
import "cosmos_proto/cosmos.proto";
56
import "google/api/annotations.proto";
67
import "cosmos/base/query/v1beta1/pagination.proto";
78
import "cosmwasm/txfees/v1/params.proto";
@@ -21,6 +22,10 @@ service Query {
2122
option (google.api.http).get = "/cosmwasm/txfees/v1/allowed_tokens";
2223
}
2324

25+
rpc TokenExchangeRate(QueryTokenExchangeRateRequest) returns (QueryTokenExchangeRateResponse) {
26+
option (google.api.http).get = "/cosmwasm/txfees/v1/token_exchange_rate";
27+
}
28+
2429
}
2530

2631
// QueryParamsRequest is the request type for the Query/Params RPC method.
@@ -40,3 +45,17 @@ message QueryAllowedTokensResponse {
4045
// tokens defines the parameters of the module.
4146
repeated string tokens = 1 [ (gogoproto.nullable) = false ];
4247
}
48+
49+
message QueryTokenExchangeRateRequest {
50+
string denom = 1;
51+
}
52+
53+
message QueryTokenExchangeRateResponse {
54+
string base_denom = 1;
55+
string quote_denom = 2;
56+
string rate = 3 [
57+
(cosmos_proto.scalar) = "cosmos.Dec",
58+
(gogoproto.customtype) = "cosmossdk.io/math.LegacyDec",
59+
(gogoproto.nullable) = false
60+
];
61+
}

tests/interchaintest/helpers/types.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ type QueryWasmGasLessContracts struct {
3838
}
3939

4040
type QueryTxfeesTokenExchangeRate struct {
41-
Rate string `json:"rate`
41+
BaseDenom string `json:"base_denom"`
42+
QuoteDenom string `json:"quote_denom"`
43+
Rate string `json:"rate"`
4244
}
4345

4446
type PageResponse struct {

tests/interchaintest/txfees_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,11 @@ func TestAddFeeToken(t *testing.T) {
112112
_, err = cosmos.PollForProposalStatus(ctx, orai, height, height+10, proposalAddFeeToken, govv1beta1.StatusPassed)
113113
require.NoError(t, err, "proposal status did not change to passed in expected number of blocks")
114114

115+
// execute a transaction with new fee token
116+
rate, err := helpers.QueryTokenExchangeRate(ctx, orai, expectedDenom)
117+
require.NoError(t, err)
118+
require.NotEmpty(t, rate)
119+
115120
receiver := CreateTestingUser(t, ctx, t.Name(), math.OneInt(), chains...)[0]
116121
sendAmount := ibc.WalletAmount{
117122
Address: receiver.FormattedAddress(),

x/txfees/client/cli/query.go

+30
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ func GetQueryCmd() *cobra.Command {
2323
cmd.AddCommand(
2424
GetParams(),
2525
GetAllowedTokens(),
26+
GetTokenExchangeRate(),
2627
)
2728

2829
return cmd
@@ -81,3 +82,32 @@ func GetAllowedTokens() *cobra.Command {
8182

8283
return cmd
8384
}
85+
86+
// GetTokenExchangeRate returns the exchange rate of allowed token for the module
87+
func GetTokenExchangeRate() *cobra.Command {
88+
cmd := &cobra.Command{
89+
Use: "token-exchange-rate [denom] [flags]",
90+
Short: "Get the exchange rate of allowed token for the x/txfees module",
91+
Args: cobra.ExactArgs(1),
92+
RunE: func(cmd *cobra.Command, args []string) error {
93+
clientCtx, err := client.GetClientQueryContext(cmd)
94+
if err != nil {
95+
return err
96+
}
97+
queryClient := types.NewQueryClient(clientCtx)
98+
99+
res, err := queryClient.TokenExchangeRate(cmd.Context(), &types.QueryTokenExchangeRateRequest{
100+
Denom: args[0],
101+
})
102+
if err != nil {
103+
return err
104+
}
105+
106+
return clientCtx.PrintProto(res)
107+
},
108+
}
109+
110+
flags.AddQueryFlagsToCmd(cmd)
111+
112+
return cmd
113+
}

x/txfees/keeper/grpc_query.go

+30
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package keeper
33
import (
44
"context"
55

6+
errors "cosmossdk.io/errors"
67
"github.com/CosmWasm/wasmd/x/txfees/types"
78

89
sdk "github.com/cosmos/cosmos-sdk/types"
@@ -31,3 +32,32 @@ func (k Keeper) AllowedTokens(ctx context.Context, _ *types.QueryAllowedTokensRe
3132

3233
return &types.QueryAllowedTokensResponse{Tokens: tokens}, nil
3334
}
35+
36+
func (k Keeper) TokenExchangeRate(ctx context.Context, req *types.QueryTokenExchangeRateRequest) (*types.QueryTokenExchangeRateResponse, error) {
37+
sdkCtx := sdk.UnwrapSDKContext(ctx)
38+
39+
allowed, err := k.IsTokenAllowed(sdkCtx, req.Denom)
40+
if err != nil {
41+
return nil, err
42+
}
43+
44+
if !allowed {
45+
return nil, errors.Wrapf(types.ErrTokenAllowed, "token %s is not allowed", req.Denom)
46+
}
47+
48+
baseDenom, err := k.GetBaseTokenDenom(sdkCtx)
49+
if err != nil {
50+
return nil, err
51+
}
52+
53+
rate, err := k.QueryOraiDexTokenExchangeRate(sdkCtx, req.Denom)
54+
if err != nil {
55+
return nil, err
56+
}
57+
58+
return &types.QueryTokenExchangeRateResponse{
59+
BaseDenom: baseDenom,
60+
QuoteDenom: req.Denom,
61+
Rate: rate,
62+
}, nil
63+
}

0 commit comments

Comments
 (0)