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