0g-chain/x/evmutil/keeper/msg_server.go

105 lines
2.5 KiB
Go
Raw Normal View History

package keeper
import (
"context"
"fmt"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/kava-labs/kava/x/evmutil/types"
)
type msgServer struct {
keeper Keeper
}
// NewMsgServerImpl returns an implementation of the evmutil MsgServer interface
// for the provided Keeper.
func NewMsgServerImpl(keeper Keeper) types.MsgServer {
return &msgServer{keeper: keeper}
}
var _ types.MsgServer = msgServer{}
// ConvertCoinToERC20 handles a MsgConvertCoinToERC20 message to convert
// sdk.Coin to Kava EVM tokens.
func (s msgServer) ConvertCoinToERC20(
goCtx context.Context,
msg *types.MsgConvertCoinToERC20,
) (*types.MsgConvertCoinToERC20Response, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
initiator, err := sdk.AccAddressFromBech32(msg.Initiator)
if err != nil {
return nil, fmt.Errorf("invalid Initiator address: %w", err)
}
receiver, err := types.NewInternalEVMAddressFromString(msg.Receiver)
if err != nil {
return nil, fmt.Errorf("invalid Receiver address: %w", err)
}
if err := s.keeper.ConvertCoinToERC20(
ctx,
initiator,
receiver,
*msg.Amount,
); err != nil {
return nil, err
}
ctx.EventManager().EmitEvent(
sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory),
sdk.NewAttribute(sdk.AttributeKeySender, msg.Initiator),
),
)
return &types.MsgConvertCoinToERC20Response{}, nil
}
// ConvertERC20ToCoin handles a MsgConvertERC20ToCoin message to convert
// sdk.Coin to Kava EVM tokens.
func (s msgServer) ConvertERC20ToCoin(
goCtx context.Context,
msg *types.MsgConvertERC20ToCoin,
) (*types.MsgConvertERC20ToCoinResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
initiator, err := types.NewInternalEVMAddressFromString(msg.Initiator)
if err != nil {
return nil, fmt.Errorf("invalid initiator address: %w", err)
}
receiver, err := sdk.AccAddressFromBech32(msg.Receiver)
if err != nil {
return nil, fmt.Errorf("invalid receiver address: %w", err)
}
contractAddr, err := types.NewInternalEVMAddressFromString(msg.KavaERC20Address)
if err != nil {
return nil, fmt.Errorf("invalid contract address: %w", err)
}
if err := s.keeper.ConvertERC20ToCoin(
ctx,
initiator,
receiver,
contractAddr,
msg.Amount,
); err != nil {
return nil, err
}
ctx.EventManager().EmitEvent(
sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory),
sdk.NewAttribute(sdk.AttributeKeySender, msg.Initiator),
),
)
return &types.MsgConvertERC20ToCoinResponse{}, nil
}