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 }