diff --git a/block/base/mempool_test.go b/block/base/mempool_test.go new file mode 100644 index 0000000..c02f610 --- /dev/null +++ b/block/base/mempool_test.go @@ -0,0 +1,89 @@ +package base + +import ( + "fmt" + "math/rand" + "testing" + + sdkmath "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + + signerextraction "github.com/skip-mev/block-sdk/adapters/signer_extraction_adapter" + "github.com/skip-mev/block-sdk/testutils" +) + +func TestMempoolComparison(t *testing.T) { + acct := testutils.RandomAccounts(rand.New(rand.NewSource(1)), 2) + txc := testutils.CreateTestEncodingConfig().TxConfig + ctx := testutils.CreateBaseSDKContext(t) + mp := NewMempool( + DefaultTxPriority(), + txc.TxEncoder(), + signerextraction.NewDefaultAdapter(), + 1000, + ) + t.Run("test same account, same nonce", func(t *testing.T) { + tx1, err := testutils.CreateTx(txc, acct[0], 0, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(1))) + require.NoError(t, err) + tx2, err := testutils.CreateTx(txc, acct[0], 0, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(2))) + require.NoError(t, err) + output, err := mp.Compare(ctx, tx1, tx2) + require.Error(t, err, fmt.Errorf("the two transactions have the same seqence number")) + require.Equal(t, 0, output) + }) + t.Run("test same account, tx1 gt amount, tx1 gt nonce", func(t *testing.T) { + tx1, err := testutils.CreateTx(txc, acct[0], 1, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(2))) + require.NoError(t, err) + tx2, err := testutils.CreateTx(txc, acct[0], 0, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(1))) + require.NoError(t, err) + output, err := mp.Compare(ctx, tx1, tx2) + require.NoError(t, err) + require.Equal(t, -1, output) + }) + t.Run("test same account, tx1 lt amount, tx1 gt nonce", func(t *testing.T) { + tx1, err := testutils.CreateTx(txc, acct[0], 1, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(1))) + require.NoError(t, err) + tx2, err := testutils.CreateTx(txc, acct[0], 0, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(2))) + require.NoError(t, err) + output, err := mp.Compare(ctx, tx1, tx2) + require.NoError(t, err) + require.Equal(t, -1, output) + }) + t.Run("test same account, tx1 lt amount, tx1 lt nonce", func(t *testing.T) { + tx1, err := testutils.CreateTx(txc, acct[0], 0, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(1))) + require.NoError(t, err) + tx2, err := testutils.CreateTx(txc, acct[0], 1, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(2))) + require.NoError(t, err) + output, err := mp.Compare(ctx, tx1, tx2) + require.NoError(t, err) + require.Equal(t, 1, output) + }) + t.Run("test diff account, tx1 lt amount, tx1 gt nonce", func(t *testing.T) { + tx1, err := testutils.CreateTx(txc, acct[0], 1, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(1))) + require.NoError(t, err) + tx2, err := testutils.CreateTx(txc, acct[1], 0, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(2))) + require.NoError(t, err) + output, err := mp.Compare(ctx, tx1, tx2) + require.NoError(t, err) + require.Equal(t, -1, output) + }) + t.Run("test diff account, tx1 lt amount, tx1 gt nonce, diff denoms", func(t *testing.T) { + tx1, err := testutils.CreateTx(txc, acct[0], 1, 0, nil, sdk.NewCoin("nonstake", sdkmath.NewInt(1))) + require.NoError(t, err) + tx2, err := testutils.CreateTx(txc, acct[1], 0, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(2))) + require.NoError(t, err) + output, err := mp.Compare(ctx, tx1, tx2) + require.NoError(t, err) + require.Equal(t, 0, output) + }) + t.Run("test diff account, tx1 gt amount, tx1 gt nonce, diff denoms", func(t *testing.T) { + tx1, err := testutils.CreateTx(txc, acct[0], 1, 0, nil, sdk.NewCoin("nonstake", sdkmath.NewInt(2))) + require.NoError(t, err) + tx2, err := testutils.CreateTx(txc, acct[1], 0, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(1))) + require.NoError(t, err) + output, err := mp.Compare(ctx, tx1, tx2) + require.NoError(t, err) + require.Equal(t, 0, output) + }) +} diff --git a/block/service/service_test.go b/block/service/service_test.go index 1bd6189..bfc54a7 100644 --- a/block/service/service_test.go +++ b/block/service/service_test.go @@ -17,6 +17,7 @@ import ( "github.com/skip-mev/block-sdk/lanes/free" "github.com/skip-mev/block-sdk/lanes/mev" "github.com/skip-mev/block-sdk/testutils" + "github.com/skip-mev/block-sdk/testutils/mempool" ) func TestGetTxDistribution(t *testing.T) { @@ -31,7 +32,7 @@ func TestGetTxDistribution(t *testing.T) { }{ { name: "returns correct distribution with no transactions", - mempool: testutils.CreateMempool, + mempool: mempool.CreateMempool, expectedDistribution: map[string]uint64{ mev.LaneName: 0, free.LaneName: 0, @@ -63,7 +64,7 @@ func TestGetTxDistribution(t *testing.T) { ) require.NoError(t, err) - mempool := testutils.CreateMempool() + mempool := mempool.CreateMempool() err = mempool.Insert(ctx, tx1) require.NoError(t, err) err = mempool.Insert(ctx, tx2) @@ -90,7 +91,7 @@ func TestGetTxDistribution(t *testing.T) { ) require.NoError(t, err) - mempool := testutils.CreateMempool() + mempool := mempool.CreateMempool() err = mempool.Insert(ctx, tx1) require.NoError(t, err) @@ -115,7 +116,7 @@ func TestGetTxDistribution(t *testing.T) { ) require.NoError(t, err) - mempool := testutils.CreateMempool() + mempool := mempool.CreateMempool() err = mempool.Insert(ctx, tx1) require.NoError(t, err) @@ -161,7 +162,7 @@ func TestGetTxDistribution(t *testing.T) { ) require.NoError(t, err) - mempool := testutils.CreateMempool() + mempool := mempool.CreateMempool() err = mempool.Insert(ctx, mevTx) require.NoError(t, err) err = mempool.Insert(ctx, freeTx) diff --git a/testutils/mempool/mempool.go b/testutils/mempool/mempool.go new file mode 100644 index 0000000..edfffd1 --- /dev/null +++ b/testutils/mempool/mempool.go @@ -0,0 +1,62 @@ +package mempool + +import ( + "cosmossdk.io/log" + "cosmossdk.io/math" + "github.com/skip-mev/block-sdk/block/mocks" + + signerextraction "github.com/skip-mev/block-sdk/adapters/signer_extraction_adapter" + "github.com/skip-mev/block-sdk/block" + "github.com/skip-mev/block-sdk/block/base" + defaultlane "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/testutils" +) + +func CreateMempool() *block.LanedMempool { + encodingConfig := testutils.CreateTestEncodingConfig() + signerExtractor := signerextraction.NewDefaultAdapter() + + mevConfig := base.LaneConfig{ + SignerExtractor: signerExtractor, + Logger: log.NewNopLogger(), + TxEncoder: encodingConfig.TxConfig.TxEncoder(), + TxDecoder: encodingConfig.TxConfig.TxDecoder(), + AnteHandler: nil, + MaxBlockSpace: math.LegacyMustNewDecFromStr("0.3"), + MaxTxs: 0, // unlimited + } + factory := mev.NewDefaultAuctionFactory(encodingConfig.TxConfig.TxDecoder(), signerExtractor) + mevLane := mev.NewMEVLane(mevConfig, factory, factory.MatchHandler()) + + freeConfig := base.LaneConfig{ + SignerExtractor: signerExtractor, + Logger: log.NewNopLogger(), + TxEncoder: encodingConfig.TxConfig.TxEncoder(), + TxDecoder: encodingConfig.TxConfig.TxDecoder(), + AnteHandler: nil, + MaxBlockSpace: math.LegacyMustNewDecFromStr("0.3"), + MaxTxs: 0, // unlimited + } + freeLane := free.NewFreeLane[string](freeConfig, base.DefaultTxPriority(), free.DefaultMatchHandler()) + + defaultConfig := base.LaneConfig{ + SignerExtractor: signerExtractor, + Logger: log.NewNopLogger(), + TxEncoder: encodingConfig.TxConfig.TxEncoder(), + TxDecoder: encodingConfig.TxConfig.TxDecoder(), + AnteHandler: nil, + MaxBlockSpace: math.LegacyZeroDec(), + MaxTxs: 0, // unlimited + } + defaultLane := defaultlane.NewDefaultLane(defaultConfig, base.DefaultMatchHandler()) + + lanes := []block.Lane{mevLane, freeLane, defaultLane} + mempool, err := block.NewLanedMempool(log.NewNopLogger(), lanes, mocks.MockLaneFetcher{}) + if err != nil { + panic(err) + } + + return mempool +} diff --git a/testutils/utils.go b/testutils/utils.go index a92a272..776f5e2 100644 --- a/testutils/utils.go +++ b/testutils/utils.go @@ -4,8 +4,6 @@ import ( "math/rand" "testing" - "cosmossdk.io/log" - "cosmossdk.io/math" storetypes "cosmossdk.io/store/types" txsigning "cosmossdk.io/x/tx/signing" "github.com/cosmos/cosmos-sdk/client" @@ -25,13 +23,6 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/cosmos/gogoproto/proto" - signerextraction "github.com/skip-mev/block-sdk/adapters/signer_extraction_adapter" - "github.com/skip-mev/block-sdk/block" - "github.com/skip-mev/block-sdk/block/base" - "github.com/skip-mev/block-sdk/block/mocks" - defaultlane "github.com/skip-mev/block-sdk/lanes/base" - "github.com/skip-mev/block-sdk/lanes/free" - "github.com/skip-mev/block-sdk/lanes/mev" auctiontypes "github.com/skip-mev/block-sdk/x/auction/types" ) @@ -55,53 +46,6 @@ func CreateBaseSDKContext(t *testing.T) sdk.Context { return testCtx.Ctx } -func CreateMempool() *block.LanedMempool { - encodingConfig := CreateTestEncodingConfig() - signerExtractor := signerextraction.NewDefaultAdapter() - - mevConfig := base.LaneConfig{ - SignerExtractor: signerExtractor, - Logger: log.NewNopLogger(), - TxEncoder: encodingConfig.TxConfig.TxEncoder(), - TxDecoder: encodingConfig.TxConfig.TxDecoder(), - AnteHandler: nil, - MaxBlockSpace: math.LegacyMustNewDecFromStr("0.3"), - MaxTxs: 0, // unlimited - } - factory := mev.NewDefaultAuctionFactory(encodingConfig.TxConfig.TxDecoder(), signerExtractor) - mevLane := mev.NewMEVLane(mevConfig, factory, factory.MatchHandler()) - - freeConfig := base.LaneConfig{ - SignerExtractor: signerExtractor, - Logger: log.NewNopLogger(), - TxEncoder: encodingConfig.TxConfig.TxEncoder(), - TxDecoder: encodingConfig.TxConfig.TxDecoder(), - AnteHandler: nil, - MaxBlockSpace: math.LegacyMustNewDecFromStr("0.3"), - MaxTxs: 0, // unlimited - } - freeLane := free.NewFreeLane[string](freeConfig, base.DefaultTxPriority(), free.DefaultMatchHandler()) - - defaultConfig := base.LaneConfig{ - SignerExtractor: signerExtractor, - Logger: log.NewNopLogger(), - TxEncoder: encodingConfig.TxConfig.TxEncoder(), - TxDecoder: encodingConfig.TxConfig.TxDecoder(), - AnteHandler: nil, - MaxBlockSpace: math.LegacyZeroDec(), - MaxTxs: 0, // unlimited - } - defaultLane := defaultlane.NewDefaultLane(defaultConfig, base.DefaultMatchHandler()) - - lanes := []block.Lane{mevLane, freeLane, defaultLane} - mempool, err := block.NewLanedMempool(log.NewNopLogger(), lanes, mocks.MockLaneFetcher{}) - if err != nil { - panic(err) - } - - return mempool -} - func CreateTestEncodingConfig() EncodingConfig { interfaceRegistry, err := types.NewInterfaceRegistryWithOptions(types.InterfaceRegistryOptions{ ProtoFiles: proto.HybridResolver,