Skip to content

Commit 6e5bb30

Browse files
adamewozniakmergify[bot]
authored andcommitted
refactor: x/oracle: make GetExchangeRateBase more efficient (#866)
(cherry picked from commit d919765)
1 parent e9c4a1e commit 6e5bb30

File tree

5 files changed

+51
-28
lines changed

5 files changed

+51
-28
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ Ref: https://keepachangelog.com/en/1.0.0/
4646

4747
## [Unreleased]
4848

49+
### Improvements
50+
51+
- [866](https://github.com/umee-network/umee/pull/866) Make the x/oracle keeper's GetExchangeRateBase method more efficient.
52+
4953
## [v2.0.1](https://github.com/umee-network/umee/releases/tag/v2.0.1) - 2022-04-25
5054

5155
### Features

x/oracle/keeper/ballot_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
)
88

99
func (s *IntegrationTestSuite) TestBallot_OrganizeBallotByDenom() {
10-
s.app.OracleKeeper.SetExchangeRate(s.ctx, exchangeRate, sdk.OneDec())
10+
s.app.OracleKeeper.SetExchangeRate(s.ctx, displayDenom, sdk.OneDec())
1111
claimMap := make(map[string]types.Claim)
1212

1313
// Empty Map

x/oracle/keeper/grpc_query_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,26 @@ import (
1212
)
1313

1414
func (s *IntegrationTestSuite) TestQuerier_ActiveExchangeRates() {
15-
s.app.OracleKeeper.SetExchangeRate(s.ctx, exchangeRate, sdk.OneDec())
15+
s.app.OracleKeeper.SetExchangeRate(s.ctx, displayDenom, sdk.OneDec())
1616
res, err := s.queryClient.ActiveExchangeRates(s.ctx.Context(), &types.QueryActiveExchangeRatesRequest{})
1717
s.Require().NoError(err)
18-
s.Require().Equal([]string{exchangeRate}, res.ActiveRates)
18+
s.Require().Equal([]string{displayDenom}, res.ActiveRates)
1919
}
2020

2121
func (s *IntegrationTestSuite) TestQuerier_ExchangeRates() {
22-
s.app.OracleKeeper.SetExchangeRate(s.ctx, exchangeRate, sdk.OneDec())
22+
s.app.OracleKeeper.SetExchangeRate(s.ctx, displayDenom, sdk.OneDec())
2323
res, err := s.queryClient.ExchangeRates(s.ctx.Context(), &types.QueryExchangeRatesRequest{})
2424
s.Require().NoError(err)
2525
s.Require().Equal(sdk.DecCoins{
26-
sdk.NewDecCoinFromDec(exchangeRate, sdk.OneDec()),
26+
sdk.NewDecCoinFromDec(displayDenom, sdk.OneDec()),
2727
}, res.ExchangeRates)
2828

2929
res, err = s.queryClient.ExchangeRates(s.ctx.Context(), &types.QueryExchangeRatesRequest{
30-
Denom: exchangeRate,
30+
Denom: displayDenom,
3131
})
3232
s.Require().NoError(err)
3333
s.Require().Equal(sdk.DecCoins{
34-
sdk.NewDecCoinFromDec(exchangeRate, sdk.OneDec()),
34+
sdk.NewDecCoinFromDec(displayDenom, sdk.OneDec()),
3535
}, res.ExchangeRates)
3636
}
3737

x/oracle/keeper/keeper.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,13 @@ func (k Keeper) GetExchangeRate(ctx sdk.Context, symbol string) (sdk.Dec, error)
8989
// in the base denom (e.g. ATOM -> uatom)
9090
func (k Keeper) GetExchangeRateBase(ctx sdk.Context, denom string) (sdk.Dec, error) {
9191
var symbol string
92-
92+
var exponent uint64
9393
// Translate the base denom -> symbol
9494
params := k.GetParams(ctx)
9595
for _, listDenom := range params.AcceptList {
9696
if listDenom.BaseDenom == denom {
9797
symbol = listDenom.SymbolDenom
98+
exponent = uint64(listDenom.Exponent)
9899
break
99100
}
100101
}
@@ -107,14 +108,8 @@ func (k Keeper) GetExchangeRateBase(ctx sdk.Context, denom string) (sdk.Dec, err
107108
return sdk.ZeroDec(), err
108109
}
109110

110-
for _, acceptedDenom := range params.AcceptList {
111-
if denom == acceptedDenom.BaseDenom {
112-
powerReduction := ten.Power(uint64(acceptedDenom.Exponent))
113-
return exchangeRate.Quo(powerReduction), nil
114-
}
115-
}
116-
117-
return sdk.ZeroDec(), sdkerrors.Wrap(types.ErrUnknownDenom, denom)
111+
powerReduction := ten.Power(exponent)
112+
return exchangeRate.Quo(powerReduction), nil
118113
}
119114

120115
// SetExchangeRate sets the consensus exchange rate of USD denominated in the

x/oracle/keeper/keeper_test.go

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ import (
2424
)
2525

2626
const (
27-
exchangeRate string = umeeapp.DisplayDenom
27+
displayDenom string = umeeapp.DisplayDenom
28+
bondDenom string = umeeapp.BondDenom
2829
)
2930

3031
type IntegrationTestSuite struct {
@@ -177,7 +178,7 @@ func (s *IntegrationTestSuite) TestAggregateExchangeRateVote() {
177178

178179
var tuples types.ExchangeRateTuples
179180
tuples = append(tuples, types.ExchangeRateTuple{
180-
Denom: exchangeRate,
181+
Denom: displayDenom,
181182
ExchangeRate: sdk.ZeroDec(),
182183
})
183184

@@ -205,8 +206,8 @@ func (s *IntegrationTestSuite) TestAggregateExchangeRateVoteError() {
205206

206207
func (s *IntegrationTestSuite) TestSetExchangeRateWithEvent() {
207208
app, ctx := s.app, s.ctx
208-
app.OracleKeeper.SetExchangeRateWithEvent(ctx, exchangeRate, sdk.OneDec())
209-
rate, err := app.OracleKeeper.GetExchangeRate(ctx, exchangeRate)
209+
app.OracleKeeper.SetExchangeRateWithEvent(ctx, displayDenom, sdk.OneDec())
210+
rate, err := app.OracleKeeper.GetExchangeRate(ctx, displayDenom)
210211
s.Require().NoError(err)
211212
s.Require().Equal(rate, sdk.OneDec())
212213
}
@@ -221,30 +222,53 @@ func (s *IntegrationTestSuite) TestGetExchangeRate_InvalidDenom() {
221222
func (s *IntegrationTestSuite) TestGetExchangeRate_NotSet() {
222223
app, ctx := s.app, s.ctx
223224

224-
_, err := app.OracleKeeper.GetExchangeRate(ctx, exchangeRate)
225+
_, err := app.OracleKeeper.GetExchangeRate(ctx, displayDenom)
225226
s.Require().Error(err)
226227
}
227228

228229
func (s *IntegrationTestSuite) TestGetExchangeRate_Valid() {
229230
app, ctx := s.app, s.ctx
230231

231-
app.OracleKeeper.SetExchangeRate(ctx, exchangeRate, sdk.OneDec())
232-
rate, err := app.OracleKeeper.GetExchangeRate(ctx, exchangeRate)
232+
app.OracleKeeper.SetExchangeRate(ctx, displayDenom, sdk.OneDec())
233+
rate, err := app.OracleKeeper.GetExchangeRate(ctx, displayDenom)
233234
s.Require().NoError(err)
234235
s.Require().Equal(rate, sdk.OneDec())
235236

236-
app.OracleKeeper.SetExchangeRate(ctx, strings.ToLower(exchangeRate), sdk.OneDec())
237-
rate, err = app.OracleKeeper.GetExchangeRate(ctx, exchangeRate)
237+
app.OracleKeeper.SetExchangeRate(ctx, strings.ToLower(displayDenom), sdk.OneDec())
238+
rate, err = app.OracleKeeper.GetExchangeRate(ctx, displayDenom)
238239
s.Require().NoError(err)
239240
s.Require().Equal(rate, sdk.OneDec())
240241
}
241242

243+
func (s *IntegrationTestSuite) TestGetExchangeRateBase() {
244+
oracleParams := s.app.OracleKeeper.GetParams(s.ctx)
245+
246+
var exponent uint64
247+
for _, denom := range oracleParams.AcceptList {
248+
if denom.BaseDenom == bondDenom {
249+
exponent = uint64(denom.Exponent)
250+
}
251+
}
252+
253+
power := sdk.MustNewDecFromStr("10").Power(exponent)
254+
255+
s.app.OracleKeeper.SetExchangeRate(s.ctx, displayDenom, sdk.OneDec())
256+
rate, err := s.app.OracleKeeper.GetExchangeRateBase(s.ctx, bondDenom)
257+
s.Require().NoError(err)
258+
s.Require().Equal(rate.Mul(power), sdk.OneDec())
259+
260+
s.app.OracleKeeper.SetExchangeRate(s.ctx, strings.ToLower(displayDenom), sdk.OneDec())
261+
rate, err = s.app.OracleKeeper.GetExchangeRateBase(s.ctx, bondDenom)
262+
s.Require().NoError(err)
263+
s.Require().Equal(rate.Mul(power), sdk.OneDec())
264+
}
265+
242266
func (s *IntegrationTestSuite) TestDeleteExchangeRate() {
243267
app, ctx := s.app, s.ctx
244268

245-
app.OracleKeeper.SetExchangeRate(ctx, exchangeRate, sdk.OneDec())
246-
app.OracleKeeper.DeleteExchangeRate(ctx, exchangeRate)
247-
_, err := app.OracleKeeper.GetExchangeRate(ctx, exchangeRate)
269+
app.OracleKeeper.SetExchangeRate(ctx, displayDenom, sdk.OneDec())
270+
app.OracleKeeper.DeleteExchangeRate(ctx, displayDenom)
271+
_, err := app.OracleKeeper.GetExchangeRate(ctx, displayDenom)
248272
s.Require().Error(err)
249273
}
250274

0 commit comments

Comments
 (0)