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  }