Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problem: v0.47.x is outdated #197

Merged
merged 43 commits into from
Dec 21, 2023
Merged
Changes from 1 commit
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
80705f7
feat(gov): handle panics when executing x/gov proposals (backport #17…
mergify[bot] Sep 18, 2023
c65feec
refactor(store): add missing error checks in store (#17817)
julienrbrt Sep 20, 2023
a6f79a9
fix(baseapp): select txs correctly with no-op mempool (backport #1776…
mergify[bot] Sep 25, 2023
8d6c611
docs: small update for routes change (backport #17881) (#17887)
mergify[bot] Sep 26, 2023
e0ab380
chore: remove duplicate check (#17901)
tac0turtle Sep 27, 2023
f29fcc5
chore: remove tip posthandler (#17902)
tac0turtle Sep 27, 2023
85034c1
chore(auth): return accId in error (backport #17903) (#17906)
mergify[bot] Sep 27, 2023
353ae64
chore(store): check value (backport #17900) (#17908)
mergify[bot] Sep 27, 2023
afd4d9d
refactor(x/gov): remove gov vote and proposal based telemetry (backpo…
mergify[bot] Sep 27, 2023
d7c4bfd
docs: Typo on Application - Specific documentation (backport #17933)…
mergify[bot] Oct 1, 2023
2601e23
chore(staking): add delegator to events (backport #18006) (#18012)
mergify[bot] Oct 9, 2023
7d12782
feat(baseapp): expose `Mempool` (backport #17954) (#18010)
mergify[bot] Oct 9, 2023
02c403f
docs: fix typos (backport #18018) (#18020)
mergify[bot] Oct 9, 2023
d24d469
chore(x/consensus): check for nil params (backport #18041) (#18069)
mergify[bot] Oct 11, 2023
c121fcc
build(deps): bump cosmos/ledger-cosmos-go to v0.12.3 in v0.47 (#18105)
julienrbrt Oct 13, 2023
efa1226
chore: fix comments on bech32 (backport #18114) (#18117)
mergify[bot] Oct 13, 2023
91b44c5
fix(x/bank): miss keypair of SendEnabled to restore legacy param set …
mmsqe Oct 16, 2023
0469b11
build(deps): Bump github.com/cosmos/ledger-cosmos-go from 0.12.3 to 0…
dependabot[bot] Oct 17, 2023
1a306fd
feat(server): start grpc server and register services when starting i…
p-offtermatt Oct 19, 2023
d003fa1
refactor(x/gov): backport MinInitialDepositRatio validation from v0.5…
julienrbrt Oct 20, 2023
362f234
refactor(x/authz): extend validate genesis (backport #18042) (#18208)
mergify[bot] Oct 23, 2023
269a245
fix(authz): check string is not empty (backport #18209) (#18218)
mergify[bot] Oct 23, 2023
98a8bfe
chore(x/upgrade): Use ValidateBasic for Plan in ReadUpgradeInfoFromDi…
mergify[bot] Oct 24, 2023
af758d7
refactor(network): call `app.Close()` on network cleanup (backport #1…
mergify[bot] Oct 25, 2023
8c9ab2c
fix(server): don't hardcode grpc address to localhost (backport #1825…
mergify[bot] Oct 25, 2023
d3c9653
fix: use a lower file permission in file creation (backport #18206) (…
mergify[bot] Oct 26, 2023
00ee987
fix(snapshot): grant execution permissions to the snapshot dir for th…
mergify[bot] Oct 29, 2023
37ad929
build(deps): Bump cosmossdk.io/math from 1.1.2 to 1.2.0 (#18398)
dependabot[bot] Nov 7, 2023
03d578b
chore: prepare v0.47.6 release notes (#18342)
julienrbrt Nov 14, 2023
cb6d235
fix(client/tx): simulate with correct pk (backport #18472) (#18503)
mergify[bot] Nov 17, 2023
60112c6
feat(server): cmd flag to disable colored logs (backport #18478) (#18…
mergify[bot] Nov 19, 2023
d79964b
build(deps): Bump github.com/cometbft/cometbft from 0.37.2 to 0.37.3 …
dependabot[bot] Nov 20, 2023
58b0cdd
Revert "build(deps): Bump github.com/cometbft/cometbft from 0.37.2 to…
julienrbrt Nov 20, 2023
55c6d55
fix(server): properly parse multiple gas config (backport #18537) (#1…
mergify[bot] Nov 22, 2023
044ff4d
build(deps): Bump github.com/cometbft/cometbft from 0.37.2 to 0.37.4 …
dependabot[bot] Nov 27, 2023
3c7a090
feat(x/gov): better gov genesis validation (backport #18707) (#18712)
mergify[bot] Dec 13, 2023
6309fa7
docs: add ante precision (backport #18709) (#18730)
mergify[bot] Dec 13, 2023
371744b
fix(x/auth): remove misleading gas wanted value from tx simulation fa…
mergify[bot] Dec 19, 2023
9c1fa8c
docs: add index page for learn section (backport #18777) (#18779)
mergify[bot] Dec 19, 2023
929e76b
docs: fix for links (backport #18816) (#18819)
mergify[bot] Dec 19, 2023
9e60114
fix(baseapp): Reset GasMeter before deliverTX v0.47.x backport (#18826)
Eric-Warehime Dec 20, 2023
d09f40d
chore: prepare v0.47.7 (#18765)
julienrbrt Dec 20, 2023
fb8e3a4
Merge tag 'v0.47.7' into release/v0.47.x
mmsqe Dec 21, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix(client/tx): simulate with correct pk (backport cosmos#18472) (cos…
mergify[bot] authored Nov 17, 2023
commit cb6d2354d1235b9ed36a4e7200dda25434b46bfb
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -37,6 +37,10 @@ Ref: https://keepachangelog.com/en/1.0.0/

## [Unreleased]

### Bug Fixes

* (client/tx) [#18472](https://github.com/cosmos/cosmos-sdk/pull/18472) Utilizes the correct Pubkey when simulating a transaction.

## [v0.47.6](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.47.6) - 2023-11-14

### Features
40 changes: 29 additions & 11 deletions client/tx/factory.go
Original file line number Diff line number Diff line change
@@ -15,6 +15,7 @@ import (
"github.com/cosmos/cosmos-sdk/client/flags"
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
"github.com/cosmos/cosmos-sdk/crypto/keyring"
"github.com/cosmos/cosmos-sdk/crypto/keys/multisig"
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
sdk "github.com/cosmos/cosmos-sdk/types"
@@ -34,6 +35,7 @@ type Factory struct {
timeoutHeight uint64
gasAdjustment float64
chainID string
fromName string
offline bool
generateOnly bool
memo string
@@ -86,6 +88,7 @@ func NewFactoryCLI(clientCtx client.Context, flagSet *pflag.FlagSet) (Factory, e
accountRetriever: clientCtx.AccountRetriever,
keybase: clientCtx.Keyring,
chainID: clientCtx.ChainID,
fromName: clientCtx.FromName,
offline: clientCtx.Offline,
generateOnly: clientCtx.GenerateOnly,
gas: gasSetting.Gas,
@@ -414,10 +417,8 @@ func (f Factory) BuildSimTx(msgs ...sdk.Msg) ([]byte, error) {
// Create an empty signature literal as the ante handler will populate with a
// sentinel pubkey.
sig := signing.SignatureV2{
PubKey: pk,
Data: &signing.SingleSignatureData{
SignMode: f.signMode,
},
PubKey: pk,
Data: f.getSimSignatureData(pk),
Sequence: f.Sequence(),
}
if err := txb.SetSignatures(sig); err != nil {
@@ -438,16 +439,13 @@ func (f Factory) getSimPK() (cryptotypes.PubKey, error) {
pk cryptotypes.PubKey = &secp256k1.PubKey{} // use default public key type
)

// Use the first element from the list of keys in order to generate a valid
// pubkey that supports multiple algorithms.
if f.simulateAndExecute && f.keybase != nil {
records, _ := f.keybase.List()
if len(records) == 0 {
return nil, errors.New("cannot build signature for simulation, key records slice is empty")
record, err := f.keybase.Key(f.fromName)
if err != nil {
return nil, err
}

// take the first record just for simulation purposes
pk, ok = records[0].PubKey.GetCachedValue().(cryptotypes.PubKey)
pk, ok = record.PubKey.GetCachedValue().(cryptotypes.PubKey)
if !ok {
return nil, errors.New("cannot build signature for simulation, failed to convert proto Any to public key")
}
@@ -456,6 +454,26 @@ func (f Factory) getSimPK() (cryptotypes.PubKey, error) {
return pk, nil
}

// getSimSignatureData based on the pubKey type gets the correct SignatureData type
// to use for building a simulation tx.
func (f Factory) getSimSignatureData(pk cryptotypes.PubKey) signing.SignatureData {
multisigPubKey, ok := pk.(*multisig.LegacyAminoPubKey)
if !ok {
return &signing.SingleSignatureData{SignMode: f.signMode}
}

multiSignatureData := make([]signing.SignatureData, 0, multisigPubKey.Threshold)
for i := uint32(0); i < multisigPubKey.Threshold; i++ {
multiSignatureData = append(multiSignatureData, &signing.SingleSignatureData{
SignMode: f.SignMode(),
})
}

return &signing.MultiSignatureData{
Signatures: multiSignatureData,
}
}

// Prepare ensures the account defined by ctx.GetFromAddress() exists and
// if the account number and/or the account sequence number are zero (not set),
// they will be queried for and set on the provided Factory.
100 changes: 93 additions & 7 deletions client/tx/factory_test.go
Original file line number Diff line number Diff line change
@@ -1,34 +1,120 @@
package tx_test
package tx

import (
"testing"

"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/tx"
"github.com/stretchr/testify/require"

"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/crypto/hd"
"github.com/cosmos/cosmos-sdk/crypto/keyring"
"github.com/cosmos/cosmos-sdk/crypto/keys/multisig"
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
"github.com/cosmos/cosmos-sdk/crypto/types"
"github.com/cosmos/cosmos-sdk/testutil/testdata"
"github.com/cosmos/cosmos-sdk/types/tx/signing"

codectypes "github.com/cosmos/cosmos-sdk/codec/types"
cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec"
)

func TestFactoryPrepate(t *testing.T) {
func TestFactoryPrepare(t *testing.T) {
t.Parallel()

factory := tx.Factory{}
factory := Factory{}
clientCtx := client.Context{}

output, err := factory.Prepare(clientCtx.WithOffline(true))
require.NoError(t, err)
require.Equal(t, output, factory)

factory = tx.Factory{}.WithAccountRetriever(client.MockAccountRetriever{ReturnAccNum: 10, ReturnAccSeq: 1}).WithAccountNumber(5)
factory = Factory{}.WithAccountRetriever(client.MockAccountRetriever{ReturnAccNum: 10, ReturnAccSeq: 1}).WithAccountNumber(5)
output, err = factory.Prepare(clientCtx.WithFrom("foo"))
require.NoError(t, err)
require.NotEqual(t, output, factory)
require.Equal(t, output.AccountNumber(), uint64(5))
require.Equal(t, output.Sequence(), uint64(1))

factory = tx.Factory{}.WithAccountRetriever(client.MockAccountRetriever{ReturnAccNum: 10, ReturnAccSeq: 1})
factory = Factory{}.WithAccountRetriever(client.MockAccountRetriever{ReturnAccNum: 10, ReturnAccSeq: 1})
output, err = factory.Prepare(clientCtx.WithFrom("foo"))
require.NoError(t, err)
require.NotEqual(t, output, factory)
require.Equal(t, output.AccountNumber(), uint64(10))
require.Equal(t, output.Sequence(), uint64(1))
}

func TestFactory_getSimPKType(t *testing.T) {
// setup keyring
registry := codectypes.NewInterfaceRegistry()
cryptocodec.RegisterInterfaces(registry)
k := keyring.NewInMemory(codec.NewProtoCodec(registry))

tests := []struct {
name string
fromName string
genKey func(fromName string, k keyring.Keyring) error
wantType types.PubKey
}{
{
name: "simple key",
fromName: "testKey",
genKey: func(fromName string, k keyring.Keyring) error {
_, err := k.NewAccount(fromName, testdata.TestMnemonic, "", "", hd.Secp256k1)
return err
},
wantType: (*secp256k1.PubKey)(nil),
},
{
name: "multisig key",
fromName: "multiKey",
genKey: func(fromName string, k keyring.Keyring) error {
pk := multisig.NewLegacyAminoPubKey(1, []types.PubKey{&multisig.LegacyAminoPubKey{}})
_, err := k.SaveMultisig(fromName, pk)
return err
},
wantType: (*multisig.LegacyAminoPubKey)(nil),
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := tt.genKey(tt.fromName, k)
require.NoError(t, err)
f := Factory{
keybase: k,
fromName: tt.fromName,
simulateAndExecute: true,
}
got, err := f.getSimPK()
require.NoError(t, err)
require.IsType(t, tt.wantType, got)
})
}
}

func TestFactory_getSimSignatureData(t *testing.T) {
tests := []struct {
name string
pk types.PubKey
wantType any
}{
{
name: "simple pubkey",
pk: &secp256k1.PubKey{},
wantType: (*signing.SingleSignatureData)(nil),
},
{
name: "multisig pubkey",
pk: &multisig.LegacyAminoPubKey{},
wantType: (*signing.MultiSignatureData)(nil),
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := Factory{}.getSimSignatureData(tt.pk)
require.IsType(t, tt.wantType, got)
})
}
}
21 changes: 11 additions & 10 deletions client/tx/tx_test.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package tx_test
package tx

import (
gocontext "context"
@@ -13,7 +13,6 @@ import (

"github.com/cosmos/cosmos-sdk/client"
clienttestutil "github.com/cosmos/cosmos-sdk/client/testutil"
"github.com/cosmos/cosmos-sdk/client/tx"
"github.com/cosmos/cosmos-sdk/codec"
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
"github.com/cosmos/cosmos-sdk/crypto/hd"
@@ -86,7 +85,7 @@ func TestCalculateGas(t *testing.T) {
stc := tc
txCfg, _ := newTestTxConfig(t)

txf := tx.Factory{}.
txf := Factory{}.
WithChainID("test-chain").
WithTxConfig(txCfg).WithSignMode(txCfg.SignModeHandler().DefaultMode())

@@ -95,7 +94,7 @@ func TestCalculateGas(t *testing.T) {
gasUsed: tc.args.mockGasUsed,
wantErr: tc.args.mockWantErr,
}
simRes, gotAdjusted, err := tx.CalculateGas(mockClientCtx, txf.WithGasAdjustment(stc.args.adjustment))
simRes, gotAdjusted, err := CalculateGas(mockClientCtx, txf.WithGasAdjustment(stc.args.adjustment))
if stc.expPass {
require.NoError(t, err)
require.Equal(t, simRes.GasInfo.GasUsed, stc.wantEstimate)
@@ -109,8 +108,8 @@ func TestCalculateGas(t *testing.T) {
}
}

func mockTxFactory(txCfg client.TxConfig) tx.Factory {
return tx.Factory{}.
func mockTxFactory(txCfg client.TxConfig) Factory {
return Factory{}.
WithTxConfig(txCfg).
WithAccountNumber(50).
WithSequence(23).
@@ -198,7 +197,7 @@ func TestMnemonicInMemo(t *testing.T) {

for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
txf := tx.Factory{}.
txf := Factory{}.
WithTxConfig(txConfig).
WithAccountNumber(50).
WithSequence(23).
@@ -269,7 +268,7 @@ func TestSign(t *testing.T) {

testCases := []struct {
name string
txf tx.Factory
txf Factory
txb client.TxBuilder
from string
overwrite bool
@@ -356,7 +355,7 @@ func TestSign(t *testing.T) {
var prevSigs []signingtypes.SignatureV2
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
err = tx.Sign(tc.txf, tc.from, tc.txb, tc.overwrite)
err = Sign(tc.txf, tc.from, tc.txb, tc.overwrite)
if len(tc.expectedPKs) == 0 {
requireT.Error(err)
} else {
@@ -372,6 +371,8 @@ func TestSign(t *testing.T) {
}

func TestPreprocessHook(t *testing.T) {
_, _, addr2 := testdata.KeyTestPubAddr()

txConfig, cdc := newTestTxConfig(t)
requireT := require.New(t)
path := hd.CreateHDPath(118, 0, 0).String()
@@ -420,7 +421,7 @@ func TestPreprocessHook(t *testing.T) {
msg2 := banktypes.NewMsgSend(addr2, sdk.AccAddress("to"), nil)
txb, err := txfDirect.BuildUnsignedTx(msg1, msg2)

err = tx.Sign(txfDirect, from, txb, false)
err = Sign(txfDirect, from, txb, false)
requireT.NoError(err)

// Run preprocessing