diff --git a/x/auction/keeper/auction.go b/x/auction/keeper/auction.go index 2ec0e321..cd5c3d28 100644 --- a/x/auction/keeper/auction.go +++ b/x/auction/keeper/auction.go @@ -102,10 +102,7 @@ func (k Keeper) ExtractBid(ctx sdk.Context, bidder sdk.AccAddress, bid sdk.Coin) var proposerReward sdk.Coins if params.ProposerFee.IsZero() { - // send the entire bid to the escrow account when no proposer fee is set - if err := k.bankKeeper.SendCoins(ctx, bidder, escrowAddress, sdk.NewCoins(bid)); err != nil { - return err - } + return k.SendBid(ctx, bidder, escrowAddress, sdk.NewCoins(bid)) } else { rewardsAddress, err := k.rewardsAddressProvider.GetRewardsAddress(ctx) if err != nil { @@ -118,7 +115,7 @@ func (k Keeper) ExtractBid(ctx sdk.Context, bidder sdk.AccAddress, bid sdk.Coin) bid := sdk.NewDecCoinsFromCoins(bid) proposerReward, _ = bid.MulDecTruncate(params.ProposerFee).TruncateDecimal() - if err := k.bankKeeper.SendCoins(ctx, bidder, rewardsAddress, proposerReward); err != nil { + if err := k.SendBid(ctx, bidder, rewardsAddress, proposerReward); err != nil { return err } @@ -127,7 +124,7 @@ func (k Keeper) ExtractBid(ctx sdk.Context, bidder sdk.AccAddress, bid sdk.Coin) escrowTotal := bid.Sub(sdk.NewDecCoinsFromCoins(proposerReward...)) escrowReward, _ := escrowTotal.TruncateDecimal() - if err := k.bankKeeper.SendCoins(ctx, bidder, escrowAddress, escrowReward); err != nil { + if err := k.SendBid(ctx, bidder, escrowAddress, escrowReward); err != nil { return err } } @@ -206,6 +203,16 @@ func (k Keeper) ValidateBundleTimeouts(bidInfo *types.BidInfo) error { return nil } +// SendBid sends the bid from the bidder to the relevant address. +func (k Keeper) SendBid(ctx sdk.Context, from, to sdk.AccAddress, bid sdk.Coins) error { + moduleAddress := k.accountKeeper.GetModuleAddress(types.ModuleName) + if moduleAddress.Equals(to) { + return k.bankKeeper.SendCoinsFromAccountToModule(ctx, from, types.ModuleName, bid) + } + + return k.bankKeeper.SendCoins(ctx, from, to, bid) +} + // filterSigners removes any signers from the currentSigners map that are not in the txSigners map. func filterSigners(currentSigners, txSigners map[string]struct{}) { for signer := range currentSigners { diff --git a/x/auction/keeper/keeper.go b/x/auction/keeper/keeper.go index 52740b97..af7d88d5 100644 --- a/x/auction/keeper/keeper.go +++ b/x/auction/keeper/keeper.go @@ -18,6 +18,7 @@ type Keeper struct { cdc codec.BinaryCodec storeKey storetypes.StoreKey + accountKeeper types.AccountKeeper bankKeeper types.BankKeeper rewardsAddressProvider types.RewardsAddressProvider @@ -73,6 +74,7 @@ func NewKeeperWithRewardsAddressProvider( return Keeper{ cdc: cdc, storeKey: storeKey, + accountKeeper: accountKeeper, bankKeeper: bankKeeper, rewardsAddressProvider: rewardsAddressProvider, authority: authority, diff --git a/x/auction/types/expected_keepers.go b/x/auction/types/expected_keepers.go index a1039798..22dadcab 100644 --- a/x/auction/types/expected_keepers.go +++ b/x/auction/types/expected_keepers.go @@ -16,6 +16,7 @@ type AccountKeeper interface { // //go:generate mockery --name BankKeeper --output ./mocks --outpkg mocks --case underscore type BankKeeper interface { + SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin } diff --git a/x/auction/types/mocks/account_keeper.go b/x/auction/types/mocks/account_keeper.go index f0ddfcfb..a98ff41b 100644 --- a/x/auction/types/mocks/account_keeper.go +++ b/x/auction/types/mocks/account_keeper.go @@ -33,8 +33,7 @@ func (_m *AccountKeeper) GetModuleAddress(moduleName string) types.AccAddress { func NewAccountKeeper(t interface { mock.TestingT Cleanup(func()) -}, -) *AccountKeeper { +}) *AccountKeeper { mock := &AccountKeeper{} mock.Mock.Test(t) diff --git a/x/auction/types/mocks/bank_keeper.go b/x/auction/types/mocks/bank_keeper.go index e18c7c4a..0f891c0e 100644 --- a/x/auction/types/mocks/bank_keeper.go +++ b/x/auction/types/mocks/bank_keeper.go @@ -40,13 +40,26 @@ func (_m *BankKeeper) SendCoins(ctx types.Context, fromAddr types.AccAddress, to return r0 } +// SendCoinsFromAccountToModule provides a mock function with given fields: ctx, senderAddr, recipientModule, amt +func (_m *BankKeeper) SendCoinsFromAccountToModule(ctx types.Context, senderAddr types.AccAddress, recipientModule string, amt types.Coins) error { + ret := _m.Called(ctx, senderAddr, recipientModule, amt) + + var r0 error + if rf, ok := ret.Get(0).(func(types.Context, types.AccAddress, string, types.Coins) error); ok { + r0 = rf(ctx, senderAddr, recipientModule, amt) + } else { + r0 = ret.Error(0) + } + + return r0 +} + // NewBankKeeper creates a new instance of BankKeeper. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. // The first argument is typically a *testing.T value. func NewBankKeeper(t interface { mock.TestingT Cleanup(func()) -}, -) *BankKeeper { +}) *BankKeeper { mock := &BankKeeper{} mock.Mock.Test(t) diff --git a/x/auction/types/mocks/distribution_keeper.go b/x/auction/types/mocks/distribution_keeper.go index 8301da90..fd21a9e9 100644 --- a/x/auction/types/mocks/distribution_keeper.go +++ b/x/auction/types/mocks/distribution_keeper.go @@ -33,8 +33,7 @@ func (_m *DistributionKeeper) GetPreviousProposerConsAddr(ctx types.Context) typ func NewDistributionKeeper(t interface { mock.TestingT Cleanup(func()) -}, -) *DistributionKeeper { +}) *DistributionKeeper { mock := &DistributionKeeper{} mock.Mock.Test(t) diff --git a/x/auction/types/mocks/rewards_address_provider.go b/x/auction/types/mocks/rewards_address_provider.go index 6932fcd1..5c740bc1 100644 --- a/x/auction/types/mocks/rewards_address_provider.go +++ b/x/auction/types/mocks/rewards_address_provider.go @@ -43,8 +43,7 @@ func (_m *RewardsAddressProvider) GetRewardsAddress(context types.Context) (type func NewRewardsAddressProvider(t interface { mock.TestingT Cleanup(func()) -}, -) *RewardsAddressProvider { +}) *RewardsAddressProvider { mock := &RewardsAddressProvider{} mock.Mock.Test(t) diff --git a/x/auction/types/mocks/staking_keeper.go b/x/auction/types/mocks/staking_keeper.go index 47d818b4..b9163b16 100644 --- a/x/auction/types/mocks/staking_keeper.go +++ b/x/auction/types/mocks/staking_keeper.go @@ -35,8 +35,7 @@ func (_m *StakingKeeper) ValidatorByConsAddr(_a0 types.Context, _a1 types.ConsAd func NewStakingKeeper(t interface { mock.TestingT Cleanup(func()) -}, -) *StakingKeeper { +}) *StakingKeeper { mock := &StakingKeeper{} mock.Mock.Test(t)