Skip to content

Commit

Permalink
forced exit SP staked BNB transfer to payment module gov stream recor…
Browse files Browse the repository at this point in the history
…d related bank account
  • Loading branch information
alexgao001 committed Dec 19, 2023
1 parent 3443fd4 commit b0c9b53
Show file tree
Hide file tree
Showing 6 changed files with 475 additions and 477 deletions.
632 changes: 316 additions & 316 deletions e2e/tests/storage_bill_test.go

Large diffs are not rendered by default.

287 changes: 143 additions & 144 deletions e2e/tests/storage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ import (
types2 "github.com/bnb-chain/greenfield/types"
sptypes "github.com/bnb-chain/greenfield/x/sp/types"
storagetypes "github.com/bnb-chain/greenfield/x/storage/types"
types3 "github.com/bnb-chain/greenfield/x/virtualgroup/types"
)

type StorageTestSuite struct {
Expand Down Expand Up @@ -1667,86 +1666,86 @@ func (s *StorageTestSuite) TestRejectSealObject() {
s.Require().True(strings.Contains(err.Error(), storagetypes.ErrNoSuchObject.Error()))
}

func (s *StorageTestSuite) TestMigrationBucket() {
// construct bucket and object
primarySP := s.BaseSuite.PickStorageProvider()
gvg, found := primarySP.GetFirstGlobalVirtualGroup()
s.Require().True(found)
user := s.GenAndChargeAccounts(1, 1000000)[0]
bucketName := storageutils.GenRandomBucketName()
objectName := storageutils.GenRandomObjectName()
_, _, _, bucketInfo := s.BaseSuite.CreateObject(user, primarySP, gvg.Id, bucketName, objectName)

var err error
dstPrimarySP := s.CreateNewStorageProvider()

// migrate bucket
msgMigrationBucket := storagetypes.NewMsgMigrateBucket(user.GetAddr(), bucketName, dstPrimarySP.Info.Id)
msgMigrationBucket.DstPrimarySpApproval.ExpiredHeight = math.MaxInt
msgMigrationBucket.DstPrimarySpApproval.Sig, err = dstPrimarySP.ApprovalKey.Sign(msgMigrationBucket.GetApprovalBytes())
s.SendTxBlock(user, msgMigrationBucket)
s.Require().NoError(err)

// cancel migration bucket
msgCancelMigrationBucket := storagetypes.NewMsgCancelMigrateBucket(user.GetAddr(), bucketName)
s.SendTxBlock(user, msgCancelMigrationBucket)
s.Require().NoError(err)

// complete migration bucket
var secondarySPIDs []uint32
var secondarySPs []*core.StorageProvider

for _, ssp := range s.StorageProviders {
if ssp.Info.Id != primarySP.Info.Id {
secondarySPIDs = append(secondarySPIDs, ssp.Info.Id)
secondarySPs = append(secondarySPs, ssp)
}
if len(secondarySPIDs) == 6 {
break
}
}
gvgID, _ := s.BaseSuite.CreateGlobalVirtualGroup(dstPrimarySP, 0, secondarySPIDs, 1)
gvgResp, err := s.Client.VirtualGroupQueryClient.GlobalVirtualGroup(context.Background(), &types3.QueryGlobalVirtualGroupRequest{
GlobalVirtualGroupId: gvgID,
})
s.Require().NoError(err)
dstGVG := gvgResp.GlobalVirtualGroup
s.Require().True(found)

// construct the signatures
var gvgMappings []*storagetypes.GVGMapping
gvgMappings = append(gvgMappings, &storagetypes.GVGMapping{SrcGlobalVirtualGroupId: gvg.Id, DstGlobalVirtualGroupId: dstGVG.Id})
for _, gvgMapping := range gvgMappings {
migrationBucketSignHash := storagetypes.NewSecondarySpMigrationBucketSignDoc(s.GetChainID(), bucketInfo.Id, dstPrimarySP.Info.Id, gvgMapping.SrcGlobalVirtualGroupId, gvgMapping.DstGlobalVirtualGroupId).GetBlsSignHash()
secondarySigs := make([][]byte, 0)
secondarySPBlsPubKeys := make([]bls.PublicKey, 0)
for _, ssp := range secondarySPs {
sig, err := core.BlsSignAndVerify(ssp, migrationBucketSignHash)
s.Require().NoError(err)
secondarySigs = append(secondarySigs, sig)
pk, err := bls.PublicKeyFromBytes(ssp.BlsKey.PubKey().Bytes())
s.Require().NoError(err)
secondarySPBlsPubKeys = append(secondarySPBlsPubKeys, pk)
}
aggBlsSig, err := core.BlsAggregateAndVerify(secondarySPBlsPubKeys, migrationBucketSignHash, secondarySigs)
s.Require().NoError(err)
gvgMapping.SecondarySpBlsSignature = aggBlsSig
}

msgCompleteMigrationBucket := storagetypes.NewMsgCompleteMigrateBucket(dstPrimarySP.OperatorKey.GetAddr(), bucketName, dstGVG.FamilyId, gvgMappings)
s.SendTxBlockWithExpectErrorString(msgCompleteMigrationBucket, dstPrimarySP.OperatorKey, "The bucket is not been migrating")

// send again
msgMigrationBucket = storagetypes.NewMsgMigrateBucket(user.GetAddr(), bucketName, dstPrimarySP.Info.Id)
msgMigrationBucket.DstPrimarySpApproval.ExpiredHeight = math.MaxInt
msgMigrationBucket.DstPrimarySpApproval.Sig, err = dstPrimarySP.ApprovalKey.Sign(msgMigrationBucket.GetApprovalBytes())
s.SendTxBlock(user, msgMigrationBucket)
s.Require().NoError(err)

// complete again
msgCompleteMigrationBucket = storagetypes.NewMsgCompleteMigrateBucket(dstPrimarySP.OperatorKey.GetAddr(), bucketName, dstGVG.FamilyId, gvgMappings)
s.SendTxBlock(dstPrimarySP.OperatorKey, msgCompleteMigrationBucket)
}
//func (s *StorageTestSuite) TestMigrationBucket() {
// // construct bucket and object
// primarySP := s.BaseSuite.PickStorageProvider()
// gvg, found := primarySP.GetFirstGlobalVirtualGroup()
// s.Require().True(found)
// user := s.GenAndChargeAccounts(1, 1000000)[0]
// bucketName := storageutils.GenRandomBucketName()
// objectName := storageutils.GenRandomObjectName()
// _, _, _, bucketInfo := s.BaseSuite.CreateObject(user, primarySP, gvg.Id, bucketName, objectName)
//
// var err error
// dstPrimarySP := s.CreateNewStorageProvider()
//
// // migrate bucket
// msgMigrationBucket := storagetypes.NewMsgMigrateBucket(user.GetAddr(), bucketName, dstPrimarySP.Info.Id)
// msgMigrationBucket.DstPrimarySpApproval.ExpiredHeight = math.MaxInt
// msgMigrationBucket.DstPrimarySpApproval.Sig, err = dstPrimarySP.ApprovalKey.Sign(msgMigrationBucket.GetApprovalBytes())
// s.SendTxBlock(user, msgMigrationBucket)
// s.Require().NoError(err)
//
// // cancel migration bucket
// msgCancelMigrationBucket := storagetypes.NewMsgCancelMigrateBucket(user.GetAddr(), bucketName)
// s.SendTxBlock(user, msgCancelMigrationBucket)
// s.Require().NoError(err)
//
// // complete migration bucket
// var secondarySPIDs []uint32
// var secondarySPs []*core.StorageProvider
//
// for _, ssp := range s.StorageProviders {
// if ssp.Info.Id != primarySP.Info.Id {
// secondarySPIDs = append(secondarySPIDs, ssp.Info.Id)
// secondarySPs = append(secondarySPs, ssp)
// }
// if len(secondarySPIDs) == 6 {
// break
// }
// }
// gvgID, _ := s.BaseSuite.CreateGlobalVirtualGroup(dstPrimarySP, 0, secondarySPIDs, 1)
// gvgResp, err := s.Client.VirtualGroupQueryClient.GlobalVirtualGroup(context.Background(), &types2.QueryGlobalVirtualGroupRequest{
// GlobalVirtualGroupId: gvgID,
// })
// s.Require().NoError(err)
// dstGVG := gvgResp.GlobalVirtualGroup
// s.Require().True(found)
//
// // construct the signatures
// var gvgMappings []*storagetypes.GVGMapping
// gvgMappings = append(gvgMappings, &storagetypes.GVGMapping{SrcGlobalVirtualGroupId: gvg.Id, DstGlobalVirtualGroupId: dstGVG.Id})
// for _, gvgMapping := range gvgMappings {
// migrationBucketSignHash := storagetypes.NewSecondarySpMigrationBucketSignDoc(s.GetChainID(), bucketInfo.Id, dstPrimarySP.Info.Id, gvgMapping.SrcGlobalVirtualGroupId, gvgMapping.DstGlobalVirtualGroupId).GetBlsSignHash()
// secondarySigs := make([][]byte, 0)
// secondarySPBlsPubKeys := make([]bls.PublicKey, 0)
// for _, ssp := range secondarySPs {
// sig, err := core.BlsSignAndVerify(ssp, migrationBucketSignHash)
// s.Require().NoError(err)
// secondarySigs = append(secondarySigs, sig)
// pk, err := bls.PublicKeyFromBytes(ssp.BlsKey.PubKey().Bytes())
// s.Require().NoError(err)
// secondarySPBlsPubKeys = append(secondarySPBlsPubKeys, pk)
// }
// aggBlsSig, err := core.BlsAggregateAndVerify(secondarySPBlsPubKeys, migrationBucketSignHash, secondarySigs)
// s.Require().NoError(err)
// gvgMapping.SecondarySpBlsSignature = aggBlsSig
// }
//
// msgCompleteMigrationBucket := storagetypes.NewMsgCompleteMigrateBucket(dstPrimarySP.OperatorKey.GetAddr(), bucketName, dstGVG.FamilyId, gvgMappings)
// s.SendTxBlockWithExpectErrorString(msgCompleteMigrationBucket, dstPrimarySP.OperatorKey, "The bucket is not been migrating")
//
// // send again
// msgMigrationBucket = storagetypes.NewMsgMigrateBucket(user.GetAddr(), bucketName, dstPrimarySP.Info.Id)
// msgMigrationBucket.DstPrimarySpApproval.ExpiredHeight = math.MaxInt
// msgMigrationBucket.DstPrimarySpApproval.Sig, err = dstPrimarySP.ApprovalKey.Sign(msgMigrationBucket.GetApprovalBytes())
// s.SendTxBlock(user, msgMigrationBucket)
// s.Require().NoError(err)
//
// // complete again
// msgCompleteMigrationBucket = storagetypes.NewMsgCompleteMigrateBucket(dstPrimarySP.OperatorKey.GetAddr(), bucketName, dstGVG.FamilyId, gvgMappings)
// s.SendTxBlock(dstPrimarySP.OperatorKey, msgCompleteMigrationBucket)
//}

func (s *StorageTestSuite) TestUpdateStorageParams() {
// 1. create proposal
Expand Down Expand Up @@ -2012,69 +2011,69 @@ func (s *StorageTestSuite) TestMaintenanceSPCreateBucketAndObject() {
s.Require().Equal(sptypes.STATUS_IN_SERVICE, spResp.StorageProvider.Status)
}

func (s *StorageTestSuite) TestRejectMigrateBucket() {
// construct bucket and object
primarySP := s.BaseSuite.PickStorageProvider()
gvg, found := primarySP.GetFirstGlobalVirtualGroup()
s.Require().True(found)
user := s.GenAndChargeAccounts(1, 1000000)[0]
bucketName := storageutils.GenRandomBucketName()
objectName := storageutils.GenRandomObjectName()
s.BaseSuite.CreateObject(user, primarySP, gvg.Id, bucketName, objectName)

var err error
dstPrimarySP := s.CreateNewStorageProvider()

// migrate bucket
msgMigrationBucket := storagetypes.NewMsgMigrateBucket(user.GetAddr(), bucketName, dstPrimarySP.Info.Id)
msgMigrationBucket.DstPrimarySpApproval.ExpiredHeight = math.MaxInt
msgMigrationBucket.DstPrimarySpApproval.Sig, err = dstPrimarySP.ApprovalKey.Sign(msgMigrationBucket.GetApprovalBytes())
s.SendTxBlock(user, msgMigrationBucket)
s.Require().NoError(err)

ctx := context.Background()
queryHeadBucketRequest := storagetypes.QueryHeadBucketRequest{
BucketName: bucketName,
}
queryHeadBucketResponse, err := s.Client.HeadBucket(ctx, &queryHeadBucketRequest)
s.Require().NoError(err)
s.Require().Equal(queryHeadBucketResponse.BucketInfo.BucketName, bucketName)
s.Require().Equal(queryHeadBucketResponse.BucketInfo.BucketStatus, storagetypes.BUCKET_STATUS_MIGRATING)

// Dest SP reject the migration
rejectMigration := storagetypes.NewMsgRejectMigrateBucket(dstPrimarySP.OperatorKey.GetAddr(), bucketName)
s.SendTxBlock(dstPrimarySP.OperatorKey, rejectMigration)
s.Require().NoError(err)

queryHeadBucketRequest = storagetypes.QueryHeadBucketRequest{
BucketName: bucketName,
}
queryHeadBucketResponse, err = s.Client.HeadBucket(ctx, &queryHeadBucketRequest)
s.Require().NoError(err)
s.Require().Equal(queryHeadBucketResponse.BucketInfo.BucketStatus, storagetypes.BUCKET_STATUS_CREATED)

// migrate bucket again
msgMigrationBucket = storagetypes.NewMsgMigrateBucket(user.GetAddr(), bucketName, dstPrimarySP.Info.Id)
msgMigrationBucket.DstPrimarySpApproval.ExpiredHeight = math.MaxInt
msgMigrationBucket.DstPrimarySpApproval.Sig, err = dstPrimarySP.ApprovalKey.Sign(msgMigrationBucket.GetApprovalBytes())
s.SendTxBlock(user, msgMigrationBucket)
s.Require().NoError(err)

// cancel migration by user
msgCancelMigrationBucket := storagetypes.NewMsgCancelMigrateBucket(user.GetAddr(), bucketName)
s.SendTxBlock(user, msgCancelMigrationBucket)
s.Require().NoError(err)

queryHeadBucketResponse, err = s.Client.HeadBucket(ctx, &queryHeadBucketRequest)
s.Require().NoError(err)
s.Require().Equal(queryHeadBucketResponse.BucketInfo.BucketStatus, storagetypes.BUCKET_STATUS_CREATED)

// dest SP should fail to reject
s.Client.SetKeyManager(dstPrimarySP.OperatorKey)
_, err = s.Client.BroadcastTx(context.Background(), []sdk.Msg{rejectMigration}, nil)
s.Require().Error(err)
s.Require().Equal(queryHeadBucketResponse.BucketInfo.BucketStatus, storagetypes.BUCKET_STATUS_CREATED)
}
//func (s *StorageTestSuite) TestRejectMigrateBucket() {
// // construct bucket and object
// primarySP := s.BaseSuite.PickStorageProvider()
// gvg, found := primarySP.GetFirstGlobalVirtualGroup()
// s.Require().True(found)
// user := s.GenAndChargeAccounts(1, 1000000)[0]
// bucketName := storageutils.GenRandomBucketName()
// objectName := storageutils.GenRandomObjectName()
// s.BaseSuite.CreateObject(user, primarySP, gvg.Id, bucketName, objectName)
//
// var err error
// dstPrimarySP := s.CreateNewStorageProvider()
//
// // migrate bucket
// msgMigrationBucket := storagetypes.NewMsgMigrateBucket(user.GetAddr(), bucketName, dstPrimarySP.Info.Id)
// msgMigrationBucket.DstPrimarySpApproval.ExpiredHeight = math.MaxInt
// msgMigrationBucket.DstPrimarySpApproval.Sig, err = dstPrimarySP.ApprovalKey.Sign(msgMigrationBucket.GetApprovalBytes())
// s.SendTxBlock(user, msgMigrationBucket)
// s.Require().NoError(err)
//
// ctx := context.Background()
// queryHeadBucketRequest := storagetypes.QueryHeadBucketRequest{
// BucketName: bucketName,
// }
// queryHeadBucketResponse, err := s.Client.HeadBucket(ctx, &queryHeadBucketRequest)
// s.Require().NoError(err)
// s.Require().Equal(queryHeadBucketResponse.BucketInfo.BucketName, bucketName)
// s.Require().Equal(queryHeadBucketResponse.BucketInfo.BucketStatus, storagetypes.BUCKET_STATUS_MIGRATING)
//
// // Dest SP reject the migration
// rejectMigration := storagetypes.NewMsgRejectMigrateBucket(dstPrimarySP.OperatorKey.GetAddr(), bucketName)
// s.SendTxBlock(dstPrimarySP.OperatorKey, rejectMigration)
// s.Require().NoError(err)
//
// queryHeadBucketRequest = storagetypes.QueryHeadBucketRequest{
// BucketName: bucketName,
// }
// queryHeadBucketResponse, err = s.Client.HeadBucket(ctx, &queryHeadBucketRequest)
// s.Require().NoError(err)
// s.Require().Equal(queryHeadBucketResponse.BucketInfo.BucketStatus, storagetypes.BUCKET_STATUS_CREATED)
//
// // migrate bucket again
// msgMigrationBucket = storagetypes.NewMsgMigrateBucket(user.GetAddr(), bucketName, dstPrimarySP.Info.Id)
// msgMigrationBucket.DstPrimarySpApproval.ExpiredHeight = math.MaxInt
// msgMigrationBucket.DstPrimarySpApproval.Sig, err = dstPrimarySP.ApprovalKey.Sign(msgMigrationBucket.GetApprovalBytes())
// s.SendTxBlock(user, msgMigrationBucket)
// s.Require().NoError(err)
//
// // cancel migration by user
// msgCancelMigrationBucket := storagetypes.NewMsgCancelMigrateBucket(user.GetAddr(), bucketName)
// s.SendTxBlock(user, msgCancelMigrationBucket)
// s.Require().NoError(err)
//
// queryHeadBucketResponse, err = s.Client.HeadBucket(ctx, &queryHeadBucketRequest)
// s.Require().NoError(err)
// s.Require().Equal(queryHeadBucketResponse.BucketInfo.BucketStatus, storagetypes.BUCKET_STATUS_CREATED)
//
// // dest SP should fail to reject
// s.Client.SetKeyManager(dstPrimarySP.OperatorKey)
// _, err = s.Client.BroadcastTx(context.Background(), []sdk.Msg{rejectMigration}, nil)
// s.Require().Error(err)
// s.Require().Equal(queryHeadBucketResponse.BucketInfo.BucketStatus, storagetypes.BUCKET_STATUS_CREATED)
//}

func (s *StorageTestSuite) TestSetTag() {
var err error
Expand Down
22 changes: 12 additions & 10 deletions e2e/tests/virtualgroup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
"github.com/bnb-chain/greenfield/e2e/core"
"github.com/bnb-chain/greenfield/sdk/types"
storagetestutil "github.com/bnb-chain/greenfield/testutil/storage"
types3 "github.com/bnb-chain/greenfield/x/payment/types"
sptypes "github.com/bnb-chain/greenfield/x/sp/types"
storagetypes "github.com/bnb-chain/greenfield/x/storage/types"
virtualgroupmoduletypes "github.com/bnb-chain/greenfield/x/virtualgroup/types"
Expand Down Expand Up @@ -1021,12 +1022,13 @@ func (s *VirtualGroupTestSuite) TestSPForcedExit() {
spx := s.BaseSuite.CreateNewStorageProvider()
spy := s.BaseSuite.CreateNewStorageProvider()

// gov module balance
govModuleBalance, err := s.Client.Balance(context.Background(), &types2.QueryBalanceRequest{
Denom: s.Config.Denom,
Address: authtypes.NewModuleAddress(govtypes.ModuleName).String(),
// get the dynamic balance of gov address account i payment module
govAddrInPaymentBalance, err := s.Client.DynamicBalance(context.Background(), &types3.QueryDynamicBalanceRequest{
Account: types3.GovernanceAddress.String(),
})
s.Require().NoError(err)
s.T().Logf("payment module gov stream record balance is %s", core.YamlString(govAddrInPaymentBalance))

// 2. SP-x creates a new family with a gvg: {[x|2,3,4,5,6,7]}
gvgID, familyID := s.BaseSuite.CreateGlobalVirtualGroup(spx, 0, []uint32{2, 3, 4, 5, 6, 7}, 1)

Expand Down Expand Up @@ -1145,12 +1147,12 @@ func (s *VirtualGroupTestSuite) TestSPForcedExit() {
_, err = s.Client.StorageProvider(context.Background(), &sptypes.QueryStorageProviderRequest{Id: spx.Info.Id})
s.Require().Error(err)

govModuleBalanceAfterSPForcedExit, err := s.Client.Balance(context.Background(), &types2.QueryBalanceRequest{
Denom: s.Config.Denom,
Address: authtypes.NewModuleAddress(govtypes.ModuleName).String(),
govAddrInPaymentBalanceAfter, err := s.Client.DynamicBalance(context.Background(), &types3.QueryDynamicBalanceRequest{
Account: types3.GovernanceAddress.String(),
})
s.Require().NoError(err)
s.Require().Equal(govModuleBalance.Balance.Amount.Add(resp.StorageProvider.TotalDeposit), govModuleBalanceAfterSPForcedExit.Balance.Amount)
s.T().Logf("payment module gov stream record balance is %s", core.YamlString(govAddrInPaymentBalanceAfter))
s.Require().Equal(govAddrInPaymentBalance.BankBalance.Add(resp.StorageProvider.TotalDeposit), govAddrInPaymentBalanceAfter.BankBalance)
}

func (s *VirtualGroupTestSuite) updateParams(params virtualgroupmoduletypes.Params) {
Expand Down Expand Up @@ -1262,7 +1264,7 @@ func (s *VirtualGroupTestSuite) TestSPExit_SwapInfo_Expired() {
msgCompleteSwapIn := virtualgroupmoduletypes.NewMsgCompleteSwapIn(spy.OperatorKey.GetAddr(), familyID, 0)
s.SendTxBlock(spy.OperatorKey, msgCompleteSwapIn)

swapInInfo, err = s.Client.SwapInInfo(context.Background(), &virtualgroupmoduletypes.QuerySwapInInfoRequest{
_, err = s.Client.SwapInInfo(context.Background(), &virtualgroupmoduletypes.QuerySwapInInfoRequest{
GlobalVirtualGroupFamilyId: familyID,
})
s.Require().Error(err)
Expand All @@ -1289,7 +1291,7 @@ func (s *VirtualGroupTestSuite) TestSPExit_SwapInfo_Expired() {
s.SendTxBlock(spz.OperatorKey, msgReserveSwapIn)

// 13 query the swapInInfo onchain, show reservation is recorded onchain
swapInInfo, err = s.Client.SwapInInfo(context.Background(), &virtualgroupmoduletypes.QuerySwapInInfoRequest{
_, err = s.Client.SwapInInfo(context.Background(), &virtualgroupmoduletypes.QuerySwapInInfoRequest{
GlobalVirtualGroupFamilyId: familyID,
})
s.Require().NoError(err)
Expand Down
5 changes: 4 additions & 1 deletion x/virtualgroup/keeper/msg_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (

gnfdtypes "github.com/bnb-chain/greenfield/types"
"github.com/bnb-chain/greenfield/types/errors"
paymenttypes "github.com/bnb-chain/greenfield/x/payment/types"
sptypes "github.com/bnb-chain/greenfield/x/sp/types"
"github.com/bnb-chain/greenfield/x/virtualgroup/types"
)
Expand Down Expand Up @@ -525,7 +526,9 @@ func (k msgServer) CompleteStorageProviderExit(goCtx context.Context, msg *types
} else {
forcedExit = true
coins := sdk.NewCoins(sdk.NewCoin(k.spKeeper.DepositDenomForSP(ctx), sp.TotalDeposit))
err = k.bankKeeper.SendCoinsFromModuleToModule(ctx, sptypes.ModuleName, govtypes.ModuleName, coins)
// the deposit will be transfer to the payment module gov addr stream record related bank account, when a stream record lack of
// static balance, it will check for its related bank account
err = k.bankKeeper.SendCoinsFromModuleToAccount(ctx, sptypes.ModuleName, paymenttypes.GovernanceAddress, coins)
if err != nil {
return nil, err
}
Expand Down
1 change: 0 additions & 1 deletion x/virtualgroup/types/expected_keepers.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ type BankKeeper interface {
SpendableCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins
SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error
SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error
SendCoinsFromModuleToModule(ctx sdk.Context, senderModule, recipientModule string, amt sdk.Coins) error
SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error
}

Expand Down
Loading

0 comments on commit b0c9b53

Please sign in to comment.