Skip to content
This repository was archived by the owner on Jan 31, 2025. It is now read-only.

Commit 6ede56c

Browse files
author
Alex Johnson
authored
Merge branch 'release/v1.x.x' into dependabot/go_modules/release/v1.x.x/cosmossdk.io/errors-1.0.1
2 parents f471b13 + 831d8fc commit 6ede56c

11 files changed

+363
-400
lines changed

abci/abci_test.go

+38-19
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ func (s *ProposalsTestSuite) TestPrepareProposal() {
9999
tx1, err := testutils.CreateRandomTx(
100100
s.encodingConfig.TxConfig,
101101
s.accounts[0],
102-
0,
102+
1,
103103
1,
104104
0,
105105
1,
@@ -110,8 +110,8 @@ func (s *ProposalsTestSuite) TestPrepareProposal() {
110110
// Create a second random transaction that will be inserted into the default lane
111111
tx2, err := testutils.CreateRandomTx(
112112
s.encodingConfig.TxConfig,
113-
s.accounts[1],
114-
1,
113+
s.accounts[0],
114+
0,
115115
1,
116116
0,
117117
1,
@@ -1247,27 +1247,46 @@ func (s *ProposalsTestSuite) TestPrepareProcessParity() {
12471247
numAccounts := 25
12481248
accounts := testutils.RandomAccounts(s.random, numAccounts)
12491249

1250+
feeDenoms := []string{
1251+
s.gasTokenDenom,
1252+
"eth",
1253+
"btc",
1254+
"usdt",
1255+
"usdc",
1256+
}
1257+
12501258
// Create a bunch of transactions to insert into the default lane
12511259
txsToInsert := []sdk.Tx{}
12521260
validationMap := make(map[sdk.Tx]bool)
1253-
for _, account := range accounts {
1254-
for nonce := uint64(0); nonce < numTxsPerAccount; nonce++ {
1255-
// create a random fee amount
1256-
feeAmount := math.NewInt(int64(rand.Intn(100000)))
1257-
tx, err := testutils.CreateRandomTx(
1258-
s.encodingConfig.TxConfig,
1259-
account,
1260-
nonce,
1261-
1,
1262-
0,
1263-
1,
1264-
sdk.NewCoin(s.gasTokenDenom, feeAmount),
1265-
)
1266-
s.Require().NoError(err)
1261+
for nonce := uint64(0); nonce < numTxsPerAccount*uint64(numAccounts); nonce++ {
1262+
fees := []sdk.Coin{}
1263+
// choose a random set of fee denoms
1264+
perm := rand.Perm(len(feeDenoms))
1265+
for i := 0; i < 1+rand.Intn(len(feeDenoms)-1); i++ {
1266+
fees = append(fees, sdk.NewCoin(feeDenoms[perm[i]], math.NewInt(int64(rand.Intn(100000)))))
1267+
}
12671268

1268-
txsToInsert = append(txsToInsert, tx)
1269-
validationMap[tx] = true
1269+
// choose a random set of accounts
1270+
perm = rand.Perm(len(accounts))
1271+
signers := []testutils.Account{}
1272+
for i := 0; i < 1+rand.Intn(len(accounts)-1); i++ {
1273+
signers = append(signers, accounts[perm[i]])
12701274
}
1275+
1276+
// create a random fee amount
1277+
tx, err := testutils.CreateRandomTxMultipleSigners(
1278+
s.encodingConfig.TxConfig,
1279+
signers,
1280+
nonce,
1281+
1,
1282+
0,
1283+
1,
1284+
fees...,
1285+
)
1286+
s.Require().NoError(err)
1287+
1288+
txsToInsert = append(txsToInsert, tx)
1289+
validationMap[tx] = true
12711290
}
12721291

12731292
// Set up the default lane with the transactions

abci/utils_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func (s *ProposalsTestSuite) setUpCustomMatchHandlerLane(maxBlockSpace math.Lega
6565

6666
options := []base.LaneOption{
6767
base.WithMatchHandler(mh),
68-
base.WithMempoolConfigs[string](cfg, base.DefaultTxPriority()),
68+
base.WithMempoolConfigs(cfg, base.DefaultTxPriority()),
6969
}
7070

7171
lane, err := base.NewBaseLane(
@@ -129,7 +129,7 @@ func (s *ProposalsTestSuite) setUpPanicLane(name string, maxBlockSpace math.Lega
129129

130130
options := []base.LaneOption{
131131
base.WithMatchHandler(base.DefaultMatchHandler()),
132-
base.WithMempoolConfigs[string](cfg, base.DefaultTxPriority()),
132+
base.WithMempoolConfigs(cfg, base.DefaultTxPriority()),
133133
base.WithPrepareLaneHandler(base.PanicPrepareLaneHandler()),
134134
base.WithProcessLaneHandler(base.PanicProcessLaneHandler()),
135135
}

block/base/mempool_test.go

+173
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
package base_test
2+
3+
import (
4+
"fmt"
5+
"math/rand"
6+
"testing"
7+
8+
sdkmath "cosmossdk.io/math"
9+
sdk "github.com/cosmos/cosmos-sdk/types"
10+
"github.com/stretchr/testify/require"
11+
12+
signerextraction "github.com/skip-mev/block-sdk/adapters/signer_extraction_adapter"
13+
"github.com/skip-mev/block-sdk/block/base"
14+
"github.com/skip-mev/block-sdk/testutils"
15+
)
16+
17+
type txGen struct {
18+
acc testutils.Account
19+
nonce uint64
20+
amount sdk.Coin
21+
}
22+
23+
func TestMempoolComparison(t *testing.T) {
24+
acct := testutils.RandomAccounts(rand.New(rand.NewSource(1)), 2)
25+
txc := testutils.CreateTestEncodingConfig().TxConfig
26+
ctx := testutils.CreateBaseSDKContext(t)
27+
mp := base.NewMempool(
28+
base.DefaultTxPriority(),
29+
txc.TxEncoder(),
30+
signerextraction.NewDefaultAdapter(),
31+
1000,
32+
)
33+
t.Run("test same account, same nonce", func(t *testing.T) {
34+
tx1, err := testutils.CreateTx(txc, acct[0], 0, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(1)))
35+
require.NoError(t, err)
36+
tx2, err := testutils.CreateTx(txc, acct[0], 0, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(2)))
37+
require.NoError(t, err)
38+
output, err := mp.Compare(ctx, tx1, tx2)
39+
require.Error(t, err, fmt.Errorf("the two transactions have the same seqence number"))
40+
require.Equal(t, 0, output)
41+
})
42+
t.Run("test same account, tx1 gt amount, tx1 gt nonce", func(t *testing.T) {
43+
tx1, err := testutils.CreateTx(txc, acct[0], 1, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(2)))
44+
require.NoError(t, err)
45+
tx2, err := testutils.CreateTx(txc, acct[0], 0, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(1)))
46+
require.NoError(t, err)
47+
output, err := mp.Compare(ctx, tx1, tx2)
48+
require.NoError(t, err)
49+
require.Equal(t, -1, output)
50+
})
51+
t.Run("test same account, tx1 lt amount, tx1 gt nonce", func(t *testing.T) {
52+
tx1, err := testutils.CreateTx(txc, acct[0], 1, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(1)))
53+
require.NoError(t, err)
54+
tx2, err := testutils.CreateTx(txc, acct[0], 0, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(2)))
55+
require.NoError(t, err)
56+
output, err := mp.Compare(ctx, tx1, tx2)
57+
require.NoError(t, err)
58+
require.Equal(t, -1, output)
59+
})
60+
t.Run("test same account, tx1 lt amount, tx1 lt nonce", func(t *testing.T) {
61+
tx1, err := testutils.CreateTx(txc, acct[0], 0, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(1)))
62+
require.NoError(t, err)
63+
tx2, err := testutils.CreateTx(txc, acct[0], 1, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(2)))
64+
require.NoError(t, err)
65+
output, err := mp.Compare(ctx, tx1, tx2)
66+
require.NoError(t, err)
67+
require.Equal(t, 1, output)
68+
})
69+
t.Run("test diff account, tx1 lt amount, tx1 gt nonce", func(t *testing.T) {
70+
tx1, err := testutils.CreateTx(txc, acct[0], 1, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(1)))
71+
require.NoError(t, err)
72+
tx2, err := testutils.CreateTx(txc, acct[1], 0, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(2)))
73+
require.NoError(t, err)
74+
output, err := mp.Compare(ctx, tx1, tx2)
75+
require.NoError(t, err)
76+
require.Equal(t, 0, output)
77+
})
78+
t.Run("test diff account, tx1 lt amount, tx1 gt nonce, diff denoms", func(t *testing.T) {
79+
tx1, err := testutils.CreateTx(txc, acct[0], 1, 0, nil, sdk.NewCoin("nonstake", sdkmath.NewInt(1)))
80+
require.NoError(t, err)
81+
tx2, err := testutils.CreateTx(txc, acct[1], 0, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(2)))
82+
require.NoError(t, err)
83+
output, err := mp.Compare(ctx, tx1, tx2)
84+
require.NoError(t, err)
85+
require.Equal(t, 0, output)
86+
})
87+
t.Run("test diff account, tx1 gt amount, tx1 gt nonce, diff denoms", func(t *testing.T) {
88+
tx1, err := testutils.CreateTx(txc, acct[0], 1, 0, nil, sdk.NewCoin("nonstake", sdkmath.NewInt(2)))
89+
require.NoError(t, err)
90+
tx2, err := testutils.CreateTx(txc, acct[1], 0, 0, nil, sdk.NewCoin("stake", sdkmath.NewInt(1)))
91+
require.NoError(t, err)
92+
output, err := mp.Compare(ctx, tx1, tx2)
93+
require.NoError(t, err)
94+
require.Equal(t, 0, output)
95+
})
96+
}
97+
98+
func TestMempoolSelect(t *testing.T) {
99+
acct := testutils.RandomAccounts(rand.New(rand.NewSource(1)), 2)
100+
txc := testutils.CreateTestEncodingConfig().TxConfig
101+
ctx := testutils.CreateBaseSDKContext(t)
102+
se := signerextraction.NewDefaultAdapter()
103+
mp := base.NewMempool(
104+
base.DefaultTxPriority(),
105+
txc.TxEncoder(),
106+
se,
107+
1000,
108+
)
109+
tests := []struct {
110+
name string
111+
inputs []txGen
112+
expected []txGen
113+
}{
114+
{
115+
name: "test1",
116+
inputs: []txGen{
117+
{
118+
acc: acct[0],
119+
amount: sdk.NewCoin("stake", sdkmath.NewInt(1)),
120+
nonce: 0,
121+
},
122+
{
123+
acc: acct[0],
124+
amount: sdk.NewCoin("notstake", sdkmath.NewInt(2)),
125+
nonce: 1,
126+
},
127+
},
128+
expected: []txGen{
129+
{
130+
acc: acct[0],
131+
amount: sdk.NewCoin("stake", sdkmath.NewInt(1)),
132+
nonce: 0,
133+
},
134+
{
135+
acc: acct[0],
136+
amount: sdk.NewCoin("notstake", sdkmath.NewInt(2)),
137+
nonce: 1,
138+
},
139+
},
140+
},
141+
}
142+
for _, tc := range tests {
143+
// insert all input txs
144+
t.Run(tc.name, func(t *testing.T) {
145+
for _, tx := range tc.inputs {
146+
inputTx, err := testutils.CreateTx(txc, tx.acc, tx.nonce, 0, nil, tx.amount)
147+
require.NoError(t, err)
148+
err = mp.Insert(ctx, inputTx)
149+
require.NoError(t, err)
150+
}
151+
})
152+
// extract all txs via select
153+
var output []sdk.Tx
154+
for iter := mp.Select(ctx, nil); iter != nil; iter = iter.Next() {
155+
output = append(output, iter.Tx())
156+
}
157+
// validate the order matches the expected order
158+
require.Equal(t, len(tc.expected), len(output))
159+
for i, tx := range output {
160+
161+
sigs, err := se.GetSigners(tx)
162+
require.NoError(t, err)
163+
require.Equal(t, 1, len(sigs))
164+
require.Equal(t, tc.expected[i].acc.Address, sigs[0].Signer)
165+
feeTx, ok := tx.(sdk.FeeTx)
166+
require.True(t, ok)
167+
require.Equal(t, tc.expected[i].amount.Denom, feeTx.GetFee().GetDenomByIndex(0))
168+
require.Equal(t, tc.expected[i].amount.Amount, feeTx.GetFee().AmountOf(feeTx.GetFee().GetDenomByIndex(0)))
169+
require.Equal(t, tc.expected[i].nonce, sigs[0].Sequence)
170+
171+
}
172+
}
173+
}

0 commit comments

Comments
 (0)