Files
wasmd/x/wasm/internal/keeper/handler_plugin_test.go
2020-07-17 17:02:21 +02:00

276 lines
6.1 KiB
Go

package keeper
import (
"encoding/json"
"fmt"
"github.com/CosmWasm/wasmd/x/wasm/internal/types"
"github.com/cosmos/cosmos-sdk/x/distribution"
"github.com/cosmos/cosmos-sdk/x/staking"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"testing"
wasmTypes "github.com/CosmWasm/go-cosmwasm/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/bank"
)
func TestEncoding(t *testing.T) {
_, _, addr1 := keyPubAddr()
_, _, addr2 := keyPubAddr()
invalidAddr := "xrnd1d02kd90n38qvr3qb9qof83fn2d2"
valAddr := make(sdk.ValAddress, sdk.AddrLen)
valAddr[0] = 12
valAddr2 := make(sdk.ValAddress, sdk.AddrLen)
valAddr2[1] = 123
jsonMsg := json.RawMessage(`{"foo": 123}`)
cases := map[string]struct {
sender sdk.AccAddress
input wasmTypes.CosmosMsg
// set if valid
output []sdk.Msg
// set if invalid
isError bool
}{
"simple send": {
sender: addr1,
input: wasmTypes.CosmosMsg{
Bank: &wasmTypes.BankMsg{
Send: &wasmTypes.SendMsg{
FromAddress: addr1.String(),
ToAddress: addr2.String(),
Amount: []wasmTypes.Coin{
{
Denom: "uatom",
Amount: "12345",
},
{
Denom: "usdt",
Amount: "54321",
},
},
},
},
},
output: []sdk.Msg{
bank.MsgSend{
FromAddress: addr1,
ToAddress: addr2,
Amount: sdk.Coins{
sdk.NewInt64Coin("uatom", 12345),
sdk.NewInt64Coin("usdt", 54321),
},
},
},
},
"invalid send amount": {
sender: addr1,
input: wasmTypes.CosmosMsg{
Bank: &wasmTypes.BankMsg{
Send: &wasmTypes.SendMsg{
FromAddress: addr1.String(),
ToAddress: addr2.String(),
Amount: []wasmTypes.Coin{
{
Denom: "uatom",
Amount: "123.456",
},
},
},
},
},
isError: true,
},
"invalid address": {
sender: addr1,
input: wasmTypes.CosmosMsg{
Bank: &wasmTypes.BankMsg{
Send: &wasmTypes.SendMsg{
FromAddress: addr1.String(),
ToAddress: invalidAddr,
Amount: []wasmTypes.Coin{
{
Denom: "uatom",
Amount: "7890",
},
},
},
},
},
isError: true,
},
"wasm execute": {
sender: addr1,
input: wasmTypes.CosmosMsg{
Wasm: &wasmTypes.WasmMsg{
Execute: &wasmTypes.ExecuteMsg{
ContractAddr: addr2.String(),
Msg: jsonMsg,
Send: []wasmTypes.Coin{
wasmTypes.NewCoin(12, "eth"),
},
},
},
},
output: []sdk.Msg{
types.MsgExecuteContract{
Sender: addr1,
Contract: addr2,
Msg: jsonMsg,
SentFunds: sdk.NewCoins(sdk.NewInt64Coin("eth", 12)),
},
},
},
"wasm instantiate": {
sender: addr1,
input: wasmTypes.CosmosMsg{
Wasm: &wasmTypes.WasmMsg{
Instantiate: &wasmTypes.InstantiateMsg{
CodeID: 7,
Msg: jsonMsg,
Send: []wasmTypes.Coin{
wasmTypes.NewCoin(123, "eth"),
},
},
},
},
output: []sdk.Msg{
types.MsgInstantiateContract{
Sender: addr1,
CodeID: 7,
// TODO: fix this
Label: fmt.Sprintf("Auto-created by %s", addr1),
InitMsg: jsonMsg,
InitFunds: sdk.NewCoins(sdk.NewInt64Coin("eth", 123)),
},
},
},
"staking delegate": {
sender: addr1,
input: wasmTypes.CosmosMsg{
Staking: &wasmTypes.StakingMsg{
Delegate: &wasmTypes.DelegateMsg{
Validator: valAddr.String(),
Amount: wasmTypes.NewCoin(777, "stake"),
},
},
},
output: []sdk.Msg{
staking.MsgDelegate{
DelegatorAddress: addr1,
ValidatorAddress: valAddr,
Amount: sdk.NewInt64Coin("stake", 777),
},
},
},
"staking delegate to non-validator": {
sender: addr1,
input: wasmTypes.CosmosMsg{
Staking: &wasmTypes.StakingMsg{
Delegate: &wasmTypes.DelegateMsg{
Validator: addr2.String(),
Amount: wasmTypes.NewCoin(777, "stake"),
},
},
},
isError: true,
},
"staking undelegate": {
sender: addr1,
input: wasmTypes.CosmosMsg{
Staking: &wasmTypes.StakingMsg{
Undelegate: &wasmTypes.UndelegateMsg{
Validator: valAddr.String(),
Amount: wasmTypes.NewCoin(555, "stake"),
},
},
},
output: []sdk.Msg{
staking.MsgUndelegate{
DelegatorAddress: addr1,
ValidatorAddress: valAddr,
Amount: sdk.NewInt64Coin("stake", 555),
},
},
},
"staking redelegate": {
sender: addr1,
input: wasmTypes.CosmosMsg{
Staking: &wasmTypes.StakingMsg{
Redelegate: &wasmTypes.RedelegateMsg{
SrcValidator: valAddr.String(),
DstValidator: valAddr2.String(),
Amount: wasmTypes.NewCoin(222, "stake"),
},
},
},
output: []sdk.Msg{
staking.MsgBeginRedelegate{
DelegatorAddress: addr1,
ValidatorSrcAddress: valAddr,
ValidatorDstAddress: valAddr2,
Amount: sdk.NewInt64Coin("stake", 222),
},
},
},
"staking withdraw (implicit recipient)": {
sender: addr1,
input: wasmTypes.CosmosMsg{
Staking: &wasmTypes.StakingMsg{
Withdraw: &wasmTypes.WithdrawMsg{
Validator: valAddr2.String(),
},
},
},
output: []sdk.Msg{
distribution.MsgSetWithdrawAddress{
DelegatorAddress: addr1,
WithdrawAddress: addr1,
},
distribution.MsgWithdrawDelegatorReward{
DelegatorAddress: addr1,
ValidatorAddress: valAddr2,
},
},
},
"staking withdraw (explicit recipient)": {
sender: addr1,
input: wasmTypes.CosmosMsg{
Staking: &wasmTypes.StakingMsg{
Withdraw: &wasmTypes.WithdrawMsg{
Validator: valAddr2.String(),
Recipient: addr2.String(),
},
},
},
output: []sdk.Msg{
distribution.MsgSetWithdrawAddress{
DelegatorAddress: addr1,
WithdrawAddress: addr2,
},
distribution.MsgWithdrawDelegatorReward{
DelegatorAddress: addr1,
ValidatorAddress: valAddr2,
},
},
},
}
encoder := DefaultEncoders()
for name, tc := range cases {
tc := tc
t.Run(name, func(t *testing.T) {
res, err := encoder.Encode(tc.sender, tc.input)
if tc.isError {
require.Error(t, err)
} else {
require.NoError(t, err)
assert.Equal(t, tc.output, res)
}
})
}
}