github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/vmbridge/keeper/wasm.go (about) 1 package keeper 2 3 import ( 4 "context" 5 "encoding/json" 6 "fmt" 7 8 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec" 9 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 10 sdkerrors "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/errors" 11 ibcadapter "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/ibc-adapter" 12 tmtypes "github.com/fibonacci-chain/fbc/libs/tendermint/types" 13 "github.com/fibonacci-chain/fbc/x/vmbridge/types" 14 "github.com/fibonacci-chain/fbc/x/wasm" 15 ) 16 17 func (k Keeper) SendToWasm(ctx sdk.Context, caller sdk.AccAddress, wasmContractAddr, recipient string, amount sdk.Int) error { 18 // must check recipient is ex address 19 if !sdk.IsFBCAddress(recipient) { 20 return types.ErrIsNotFBCAddr 21 } 22 to, err := sdk.AccAddressFromBech32(recipient) 23 if err != nil { 24 return err 25 } 26 27 if amount.IsNegative() { 28 return types.ErrAmountNegative 29 } 30 input, err := types.GetMintCW20Input(amount.String(), to.String()) 31 if err != nil { 32 return err 33 } 34 contractAddr, err := sdk.AccAddressFromBech32(wasmContractAddr) 35 if err != nil { 36 return err 37 } 38 if !sdk.IsWasmAddress(contractAddr) { 39 return types.ErrIsNotWasmAddr 40 } 41 42 ret, err := k.wasmKeeper.Execute(ctx, contractAddr, caller, input, sdk.Coins{}) 43 if err != nil { 44 k.Logger().Error("wasm return", string(ret)) 45 } 46 return err 47 } 48 49 // RegisterSendToEvmEncoder needs to be registered in app setup to handle custom message callbacks 50 func RegisterSendToEvmEncoder(cdc *codec.ProtoCodec) *wasm.MessageEncoders { 51 return &wasm.MessageEncoders{ 52 Custom: sendToEvmEncoder(cdc), 53 } 54 } 55 56 func sendToEvmEncoder(cdc *codec.ProtoCodec) wasm.CustomEncoder { 57 return func(sender sdk.AccAddress, data json.RawMessage) ([]ibcadapter.Msg, error) { 58 var msg types.MsgSendToEvm 59 60 if err := cdc.UnmarshalJSON(data, &msg); err != nil { 61 return nil, err 62 } 63 return []ibcadapter.Msg{&msg}, nil 64 } 65 } 66 67 type msgServer struct { 68 Keeper 69 } 70 71 // NewMsgServerImpl returns an implementation of the bank MsgServer interface 72 // for the provided Keeper. 73 func NewMsgServerImpl(keeper Keeper) types.MsgServer { 74 return &msgServer{Keeper: keeper} 75 } 76 77 var _ types.MsgServer = msgServer{} 78 79 func (k msgServer) SendToEvmEvent(goCtx context.Context, msg *types.MsgSendToEvm) (*types.MsgSendToEvmResponse, error) { 80 ctx := sdk.UnwrapSDKContext(goCtx) 81 if !tmtypes.HigherThanEarth(ctx.BlockHeight()) { 82 errMsg := fmt.Sprintf("vmbridger not supprt at height %d", ctx.BlockHeight()) 83 return &types.MsgSendToEvmResponse{Success: false}, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, errMsg) 84 } 85 params := k.wasmKeeper.GetParams(ctx) 86 if !params.VmbridgeEnable { 87 return &types.MsgSendToEvmResponse{Success: false}, types.ErrVMBridgeEnable 88 } 89 90 success, err := k.Keeper.SendToEvm(ctx, msg.Sender, msg.Contract, msg.Recipient, msg.Amount) 91 if err != nil { 92 return &types.MsgSendToEvmResponse{Success: false}, sdkerrors.Wrap(types.ErrEvmExecuteFailed, err.Error()) 93 } 94 response := types.MsgSendToEvmResponse{Success: success} 95 return &response, nil 96 }