|
| 1 | +package ante_test |
| 2 | + |
| 3 | +import ( |
| 4 | + "github.com/White-Whale-Defi-Platform/migaloo-chain/v3/app" |
| 5 | + config "github.com/White-Whale-Defi-Platform/migaloo-chain/v3/app/params" |
| 6 | + tmproto "github.com/cometbft/cometbft/proto/tendermint/types" |
| 7 | + "github.com/cosmos/cosmos-sdk/client/tx" |
| 8 | + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" |
| 9 | + "github.com/cosmos/cosmos-sdk/types/tx/signing" |
| 10 | + authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" |
| 11 | + minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" |
| 12 | + "github.com/cosmos/ibc-go/v7/testing/simapp" |
| 13 | + "math" |
| 14 | + "testing" |
| 15 | + |
| 16 | + "github.com/stretchr/testify/suite" |
| 17 | + |
| 18 | + "github.com/cosmos/cosmos-sdk/client" |
| 19 | + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" |
| 20 | + "github.com/cosmos/cosmos-sdk/testutil/testdata" |
| 21 | + sdk "github.com/cosmos/cosmos-sdk/types" |
| 22 | + "github.com/cosmos/cosmos-sdk/x/auth/ante" |
| 23 | + "github.com/cosmos/cosmos-sdk/x/auth/types" |
| 24 | + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" |
| 25 | +) |
| 26 | + |
| 27 | +var ( |
| 28 | + DEFAULT_FEE int64 = 1000000000000 |
| 29 | +) |
| 30 | +var s *AnteTestSuite |
| 31 | + |
| 32 | +// TestAccount represents an account used in the tests in x/auth/ante. |
| 33 | +type TestAccount struct { |
| 34 | + acc types.AccountI |
| 35 | + priv cryptotypes.PrivKey |
| 36 | +} |
| 37 | + |
| 38 | +// AnteTestSuite is a test suite to be used with ante handler tests. |
| 39 | +type AnteTestSuite struct { |
| 40 | + suite.Suite |
| 41 | + |
| 42 | + app *app.MigalooApp |
| 43 | + anteHandler sdk.AnteHandler |
| 44 | + ctx sdk.Context |
| 45 | + clientCtx client.Context |
| 46 | + txBuilder client.TxBuilder |
| 47 | +} |
| 48 | + |
| 49 | +// returns context and app with params set on account keeper |
| 50 | +func createTestApp(isCheckTx bool) (*app.MigalooApp, sdk.Context) { |
| 51 | + app := app.Setup(false) |
| 52 | + ctx := app.BaseApp.NewContext(isCheckTx, tmproto.Header{}) |
| 53 | + app.AccountKeeper.SetParams(ctx, authtypes.DefaultParams()) |
| 54 | + |
| 55 | + return app, ctx |
| 56 | +} |
| 57 | + |
| 58 | +// SetupTest setups a new test, with new app, context, and anteHandler. |
| 59 | +func (suite *AnteTestSuite) SetupTest(isCheckTx bool) { |
| 60 | + suite.app, suite.ctx = createTestApp(isCheckTx) |
| 61 | + suite.ctx = suite.ctx.WithBlockHeight(1) |
| 62 | + |
| 63 | + // Set up TxConfig. |
| 64 | + encodingConfig := simapp.MakeTestEncodingConfig() |
| 65 | + // We're using TestMsg encoding in some tests, so register it here. |
| 66 | + encodingConfig.Amino.RegisterConcrete(&testdata.TestMsg{}, "testdata.TestMsg", nil) |
| 67 | + testdata.RegisterInterfaces(encodingConfig.InterfaceRegistry) |
| 68 | + |
| 69 | + suite.clientCtx = client.Context{}. |
| 70 | + WithTxConfig(encodingConfig.TxConfig) |
| 71 | + |
| 72 | + anteHandler, err := ante.NewAnteHandler( |
| 73 | + ante.HandlerOptions{ |
| 74 | + AccountKeeper: suite.app.AccountKeeper, |
| 75 | + BankKeeper: suite.app.BankKeeper, |
| 76 | + FeegrantKeeper: suite.app.FeeGrantKeeper, |
| 77 | + SignModeHandler: encodingConfig.TxConfig.SignModeHandler(), |
| 78 | + SigGasConsumer: ante.DefaultSigVerificationGasConsumer, |
| 79 | + }, |
| 80 | + ) |
| 81 | + |
| 82 | + suite.Require().NoError(err) |
| 83 | + suite.anteHandler = anteHandler |
| 84 | + |
| 85 | + feePoolBalance := sdk.Coins{{Denom: config.BaseDenom, Amount: sdk.NewInt(int64(math.Pow10(18) * 2))}} |
| 86 | + |
| 87 | + err = suite.app.BankKeeper.MintCoins(suite.ctx, minttypes.ModuleName, feePoolBalance) |
| 88 | + suite.Require().NoError(err) |
| 89 | + err = suite.app.BankKeeper.SendCoinsFromModuleToModule(suite.ctx, minttypes.ModuleName, authtypes.FeeCollectorName, feePoolBalance) |
| 90 | + suite.Require().NoError(err) |
| 91 | +} |
| 92 | + |
| 93 | +func TestAnteTestSuite(t *testing.T) { |
| 94 | + s = new(AnteTestSuite) |
| 95 | + suite.Run(t, s) |
| 96 | +} |
| 97 | + |
| 98 | +func getAddr(priv *ed25519.PrivKey) sdk.AccAddress { |
| 99 | + return priv.PubKey().Address().Bytes() |
| 100 | +} |
| 101 | + |
| 102 | +func prepareCosmosTx(priv *ed25519.PrivKey, msgs ...sdk.Msg) client.TxBuilder { |
| 103 | + encodingConfig := config.MakeEncodingConfig() |
| 104 | + accountAddress := sdk.AccAddress(priv.PubKey().Address().Bytes()) |
| 105 | + |
| 106 | + txBuilder := encodingConfig.TxConfig.NewTxBuilder() |
| 107 | + |
| 108 | + txBuilder.SetGasLimit(1000000) |
| 109 | + gasPrice := sdk.NewInt(1) |
| 110 | + fees := &sdk.Coins{{Denom: config.BaseDenom, Amount: gasPrice.MulRaw(DEFAULT_FEE)}} |
| 111 | + txBuilder.SetFeeAmount(*fees) |
| 112 | + err := txBuilder.SetMsgs(msgs...) |
| 113 | + s.Require().NoError(err) |
| 114 | + |
| 115 | + seq, err := s.app.AccountKeeper.GetSequence(s.ctx, accountAddress) |
| 116 | + s.Require().NoError(err) |
| 117 | + |
| 118 | + // First round: we gather all the signer infos. We use the "set empty |
| 119 | + // signature" hack to do that. |
| 120 | + sigV2 := signing.SignatureV2{ |
| 121 | + PubKey: priv.PubKey(), |
| 122 | + Data: &signing.SingleSignatureData{ |
| 123 | + SignMode: encodingConfig.TxConfig.SignModeHandler().DefaultMode(), |
| 124 | + Signature: nil, |
| 125 | + }, |
| 126 | + Sequence: seq, |
| 127 | + } |
| 128 | + |
| 129 | + sigsV2 := []signing.SignatureV2{sigV2} |
| 130 | + |
| 131 | + err = txBuilder.SetSignatures(sigsV2...) |
| 132 | + s.Require().NoError(err) |
| 133 | + |
| 134 | + // Second round: all signer infos are set, so each signer can sign. |
| 135 | + accNumber := s.app.AccountKeeper.GetAccount(s.ctx, accountAddress).GetAccountNumber() |
| 136 | + signerData := authsigning.SignerData{ |
| 137 | + ChainID: s.ctx.ChainID(), |
| 138 | + AccountNumber: accNumber, |
| 139 | + Sequence: seq, |
| 140 | + } |
| 141 | + sigV2, err = tx.SignWithPrivKey( |
| 142 | + encodingConfig.TxConfig.SignModeHandler().DefaultMode(), signerData, |
| 143 | + txBuilder, priv, encodingConfig.TxConfig, |
| 144 | + seq, |
| 145 | + ) |
| 146 | + s.Require().NoError(err) |
| 147 | + |
| 148 | + sigsV2 = []signing.SignatureV2{sigV2} |
| 149 | + err = txBuilder.SetSignatures(sigsV2...) |
| 150 | + s.Require().NoError(err) |
| 151 | + |
| 152 | + return txBuilder |
| 153 | +} |
| 154 | + |
| 155 | +func (suite *AnteTestSuite) FundAccount(ctx sdk.Context, addr sdk.AccAddress, amounts sdk.Coins) error { |
| 156 | + if err := suite.app.BankKeeper.MintCoins(ctx, minttypes.ModuleName, amounts); err != nil { |
| 157 | + return err |
| 158 | + } |
| 159 | + |
| 160 | + return suite.app.BankKeeper.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, addr, amounts) |
| 161 | +} |
0 commit comments