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 }