Skip to content

Commit 3523c26

Browse files
authored
feat: (x/bank) add SpendableCoin method to BaseViewKeeper (#12593)
1 parent 818da70 commit 3523c26

4 files changed

Lines changed: 14 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
6767

6868
### API Breaking Changes
6969

70+
* (x/bank) [\#12593](https://github.com/cosmos/cosmos-sdk/pull/12593) Add `SpendableCoin` method to `BaseViewKeeper`
7071
* (x/slashing) [#12581](https://github.com/cosmos/cosmos-sdk/pull/12581) Remove `x/slashing` legacy querier.
7172
* (types) [\#12355](https://github.com/cosmos/cosmos-sdk/pull/12355) Remove the compile-time `types.DBbackend` variable. Removes usage of the same in server/util.go
7273
* (x/gov) [#12368](https://github.com/cosmos/cosmos-sdk/pull/12369) Gov keeper is now passed by reference instead of copy to make post-construction mutation of Hooks and Proposal Handlers possible at a framework level.

x/bank/keeper/keeper_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -708,10 +708,12 @@ func (suite *IntegrationTestSuite) TestSpendableCoins() {
708708
suite.Require().NoError(testutil.FundAccount(app.BankKeeper, ctx, addr2, origCoins))
709709

710710
suite.Require().Equal(origCoins, app.BankKeeper.SpendableCoins(ctx, addr2))
711+
suite.Require().Equal(origCoins[0], app.BankKeeper.SpendableCoin(ctx, addr2, "stake"))
711712

712713
ctx = ctx.WithBlockTime(now.Add(12 * time.Hour))
713714
suite.Require().NoError(app.BankKeeper.DelegateCoins(ctx, addr2, addrModule, delCoins))
714715
suite.Require().Equal(origCoins.Sub(delCoins...), app.BankKeeper.SpendableCoins(ctx, addr1))
716+
suite.Require().Equal(origCoins.Sub(delCoins...)[0], app.BankKeeper.SpendableCoin(ctx, addr1, "stake"))
715717
}
716718

717719
func (suite *IntegrationTestSuite) TestVestingAccountSend() {

x/bank/keeper/view.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ type ViewKeeper interface {
2727
GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin
2828
LockedCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins
2929
SpendableCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins
30+
SpendableCoin(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin
3031

3132
IterateAccountBalances(ctx sdk.Context, addr sdk.AccAddress, cb func(coin sdk.Coin) (stop bool))
3233
IterateAllBalances(ctx sdk.Context, cb func(address sdk.AccAddress, coin sdk.Coin) (stop bool))
@@ -187,6 +188,15 @@ func (k BaseViewKeeper) SpendableCoins(ctx sdk.Context, addr sdk.AccAddress) sdk
187188
return spendable
188189
}
189190

191+
// SpendableCoin returns the balance of specific denomination of spendable coins
192+
// for an account by address. If the account has no spendable coin, a zero Coin
193+
// is returned.
194+
func (k BaseViewKeeper) SpendableCoin(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin {
195+
balance := k.GetBalance(ctx, addr, denom)
196+
locked := k.LockedCoins(ctx, addr)
197+
return balance.SubAmount(locked.AmountOf(denom))
198+
}
199+
190200
// spendableCoins returns the coins the given address can spend alongside the total amount of coins it holds.
191201
// It exists for gas efficiency, in order to avoid to have to get balance multiple times.
192202
func (k BaseViewKeeper) spendableCoins(ctx sdk.Context, addr sdk.AccAddress) (spendable, total sdk.Coins) {

x/bank/spec/02_keepers.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ type ViewKeeper interface {
140140
GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin
141141
LockedCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins
142142
SpendableCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins
143+
SpendableCoin(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin
143144

144145
IterateAccountBalances(ctx sdk.Context, addr sdk.AccAddress, cb func(coin sdk.Coin) (stop bool))
145146
IterateAllBalances(ctx sdk.Context, cb func(address sdk.AccAddress, coin sdk.Coin) (stop bool))

0 commit comments

Comments
 (0)