Add fee payer to protobuf definition (#7384)

* Add fee payer to protobuf definition

* Compile new tx type

* Use FeePayer from Tx, add it to required signers

* Add unit tests on proper handling of FeePayer field

* Use string address for fee payer field

* Update logic for string feePayer
This commit is contained in:
Ethan Frey 2020-09-30 11:03:44 +02:00 committed by GitHub
parent ddaa3c5176
commit d917520092
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 202 additions and 53 deletions

View File

@ -169,4 +169,9 @@ message Fee {
// gas_limit is the maximum gas that can be used in transaction processing // gas_limit is the maximum gas that can be used in transaction processing
// before an out of gas error occurs // before an out of gas error occurs
uint64 gas_limit = 2; uint64 gas_limit = 2;
// if unset, the first signer is responsible for paying the fees. If set, the specified account must pay the fees.
// the payer must be a tx signer (and thus have signed this field in AuthInfo).
// setting this field does *not* change the ordering of required signers for the transaction.
string payer = 3;
} }

View File

@ -672,6 +672,10 @@ type Fee struct {
// gas_limit is the maximum gas that can be used in transaction processing // gas_limit is the maximum gas that can be used in transaction processing
// before an out of gas error occurs // before an out of gas error occurs
GasLimit uint64 `protobuf:"varint,2,opt,name=gas_limit,json=gasLimit,proto3" json:"gas_limit,omitempty"` GasLimit uint64 `protobuf:"varint,2,opt,name=gas_limit,json=gasLimit,proto3" json:"gas_limit,omitempty"`
// if unset, the first signer is responsible for paying the fees. If set, the specified account must pay the fees.
// the payer must be a tx signer (and thus have signed this field in AuthInfo).
// setting this field does *not* change the ordering of required signers for the transaction.
Payer string `protobuf:"bytes,3,opt,name=payer,proto3" json:"payer,omitempty"`
} }
func (m *Fee) Reset() { *m = Fee{} } func (m *Fee) Reset() { *m = Fee{} }
@ -721,6 +725,13 @@ func (m *Fee) GetGasLimit() uint64 {
return 0 return 0
} }
func (m *Fee) GetPayer() string {
if m != nil {
return m.Payer
}
return ""
}
func init() { func init() {
proto.RegisterType((*Tx)(nil), "cosmos.tx.v1beta1.Tx") proto.RegisterType((*Tx)(nil), "cosmos.tx.v1beta1.Tx")
proto.RegisterType((*TxRaw)(nil), "cosmos.tx.v1beta1.TxRaw") proto.RegisterType((*TxRaw)(nil), "cosmos.tx.v1beta1.TxRaw")
@ -737,59 +748,59 @@ func init() {
func init() { proto.RegisterFile("cosmos/tx/v1beta1/tx.proto", fileDescriptor_96d1575ffde80842) } func init() { proto.RegisterFile("cosmos/tx/v1beta1/tx.proto", fileDescriptor_96d1575ffde80842) }
var fileDescriptor_96d1575ffde80842 = []byte{ var fileDescriptor_96d1575ffde80842 = []byte{
// 821 bytes of a gzipped FileDescriptorProto // 830 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0x4f, 0x6f, 0xdc, 0x44, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0x4d, 0x6f, 0xdc, 0x44,
0x14, 0x5f, 0xaf, 0x37, 0x1b, 0xef, 0x4b, 0xd2, 0xd2, 0x51, 0x85, 0x36, 0x1b, 0xd5, 0x0d, 0x46, 0x18, 0x5e, 0xef, 0x57, 0xbc, 0x6f, 0x92, 0x96, 0x8e, 0x22, 0xb4, 0xd9, 0xa8, 0x6e, 0x30, 0x2a,
0x85, 0xbd, 0xc4, 0x6e, 0xd3, 0x03, 0x7f, 0x84, 0x04, 0xd9, 0x42, 0x95, 0xaa, 0x14, 0xa4, 0x49, 0xec, 0x25, 0x76, 0x9b, 0x1e, 0xf8, 0x10, 0x12, 0x64, 0x0b, 0x55, 0xaa, 0x52, 0x90, 0x26, 0x39,
0x4e, 0xbd, 0x58, 0x63, 0xef, 0xc4, 0x3b, 0xea, 0x7a, 0x66, 0xf1, 0x8c, 0x8b, 0xf7, 0x13, 0x70, 0xf5, 0x62, 0x8d, 0xbd, 0x13, 0xef, 0xa8, 0xeb, 0x99, 0xc5, 0x33, 0x2e, 0xf6, 0x8f, 0x40, 0xaa,
0x42, 0xaa, 0x90, 0x10, 0xdf, 0x81, 0x4f, 0xd2, 0x63, 0x8f, 0x9c, 0x20, 0x4a, 0x3e, 0x08, 0x68, 0x90, 0x10, 0x27, 0xfe, 0x00, 0xbf, 0xa4, 0xc7, 0x1e, 0x39, 0x41, 0x95, 0xfc, 0x10, 0xd0, 0x8c,
0xc6, 0x63, 0x27, 0x82, 0x55, 0xf6, 0xc2, 0xc9, 0x33, 0x6f, 0x7e, 0xef, 0xf7, 0x7e, 0x7e, 0xff, 0xc7, 0x4e, 0x04, 0xab, 0xe4, 0xc2, 0xc9, 0x33, 0xef, 0x3c, 0xef, 0xf3, 0x3e, 0x7e, 0xbf, 0x60,
0x60, 0x94, 0x0a, 0x99, 0x0b, 0x19, 0xa9, 0x2a, 0x7a, 0xfd, 0x28, 0xa1, 0x8a, 0x3c, 0x8a, 0x54, 0x92, 0x08, 0x99, 0x09, 0x19, 0xaa, 0x32, 0x7c, 0xf5, 0x30, 0xa6, 0x8a, 0x3c, 0x0c, 0x55, 0x19,
0x15, 0x2e, 0x0a, 0xa1, 0x04, 0xba, 0x53, 0xbf, 0x85, 0xaa, 0x0a, 0xed, 0xdb, 0xe8, 0x6e, 0x26, 0xac, 0x72, 0xa1, 0x04, 0xba, 0x53, 0xbf, 0x05, 0xaa, 0x0c, 0xec, 0xdb, 0x64, 0x27, 0x15, 0xa9,
0x32, 0x61, 0x5e, 0x23, 0x7d, 0xaa, 0x81, 0xa3, 0x03, 0x4b, 0x92, 0x16, 0xcb, 0x85, 0x12, 0x51, 0x30, 0xaf, 0xa1, 0x3e, 0xd5, 0xc0, 0xc9, 0x81, 0x25, 0x49, 0xf2, 0x6a, 0xa5, 0x44, 0x98, 0x15,
0x5e, 0xce, 0x15, 0x93, 0x2c, 0x6b, 0x19, 0x1b, 0x83, 0x85, 0xfb, 0x16, 0x9e, 0x10, 0x49, 0x5b, 0x4b, 0xc5, 0x24, 0x4b, 0x5b, 0xc6, 0xc6, 0x60, 0xe1, 0x9e, 0x85, 0xc7, 0x44, 0xd2, 0x16, 0x93,
0x4c, 0x2a, 0x18, 0xb7, 0xef, 0x1f, 0x5f, 0x69, 0x92, 0x2c, 0xe3, 0x8c, 0x5f, 0x31, 0xd9, 0xbb, 0x08, 0xc6, 0xed, 0xfb, 0xc7, 0x97, 0x9a, 0x24, 0x4b, 0x39, 0xe3, 0x97, 0x4c, 0xf6, 0x6e, 0x81,
0x05, 0xee, 0x66, 0x42, 0x64, 0x73, 0x1a, 0x99, 0x5b, 0x52, 0x9e, 0x45, 0x84, 0x2f, 0xeb, 0xa7, 0xbb, 0xa9, 0x10, 0xe9, 0x92, 0x86, 0xe6, 0x16, 0x17, 0x67, 0x21, 0xe1, 0x55, 0xfd, 0xe4, 0xff,
0xe0, 0x67, 0x07, 0xba, 0xa7, 0x15, 0x3a, 0x80, 0x5e, 0x22, 0xa6, 0xcb, 0xa1, 0xb3, 0xef, 0x8c, 0xe4, 0x40, 0xf7, 0xb4, 0x44, 0x07, 0xd0, 0x8f, 0xc5, 0xbc, 0x1a, 0x3b, 0xfb, 0xce, 0x74, 0xf3,
0xb7, 0x0e, 0x77, 0xc3, 0xff, 0xfc, 0x51, 0x78, 0x5a, 0x4d, 0xc4, 0x74, 0x89, 0x0d, 0x0c, 0x7d, 0x70, 0x37, 0xf8, 0xcf, 0x1f, 0x05, 0xa7, 0xe5, 0x4c, 0xcc, 0x2b, 0x6c, 0x60, 0xe8, 0x53, 0x18,
0x0a, 0x03, 0x52, 0xaa, 0x59, 0xcc, 0xf8, 0x99, 0x18, 0x76, 0x8d, 0xcf, 0xde, 0x0a, 0x9f, 0xa3, 0x91, 0x42, 0x2d, 0x22, 0xc6, 0xcf, 0xc4, 0xb8, 0x6b, 0x7c, 0xf6, 0xd6, 0xf8, 0x1c, 0x15, 0x6a,
0x52, 0xcd, 0x9e, 0xf1, 0x33, 0x81, 0x3d, 0x62, 0x4f, 0xc8, 0x07, 0xd0, 0xda, 0x88, 0x2a, 0x0b, 0xf1, 0x94, 0x9f, 0x09, 0xec, 0x12, 0x7b, 0x42, 0x1e, 0x80, 0xd6, 0x46, 0x54, 0x91, 0x53, 0x39,
0x2a, 0x87, 0xee, 0xbe, 0x3b, 0xde, 0xc6, 0xd7, 0x2c, 0x01, 0x87, 0x8d, 0xd3, 0x0a, 0x93, 0x1f, 0xee, 0xed, 0xf7, 0xa6, 0x5b, 0xf8, 0x8a, 0xc5, 0xe7, 0x30, 0x38, 0x2d, 0x31, 0xf9, 0x11, 0xdd,
0xd1, 0x3d, 0x00, 0x1d, 0x2a, 0x4e, 0x96, 0x8a, 0x4a, 0xa3, 0x6b, 0x1b, 0x0f, 0xb4, 0x65, 0xa2, 0x05, 0xd0, 0xa1, 0xa2, 0xb8, 0x52, 0x54, 0x1a, 0x5d, 0x5b, 0x78, 0xa4, 0x2d, 0x33, 0x6d, 0x40,
0x0d, 0xe8, 0x23, 0xb8, 0xdd, 0x2a, 0xb0, 0x98, 0xae, 0xc1, 0xec, 0x34, 0xa1, 0x6a, 0xdc, 0xba, 0x1f, 0xc1, 0xed, 0x56, 0x81, 0xc5, 0x74, 0x0d, 0x66, 0xbb, 0x09, 0x55, 0xe3, 0x6e, 0x8a, 0xf7,
0x78, 0xbf, 0x38, 0xb0, 0x79, 0xc2, 0x32, 0xfe, 0xb5, 0x48, 0xff, 0xaf, 0x90, 0xbb, 0xe0, 0xa5, 0xb3, 0x03, 0x1b, 0x27, 0x2c, 0xe5, 0x5f, 0x8b, 0xe4, 0xff, 0x0a, 0xb9, 0x0b, 0x6e, 0xb2, 0x20,
0x33, 0xc2, 0x78, 0xcc, 0xa6, 0x43, 0x77, 0xdf, 0x19, 0x0f, 0xf0, 0xa6, 0xb9, 0x3f, 0x9b, 0xa2, 0x8c, 0x47, 0x6c, 0x3e, 0xee, 0xed, 0x3b, 0xd3, 0x11, 0xde, 0x30, 0xf7, 0xa7, 0x73, 0x74, 0x1f,
0x07, 0x70, 0x8b, 0xa4, 0xa9, 0x28, 0xb9, 0x8a, 0x79, 0x99, 0x27, 0xb4, 0x18, 0xf6, 0xf6, 0x9d, 0x6e, 0x91, 0x24, 0x11, 0x05, 0x57, 0x11, 0x2f, 0xb2, 0x98, 0xe6, 0xe3, 0xfe, 0xbe, 0x33, 0xed,
0x71, 0x0f, 0xef, 0x58, 0xeb, 0x77, 0xc6, 0x18, 0xfc, 0xda, 0x85, 0x7e, 0x9d, 0x6f, 0xf4, 0x10, 0xe3, 0x6d, 0x6b, 0xfd, 0xce, 0x18, 0xfd, 0x5f, 0xba, 0x30, 0xac, 0xf3, 0x8d, 0x1e, 0x80, 0x9b,
0xbc, 0x9c, 0x4a, 0x49, 0x32, 0xa3, 0xc8, 0x1d, 0x6f, 0x1d, 0xde, 0x0d, 0xeb, 0x6a, 0x86, 0x4d, 0x51, 0x29, 0x49, 0x6a, 0x14, 0xf5, 0xa6, 0x9b, 0x87, 0x3b, 0x41, 0x5d, 0xcd, 0xa0, 0xa9, 0x66,
0x35, 0xc3, 0x23, 0xbe, 0xc4, 0x2d, 0x0a, 0x21, 0xe8, 0xe5, 0x34, 0xaf, 0xcb, 0x32, 0xc0, 0xe6, 0x70, 0xc4, 0x2b, 0xdc, 0xa2, 0x10, 0x82, 0x7e, 0x46, 0xb3, 0xba, 0x2c, 0x23, 0x6c, 0xce, 0x3a,
0xac, 0xe3, 0x2a, 0x96, 0x53, 0x51, 0xaa, 0x78, 0x46, 0x59, 0x36, 0x53, 0x46, 0x58, 0x0f, 0xef, 0xae, 0x62, 0x19, 0x15, 0x85, 0x8a, 0x16, 0x94, 0xa5, 0x0b, 0x65, 0x84, 0xf5, 0xf1, 0xb6, 0xb5,
0x58, 0xeb, 0xb1, 0x31, 0xa2, 0x09, 0xdc, 0xa1, 0x95, 0xa2, 0x5c, 0x32, 0xc1, 0x63, 0xb1, 0x50, 0x1e, 0x1b, 0x23, 0x9a, 0xc1, 0x1d, 0x5a, 0x2a, 0xca, 0x25, 0x13, 0x3c, 0x12, 0x2b, 0xc5, 0x04,
0x4c, 0x70, 0x39, 0xfc, 0x7b, 0xf3, 0x86, 0xb0, 0xef, 0xb5, 0xf8, 0xef, 0x6b, 0x38, 0x7a, 0x09, 0x97, 0xe3, 0xbf, 0x37, 0xae, 0x09, 0xfb, 0x5e, 0x8b, 0xff, 0xbe, 0x86, 0xa3, 0x17, 0xe0, 0x71,
0x3e, 0x17, 0x3c, 0x4e, 0x0b, 0xa6, 0x58, 0x4a, 0xe6, 0xf1, 0x0a, 0xc2, 0xdb, 0x37, 0x10, 0xee, 0xc1, 0xa3, 0x24, 0x67, 0x8a, 0x25, 0x64, 0x19, 0xad, 0x21, 0xbc, 0x7d, 0x0d, 0xe1, 0x1e, 0x17,
0x71, 0xc1, 0x9f, 0x58, 0xdf, 0x6f, 0xfe, 0xc5, 0x1d, 0xbc, 0x06, 0xaf, 0x69, 0x29, 0xf4, 0x15, 0xfc, 0xb1, 0xf5, 0xfd, 0xe6, 0x5f, 0xdc, 0xfe, 0x2b, 0x70, 0x9b, 0x96, 0x42, 0x5f, 0xc1, 0x96,
0x6c, 0xeb, 0x32, 0xd2, 0xc2, 0xd4, 0xa3, 0x49, 0xce, 0xbd, 0x15, 0x5d, 0x78, 0x62, 0x60, 0xa6, 0x2e, 0x23, 0xcd, 0x4d, 0x3d, 0x9a, 0xe4, 0xdc, 0x5d, 0xd3, 0x85, 0x27, 0x06, 0x66, 0xfa, 0x70,
0x0f, 0xb7, 0x64, 0x7b, 0x96, 0x68, 0x0c, 0xee, 0x19, 0xa5, 0xb6, 0x7d, 0xdf, 0x5f, 0xe1, 0xf8, 0x53, 0xb6, 0x67, 0x89, 0xa6, 0xd0, 0x3b, 0xa3, 0xd4, 0xb6, 0xef, 0xfb, 0x6b, 0x1c, 0x9f, 0x50,
0x94, 0x52, 0xac, 0x21, 0xc1, 0x6f, 0x0e, 0xc0, 0x15, 0x0b, 0x7a, 0x0c, 0xb0, 0x28, 0x93, 0x39, 0x8a, 0x35, 0xc4, 0xff, 0xd5, 0x01, 0xb8, 0x64, 0x41, 0x8f, 0x00, 0x56, 0x45, 0xbc, 0x64, 0x49,
0x4b, 0xe3, 0x57, 0xb4, 0x19, 0x99, 0xd5, 0x7f, 0x33, 0xa8, 0x71, 0xcf, 0xa9, 0x19, 0x99, 0x5c, 0xf4, 0x92, 0x36, 0x23, 0xb3, 0xfe, 0x6f, 0x46, 0x35, 0xee, 0x19, 0x35, 0x23, 0x93, 0x89, 0x39,
0x4c, 0xe9, 0xba, 0x91, 0x79, 0x21, 0xa6, 0xb4, 0x1e, 0x99, 0xdc, 0x9e, 0xd0, 0x08, 0x3c, 0x49, 0xbd, 0x69, 0x64, 0x9e, 0x8b, 0x39, 0xad, 0x47, 0x26, 0xb3, 0x27, 0x34, 0x01, 0x57, 0xd2, 0x1f,
0x7f, 0x28, 0x29, 0x4f, 0xa9, 0x2d, 0x5b, 0x7b, 0x0f, 0xce, 0xbb, 0xe0, 0x35, 0x2e, 0xe8, 0x0b, 0x0a, 0xca, 0x13, 0x6a, 0xcb, 0xd6, 0xde, 0xfd, 0x77, 0x5d, 0x70, 0x1b, 0x17, 0xf4, 0x05, 0x0c,
0xe8, 0x4b, 0xc6, 0xb3, 0x39, 0xb5, 0x9a, 0x82, 0x1b, 0xf8, 0xc3, 0x13, 0x83, 0x3c, 0xee, 0x60, 0x25, 0xe3, 0xe9, 0x92, 0x5a, 0x4d, 0xfe, 0x35, 0xfc, 0xc1, 0x89, 0x41, 0x1e, 0x77, 0xb0, 0xf5,
0xeb, 0x83, 0x3e, 0x83, 0x0d, 0xb3, 0x7f, 0xac, 0xb8, 0x0f, 0x6e, 0x72, 0x7e, 0xa1, 0x81, 0xc7, 0x41, 0x9f, 0xc1, 0xc0, 0xec, 0x1f, 0x2b, 0xee, 0x83, 0xeb, 0x9c, 0x9f, 0x6b, 0xe0, 0x71, 0x07,
0x1d, 0x5c, 0x7b, 0x8c, 0x8e, 0xa0, 0x5f, 0xd3, 0xa1, 0x4f, 0xa0, 0xa7, 0x75, 0x1b, 0x01, 0xb7, 0xd7, 0x1e, 0x93, 0x23, 0x18, 0xd6, 0x74, 0xe8, 0x13, 0xe8, 0x6b, 0xdd, 0x46, 0xc0, 0xad, 0xc3,
0x0e, 0x3f, 0xbc, 0xc6, 0xd1, 0x6c, 0xa4, 0xeb, 0x55, 0xd1, 0x7c, 0xd8, 0x38, 0x8c, 0xde, 0x38, 0x0f, 0xaf, 0x70, 0x34, 0x1b, 0xe9, 0x6a, 0x55, 0x34, 0x1f, 0x36, 0x0e, 0x93, 0xd7, 0x0e, 0x0c,
0xb0, 0x61, 0x58, 0xd1, 0x73, 0xf0, 0x12, 0xa6, 0x48, 0x51, 0x90, 0x26, 0xb7, 0x51, 0x43, 0x53, 0x0c, 0x2b, 0x7a, 0x06, 0x6e, 0xcc, 0x14, 0xc9, 0x73, 0xd2, 0xe4, 0x36, 0x6c, 0x68, 0xea, 0xbd,
0xef, 0xcd, 0xb0, 0x5d, 0x93, 0x0d, 0xd7, 0x13, 0x91, 0x2f, 0x48, 0xaa, 0x26, 0x4c, 0x1d, 0x69, 0x19, 0xb4, 0x6b, 0xb2, 0xe1, 0x7a, 0x2c, 0xb2, 0x15, 0x49, 0xd4, 0x8c, 0xa9, 0x23, 0xed, 0x86,
0x37, 0xdc, 0x12, 0xa0, 0xcf, 0x01, 0xda, 0xac, 0xeb, 0x71, 0x75, 0xd7, 0xa5, 0x7d, 0xd0, 0xa4, 0x5b, 0x02, 0xf4, 0x39, 0x40, 0x9b, 0x75, 0x3d, 0xae, 0xbd, 0x9b, 0xd2, 0x3e, 0x6a, 0xd2, 0x2e,
0x5d, 0x4e, 0x36, 0xc0, 0x95, 0x65, 0x1e, 0xfc, 0xe4, 0x80, 0xfb, 0x94, 0x52, 0x94, 0x42, 0x9f, 0x67, 0x03, 0xe8, 0xc9, 0x22, 0xf3, 0x7f, 0x73, 0xa0, 0xf7, 0x84, 0x52, 0x94, 0xc0, 0x90, 0x64,
0xe4, 0x7a, 0x48, 0x6d, 0xab, 0xb5, 0x4b, 0x52, 0xaf, 0xe7, 0x6b, 0x52, 0x18, 0x9f, 0x3c, 0x7c, 0x7a, 0x48, 0x6d, 0xab, 0xb5, 0x4b, 0x52, 0xaf, 0xe7, 0x2b, 0x52, 0x18, 0x9f, 0x3d, 0x78, 0xf3,
0xfb, 0xe7, 0xfd, 0xce, 0xef, 0x7f, 0xdd, 0x1f, 0x67, 0x4c, 0xcd, 0xca, 0x24, 0x4c, 0x45, 0x1e, 0xe7, 0xbd, 0xce, 0xef, 0x7f, 0xdd, 0x9b, 0xa6, 0x4c, 0x2d, 0x8a, 0x38, 0x48, 0x44, 0x16, 0x36,
0x35, 0xab, 0xdf, 0x7c, 0x0e, 0xe4, 0xf4, 0x55, 0xa4, 0x96, 0x0b, 0x2a, 0x8d, 0x83, 0xc4, 0x96, 0xab, 0xdf, 0x7c, 0x0e, 0xe4, 0xfc, 0x65, 0xa8, 0xaa, 0x15, 0x95, 0xc6, 0x41, 0x62, 0x4b, 0x8d,
0x1a, 0xed, 0xc1, 0x20, 0x23, 0x32, 0x9e, 0xb3, 0x9c, 0x29, 0x53, 0x88, 0x1e, 0xf6, 0x32, 0x22, 0xf6, 0x60, 0x94, 0x12, 0x19, 0x2d, 0x59, 0xc6, 0x94, 0x29, 0x44, 0x1f, 0xbb, 0x29, 0x91, 0xdf,
0xbf, 0xd5, 0xf7, 0xc9, 0x97, 0x6f, 0x2f, 0x7c, 0xe7, 0xdd, 0x85, 0xef, 0x9c, 0x5f, 0xf8, 0xce, 0xea, 0x3b, 0xda, 0x81, 0xc1, 0x8a, 0x54, 0x34, 0xb7, 0x5b, 0xa5, 0xbe, 0xcc, 0xbe, 0x7c, 0x73,
0x9b, 0x4b, 0xbf, 0xf3, 0xee, 0xd2, 0xef, 0xfc, 0x71, 0xe9, 0x77, 0x5e, 0x3e, 0x58, 0x1f, 0x28, 0xee, 0x39, 0x6f, 0xcf, 0x3d, 0xe7, 0xdd, 0xb9, 0xe7, 0xbc, 0xbe, 0xf0, 0x3a, 0x6f, 0x2f, 0xbc,
0x52, 0x55, 0xd2, 0x37, 0xcd, 0xf9, 0xf8, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x34, 0x02, 0x69, 0xce, 0x1f, 0x17, 0x5e, 0xe7, 0xc5, 0xfd, 0x9b, 0xc3, 0x87, 0xaa, 0x8c, 0x87, 0xa6, 0x65, 0x1f,
0x7b, 0xcd, 0x06, 0x00, 0x00, 0xfd, 0x13, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xdf, 0x9b, 0x65, 0xe3, 0x06, 0x00, 0x00,
} }
func (m *Tx) Marshal() (dAtA []byte, err error) { func (m *Tx) Marshal() (dAtA []byte, err error) {
@ -1296,6 +1307,13 @@ func (m *Fee) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i _ = i
var l int var l int
_ = l _ = l
if len(m.Payer) > 0 {
i -= len(m.Payer)
copy(dAtA[i:], m.Payer)
i = encodeVarintTx(dAtA, i, uint64(len(m.Payer)))
i--
dAtA[i] = 0x1a
}
if m.GasLimit != 0 { if m.GasLimit != 0 {
i = encodeVarintTx(dAtA, i, uint64(m.GasLimit)) i = encodeVarintTx(dAtA, i, uint64(m.GasLimit))
i-- i--
@ -1554,6 +1572,10 @@ func (m *Fee) Size() (n int) {
if m.GasLimit != 0 { if m.GasLimit != 0 {
n += 1 + sovTx(uint64(m.GasLimit)) n += 1 + sovTx(uint64(m.GasLimit))
} }
l = len(m.Payer)
if l > 0 {
n += 1 + l + sovTx(uint64(l))
}
return n return n
} }
@ -2918,6 +2940,38 @@ func (m *Fee) Unmarshal(dAtA []byte) error {
break break
} }
} }
case 3:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Payer", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowTx
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthTx
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthTx
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Payer = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipTx(dAtA[iNdEx:]) skippy, err := skipTx(dAtA[iNdEx:])

View File

@ -67,6 +67,13 @@ func (t *Tx) ValidateBasic() error {
) )
} }
if fee.Payer != "" {
_, err := sdk.AccAddressFromBech32(fee.Payer)
if err != nil {
return sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "Invalid fee payer address (%s)", err)
}
}
sigs := t.Signatures sigs := t.Signatures
if len(sigs) == 0 { if len(sigs) == 0 {
@ -84,6 +91,8 @@ func (t *Tx) ValidateBasic() error {
} }
// GetSigners retrieves all the signers of a tx. // GetSigners retrieves all the signers of a tx.
// This includes all unique signers of the messages (in order),
// as well as the FeePayer (if specified and not already included).
func (t *Tx) GetSigners() []sdk.AccAddress { func (t *Tx) GetSigners() []sdk.AccAddress {
var signers []sdk.AccAddress var signers []sdk.AccAddress
seen := map[string]bool{} seen := map[string]bool{}
@ -97,6 +106,17 @@ func (t *Tx) GetSigners() []sdk.AccAddress {
} }
} }
// ensure any specified fee payer is included in the required signers (at the end)
feePayer := t.AuthInfo.Fee.Payer
if feePayer != "" && !seen[feePayer] {
payerAddr, err := sdk.AccAddressFromBech32(feePayer)
if err != nil {
panic(err)
}
signers = append(signers, payerAddr)
seen[feePayer] = true
}
return signers return signers
} }

View File

@ -132,6 +132,15 @@ func (w *wrapper) GetFee() sdk.Coins {
} }
func (w *wrapper) FeePayer() sdk.AccAddress { func (w *wrapper) FeePayer() sdk.AccAddress {
feePayer := w.tx.AuthInfo.Fee.Payer
if feePayer != "" {
payerAddr, err := sdk.AccAddressFromBech32(feePayer)
if err != nil {
panic(err)
}
return payerAddr
}
// use first signer as default if no payer specified
return w.GetSigners()[0] return w.GetSigners()[0]
} }
@ -235,6 +244,17 @@ func (w *wrapper) SetFeeAmount(coins sdk.Coins) {
w.authInfoBz = nil w.authInfoBz = nil
} }
func (w *wrapper) SetFeePayer(feePayer sdk.AccAddress) {
if w.tx.AuthInfo.Fee == nil {
w.tx.AuthInfo.Fee = &tx.Fee{}
}
w.tx.AuthInfo.Fee.Payer = feePayer.String()
// set authInfoBz to nil because the cached authInfoBz no longer matches tx.AuthInfo
w.authInfoBz = nil
}
func (w *wrapper) SetSignatures(signatures ...signing.SignatureV2) error { func (w *wrapper) SetSignatures(signatures ...signing.SignatureV2) error {
n := len(signatures) n := len(signatures)
signerInfos := make([]*tx.SignerInfo, n) signerInfos := make([]*tx.SignerInfo, n)

View File

@ -239,3 +239,53 @@ func TestBuilderValidateBasic(t *testing.T) {
err = txBuilder.ValidateBasic() err = txBuilder.ValidateBasic()
require.Error(t, err) require.Error(t, err)
} }
func TestBuilderFeePayer(t *testing.T) {
// keys and addresses
_, _, addr1 := testdata.KeyTestPubAddr()
_, _, addr2 := testdata.KeyTestPubAddr()
_, _, addr3 := testdata.KeyTestPubAddr()
// msg and signatures
msg1 := testdata.NewTestMsg(addr1, addr2)
feeAmount := testdata.NewTestFeeAmount()
msgs := []sdk.Msg{msg1}
cases := map[string]struct {
txFeePayer sdk.AccAddress
expectedSigners []sdk.AccAddress
expectedPayer sdk.AccAddress
}{
"no fee payer specified": {
expectedSigners: []sdk.AccAddress{addr1, addr2},
expectedPayer: addr1,
},
"secondary signer set as fee payer": {
txFeePayer: addr2,
expectedSigners: []sdk.AccAddress{addr1, addr2},
expectedPayer: addr2,
},
"outside signer set as fee payer": {
txFeePayer: addr3,
expectedSigners: []sdk.AccAddress{addr1, addr2, addr3},
expectedPayer: addr3,
},
}
for name, tc := range cases {
t.Run(name, func(t *testing.T) {
// setup basic tx
txBuilder := newBuilder()
err := txBuilder.SetMsgs(msgs...)
require.NoError(t, err)
txBuilder.SetGasLimit(200000)
txBuilder.SetFeeAmount(feeAmount)
// set fee payer
txBuilder.SetFeePayer(tc.txFeePayer)
// and check it updates fields properly
require.Equal(t, tc.expectedSigners, txBuilder.GetSigners())
require.Equal(t, tc.expectedPayer, txBuilder.FeePayer())
})
}
}