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

     1  package keeper
     2  
     3  import (
     4  	"fmt"
     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  	capabilitytypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/capability/types"
     9  	"github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/29-fee/types"
    10  	channeltypes "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/core/04-channel/types"
    11  	ibcexported "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/core/exported"
    12  )
    13  
    14  // SendPacket wraps IBC ChannelKeeper's SendPacket function
    15  func (k Keeper) SendPacket(ctx sdk.Context, chanCap *capabilitytypes.Capability, packet ibcexported.PacketI) error {
    16  	return k.ics4Wrapper.SendPacket(ctx, chanCap, packet)
    17  }
    18  
    19  // WriteAcknowledgement wraps IBC ChannelKeeper's WriteAcknowledgement function
    20  // ICS29 WriteAcknowledgement is used for asynchronous acknowledgements
    21  func (k Keeper) WriteAcknowledgement(ctx sdk.Context, chanCap *capabilitytypes.Capability, packet ibcexported.PacketI, acknowledgement ibcexported.Acknowledgement) error {
    22  	if !k.IsFeeEnabled(ctx, packet.GetDestPort(), packet.GetDestChannel()) {
    23  		// ics4Wrapper may be core IBC or higher-level middleware
    24  		return k.ics4Wrapper.WriteAcknowledgement(ctx, chanCap, packet, acknowledgement)
    25  	}
    26  
    27  	packetID := channeltypes.NewPacketId(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence())
    28  
    29  	// retrieve the forward relayer that was stored in `onRecvPacket`
    30  	relayer, found := k.GetRelayerAddressForAsyncAck(ctx, packetID)
    31  	if !found {
    32  		return sdkerrors.Wrapf(types.ErrRelayerNotFoundForAsyncAck, "no relayer address stored for async acknowledgement for packet with portID: %s, channelID: %s, sequence: %d", packetID.PortId, packetID.ChannelId, packetID.Sequence)
    33  	}
    34  
    35  	// it is possible that a relayer has not registered a counterparty address.
    36  	// if there is no registered counterparty address then write acknowledgement with empty relayer address and refund recv_fee.
    37  	forwardRelayer, _ := k.GetCounterpartyPayeeAddress(ctx, relayer, packet.GetDestChannel())
    38  
    39  	ack := types.NewIncentivizedAcknowledgement(forwardRelayer, acknowledgement.Acknowledgement(), acknowledgement.Success())
    40  
    41  	k.DeleteForwardRelayerAddress(ctx, packetID)
    42  
    43  	// ics4Wrapper may be core IBC or higher-level middleware
    44  	return k.ics4Wrapper.WriteAcknowledgement(ctx, chanCap, packet, ack)
    45  }
    46  
    47  // GetAppVersion returns the underlying application version.
    48  func (k Keeper) GetAppVersion(ctx sdk.Context, portID, channelID string) (string, bool) {
    49  	version, found := k.ics4Wrapper.GetAppVersion(ctx, portID, channelID)
    50  	if !found {
    51  		return "", false
    52  	}
    53  
    54  	if !k.IsFeeEnabled(ctx, portID, channelID) {
    55  		return version, true
    56  	}
    57  
    58  	var metadata types.Metadata
    59  	if err := types.ModuleCdc.UnmarshalJSON([]byte(version), &metadata); err != nil {
    60  		panic(fmt.Errorf("unable to unmarshal metadata for fee enabled channel: %w", err))
    61  	}
    62  
    63  	return metadata.AppVersion, true
    64  }