-
Notifications
You must be signed in to change notification settings - Fork 173
Expand file tree
/
Copy pathplugin.go
More file actions
82 lines (72 loc) · 3.11 KB
/
plugin.go
File metadata and controls
82 lines (72 loc) · 3.11 KB
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
package msg
import (
"encoding/json"
sdkerrors "cosmossdk.io/errors"
wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper"
wasmvmtypes "github.com/CosmWasm/wasmvm/types"
sdk "github.com/cosmos/cosmos-sdk/types"
lvkeeper "github.com/umee-network/umee/v4/x/leverage/keeper"
lvtypes "github.com/umee-network/umee/v4/x/leverage/types"
)
// Plugin wraps the msg plugin with Messengers.
type Plugin struct {
lvMsgServer lvtypes.MsgServer
wrapped wasmkeeper.Messenger
}
var _ wasmkeeper.Messenger = (*Plugin)(nil)
// CustomMessageDecorator returns decorator for custom CosmWasm bindings messages
func NewMessagePlugin(leverageKeeper lvkeeper.Keeper) func(wasmkeeper.Messenger) wasmkeeper.Messenger {
return func(old wasmkeeper.Messenger) wasmkeeper.Messenger {
return &Plugin{
wrapped: old,
lvMsgServer: lvkeeper.NewMsgServerImpl(leverageKeeper),
}
}
}
// DispatchCustomMsg responsible for handling custom messages (umee native messages).
func (plugin *Plugin) DispatchCustomMsg(ctx sdk.Context, contractAddr sdk.AccAddress, rawMsg json.RawMessage) error {
var smartcontractMessage UmeeMsg
if err := json.Unmarshal(rawMsg, &smartcontractMessage); err != nil {
return sdkerrors.Wrap(err, "invalid umee custom msg")
}
sender := contractAddr.String()
var err error
sdkCtx := sdk.WrapSDKContext(ctx)
switch {
case smartcontractMessage.Supply != nil:
_, err = smartcontractMessage.HandleSupply(sdkCtx, sender, plugin.lvMsgServer)
case smartcontractMessage.Withdraw != nil:
_, err = smartcontractMessage.HandleWithdraw(sdkCtx, sender, plugin.lvMsgServer)
case smartcontractMessage.MaxWithdraw != nil:
_, err = smartcontractMessage.HandleMaxWithdraw(sdkCtx, sender, plugin.lvMsgServer)
case smartcontractMessage.Collateralize != nil:
_, err = smartcontractMessage.HandleCollateralize(sdkCtx, sender, plugin.lvMsgServer)
case smartcontractMessage.Decollateralize != nil:
_, err = smartcontractMessage.HandleDecollateralize(sdkCtx, sender, plugin.lvMsgServer)
case smartcontractMessage.Borrow != nil:
_, err = smartcontractMessage.HandleBorrow(sdkCtx, sender, plugin.lvMsgServer)
case smartcontractMessage.MaxBorrow != nil:
_, err = smartcontractMessage.HandleMaxBorrow(sdkCtx, sender, plugin.lvMsgServer)
case smartcontractMessage.Repay != nil:
_, err = smartcontractMessage.HandleRepay(sdkCtx, sender, plugin.lvMsgServer)
case smartcontractMessage.Liquidate != nil:
_, err = smartcontractMessage.HandleLiquidate(sdkCtx, sender, plugin.lvMsgServer)
case smartcontractMessage.SupplyCollateral != nil:
_, err = smartcontractMessage.HandleSupplyCollateral(sdkCtx, sender, plugin.lvMsgServer)
default:
err = wasmvmtypes.UnsupportedRequest{Kind: "invalid assigned umee msg"}
}
return err
}
// DispatchMsg encodes the wasmVM message and dispatches it.
func (plugin *Plugin) DispatchMsg(
ctx sdk.Context,
contractAddr sdk.AccAddress,
contractIBCPortID string,
msg wasmvmtypes.CosmosMsg,
) (events []sdk.Event, data [][]byte, err error) {
if msg.Custom != nil {
return nil, nil, plugin.DispatchCustomMsg(ctx, contractAddr, msg.Custom)
}
return plugin.wrapped.DispatchMsg(ctx, contractAddr, contractIBCPortID, msg)
}