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 }