136 lines
5.1 KiB
Go

package e2e
import (
"context"
"fmt"
"testing"
sdk "github.com/cosmos/cosmos-sdk/types"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
"github.com/strangelove-ventures/interchaintest/v8/chain/cosmos"
"github.com/strangelove-ventures/interchaintest/v8/ibc"
"github.com/strangelove-ventures/poa"
"github.com/stretchr/testify/require"
)
func POASetPower(t *testing.T, ctx context.Context, chain *cosmos.CosmosChain, user ibc.Wallet, valoper string, power int64, flags ...string) (sdk.TxResponse, error) {
cmd := TxCommandBuilder(ctx, chain, []string{"tx", "poa", "set-power", valoper, fmt.Sprintf("%d", power)}, user.KeyName(), flags...)
return ExecuteTransaction(ctx, chain, cmd)
}
func POARemove(t *testing.T, ctx context.Context, chain *cosmos.CosmosChain, user ibc.Wallet, valoper string) (sdk.TxResponse, error) {
cmd := TxCommandBuilder(ctx, chain, []string{"tx", "poa", "remove", valoper}, user.KeyName())
return ExecuteTransaction(ctx, chain, cmd)
}
func POARemovePending(t *testing.T, ctx context.Context, chain *cosmos.CosmosChain, user ibc.Wallet, valoper string) (sdk.TxResponse, error) {
cmd := TxCommandBuilder(ctx, chain, []string{"tx", "poa", "remove-pending", valoper}, user.KeyName())
return ExecuteTransaction(ctx, chain, cmd)
}
func POACreatePendingValidator(
t *testing.T, ctx context.Context, chain *cosmos.CosmosChain, user ibc.Wallet,
ed25519PubKey string, moniker string, commissionRate string, commissionMaxRate string, commissionMaxChangeRate string,
) (sdk.TxResponse, error) {
file := "validator_file.json"
content := fmt.Sprintf(`{
"pubkey": {"@type":"/cosmos.crypto.ed25519.PubKey","key":"%s"},
"amount": "0%s",
"moniker": "%s",
"identity": "",
"website": "https://website.com",
"security": "security@cosmos.xyz",
"details": "description",
"commission-rate": "%s",
"commission-max-rate": "%s",
"commission-max-change-rate": "%s",
"min-self-delegation": "1"
}`, ed25519PubKey, chain.Config().Denom, moniker, commissionRate, commissionMaxRate, commissionMaxChangeRate)
err := chain.GetNode().WriteFile(ctx, []byte(content), file)
require.NoError(t, err)
filePath := fmt.Sprintf("%s/%s", chain.GetNode().HomeDir(), file)
cmd := TxCommandBuilder(ctx, chain, []string{"tx", "poa", "create-validator", filePath}, user.KeyName())
return ExecuteTransaction(ctx, chain, cmd)
}
func SubmitGovernanceProposalForValidatorChanges(t *testing.T, ctx context.Context, chain *cosmos.CosmosChain, user ibc.Wallet, validator string, power uint64, unsafe bool) string {
govAddr := "cosmos10d07y265gmmuvt4z0w9aw880jnsr700j6zn9kn"
powerMsg := []cosmos.ProtoMessage{
&poa.MsgSetPower{
Sender: govAddr,
ValidatorAddress: validator,
Power: power,
Unsafe: unsafe,
},
}
title := fmt.Sprintf("Update" + validator + "Power")
desc := fmt.Sprintf("Updating power for validator %s to %d", validator, power)
proposal, err := chain.BuildProposal(powerMsg, title, desc, desc, fmt.Sprintf(`50%s`, chain.Config().Denom), user.FormattedAddress(), false)
require.NoError(t, err, "error building proposal")
fmt.Printf("proposal: %+v\n", proposal)
txProp, err := chain.SubmitProposal(ctx, user.KeyName(), proposal)
t.Log("txProp", txProp)
require.NoError(t, err, "error submitting proposal")
return txProp.ProposalID
}
func GetPOAParams(t *testing.T, ctx context.Context, chain *cosmos.CosmosChain) poa.Params {
var res poa.ParamsResponse
ExecuteQuery(ctx, chain, []string{"query", "poa", "params"}, &res)
return res.Params
}
func GetPOAConsensusPower(t *testing.T, ctx context.Context, chain *cosmos.CosmosChain, valoperAddr string) int64 {
res, err := poa.NewQueryClient(chain.GetNode().GrpcConn).ConsensusPower(ctx, &poa.QueryConsensusPowerRequest{ValidatorAddress: valoperAddr})
require.NoError(t, err)
return res.ConsensusPower
}
func GetPOAPending(t *testing.T, ctx context.Context, chain *cosmos.CosmosChain) []poa.Validator {
res, err := poa.NewQueryClient(chain.GetNode().GrpcConn).PendingValidators(ctx, &poa.QueryPendingValidatorsRequest{})
require.NoError(t, err)
return res.Pending
}
func POAUpdateParams(t *testing.T, ctx context.Context, chain *cosmos.CosmosChain, user ibc.Wallet, admins []string, gracefulExit bool) (sdk.TxResponse, error) {
// admin1,admin2,admin3
adminList := ""
for _, admin := range admins {
adminList += admin + ","
}
adminList = adminList[:len(adminList)-1]
gracefulParam := "true"
if !gracefulExit {
gracefulParam = "false"
}
cmd := TxCommandBuilder(ctx, chain, []string{"tx", "poa", "update-params", adminList, gracefulParam}, user.KeyName())
return ExecuteTransaction(ctx, chain, cmd)
}
func POAUpdateStakingParams(t *testing.T, ctx context.Context, chain *cosmos.CosmosChain, user ibc.Wallet, sp stakingtypes.Params) (sdk.TxResponse, error) {
command := []string{"tx", "poa", "update-staking-params",
sp.UnbondingTime.String(),
fmt.Sprintf("%d", sp.MaxValidators),
fmt.Sprintf("%d", sp.MaxEntries),
fmt.Sprintf("%d", sp.HistoricalEntries),
sp.BondDenom,
fmt.Sprintf("%d", sp.MinCommissionRate),
}
cmd := TxCommandBuilder(ctx, chain, command, user.KeyName())
return ExecuteTransaction(ctx, chain, cmd)
}