github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/mock/types.go (about) 1 package mock 2 3 import ( 4 "github.com/fibonacci-chain/fbc/libs/tendermint/crypto" 5 6 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 7 sdkerrors "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/errors" 8 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth" 9 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply" 10 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply/exported" 11 ) 12 13 // DummySupplyKeeper defines a supply keeper used only for testing to avoid 14 // circle dependencies 15 type DummySupplyKeeper struct { 16 ak auth.AccountKeeper 17 } 18 19 // NewDummySupplyKeeper creates a DummySupplyKeeper instance 20 func NewDummySupplyKeeper(ak auth.AccountKeeper) DummySupplyKeeper { 21 return DummySupplyKeeper{ak} 22 } 23 24 // SendCoinsFromAccountToModule for the dummy supply keeper 25 func (sk DummySupplyKeeper) SendCoinsFromAccountToModule(ctx sdk.Context, fromAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error { 26 fromAcc := sk.ak.GetAccount(ctx, fromAddr) 27 moduleAcc := sk.GetModuleAccount(ctx, recipientModule) 28 29 newFromCoins, hasNeg := fromAcc.GetCoins().SafeSub(amt) 30 if hasNeg { 31 return sdkerrors.Wrap(sdkerrors.ErrInsufficientFunds, fromAcc.GetCoins().String()) 32 } 33 34 newToCoins := moduleAcc.GetCoins().Add(amt...) 35 36 if err := fromAcc.SetCoins(newFromCoins); err != nil { 37 return err 38 } 39 40 if err := moduleAcc.SetCoins(newToCoins); err != nil { 41 return err 42 } 43 44 sk.ak.SetAccount(ctx, fromAcc) 45 sk.ak.SetAccount(ctx, moduleAcc) 46 47 return nil 48 } 49 50 // GetModuleAccount for dummy supply keeper 51 func (sk DummySupplyKeeper) GetModuleAccount(ctx sdk.Context, moduleName string) exported.ModuleAccountI { 52 addr := sk.GetModuleAddress(moduleName) 53 54 acc := sk.ak.GetAccount(ctx, addr) 55 if acc != nil { 56 macc, ok := acc.(exported.ModuleAccountI) 57 if ok { 58 return macc 59 } 60 } 61 62 moduleAddress := sk.GetModuleAddress(moduleName) 63 baseAcc := auth.NewBaseAccountWithAddress(moduleAddress) 64 65 // create a new module account 66 macc := &supply.ModuleAccount{ 67 BaseAccount: &baseAcc, 68 Name: moduleName, 69 Permissions: nil, 70 } 71 72 maccI := (sk.ak.NewAccount(ctx, macc)).(exported.ModuleAccountI) 73 sk.ak.SetAccount(ctx, maccI) 74 return maccI 75 } 76 77 // GetModuleAddress for dummy supply keeper 78 func (sk DummySupplyKeeper) GetModuleAddress(moduleName string) sdk.AccAddress { 79 return sdk.AccAddress(crypto.AddressHash([]byte(moduleName))) 80 } 81 82 func (sk DummySupplyKeeper) SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error { 83 recipientAcc := sk.ak.GetAccount(ctx, recipientAddr) 84 moduleAcc := sk.GetModuleAccount(ctx, senderModule) 85 86 newFromCoins, hasNeg := moduleAcc.GetCoins().SafeSub(amt) 87 if hasNeg { 88 return sdkerrors.Wrap(sdkerrors.ErrInsufficientFunds, moduleAcc.GetCoins().String()) 89 } 90 91 newToCoins := recipientAcc.GetCoins().Add(amt...) 92 93 if err := moduleAcc.SetCoins(newFromCoins); err != nil { 94 return err 95 } 96 97 if err := recipientAcc.SetCoins(newToCoins); err != nil { 98 return err 99 } 100 101 sk.ak.SetAccount(ctx, recipientAcc) 102 sk.ak.SetAccount(ctx, moduleAcc) 103 104 return nil 105 }