github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/ibc-go/modules/apps/transfer/keeper/keeper.go (about)

     1  package keeper
     2  
     3  import (
     4  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
     5  	types2 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec/types"
     6  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/prefix"
     7  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     8  	sdkerrors "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/errors"
     9  	capabilitykeeper "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/capability/keeper"
    10  	capabilitytypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/capability/types"
    11  	paramtypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/params"
    12  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply/exported"
    13  	"github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/transfer/types"
    14  	channeltypes "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/core/04-channel/types"
    15  	host "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/core/24-host"
    16  	tmbytes "github.com/fibonacci-chain/fbc/libs/tendermint/libs/bytes"
    17  	"github.com/fibonacci-chain/fbc/libs/tendermint/libs/log"
    18  )
    19  
    20  // Keeper defines the IBC fungible transfer keeper
    21  type Keeper struct {
    22  	storeKey   sdk.StoreKey
    23  	cdc        *codec.CodecProxy
    24  	paramSpace paramtypes.Subspace
    25  
    26  	channelKeeper types.ChannelKeeper
    27  	portKeeper    types.PortKeeper
    28  	authKeeper    types.AccountKeeper
    29  	bankKeeper    types.BankKeeper
    30  	scopedKeeper  capabilitykeeper.ScopedKeeper
    31  
    32  	hooks     types.TransferHooks
    33  	ibcFactor int64
    34  }
    35  
    36  // NewKeeper creates a new IBC transfer Keeper instance
    37  func NewKeeper(
    38  	proxy *codec.CodecProxy, key sdk.StoreKey, paramSpace paramtypes.Subspace,
    39  	channelKeeper types.ChannelKeeper, portKeeper types.PortKeeper,
    40  	authKeeper types.AccountKeeper, bankKeeper types.BankKeeper, scopedKeeper capabilitykeeper.ScopedKeeper,
    41  	registry types2.InterfaceRegistry,
    42  ) Keeper {
    43  
    44  	//mm := codec.NewProtoCodec(registry)
    45  	//proxy:=codec.NewMarshalProxy(mm,cdc)
    46  	// ensure ibc transfer module account is set
    47  	if addr := authKeeper.GetModuleAddress(types.ModuleName); addr == nil {
    48  		panic("the IBC transfer module account has not been set")
    49  	}
    50  
    51  	// set KeyTable if it has not already been set
    52  	if !paramSpace.HasKeyTable() {
    53  		paramSpace = paramSpace.WithKeyTable(types.ParamKeyTable())
    54  	}
    55  
    56  	return Keeper{
    57  		storeKey:      key,
    58  		cdc:           proxy,
    59  		paramSpace:    paramSpace,
    60  		channelKeeper: channelKeeper,
    61  		portKeeper:    portKeeper,
    62  		authKeeper:    authKeeper,
    63  		bankKeeper:    bankKeeper,
    64  		scopedKeeper:  scopedKeeper,
    65  		ibcFactor:     1000000,
    66  	}
    67  }
    68  
    69  // Logger returns a module-specific logger.
    70  func (k Keeper) Logger(ctx sdk.Context) log.Logger {
    71  	return ctx.Logger().With("module", "x/"+host.ModuleName+"-"+types.ModuleName)
    72  }
    73  
    74  // GetTransferAccount returns the ICS20 - transfers ModuleAccount
    75  func (k Keeper) GetTransferAccount(ctx sdk.Context) exported.ModuleAccountI {
    76  	return k.authKeeper.GetModuleAccount(ctx, types.ModuleName)
    77  }
    78  
    79  // ChanCloseInit defines a wrapper function for the channel Keeper's function
    80  // in order to expose it to the ICS20 transfer handler.
    81  func (k Keeper) ChanCloseInit(ctx sdk.Context, portID, channelID string) error {
    82  	capName := host.ChannelCapabilityPath(portID, channelID)
    83  	chanCap, ok := k.scopedKeeper.GetCapability(ctx, capName)
    84  	if !ok {
    85  		return sdkerrors.Wrapf(channeltypes.ErrChannelCapabilityNotFound, "could not retrieve channel capability at: %s", capName)
    86  	}
    87  	return k.channelKeeper.ChanCloseInit(ctx, portID, channelID, chanCap)
    88  }
    89  
    90  // IsBound checks if the transfer module is already bound to the desired port
    91  func (k Keeper) IsBound(ctx sdk.Context, portID string) bool {
    92  	_, ok := k.scopedKeeper.GetCapability(ctx, host.PortPath(portID))
    93  	return ok
    94  }
    95  
    96  // BindPort defines a wrapper function for the ort Keeper's function in
    97  // order to expose it to module's InitGenesis function
    98  func (k Keeper) BindPort(ctx sdk.Context, portID string) error {
    99  	cap := k.portKeeper.BindPort(ctx, portID)
   100  	return k.ClaimCapability(ctx, cap, host.PortPath(portID))
   101  }
   102  
   103  // GetPort returns the portID for the transfer module. Used in ExportGenesis
   104  func (k Keeper) GetPort(ctx sdk.Context) string {
   105  	store := ctx.KVStore(k.storeKey)
   106  	return string(store.Get(types.PortKey))
   107  }
   108  
   109  // SetPort sets the portID for the transfer module. Used in InitGenesis
   110  func (k Keeper) SetPort(ctx sdk.Context, portID string) {
   111  	store := ctx.KVStore(k.storeKey)
   112  	store.Set(types.PortKey, []byte(portID))
   113  }
   114  
   115  // GetDenomTrace retreives the full identifiers trace and base denomination from the store.
   116  func (k Keeper) GetDenomTrace(ctx sdk.Context, denomTraceHash tmbytes.HexBytes) (types.DenomTrace, bool) {
   117  	store := prefix.NewStore(ctx.KVStore(k.storeKey), types.DenomTraceKey)
   118  	bz := store.Get(denomTraceHash)
   119  	if bz == nil {
   120  		return types.DenomTrace{}, false
   121  	}
   122  	denomTrace := k.MustUnmarshalDenomTrace(bz)
   123  	return denomTrace, true
   124  }
   125  
   126  // HasDenomTrace checks if a the key with the given denomination trace hash exists on the store.
   127  func (k Keeper) HasDenomTrace(ctx sdk.Context, denomTraceHash tmbytes.HexBytes) bool {
   128  	store := prefix.NewStore(ctx.KVStore(k.storeKey), types.DenomTraceKey)
   129  	return store.Has(denomTraceHash)
   130  }
   131  
   132  // SetDenomTrace sets a new {trace hash -> denom trace} pair to the store.
   133  func (k Keeper) SetDenomTrace(ctx sdk.Context, denomTrace types.DenomTrace) {
   134  	store := prefix.NewStore(ctx.KVStore(k.storeKey), types.DenomTraceKey)
   135  	bz := k.MustMarshalDenomTrace(denomTrace)
   136  	store.Set(denomTrace.Hash(), bz)
   137  }
   138  
   139  // GetAllDenomTraces returns the trace information for all the denominations.
   140  func (k Keeper) GetAllDenomTraces(ctx sdk.Context) types.Traces {
   141  	traces := types.Traces{}
   142  	k.IterateDenomTraces(ctx, func(denomTrace types.DenomTrace) bool {
   143  		traces = append(traces, denomTrace)
   144  		return false
   145  	})
   146  
   147  	return traces.Sort()
   148  }
   149  
   150  // IterateDenomTraces iterates over the denomination traces in the store
   151  // and performs a callback function.
   152  func (k Keeper) IterateDenomTraces(ctx sdk.Context, cb func(denomTrace types.DenomTrace) bool) {
   153  	store := ctx.KVStore(k.storeKey)
   154  	iterator := sdk.KVStorePrefixIterator(store, types.DenomTraceKey)
   155  
   156  	defer iterator.Close()
   157  	for ; iterator.Valid(); iterator.Next() {
   158  
   159  		denomTrace := k.MustUnmarshalDenomTrace(iterator.Value())
   160  		if cb(denomTrace) {
   161  			break
   162  		}
   163  	}
   164  }
   165  
   166  // AuthenticateCapability wraps the scopedKeeper's AuthenticateCapability function
   167  func (k Keeper) AuthenticateCapability(ctx sdk.Context, cap *capabilitytypes.Capability, name string) bool {
   168  	return k.scopedKeeper.AuthenticateCapability(ctx, cap, name)
   169  }
   170  
   171  // ClaimCapability allows the transfer module that can claim a capability that IBC module
   172  // passes to it
   173  func (k Keeper) ClaimCapability(ctx sdk.Context, cap *capabilitytypes.Capability, name string) error {
   174  	return k.scopedKeeper.ClaimCapability(ctx, cap, name)
   175  }
   176  
   177  // Codec returns the IBC module codec.
   178  func (k Keeper) Codec() *codec.CodecProxy {
   179  	return k.cdc
   180  }