Test scaffolding for staking, test init and query callbacks
This commit is contained in:
2
go.mod
2
go.mod
@@ -3,7 +3,7 @@ module github.com/CosmWasm/wasmd
|
||||
go 1.13
|
||||
|
||||
require (
|
||||
github.com/CosmWasm/go-cosmwasm v0.8.0-alpha2
|
||||
github.com/CosmWasm/go-cosmwasm v0.8.0-alpha2.0.20200518133220-76a4987de98b
|
||||
github.com/btcsuite/btcd v0.0.0-20190807005414-4063feeff79a // indirect
|
||||
github.com/cosmos/cosmos-sdk v0.38.3
|
||||
github.com/golang/mock v1.4.3 // indirect
|
||||
|
||||
4
go.sum
4
go.sum
@@ -13,6 +13,10 @@ github.com/CosmWasm/go-cosmwasm v0.7.3-0.20200506091810-b5d72f383001 h1:QvYlAMha
|
||||
github.com/CosmWasm/go-cosmwasm v0.7.3-0.20200506091810-b5d72f383001/go.mod h1:gAFCwllx97ejI+m9SqJQrmd2SBW7HA0fOjvWWJjM2uc=
|
||||
github.com/CosmWasm/go-cosmwasm v0.8.0-alpha2 h1:CRITYzG25XuBFfoft+zuRKtJk37/PxNXXKXAje7iv1Q=
|
||||
github.com/CosmWasm/go-cosmwasm v0.8.0-alpha2/go.mod h1:gAFCwllx97ejI+m9SqJQrmd2SBW7HA0fOjvWWJjM2uc=
|
||||
github.com/CosmWasm/go-cosmwasm v0.8.0-alpha2.0.20200518132754-acf959da37ac h1:8iIQdsex6lXfwxGf/ju82M0VoYu6apmclJAuAtRUCzc=
|
||||
github.com/CosmWasm/go-cosmwasm v0.8.0-alpha2.0.20200518132754-acf959da37ac/go.mod h1:gAFCwllx97ejI+m9SqJQrmd2SBW7HA0fOjvWWJjM2uc=
|
||||
github.com/CosmWasm/go-cosmwasm v0.8.0-alpha2.0.20200518133220-76a4987de98b h1:AKCZCqgZAQnmJdCh4mnk23NoLzoyKQIowckBLnhrLlM=
|
||||
github.com/CosmWasm/go-cosmwasm v0.8.0-alpha2.0.20200518133220-76a4987de98b/go.mod h1:gAFCwllx97ejI+m9SqJQrmd2SBW7HA0fOjvWWJjM2uc=
|
||||
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
|
||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
|
||||
|
||||
@@ -25,7 +25,7 @@ func TestNewKeeper(t *testing.T) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tempDir)
|
||||
_, _, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
_, _, _, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
require.NotNil(t, keeper)
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ func TestCreate(t *testing.T) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tempDir)
|
||||
ctx, accKeeper, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
ctx, accKeeper, _, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
|
||||
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
|
||||
creator := createFakeFundedAccount(ctx, accKeeper, deposit)
|
||||
@@ -54,7 +54,7 @@ func TestCreateDuplicate(t *testing.T) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tempDir)
|
||||
ctx, accKeeper, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
ctx, accKeeper, _, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
|
||||
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
|
||||
creator := createFakeFundedAccount(ctx, accKeeper, deposit)
|
||||
@@ -85,7 +85,7 @@ func TestCreateWithSimulation(t *testing.T) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tempDir)
|
||||
ctx, accKeeper, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
ctx, accKeeper, _, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
ctx = ctx.WithBlockHeader(abci.Header{Height: 1}).
|
||||
WithGasMeter(stypes.NewInfiniteGasMeter())
|
||||
|
||||
@@ -101,7 +101,7 @@ func TestCreateWithSimulation(t *testing.T) {
|
||||
require.Equal(t, uint64(1), contractID)
|
||||
|
||||
// then try to create it in non-simulation mode (should not fail)
|
||||
ctx, accKeeper, keeper = CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
ctx, accKeeper, _, keeper = CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
contractID, err = keeper.Create(ctx, creator, wasmCode, "https://github.com/CosmWasm/wasmd/blob/master/x/wasm/testdata/escrow.wasm", "confio/cosmwasm-opt:0.7.2")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, uint64(1), contractID)
|
||||
@@ -141,7 +141,7 @@ func TestCreateWithGzippedPayload(t *testing.T) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tempDir)
|
||||
ctx, accKeeper, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
ctx, accKeeper, _, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
|
||||
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
|
||||
creator := createFakeFundedAccount(ctx, accKeeper, deposit)
|
||||
@@ -164,7 +164,7 @@ func TestInstantiate(t *testing.T) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tempDir)
|
||||
ctx, accKeeper, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
ctx, accKeeper, _, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
|
||||
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
|
||||
creator := createFakeFundedAccount(ctx, accKeeper, deposit)
|
||||
@@ -208,7 +208,7 @@ func TestInstantiateWithNonExistingCodeID(t *testing.T) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tempDir)
|
||||
ctx, accKeeper, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
ctx, accKeeper, _, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
|
||||
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
|
||||
creator := createFakeFundedAccount(ctx, accKeeper, deposit)
|
||||
@@ -229,7 +229,7 @@ func TestExecute(t *testing.T) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tempDir)
|
||||
ctx, accKeeper, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
ctx, accKeeper, _, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
|
||||
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
|
||||
topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000))
|
||||
@@ -306,7 +306,7 @@ func TestExecuteWithNonExistingAddress(t *testing.T) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tempDir)
|
||||
ctx, accKeeper, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
ctx, accKeeper, _, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
|
||||
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
|
||||
creator := createFakeFundedAccount(ctx, accKeeper, deposit.Add(deposit...))
|
||||
@@ -321,7 +321,7 @@ func TestExecuteWithPanic(t *testing.T) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tempDir)
|
||||
ctx, accKeeper, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
ctx, accKeeper, _, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
|
||||
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
|
||||
topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000))
|
||||
@@ -354,7 +354,7 @@ func TestExecuteWithCpuLoop(t *testing.T) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tempDir)
|
||||
ctx, accKeeper, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
ctx, accKeeper, _, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
|
||||
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
|
||||
topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000))
|
||||
@@ -395,7 +395,7 @@ func TestExecuteWithStorageLoop(t *testing.T) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tempDir)
|
||||
ctx, accKeeper, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
ctx, accKeeper, _, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
|
||||
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
|
||||
topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000))
|
||||
|
||||
@@ -19,7 +19,7 @@ func TestQueryContractState(t *testing.T) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tempDir)
|
||||
ctx, accKeeper, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
ctx, accKeeper, _, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
|
||||
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
|
||||
topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000))
|
||||
@@ -147,7 +147,7 @@ func TestListContractByCodeOrdering(t *testing.T) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tempDir)
|
||||
ctx, accKeeper, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
ctx, accKeeper, _, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil)
|
||||
|
||||
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 1000000))
|
||||
topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 500))
|
||||
|
||||
@@ -2,7 +2,6 @@ package keeper
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
|
||||
wasmTypes "github.com/CosmWasm/go-cosmwasm/types"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||
@@ -109,8 +108,16 @@ func NoCustomQuerier(ctx sdk.Context, request json.RawMessage) ([]byte, error) {
|
||||
|
||||
func StakingQuerier(keeper staking.Keeper) func(ctx sdk.Context, request *wasmTypes.StakingQuery) ([]byte, error) {
|
||||
return func(ctx sdk.Context, request *wasmTypes.StakingQuery) ([]byte, error) {
|
||||
if request.BondedDenom != nil {
|
||||
denom := keeper.BondDenom(ctx)
|
||||
res := wasmTypes.BondedDenomResponse{
|
||||
Denom: denom,
|
||||
}
|
||||
return json.Marshal(res)
|
||||
}
|
||||
if request.Validators != nil {
|
||||
validators := keeper.GetBondedValidatorsByPower(ctx)
|
||||
//validators := keeper.GetAllValidators(ctx)
|
||||
wasmVals := make([]wasmTypes.Validator, len(validators))
|
||||
for i, v := range validators {
|
||||
wasmVals[i] = wasmTypes.Validator{
|
||||
|
||||
@@ -55,7 +55,7 @@ func TestMaskReflectContractSend(t *testing.T) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tempDir)
|
||||
ctx, accKeeper, keeper := CreateTestInput(t, false, tempDir, MaskFeatures, maskEncoders(MakeTestCodec()), nil)
|
||||
ctx, accKeeper, _, keeper := CreateTestInput(t, false, tempDir, MaskFeatures, maskEncoders(MakeTestCodec()), nil)
|
||||
|
||||
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
|
||||
creator := createFakeFundedAccount(ctx, accKeeper, deposit)
|
||||
@@ -138,7 +138,7 @@ func TestMaskReflectCustomMsg(t *testing.T) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tempDir)
|
||||
ctx, accKeeper, keeper := CreateTestInput(t, false, tempDir, MaskFeatures, maskEncoders(MakeTestCodec()), maskPlugins())
|
||||
ctx, accKeeper, _, keeper := CreateTestInput(t, false, tempDir, MaskFeatures, maskEncoders(MakeTestCodec()), maskPlugins())
|
||||
|
||||
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
|
||||
creator := createFakeFundedAccount(ctx, accKeeper, deposit)
|
||||
@@ -233,7 +233,7 @@ func TestMaskReflectCustomQuery(t *testing.T) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tempDir)
|
||||
ctx, accKeeper, keeper := CreateTestInput(t, false, tempDir, MaskFeatures, maskEncoders(MakeTestCodec()), maskPlugins())
|
||||
ctx, accKeeper, _, keeper := CreateTestInput(t, false, tempDir, MaskFeatures, maskEncoders(MakeTestCodec()), maskPlugins())
|
||||
|
||||
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
|
||||
creator := createFakeFundedAccount(ctx, accKeeper, deposit)
|
||||
|
||||
321
x/wasm/internal/keeper/staking_test.go
Normal file
321
x/wasm/internal/keeper/staking_test.go
Normal file
@@ -0,0 +1,321 @@
|
||||
package keeper
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/cosmos/cosmos-sdk/x/staking"
|
||||
"github.com/cosmos/cosmos-sdk/x/staking/types"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
type StakingInitMsg struct {
|
||||
Name string `json:"name"`
|
||||
Symbol string `json:"symbol"`
|
||||
Decimals uint8 `json:"decimals"`
|
||||
Validator sdk.ValAddress `json:"validator"`
|
||||
ExitTax sdk.Dec `json:"exit_tax"`
|
||||
// MinWithdrawl is uint128 encoded as a string (use sdk.Int?)
|
||||
MinWithdrawl string `json:"min_withdrawl"`
|
||||
}
|
||||
|
||||
// StakingHandleMsg is used to encode handle messages
|
||||
type StakingHandleMsg struct {
|
||||
Transfer *transferPayload `json:"transfer,omitempty"`
|
||||
Bond *struct{} `json:"bond,omitempty"`
|
||||
Unbond *unbondPayload `json:"unbond,omitempty"`
|
||||
Claim *struct{} `json:"claim,omitempty"`
|
||||
Reinvest *struct{} `json:"reinvest,omitempty"`
|
||||
Change *ownerPayload `json:"change_owner,omitempty"`
|
||||
}
|
||||
|
||||
type transferPayload struct {
|
||||
Recipient sdk.Address `json:"recipient"`
|
||||
// uint128 encoded as string
|
||||
Amount string `json:"amount"`
|
||||
}
|
||||
|
||||
type unbondPayload struct {
|
||||
// uint128 encoded as string
|
||||
Amount string `json:"amount"`
|
||||
}
|
||||
|
||||
// StakingQueryMsg is used to encode query messages
|
||||
type StakingQueryMsg struct {
|
||||
Balance *addressQuery `json:"balance,omitempty"`
|
||||
Claims *addressQuery `json:"claims,omitempty"`
|
||||
TokenInfo *struct{} `json:"token_info,omitempty"`
|
||||
Investment *struct{} `json:"investment,omitempty"`
|
||||
}
|
||||
|
||||
type addressQuery struct {
|
||||
Address sdk.AccAddress `json:"address"`
|
||||
}
|
||||
|
||||
type BalanceResponse struct {
|
||||
Balance string `json:"balance,omitempty"`
|
||||
}
|
||||
|
||||
type ClaimsResponse struct {
|
||||
Claims string `json:"claims,omitempty"`
|
||||
}
|
||||
|
||||
type TokenInfoResponse struct {
|
||||
Name string `json:"name"`
|
||||
Symbol string `json:"symbol"`
|
||||
Decimals uint8 `json:"decimals"`
|
||||
}
|
||||
|
||||
type InvestmentResponse struct {
|
||||
TokenSupply string `json:"token_supply"`
|
||||
StakedTokens string `json:"staked_tokens"`
|
||||
NominalValue sdk.Dec `json:"nominal_value"`
|
||||
Owner sdk.AccAddress `json:"owner"`
|
||||
Validator sdk.ValAddress `json:"validator"`
|
||||
ExitTax sdk.Dec `json:"exit_tax"`
|
||||
// MinWithdrawl is uint128 encoded as a string (use sdk.Int?)
|
||||
MinWithdrawl string `json:"min_withdrawl"`
|
||||
}
|
||||
|
||||
// adds a few validators and returns a list of validators that are registered
|
||||
func addValidators(ctx sdk.Context, stakingKeeper staking.Keeper, powers []sdk.Int) []sdk.ValAddress {
|
||||
var addrs = make([]sdk.ValAddress, len(powers))
|
||||
for i, power := range powers {
|
||||
addrs[i] = addValidator(ctx, stakingKeeper, power)
|
||||
}
|
||||
return addrs
|
||||
}
|
||||
|
||||
// adds a few validators and returns a list of validators that are registered
|
||||
func addValidator(ctx sdk.Context, stakingKeeper staking.Keeper, power sdk.Int) sdk.ValAddress {
|
||||
_, pub, accAddr := keyPubAddr()
|
||||
addr := sdk.ValAddress(accAddr)
|
||||
// make it a bonded validator with power stake
|
||||
val := types.NewValidator(addr, pub, types.Description{Moniker: fmt.Sprintf("Validator power %s", power)})
|
||||
val.Status = sdk.Bonded
|
||||
val, _ = val.AddTokensFromDel(power)
|
||||
// store it
|
||||
stakingKeeper.SetValidator(ctx, val)
|
||||
stakingKeeper.SetValidatorByPowerIndex(ctx, val)
|
||||
return addr
|
||||
}
|
||||
|
||||
func TestInitializeStaking(t *testing.T) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tempDir)
|
||||
ctx, accKeeper, stakingKeeper, keeper := CreateTestInput(t, false, tempDir, SupportedFeatures, maskEncoders(MakeTestCodec()), nil)
|
||||
|
||||
valAddr := addValidator(ctx, stakingKeeper, sdk.NewInt(1234567))
|
||||
|
||||
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000), sdk.NewInt64Coin("stake", 500000))
|
||||
creator := createFakeFundedAccount(ctx, accKeeper, deposit)
|
||||
|
||||
// upload staking derivates code
|
||||
stakingCode, err := ioutil.ReadFile("./testdata/staking.wasm")
|
||||
require.NoError(t, err)
|
||||
stakingID, err := keeper.Create(ctx, creator, stakingCode, "", "")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, uint64(1), stakingID)
|
||||
|
||||
// register to a valid address
|
||||
initMsg := StakingInitMsg{
|
||||
Name: "Staking Derivatives",
|
||||
Symbol: "DRV",
|
||||
Decimals: 0,
|
||||
Validator: valAddr,
|
||||
ExitTax: sdk.MustNewDecFromStr("0.10"),
|
||||
MinWithdrawl: "100",
|
||||
}
|
||||
initBz, err := json.Marshal(&initMsg)
|
||||
require.NoError(t, err)
|
||||
|
||||
stakingAddr, err := keeper.Instantiate(ctx, stakingID, creator, initBz, "staking derivates - DRV", nil)
|
||||
require.NoError(t, err)
|
||||
require.NotEmpty(t, stakingAddr)
|
||||
|
||||
// nothing spent here
|
||||
checkAccount(t, ctx, accKeeper, creator, deposit)
|
||||
|
||||
// try to register with a validator not on the list and it fails
|
||||
_, _, bob := keyPubAddr()
|
||||
badInitMsg := StakingInitMsg{
|
||||
Name: "Missing Validator",
|
||||
Symbol: "MISS",
|
||||
Decimals: 0,
|
||||
Validator: sdk.ValAddress(bob),
|
||||
ExitTax: sdk.MustNewDecFromStr("0.10"),
|
||||
MinWithdrawl: "100",
|
||||
}
|
||||
badBz, err := json.Marshal(&badInitMsg)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = keeper.Instantiate(ctx, stakingID, creator, badBz, "missing validator", nil)
|
||||
require.Error(t, err)
|
||||
}
|
||||
|
||||
//func TestMaskReflectCustomMsg(t *testing.T) {
|
||||
// tempDir, err := ioutil.TempDir("", "wasm")
|
||||
// require.NoError(t, err)
|
||||
// defer os.RemoveAll(tempDir)
|
||||
// ctx, accKeeper, keeper := CreateTestInput(t, false, tempDir, MaskFeatures, maskEncoders(MakeTestCodec()), maskPlugins())
|
||||
//
|
||||
// deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
|
||||
// creator := createFakeFundedAccount(ctx, accKeeper, deposit)
|
||||
// bob := createFakeFundedAccount(ctx, accKeeper, deposit)
|
||||
// _, _, fred := keyPubAddr()
|
||||
//
|
||||
// // upload code
|
||||
// maskCode, err := ioutil.ReadFile("./testdata/reflect.wasm")
|
||||
// require.NoError(t, err)
|
||||
// codeID, err := keeper.Create(ctx, creator, maskCode, "", "")
|
||||
// require.NoError(t, err)
|
||||
// require.Equal(t, uint64(1), codeID)
|
||||
//
|
||||
// // creator instantiates a contract and gives it tokens
|
||||
// contractStart := sdk.NewCoins(sdk.NewInt64Coin("denom", 40000))
|
||||
// contractAddr, err := keeper.Instantiate(ctx, codeID, creator, []byte("{}"), "mask contract 1", contractStart)
|
||||
// require.NoError(t, err)
|
||||
// require.NotEmpty(t, contractAddr)
|
||||
//
|
||||
// // set owner to bob
|
||||
// transfer := MaskHandleMsg{
|
||||
// Change: &ownerPayload{
|
||||
// Owner: bob,
|
||||
// },
|
||||
// }
|
||||
// transferBz, err := json.Marshal(transfer)
|
||||
// require.NoError(t, err)
|
||||
// _, err = keeper.Execute(ctx, contractAddr, creator, transferBz, nil)
|
||||
// require.NoError(t, err)
|
||||
//
|
||||
// // check some account values
|
||||
// checkAccount(t, ctx, accKeeper, contractAddr, contractStart)
|
||||
// checkAccount(t, ctx, accKeeper, bob, deposit)
|
||||
// checkAccount(t, ctx, accKeeper, fred, nil)
|
||||
//
|
||||
// // bob can send contract's tokens to fred (using SendMsg)
|
||||
// msgs := []wasmTypes.CosmosMsg{{
|
||||
// Bank: &wasmTypes.BankMsg{
|
||||
// Send: &wasmTypes.SendMsg{
|
||||
// FromAddress: contractAddr.String(),
|
||||
// ToAddress: fred.String(),
|
||||
// Amount: []wasmTypes.Coin{{
|
||||
// Denom: "denom",
|
||||
// Amount: "15000",
|
||||
// }},
|
||||
// },
|
||||
// },
|
||||
// }}
|
||||
// reflectSend := MaskHandleMsg{
|
||||
// Reflect: &reflectPayload{
|
||||
// Msgs: msgs,
|
||||
// },
|
||||
// }
|
||||
// reflectSendBz, err := json.Marshal(reflectSend)
|
||||
// require.NoError(t, err)
|
||||
// _, err = keeper.Execute(ctx, contractAddr, bob, reflectSendBz, nil)
|
||||
// require.NoError(t, err)
|
||||
//
|
||||
// // fred got coins
|
||||
// checkAccount(t, ctx, accKeeper, fred, sdk.NewCoins(sdk.NewInt64Coin("denom", 15000)))
|
||||
// // contract lost them
|
||||
// checkAccount(t, ctx, accKeeper, contractAddr, sdk.NewCoins(sdk.NewInt64Coin("denom", 25000)))
|
||||
// checkAccount(t, ctx, accKeeper, bob, deposit)
|
||||
//
|
||||
// // construct an opaque message
|
||||
// var sdkSendMsg sdk.Msg = &bank.MsgSend{
|
||||
// FromAddress: contractAddr,
|
||||
// ToAddress: fred,
|
||||
// Amount: sdk.NewCoins(sdk.NewInt64Coin("denom", 23000)),
|
||||
// }
|
||||
// opaque, err := toMaskRawMsg(keeper.cdc, sdkSendMsg)
|
||||
// require.NoError(t, err)
|
||||
// reflectOpaque := MaskHandleMsg{
|
||||
// Reflect: &reflectPayload{
|
||||
// Msgs: []wasmTypes.CosmosMsg{opaque},
|
||||
// },
|
||||
// }
|
||||
// reflectOpaqueBz, err := json.Marshal(reflectOpaque)
|
||||
// require.NoError(t, err)
|
||||
//
|
||||
// _, err = keeper.Execute(ctx, contractAddr, bob, reflectOpaqueBz, nil)
|
||||
// require.NoError(t, err)
|
||||
//
|
||||
// // fred got more coins
|
||||
// checkAccount(t, ctx, accKeeper, fred, sdk.NewCoins(sdk.NewInt64Coin("denom", 38000)))
|
||||
// // contract lost them
|
||||
// checkAccount(t, ctx, accKeeper, contractAddr, sdk.NewCoins(sdk.NewInt64Coin("denom", 2000)))
|
||||
// checkAccount(t, ctx, accKeeper, bob, deposit)
|
||||
//}
|
||||
//
|
||||
//func TestMaskReflectCustomQuery(t *testing.T) {
|
||||
// tempDir, err := ioutil.TempDir("", "wasm")
|
||||
// require.NoError(t, err)
|
||||
// defer os.RemoveAll(tempDir)
|
||||
// ctx, accKeeper, keeper := CreateTestInput(t, false, tempDir, MaskFeatures, maskEncoders(MakeTestCodec()), maskPlugins())
|
||||
//
|
||||
// deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
|
||||
// creator := createFakeFundedAccount(ctx, accKeeper, deposit)
|
||||
//
|
||||
// // upload code
|
||||
// maskCode, err := ioutil.ReadFile("./testdata/reflect.wasm")
|
||||
// require.NoError(t, err)
|
||||
// codeID, err := keeper.Create(ctx, creator, maskCode, "", "")
|
||||
// require.NoError(t, err)
|
||||
// require.Equal(t, uint64(1), codeID)
|
||||
//
|
||||
// // creator instantiates a contract and gives it tokens
|
||||
// contractStart := sdk.NewCoins(sdk.NewInt64Coin("denom", 40000))
|
||||
// contractAddr, err := keeper.Instantiate(ctx, codeID, creator, []byte("{}"), "mask contract 1", contractStart)
|
||||
// require.NoError(t, err)
|
||||
// require.NotEmpty(t, contractAddr)
|
||||
//
|
||||
// // let's perform a normal query of state
|
||||
// ownerQuery := MaskQueryMsg{
|
||||
// Owner: &struct{}{},
|
||||
// }
|
||||
// ownerQueryBz, err := json.Marshal(ownerQuery)
|
||||
// require.NoError(t, err)
|
||||
// ownerRes, err := keeper.QuerySmart(ctx, contractAddr, ownerQueryBz)
|
||||
// require.NoError(t, err)
|
||||
// var res OwnerResponse
|
||||
// err = json.Unmarshal(ownerRes, &res)
|
||||
// require.NoError(t, err)
|
||||
// assert.Equal(t, res.Owner, creator.String())
|
||||
//
|
||||
// // and now making use of the custom querier callbacks
|
||||
// customQuery := MaskQueryMsg{
|
||||
// ReflectCustom: &Text{
|
||||
// Text: "all Caps noW",
|
||||
// },
|
||||
// }
|
||||
// customQueryBz, err := json.Marshal(customQuery)
|
||||
// require.NoError(t, err)
|
||||
// custom, err := keeper.QuerySmart(ctx, contractAddr, customQueryBz)
|
||||
// require.NoError(t, err)
|
||||
// var resp customQueryResponse
|
||||
// err = json.Unmarshal(custom, &resp)
|
||||
// require.NoError(t, err)
|
||||
// assert.Equal(t, resp.Msg, "ALL CAPS NOW")
|
||||
//}
|
||||
|
||||
//func checkAccount(t *testing.T, ctx sdk.Context, accKeeper auth.AccountKeeper, addr sdk.AccAddress, expected sdk.Coins) {
|
||||
// acct := accKeeper.GetAccount(ctx, addr)
|
||||
// if expected == nil {
|
||||
// assert.Nil(t, acct)
|
||||
// } else {
|
||||
// assert.NotNil(t, acct)
|
||||
// if expected.Empty() {
|
||||
// // there is confusion between nil and empty slice... let's just treat them the same
|
||||
// assert.True(t, acct.GetCoins().Empty())
|
||||
// } else {
|
||||
// assert.Equal(t, acct.GetCoins(), expected)
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
@@ -2,11 +2,14 @@ package keeper
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/cosmos/cosmos-sdk/x/staking"
|
||||
"github.com/cosmos/cosmos-sdk/x/supply"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
abci "github.com/tendermint/tendermint/abci/types"
|
||||
"github.com/tendermint/tendermint/libs/log"
|
||||
dbm "github.com/tendermint/tm-db"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/baseapp"
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
"github.com/cosmos/cosmos-sdk/store"
|
||||
@@ -15,11 +18,8 @@ import (
|
||||
"github.com/cosmos/cosmos-sdk/x/auth"
|
||||
"github.com/cosmos/cosmos-sdk/x/bank"
|
||||
"github.com/cosmos/cosmos-sdk/x/params"
|
||||
"github.com/cosmos/cosmos-sdk/x/staking/types"
|
||||
"github.com/stretchr/testify/require"
|
||||
abci "github.com/tendermint/tendermint/abci/types"
|
||||
"github.com/tendermint/tendermint/libs/log"
|
||||
dbm "github.com/tendermint/tm-db"
|
||||
"github.com/cosmos/cosmos-sdk/x/staking"
|
||||
"github.com/cosmos/cosmos-sdk/x/supply"
|
||||
|
||||
wasmTypes "github.com/CosmWasm/wasmd/x/wasm/internal/types"
|
||||
)
|
||||
@@ -42,9 +42,17 @@ func MakeTestCodec() *codec.Codec {
|
||||
return cdc
|
||||
}
|
||||
|
||||
var TestingStakeParams = staking.Params{
|
||||
UnbondingTime: 100,
|
||||
MaxValidators: 10,
|
||||
MaxEntries: 10,
|
||||
HistoricalEntries: 10,
|
||||
BondDenom: "stake",
|
||||
}
|
||||
|
||||
// encoders can be nil to accept the defaults, or set it to override some of the message handlers (like default)
|
||||
func CreateTestInput(t *testing.T, isCheckTx bool, tempDir string, supportedFeatures string, encoders *MessageEncoders, queriers *QueryPlugins) (sdk.Context, auth.AccountKeeper, Keeper) {
|
||||
keyContract := sdk.NewKVStoreKey(types.StoreKey)
|
||||
func CreateTestInput(t *testing.T, isCheckTx bool, tempDir string, supportedFeatures string, encoders *MessageEncoders, queriers *QueryPlugins) (sdk.Context, auth.AccountKeeper, staking.Keeper, Keeper) {
|
||||
keyContract := sdk.NewKVStoreKey(wasmTypes.StoreKey)
|
||||
keyAcc := sdk.NewKVStoreKey(auth.StoreKey)
|
||||
keyStaking := sdk.NewKVStoreKey(staking.StoreKey)
|
||||
keySupply := sdk.NewKVStoreKey(supply.StoreKey)
|
||||
@@ -56,6 +64,8 @@ func CreateTestInput(t *testing.T, isCheckTx bool, tempDir string, supportedFeat
|
||||
ms.MountStoreWithDB(keyContract, sdk.StoreTypeIAVL, db)
|
||||
ms.MountStoreWithDB(keyAcc, sdk.StoreTypeIAVL, db)
|
||||
ms.MountStoreWithDB(keyParams, sdk.StoreTypeIAVL, db)
|
||||
ms.MountStoreWithDB(keyStaking, sdk.StoreTypeIAVL, db)
|
||||
ms.MountStoreWithDB(keySupply, sdk.StoreTypeIAVL, db)
|
||||
ms.MountStoreWithDB(tkeyParams, sdk.StoreTypeTransient, db)
|
||||
err := ms.LoadLatestVersion()
|
||||
require.Nil(t, err)
|
||||
@@ -91,6 +101,7 @@ func CreateTestInput(t *testing.T, isCheckTx bool, tempDir string, supportedFeat
|
||||
|
||||
supplyKeeper := supply.NewKeeper(cdc, keySupply, accountKeeper, bankKeeper, maccPerms)
|
||||
stakingKeeper := staking.NewKeeper(cdc, keyStaking, supplyKeeper, pk.Subspace(staking.DefaultParamspace))
|
||||
stakingKeeper.SetParams(ctx, TestingStakeParams)
|
||||
|
||||
router := baseapp.NewRouter()
|
||||
bh := bank.NewHandler(bankKeeper)
|
||||
@@ -105,7 +116,7 @@ func CreateTestInput(t *testing.T, isCheckTx bool, tempDir string, supportedFeat
|
||||
// add wasm handler so we can loop-back (contracts calling contracts)
|
||||
router.AddRoute(wasmTypes.RouterKey, TestHandler(keeper))
|
||||
|
||||
return ctx, accountKeeper, keeper
|
||||
return ctx, accountKeeper, stakingKeeper, keeper
|
||||
}
|
||||
|
||||
// TestHandler returns a wasm handler for tests (to avoid circular imports)
|
||||
|
||||
@@ -34,7 +34,7 @@ func setupTest(t *testing.T) (testData, func()) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
|
||||
ctx, acctKeeper, keeper := CreateTestInput(t, false, tempDir, "staking", nil, nil)
|
||||
ctx, acctKeeper, _, keeper := CreateTestInput(t, false, tempDir, "staking", nil, nil)
|
||||
data := testData{
|
||||
module: NewAppModule(keeper),
|
||||
ctx: ctx,
|
||||
@@ -63,7 +63,7 @@ func mustLoad(path string) []byte {
|
||||
var (
|
||||
key1, pub1, addr1 = keyPubAddr()
|
||||
testContract = mustLoad("./internal/keeper/testdata/contract.wasm")
|
||||
maskContract = mustLoad("./internal/keeper/testdata/mask.wasm")
|
||||
maskContract = mustLoad("./internal/keeper/testdata/reflect.wasm")
|
||||
oldContract = mustLoad("./testdata/escrow_0.7.wasm")
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user