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  }