github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/baseapp/evm2cm.go (about)

     1  package baseapp
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  
     7  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     8  )
     9  
    10  var (
    11  	cmHandles          = make(map[string]*CMHandle)
    12  	evmResultConverter func(txHash, data []byte) ([]byte, error)
    13  	evmConvertJudge    func(msg sdk.Msg) ([]byte, bool)
    14  	evmParamParse      func(msg sdk.Msg) ([]byte, error)
    15  )
    16  
    17  type MsgWrapper struct {
    18  	Name string          `json:"type"`
    19  	Data json.RawMessage `json:"value"`
    20  }
    21  
    22  type CMHandle struct {
    23  	fn     func(data []byte, signers []sdk.AccAddress) (sdk.Msg, error)
    24  	height int64
    25  }
    26  
    27  func NewCMHandle(fn func(data []byte, signers []sdk.AccAddress) (sdk.Msg, error), height int64) *CMHandle {
    28  	return &CMHandle{
    29  		fn:     fn,
    30  		height: height,
    31  	}
    32  }
    33  
    34  func RegisterCmHandle(msgType string, create *CMHandle) {
    35  	if create == nil {
    36  		panic("Register CmHandle is nil")
    37  	}
    38  	if _, dup := cmHandles[msgType]; dup {
    39  		panic("Register CmHandle twice for same module and func " + msgType)
    40  	}
    41  	cmHandles[msgType] = create
    42  }
    43  
    44  func RegisterEvmResultConverter(create func(txHash, data []byte) ([]byte, error)) {
    45  	if create == nil {
    46  		panic("Register EvmResultConverter is nil")
    47  	}
    48  	evmResultConverter = create
    49  }
    50  
    51  func RegisterEvmParamParse(create func(msg sdk.Msg) ([]byte, error)) {
    52  	if create == nil {
    53  		panic("Register EvmParamParse is nil")
    54  	}
    55  	evmParamParse = create
    56  }
    57  
    58  func RegisterEvmConvertJudge(create func(msg sdk.Msg) ([]byte, bool)) {
    59  	if create == nil {
    60  		panic("Register EvmConvertJudge is nil")
    61  	}
    62  	evmConvertJudge = create
    63  }
    64  
    65  func ConvertMsg(msg sdk.Msg, height int64) (sdk.Msg, error) {
    66  	v, err := evmParamParse(msg)
    67  	if err != nil {
    68  		return nil, err
    69  	}
    70  	msgWrap, err := ParseMsgWrapper(v)
    71  	if err != nil {
    72  		return nil, err
    73  	}
    74  	if cmh, ok := cmHandles[msgWrap.Name]; ok && height >= cmh.height {
    75  		return cmh.fn(msgWrap.Data, msg.GetSigners())
    76  	}
    77  	return nil, fmt.Errorf("not find handle")
    78  }
    79  
    80  func ParseMsgWrapper(data []byte) (*MsgWrapper, error) {
    81  	cmt := &MsgWrapper{}
    82  	err := json.Unmarshal(data, cmt)
    83  	if err != nil {
    84  		return nil, err
    85  	}
    86  	if cmt.Name == "" {
    87  		return nil, fmt.Errorf("parse msg name field is empty")
    88  	}
    89  	if len(cmt.Data) == 0 {
    90  		return nil, fmt.Errorf("parse msg data field is empty")
    91  	}
    92  	return cmt, nil
    93  }
    94  
    95  func EvmResultConvert(txHash, data []byte) ([]byte, error) {
    96  	return evmResultConverter(txHash, data)
    97  }
    98  
    99  func (app *BaseApp) JudgeEvmConvert(ctx sdk.Context, msg sdk.Msg) bool {
   100  	if app.EvmSysContractAddressHandler == nil ||
   101  		evmConvertJudge == nil ||
   102  		evmParamParse == nil ||
   103  		evmResultConverter == nil {
   104  		return false
   105  	}
   106  	addr, ok := evmConvertJudge(msg)
   107  	if !ok || len(addr) == 0 {
   108  		return false
   109  	}
   110  	return app.EvmSysContractAddressHandler(ctx, addr)
   111  }
   112  
   113  func (app *BaseApp) SetEvmSysContractAddressHandler(handler sdk.EvmSysContractAddressHandler) {
   114  	if app.sealed {
   115  		panic("SetEvmSysContractAddressHandler() on sealed BaseApp")
   116  	}
   117  	app.EvmSysContractAddressHandler = handler
   118  }