Skip to content

Commit e7bcfc2

Browse files
fix(x/tx): add feePayer as signer (#22311) BACKPORT (#24408)
Co-authored-by: Julián Toledano <[email protected]>
1 parent 73bedad commit e7bcfc2

File tree

3 files changed

+43
-6
lines changed

3 files changed

+43
-6
lines changed

x/tx/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ Since v0.13.0, x/tx follows Cosmos SDK semver: https://github.com/cosmos/cosmos-
3737

3838
* SDK v0.53.x support.
3939
* [#23708](https://github.com/cosmos/cosmos-sdk/pull/23708) Add unordered transaction support.
40+
* [#24408](https://github.com/cosmos/cosmos-sdk/pull/24408) Fix add feePayer as signer.
4041
* [#24409](https://github.com/cosmos/cosmos-sdk/pull/24409) Fallback to injected resolver for placeholder descriptors.
4142

4243
## [v0.13.8](https://github.com/cosmos/cosmos-sdk/releases/tag/x/tx/v0.13.8) - 2025-01-28

x/tx/decode/decode.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,18 @@ func (d *Decoder) Decode(txBytes []byte) (*DecodedTx, error) {
118118
}
119119
}
120120

121+
// If a fee payer is specified in the AuthInfo, it must be added to the list of signers
122+
if authInfo.Fee != nil && authInfo.Fee.Payer != "" {
123+
feeAddr, err := d.signingCtx.AddressCodec().StringToBytes(authInfo.Fee.Payer)
124+
if err != nil {
125+
return nil, errorsmod.Wrap(ErrTxDecode, err.Error())
126+
}
127+
128+
if _, seen := seenSigners[string(feeAddr)]; !seen {
129+
signers = append(signers, feeAddr)
130+
}
131+
}
132+
121133
return &DecodedTx{
122134
Messages: msgs,
123135
Tx: theTx,

x/tx/decode/decode_test.go

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,19 +50,42 @@ func TestDecode(t *testing.T) {
5050
require.NoError(t, err)
5151

5252
testCases := []struct {
53-
name string
54-
msg proto.Message
55-
error string
53+
name string
54+
msg proto.Message
55+
feePayer string
56+
error string
57+
expectedSigners int
5658
}{
5759
{
58-
name: "happy path",
59-
msg: &bankv1beta1.MsgSend{},
60+
name: "happy path",
61+
msg: &bankv1beta1.MsgSend{},
62+
expectedSigners: 1,
6063
},
6164
{
6265
name: "empty signer option",
6366
msg: &testpb.A{},
6467
error: "no cosmos.msg.v1.signer option found for message A; use DefineCustomGetSigners to specify a custom getter: tx parse error",
6568
},
69+
{
70+
name: "invalid feePayer",
71+
msg: &bankv1beta1.MsgSend{},
72+
feePayer: "payer",
73+
error: `encoding/hex: invalid byte: U+0070 'p': tx parse error`,
74+
},
75+
{
76+
name: "valid feePayer",
77+
msg: &bankv1beta1.MsgSend{},
78+
feePayer: "636f736d6f733168363935356b3836397a72306770383975717034337a373263393033666d35647a366b75306c", // hexadecimal to work with dummyAddressCodec
79+
expectedSigners: 2,
80+
},
81+
{
82+
name: "same msg signer and feePayer",
83+
msg: &bankv1beta1.MsgSend{
84+
FromAddress: "636f736d6f733168363935356b3836397a72306770383975717034337a373263393033666d35647a366b75306c",
85+
},
86+
feePayer: "636f736d6f733168363935356b3836397a72306770383975717034337a373263393033666d35647a366b75306c",
87+
expectedSigners: 1,
88+
},
6689
}
6790

6891
for _, tc := range testCases {
@@ -83,7 +106,7 @@ func TestDecode(t *testing.T) {
83106
Fee: &txv1beta1.Fee{
84107
Amount: []*basev1beta1.Coin{{Amount: "100", Denom: "denom"}},
85108
GasLimit: 100,
86-
Payer: "payer",
109+
Payer: tc.feePayer,
87110
Granter: "",
88111
},
89112
},
@@ -98,6 +121,7 @@ func TestDecode(t *testing.T) {
98121
return
99122
}
100123
require.NoError(t, err)
124+
require.Equal(t, len(decodeTx.Signers), tc.expectedSigners)
101125

102126
require.Equal(t,
103127
fmt.Sprintf("/%s", tc.msg.ProtoReflect().Descriptor().FullName()),

0 commit comments

Comments
 (0)