chore: rename integration to e2e (#291)
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
package e2e_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"cosmossdk.io/math"
|
||||
|
||||
testutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
|
||||
interchaintest "github.com/strangelove-ventures/interchaintest/v8"
|
||||
"github.com/strangelove-ventures/interchaintest/v8/chain/cosmos"
|
||||
"github.com/strangelove-ventures/interchaintest/v8/ibc"
|
||||
ictestutil "github.com/strangelove-ventures/interchaintest/v8/testutil"
|
||||
"github.com/stretchr/testify/suite"
|
||||
|
||||
"github.com/skip-mev/block-sdk/lanes/base"
|
||||
"github.com/skip-mev/block-sdk/lanes/free"
|
||||
"github.com/skip-mev/block-sdk/lanes/mev"
|
||||
"github.com/skip-mev/block-sdk/tests/e2e"
|
||||
auctiontypes "github.com/skip-mev/block-sdk/x/auction/types"
|
||||
blocksdkmoduletypes "github.com/skip-mev/block-sdk/x/blocksdk/types"
|
||||
)
|
||||
|
||||
var (
|
||||
// config params
|
||||
numValidators = 4
|
||||
numFullNodes = 0
|
||||
denom = "stake"
|
||||
|
||||
image = ibc.DockerImage{
|
||||
Repository: "block-sdk-e2e",
|
||||
Version: "latest",
|
||||
UidGid: "1000:1000",
|
||||
}
|
||||
encodingConfig = MakeEncodingConfig()
|
||||
noHostMount = false
|
||||
gasAdjustment = 2.0
|
||||
|
||||
genesisKV = []cosmos.GenesisKV{
|
||||
{
|
||||
Key: "app_state.auction.params.max_bundle_size",
|
||||
Value: 3,
|
||||
},
|
||||
{
|
||||
Key: "app_state.blocksdk.lanes",
|
||||
Value: []blocksdkmoduletypes.Lane{
|
||||
{
|
||||
Id: mev.LaneName,
|
||||
MaxBlockSpace: math.LegacyMustNewDecFromStr("0.2"),
|
||||
Order: 0,
|
||||
},
|
||||
{
|
||||
Id: free.LaneName,
|
||||
MaxBlockSpace: math.LegacyMustNewDecFromStr("0.2"),
|
||||
Order: 1,
|
||||
},
|
||||
{
|
||||
Id: base.LaneName,
|
||||
MaxBlockSpace: math.LegacyMustNewDecFromStr("0.6"),
|
||||
Order: 2,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
consensusParams = ictestutil.Toml{
|
||||
"timeout_commit": "5000ms",
|
||||
}
|
||||
|
||||
// interchain specification
|
||||
spec = &interchaintest.ChainSpec{
|
||||
ChainName: "block-sdk",
|
||||
Name: "block-sdk",
|
||||
NumValidators: &numValidators,
|
||||
NumFullNodes: &numFullNodes,
|
||||
Version: "latest",
|
||||
NoHostMount: &noHostMount,
|
||||
ChainConfig: ibc.ChainConfig{
|
||||
EncodingConfig: encodingConfig,
|
||||
Images: []ibc.DockerImage{
|
||||
image,
|
||||
},
|
||||
Type: "cosmos",
|
||||
Name: "block-sdk",
|
||||
Denom: denom,
|
||||
ChainID: "chain-id-0",
|
||||
Bin: "testappd",
|
||||
Bech32Prefix: "cosmos",
|
||||
CoinType: "118",
|
||||
GasAdjustment: gasAdjustment,
|
||||
GasPrices: fmt.Sprintf("0%s", denom),
|
||||
TrustingPeriod: "48h",
|
||||
NoHostMount: noHostMount,
|
||||
ModifyGenesis: cosmos.ModifyGenesis(genesisKV),
|
||||
ConfigFileOverrides: map[string]any{"config/config.toml": ictestutil.Toml{"consensus": consensusParams}},
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
func MakeEncodingConfig() *testutil.TestEncodingConfig {
|
||||
cfg := cosmos.DefaultEncoding()
|
||||
|
||||
// register auction types
|
||||
auctiontypes.RegisterInterfaces(cfg.InterfaceRegistry)
|
||||
blocksdkmoduletypes.RegisterInterfaces(cfg.InterfaceRegistry)
|
||||
|
||||
return &cfg
|
||||
}
|
||||
|
||||
func TestE2ETestSuite(t *testing.T) {
|
||||
suite.Run(t, e2e.NewE2ETestSuiteFromSpec(spec))
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,530 @@
|
||||
package e2e
|
||||
|
||||
import (
|
||||
"archive/tar"
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"io"
|
||||
"math/rand"
|
||||
"os"
|
||||
"path"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/client"
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keyring"
|
||||
|
||||
"cosmossdk.io/math"
|
||||
rpctypes "github.com/cometbft/cometbft/rpc/core/types"
|
||||
comettypes "github.com/cometbft/cometbft/types"
|
||||
"github.com/cosmos/cosmos-sdk/client/tx"
|
||||
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
|
||||
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
|
||||
interchaintest "github.com/strangelove-ventures/interchaintest/v8"
|
||||
"github.com/strangelove-ventures/interchaintest/v8/chain/cosmos"
|
||||
"github.com/strangelove-ventures/interchaintest/v8/ibc"
|
||||
"github.com/strangelove-ventures/interchaintest/v8/testutil"
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.uber.org/zap/zaptest"
|
||||
"golang.org/x/sync/errgroup"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/credentials/insecure"
|
||||
|
||||
servicetypes "github.com/skip-mev/block-sdk/block/service/types"
|
||||
auctiontypes "github.com/skip-mev/block-sdk/x/auction/types"
|
||||
)
|
||||
|
||||
type KeyringOverride struct {
|
||||
keyringOptions keyring.Option
|
||||
cdc codec.Codec
|
||||
}
|
||||
|
||||
// ChainBuilderFromChainSpec creates an interchaintest chain builder factory given a ChainSpec
|
||||
// and returns the associated chain
|
||||
func ChainBuilderFromChainSpec(t *testing.T, spec *interchaintest.ChainSpec) ibc.Chain {
|
||||
// require that NumFullNodes == NumValidators == 4
|
||||
require.Equal(t, *spec.NumValidators, 4)
|
||||
|
||||
cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{spec})
|
||||
|
||||
chains, err := cf.Chains(t.Name())
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Len(t, chains, 1)
|
||||
chain := chains[0]
|
||||
|
||||
_, ok := chain.(*cosmos.CosmosChain)
|
||||
require.True(t, ok)
|
||||
|
||||
return chain
|
||||
}
|
||||
|
||||
// BuildInterchain creates a new Interchain testing env with the configured Block SDK CosmosChain
|
||||
func BuildInterchain(t *testing.T, ctx context.Context, chain ibc.Chain) *interchaintest.Interchain {
|
||||
ic := interchaintest.NewInterchain()
|
||||
ic.AddChain(chain)
|
||||
|
||||
// create docker network
|
||||
client, networkID := interchaintest.DockerSetup(t)
|
||||
|
||||
ctx, cancel := context.WithTimeout(ctx, 2*time.Minute)
|
||||
defer cancel()
|
||||
|
||||
// build the interchain
|
||||
err := ic.Build(ctx, nil, interchaintest.InterchainBuildOptions{
|
||||
SkipPathCreation: true,
|
||||
Client: client,
|
||||
NetworkID: networkID,
|
||||
TestName: t.Name(),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
return ic
|
||||
}
|
||||
|
||||
// CreateTx creates a new transaction to be signed by the given user, including a provided set of messages
|
||||
func (s *E2ETestSuite) CreateTx(ctx context.Context, chain *cosmos.CosmosChain, user cosmos.User, seqIncrement, height uint64, GasPrice int64, msgs ...sdk.Msg) []byte {
|
||||
// create tx factory + Client Context
|
||||
txf, err := s.bc.GetFactory(ctx, user)
|
||||
s.Require().NoError(err)
|
||||
|
||||
cc, err := s.bc.GetClientContext(ctx, user)
|
||||
s.Require().NoError(err)
|
||||
|
||||
txf = txf.WithSimulateAndExecute(true)
|
||||
|
||||
txf, err = txf.Prepare(cc)
|
||||
s.Require().NoError(err)
|
||||
|
||||
// set timeout height
|
||||
if height != 0 {
|
||||
txf = txf.WithTimeoutHeight(height)
|
||||
}
|
||||
|
||||
// get gas for tx
|
||||
txf.WithGas(25000000)
|
||||
|
||||
// update sequence number
|
||||
txf = txf.WithSequence(txf.Sequence() + seqIncrement)
|
||||
txf = txf.WithGasPrices(sdk.NewDecCoins(sdk.NewDecCoin(chain.Config().Denom, math.NewInt(GasPrice))).String())
|
||||
|
||||
// sign the tx
|
||||
txBuilder, err := txf.BuildUnsignedTx(msgs...)
|
||||
s.Require().NoError(err)
|
||||
|
||||
s.Require().NoError(tx.Sign(cc.CmdContext, txf, cc.GetFromName(), txBuilder, true))
|
||||
|
||||
// encode and return
|
||||
bz, err := cc.TxConfig.TxEncoder()(txBuilder.GetTx())
|
||||
s.Require().NoError(err)
|
||||
return bz
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) CreateDummyAuctionBidTx(
|
||||
height uint64,
|
||||
searcher ibc.Wallet,
|
||||
bid sdk.Coin,
|
||||
) Tx {
|
||||
msgAuctionBid := auctiontypes.NewMsgAuctionBid(
|
||||
searcher.Address(),
|
||||
bid,
|
||||
nil,
|
||||
)
|
||||
|
||||
return Tx{
|
||||
User: searcher,
|
||||
Msgs: []sdk.Msg{msgAuctionBid},
|
||||
GasPrice: 1000,
|
||||
Height: height + 1,
|
||||
SkipInclusionCheck: true,
|
||||
IgnoreChecks: true,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) CreateDummyNormalTx(
|
||||
from, to ibc.Wallet,
|
||||
coins sdk.Coins,
|
||||
sequenceOffset uint64,
|
||||
gasPrice int64,
|
||||
) Tx {
|
||||
msgSend := banktypes.NewMsgSend(
|
||||
sdk.AccAddress(from.Address()),
|
||||
sdk.AccAddress(to.Address()),
|
||||
coins,
|
||||
)
|
||||
|
||||
return Tx{
|
||||
User: from,
|
||||
Msgs: []sdk.Msg{msgSend},
|
||||
GasPrice: gasPrice,
|
||||
SequenceIncrement: sequenceOffset,
|
||||
SkipInclusionCheck: true,
|
||||
IgnoreChecks: true,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) CreateDummyFreeTx(
|
||||
user ibc.Wallet,
|
||||
validator sdk.ValAddress,
|
||||
delegation sdk.Coin,
|
||||
sequenceOffset uint64,
|
||||
) Tx {
|
||||
delegateMsg := stakingtypes.NewMsgDelegate(
|
||||
sdk.AccAddress(user.Address()).String(),
|
||||
sdk.ValAddress(validator).String(),
|
||||
delegation,
|
||||
)
|
||||
|
||||
return Tx{
|
||||
User: user,
|
||||
Msgs: []sdk.Msg{delegateMsg},
|
||||
GasPrice: rand.Int63n(150000),
|
||||
SequenceIncrement: sequenceOffset,
|
||||
SkipInclusionCheck: true,
|
||||
IgnoreChecks: true,
|
||||
}
|
||||
}
|
||||
|
||||
// SimulateTx simulates the provided messages, and checks whether the provided failure condition is met
|
||||
func (s *E2ETestSuite) SimulateTx(ctx context.Context, chain *cosmos.CosmosChain, user cosmos.User, height uint64, expectFail bool, msgs ...sdk.Msg) {
|
||||
// create tx factory + Client Context
|
||||
txf, err := s.bc.GetFactory(ctx, user)
|
||||
s.Require().NoError(err)
|
||||
|
||||
cc, err := s.bc.GetClientContext(ctx, user)
|
||||
s.Require().NoError(err)
|
||||
|
||||
txf, err = txf.Prepare(cc)
|
||||
s.Require().NoError(err)
|
||||
|
||||
// set timeout height
|
||||
if height != 0 {
|
||||
txf = txf.WithTimeoutHeight(height)
|
||||
}
|
||||
|
||||
// get gas for tx
|
||||
_, _, err = tx.CalculateGas(cc, txf, msgs...)
|
||||
s.Require().Equal(err != nil, expectFail)
|
||||
}
|
||||
|
||||
type Tx struct {
|
||||
User cosmos.User
|
||||
Msgs []sdk.Msg
|
||||
GasPrice int64
|
||||
SequenceIncrement uint64
|
||||
Height uint64
|
||||
SkipInclusionCheck bool
|
||||
ExpectFail bool
|
||||
IgnoreChecks bool
|
||||
}
|
||||
|
||||
// CreateAuctionBidMsg creates a new AuctionBid tx signed by the given user, the order of txs in the MsgAuctionBid will be determined by the contents + order of the MessageForUsers
|
||||
func (s *E2ETestSuite) CreateAuctionBidMsg(ctx context.Context, searcher cosmos.User, chain *cosmos.CosmosChain, bid sdk.Coin, txsPerUser []Tx) (*auctiontypes.MsgAuctionBid, [][]byte) {
|
||||
// for each MessagesForUser get the signed bytes
|
||||
txs := make([][]byte, len(txsPerUser))
|
||||
for i, tx := range txsPerUser {
|
||||
txs[i] = s.CreateTx(ctx, chain, tx.User, tx.SequenceIncrement, tx.Height, tx.GasPrice, tx.Msgs...)
|
||||
}
|
||||
|
||||
bech32SearcherAddress := searcher.FormattedAddress()
|
||||
accAddr, err := sdk.AccAddressFromBech32(bech32SearcherAddress)
|
||||
s.Require().NoError(err)
|
||||
|
||||
// create a message auction bid
|
||||
return auctiontypes.NewMsgAuctionBid(
|
||||
accAddr,
|
||||
bid,
|
||||
txs,
|
||||
), txs
|
||||
}
|
||||
|
||||
// BroadcastTxs broadcasts the given messages for each user. This function returns the broadcasted txs. If a message
|
||||
// is not expected to be included in a block, set SkipInclusionCheck to true and the method
|
||||
// will not block on the tx's inclusion in a block, otherwise this method will block on the tx's inclusion
|
||||
func (s *E2ETestSuite) BroadcastTxs(ctx context.Context, chain *cosmos.CosmosChain, txs []Tx) [][]byte {
|
||||
return s.BroadcastTxsWithCallback(ctx, chain, txs, nil)
|
||||
}
|
||||
|
||||
// BroadcastTxs broadcasts the given messages for each user. This function returns the broadcasted txs. If a message
|
||||
// is not expected to be included in a block, set SkipInclusionCheck to true and the method
|
||||
// will not block on the tx's inclusion in a block, otherwise this method will block on the tx's inclusion. The callback
|
||||
// function is called for each tx that is included in a block.
|
||||
func (s *E2ETestSuite) BroadcastTxsWithCallback(
|
||||
ctx context.Context,
|
||||
chain *cosmos.CosmosChain,
|
||||
txs []Tx,
|
||||
cb func(tx []byte, resp *rpctypes.ResultTx),
|
||||
) [][]byte {
|
||||
rawTxs := make([][]byte, len(txs))
|
||||
|
||||
for i, msg := range txs {
|
||||
rawTxs[i] = s.CreateTx(ctx, chain, msg.User, msg.SequenceIncrement, msg.Height, msg.GasPrice, msg.Msgs...)
|
||||
}
|
||||
|
||||
// broadcast each tx
|
||||
s.Require().True(len(chain.Nodes()) > 0)
|
||||
client := chain.Nodes()[0].Client
|
||||
|
||||
for i, tx := range rawTxs {
|
||||
// broadcast tx
|
||||
if txs[i].IgnoreChecks {
|
||||
client.BroadcastTxAsync(ctx, tx)
|
||||
continue
|
||||
}
|
||||
|
||||
resp, err := client.BroadcastTxSync(ctx, tx)
|
||||
|
||||
// check execution was successful
|
||||
if !txs[i].ExpectFail {
|
||||
s.Require().Equal(resp.Code, uint32(0))
|
||||
} else {
|
||||
if resp != nil {
|
||||
s.Require().NotEqual(resp.Code, uint32(0))
|
||||
} else {
|
||||
s.Require().Error(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// block on all txs being included in block
|
||||
eg := errgroup.Group{}
|
||||
for i, tx := range rawTxs {
|
||||
// if we don't expect this tx to be included.. skip it
|
||||
if txs[i].SkipInclusionCheck || txs[i].ExpectFail || txs[i].IgnoreChecks {
|
||||
continue
|
||||
}
|
||||
|
||||
tx := tx // pin
|
||||
eg.Go(func() error {
|
||||
return testutil.WaitForCondition(30*time.Second, 500*time.Millisecond, func() (bool, error) {
|
||||
res, err := client.Tx(context.Background(), comettypes.Tx(tx).Hash(), false)
|
||||
if err != nil || res.TxResult.Code != uint32(0) {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
if cb != nil {
|
||||
cb(tx, res)
|
||||
}
|
||||
|
||||
return true, nil
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
s.Require().NoError(eg.Wait())
|
||||
|
||||
return rawTxs
|
||||
}
|
||||
|
||||
// QueryAuctionParams queries the x/auction module's params
|
||||
func QueryAuctionParams(t *testing.T, chain ibc.Chain) auctiontypes.Params {
|
||||
// cast chain to cosmos-chain
|
||||
cosmosChain, ok := chain.(*cosmos.CosmosChain)
|
||||
require.True(t, ok)
|
||||
// get nodes
|
||||
nodes := cosmosChain.Nodes()
|
||||
require.True(t, len(nodes) > 0)
|
||||
// make params query to first node
|
||||
resp, _, err := nodes[0].ExecQuery(context.Background(), "auction", "params")
|
||||
require.NoError(t, err)
|
||||
|
||||
// unmarshal params
|
||||
var params auctiontypes.Params
|
||||
err = json.Unmarshal(resp, ¶ms)
|
||||
require.NoError(t, err)
|
||||
return params
|
||||
}
|
||||
|
||||
// QueryValidators queries for all of the network's validators
|
||||
func QueryValidators(t *testing.T, chain *cosmos.CosmosChain) []sdk.ValAddress {
|
||||
// get grpc client of the node
|
||||
grpcAddr := chain.GetHostGRPCAddress()
|
||||
cc, err := grpc.Dial(grpcAddr, grpc.WithTransportCredentials(insecure.NewCredentials()))
|
||||
|
||||
require.NoError(t, err)
|
||||
|
||||
client := stakingtypes.NewQueryClient(cc)
|
||||
|
||||
// query validators
|
||||
resp, err := client.Validators(context.Background(), &stakingtypes.QueryValidatorsRequest{})
|
||||
require.NoError(t, err)
|
||||
|
||||
addrs := make([]sdk.ValAddress, len(resp.Validators))
|
||||
|
||||
// unmarshal validators
|
||||
for i, val := range resp.Validators {
|
||||
addrBz, err := sdk.GetFromBech32(val.OperatorAddress, chain.Config().Bech32Prefix+sdk.PrefixValidator+sdk.PrefixOperator)
|
||||
require.NoError(t, err)
|
||||
|
||||
addrs[i] = sdk.ValAddress(addrBz)
|
||||
}
|
||||
return addrs
|
||||
}
|
||||
|
||||
// QueryMempool queries the mempool of the given chain
|
||||
func QueryMempool(t *testing.T, chain ibc.Chain) (*servicetypes.GetTxDistributionResponse, error) {
|
||||
// get grpc client of the node
|
||||
grpcAddr := chain.GetHostGRPCAddress()
|
||||
cc, err := grpc.Dial(grpcAddr, grpc.WithTransportCredentials(insecure.NewCredentials()))
|
||||
|
||||
require.NoError(t, err)
|
||||
|
||||
client := servicetypes.NewServiceClient(cc)
|
||||
return client.GetTxDistribution(context.Background(), &servicetypes.GetTxDistributionRequest{})
|
||||
}
|
||||
|
||||
// QueryAccountBalance queries a given account's balance on the chain
|
||||
func QueryAccountBalance(t *testing.T, chain ibc.Chain, address, denom string) int64 {
|
||||
// cast the chain to a cosmos-chain
|
||||
cosmosChain, ok := chain.(*cosmos.CosmosChain)
|
||||
require.True(t, ok)
|
||||
// get nodes
|
||||
balance, err := cosmosChain.GetBalance(context.Background(), address, denom)
|
||||
require.NoError(t, err)
|
||||
return balance.Int64()
|
||||
}
|
||||
|
||||
// QueryAccountSequence
|
||||
func QueryAccountSequence(t *testing.T, chain *cosmos.CosmosChain, address string) uint64 {
|
||||
// get nodes
|
||||
nodes := chain.Nodes()
|
||||
require.True(t, len(nodes) > 0)
|
||||
|
||||
resp, _, err := nodes[0].ExecQuery(context.Background(), "auth", "account", address)
|
||||
require.NoError(t, err)
|
||||
// unmarshal json response
|
||||
var accResp codectypes.Any
|
||||
require.NoError(t, json.Unmarshal(resp, &accResp))
|
||||
|
||||
// unmarshal into baseAccount
|
||||
var acc authtypes.BaseAccount
|
||||
require.NoError(t, acc.Unmarshal(accResp.Value))
|
||||
|
||||
return acc.GetSequence()
|
||||
}
|
||||
|
||||
// Block returns the block at the given height
|
||||
func Block(t *testing.T, chain *cosmos.CosmosChain, height int64) *rpctypes.ResultBlock {
|
||||
// get nodes
|
||||
nodes := chain.Nodes()
|
||||
require.True(t, len(nodes) > 0)
|
||||
|
||||
client := nodes[0].Client
|
||||
|
||||
resp, err := client.Block(context.Background(), &height)
|
||||
require.NoError(t, err)
|
||||
|
||||
return resp
|
||||
}
|
||||
|
||||
// WaitForHeight waits for the chain to reach the given height
|
||||
func WaitForHeight(t *testing.T, chain *cosmos.CosmosChain, height uint64) {
|
||||
// wait for next height
|
||||
err := testutil.WaitForCondition(30*time.Second, 100*time.Millisecond, func() (bool, error) {
|
||||
pollHeight, err := chain.Height(context.Background())
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
return pollHeight >= height, nil
|
||||
})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
// VerifyBlockWithExpectedBlock takes in a list of raw tx bytes and compares each tx hash to the tx hashes in the block.
|
||||
// The expected block is the block that should be returned by the chain at the given height.
|
||||
func VerifyBlockWithExpectedBlock(t *testing.T, chain *cosmos.CosmosChain, height uint64, txs [][]byte) {
|
||||
block := Block(t, chain, int64(height))
|
||||
blockTxs := block.Block.Data.Txs
|
||||
|
||||
t.Logf("verifying block %d", height)
|
||||
require.Equal(t, len(txs), len(blockTxs))
|
||||
for i, tx := range txs {
|
||||
t.Logf("verifying tx %d; expected %s, got %s", i, TxHash(tx), TxHash(blockTxs[i]))
|
||||
require.Equal(t, TxHash(tx), TxHash(blockTxs[i]))
|
||||
}
|
||||
}
|
||||
|
||||
func TxHash(tx []byte) string {
|
||||
return strings.ToUpper(hex.EncodeToString(comettypes.Tx(tx).Hash()))
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) setupBroadcaster() {
|
||||
bc := cosmos.NewBroadcaster(s.T(), s.chain.(*cosmos.CosmosChain))
|
||||
|
||||
if s.broadcasterOverrides == nil {
|
||||
s.bc = bc
|
||||
return
|
||||
}
|
||||
|
||||
// get the key-ring-dir from the node locally
|
||||
keyringDir := s.keyringDirFromNode()
|
||||
|
||||
// create a new keyring
|
||||
kr, err := keyring.New("", keyring.BackendTest, keyringDir, os.Stdin, s.broadcasterOverrides.cdc, s.broadcasterOverrides.keyringOptions)
|
||||
s.Require().NoError(err)
|
||||
|
||||
// override factory + client context keyrings
|
||||
bc.ConfigureFactoryOptions(
|
||||
func(factory tx.Factory) tx.Factory {
|
||||
return factory.WithKeybase(kr)
|
||||
},
|
||||
)
|
||||
|
||||
bc.ConfigureClientContextOptions(
|
||||
func(cc client.Context) client.Context {
|
||||
return cc.WithKeyring(kr)
|
||||
},
|
||||
)
|
||||
|
||||
s.bc = bc
|
||||
}
|
||||
|
||||
// sniped from here: https://github.com/strangelove-ventures/interchaintest ref: 9341b001214d26be420f1ca1ab0f15bad17faee6
|
||||
func (s *E2ETestSuite) keyringDirFromNode() string {
|
||||
node := s.chain.(*cosmos.CosmosChain).Nodes()[0]
|
||||
|
||||
// create a temp-dir
|
||||
localDir := s.T().TempDir()
|
||||
|
||||
containerKeyringDir := path.Join(node.HomeDir(), "keyring-test")
|
||||
reader, _, err := node.DockerClient.CopyFromContainer(context.Background(), node.ContainerID(), containerKeyringDir)
|
||||
s.Require().NoError(err)
|
||||
|
||||
s.Require().NoError(os.Mkdir(path.Join(localDir, "keyring-test"), os.ModePerm))
|
||||
|
||||
tr := tar.NewReader(reader)
|
||||
for {
|
||||
hdr, err := tr.Next()
|
||||
if err == io.EOF {
|
||||
break // End of archive
|
||||
}
|
||||
s.Require().NoError(err)
|
||||
|
||||
var fileBuff bytes.Buffer
|
||||
_, err = io.Copy(&fileBuff, tr)
|
||||
s.Require().NoError(err)
|
||||
|
||||
name := hdr.Name
|
||||
extractedFileName := path.Base(name)
|
||||
isDirectory := extractedFileName == ""
|
||||
if isDirectory {
|
||||
continue
|
||||
}
|
||||
|
||||
filePath := path.Join(localDir, "keyring-test", extractedFileName)
|
||||
s.Require().NoError(os.WriteFile(filePath, fileBuff.Bytes(), os.ModePerm))
|
||||
}
|
||||
|
||||
return localDir
|
||||
}
|
||||
|
||||
func escrowAddressIncrement(bid math.Int, proposerFee math.LegacyDec) int64 {
|
||||
return int64(bid.Sub(math.Int(math.LegacyNewDecFromInt(bid).Mul(proposerFee).RoundInt())).Int64())
|
||||
}
|
||||
@@ -0,0 +1,258 @@
|
||||
module github.com/skip-mev/block-sdk/tests/e2e
|
||||
|
||||
go 1.21
|
||||
|
||||
toolchain go1.21.0
|
||||
|
||||
replace (
|
||||
github.com/ChainSafe/go-schnorrkel => github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d
|
||||
github.com/ChainSafe/go-schnorrkel/1 => github.com/ChainSafe/go-schnorrkel v1.0.0
|
||||
github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1
|
||||
github.com/skip-mev/block-sdk => ../../
|
||||
)
|
||||
|
||||
require (
|
||||
cosmossdk.io/math v1.2.0
|
||||
github.com/cometbft/cometbft v0.38.0
|
||||
github.com/cosmos/cosmos-sdk v0.50.1
|
||||
github.com/skip-mev/block-sdk v1.0.0 // reference local
|
||||
github.com/strangelove-ventures/interchaintest/v8 v8.0.0
|
||||
github.com/stretchr/testify v1.8.4
|
||||
go.uber.org/zap v1.26.0
|
||||
golang.org/x/sync v0.5.0
|
||||
google.golang.org/grpc v1.59.0
|
||||
)
|
||||
|
||||
require (
|
||||
cloud.google.com/go v0.110.8 // indirect
|
||||
cloud.google.com/go/compute v1.23.1 // indirect
|
||||
cloud.google.com/go/compute/metadata v0.2.3 // indirect
|
||||
cloud.google.com/go/iam v1.1.3 // indirect
|
||||
cloud.google.com/go/storage v1.30.1 // indirect
|
||||
cosmossdk.io/api v0.7.2 // indirect
|
||||
cosmossdk.io/collections v0.4.0 // indirect
|
||||
cosmossdk.io/core v0.11.0 // indirect
|
||||
cosmossdk.io/depinject v1.0.0-alpha.4 // indirect
|
||||
cosmossdk.io/errors v1.0.0 // indirect
|
||||
cosmossdk.io/log v1.2.1 // indirect
|
||||
cosmossdk.io/store v1.0.0 // indirect
|
||||
cosmossdk.io/x/tx v0.12.0 // indirect
|
||||
cosmossdk.io/x/upgrade v0.0.0-20230915171831-2196edacb99d // indirect
|
||||
filippo.io/edwards25519 v1.0.0 // indirect
|
||||
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect
|
||||
github.com/99designs/keyring v1.2.2 // indirect
|
||||
github.com/BurntSushi/toml v1.3.2 // indirect
|
||||
github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect
|
||||
github.com/ChainSafe/go-schnorrkel/1 v0.0.0-00010101000000-000000000000 // indirect
|
||||
github.com/ComposableFi/go-subkey/v2 v2.0.0-tm03420 // indirect
|
||||
github.com/DataDog/zstd v1.5.5 // indirect
|
||||
github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect
|
||||
github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect
|
||||
github.com/Microsoft/go-winio v0.6.0 // indirect
|
||||
github.com/StirlingMarketingGroup/go-namecase v1.0.0 // indirect
|
||||
github.com/avast/retry-go/v4 v4.5.0 // indirect
|
||||
github.com/aws/aws-sdk-go v1.44.224 // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect
|
||||
github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect
|
||||
github.com/bits-and-blooms/bitset v1.8.0 // indirect
|
||||
github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect
|
||||
github.com/cenkalti/backoff/v4 v4.1.3 // indirect
|
||||
github.com/cespare/xxhash v1.1.0 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||
github.com/chzyer/readline v1.5.1 // indirect
|
||||
github.com/cockroachdb/errors v1.11.1 // indirect
|
||||
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
|
||||
github.com/cockroachdb/pebble v0.0.0-20231101195458-481da04154d6 // indirect
|
||||
github.com/cockroachdb/redact v1.1.5 // indirect
|
||||
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
|
||||
github.com/cometbft/cometbft-db v0.8.0 // indirect
|
||||
github.com/cosmos/btcutil v1.0.5 // indirect
|
||||
github.com/cosmos/cosmos-db v1.0.0 // indirect
|
||||
github.com/cosmos/cosmos-proto v1.0.0-beta.3 // indirect
|
||||
github.com/cosmos/go-bip39 v1.0.0 // indirect
|
||||
github.com/cosmos/gogogateway v1.2.0 // indirect
|
||||
github.com/cosmos/gogoproto v1.4.11 // indirect
|
||||
github.com/cosmos/iavl v1.0.0 // indirect
|
||||
github.com/cosmos/ibc-go/modules/capability v1.0.0-rc6 // indirect
|
||||
github.com/cosmos/ibc-go/v8 v8.0.0-rc.0 // indirect
|
||||
github.com/cosmos/ics23/go v0.10.0 // indirect
|
||||
github.com/cosmos/ledger-cosmos-go v0.13.3 // indirect
|
||||
github.com/danieljoos/wincred v1.1.2 // indirect
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||
github.com/deckarep/golang-set v1.8.0 // indirect
|
||||
github.com/decred/base58 v1.0.4 // indirect
|
||||
github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect
|
||||
github.com/decred/dcrd/dcrec/secp256k1/v2 v2.0.1 // indirect
|
||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect
|
||||
github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect
|
||||
github.com/dgraph-io/badger/v2 v2.2007.4 // indirect
|
||||
github.com/dgraph-io/ristretto v0.1.1 // indirect
|
||||
github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect
|
||||
github.com/docker/distribution v2.8.2+incompatible // indirect
|
||||
github.com/docker/docker v24.0.7+incompatible // indirect
|
||||
github.com/docker/go-connections v0.4.0 // indirect
|
||||
github.com/docker/go-units v0.5.0 // indirect
|
||||
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||
github.com/dvsekhvalnov/jose2go v1.5.0 // indirect
|
||||
github.com/emicklei/dot v1.6.0 // indirect
|
||||
github.com/ethereum/go-ethereum v1.12.1 // indirect
|
||||
github.com/fatih/color v1.15.0 // indirect
|
||||
github.com/felixge/httpsnoop v1.0.2 // indirect
|
||||
github.com/fsnotify/fsnotify v1.6.0 // indirect
|
||||
github.com/getsentry/sentry-go v0.25.0 // indirect
|
||||
github.com/go-kit/kit v0.12.0 // indirect
|
||||
github.com/go-kit/log v0.2.1 // indirect
|
||||
github.com/go-logfmt/logfmt v0.6.0 // indirect
|
||||
github.com/go-stack/stack v1.8.1 // indirect
|
||||
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect
|
||||
github.com/gogo/googleapis v1.4.1 // indirect
|
||||
github.com/gogo/protobuf v1.3.3 // indirect
|
||||
github.com/golang/glog v1.1.2 // indirect
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||
github.com/golang/mock v1.6.0 // indirect
|
||||
github.com/golang/protobuf v1.5.3 // indirect
|
||||
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect
|
||||
github.com/google/btree v1.1.2 // indirect
|
||||
github.com/google/go-cmp v0.6.0 // indirect
|
||||
github.com/google/orderedcode v0.0.1 // indirect
|
||||
github.com/google/s2a-go v0.1.7 // indirect
|
||||
github.com/google/uuid v1.3.1 // indirect
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.3.1 // indirect
|
||||
github.com/googleapis/gax-go/v2 v2.12.0 // indirect
|
||||
github.com/gorilla/handlers v1.5.1 // indirect
|
||||
github.com/gorilla/mux v1.8.1 // indirect
|
||||
github.com/gorilla/websocket v1.5.0 // indirect
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
|
||||
github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect
|
||||
github.com/gtank/merlin v0.1.1 // indirect
|
||||
github.com/gtank/ristretto255 v0.1.2 // indirect
|
||||
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
||||
github.com/hashicorp/go-getter v1.7.1 // indirect
|
||||
github.com/hashicorp/go-hclog v1.5.0 // indirect
|
||||
github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
|
||||
github.com/hashicorp/go-metrics v0.5.1 // indirect
|
||||
github.com/hashicorp/go-plugin v1.5.2 // indirect
|
||||
github.com/hashicorp/go-safetemp v1.0.0 // indirect
|
||||
github.com/hashicorp/go-version v1.6.0 // indirect
|
||||
github.com/hashicorp/golang-lru v1.0.2 // indirect
|
||||
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||
github.com/hashicorp/yamux v0.1.1 // indirect
|
||||
github.com/hdevalence/ed25519consensus v0.1.0 // indirect
|
||||
github.com/holiman/uint256 v1.2.3 // indirect
|
||||
github.com/huandu/skiplist v1.2.0 // indirect
|
||||
github.com/iancoleman/strcase v0.3.0 // indirect
|
||||
github.com/icza/dyno v0.0.0-20230330125955-09f820a8d9c0 // indirect
|
||||
github.com/improbable-eng/grpc-web v0.15.0 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||
github.com/ipfs/go-cid v0.4.1 // indirect
|
||||
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
||||
github.com/jmhodges/levigo v1.0.0 // indirect
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
|
||||
github.com/klauspost/compress v1.17.2 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
|
||||
github.com/kr/pretty v0.3.1 // indirect
|
||||
github.com/kr/text v0.2.0 // indirect
|
||||
github.com/lib/pq v1.10.9 // indirect
|
||||
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
|
||||
github.com/libp2p/go-libp2p v0.31.0 // indirect
|
||||
github.com/linxGnu/grocksdb v1.8.4 // indirect
|
||||
github.com/magiconair/properties v1.8.7 // indirect
|
||||
github.com/manifoldco/promptui v0.9.0 // indirect
|
||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
|
||||
github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b // indirect
|
||||
github.com/minio/highwayhash v1.0.2 // indirect
|
||||
github.com/minio/sha256-simd v1.0.1 // indirect
|
||||
github.com/misko9/go-substrate-rpc-client/v4 v4.0.0-20230913220906-b988ea7da0c2 // indirect
|
||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||
github.com/mitchellh/go-testing-interface v1.14.1 // indirect
|
||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||
github.com/mr-tron/base58 v1.2.0 // indirect
|
||||
github.com/mtibben/percent v0.2.1 // indirect
|
||||
github.com/multiformats/go-base32 v0.1.0 // indirect
|
||||
github.com/multiformats/go-base36 v0.2.0 // indirect
|
||||
github.com/multiformats/go-multiaddr v0.11.0 // indirect
|
||||
github.com/multiformats/go-multibase v0.2.0 // indirect
|
||||
github.com/multiformats/go-multicodec v0.9.0 // indirect
|
||||
github.com/multiformats/go-multihash v0.2.3 // indirect
|
||||
github.com/multiformats/go-varint v0.0.7 // indirect
|
||||
github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a // indirect
|
||||
github.com/oklog/run v1.1.0 // indirect
|
||||
github.com/opencontainers/go-digest v1.0.0 // indirect
|
||||
github.com/opencontainers/image-spec v1.1.0-rc2 // indirect
|
||||
github.com/pelletier/go-toml v1.9.5 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.1.0 // indirect
|
||||
github.com/petermattis/goid v0.0.0-20230904192822-1876fd5063bc // indirect
|
||||
github.com/pierrec/xxHash v0.1.5 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||
github.com/prometheus/client_golang v1.17.0 // indirect
|
||||
github.com/prometheus/client_model v0.5.0 // indirect
|
||||
github.com/prometheus/common v0.45.0 // indirect
|
||||
github.com/prometheus/procfs v0.12.0 // indirect
|
||||
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
|
||||
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
|
||||
github.com/rogpeppe/go-internal v1.11.0 // indirect
|
||||
github.com/rs/cors v1.8.3 // indirect
|
||||
github.com/rs/zerolog v1.31.0 // indirect
|
||||
github.com/sagikazarmark/locafero v0.3.0 // indirect
|
||||
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
|
||||
github.com/sasha-s/go-deadlock v0.3.1 // indirect
|
||||
github.com/sourcegraph/conc v0.3.0 // indirect
|
||||
github.com/spaolacci/murmur3 v1.1.0 // indirect
|
||||
github.com/spf13/afero v1.10.0 // indirect
|
||||
github.com/spf13/cast v1.5.1 // indirect
|
||||
github.com/spf13/cobra v1.8.0 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
github.com/spf13/viper v1.17.0 // indirect
|
||||
github.com/subosito/gotenv v1.6.0 // indirect
|
||||
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
|
||||
github.com/tendermint/go-amino v0.16.0 // indirect
|
||||
github.com/tidwall/btree v1.7.0 // indirect
|
||||
github.com/tyler-smith/go-bip32 v1.0.0 // indirect
|
||||
github.com/tyler-smith/go-bip39 v1.1.0 // indirect
|
||||
github.com/ulikunitz/xz v0.5.11 // indirect
|
||||
github.com/zondax/hid v0.9.2 // indirect
|
||||
github.com/zondax/ledger-go v0.14.3 // indirect
|
||||
go.etcd.io/bbolt v1.3.7 // indirect
|
||||
go.opencensus.io v0.24.0 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
golang.org/x/crypto v0.14.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
|
||||
golang.org/x/mod v0.13.0 // indirect
|
||||
golang.org/x/net v0.17.0 // indirect
|
||||
golang.org/x/oauth2 v0.12.0 // indirect
|
||||
golang.org/x/sys v0.13.0 // indirect
|
||||
golang.org/x/term v0.13.0 // indirect
|
||||
golang.org/x/text v0.13.0 // indirect
|
||||
golang.org/x/tools v0.14.0 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
|
||||
google.golang.org/api v0.143.0 // indirect
|
||||
google.golang.org/appengine v1.6.7 // indirect
|
||||
google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b // indirect
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect
|
||||
google.golang.org/protobuf v1.31.0 // indirect
|
||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
gotest.tools/v3 v3.5.1 // indirect
|
||||
lukechampine.com/blake3 v1.2.1 // indirect
|
||||
lukechampine.com/uint128 v1.2.0 // indirect
|
||||
modernc.org/cc/v3 v3.40.0 // indirect
|
||||
modernc.org/ccgo/v3 v3.16.13 // indirect
|
||||
modernc.org/libc v1.29.0 // indirect
|
||||
modernc.org/mathutil v1.6.0 // indirect
|
||||
modernc.org/memory v1.7.2 // indirect
|
||||
modernc.org/opt v0.1.3 // indirect
|
||||
modernc.org/sqlite v1.27.0 // indirect
|
||||
modernc.org/strutil v1.1.3 // indirect
|
||||
modernc.org/token v1.0.1 // indirect
|
||||
nhooyr.io/websocket v1.8.7 // indirect
|
||||
pgregory.net/rapid v1.1.0 // indirect
|
||||
sigs.k8s.io/yaml v1.3.0 // indirect
|
||||
)
|
||||
+1865
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user