mirror of https://github.com/certusone/wasmd.git
103 lines
2.8 KiB
Go
103 lines
2.8 KiB
Go
package integration
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/cosmwasm/wasmd/app"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
"github.com/cosmos/cosmos-sdk/x/auth"
|
|
authExported "github.com/cosmos/cosmos-sdk/x/auth/exported"
|
|
"github.com/cosmos/cosmos-sdk/x/bank"
|
|
|
|
"github.com/tendermint/tendermint/crypto"
|
|
|
|
// "github.com/tendermint/tendermint/crypto/ed25519"
|
|
"github.com/tendermint/tendermint/crypto/secp256k1"
|
|
)
|
|
|
|
// CreateTestApp will create a new wasmd application and provide money to every address
|
|
// listed there
|
|
func CreateTestApp(t *testing.T, accounts []*auth.BaseAccount) *app.WasmApp {
|
|
fmt.Printf("%#v\n", accounts[1])
|
|
genAccounts := make([]authExported.GenesisAccount, len(accounts))
|
|
for i, acct := range accounts {
|
|
genAccounts[i] = acct
|
|
}
|
|
wasmd := SetupWithGenesisAccounts(genAccounts)
|
|
return wasmd
|
|
}
|
|
|
|
func TestSendWithApp(t *testing.T) {
|
|
// TODO: figure out how to get valid sigs
|
|
t.Skip("Disabled until I get valid sigs")
|
|
|
|
// TODO: how to change default coin?
|
|
coin := sdk.NewCoins(sdk.NewInt64Coin("stake", 123456))
|
|
accts, keys := genAccountsWithKey(t, coin, 2)
|
|
wasm := CreateTestApp(t, accts)
|
|
|
|
// TODO: check account balance first
|
|
msg := bank.MsgSend{
|
|
FromAddress: accts[0].Address,
|
|
ToAddress: accts[1].Address,
|
|
Amount: sdk.NewCoins(sdk.NewInt64Coin("stake", 20)),
|
|
}
|
|
_ = sign(t, wasm, msg, &keys[0], true)
|
|
}
|
|
|
|
func sign(t *testing.T, wasm *app.WasmApp, msg sdk.Msg, signer *signer, expectPass bool) *sdk.Result {
|
|
_, res, _ := SignAndDeliver(t, wasm, []sdk.Msg{msg}, []uint64{signer.acctNum}, []uint64{signer.seq}, expectPass, signer.priv)
|
|
if expectPass {
|
|
signer.seq++
|
|
}
|
|
return res
|
|
}
|
|
|
|
type signer struct {
|
|
priv crypto.PrivKey
|
|
seq uint64
|
|
acctNum uint64
|
|
}
|
|
|
|
func genAccountsWithKey(t *testing.T, coins sdk.Coins, n int) ([]*auth.BaseAccount, []signer) {
|
|
accts := make([]*auth.BaseAccount, n)
|
|
keys := make([]signer, n)
|
|
|
|
for i := range accts {
|
|
priv, pub, addr := maskKeyPubAddr()
|
|
baseAcct := auth.NewBaseAccountWithAddress(addr)
|
|
err := baseAcct.SetCoins(coins)
|
|
require.NoError(t, err)
|
|
baseAcct.SetPubKey(pub)
|
|
baseAcct.SetAccountNumber(uint64(i + 1))
|
|
baseAcct.SetSequence(1)
|
|
accts[i] = &baseAcct
|
|
keys[i] = signer{
|
|
priv: priv,
|
|
acctNum: baseAcct.GetAccountNumber(),
|
|
seq: baseAcct.GetSequence(),
|
|
}
|
|
}
|
|
|
|
return accts, keys
|
|
}
|
|
|
|
var maskKeyCounter uint64 = 0
|
|
|
|
// we need to make this deterministic (same every test run), as encoded address size and thus gas cost,
|
|
// depends on the actual bytes (due to ugly CanonicalAddress encoding)
|
|
func maskKeyPubAddr() (crypto.PrivKey, crypto.PubKey, sdk.AccAddress) {
|
|
maskKeyCounter++
|
|
seed := make([]byte, 8)
|
|
binary.BigEndian.PutUint64(seed, maskKeyCounter)
|
|
|
|
key := secp256k1.GenPrivKeySecp256k1(seed)
|
|
pub := key.PubKey()
|
|
addr := sdk.AccAddress(pub.Address())
|
|
return key, pub, addr
|
|
}
|