github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/erc20/keeper/ibc_hooks.go (about)

     1  package keeper
     2  
     3  import (
     4  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     5  	trensferTypes "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/transfer/types"
     6  	"github.com/fibonacci-chain/fbc/x/erc20/types"
     7  	"github.com/fibonacci-chain/fbc/x/evm/watcher"
     8  )
     9  
    10  var (
    11  	_ trensferTypes.TransferHooks = IBCTransferHooks{}
    12  )
    13  
    14  type IBCTransferHooks struct {
    15  	Keeper
    16  }
    17  
    18  func NewIBCTransferHooks(k Keeper) IBCTransferHooks {
    19  	return IBCTransferHooks{k}
    20  }
    21  
    22  func (iths IBCTransferHooks) AfterSendTransfer(
    23  	ctx sdk.Context,
    24  	sourcePort, sourceChannel string,
    25  	token sdk.SysCoin,
    26  	sender sdk.AccAddress,
    27  	receiver string,
    28  	isSource bool) error {
    29  	iths.Logger(ctx).Info(
    30  		"trigger ibc transfer hook",
    31  		"hook", "AfterSendTransfer",
    32  		"sourcePort", sourcePort,
    33  		"sourceChannel", sourceChannel,
    34  		"token", token.String(),
    35  		"sender", sender.String(),
    36  		"receiver", receiver,
    37  		"isSource", isSource)
    38  	return nil
    39  }
    40  
    41  func (iths IBCTransferHooks) AfterRecvTransfer(
    42  	ctx sdk.Context,
    43  	destPort, destChannel string,
    44  	token sdk.SysCoin,
    45  	receiver string,
    46  	isSource bool) error {
    47  	iths.Logger(ctx).Info(
    48  		"trigger ibc transfer hook",
    49  		"hook", "AfterRecvTransfer",
    50  		"destPort", destPort,
    51  		"destChannel", destChannel,
    52  		"token", token.String(),
    53  		"receiver", receiver,
    54  		"isSource", isSource)
    55  	// only after minting vouchers on this chain
    56  	if watcher.IsWatcherEnabled() {
    57  		ctx.SetWatcher(watcher.NewTxWatcher())
    58  	}
    59  
    60  	var err error
    61  	if !isSource {
    62  		// the native coin come from other chain with ibc
    63  		if err = iths.Keeper.OnMintVouchers(ctx, sdk.NewCoins(token), receiver); err == types.ErrNoContractNotAuto {
    64  			err = nil
    65  		}
    66  	} else if token.Denom != sdk.DefaultBondDenom {
    67  		// the native coin come from this chain,
    68  		err = iths.Keeper.OnUnescrowNatives(ctx, sdk.NewCoins(token), receiver)
    69  	}
    70  
    71  	if watcher.IsWatcherEnabled() && err == nil {
    72  		ctx.GetWatcher().Finalize()
    73  	}
    74  	return err
    75  }
    76  
    77  func (iths IBCTransferHooks) AfterRefundTransfer(
    78  	ctx sdk.Context,
    79  	sourcePort, sourceChannel string,
    80  	token sdk.SysCoin,
    81  	sender string,
    82  	isSource bool) error {
    83  	iths.Logger(ctx).Info(
    84  		"trigger ibc transfer hook",
    85  		"hook", "AfterRefundTransfer",
    86  		"sourcePort", sourcePort,
    87  		"sourceChannel", sourceChannel,
    88  		"token", token.String(),
    89  		"sender", sender,
    90  		"isSource", isSource)
    91  	// only after minting vouchers on this chain
    92  	if watcher.IsWatcherEnabled() {
    93  		ctx.SetWatcher(watcher.NewTxWatcher())
    94  	}
    95  
    96  	var err error
    97  	if !isSource {
    98  		// the native coin come from other chain with ibc
    99  		if err = iths.Keeper.OnMintVouchers(ctx, sdk.NewCoins(token), sender); err == types.ErrNoContractNotAuto {
   100  			err = nil
   101  		}
   102  	} else if token.Denom != sdk.DefaultBondDenom {
   103  		// the native coin come from this chain,
   104  		err = iths.Keeper.OnUnescrowNatives(ctx, sdk.NewCoins(token), sender)
   105  	}
   106  
   107  	if watcher.IsWatcherEnabled() && err == nil {
   108  		ctx.GetWatcher().Finalize()
   109  	}
   110  	return err
   111  }