feat(accounts): implement account abstraction execution (#18499)

Co-authored-by: unknown unknown <unknown@unknown>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
This commit is contained in:
testinginprod
2023-12-04 11:41:59 +00:00
committed by GitHub
co-authored by unknown unknown coderabbitai[bot]
parent 0a7567ddc3
commit d3b30e946d
28 changed files with 1799 additions and 722 deletions
+1
View File
@@ -52,6 +52,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
* (x/auth/vesting) [#17810](https://github.com/cosmos/cosmos-sdk/pull/17810) Add the ability to specify a start time for continuous vesting accounts.
* (runtime) [#18475](https://github.com/cosmos/cosmos-sdk/pull/18475) Adds an implementation for core.branch.Service.
* (server) [#18478](https://github.com/cosmos/cosmos-sdk/pull/18478) CMD flag to disable colored logs.
* (baseapp) [#18499](https://github.com/cosmos/cosmos-sdk/pull/18499) Add `MsgRouter` response type from message name function.
### Improvements
@@ -16,17 +16,15 @@ import (
var (
md_MsgAuthenticate protoreflect.MessageDescriptor
fd_MsgAuthenticate_bundler protoreflect.FieldDescriptor
fd_MsgAuthenticate_user_operation protoreflect.FieldDescriptor
fd_MsgAuthenticate_chain_id protoreflect.FieldDescriptor
fd_MsgAuthenticate_account_number protoreflect.FieldDescriptor
)
func init() {
file_cosmos_accounts_interfaces_account_abstraction_v1_interface_proto_init()
md_MsgAuthenticate = File_cosmos_accounts_interfaces_account_abstraction_v1_interface_proto.Messages().ByName("MsgAuthenticate")
fd_MsgAuthenticate_bundler = md_MsgAuthenticate.Fields().ByName("bundler")
fd_MsgAuthenticate_user_operation = md_MsgAuthenticate.Fields().ByName("user_operation")
fd_MsgAuthenticate_chain_id = md_MsgAuthenticate.Fields().ByName("chain_id")
fd_MsgAuthenticate_account_number = md_MsgAuthenticate.Fields().ByName("account_number")
}
var _ protoreflect.Message = (*fastReflection_MsgAuthenticate)(nil)
@@ -94,24 +92,18 @@ func (x *fastReflection_MsgAuthenticate) Interface() protoreflect.ProtoMessage {
// While iterating, mutating operations may only be performed
// on the current field descriptor.
func (x *fastReflection_MsgAuthenticate) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
if x.Bundler != "" {
value := protoreflect.ValueOfString(x.Bundler)
if !f(fd_MsgAuthenticate_bundler, value) {
return
}
}
if x.UserOperation != nil {
value := protoreflect.ValueOfMessage(x.UserOperation.ProtoReflect())
if !f(fd_MsgAuthenticate_user_operation, value) {
return
}
}
if x.ChainId != "" {
value := protoreflect.ValueOfString(x.ChainId)
if !f(fd_MsgAuthenticate_chain_id, value) {
return
}
}
if x.AccountNumber != uint64(0) {
value := protoreflect.ValueOfUint64(x.AccountNumber)
if !f(fd_MsgAuthenticate_account_number, value) {
return
}
}
}
// Has reports whether a field is populated.
@@ -127,12 +119,10 @@ func (x *fastReflection_MsgAuthenticate) Range(f func(protoreflect.FieldDescript
// a repeated field is populated if it is non-empty.
func (x *fastReflection_MsgAuthenticate) Has(fd protoreflect.FieldDescriptor) bool {
switch fd.FullName() {
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.bundler":
return x.Bundler != ""
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.user_operation":
return x.UserOperation != nil
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.chain_id":
return x.ChainId != ""
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.account_number":
return x.AccountNumber != uint64(0)
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate"))
@@ -149,12 +139,10 @@ func (x *fastReflection_MsgAuthenticate) Has(fd protoreflect.FieldDescriptor) bo
// Clear is a mutating operation and unsafe for concurrent use.
func (x *fastReflection_MsgAuthenticate) Clear(fd protoreflect.FieldDescriptor) {
switch fd.FullName() {
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.bundler":
x.Bundler = ""
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.user_operation":
x.UserOperation = nil
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.chain_id":
x.ChainId = ""
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.account_number":
x.AccountNumber = uint64(0)
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate"))
@@ -171,15 +159,12 @@ func (x *fastReflection_MsgAuthenticate) Clear(fd protoreflect.FieldDescriptor)
// of the value; to obtain a mutable reference, use Mutable.
func (x *fastReflection_MsgAuthenticate) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value {
switch descriptor.FullName() {
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.bundler":
value := x.Bundler
return protoreflect.ValueOfString(value)
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.user_operation":
value := x.UserOperation
return protoreflect.ValueOfMessage(value.ProtoReflect())
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.chain_id":
value := x.ChainId
return protoreflect.ValueOfString(value)
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.account_number":
value := x.AccountNumber
return protoreflect.ValueOfUint64(value)
default:
if descriptor.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate"))
@@ -200,12 +185,10 @@ func (x *fastReflection_MsgAuthenticate) Get(descriptor protoreflect.FieldDescri
// Set is a mutating operation and unsafe for concurrent use.
func (x *fastReflection_MsgAuthenticate) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) {
switch fd.FullName() {
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.bundler":
x.Bundler = value.Interface().(string)
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.user_operation":
x.UserOperation = value.Message().Interface().(*v1.UserOperation)
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.chain_id":
x.ChainId = value.Interface().(string)
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.account_number":
x.AccountNumber = value.Uint()
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate"))
@@ -231,10 +214,8 @@ func (x *fastReflection_MsgAuthenticate) Mutable(fd protoreflect.FieldDescriptor
x.UserOperation = new(v1.UserOperation)
}
return protoreflect.ValueOfMessage(x.UserOperation.ProtoReflect())
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.chain_id":
panic(fmt.Errorf("field chain_id of message cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate is not mutable"))
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.account_number":
panic(fmt.Errorf("field account_number of message cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate is not mutable"))
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.bundler":
panic(fmt.Errorf("field bundler of message cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate is not mutable"))
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate"))
@@ -248,13 +229,11 @@ func (x *fastReflection_MsgAuthenticate) Mutable(fd protoreflect.FieldDescriptor
// For lists, maps, and messages, this returns a new, empty, mutable value.
func (x *fastReflection_MsgAuthenticate) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value {
switch fd.FullName() {
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.bundler":
return protoreflect.ValueOfString("")
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.user_operation":
m := new(v1.UserOperation)
return protoreflect.ValueOfMessage(m.ProtoReflect())
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.chain_id":
return protoreflect.ValueOfString("")
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate.account_number":
return protoreflect.ValueOfUint64(uint64(0))
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.accounts.interfaces.account_abstraction.v1.MsgAuthenticate"))
@@ -324,16 +303,13 @@ func (x *fastReflection_MsgAuthenticate) ProtoMethods() *protoiface.Methods {
var n int
var l int
_ = l
if x.UserOperation != nil {
l = options.Size(x.UserOperation)
n += 1 + l + runtime.Sov(uint64(l))
}
l = len(x.ChainId)
l = len(x.Bundler)
if l > 0 {
n += 1 + l + runtime.Sov(uint64(l))
}
if x.AccountNumber != 0 {
n += 1 + runtime.Sov(uint64(x.AccountNumber))
if x.UserOperation != nil {
l = options.Size(x.UserOperation)
n += 1 + l + runtime.Sov(uint64(l))
}
if x.unknownFields != nil {
n += len(x.unknownFields)
@@ -364,18 +340,6 @@ func (x *fastReflection_MsgAuthenticate) ProtoMethods() *protoiface.Methods {
i -= len(x.unknownFields)
copy(dAtA[i:], x.unknownFields)
}
if x.AccountNumber != 0 {
i = runtime.EncodeVarint(dAtA, i, uint64(x.AccountNumber))
i--
dAtA[i] = 0x18
}
if len(x.ChainId) > 0 {
i -= len(x.ChainId)
copy(dAtA[i:], x.ChainId)
i = runtime.EncodeVarint(dAtA, i, uint64(len(x.ChainId)))
i--
dAtA[i] = 0x12
}
if x.UserOperation != nil {
encoded, err := options.Marshal(x.UserOperation)
if err != nil {
@@ -388,6 +352,13 @@ func (x *fastReflection_MsgAuthenticate) ProtoMethods() *protoiface.Methods {
copy(dAtA[i:], encoded)
i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded)))
i--
dAtA[i] = 0x12
}
if len(x.Bundler) > 0 {
i -= len(x.Bundler)
copy(dAtA[i:], x.Bundler)
i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Bundler)))
i--
dAtA[i] = 0xa
}
if input.Buf != nil {
@@ -440,6 +411,38 @@ func (x *fastReflection_MsgAuthenticate) ProtoMethods() *protoiface.Methods {
}
switch fieldNum {
case 1:
if wireType != 2 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Bundler", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow
}
if iNdEx >= l {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
}
if postIndex > l {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
}
x.Bundler = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 2:
if wireType != 2 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field UserOperation", wireType)
}
@@ -475,57 +478,6 @@ func (x *fastReflection_MsgAuthenticate) ProtoMethods() *protoiface.Methods {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err
}
iNdEx = postIndex
case 2:
if wireType != 2 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow
}
if iNdEx >= l {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
}
if postIndex > l {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
}
x.ChainId = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 3:
if wireType != 0 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field AccountNumber", wireType)
}
x.AccountNumber = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow
}
if iNdEx >= l {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
x.AccountNumber |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := runtime.Skip(dAtA[iNdEx:])
@@ -917,65 +869,67 @@ func (x *fastReflection_MsgAuthenticateResponse) ProtoMethods() *protoiface.Meth
}
}
var _ protoreflect.List = (*_MsgPayBundler_1_list)(nil)
var _ protoreflect.List = (*_MsgPayBundler_2_list)(nil)
type _MsgPayBundler_1_list struct {
type _MsgPayBundler_2_list struct {
list *[]*anypb.Any
}
func (x *_MsgPayBundler_1_list) Len() int {
func (x *_MsgPayBundler_2_list) Len() int {
if x.list == nil {
return 0
}
return len(*x.list)
}
func (x *_MsgPayBundler_1_list) Get(i int) protoreflect.Value {
func (x *_MsgPayBundler_2_list) Get(i int) protoreflect.Value {
return protoreflect.ValueOfMessage((*x.list)[i].ProtoReflect())
}
func (x *_MsgPayBundler_1_list) Set(i int, value protoreflect.Value) {
func (x *_MsgPayBundler_2_list) Set(i int, value protoreflect.Value) {
valueUnwrapped := value.Message()
concreteValue := valueUnwrapped.Interface().(*anypb.Any)
(*x.list)[i] = concreteValue
}
func (x *_MsgPayBundler_1_list) Append(value protoreflect.Value) {
func (x *_MsgPayBundler_2_list) Append(value protoreflect.Value) {
valueUnwrapped := value.Message()
concreteValue := valueUnwrapped.Interface().(*anypb.Any)
*x.list = append(*x.list, concreteValue)
}
func (x *_MsgPayBundler_1_list) AppendMutable() protoreflect.Value {
func (x *_MsgPayBundler_2_list) AppendMutable() protoreflect.Value {
v := new(anypb.Any)
*x.list = append(*x.list, v)
return protoreflect.ValueOfMessage(v.ProtoReflect())
}
func (x *_MsgPayBundler_1_list) Truncate(n int) {
func (x *_MsgPayBundler_2_list) Truncate(n int) {
for i := n; i < len(*x.list); i++ {
(*x.list)[i] = nil
}
*x.list = (*x.list)[:n]
}
func (x *_MsgPayBundler_1_list) NewElement() protoreflect.Value {
func (x *_MsgPayBundler_2_list) NewElement() protoreflect.Value {
v := new(anypb.Any)
return protoreflect.ValueOfMessage(v.ProtoReflect())
}
func (x *_MsgPayBundler_1_list) IsValid() bool {
func (x *_MsgPayBundler_2_list) IsValid() bool {
return x.list != nil
}
var (
md_MsgPayBundler protoreflect.MessageDescriptor
fd_MsgPayBundler_bundler protoreflect.FieldDescriptor
fd_MsgPayBundler_bundler_payment_messages protoreflect.FieldDescriptor
)
func init() {
file_cosmos_accounts_interfaces_account_abstraction_v1_interface_proto_init()
md_MsgPayBundler = File_cosmos_accounts_interfaces_account_abstraction_v1_interface_proto.Messages().ByName("MsgPayBundler")
fd_MsgPayBundler_bundler = md_MsgPayBundler.Fields().ByName("bundler")
fd_MsgPayBundler_bundler_payment_messages = md_MsgPayBundler.Fields().ByName("bundler_payment_messages")
}
@@ -1044,8 +998,14 @@ func (x *fastReflection_MsgPayBundler) Interface() protoreflect.ProtoMessage {
// While iterating, mutating operations may only be performed
// on the current field descriptor.
func (x *fastReflection_MsgPayBundler) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
if x.Bundler != "" {
value := protoreflect.ValueOfString(x.Bundler)
if !f(fd_MsgPayBundler_bundler, value) {
return
}
}
if len(x.BundlerPaymentMessages) != 0 {
value := protoreflect.ValueOfList(&_MsgPayBundler_1_list{list: &x.BundlerPaymentMessages})
value := protoreflect.ValueOfList(&_MsgPayBundler_2_list{list: &x.BundlerPaymentMessages})
if !f(fd_MsgPayBundler_bundler_payment_messages, value) {
return
}
@@ -1065,6 +1025,8 @@ func (x *fastReflection_MsgPayBundler) Range(f func(protoreflect.FieldDescriptor
// a repeated field is populated if it is non-empty.
func (x *fastReflection_MsgPayBundler) Has(fd protoreflect.FieldDescriptor) bool {
switch fd.FullName() {
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgPayBundler.bundler":
return x.Bundler != ""
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgPayBundler.bundler_payment_messages":
return len(x.BundlerPaymentMessages) != 0
default:
@@ -1083,6 +1045,8 @@ func (x *fastReflection_MsgPayBundler) Has(fd protoreflect.FieldDescriptor) bool
// Clear is a mutating operation and unsafe for concurrent use.
func (x *fastReflection_MsgPayBundler) Clear(fd protoreflect.FieldDescriptor) {
switch fd.FullName() {
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgPayBundler.bundler":
x.Bundler = ""
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgPayBundler.bundler_payment_messages":
x.BundlerPaymentMessages = nil
default:
@@ -1101,11 +1065,14 @@ func (x *fastReflection_MsgPayBundler) Clear(fd protoreflect.FieldDescriptor) {
// of the value; to obtain a mutable reference, use Mutable.
func (x *fastReflection_MsgPayBundler) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value {
switch descriptor.FullName() {
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgPayBundler.bundler":
value := x.Bundler
return protoreflect.ValueOfString(value)
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgPayBundler.bundler_payment_messages":
if len(x.BundlerPaymentMessages) == 0 {
return protoreflect.ValueOfList(&_MsgPayBundler_1_list{})
return protoreflect.ValueOfList(&_MsgPayBundler_2_list{})
}
listValue := &_MsgPayBundler_1_list{list: &x.BundlerPaymentMessages}
listValue := &_MsgPayBundler_2_list{list: &x.BundlerPaymentMessages}
return protoreflect.ValueOfList(listValue)
default:
if descriptor.IsExtension() {
@@ -1127,9 +1094,11 @@ func (x *fastReflection_MsgPayBundler) Get(descriptor protoreflect.FieldDescript
// Set is a mutating operation and unsafe for concurrent use.
func (x *fastReflection_MsgPayBundler) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) {
switch fd.FullName() {
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgPayBundler.bundler":
x.Bundler = value.Interface().(string)
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgPayBundler.bundler_payment_messages":
lv := value.List()
clv := lv.(*_MsgPayBundler_1_list)
clv := lv.(*_MsgPayBundler_2_list)
x.BundlerPaymentMessages = *clv.list
default:
if fd.IsExtension() {
@@ -1155,8 +1124,10 @@ func (x *fastReflection_MsgPayBundler) Mutable(fd protoreflect.FieldDescriptor)
if x.BundlerPaymentMessages == nil {
x.BundlerPaymentMessages = []*anypb.Any{}
}
value := &_MsgPayBundler_1_list{list: &x.BundlerPaymentMessages}
value := &_MsgPayBundler_2_list{list: &x.BundlerPaymentMessages}
return protoreflect.ValueOfList(value)
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgPayBundler.bundler":
panic(fmt.Errorf("field bundler of message cosmos.accounts.interfaces.account_abstraction.v1.MsgPayBundler is not mutable"))
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.accounts.interfaces.account_abstraction.v1.MsgPayBundler"))
@@ -1170,9 +1141,11 @@ func (x *fastReflection_MsgPayBundler) Mutable(fd protoreflect.FieldDescriptor)
// For lists, maps, and messages, this returns a new, empty, mutable value.
func (x *fastReflection_MsgPayBundler) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value {
switch fd.FullName() {
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgPayBundler.bundler":
return protoreflect.ValueOfString("")
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgPayBundler.bundler_payment_messages":
list := []*anypb.Any{}
return protoreflect.ValueOfList(&_MsgPayBundler_1_list{list: &list})
return protoreflect.ValueOfList(&_MsgPayBundler_2_list{list: &list})
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.accounts.interfaces.account_abstraction.v1.MsgPayBundler"))
@@ -1242,6 +1215,10 @@ func (x *fastReflection_MsgPayBundler) ProtoMethods() *protoiface.Methods {
var n int
var l int
_ = l
l = len(x.Bundler)
if l > 0 {
n += 1 + l + runtime.Sov(uint64(l))
}
if len(x.BundlerPaymentMessages) > 0 {
for _, e := range x.BundlerPaymentMessages {
l = options.Size(e)
@@ -1290,9 +1267,16 @@ func (x *fastReflection_MsgPayBundler) ProtoMethods() *protoiface.Methods {
copy(dAtA[i:], encoded)
i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded)))
i--
dAtA[i] = 0xa
dAtA[i] = 0x12
}
}
if len(x.Bundler) > 0 {
i -= len(x.Bundler)
copy(dAtA[i:], x.Bundler)
i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Bundler)))
i--
dAtA[i] = 0xa
}
if input.Buf != nil {
input.Buf = append(input.Buf, dAtA...)
} else {
@@ -1343,6 +1327,38 @@ func (x *fastReflection_MsgPayBundler) ProtoMethods() *protoiface.Methods {
}
switch fieldNum {
case 1:
if wireType != 2 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Bundler", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow
}
if iNdEx >= l {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
}
if postIndex > l {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
}
x.Bundler = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 2:
if wireType != 2 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field BundlerPaymentMessages", wireType)
}
@@ -1905,65 +1921,67 @@ func (x *fastReflection_MsgPayBundlerResponse) ProtoMethods() *protoiface.Method
}
}
var _ protoreflect.List = (*_MsgExecute_1_list)(nil)
var _ protoreflect.List = (*_MsgExecute_2_list)(nil)
type _MsgExecute_1_list struct {
type _MsgExecute_2_list struct {
list *[]*anypb.Any
}
func (x *_MsgExecute_1_list) Len() int {
func (x *_MsgExecute_2_list) Len() int {
if x.list == nil {
return 0
}
return len(*x.list)
}
func (x *_MsgExecute_1_list) Get(i int) protoreflect.Value {
func (x *_MsgExecute_2_list) Get(i int) protoreflect.Value {
return protoreflect.ValueOfMessage((*x.list)[i].ProtoReflect())
}
func (x *_MsgExecute_1_list) Set(i int, value protoreflect.Value) {
func (x *_MsgExecute_2_list) Set(i int, value protoreflect.Value) {
valueUnwrapped := value.Message()
concreteValue := valueUnwrapped.Interface().(*anypb.Any)
(*x.list)[i] = concreteValue
}
func (x *_MsgExecute_1_list) Append(value protoreflect.Value) {
func (x *_MsgExecute_2_list) Append(value protoreflect.Value) {
valueUnwrapped := value.Message()
concreteValue := valueUnwrapped.Interface().(*anypb.Any)
*x.list = append(*x.list, concreteValue)
}
func (x *_MsgExecute_1_list) AppendMutable() protoreflect.Value {
func (x *_MsgExecute_2_list) AppendMutable() protoreflect.Value {
v := new(anypb.Any)
*x.list = append(*x.list, v)
return protoreflect.ValueOfMessage(v.ProtoReflect())
}
func (x *_MsgExecute_1_list) Truncate(n int) {
func (x *_MsgExecute_2_list) Truncate(n int) {
for i := n; i < len(*x.list); i++ {
(*x.list)[i] = nil
}
*x.list = (*x.list)[:n]
}
func (x *_MsgExecute_1_list) NewElement() protoreflect.Value {
func (x *_MsgExecute_2_list) NewElement() protoreflect.Value {
v := new(anypb.Any)
return protoreflect.ValueOfMessage(v.ProtoReflect())
}
func (x *_MsgExecute_1_list) IsValid() bool {
func (x *_MsgExecute_2_list) IsValid() bool {
return x.list != nil
}
var (
md_MsgExecute protoreflect.MessageDescriptor
fd_MsgExecute_bundler protoreflect.FieldDescriptor
fd_MsgExecute_execution_messages protoreflect.FieldDescriptor
)
func init() {
file_cosmos_accounts_interfaces_account_abstraction_v1_interface_proto_init()
md_MsgExecute = File_cosmos_accounts_interfaces_account_abstraction_v1_interface_proto.Messages().ByName("MsgExecute")
fd_MsgExecute_bundler = md_MsgExecute.Fields().ByName("bundler")
fd_MsgExecute_execution_messages = md_MsgExecute.Fields().ByName("execution_messages")
}
@@ -2032,8 +2050,14 @@ func (x *fastReflection_MsgExecute) Interface() protoreflect.ProtoMessage {
// While iterating, mutating operations may only be performed
// on the current field descriptor.
func (x *fastReflection_MsgExecute) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
if x.Bundler != "" {
value := protoreflect.ValueOfString(x.Bundler)
if !f(fd_MsgExecute_bundler, value) {
return
}
}
if len(x.ExecutionMessages) != 0 {
value := protoreflect.ValueOfList(&_MsgExecute_1_list{list: &x.ExecutionMessages})
value := protoreflect.ValueOfList(&_MsgExecute_2_list{list: &x.ExecutionMessages})
if !f(fd_MsgExecute_execution_messages, value) {
return
}
@@ -2053,6 +2077,8 @@ func (x *fastReflection_MsgExecute) Range(f func(protoreflect.FieldDescriptor, p
// a repeated field is populated if it is non-empty.
func (x *fastReflection_MsgExecute) Has(fd protoreflect.FieldDescriptor) bool {
switch fd.FullName() {
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgExecute.bundler":
return x.Bundler != ""
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgExecute.execution_messages":
return len(x.ExecutionMessages) != 0
default:
@@ -2071,6 +2097,8 @@ func (x *fastReflection_MsgExecute) Has(fd protoreflect.FieldDescriptor) bool {
// Clear is a mutating operation and unsafe for concurrent use.
func (x *fastReflection_MsgExecute) Clear(fd protoreflect.FieldDescriptor) {
switch fd.FullName() {
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgExecute.bundler":
x.Bundler = ""
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgExecute.execution_messages":
x.ExecutionMessages = nil
default:
@@ -2089,11 +2117,14 @@ func (x *fastReflection_MsgExecute) Clear(fd protoreflect.FieldDescriptor) {
// of the value; to obtain a mutable reference, use Mutable.
func (x *fastReflection_MsgExecute) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value {
switch descriptor.FullName() {
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgExecute.bundler":
value := x.Bundler
return protoreflect.ValueOfString(value)
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgExecute.execution_messages":
if len(x.ExecutionMessages) == 0 {
return protoreflect.ValueOfList(&_MsgExecute_1_list{})
return protoreflect.ValueOfList(&_MsgExecute_2_list{})
}
listValue := &_MsgExecute_1_list{list: &x.ExecutionMessages}
listValue := &_MsgExecute_2_list{list: &x.ExecutionMessages}
return protoreflect.ValueOfList(listValue)
default:
if descriptor.IsExtension() {
@@ -2115,9 +2146,11 @@ func (x *fastReflection_MsgExecute) Get(descriptor protoreflect.FieldDescriptor)
// Set is a mutating operation and unsafe for concurrent use.
func (x *fastReflection_MsgExecute) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) {
switch fd.FullName() {
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgExecute.bundler":
x.Bundler = value.Interface().(string)
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgExecute.execution_messages":
lv := value.List()
clv := lv.(*_MsgExecute_1_list)
clv := lv.(*_MsgExecute_2_list)
x.ExecutionMessages = *clv.list
default:
if fd.IsExtension() {
@@ -2143,8 +2176,10 @@ func (x *fastReflection_MsgExecute) Mutable(fd protoreflect.FieldDescriptor) pro
if x.ExecutionMessages == nil {
x.ExecutionMessages = []*anypb.Any{}
}
value := &_MsgExecute_1_list{list: &x.ExecutionMessages}
value := &_MsgExecute_2_list{list: &x.ExecutionMessages}
return protoreflect.ValueOfList(value)
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgExecute.bundler":
panic(fmt.Errorf("field bundler of message cosmos.accounts.interfaces.account_abstraction.v1.MsgExecute is not mutable"))
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.accounts.interfaces.account_abstraction.v1.MsgExecute"))
@@ -2158,9 +2193,11 @@ func (x *fastReflection_MsgExecute) Mutable(fd protoreflect.FieldDescriptor) pro
// For lists, maps, and messages, this returns a new, empty, mutable value.
func (x *fastReflection_MsgExecute) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value {
switch fd.FullName() {
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgExecute.bundler":
return protoreflect.ValueOfString("")
case "cosmos.accounts.interfaces.account_abstraction.v1.MsgExecute.execution_messages":
list := []*anypb.Any{}
return protoreflect.ValueOfList(&_MsgExecute_1_list{list: &list})
return protoreflect.ValueOfList(&_MsgExecute_2_list{list: &list})
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.accounts.interfaces.account_abstraction.v1.MsgExecute"))
@@ -2230,6 +2267,10 @@ func (x *fastReflection_MsgExecute) ProtoMethods() *protoiface.Methods {
var n int
var l int
_ = l
l = len(x.Bundler)
if l > 0 {
n += 1 + l + runtime.Sov(uint64(l))
}
if len(x.ExecutionMessages) > 0 {
for _, e := range x.ExecutionMessages {
l = options.Size(e)
@@ -2278,9 +2319,16 @@ func (x *fastReflection_MsgExecute) ProtoMethods() *protoiface.Methods {
copy(dAtA[i:], encoded)
i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded)))
i--
dAtA[i] = 0xa
dAtA[i] = 0x12
}
}
if len(x.Bundler) > 0 {
i -= len(x.Bundler)
copy(dAtA[i:], x.Bundler)
i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Bundler)))
i--
dAtA[i] = 0xa
}
if input.Buf != nil {
input.Buf = append(input.Buf, dAtA...)
} else {
@@ -2331,6 +2379,38 @@ func (x *fastReflection_MsgExecute) ProtoMethods() *protoiface.Methods {
}
switch fieldNum {
case 1:
if wireType != 2 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Bundler", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow
}
if iNdEx >= l {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
}
if postIndex > l {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
}
x.Bundler = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 2:
if wireType != 2 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ExecutionMessages", wireType)
}
@@ -3749,13 +3829,13 @@ type MsgAuthenticate struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// bundler defines the address of the bundler that sent the operation.
// NOTE: in case the operation was sent directly by the user, this field will reflect
// the user address.
Bundler string `protobuf:"bytes,1,opt,name=bundler,proto3" json:"bundler,omitempty"`
// user_operation is the operation that the user is trying to perform.
// it also contains authentication information.
UserOperation *v1.UserOperation `protobuf:"bytes,1,opt,name=user_operation,json=userOperation,proto3" json:"user_operation,omitempty"`
// chain_id defines the network identifier.
ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"`
// account_number is the account number of the user_operation.
AccountNumber uint64 `protobuf:"varint,3,opt,name=account_number,json=accountNumber,proto3" json:"account_number,omitempty"`
UserOperation *v1.UserOperation `protobuf:"bytes,2,opt,name=user_operation,json=userOperation,proto3" json:"user_operation,omitempty"`
}
func (x *MsgAuthenticate) Reset() {
@@ -3778,6 +3858,13 @@ func (*MsgAuthenticate) Descriptor() ([]byte, []int) {
return file_cosmos_accounts_interfaces_account_abstraction_v1_interface_proto_rawDescGZIP(), []int{0}
}
func (x *MsgAuthenticate) GetBundler() string {
if x != nil {
return x.Bundler
}
return ""
}
func (x *MsgAuthenticate) GetUserOperation() *v1.UserOperation {
if x != nil {
return x.UserOperation
@@ -3785,20 +3872,6 @@ func (x *MsgAuthenticate) GetUserOperation() *v1.UserOperation {
return nil
}
func (x *MsgAuthenticate) GetChainId() string {
if x != nil {
return x.ChainId
}
return ""
}
func (x *MsgAuthenticate) GetAccountNumber() uint64 {
if x != nil {
return x.AccountNumber
}
return 0
}
// MsgAuthenticateResponse is the response to MsgAuthenticate.
// The authentication either fails or succeeds, this is why
// there are no auxiliary fields to the response.
@@ -3837,9 +3910,13 @@ type MsgPayBundler struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// bundler is the address of the bundler.
// NOTE: in case the operation was sent directly by the user, this field will
// reflect the user address.
Bundler string `protobuf:"bytes,1,opt,name=bundler,proto3" json:"bundler,omitempty"`
// bundler_payment_messages are the messages that the operation sender will execute.
// The account can modify the messages as it sees fit.
BundlerPaymentMessages []*anypb.Any `protobuf:"bytes,1,rep,name=bundler_payment_messages,json=bundlerPaymentMessages,proto3" json:"bundler_payment_messages,omitempty"`
BundlerPaymentMessages []*anypb.Any `protobuf:"bytes,2,rep,name=bundler_payment_messages,json=bundlerPaymentMessages,proto3" json:"bundler_payment_messages,omitempty"`
}
func (x *MsgPayBundler) Reset() {
@@ -3862,6 +3939,13 @@ func (*MsgPayBundler) Descriptor() ([]byte, []int) {
return file_cosmos_accounts_interfaces_account_abstraction_v1_interface_proto_rawDescGZIP(), []int{2}
}
func (x *MsgPayBundler) GetBundler() string {
if x != nil {
return x.Bundler
}
return ""
}
func (x *MsgPayBundler) GetBundlerPaymentMessages() []*anypb.Any {
if x != nil {
return x.BundlerPaymentMessages
@@ -3916,9 +4000,13 @@ type MsgExecute struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// bundler is the address of the bundler.
// NOTE: in case the operation was sent directly by the user, this field will
// reflect the user address.
Bundler string `protobuf:"bytes,1,opt,name=bundler,proto3" json:"bundler,omitempty"`
// execution_messages are the messages that the operation sender will execute.
// The account can modify the messages as it sees fit.
ExecutionMessages []*anypb.Any `protobuf:"bytes,1,rep,name=execution_messages,json=executionMessages,proto3" json:"execution_messages,omitempty"`
ExecutionMessages []*anypb.Any `protobuf:"bytes,2,rep,name=execution_messages,json=executionMessages,proto3" json:"execution_messages,omitempty"`
}
func (x *MsgExecute) Reset() {
@@ -3941,6 +4029,13 @@ func (*MsgExecute) Descriptor() ([]byte, []int) {
return file_cosmos_accounts_interfaces_account_abstraction_v1_interface_proto_rawDescGZIP(), []int{4}
}
func (x *MsgExecute) GetBundler() string {
if x != nil {
return x.Bundler
}
return ""
}
func (x *MsgExecute) GetExecutionMessages() []*anypb.Any {
if x != nil {
return x.ExecutionMessages
@@ -4065,76 +4160,77 @@ var file_cosmos_accounts_interfaces_account_abstraction_v1_interface_proto_rawDe
0x6f, 0x1a, 0x2c, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e,
0x74, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x62,
0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,
0x9d, 0x01, 0x0a, 0x0f, 0x4d, 0x73, 0x67, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63,
0x61, 0x74, 0x65, 0x12, 0x48, 0x0a, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6f, 0x70, 0x65, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6f,
0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31,
0x2e, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d,
0x75, 0x73, 0x65, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a,
0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x63, 0x63, 0x6f,
0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04,
0x52, 0x0d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22,
0x19, 0x0a, 0x17, 0x4d, 0x73, 0x67, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61,
0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5f, 0x0a, 0x0d, 0x4d, 0x73,
0x67, 0x50, 0x61, 0x79, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x18, 0x62,
0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d,
0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
0x41, 0x6e, 0x79, 0x52, 0x16, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x79, 0x6d,
0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x78, 0x0a, 0x15, 0x4d,
0x73, 0x67, 0x50, 0x61, 0x79, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70,
0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x21, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x5f,
0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73,
0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x1e, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61,
0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73,
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x0a, 0x0a, 0x4d, 0x73, 0x67, 0x45, 0x78, 0x65, 0x63,
0x75, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x12, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e,
0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e,
0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x6a, 0x0a, 0x12, 0x4d, 0x73, 0x67, 0x45,
0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54,
0x0a, 0x1b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73,
0x61, 0x67, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20,
0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x19, 0x65, 0x78, 0x65, 0x63, 0x75,
0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70,
0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x75, 0x74,
0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f,
0x64, 0x73, 0x22, 0x5b, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x75, 0x74, 0x68, 0x65,
0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73,
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68,
0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f,
0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e,
0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x42,
0x86, 0x03, 0x0a, 0x35, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x61,
0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
0x65, 0x73, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x62, 0x73, 0x74, 0x72,
0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x49, 0x6e, 0x74, 0x65, 0x72,
0x66, 0x61, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x58, 0x63, 0x6f, 0x73,
0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f,
0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e,
0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
0x5f, 0x61, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x3b,
0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74,
0x69, 0x6f, 0x6e, 0x76, 0x31, 0xa2, 0x02, 0x04, 0x43, 0x41, 0x49, 0x41, 0xaa, 0x02, 0x30, 0x43,
0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x49,
0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
0x74, 0x41, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x31, 0xca,
0x02, 0x30, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
0x73, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x5c, 0x41, 0x63, 0x63,
0x6f, 0x75, 0x6e, 0x74, 0x41, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c,
0x56, 0x31, 0xe2, 0x02, 0x3c, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x41, 0x63, 0x63, 0x6f,
0x75, 0x6e, 0x74, 0x73, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x5c,
0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69,
0x6f, 0x6e, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
0x61, 0xea, 0x02, 0x34, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x41, 0x63, 0x63, 0x6f,
0x75, 0x6e, 0x74, 0x73, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73,
0x3a, 0x3a, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63,
0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x75, 0x0a, 0x0f, 0x4d, 0x73, 0x67, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61,
0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x18, 0x01, 0x20,
0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x12, 0x48, 0x0a, 0x0e,
0x75, 0x73, 0x65, 0x72, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x63,
0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x70,
0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x4f, 0x70, 0x65,
0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x19, 0x0a, 0x17, 0x4d, 0x73, 0x67, 0x41, 0x75, 0x74,
0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
0x65, 0x22, 0x79, 0x0a, 0x0d, 0x4d, 0x73, 0x67, 0x50, 0x61, 0x79, 0x42, 0x75, 0x6e, 0x64, 0x6c,
0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x18, 0x01, 0x20,
0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x18,
0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f,
0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14,
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
0x2e, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x79,
0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x78, 0x0a, 0x15,
0x4d, 0x73, 0x67, 0x50, 0x61, 0x79, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73,
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x21, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72,
0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x1e, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50,
0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65,
0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6b, 0x0a, 0x0a, 0x4d, 0x73, 0x67, 0x45, 0x78, 0x65,
0x63, 0x75, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x18,
0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x12, 0x43,
0x0a, 0x12, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73,
0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f,
0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79,
0x52, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61,
0x67, 0x65, 0x73, 0x22, 0x6a, 0x0a, 0x12, 0x4d, 0x73, 0x67, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74,
0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x1b, 0x65, 0x78, 0x65,
0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x5f,
0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14,
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
0x2e, 0x41, 0x6e, 0x79, 0x52, 0x19, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d,
0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
0x1c, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69,
0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x22, 0x5b, 0x0a,
0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x01, 0x20,
0x03, 0x28, 0x09, 0x52, 0x15, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x42, 0x86, 0x03, 0x0a, 0x35, 0x63,
0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e,
0x74, 0x73, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x61, 0x63,
0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x50,
0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x58, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64,
0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f,
0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
0x63, 0x65, 0x73, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x62, 0x73, 0x74,
0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x63, 0x63, 0x6f, 0x75,
0x6e, 0x74, 0x5f, 0x61, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x76, 0x31,
0xa2, 0x02, 0x04, 0x43, 0x41, 0x49, 0x41, 0xaa, 0x02, 0x30, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73,
0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66,
0x61, 0x63, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x62, 0x73, 0x74,
0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x30, 0x43, 0x6f, 0x73,
0x6d, 0x6f, 0x73, 0x5c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x5c, 0x49, 0x6e, 0x74,
0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x5c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41,
0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x3c,
0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x5c,
0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x5c, 0x41, 0x63, 0x63, 0x6f, 0x75,
0x6e, 0x74, 0x41, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x56, 0x31,
0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x34, 0x43,
0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x3a,
0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x3a, 0x3a, 0x41, 0x63, 0x63,
0x6f, 0x75, 0x6e, 0x74, 0x41, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a,
0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -13,105 +13,105 @@ import (
sync "sync"
)
var _ protoreflect.List = (*_UserOperation_6_list)(nil)
var _ protoreflect.List = (*_UserOperation_5_list)(nil)
type _UserOperation_6_list struct {
type _UserOperation_5_list struct {
list *[]*anypb.Any
}
func (x *_UserOperation_6_list) Len() int {
func (x *_UserOperation_5_list) Len() int {
if x.list == nil {
return 0
}
return len(*x.list)
}
func (x *_UserOperation_6_list) Get(i int) protoreflect.Value {
func (x *_UserOperation_5_list) Get(i int) protoreflect.Value {
return protoreflect.ValueOfMessage((*x.list)[i].ProtoReflect())
}
func (x *_UserOperation_6_list) Set(i int, value protoreflect.Value) {
func (x *_UserOperation_5_list) Set(i int, value protoreflect.Value) {
valueUnwrapped := value.Message()
concreteValue := valueUnwrapped.Interface().(*anypb.Any)
(*x.list)[i] = concreteValue
}
func (x *_UserOperation_6_list) Append(value protoreflect.Value) {
func (x *_UserOperation_5_list) Append(value protoreflect.Value) {
valueUnwrapped := value.Message()
concreteValue := valueUnwrapped.Interface().(*anypb.Any)
*x.list = append(*x.list, concreteValue)
}
func (x *_UserOperation_6_list) AppendMutable() protoreflect.Value {
func (x *_UserOperation_5_list) AppendMutable() protoreflect.Value {
v := new(anypb.Any)
*x.list = append(*x.list, v)
return protoreflect.ValueOfMessage(v.ProtoReflect())
}
func (x *_UserOperation_6_list) Truncate(n int) {
func (x *_UserOperation_5_list) Truncate(n int) {
for i := n; i < len(*x.list); i++ {
(*x.list)[i] = nil
}
*x.list = (*x.list)[:n]
}
func (x *_UserOperation_6_list) NewElement() protoreflect.Value {
func (x *_UserOperation_5_list) NewElement() protoreflect.Value {
v := new(anypb.Any)
return protoreflect.ValueOfMessage(v.ProtoReflect())
}
func (x *_UserOperation_6_list) IsValid() bool {
func (x *_UserOperation_5_list) IsValid() bool {
return x.list != nil
}
var _ protoreflect.List = (*_UserOperation_8_list)(nil)
var _ protoreflect.List = (*_UserOperation_7_list)(nil)
type _UserOperation_8_list struct {
type _UserOperation_7_list struct {
list *[]*anypb.Any
}
func (x *_UserOperation_8_list) Len() int {
func (x *_UserOperation_7_list) Len() int {
if x.list == nil {
return 0
}
return len(*x.list)
}
func (x *_UserOperation_8_list) Get(i int) protoreflect.Value {
func (x *_UserOperation_7_list) Get(i int) protoreflect.Value {
return protoreflect.ValueOfMessage((*x.list)[i].ProtoReflect())
}
func (x *_UserOperation_8_list) Set(i int, value protoreflect.Value) {
func (x *_UserOperation_7_list) Set(i int, value protoreflect.Value) {
valueUnwrapped := value.Message()
concreteValue := valueUnwrapped.Interface().(*anypb.Any)
(*x.list)[i] = concreteValue
}
func (x *_UserOperation_8_list) Append(value protoreflect.Value) {
func (x *_UserOperation_7_list) Append(value protoreflect.Value) {
valueUnwrapped := value.Message()
concreteValue := valueUnwrapped.Interface().(*anypb.Any)
*x.list = append(*x.list, concreteValue)
}
func (x *_UserOperation_8_list) AppendMutable() protoreflect.Value {
func (x *_UserOperation_7_list) AppendMutable() protoreflect.Value {
v := new(anypb.Any)
*x.list = append(*x.list, v)
return protoreflect.ValueOfMessage(v.ProtoReflect())
}
func (x *_UserOperation_8_list) Truncate(n int) {
func (x *_UserOperation_7_list) Truncate(n int) {
for i := n; i < len(*x.list); i++ {
(*x.list)[i] = nil
}
*x.list = (*x.list)[:n]
}
func (x *_UserOperation_8_list) NewElement() protoreflect.Value {
func (x *_UserOperation_7_list) NewElement() protoreflect.Value {
v := new(anypb.Any)
return protoreflect.ValueOfMessage(v.ProtoReflect())
}
func (x *_UserOperation_8_list) IsValid() bool {
func (x *_UserOperation_7_list) IsValid() bool {
return x.list != nil
}
@@ -120,7 +120,6 @@ var (
fd_UserOperation_sender protoreflect.FieldDescriptor
fd_UserOperation_authentication_method protoreflect.FieldDescriptor
fd_UserOperation_authentication_data protoreflect.FieldDescriptor
fd_UserOperation_sequence protoreflect.FieldDescriptor
fd_UserOperation_authentication_gas_limit protoreflect.FieldDescriptor
fd_UserOperation_bundler_payment_messages protoreflect.FieldDescriptor
fd_UserOperation_bundler_payment_gas_limit protoreflect.FieldDescriptor
@@ -134,7 +133,6 @@ func init() {
fd_UserOperation_sender = md_UserOperation.Fields().ByName("sender")
fd_UserOperation_authentication_method = md_UserOperation.Fields().ByName("authentication_method")
fd_UserOperation_authentication_data = md_UserOperation.Fields().ByName("authentication_data")
fd_UserOperation_sequence = md_UserOperation.Fields().ByName("sequence")
fd_UserOperation_authentication_gas_limit = md_UserOperation.Fields().ByName("authentication_gas_limit")
fd_UserOperation_bundler_payment_messages = md_UserOperation.Fields().ByName("bundler_payment_messages")
fd_UserOperation_bundler_payment_gas_limit = md_UserOperation.Fields().ByName("bundler_payment_gas_limit")
@@ -225,12 +223,6 @@ func (x *fastReflection_UserOperation) Range(f func(protoreflect.FieldDescriptor
return
}
}
if x.Sequence != uint64(0) {
value := protoreflect.ValueOfUint64(x.Sequence)
if !f(fd_UserOperation_sequence, value) {
return
}
}
if x.AuthenticationGasLimit != uint64(0) {
value := protoreflect.ValueOfUint64(x.AuthenticationGasLimit)
if !f(fd_UserOperation_authentication_gas_limit, value) {
@@ -238,7 +230,7 @@ func (x *fastReflection_UserOperation) Range(f func(protoreflect.FieldDescriptor
}
}
if len(x.BundlerPaymentMessages) != 0 {
value := protoreflect.ValueOfList(&_UserOperation_6_list{list: &x.BundlerPaymentMessages})
value := protoreflect.ValueOfList(&_UserOperation_5_list{list: &x.BundlerPaymentMessages})
if !f(fd_UserOperation_bundler_payment_messages, value) {
return
}
@@ -250,7 +242,7 @@ func (x *fastReflection_UserOperation) Range(f func(protoreflect.FieldDescriptor
}
}
if len(x.ExecutionMessages) != 0 {
value := protoreflect.ValueOfList(&_UserOperation_8_list{list: &x.ExecutionMessages})
value := protoreflect.ValueOfList(&_UserOperation_7_list{list: &x.ExecutionMessages})
if !f(fd_UserOperation_execution_messages, value) {
return
}
@@ -282,8 +274,6 @@ func (x *fastReflection_UserOperation) Has(fd protoreflect.FieldDescriptor) bool
return x.AuthenticationMethod != ""
case "cosmos.accounts.v1.UserOperation.authentication_data":
return len(x.AuthenticationData) != 0
case "cosmos.accounts.v1.UserOperation.sequence":
return x.Sequence != uint64(0)
case "cosmos.accounts.v1.UserOperation.authentication_gas_limit":
return x.AuthenticationGasLimit != uint64(0)
case "cosmos.accounts.v1.UserOperation.bundler_payment_messages":
@@ -316,8 +306,6 @@ func (x *fastReflection_UserOperation) Clear(fd protoreflect.FieldDescriptor) {
x.AuthenticationMethod = ""
case "cosmos.accounts.v1.UserOperation.authentication_data":
x.AuthenticationData = nil
case "cosmos.accounts.v1.UserOperation.sequence":
x.Sequence = uint64(0)
case "cosmos.accounts.v1.UserOperation.authentication_gas_limit":
x.AuthenticationGasLimit = uint64(0)
case "cosmos.accounts.v1.UserOperation.bundler_payment_messages":
@@ -353,26 +341,23 @@ func (x *fastReflection_UserOperation) Get(descriptor protoreflect.FieldDescript
case "cosmos.accounts.v1.UserOperation.authentication_data":
value := x.AuthenticationData
return protoreflect.ValueOfBytes(value)
case "cosmos.accounts.v1.UserOperation.sequence":
value := x.Sequence
return protoreflect.ValueOfUint64(value)
case "cosmos.accounts.v1.UserOperation.authentication_gas_limit":
value := x.AuthenticationGasLimit
return protoreflect.ValueOfUint64(value)
case "cosmos.accounts.v1.UserOperation.bundler_payment_messages":
if len(x.BundlerPaymentMessages) == 0 {
return protoreflect.ValueOfList(&_UserOperation_6_list{})
return protoreflect.ValueOfList(&_UserOperation_5_list{})
}
listValue := &_UserOperation_6_list{list: &x.BundlerPaymentMessages}
listValue := &_UserOperation_5_list{list: &x.BundlerPaymentMessages}
return protoreflect.ValueOfList(listValue)
case "cosmos.accounts.v1.UserOperation.bundler_payment_gas_limit":
value := x.BundlerPaymentGasLimit
return protoreflect.ValueOfUint64(value)
case "cosmos.accounts.v1.UserOperation.execution_messages":
if len(x.ExecutionMessages) == 0 {
return protoreflect.ValueOfList(&_UserOperation_8_list{})
return protoreflect.ValueOfList(&_UserOperation_7_list{})
}
listValue := &_UserOperation_8_list{list: &x.ExecutionMessages}
listValue := &_UserOperation_7_list{list: &x.ExecutionMessages}
return protoreflect.ValueOfList(listValue)
case "cosmos.accounts.v1.UserOperation.execution_gas_limit":
value := x.ExecutionGasLimit
@@ -403,19 +388,17 @@ func (x *fastReflection_UserOperation) Set(fd protoreflect.FieldDescriptor, valu
x.AuthenticationMethod = value.Interface().(string)
case "cosmos.accounts.v1.UserOperation.authentication_data":
x.AuthenticationData = value.Bytes()
case "cosmos.accounts.v1.UserOperation.sequence":
x.Sequence = value.Uint()
case "cosmos.accounts.v1.UserOperation.authentication_gas_limit":
x.AuthenticationGasLimit = value.Uint()
case "cosmos.accounts.v1.UserOperation.bundler_payment_messages":
lv := value.List()
clv := lv.(*_UserOperation_6_list)
clv := lv.(*_UserOperation_5_list)
x.BundlerPaymentMessages = *clv.list
case "cosmos.accounts.v1.UserOperation.bundler_payment_gas_limit":
x.BundlerPaymentGasLimit = value.Uint()
case "cosmos.accounts.v1.UserOperation.execution_messages":
lv := value.List()
clv := lv.(*_UserOperation_8_list)
clv := lv.(*_UserOperation_7_list)
x.ExecutionMessages = *clv.list
case "cosmos.accounts.v1.UserOperation.execution_gas_limit":
x.ExecutionGasLimit = value.Uint()
@@ -443,13 +426,13 @@ func (x *fastReflection_UserOperation) Mutable(fd protoreflect.FieldDescriptor)
if x.BundlerPaymentMessages == nil {
x.BundlerPaymentMessages = []*anypb.Any{}
}
value := &_UserOperation_6_list{list: &x.BundlerPaymentMessages}
value := &_UserOperation_5_list{list: &x.BundlerPaymentMessages}
return protoreflect.ValueOfList(value)
case "cosmos.accounts.v1.UserOperation.execution_messages":
if x.ExecutionMessages == nil {
x.ExecutionMessages = []*anypb.Any{}
}
value := &_UserOperation_8_list{list: &x.ExecutionMessages}
value := &_UserOperation_7_list{list: &x.ExecutionMessages}
return protoreflect.ValueOfList(value)
case "cosmos.accounts.v1.UserOperation.sender":
panic(fmt.Errorf("field sender of message cosmos.accounts.v1.UserOperation is not mutable"))
@@ -457,8 +440,6 @@ func (x *fastReflection_UserOperation) Mutable(fd protoreflect.FieldDescriptor)
panic(fmt.Errorf("field authentication_method of message cosmos.accounts.v1.UserOperation is not mutable"))
case "cosmos.accounts.v1.UserOperation.authentication_data":
panic(fmt.Errorf("field authentication_data of message cosmos.accounts.v1.UserOperation is not mutable"))
case "cosmos.accounts.v1.UserOperation.sequence":
panic(fmt.Errorf("field sequence of message cosmos.accounts.v1.UserOperation is not mutable"))
case "cosmos.accounts.v1.UserOperation.authentication_gas_limit":
panic(fmt.Errorf("field authentication_gas_limit of message cosmos.accounts.v1.UserOperation is not mutable"))
case "cosmos.accounts.v1.UserOperation.bundler_payment_gas_limit":
@@ -484,18 +465,16 @@ func (x *fastReflection_UserOperation) NewField(fd protoreflect.FieldDescriptor)
return protoreflect.ValueOfString("")
case "cosmos.accounts.v1.UserOperation.authentication_data":
return protoreflect.ValueOfBytes(nil)
case "cosmos.accounts.v1.UserOperation.sequence":
return protoreflect.ValueOfUint64(uint64(0))
case "cosmos.accounts.v1.UserOperation.authentication_gas_limit":
return protoreflect.ValueOfUint64(uint64(0))
case "cosmos.accounts.v1.UserOperation.bundler_payment_messages":
list := []*anypb.Any{}
return protoreflect.ValueOfList(&_UserOperation_6_list{list: &list})
return protoreflect.ValueOfList(&_UserOperation_5_list{list: &list})
case "cosmos.accounts.v1.UserOperation.bundler_payment_gas_limit":
return protoreflect.ValueOfUint64(uint64(0))
case "cosmos.accounts.v1.UserOperation.execution_messages":
list := []*anypb.Any{}
return protoreflect.ValueOfList(&_UserOperation_8_list{list: &list})
return protoreflect.ValueOfList(&_UserOperation_7_list{list: &list})
case "cosmos.accounts.v1.UserOperation.execution_gas_limit":
return protoreflect.ValueOfUint64(uint64(0))
default:
@@ -579,9 +558,6 @@ func (x *fastReflection_UserOperation) ProtoMethods() *protoiface.Methods {
if l > 0 {
n += 1 + l + runtime.Sov(uint64(l))
}
if x.Sequence != 0 {
n += 1 + runtime.Sov(uint64(x.Sequence))
}
if x.AuthenticationGasLimit != 0 {
n += 1 + runtime.Sov(uint64(x.AuthenticationGasLimit))
}
@@ -635,7 +611,7 @@ func (x *fastReflection_UserOperation) ProtoMethods() *protoiface.Methods {
if x.ExecutionGasLimit != 0 {
i = runtime.EncodeVarint(dAtA, i, uint64(x.ExecutionGasLimit))
i--
dAtA[i] = 0x48
dAtA[i] = 0x40
}
if len(x.ExecutionMessages) > 0 {
for iNdEx := len(x.ExecutionMessages) - 1; iNdEx >= 0; iNdEx-- {
@@ -650,13 +626,13 @@ func (x *fastReflection_UserOperation) ProtoMethods() *protoiface.Methods {
copy(dAtA[i:], encoded)
i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded)))
i--
dAtA[i] = 0x42
dAtA[i] = 0x3a
}
}
if x.BundlerPaymentGasLimit != 0 {
i = runtime.EncodeVarint(dAtA, i, uint64(x.BundlerPaymentGasLimit))
i--
dAtA[i] = 0x38
dAtA[i] = 0x30
}
if len(x.BundlerPaymentMessages) > 0 {
for iNdEx := len(x.BundlerPaymentMessages) - 1; iNdEx >= 0; iNdEx-- {
@@ -671,17 +647,12 @@ func (x *fastReflection_UserOperation) ProtoMethods() *protoiface.Methods {
copy(dAtA[i:], encoded)
i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded)))
i--
dAtA[i] = 0x32
dAtA[i] = 0x2a
}
}
if x.AuthenticationGasLimit != 0 {
i = runtime.EncodeVarint(dAtA, i, uint64(x.AuthenticationGasLimit))
i--
dAtA[i] = 0x28
}
if x.Sequence != 0 {
i = runtime.EncodeVarint(dAtA, i, uint64(x.Sequence))
i--
dAtA[i] = 0x20
}
if len(x.AuthenticationData) > 0 {
@@ -853,25 +824,6 @@ func (x *fastReflection_UserOperation) ProtoMethods() *protoiface.Methods {
}
iNdEx = postIndex
case 4:
if wireType != 0 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Sequence", wireType)
}
x.Sequence = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow
}
if iNdEx >= l {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
x.Sequence |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
case 5:
if wireType != 0 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field AuthenticationGasLimit", wireType)
}
@@ -890,7 +842,7 @@ func (x *fastReflection_UserOperation) ProtoMethods() *protoiface.Methods {
break
}
}
case 6:
case 5:
if wireType != 2 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field BundlerPaymentMessages", wireType)
}
@@ -924,7 +876,7 @@ func (x *fastReflection_UserOperation) ProtoMethods() *protoiface.Methods {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err
}
iNdEx = postIndex
case 7:
case 6:
if wireType != 0 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field BundlerPaymentGasLimit", wireType)
}
@@ -943,7 +895,7 @@ func (x *fastReflection_UserOperation) ProtoMethods() *protoiface.Methods {
break
}
}
case 8:
case 7:
if wireType != 2 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ExecutionMessages", wireType)
}
@@ -977,7 +929,7 @@ func (x *fastReflection_UserOperation) ProtoMethods() *protoiface.Methods {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err
}
iNdEx = postIndex
case 9:
case 8:
if wireType != 0 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ExecutionGasLimit", wireType)
}
@@ -1140,6 +1092,7 @@ var (
fd_UserOperationResponse_bundler_payment_responses protoreflect.FieldDescriptor
fd_UserOperationResponse_execution_gas_used protoreflect.FieldDescriptor
fd_UserOperationResponse_execution_responses protoreflect.FieldDescriptor
fd_UserOperationResponse_error protoreflect.FieldDescriptor
)
func init() {
@@ -1150,6 +1103,7 @@ func init() {
fd_UserOperationResponse_bundler_payment_responses = md_UserOperationResponse.Fields().ByName("bundler_payment_responses")
fd_UserOperationResponse_execution_gas_used = md_UserOperationResponse.Fields().ByName("execution_gas_used")
fd_UserOperationResponse_execution_responses = md_UserOperationResponse.Fields().ByName("execution_responses")
fd_UserOperationResponse_error = md_UserOperationResponse.Fields().ByName("error")
}
var _ protoreflect.Message = (*fastReflection_UserOperationResponse)(nil)
@@ -1247,6 +1201,12 @@ func (x *fastReflection_UserOperationResponse) Range(f func(protoreflect.FieldDe
return
}
}
if x.Error != "" {
value := protoreflect.ValueOfString(x.Error)
if !f(fd_UserOperationResponse_error, value) {
return
}
}
}
// Has reports whether a field is populated.
@@ -1272,6 +1232,8 @@ func (x *fastReflection_UserOperationResponse) Has(fd protoreflect.FieldDescript
return x.ExecutionGasUsed != uint64(0)
case "cosmos.accounts.v1.UserOperationResponse.execution_responses":
return len(x.ExecutionResponses) != 0
case "cosmos.accounts.v1.UserOperationResponse.error":
return x.Error != ""
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.accounts.v1.UserOperationResponse"))
@@ -1298,6 +1260,8 @@ func (x *fastReflection_UserOperationResponse) Clear(fd protoreflect.FieldDescri
x.ExecutionGasUsed = uint64(0)
case "cosmos.accounts.v1.UserOperationResponse.execution_responses":
x.ExecutionResponses = nil
case "cosmos.accounts.v1.UserOperationResponse.error":
x.Error = ""
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.accounts.v1.UserOperationResponse"))
@@ -1335,6 +1299,9 @@ func (x *fastReflection_UserOperationResponse) Get(descriptor protoreflect.Field
}
listValue := &_UserOperationResponse_5_list{list: &x.ExecutionResponses}
return protoreflect.ValueOfList(listValue)
case "cosmos.accounts.v1.UserOperationResponse.error":
value := x.Error
return protoreflect.ValueOfString(value)
default:
if descriptor.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.accounts.v1.UserOperationResponse"))
@@ -1369,6 +1336,8 @@ func (x *fastReflection_UserOperationResponse) Set(fd protoreflect.FieldDescript
lv := value.List()
clv := lv.(*_UserOperationResponse_5_list)
x.ExecutionResponses = *clv.list
case "cosmos.accounts.v1.UserOperationResponse.error":
x.Error = value.Interface().(string)
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.accounts.v1.UserOperationResponse"))
@@ -1407,6 +1376,8 @@ func (x *fastReflection_UserOperationResponse) Mutable(fd protoreflect.FieldDesc
panic(fmt.Errorf("field bundler_payment_gas_used of message cosmos.accounts.v1.UserOperationResponse is not mutable"))
case "cosmos.accounts.v1.UserOperationResponse.execution_gas_used":
panic(fmt.Errorf("field execution_gas_used of message cosmos.accounts.v1.UserOperationResponse is not mutable"))
case "cosmos.accounts.v1.UserOperationResponse.error":
panic(fmt.Errorf("field error of message cosmos.accounts.v1.UserOperationResponse is not mutable"))
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.accounts.v1.UserOperationResponse"))
@@ -1432,6 +1403,8 @@ func (x *fastReflection_UserOperationResponse) NewField(fd protoreflect.FieldDes
case "cosmos.accounts.v1.UserOperationResponse.execution_responses":
list := []*anypb.Any{}
return protoreflect.ValueOfList(&_UserOperationResponse_5_list{list: &list})
case "cosmos.accounts.v1.UserOperationResponse.error":
return protoreflect.ValueOfString("")
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.accounts.v1.UserOperationResponse"))
@@ -1522,6 +1495,10 @@ func (x *fastReflection_UserOperationResponse) ProtoMethods() *protoiface.Method
n += 1 + l + runtime.Sov(uint64(l))
}
}
l = len(x.Error)
if l > 0 {
n += 1 + l + runtime.Sov(uint64(l))
}
if x.unknownFields != nil {
n += len(x.unknownFields)
}
@@ -1551,6 +1528,13 @@ func (x *fastReflection_UserOperationResponse) ProtoMethods() *protoiface.Method
i -= len(x.unknownFields)
copy(dAtA[i:], x.unknownFields)
}
if len(x.Error) > 0 {
i -= len(x.Error)
copy(dAtA[i:], x.Error)
i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Error)))
i--
dAtA[i] = 0x32
}
if len(x.ExecutionResponses) > 0 {
for iNdEx := len(x.ExecutionResponses) - 1; iNdEx >= 0; iNdEx-- {
encoded, err := options.Marshal(x.ExecutionResponses[iNdEx])
@@ -1772,6 +1756,38 @@ func (x *fastReflection_UserOperationResponse) ProtoMethods() *protoiface.Method
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err
}
iNdEx = postIndex
case 6:
if wireType != 2 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Error", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow
}
if iNdEx >= l {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
}
if postIndex > l {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
}
x.Error = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := runtime.Skip(dAtA[iNdEx:])
@@ -1836,12 +1852,9 @@ type UserOperation struct {
// authentication_data defines the authentication data associated with the authentication method.
// It is the account implementer duty to assess that the UserOperation is properly signed.
AuthenticationData []byte `protobuf:"bytes,3,opt,name=authentication_data,json=authenticationData,proto3" json:"authentication_data,omitempty"`
// sequence defines the sequence number of the account, the authentication method might require this
// to ensure non-replayability.
Sequence uint64 `protobuf:"varint,4,opt,name=sequence,proto3" json:"sequence,omitempty"`
// authentication_gas_limit expresses the gas limit to be used for the authentication part of the
// UserOperation.
AuthenticationGasLimit uint64 `protobuf:"varint,5,opt,name=authentication_gas_limit,json=authenticationGasLimit,proto3" json:"authentication_gas_limit,omitempty"`
AuthenticationGasLimit uint64 `protobuf:"varint,4,opt,name=authentication_gas_limit,json=authenticationGasLimit,proto3" json:"authentication_gas_limit,omitempty"`
// bundler_payment_messages expresses a list of messages that the account
// executes to pay the bundler for submitting the UserOperation.
// It can be empty if the bundler does not need any form of payment,
@@ -1851,18 +1864,18 @@ type UserOperation struct {
// - NFT payment
// - IBC Token payment.
// - Payment through delegations.
BundlerPaymentMessages []*anypb.Any `protobuf:"bytes,6,rep,name=bundler_payment_messages,json=bundlerPaymentMessages,proto3" json:"bundler_payment_messages,omitempty"`
BundlerPaymentMessages []*anypb.Any `protobuf:"bytes,5,rep,name=bundler_payment_messages,json=bundlerPaymentMessages,proto3" json:"bundler_payment_messages,omitempty"`
// bundler_payment_gas_limit defines the gas limit to be used for the bundler payment.
// This ensures that, since the bundler executes a list of UserOperations and there needs to
// be minimal trust between bundler and UserOperation sender, the sender cannot consume
// the whole bundle gas.
BundlerPaymentGasLimit uint64 `protobuf:"varint,7,opt,name=bundler_payment_gas_limit,json=bundlerPaymentGasLimit,proto3" json:"bundler_payment_gas_limit,omitempty"`
BundlerPaymentGasLimit uint64 `protobuf:"varint,6,opt,name=bundler_payment_gas_limit,json=bundlerPaymentGasLimit,proto3" json:"bundler_payment_gas_limit,omitempty"`
// execution_messages expresses a list of messages that the account wants to execute.
// This concretely is the intent of the transaction expressed as a UserOperation.
ExecutionMessages []*anypb.Any `protobuf:"bytes,8,rep,name=execution_messages,json=executionMessages,proto3" json:"execution_messages,omitempty"`
ExecutionMessages []*anypb.Any `protobuf:"bytes,7,rep,name=execution_messages,json=executionMessages,proto3" json:"execution_messages,omitempty"`
// execution_gas_limit defines the gas limit to be used for the execution of the UserOperation's
// execution messages.
ExecutionGasLimit uint64 `protobuf:"varint,9,opt,name=execution_gas_limit,json=executionGasLimit,proto3" json:"execution_gas_limit,omitempty"`
ExecutionGasLimit uint64 `protobuf:"varint,8,opt,name=execution_gas_limit,json=executionGasLimit,proto3" json:"execution_gas_limit,omitempty"`
}
func (x *UserOperation) Reset() {
@@ -1906,13 +1919,6 @@ func (x *UserOperation) GetAuthenticationData() []byte {
return nil
}
func (x *UserOperation) GetSequence() uint64 {
if x != nil {
return x.Sequence
}
return 0
}
func (x *UserOperation) GetAuthenticationGasLimit() uint64 {
if x != nil {
return x.AuthenticationGasLimit
@@ -1949,6 +1955,7 @@ func (x *UserOperation) GetExecutionGasLimit() uint64 {
}
// UserOperationResponse defines the response of a UserOperation.
// If the operation fails the error field will be populated.
type UserOperationResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -1965,6 +1972,12 @@ type UserOperationResponse struct {
ExecutionGasUsed uint64 `protobuf:"varint,4,opt,name=execution_gas_used,json=executionGasUsed,proto3" json:"execution_gas_used,omitempty"`
// execution_responses defines the responses of the execution messages.
ExecutionResponses []*anypb.Any `protobuf:"bytes,5,rep,name=execution_responses,json=executionResponses,proto3" json:"execution_responses,omitempty"`
// error defines the error that occurred during the execution of the UserOperation.
// If the error is not empty, the UserOperation failed.
// Other fields might be populated even if the error is not empty, for example
// if the operation fails after the authentication step, the authentication_gas_used
// field will be populated.
Error string `protobuf:"bytes,6,opt,name=error,proto3" json:"error,omitempty"`
}
func (x *UserOperationResponse) Reset() {
@@ -2022,6 +2035,13 @@ func (x *UserOperationResponse) GetExecutionResponses() []*anypb.Any {
return nil
}
func (x *UserOperationResponse) GetError() string {
if x != nil {
return x.Error
}
return ""
}
var File_cosmos_accounts_v1_account_abstraction_proto protoreflect.FileDescriptor
var file_cosmos_accounts_v1_account_abstraction_proto_rawDesc = []byte{
@@ -2030,7 +2050,7 @@ var file_cosmos_accounts_v1_account_abstraction_proto_rawDesc = []byte{
0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12,
0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e,
0x76, 0x31, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe3, 0x03,
0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc7, 0x03,
0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,
0x16, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x33, 0x0a, 0x15, 0x61, 0x75, 0x74, 0x68, 0x65,
@@ -2039,63 +2059,63 @@ var file_cosmos_accounts_v1_account_abstraction_proto_rawDesc = []byte{
0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x2f, 0x0a, 0x13,
0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64,
0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x61, 0x75, 0x74, 0x68, 0x65,
0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a,
0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52,
0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x61, 0x75, 0x74,
0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x61, 0x73, 0x5f,
0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x61, 0x75, 0x74,
0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x61, 0x73, 0x4c, 0x69,
0x6d, 0x69, 0x74, 0x12, 0x4e, 0x0a, 0x18, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x5f, 0x70,
0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18,
0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x62, 0x75, 0x6e,
0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61,
0x67, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x5f, 0x70,
0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74,
0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50,
0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x47, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x43,
0x0a, 0x12, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73,
0x61, 0x67, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f,
0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79,
0x52, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61,
0x67, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e,
0x5f, 0x67, 0x61, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04,
0x52, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x61, 0x73, 0x4c, 0x69,
0x6d, 0x69, 0x74, 0x22, 0xcf, 0x02, 0x0a, 0x15, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x70, 0x65, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a,
0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
0x67, 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15,
0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x61,
0x73, 0x55, 0x73, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x18, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72,
0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65,
0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72,
0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x47, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x12, 0x50,
0x0a, 0x19, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e,
0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,
0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x17, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72,
0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73,
0x12, 0x2c, 0x0a, 0x12, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x61,
0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x65, 0x78,
0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x12, 0x45,
0x0a, 0x13, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70,
0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f,
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e,
0x79, 0x52, 0x12, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70,
0x6f, 0x6e, 0x73, 0x65, 0x73, 0x42, 0xcb, 0x01, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f,
0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31,
0x42, 0x17, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63,
0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x63, 0x6f, 0x73,
0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f,
0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x76, 0x31,
0x3b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x41,
0x58, 0xaa, 0x02, 0x12, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75,
0x6e, 0x74, 0x73, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x12, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c,
0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1e, 0x43, 0x6f,
0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x5c, 0x56, 0x31,
0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x14, 0x43,
0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x3a,
0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a,
0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
0x67, 0x61, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52,
0x16, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47,
0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x4e, 0x0a, 0x18, 0x62, 0x75, 0x6e, 0x64, 0x6c,
0x65, 0x72, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61,
0x67, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52,
0x16, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d,
0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x62, 0x75, 0x6e, 0x64, 0x6c,
0x65, 0x72, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x6c,
0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x62, 0x75, 0x6e, 0x64,
0x6c, 0x65, 0x72, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x47, 0x61, 0x73, 0x4c, 0x69, 0x6d,
0x69, 0x74, 0x12, 0x43, 0x0a, 0x12, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14,
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
0x2e, 0x41, 0x6e, 0x79, 0x52, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d,
0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x65, 0x78, 0x65, 0x63, 0x75,
0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x08,
0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x47,
0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xe5, 0x02, 0x0a, 0x15, 0x55, 0x73, 0x65, 0x72,
0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
0x65, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01,
0x28, 0x04, 0x52, 0x15, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x47, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x18, 0x62, 0x75, 0x6e,
0x64, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x61, 0x73,
0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x62, 0x75, 0x6e,
0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x47, 0x61, 0x73, 0x55, 0x73,
0x65, 0x64, 0x12, 0x50, 0x0a, 0x19, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x61,
0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18,
0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x17, 0x62, 0x75, 0x6e,
0x64, 0x6c, 0x65, 0x72, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,
0x6e, 0x73, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f,
0x6e, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04,
0x52, 0x10, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x61, 0x73, 0x55, 0x73,
0x65, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32,
0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x12, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e,
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72,
0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42,
0xcb, 0x01, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x61,
0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x42, 0x17, 0x41, 0x63, 0x63, 0x6f,
0x75, 0x6e, 0x74, 0x41, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72,
0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b,
0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x61,
0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x63, 0x63, 0x6f, 0x75,
0x6e, 0x74, 0x73, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x41, 0x58, 0xaa, 0x02, 0x12, 0x43, 0x6f,
0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2e, 0x56, 0x31,
0xca, 0x02, 0x12, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
0x74, 0x73, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1e, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x41,
0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65,
0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x14, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a,
0x3a, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -23,6 +23,8 @@ var (
type Handler = func(ctx context.Context, request, response protoiface.MessageV1) error
// MakeHybridHandler returns a handler that can handle both gogo and protov2 messages, no matter
// if the handler is a gogo or protov2 handler.
func MakeHybridHandler(cdc codec.BinaryCodec, sd *grpc.ServiceDesc, method grpc.MethodDesc, handler interface{}) (Handler, error) {
methodFullName := protoreflect.FullName(fmt.Sprintf("%s.%s", sd.ServiceName, method.MethodName))
desc, err := gogoproto.HybridResolver.FindDescriptorByName(methodFullName)
@@ -221,3 +223,17 @@ func RequestFullNameFromMethodDesc(sd *grpc.ServiceDesc, method grpc.MethodDesc)
}
return methodDesc.Input().FullName(), nil
}
// ResponseFullNameFromMethodDesc returns the fully-qualified name of the response message of the provided service's method.
func ResponseFullNameFromMethodDesc(sd *grpc.ServiceDesc, method grpc.MethodDesc) (protoreflect.FullName, error) {
methodFullName := protoreflect.FullName(fmt.Sprintf("%s.%s", sd.ServiceName, method.MethodName))
desc, err := gogoproto.HybridResolver.FindDescriptorByName(methodFullName)
if err != nil {
return "", fmt.Errorf("cannot find method descriptor %s", methodFullName)
}
methodDesc, ok := desc.(protoreflect.MethodDescriptor)
if !ok {
return "", fmt.Errorf("invalid method descriptor %s", methodFullName)
}
return methodDesc.Output().FullName(), nil
}
+15 -2
View File
@@ -31,6 +31,7 @@ type MsgServiceRouter struct {
interfaceRegistry codectypes.InterfaceRegistry
routes map[string]MsgServiceHandler
hybridHandlers map[string]func(ctx context.Context, req, resp protoiface.MessageV1) error
responseByRequest map[string]string
circuitBreaker CircuitBreaker
}
@@ -39,8 +40,10 @@ var _ gogogrpc.Server = &MsgServiceRouter{}
// NewMsgServiceRouter creates a new MsgServiceRouter.
func NewMsgServiceRouter() *MsgServiceRouter {
return &MsgServiceRouter{
routes: map[string]MsgServiceHandler{},
hybridHandlers: map[string]func(ctx context.Context, req, resp protoiface.MessageV1) error{},
routes: map[string]MsgServiceHandler{},
hybridHandlers: map[string]func(ctx context.Context, req, resp protoiface.MessageV1) error{},
responseByRequest: map[string]string{},
circuitBreaker: nil,
}
}
@@ -87,16 +90,26 @@ func (msr *MsgServiceRouter) HybridHandlerByMsgName(msgName string) func(ctx con
return msr.hybridHandlers[msgName]
}
func (msr *MsgServiceRouter) ResponseNameByRequestName(msgName string) string {
return msr.responseByRequest[msgName]
}
func (msr *MsgServiceRouter) registerHybridHandler(sd *grpc.ServiceDesc, method grpc.MethodDesc, handler interface{}) error {
inputName, err := protocompat.RequestFullNameFromMethodDesc(sd, method)
if err != nil {
return err
}
outputName, err := protocompat.ResponseFullNameFromMethodDesc(sd, method)
if err != nil {
return err
}
cdc := codec.NewProtoCodec(msr.interfaceRegistry)
hybridHandler, err := protocompat.MakeHybridHandler(cdc, sd, method, handler)
if err != nil {
return err
}
// map input name to output name
msr.responseByRequest[string(inputName)] = string(outputName)
// if circuit breaker is not nil, then we decorate the hybrid handler with the circuit breaker
if msr.circuitBreaker == nil {
msr.hybridHandlers[string(inputName)] = hybridHandler
@@ -8,13 +8,13 @@ import "cosmos/accounts/v1/account_abstraction.proto";
// MsgAuthenticate is a message that an x/account account abstraction implementer
// must handle to authenticate a state transition.
message MsgAuthenticate {
// bundler defines the address of the bundler that sent the operation.
// NOTE: in case the operation was sent directly by the user, this field will reflect
// the user address.
string bundler = 1;
// user_operation is the operation that the user is trying to perform.
// it also contains authentication information.
cosmos.accounts.v1.UserOperation user_operation = 1;
// chain_id defines the network identifier.
string chain_id = 2;
// account_number is the account number of the user_operation.
uint64 account_number = 3;
cosmos.accounts.v1.UserOperation user_operation = 2;
}
// MsgAuthenticateResponse is the response to MsgAuthenticate.
@@ -27,9 +27,13 @@ message MsgAuthenticateResponse {}
// the bundler payment messages.
// The account must ensure the caller of this message is the x/accounts module itself.
message MsgPayBundler {
// bundler is the address of the bundler.
// NOTE: in case the operation was sent directly by the user, this field will
// reflect the user address.
string bundler = 1;
// bundler_payment_messages are the messages that the operation sender will execute.
// The account can modify the messages as it sees fit.
repeated google.protobuf.Any bundler_payment_messages = 1;
repeated google.protobuf.Any bundler_payment_messages = 2;
}
// MsgPayBundlerResponse is the response to MsgPayBundler.
@@ -44,9 +48,13 @@ message MsgPayBundlerResponse {
// block certain messages, or modify them.
// The account must ensure the caller of this message is the x/accounts module itself.
message MsgExecute {
// bundler is the address of the bundler.
// NOTE: in case the operation was sent directly by the user, this field will
// reflect the user address.
string bundler = 1;
// execution_messages are the messages that the operation sender will execute.
// The account can modify the messages as it sees fit.
repeated google.protobuf.Any execution_messages = 1;
repeated google.protobuf.Any execution_messages = 2;
}
// MsgExecuteResponse is the response to MsgExecute.
@@ -18,12 +18,9 @@ message UserOperation {
// authentication_data defines the authentication data associated with the authentication method.
// It is the account implementer duty to assess that the UserOperation is properly signed.
bytes authentication_data = 3;
// sequence defines the sequence number of the account, the authentication method might require this
// to ensure non-replayability.
uint64 sequence = 4;
// authentication_gas_limit expresses the gas limit to be used for the authentication part of the
// UserOperation.
uint64 authentication_gas_limit = 5;
uint64 authentication_gas_limit = 4;
// bundler_payment_messages expresses a list of messages that the account
// executes to pay the bundler for submitting the UserOperation.
// It can be empty if the bundler does not need any form of payment,
@@ -33,21 +30,22 @@ message UserOperation {
// - NFT payment
// - IBC Token payment.
// - Payment through delegations.
repeated google.protobuf.Any bundler_payment_messages = 6;
repeated google.protobuf.Any bundler_payment_messages = 5;
// bundler_payment_gas_limit defines the gas limit to be used for the bundler payment.
// This ensures that, since the bundler executes a list of UserOperations and there needs to
// be minimal trust between bundler and UserOperation sender, the sender cannot consume
// the whole bundle gas.
uint64 bundler_payment_gas_limit = 7;
uint64 bundler_payment_gas_limit = 6;
// execution_messages expresses a list of messages that the account wants to execute.
// This concretely is the intent of the transaction expressed as a UserOperation.
repeated google.protobuf.Any execution_messages = 8;
repeated google.protobuf.Any execution_messages = 7;
// execution_gas_limit defines the gas limit to be used for the execution of the UserOperation's
// execution messages.
uint64 execution_gas_limit = 9;
uint64 execution_gas_limit = 8;
}
// UserOperationResponse defines the response of a UserOperation.
// If the operation fails the error field will be populated.
message UserOperationResponse {
// authentication_gas_used defines the gas used for the authentication part of the UserOperation.
uint64 authentication_gas_used = 1;
@@ -60,4 +58,10 @@ message UserOperationResponse {
uint64 execution_gas_used = 4;
// execution_responses defines the responses of the execution messages.
repeated google.protobuf.Any execution_responses = 5;
// error defines the error that occurred during the execution of the UserOperation.
// If the error is not empty, the UserOperation failed.
// Other fields might be populated even if the error is not empty, for example
// if the operation fails after the authentication step, the authentication_gas_used
// field will be populated.
string error = 6;
}
+4
View File
@@ -22,6 +22,7 @@ import (
storetypes "cosmossdk.io/store/types"
"cosmossdk.io/x/accounts"
"cosmossdk.io/x/accounts/accountstd"
"cosmossdk.io/x/accounts/testing/account_abstraction"
"cosmossdk.io/x/accounts/testing/counter"
"cosmossdk.io/x/auth"
"cosmossdk.io/x/auth/ante"
@@ -284,11 +285,14 @@ func NewSimApp(
accountsKeeper, err := accounts.NewKeeper(
runtime.NewKVStoreService(keys[accounts.StoreKey]),
runtime.EventService{},
runtime.BranchService{},
app.AuthKeeper.AddressCodec(),
appCodec.InterfaceRegistry().SigningContext(),
app.MsgServiceRouter(),
app.GRPCQueryRouter(),
accountstd.AddAccount("counter", counter.NewAccount),
accountstd.AddAccount("aa_minimal", account_abstraction.NewMinimalAbstractedAccount),
accountstd.AddAccount("aa_full", account_abstraction.NewFullAbstractedAccount),
)
if err != nil {
panic(err)
@@ -0,0 +1,349 @@
//go:build app_v1
package accounts
import (
"context"
"testing"
rotationv1 "cosmossdk.io/api/cosmos/accounts/testing/rotation/v1"
accountsv1 "cosmossdk.io/api/cosmos/accounts/v1"
bankv1beta1 "cosmossdk.io/api/cosmos/bank/v1beta1"
v1beta1 "cosmossdk.io/api/cosmos/base/v1beta1"
nftv1beta1 "cosmossdk.io/api/cosmos/nft/v1beta1"
stakingv1beta1 "cosmossdk.io/api/cosmos/staking/v1beta1"
"cosmossdk.io/simapp"
"cosmossdk.io/x/accounts"
"cosmossdk.io/x/bank/testutil"
"cosmossdk.io/x/nft"
"github.com/cosmos/cosmos-proto/anyutil"
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/types/known/anypb"
)
var (
privKey = secp256k1.GenPrivKey()
accCreator = []byte("creator")
bundlerAddr = secp256k1.GenPrivKey().PubKey().Address()
aliceAddr = secp256k1.GenPrivKey().PubKey().Address()
)
func TestAccountAbstraction(t *testing.T) {
app := setupApp(t)
ak := app.AccountsKeeper
ctx := sdk.NewContext(app.CommitMultiStore(), false, app.Logger())
_, aaAddr, err := ak.Init(ctx, "aa_minimal", accCreator, &rotationv1.MsgInit{
PubKeyBytes: privKey.PubKey().Bytes(),
})
require.NoError(t, err)
_, aaFullAddr, err := ak.Init(ctx, "aa_full", accCreator, &rotationv1.MsgInit{
PubKeyBytes: privKey.PubKey().Bytes(),
})
require.NoError(t, err)
aaAddrStr, err := app.AuthKeeper.AddressCodec().BytesToString(aaAddr)
require.NoError(t, err)
aaFullAddrStr, err := app.AuthKeeper.AddressCodec().BytesToString(aaFullAddr)
require.NoError(t, err)
// let's give aa some coins.
require.NoError(t, testutil.FundAccount(ctx, app.BankKeeper, aaAddr, sdk.NewCoins(sdk.NewInt64Coin("stake", 100000000000))))
require.NoError(t, testutil.FundAccount(ctx, app.BankKeeper, aaFullAddr, sdk.NewCoins(sdk.NewInt64Coin("stake", 100000000000))))
bundlerAddrStr, err := app.AuthKeeper.AddressCodec().BytesToString(bundlerAddr)
require.NoError(t, err)
aliceAddrStr, err := app.AuthKeeper.AddressCodec().BytesToString(aliceAddr)
require.NoError(t, err)
t.Run("ok - pay bundler and exec not implemented", func(t *testing.T) {
// we simulate executing an user operation in an abstracted account
// which only implements the authentication.
resp := ak.ExecuteUserOperation(ctx, bundlerAddrStr, &accountsv1.UserOperation{
Sender: aaAddrStr,
AuthenticationMethod: "secp256k1",
AuthenticationData: []byte("signature"),
AuthenticationGasLimit: 10000,
BundlerPaymentMessages: intoAny(t, &bankv1beta1.MsgSend{
FromAddress: aaAddrStr,
ToAddress: bundlerAddrStr,
Amount: coins(t, "1stake"), // the sender is the AA, so it has the coins and wants to pay the bundler for the gas
}),
BundlerPaymentGasLimit: 50000,
ExecutionMessages: intoAny(t, &bankv1beta1.MsgSend{
FromAddress: aaAddrStr,
ToAddress: aliceAddrStr,
Amount: coins(t, "2000stake"), // as the real action the sender wants to send coins to alice
}),
ExecutionGasLimit: 36000,
})
require.Empty(t, resp.Error) // no error
require.Len(t, resp.BundlerPaymentResponses, 1)
require.Len(t, resp.ExecutionResponses, 1)
require.NotZero(t, resp.ExecutionGasUsed)
require.NotZero(t, resp.BundlerPaymentGasUsed)
require.NotZero(t, resp.AuthenticationGasUsed)
// assert there were state changes
balanceIs(t, ctx, app, bundlerAddr.Bytes(), "1stake") // pay bundler state change
balanceIs(t, ctx, app, aliceAddr.Bytes(), "2000stake") // execute messages state change.
})
t.Run("pay bundle impersonation", func(t *testing.T) {
// we simulate the execution of an abstracted account
// which only implements authentication and tries in the pay
// bundler messages the account tries to impersonate another one.
resp := ak.ExecuteUserOperation(ctx, bundlerAddrStr, &accountsv1.UserOperation{
Sender: aaAddrStr,
AuthenticationMethod: "secp256k1",
AuthenticationData: []byte("signature"),
AuthenticationGasLimit: 10000,
BundlerPaymentMessages: intoAny(t, &bankv1beta1.MsgSend{
FromAddress: bundlerAddrStr, // abstracted account tries to send money from bundler to itself.
ToAddress: aaAddrStr,
Amount: coins(t, "1stake"),
}),
BundlerPaymentGasLimit: 50000,
ExecutionMessages: intoAny(t, &bankv1beta1.MsgSend{
FromAddress: aaAddrStr,
ToAddress: aliceAddrStr,
Amount: coins(t, "2000stake"), // as the real action the sender wants to send coins to alice
}),
ExecutionGasLimit: 36000,
})
require.Contains(t, resp.Error, accounts.ErrUnauthorized.Error()) // error is unauthorized
require.Empty(t, resp.BundlerPaymentResponses) // no bundler payment responses, since the atomic exec failed
require.Empty(t, resp.ExecutionResponses) // no execution responses, since the atomic exec failed
require.Zero(t, resp.ExecutionGasUsed) // no execution gas used, since the atomic exec failed
require.NotZero(t, resp.BundlerPaymentGasUsed) // bundler payment gas used, even if the atomic exec failed
})
t.Run("exec message impersonation", func(t *testing.T) {
// we simulate a case in which the abstracted account tries to impersonate
// someone else in the execution of messages.
resp := ak.ExecuteUserOperation(ctx, bundlerAddrStr, &accountsv1.UserOperation{
Sender: aaAddrStr,
AuthenticationMethod: "secp256k1",
AuthenticationData: []byte("signature"),
AuthenticationGasLimit: 10000,
BundlerPaymentMessages: intoAny(t, &bankv1beta1.MsgSend{
FromAddress: aaAddrStr,
ToAddress: bundlerAddrStr,
Amount: coins(t, "1stake"),
}),
BundlerPaymentGasLimit: 50000,
ExecutionMessages: intoAny(t, &bankv1beta1.MsgSend{
FromAddress: aliceAddrStr, // abstracted account attempts to send money from alice to itself
ToAddress: aaAddrStr,
Amount: coins(t, "2000stake"),
}),
ExecutionGasLimit: 36000,
})
require.Contains(t, resp.Error, accounts.ErrUnauthorized.Error()) // error is unauthorized
require.NotEmpty(t, resp.BundlerPaymentResponses) // bundler payment responses, since the bundler payment succeeded
require.Empty(t, resp.ExecutionResponses) // no execution responses, since the atomic exec failed
require.NotZero(t, resp.ExecutionGasUsed) // execution gas used, even if the atomic exec failed
require.NotZero(t, resp.BundlerPaymentGasUsed) // bundler payment gas used, even if the atomic exec failed
})
t.Run("auth failure", func(t *testing.T) {
// if auth fails nothing more should be attempted, the authentication
// should have spent gas and the error should be returned.
// we simulate a case in which the abstracted account tries to impersonate
// someone else in the execution of messages.
resp := ak.ExecuteUserOperation(ctx, bundlerAddrStr, &accountsv1.UserOperation{
Sender: aaAddrStr,
AuthenticationMethod: "invalid",
AuthenticationData: []byte("signature"),
AuthenticationGasLimit: 10000,
BundlerPaymentMessages: intoAny(t, &bankv1beta1.MsgSend{
FromAddress: aaAddrStr,
ToAddress: bundlerAddrStr,
Amount: coins(t, "1stake"),
}),
BundlerPaymentGasLimit: 50000,
ExecutionMessages: intoAny(t, &bankv1beta1.MsgSend{
FromAddress: aliceAddrStr, // abstracted account attempts to send money from alice to itself
ToAddress: aaAddrStr,
Amount: coins(t, "2000stake"),
}),
ExecutionGasLimit: 36000,
})
require.Contains(t, resp.Error, accounts.ErrAuthentication.Error()) // error is authentication
require.Empty(t, resp.BundlerPaymentResponses) // no bundler payment responses, since the atomic exec failed
require.Empty(t, resp.ExecutionResponses) // no execution responses, since the atomic exec failed
require.Zero(t, resp.ExecutionGasUsed) // no execution gas used, since the atomic exec failed
require.Zero(t, resp.BundlerPaymentGasUsed) // no bundler payment gas used, since the atomic exec failed
require.NotZero(t, resp.AuthenticationGasUsed) // authentication gas used, even if the atomic exec failed
})
t.Run("pay bundle failure", func(t *testing.T) {
// pay bundler fails, nothing more should be attempted, the authentication
// succeeded. We expect gas used in auth and pay bundler step.
// we simulate a case in which the abstracted account tries to impersonate
// someone else in the execution of messages.
resp := ak.ExecuteUserOperation(ctx, bundlerAddrStr, &accountsv1.UserOperation{
Sender: aaAddrStr,
AuthenticationMethod: "secp256k1",
AuthenticationData: []byte("signature"),
AuthenticationGasLimit: 10000,
BundlerPaymentMessages: intoAny(t, &bankv1beta1.MsgSend{
FromAddress: aaAddrStr,
ToAddress: bundlerAddrStr,
Amount: coins(t, "1atom"), // abstracted account does not have enough money to pay the bundler, since it does not hold atom
}),
BundlerPaymentGasLimit: 50000,
ExecutionMessages: intoAny(t, &bankv1beta1.MsgSend{
FromAddress: aliceAddrStr, // abstracted account attempts to send money from alice to itself
ToAddress: aaAddrStr,
Amount: coins(t, "2000stake"),
}),
ExecutionGasLimit: 36000,
})
require.Contains(t, resp.Error, accounts.ErrBundlerPayment.Error()) // error is bundler payment
require.Empty(t, resp.BundlerPaymentResponses) // no bundler payment responses, since the atomic exec failed
require.Empty(t, resp.ExecutionResponses) // no execution responses, since the atomic exec failed
require.Zero(t, resp.ExecutionGasUsed) // no execution gas used, since the atomic exec failed
require.NotZero(t, resp.BundlerPaymentGasUsed) // bundler payment gas used, even if the atomic exec failed
require.NotZero(t, resp.AuthenticationGasUsed) // authentication gas used, even if the atomic exec failed
})
t.Run("exec message failure", func(t *testing.T) {
// execution message fails, nothing more should be attempted, the authentication
// and pay bundler succeeded. We expect gas used in auth, pay bundler and
// execution step.
resp := ak.ExecuteUserOperation(ctx, bundlerAddrStr, &accountsv1.UserOperation{
Sender: aaAddrStr,
AuthenticationMethod: "secp256k1",
AuthenticationData: []byte("signature"),
AuthenticationGasLimit: 10000,
BundlerPaymentMessages: intoAny(t, &bankv1beta1.MsgSend{
FromAddress: aaAddrStr,
ToAddress: bundlerAddrStr,
Amount: coins(t, "1stake"),
}),
BundlerPaymentGasLimit: 50000,
ExecutionMessages: intoAny(t, &bankv1beta1.MsgSend{
FromAddress: aaAddrStr,
ToAddress: aliceAddrStr,
Amount: coins(t, "2000atom"), // abstracted account does not have enough money to pay alice, since it does not hold atom
}),
ExecutionGasLimit: 36000,
})
require.Contains(t, resp.Error, accounts.ErrExecution.Error()) // error is execution
require.Len(t, resp.BundlerPaymentResponses, 1) // bundler payment response, since the pay bundler succeeded
require.Empty(t, resp.ExecutionResponses) // no execution responses, since the atomic exec failed
require.NotZero(t, resp.ExecutionGasUsed) // execution gas used, even if the atomic exec failed
require.NotZero(t, resp.BundlerPaymentGasUsed) // bundler payment gas used, even if the atomic exec failed
require.NotZero(t, resp.AuthenticationGasUsed) // authentication gas used, even if the atomic exec failed
})
t.Run("implements bundler payment - fail ", func(t *testing.T) {
// we assert that if an aa implements the bundler payment interface, then
// that is called.
resp := ak.ExecuteUserOperation(ctx, bundlerAddrStr, &accountsv1.UserOperation{
Sender: aaFullAddrStr,
AuthenticationMethod: "secp256k1",
AuthenticationData: []byte("signature"),
AuthenticationGasLimit: 10000,
BundlerPaymentMessages: intoAny(t, &bankv1beta1.MsgSend{
FromAddress: aaFullAddrStr,
ToAddress: bundlerAddrStr,
Amount: coins(t, "1stake"), // we expect this to fail since the account is implement in such a way not to allow bank sends.
}),
BundlerPaymentGasLimit: 50000,
ExecutionMessages: intoAny(t, &bankv1beta1.MsgSend{
FromAddress: aaFullAddrStr,
ToAddress: aliceAddrStr,
Amount: coins(t, "2000stake"),
}),
ExecutionGasLimit: 36000,
})
// in order to assert the call we expect an error to be returned.
require.Contains(t, resp.Error, accounts.ErrBundlerPayment.Error()) // error is bundler payment
require.Contains(t, resp.Error, "this account does not allow bank send messages") // error is bundler payment
})
t.Run("implements execution - fail", func(t *testing.T) {
resp := ak.ExecuteUserOperation(ctx, bundlerAddrStr, &accountsv1.UserOperation{
Sender: aaFullAddrStr,
AuthenticationMethod: "secp256k1",
AuthenticationData: []byte("signature"),
AuthenticationGasLimit: 10000,
BundlerPaymentMessages: nil,
BundlerPaymentGasLimit: 50000,
ExecutionMessages: intoAny(t, &stakingv1beta1.MsgDelegate{
DelegatorAddress: aaFullAddrStr,
ValidatorAddress: "some-validator",
Amount: coins(t, "2000stake")[0],
}),
ExecutionGasLimit: 36000,
})
// in order to assert the call we expect an error to be returned.
require.Contains(t, resp.Error, accounts.ErrExecution.Error()) // error is in execution
require.Contains(t, resp.Error, "this account does not allow delegation messages")
})
t.Run("implements bundler payment and execution - success", func(t *testing.T) {
// we simulate the abstracted account pays the bundler using an NFT.
require.NoError(t, app.NFTKeeper.SaveClass(ctx, nft.Class{
Id: "omega-rare",
}))
require.NoError(t, app.NFTKeeper.Mint(ctx, nft.NFT{
ClassId: "omega-rare",
Id: "the-most-rare",
}, aaFullAddr))
resp := ak.ExecuteUserOperation(ctx, bundlerAddrStr, &accountsv1.UserOperation{
Sender: aaFullAddrStr,
AuthenticationMethod: "secp256k1",
AuthenticationData: []byte("signature"),
AuthenticationGasLimit: 10000,
BundlerPaymentMessages: intoAny(t, &nftv1beta1.MsgSend{
ClassId: "omega-rare",
Id: "the-most-rare",
Sender: aaFullAddrStr,
Receiver: bundlerAddrStr,
}),
BundlerPaymentGasLimit: 50000,
ExecutionMessages: intoAny(t, &bankv1beta1.MsgSend{
FromAddress: aaFullAddrStr,
ToAddress: aliceAddrStr,
Amount: coins(t, "2000stake"),
}),
ExecutionGasLimit: 36000,
})
require.Empty(t, resp.Error) // no error
})
}
func intoAny(t *testing.T, msgs ...proto.Message) (anys []*anypb.Any) {
t.Helper()
for _, msg := range msgs {
any, err := anyutil.New(msg)
require.NoError(t, err)
anys = append(anys, any)
}
return
}
func coins(t *testing.T, s string) []*v1beta1.Coin {
t.Helper()
coins, err := sdk.ParseCoinsNormalized(s)
require.NoError(t, err)
coinsv2 := make([]*v1beta1.Coin, len(coins))
for i, coin := range coins {
coinsv2[i] = &v1beta1.Coin{
Denom: coin.Denom,
Amount: coin.Amount.String(),
}
}
return coinsv2
}
func balanceIs(t *testing.T, ctx context.Context, app *simapp.SimApp, addr sdk.AccAddress, s string) {
t.Helper()
balance := app.BankKeeper.GetAllBalances(ctx, addr)
require.Equal(t, s, balance.String())
}
+13
View File
@@ -0,0 +1,13 @@
package accounts
import (
"testing"
"cosmossdk.io/simapp"
)
func setupApp(t *testing.T) *simapp.SimApp {
t.Helper()
app := simapp.Setup(t, false)
return app
}
+52
View File
@@ -2,11 +2,20 @@
package accountstd
import (
"bytes"
"context"
"fmt"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/types/known/anypb"
"cosmossdk.io/x/accounts/internal/implementation"
"github.com/cosmos/cosmos-sdk/types/address"
)
var accountsModuleAddress = address.Module("accounts")
// Interface is the exported interface of an Account.
type Interface = implementation.Account
@@ -63,12 +72,55 @@ func Sender(ctx context.Context) []byte {
return implementation.Sender(ctx)
}
// SenderIsAccountsModule returns true if the sender of the execution request is the accounts module.
func SenderIsAccountsModule(ctx context.Context) bool {
return bytes.Equal(Sender(ctx), accountsModuleAddress)
}
// ExecModule can be used to execute a message towards a module.
func ExecModule[Resp any, RespProto implementation.ProtoMsg[Resp], Req any, ReqProto implementation.ProtoMsg[Req]](ctx context.Context, msg ReqProto) (RespProto, error) {
return implementation.ExecModule[Resp, RespProto, Req, ReqProto](ctx, msg)
}
func ExecModuleUntyped(ctx context.Context, msg proto.Message) (proto.Message, error) {
return implementation.ExecModuleUntyped(ctx, msg)
}
// QueryModule can be used by an account to execute a module query.
func QueryModule[Resp any, RespProto implementation.ProtoMsg[Resp], Req any, ReqProto implementation.ProtoMsg[Req]](ctx context.Context, req ReqProto) (RespProto, error) {
return implementation.QueryModule[Resp, RespProto, Req, ReqProto](ctx, req)
}
// UnpackAny unpacks a protobuf Any message generically.
func UnpackAny[Msg any, ProtoMsg implementation.ProtoMsg[Msg]](any *anypb.Any) (*Msg, error) {
return implementation.UnpackAny[Msg, ProtoMsg](any)
}
// PackAny packs a protobuf Any message generically.
func PackAny(msg proto.Message) (*anypb.Any, error) {
return implementation.PackAny(msg)
}
// ExecModuleAnys can be used to execute a list of messages towards a module
// when those messages are packed in Any messages. The function returns a list
// of responses packed in Any messages.
func ExecModuleAnys(ctx context.Context, msgs []*anypb.Any) ([]*anypb.Any, error) {
responses := make([]*anypb.Any, len(msgs))
for i, msg := range msgs {
concreteMessage, err := implementation.UnpackAnyRaw(msg)
if err != nil {
return nil, fmt.Errorf("error unpacking message %d: %w", i, err)
}
resp, err := ExecModuleUntyped(ctx, concreteMessage)
if err != nil {
return nil, fmt.Errorf("error executing message %d: %w", i, err)
}
// pack again
respAnyPB, err := implementation.PackAny(resp)
if err != nil {
return nil, fmt.Errorf("error packing response %d: %w", i, err)
}
responses[i] = respAnyPB
}
return responses, nil
}
+2 -5
View File
@@ -5,7 +5,7 @@ import (
"testing"
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/runtime/protoiface"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/types/known/emptypb"
"google.golang.org/protobuf/types/known/wrapperspb"
@@ -15,10 +15,7 @@ import (
func TestGenesis(t *testing.T) {
k, ctx := newKeeper(t, implementation.AddAccount("test", NewTestAccount))
k.queryModuleFunc = func(ctx context.Context, req, resp protoiface.MessageV1) error {
return nil
}
k.queryRouter = mockQuery(func(ctx context.Context, req, resp proto.Message) error { return nil })
// we init two accounts of the same type
// we set counter to 10
@@ -152,3 +152,12 @@ type QueryBuilder struct {
func (r *QueryBuilder) makeHandler() (func(ctx context.Context, queryRequest any) (queryResponse any, err error), error) {
return r.er.makeHandler()
}
// IsRoutingError returns true if the error is a routing error,
// which typically occurs when a message cannot be matched to a handler.
func IsRoutingError(err error) bool {
if err == nil {
return false
}
return errors.Is(err, errInvalidMessage)
}
+27 -27
View File
@@ -1,38 +1,33 @@
package implementation
import (
"bytes"
"context"
"errors"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/runtime/protoiface"
"cosmossdk.io/collections"
"cosmossdk.io/core/store"
"cosmossdk.io/x/accounts/internal/prefixstore"
)
var (
errUnauthorized = errors.New("unauthorized")
AccountStatePrefix = collections.NewPrefix(255)
)
var AccountStatePrefix = collections.NewPrefix(255)
type (
ModuleExecFunc = func(ctx context.Context, msg, msgResp protoiface.MessageV1) error
ModuleQueryFunc = ModuleExecFunc
ModuleExecUntypedFunc = func(ctx context.Context, sender []byte, msg proto.Message) (proto.Message, error)
ModuleExecFunc = func(ctx context.Context, sender []byte, msg, msgResp proto.Message) error
ModuleQueryFunc = func(ctx context.Context, queryReq, queryResp proto.Message) error
)
type contextKey struct{}
type contextValue struct {
store store.KVStore // store is the prefixed store for the account.
sender []byte // sender is the address of the entity invoking the account action.
whoami []byte // whoami is the address of the account being invoked.
originalContext context.Context // originalContext that was used to build the account context.
getExpectedSender func(msg proto.Message) ([]byte, error) // getExpectedSender is a function that returns the expected sender for a given message.
moduleExec ModuleExecFunc // moduleExec is a function that executes a module message.
moduleQuery ModuleQueryFunc // moduleQuery is a function that queries a module.
store store.KVStore // store is the prefixed store for the account.
sender []byte // sender is the address of the entity invoking the account action.
whoami []byte // whoami is the address of the account being invoked.
originalContext context.Context // originalContext that was used to build the account context.
moduleExec ModuleExecFunc // moduleExec is a function that executes a module message, when the resp type is known.
moduleExecUntyped ModuleExecUntypedFunc // moduleExecUntyped is a function that executes a module message, when the resp type is unknown.
moduleQuery ModuleQueryFunc // moduleQuery is a function that queries a module.
}
// MakeAccountContext creates a new account execution context given:
@@ -47,8 +42,8 @@ func MakeAccountContext(
storeSvc store.KVStoreService,
accountAddr,
sender []byte,
getSenderFunc func(msg proto.Message) ([]byte, error),
moduleExec ModuleExecFunc,
moduleExecUntyped ModuleExecUntypedFunc,
moduleQuery ModuleQueryFunc,
) context.Context {
return context.WithValue(ctx, contextKey{}, contextValue{
@@ -56,28 +51,33 @@ func MakeAccountContext(
sender: sender,
whoami: accountAddr,
originalContext: ctx,
getExpectedSender: getSenderFunc,
moduleExecUntyped: moduleExecUntyped,
moduleExec: moduleExec,
moduleQuery: moduleQuery,
})
}
// ExecModuleUntyped can be used to execute a message towards a module, when the response type is unknown.
func ExecModuleUntyped(ctx context.Context, msg proto.Message) (proto.Message, error) {
// get sender
v := ctx.Value(contextKey{}).(contextValue)
resp, err := v.moduleExecUntyped(v.originalContext, v.whoami, msg)
if err != nil {
return nil, err
}
return resp, nil
}
// ExecModule can be used to execute a message towards a module.
func ExecModule[Resp any, RespProto ProtoMsg[Resp], Req any, ReqProto ProtoMsg[Req]](ctx context.Context, msg ReqProto) (RespProto, error) {
// get sender
v := ctx.Value(contextKey{}).(contextValue)
// check sender
expectedSender, err := v.getExpectedSender(msg)
if err != nil {
return nil, err
}
if !bytes.Equal(expectedSender, v.whoami) {
return nil, errUnauthorized
}
// execute module, unwrapping the original context.
resp := RespProto(new(Resp))
err = v.moduleExec(v.originalContext, msg, resp)
err := v.moduleExec(v.originalContext, v.whoami, msg, resp)
if err != nil {
return nil, err
}
@@ -6,7 +6,6 @@ import (
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/runtime/protoiface"
"google.golang.org/protobuf/types/known/wrapperspb"
"cosmossdk.io/collections"
@@ -44,33 +43,33 @@ func TestMakeAccountContext(t *testing.T) {
require.NoError(t, err)
require.Equal(t, []byte{0, 0, 0, 0, 0, 0, 3, 232}, value)
// ensure getSenderAccount blocks impersonation
accountCtx = MakeAccountContext(originalContext, storeService, []byte("impersonator"), []byte("account-invoker"), func(_ proto.Message) ([]byte, error) {
return []byte("legit-exec-module"), nil
}, nil, nil)
_, err = ExecModule[wrapperspb.StringValue](accountCtx, &wrapperspb.UInt64Value{Value: 1000})
require.ErrorIs(t, err, errUnauthorized)
// ensure calling ExecModule works
accountCtx = MakeAccountContext(originalContext, storeService, []byte("legit-exec-module"), []byte("invoker"), func(_ proto.Message) ([]byte, error) {
return []byte("legit-exec-module"), nil
}, func(ctx context.Context, msg, msgResp protoiface.MessageV1) error {
accountCtx = MakeAccountContext(originalContext, storeService, []byte("legit-exec-module"), []byte("invoker"), func(ctx context.Context, sender []byte, msg, msgResp proto.Message) error {
// ensure we unwrapped the context when invoking a module call
require.Equal(t, originalContext, ctx)
proto.Merge(msgResp.(proto.Message), &wrapperspb.StringValue{Value: "module exec was called"})
proto.Merge(msgResp, &wrapperspb.StringValue{Value: "module exec was called"})
return nil
}, nil)
}, nil, nil)
resp, err := ExecModule[wrapperspb.StringValue](accountCtx, &wrapperspb.UInt64Value{Value: 1000})
require.NoError(t, err)
require.True(t, proto.Equal(wrapperspb.String("module exec was called"), resp))
// ensure calling ExecModuleUntyped works
accountCtx = MakeAccountContext(originalContext, storeService, []byte("legit-exec-module-untyped"), []byte("invoker"), nil, func(ctx context.Context, sender []byte, msg proto.Message) (proto.Message, error) {
require.Equal(t, originalContext, ctx)
return &wrapperspb.StringValue{Value: "module exec untyped was called"}, nil
}, nil)
respUntyped, err := ExecModuleUntyped(accountCtx, &wrapperspb.UInt64Value{Value: 1000})
require.NoError(t, err)
require.True(t, proto.Equal(wrapperspb.String("module exec untyped was called"), respUntyped))
// ensure calling QueryModule works, also by setting everything else communication related to nil
// we can guarantee that exec paths do not impact query paths.
accountCtx = MakeAccountContext(originalContext, storeService, nil, nil, nil, nil, func(ctx context.Context, req, resp protoiface.MessageV1) error {
accountCtx = MakeAccountContext(originalContext, storeService, nil, nil, nil, nil, func(ctx context.Context, req, resp proto.Message) error {
require.Equal(t, originalContext, ctx)
proto.Merge(resp.(proto.Message), wrapperspb.String("module query was called"))
proto.Merge(resp, wrapperspb.String("module query was called"))
return nil
})
@@ -0,0 +1,31 @@
package implementation
import (
"github.com/cosmos/cosmos-proto/anyutil"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/types/known/anypb"
)
// PackAny packs a proto message into an anypb.Any.
func PackAny(msg proto.Message) (*anypb.Any, error) {
anyPB := new(anypb.Any)
return anyPB, anyutil.MarshalFrom(anyPB, msg, proto.MarshalOptions{Deterministic: true})
}
// UnpackAny unpacks an anypb.Any into a proto message.
func UnpackAny[T any, PT ProtoMsg[T]](anyPB *anypb.Any) (PT, error) {
to := new(T)
return to, UnpackAnyTo(anyPB, PT(to))
}
func UnpackAnyTo(anyPB *anypb.Any, to proto.Message) error {
return anypb.UnmarshalTo(anyPB, to, proto.UnmarshalOptions{
DiscardUnknown: true,
})
}
func UnpackAnyRaw(anyPB *anypb.Any) (proto.Message, error) {
return anypb.UnmarshalNew(anyPB, proto.UnmarshalOptions{
DiscardUnknown: true,
})
}
+140 -58
View File
@@ -1,6 +1,7 @@
package accounts
import (
"bytes"
"context"
"crypto/sha256"
"encoding/binary"
@@ -8,10 +9,14 @@ import (
"fmt"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/reflect/protoregistry"
"google.golang.org/protobuf/runtime/protoiface"
"google.golang.org/protobuf/types/known/anypb"
"cosmossdk.io/collections"
"cosmossdk.io/core/address"
"cosmossdk.io/core/branch"
"cosmossdk.io/core/event"
"cosmossdk.io/core/store"
"cosmossdk.io/x/accounts/accountstd"
@@ -20,13 +25,19 @@ import (
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
)
var errAccountTypeNotFound = errors.New("account type not found")
var (
errAccountTypeNotFound = errors.New("account type not found")
// ErrUnauthorized is returned when a message sender is not allowed to perform the operation.
ErrUnauthorized = errors.New("unauthorized")
)
var (
// AccountTypeKeyPrefix is the prefix for the account type key.
AccountTypeKeyPrefix = collections.NewPrefix(0)
// AccountNumberKey is the key for the account number.
AccountNumberKey = collections.NewPrefix(1)
// AccountByNumber is the key for the accounts by number.
AccountByNumber = collections.NewPrefix(2)
)
// QueryRouter represents a router which can be used to route queries to the correct module.
@@ -39,6 +50,7 @@ type QueryRouter interface {
// MsgRouter represents a router which can be used to route messages to the correct module.
type MsgRouter interface {
HybridHandlerByMsgName(msgName string) func(ctx context.Context, req, resp protoiface.MessageV1) error
ResponseNameByRequestName(name string) string
}
// SignerProvider defines an interface used to get the expected sender from a message.
@@ -47,9 +59,13 @@ type SignerProvider interface {
GetSigners(msg proto.Message) ([][]byte, error)
}
// BranchExecutor defines an interface used to execute ops in a branch.
type BranchExecutor = branch.Service
func NewKeeper(
ss store.KVStoreService,
es event.Service,
bs BranchExecutor,
addressCodec address.Codec,
signerProvider SignerProvider,
execRouter MsgRouter,
@@ -58,41 +74,18 @@ func NewKeeper(
) (Keeper, error) {
sb := collections.NewSchemaBuilder(ss)
keeper := Keeper{
storeService: ss,
eventService: es,
addressCodec: addressCodec,
getSenderFunc: func(msg proto.Message) ([]byte, error) {
signers, err := signerProvider.GetSigners(msg)
if err != nil {
return nil, err
}
if len(signers) != 1 {
return nil, fmt.Errorf("expected 1 signer, got %d", len(signers))
}
return signers[0], nil
},
execModuleFunc: func(ctx context.Context, msg, msgResp protoiface.MessageV1) error {
name := getMessageName(msg)
handler := execRouter.HybridHandlerByMsgName(name)
if handler == nil {
return fmt.Errorf("no handler found for message %s", name)
}
return handler(ctx, msg, msgResp)
},
queryModuleFunc: func(ctx context.Context, req, resp protoiface.MessageV1) error {
name := getMessageName(req)
handlers := queryRouter.HybridHandlerByRequestName(name)
if len(handlers) == 0 {
return fmt.Errorf("no handler found for query request %s", name)
}
if len(handlers) > 1 {
return fmt.Errorf("multiple handlers found for query request %s", name)
}
return handlers[0](ctx, req, resp)
},
AccountNumber: collections.NewSequence(sb, AccountNumberKey, "account_number"),
AccountsByType: collections.NewMap(sb, AccountTypeKeyPrefix, "accounts_by_type", collections.BytesKey, collections.StringValue),
AccountsState: collections.NewMap(sb, implementation.AccountStatePrefix, "accounts_state", collections.BytesKey, collections.BytesValue),
storeService: ss,
eventService: es,
branchExecutor: bs,
addressCodec: addressCodec,
signerProvider: signerProvider,
msgRouter: execRouter,
queryRouter: queryRouter,
Schema: collections.Schema{},
AccountNumber: collections.NewSequence(sb, AccountNumberKey, "account_number"),
AccountsByType: collections.NewMap(sb, AccountTypeKeyPrefix, "accounts_by_type", collections.BytesKey, collections.StringValue),
AccountByNumber: collections.NewMap(sb, AccountByNumber, "account_by_number", collections.BytesKey, collections.Uint64Value),
AccountsState: collections.NewMap(sb, implementation.AccountStatePrefix, "accounts_state", collections.BytesKey, collections.BytesValue),
}
schema, err := sb.Build()
@@ -109,12 +102,13 @@ func NewKeeper(
type Keeper struct {
// deps coming from the runtime
storeService store.KVStoreService
eventService event.Service
addressCodec address.Codec
getSenderFunc func(msg proto.Message) ([]byte, error)
execModuleFunc implementation.ModuleExecFunc
queryModuleFunc implementation.ModuleQueryFunc
storeService store.KVStoreService
eventService event.Service
addressCodec address.Codec
branchExecutor BranchExecutor
msgRouter MsgRouter
signerProvider SignerProvider
queryRouter QueryRouter
accounts map[string]implementation.Implementation
@@ -124,6 +118,8 @@ type Keeper struct {
AccountNumber collections.Sequence
// AccountsByType maps account address to their implementation.
AccountsByType collections.Map[[]byte, string]
// AccountByNumber maps account number to their address.
AccountByNumber collections.Map[[]byte, uint64]
// AccountsState keeps track of the state of each account.
// NOTE: this is only used for genesis import and export.
@@ -144,8 +140,14 @@ func (k Keeper) Init(
return nil, nil, err
}
// get the next account number
num, err := k.AccountNumber.Next(ctx)
if err != nil {
return nil, nil, err
}
// make a new account address
accountAddr, err := k.makeAddress(ctx)
accountAddr, err := k.makeAddress(num)
if err != nil {
return nil, nil, err
}
@@ -161,6 +163,10 @@ func (k Keeper) Init(
if err := k.AccountsByType.Set(ctx, accountAddr, accountType); err != nil {
return nil, nil, err
}
// map account number to account address
if err := k.AccountByNumber.Set(ctx, accountAddr, num); err != nil {
return nil, nil, err
}
return resp, accountAddr, nil
}
@@ -225,14 +231,9 @@ func (k Keeper) getImplementation(accountType string) (implementation.Implementa
return impl, nil
}
func (k Keeper) makeAddress(ctx context.Context) ([]byte, error) {
num, err := k.AccountNumber.Next(ctx)
if err != nil {
return nil, err
}
func (k Keeper) makeAddress(accNum uint64) ([]byte, error) {
// TODO: better address scheme, ref: https://github.com/cosmos/cosmos-sdk/issues/17516
addr := sha256.Sum256(append([]byte("x/accounts"), binary.BigEndian.AppendUint64(nil, num)...))
addr := sha256.Sum256(append([]byte("x/accounts"), binary.BigEndian.AppendUint64(nil, accNum)...))
return addr[:], nil
}
@@ -245,9 +246,9 @@ func (k Keeper) makeAccountContext(ctx context.Context, accountAddr, sender []by
k.storeService,
accountAddr,
sender,
k.getSenderFunc,
k.execModuleFunc,
k.queryModuleFunc,
k.sendModuleMessage,
k.sendModuleMessageUntyped,
k.queryModule,
)
}
@@ -258,16 +259,97 @@ func (k Keeper) makeAccountContext(ctx context.Context, accountAddr, sender []by
k.storeService,
accountAddr,
nil,
func(_ proto.Message) ([]byte, error) {
return nil, fmt.Errorf("cannot get sender from query")
func(ctx context.Context, sender []byte, msg, msgResp proto.Message) error {
return fmt.Errorf("cannot execute in query context")
},
func(ctx context.Context, msg, msgResp protoiface.MessageV1) error {
return fmt.Errorf("cannot execute module from a query execution context")
func(ctx context.Context, sender []byte, msg proto.Message) (proto.Message, error) {
return nil, fmt.Errorf("cannot execute in query context")
},
k.queryModuleFunc,
k.queryModule,
)
}
// sendAnyMessages it a helper function that executes untyped anypb.Any messages
// The messages must all belong to a module.
func (k Keeper) sendAnyMessages(ctx context.Context, sender []byte, anyMessages []*anypb.Any) ([]*anypb.Any, error) {
anyResponses := make([]*anypb.Any, len(anyMessages))
for i := range anyMessages {
msg, err := anyMessages[i].UnmarshalNew()
if err != nil {
return nil, err
}
resp, err := k.sendModuleMessageUntyped(ctx, sender, msg)
if err != nil {
return nil, fmt.Errorf("failed to execute message %d: %s", i, err.Error())
}
anyResp, err := implementation.PackAny(resp)
if err != nil {
return nil, err
}
anyResponses[i] = anyResp
}
return anyResponses, nil
}
// sendModuleMessageUntyped can be used to send a message towards a module.
// It should be used when the response type is not known by the caller.
func (k Keeper) sendModuleMessageUntyped(ctx context.Context, sender []byte, msg proto.Message) (proto.Message, error) {
// we need to fetch the response type from the request message type.
// this is because the response type is not known.
respName := k.msgRouter.ResponseNameByRequestName(string(msg.ProtoReflect().Descriptor().FullName()))
if respName == "" {
return nil, fmt.Errorf("could not find response type for message %T", msg)
}
// get response type
respType, err := protoregistry.GlobalTypes.FindMessageByName(protoreflect.FullName(respName))
if err != nil {
return nil, err
}
resp := respType.New().Interface()
// send the message
return resp, k.sendModuleMessage(ctx, sender, msg, resp)
}
// sendModuleMessage can be used to send a message towards a module. It expects the
// response type to be known by the caller. It will also assert the sender has the right
// is not trying to impersonate another account.
func (k Keeper) sendModuleMessage(ctx context.Context, sender []byte, msg, msgResp proto.Message) error {
// do sender assertions.
wantSenders, err := k.signerProvider.GetSigners(msg)
if err != nil {
return fmt.Errorf("cannot get signers: %w", err)
}
if len(wantSenders) != 1 {
return fmt.Errorf("expected only one signer, got %d", len(wantSenders))
}
if !bytes.Equal(sender, wantSenders[0]) {
return fmt.Errorf("%w: sender does not match expected sender", ErrUnauthorized)
}
msgV1, msgRespV1 := msg.(protoiface.MessageV1), msgResp.(protoiface.MessageV1)
messageName := getMessageName(msgV1)
handler := k.msgRouter.HybridHandlerByMsgName(messageName)
if handler == nil {
return fmt.Errorf("unknown message: %s", messageName)
}
return handler(ctx, msgV1, msgRespV1)
}
// queryModule is the entrypoint for an account to query a module.
// It will try to find the query handler for the given query and execute it.
// If multiple query handlers are found, it will return an error.
func (k Keeper) queryModule(ctx context.Context, queryReq, queryResp proto.Message) error {
queryReqV1, queryRespV1 := queryReq.(protoiface.MessageV1), queryResp.(protoiface.MessageV1)
queryName := getMessageName(queryReqV1)
handlers := k.queryRouter.HybridHandlerByRequestName(queryName)
if len(handlers) == 0 {
return fmt.Errorf("unknown query: %s", queryName)
}
if len(handlers) > 1 {
return fmt.Errorf("multiple handlers for query: %s", queryName)
}
return handlers[0](ctx, queryReqV1, queryRespV1)
}
func getMessageName(msg protoiface.MessageV1) string {
return codectypes.MsgTypeURL(msg)[1:]
}
+236
View File
@@ -0,0 +1,236 @@
package accounts
import (
"context"
"errors"
"fmt"
"google.golang.org/protobuf/types/known/anypb"
account_abstractionv1 "cosmossdk.io/api/cosmos/accounts/interfaces/account_abstraction/v1"
accountsv1 "cosmossdk.io/api/cosmos/accounts/v1"
"cosmossdk.io/x/accounts/internal/implementation"
)
var (
// ErrAuthentication is returned when the authentication fails.
ErrAuthentication = errors.New("authentication failed")
// ErrBundlerPayment is returned when the bundler payment fails.
ErrBundlerPayment = errors.New("bundler payment failed")
// ErrExecution is returned when the execution fails.
ErrExecution = errors.New("execution failed")
)
// ExecuteUserOperation handles the execution of an abstracted account UserOperation.
func (k Keeper) ExecuteUserOperation(
ctx context.Context,
bundler string,
op *accountsv1.UserOperation,
) *accountsv1.UserOperationResponse {
resp := &accountsv1.UserOperationResponse{}
// authenticate
authGas, err := k.Authenticate(ctx, bundler, op)
resp.AuthenticationGasUsed = authGas
if err != nil {
resp.Error = err.Error()
return resp
}
resp.AuthenticationGasUsed = authGas
// pay bundler
bundlerPayGas, bundlerPayResp, err := k.PayBundler(ctx, bundler, op)
resp.BundlerPaymentGasUsed = bundlerPayGas
if err != nil {
resp.Error = err.Error()
return resp
}
resp.BundlerPaymentResponses = bundlerPayResp
// execute messages, the real operation intent
executeGas, executeResp, err := k.OpExecuteMessages(ctx, bundler, op)
resp.ExecutionGasUsed = executeGas
if err != nil {
resp.Error = err.Error()
return resp
}
resp.ExecutionResponses = executeResp
// done!
return resp
}
// Authenticate handles the authentication flow of an abstracted account.
// Authentication happens in an isolated context with the authentication gas limit.
// If the authentication is successful, then the state is committed.
func (k Keeper) Authenticate(
ctx context.Context,
bundler string,
op *accountsv1.UserOperation,
) (gasUsed uint64, err error) {
// authenticate
gasUsed, err = k.branchExecutor.ExecuteWithGasLimit(ctx, op.AuthenticationGasLimit, func(ctx context.Context) error {
return k.authenticate(ctx, bundler, op)
})
if err != nil {
return gasUsed, fmt.Errorf("%v: %w", ErrAuthentication, err)
}
return gasUsed, nil
}
// authenticate handles the authentication flow of an abstracted account.
func (k Keeper) authenticate(
ctx context.Context,
bundler string,
op *accountsv1.UserOperation,
) error {
senderAddr, err := k.addressCodec.StringToBytes(op.Sender)
if err != nil {
return err
}
// create an isolated context in which we execute authentication
// without affecting the parent context and with the authentication gas limit.
_, err = k.Execute(ctx, senderAddr, ModuleAccountAddress, &account_abstractionv1.MsgAuthenticate{
Bundler: bundler,
UserOperation: op,
})
return err
}
// OpExecuteMessages handles the execution of the messages in a given v1.UserOperation.
// It executes in an isolated branch, in an atomic way, if all the messages pass then
// the execution is deemed successful and the state is committed.
// An account abstraction implementer can choose to handle execution messages or not,
// if it does not expose the execution messages method, then this method will simply
// execute the provided messages on behalf of the sender and return.
func (k Keeper) OpExecuteMessages(
ctx context.Context,
bundler string,
op *accountsv1.UserOperation,
) (gasUsed uint64, responses []*anypb.Any, err error) {
// execute messages, the real operation intent
gasUsed, err = k.branchExecutor.ExecuteWithGasLimit(ctx, op.ExecutionGasLimit, func(ctx context.Context) error {
responses, err = k.opExecuteMessages(ctx, bundler, op)
return err
})
if err != nil {
return gasUsed, nil, fmt.Errorf("%v: %w", ErrExecution, err)
}
return gasUsed, responses, nil
}
func (k Keeper) opExecuteMessages(
ctx context.Context,
bundler string,
op *accountsv1.UserOperation,
) (messagesResponse []*anypb.Any, err error) {
senderAddr, err := k.addressCodec.StringToBytes(op.Sender)
if err != nil {
return nil, err
}
resp, err := k.Execute(ctx, senderAddr, ModuleAccountAddress, &account_abstractionv1.MsgExecute{
Bundler: bundler,
ExecutionMessages: op.ExecutionMessages,
})
// here is where we check if the account handles execution messages
// if it does not, then we simply execute the provided messages on behalf of the sender
switch {
case err == nil:
// all is ok, so parse responses.
executeResp, err := parseExecuteResponse(resp)
return executeResp, err
case implementation.IsRoutingError(err):
// if it is a routing error, it means the account does not handle execution messages,
// in this case we attempt to execute the provided messages on behalf of the op sender.
return k.sendAnyMessages(ctx, senderAddr, op.ExecutionMessages)
default:
// some other error
return nil, err
}
}
// PayBundler handles the payment of the bundler in a given v1.UserOperation.
// Must be called after Authenticate.
// It gets executed in an isolated context with the bundler payment gas limit.
// If the payment is successful, then the state is committed.
// Since for an abstracted account the bundler payment method is optional,
// if the account does not handle bundler payment messages, then this method
// will simply execute the provided messages on behalf of the sender and return.
func (k Keeper) PayBundler(
ctx context.Context,
bundler string,
op *accountsv1.UserOperation,
) (gasUsed uint64, responses []*anypb.Any, err error) {
// pay bundler
gasUsed, err = k.branchExecutor.ExecuteWithGasLimit(ctx, op.BundlerPaymentGasLimit, func(ctx context.Context) error {
responses, err = k.payBundler(ctx, bundler, op)
return err
})
if err != nil {
return gasUsed, nil, fmt.Errorf("%v: %w", ErrBundlerPayment, err)
}
return gasUsed, responses, nil
}
func (k Keeper) payBundler(
ctx context.Context,
bundler string,
op *accountsv1.UserOperation,
) (paymentResponses []*anypb.Any, err error) {
// if messages are empty, then there is nothing to do
if len(op.BundlerPaymentMessages) == 0 {
return nil, nil
}
// pay bundler
senderAddr, err := k.addressCodec.StringToBytes(op.Sender)
if err != nil {
return nil, err
}
resp, err := k.Execute(ctx, senderAddr, ModuleAccountAddress, &account_abstractionv1.MsgPayBundler{
Bundler: bundler,
BundlerPaymentMessages: op.BundlerPaymentMessages,
})
// here is where we check if the account handles bundler payment messages
// if it does not, then we simply execute the provided messages on behalf of the sender
switch {
case err == nil:
// if no error, execution went fine, so parse responses.
payBundlerResp, err := parsePayBundlerResponse(resp)
return payBundlerResp, err
case implementation.IsRoutingError(err):
// if we get a routing message error it means the account does not handle bundler payment messages,
// in this case we attempt to execute the provided messages on behalf of the op sender.
return k.sendAnyMessages(ctx, senderAddr, op.BundlerPaymentMessages)
default:
// some other execution error.
return nil, err
}
}
// parsePayBundlerResponse parses the bundler response as any into a slice of
// responses on payment messages.
func parsePayBundlerResponse(resp any) ([]*anypb.Any, error) {
payBundlerResp, ok := resp.(*account_abstractionv1.MsgPayBundlerResponse)
// this means the account does not properly implement account abstraction.
if payBundlerResp == nil {
return nil, fmt.Errorf("account does not implement account abstraction correctly: wanted %T, got nil", &account_abstractionv1.MsgPayBundlerResponse{})
}
if !ok {
return nil, fmt.Errorf("account does not implement account abstraction correctly: wanted %T, got %T", &account_abstractionv1.MsgPayBundlerResponse{}, resp)
}
return payBundlerResp.BundlerPaymentMessagesResponse, nil
}
// parseExecuteResponse parses the execute response as any into a slice of
// responses on execution messages.
func parseExecuteResponse(resp any) ([]*anypb.Any, error) {
executeResp, ok := resp.(*account_abstractionv1.MsgExecuteResponse)
// this means the account does not properly implement account abstraction.
if executeResp == nil {
return nil, fmt.Errorf("account does not implement account abstraction correctly: wanted %T, got nil", &account_abstractionv1.MsgExecuteResponse{})
}
if !ok {
return nil, fmt.Errorf("account does not implement account abstraction correctly: wanted %T, got %T", &account_abstractionv1.MsgExecuteResponse{}, resp)
}
return executeResp.ExecutionMessagesResponse, nil
}
+12 -46
View File
@@ -6,58 +6,24 @@ import (
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/runtime/protoiface"
"google.golang.org/protobuf/types/known/emptypb"
"google.golang.org/protobuf/types/known/wrapperspb"
bankv1beta1 "cosmossdk.io/api/cosmos/bank/v1beta1"
basev1beta1 "cosmossdk.io/api/cosmos/base/v1beta1"
"cosmossdk.io/collections"
"cosmossdk.io/collections/colltest"
"cosmossdk.io/core/address"
"cosmossdk.io/core/event"
"cosmossdk.io/x/accounts/accountstd"
"cosmossdk.io/x/accounts/internal/implementation"
)
var _ address.Codec = (*addressCodec)(nil)
type addressCodec struct{}
func (a addressCodec) StringToBytes(text string) ([]byte, error) { return []byte(text), nil }
func (a addressCodec) BytesToString(bz []byte) (string, error) { return string(bz), nil }
type eventService struct{}
func (e eventService) Emit(ctx context.Context, event protoiface.MessageV1) error { return nil }
func (e eventService) EmitKV(ctx context.Context, eventType string, attrs ...event.Attribute) error {
return nil
}
func (e eventService) EmitNonConsensus(ctx context.Context, event protoiface.MessageV1) error {
return nil
}
func (e eventService) EventManager(ctx context.Context) event.Manager { return e }
func newKeeper(t *testing.T, accounts ...implementation.AccountCreatorFunc) (Keeper, context.Context) {
t.Helper()
ss, ctx := colltest.MockStore()
m, err := NewKeeper(ss, eventService{}, addressCodec{}, nil, nil, nil, accounts...)
require.NoError(t, err)
return m, ctx
}
func TestKeeper_Init(t *testing.T) {
m, ctx := newKeeper(t, accountstd.AddAccount("test", NewTestAccount))
m.queryModuleFunc = func(ctx context.Context, req, resp protoiface.MessageV1) error {
m.queryRouter = mockQuery(func(ctx context.Context, req, resp proto.Message) error {
_, ok := req.(*bankv1beta1.QueryBalanceRequest)
require.True(t, ok)
_, ok = resp.(*bankv1beta1.QueryBalanceResponse)
require.True(t, ok)
return nil
}
})
t.Run("ok", func(t *testing.T) {
sender := []byte("sender")
@@ -86,7 +52,7 @@ func TestKeeper_Init(t *testing.T) {
func TestKeeper_Execute(t *testing.T) {
m, ctx := newKeeper(t, accountstd.AddAccount("test", NewTestAccount))
m.queryModuleFunc = func(ctx context.Context, req, resp protoiface.MessageV1) error { return nil }
m.queryRouter = mockQuery(func(ctx context.Context, req, resp proto.Message) error { return nil })
// create account
sender := []byte("sender")
@@ -105,19 +71,19 @@ func TestKeeper_Execute(t *testing.T) {
})
t.Run("exec module", func(t *testing.T) {
m.execModuleFunc = func(ctx context.Context, msg, msgResp protoiface.MessageV1) error {
m.msgRouter = mockExec(func(ctx context.Context, msg, msgResp proto.Message) error {
concrete, ok := msg.(*bankv1beta1.MsgSend)
require.True(t, ok)
require.Equal(t, concrete.ToAddress, "recipient")
_, ok = msgResp.(*bankv1beta1.MsgSendResponse)
require.True(t, ok)
return nil
}
})
m.getSenderFunc = func(msg proto.Message) ([]byte, error) {
m.signerProvider = mockSigner(func(msg proto.Message) ([]byte, error) {
require.Equal(t, msg.(*bankv1beta1.MsgSend).FromAddress, string(accAddr))
return accAddr, nil
}
})
resp, err := m.Execute(ctx, accAddr, sender, &wrapperspb.Int64Value{Value: 1000})
require.NoError(t, err)
@@ -127,9 +93,9 @@ func TestKeeper_Execute(t *testing.T) {
func TestKeeper_Query(t *testing.T) {
m, ctx := newKeeper(t, accountstd.AddAccount("test", NewTestAccount))
m.queryModuleFunc = func(ctx context.Context, req, resp protoiface.MessageV1) error {
m.queryRouter = mockQuery(func(ctx context.Context, req, resp proto.Message) error {
return nil
}
})
// create account
sender := []byte("sender")
@@ -150,7 +116,7 @@ func TestKeeper_Query(t *testing.T) {
t.Run("query module", func(t *testing.T) {
// we inject the module query function, which accepts only a specific type of message
// we force the response
m.queryModuleFunc = func(ctx context.Context, req, resp protoiface.MessageV1) error {
m.queryRouter = mockQuery(func(ctx context.Context, req, resp proto.Message) error {
concrete, ok := req.(*bankv1beta1.QueryBalanceRequest)
require.True(t, ok)
require.Equal(t, string(accAddr), concrete.Address)
@@ -159,9 +125,9 @@ func TestKeeper_Query(t *testing.T) {
Denom: "atom",
Amount: "1000",
}}
proto.Merge(resp.(proto.Message), copyResp)
proto.Merge(resp, copyResp)
return nil
}
})
resp, err := m.Query(ctx, accAddr, wrapperspb.String("atom"))
require.NoError(t, err)
+4
View File
@@ -14,6 +14,7 @@ import (
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/codec/types"
"github.com/cosmos/cosmos-sdk/types/address"
"github.com/cosmos/cosmos-sdk/types/module"
"github.com/cosmos/cosmos-sdk/types/msgservice"
)
@@ -23,6 +24,9 @@ const (
StoreKey = "_" + ModuleName // unfortunately accounts collides with auth store key
)
// ModuleAccountAddress defines the x/accounts module address.
var ModuleAccountAddress = address.Module(ModuleName)
const (
ConsensusVersion = 1
)
+1 -1
View File
@@ -121,5 +121,5 @@ func (m msgServer) Execute(ctx context.Context, execute *v1.MsgExecute) (*v1.Msg
}
func (m msgServer) ExecuteBundle(ctx context.Context, req *v1.MsgExecuteBundle) (*v1.MsgExecuteBundleResponse, error) {
return nil, status.New(codes.Unimplemented, "not implemented").Err()
return nil, status.Error(codes.Unimplemented, "not implemented")
}
+3 -4
View File
@@ -6,7 +6,6 @@ import (
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/runtime/protoiface"
"google.golang.org/protobuf/types/known/anypb"
"google.golang.org/protobuf/types/known/emptypb"
"google.golang.org/protobuf/types/known/wrapperspb"
@@ -18,12 +17,12 @@ import (
func TestMsgServer(t *testing.T) {
k, ctx := newKeeper(t, accountstd.AddAccount("test", NewTestAccount))
k.queryModuleFunc = func(ctx context.Context, req, resp protoiface.MessageV1) error {
k.queryRouter = mockQuery(func(ctx context.Context, req, resp proto.Message) error {
_, ok := req.(*bankv1beta1.QueryBalanceRequest)
require.True(t, ok)
proto.Merge(resp.(proto.Message), &bankv1beta1.QueryBalanceResponse{})
proto.Merge(resp, &bankv1beta1.QueryBalanceResponse{})
return nil
}
})
s := NewMsgServer(k)
+2 -3
View File
@@ -6,7 +6,6 @@ import (
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/runtime/protoiface"
"google.golang.org/protobuf/types/known/anypb"
"google.golang.org/protobuf/types/known/emptypb"
"google.golang.org/protobuf/types/known/wrapperspb"
@@ -17,9 +16,9 @@ import (
func TestQueryServer(t *testing.T) {
k, ctx := newKeeper(t, accountstd.AddAccount("test", NewTestAccount))
k.queryModuleFunc = func(ctx context.Context, req, resp protoiface.MessageV1) error {
k.queryRouter = mockQuery(func(ctx context.Context, req, resp proto.Message) error {
return nil
}
})
ms := NewMsgServer(k)
qs := NewQueryServer(k)
@@ -0,0 +1,77 @@
package account_abstraction
import (
"context"
"fmt"
account_abstractionv1 "cosmossdk.io/api/cosmos/accounts/interfaces/account_abstraction/v1"
"cosmossdk.io/x/accounts/accountstd"
)
// FullAbstractedAccount is an account abstraction that implements
// the account abstraction interface fully. It is used for testing.
type FullAbstractedAccount struct {
m *MinimalAbstractedAccount
}
func NewFullAbstractedAccount(d accountstd.Dependencies) (FullAbstractedAccount, error) {
m, err := NewMinimalAbstractedAccount(d)
if err != nil {
return FullAbstractedAccount{}, err
}
return FullAbstractedAccount{m: &m}, nil
}
func (a FullAbstractedAccount) ExecuteMessages(ctx context.Context, msg *account_abstractionv1.MsgExecute) (*account_abstractionv1.MsgExecuteResponse, error) {
// we always want to ensure that this is called by the x/accounts module, it's the only trusted entrypoint.
// if we do not do this check then someone could call this method directly and bypass the authentication.
if !accountstd.SenderIsAccountsModule(ctx) {
return nil, fmt.Errorf("sender is not the x/accounts module")
}
// we simulate this account does not allow delegation messages to be executed.
for _, m := range msg.ExecutionMessages {
if m.TypeUrl == "/cosmos.staking.v1beta1.MsgDelegate" { // NOTE: this is not a safe way to check the typeUrl, it's just for testing.
return nil, fmt.Errorf("this account does not allow delegation messages")
}
}
// execute messages
responses, err := accountstd.ExecModuleAnys(ctx, msg.ExecutionMessages)
if err != nil {
return nil, err
}
return &account_abstractionv1.MsgExecuteResponse{ExecutionMessagesResponse: responses}, nil
}
func (a FullAbstractedAccount) PayBundler(ctx context.Context, msg *account_abstractionv1.MsgPayBundler) (*account_abstractionv1.MsgPayBundlerResponse, error) {
// we always want to ensure that this is called by the x/accounts module, it's the only trusted entrypoint.
// if we do not do this check then someone could call this method directly and bypass the authentication.
if !accountstd.SenderIsAccountsModule(ctx) {
return nil, fmt.Errorf("sender is not the x/accounts module")
}
// we check if it's a bank send, if it is we reject it.
for _, m := range msg.BundlerPaymentMessages {
if m.TypeUrl == "/cosmos.bank.v1beta1.MsgSend" { // NOTE: this is not a safe way to check the typeUrl, it's just for testing.
return nil, fmt.Errorf("this account does not allow bank send messages")
}
}
// execute messages
responses, err := accountstd.ExecModuleAnys(ctx, msg.BundlerPaymentMessages)
if err != nil {
return nil, err
}
return &account_abstractionv1.MsgPayBundlerResponse{BundlerPaymentMessagesResponse: responses}, nil
}
func (a FullAbstractedAccount) RegisterInitHandler(builder *accountstd.InitBuilder) {
a.m.RegisterInitHandler(builder) // registers same init message as MinimalAbstractedAccount
}
func (a FullAbstractedAccount) RegisterExecuteHandlers(builder *accountstd.ExecuteBuilder) {
accountstd.RegisterExecuteHandler(builder, a.ExecuteMessages) // implements accounts_abstraction
accountstd.RegisterExecuteHandler(builder, a.PayBundler) // implements account_abstraction
a.m.RegisterExecuteHandlers(builder) // note: MinimalAbstractedAccount implements account_abstraction, and we're calling its RegisterExecuteHandlers
}
func (a FullAbstractedAccount) RegisterQueryHandlers(builder *accountstd.QueryBuilder) {
a.m.RegisterQueryHandlers(builder)
}
@@ -0,0 +1,70 @@
package account_abstraction
import (
"context"
"fmt"
account_abstractionv1 "cosmossdk.io/api/cosmos/accounts/interfaces/account_abstraction/v1"
rotationv1 "cosmossdk.io/api/cosmos/accounts/testing/rotation/v1"
"cosmossdk.io/api/cosmos/crypto/secp256k1"
"cosmossdk.io/collections"
"cosmossdk.io/x/accounts/accountstd"
"github.com/cosmos/cosmos-sdk/codec"
)
var (
PubKeyPrefix = collections.NewPrefix(0)
SequencePrefix = collections.NewPrefix(1)
)
var _ accountstd.Interface = (*MinimalAbstractedAccount)(nil)
func NewMinimalAbstractedAccount(d accountstd.Dependencies) (MinimalAbstractedAccount, error) {
return MinimalAbstractedAccount{
PubKey: collections.NewItem(d.SchemaBuilder, PubKeyPrefix, "pubkey", codec.CollValueV2[secp256k1.PubKey]()),
Sequence: collections.NewSequence(d.SchemaBuilder, SequencePrefix, "sequence"),
}, nil
}
// MinimalAbstractedAccount implements the Account interface.
// It implements the minimum required methods.
type MinimalAbstractedAccount struct {
PubKey collections.Item[*secp256k1.PubKey]
Sequence collections.Sequence
}
func (a MinimalAbstractedAccount) Init(ctx context.Context, msg *rotationv1.MsgInit) (*rotationv1.MsgInitResponse, error) {
return nil, a.PubKey.Set(ctx, &secp256k1.PubKey{Key: msg.PubKeyBytes})
}
func (a MinimalAbstractedAccount) RotatePubKey(ctx context.Context, msg *rotationv1.MsgRotatePubKey) (*rotationv1.MsgRotatePubKeyResponse, error) {
return nil, fmt.Errorf("not implemented")
}
// Authenticate authenticates the account, auth always passess.
func (a MinimalAbstractedAccount) Authenticate(ctx context.Context, msg *account_abstractionv1.MsgAuthenticate) (*account_abstractionv1.MsgAuthenticateResponse, error) {
if msg.UserOperation.AuthenticationMethod != "secp256k1" {
return nil, fmt.Errorf("authentication method not supported")
}
_, err := a.Sequence.Next(ctx)
return &account_abstractionv1.MsgAuthenticateResponse{}, err
}
// QueryAuthenticateMethods queries the authentication methods of the account.
func (a MinimalAbstractedAccount) QueryAuthenticateMethods(ctx context.Context, req *account_abstractionv1.QueryAuthenticationMethods) (*account_abstractionv1.QueryAuthenticationMethodsResponse, error) {
return nil, fmt.Errorf("not implemented")
}
func (a MinimalAbstractedAccount) RegisterInitHandler(builder *accountstd.InitBuilder) {
accountstd.RegisterInitHandler(builder, a.Init)
}
func (a MinimalAbstractedAccount) RegisterExecuteHandlers(builder *accountstd.ExecuteBuilder) {
accountstd.RegisterExecuteHandler(builder, a.RotatePubKey)
accountstd.RegisterExecuteHandler(builder, a.Authenticate) // implements account_abstraction
}
func (a MinimalAbstractedAccount) RegisterQueryHandlers(builder *accountstd.QueryBuilder) {
accountstd.RegisterQueryHandler(builder, a.QueryAuthenticateMethods) // implements account_abstraction
}
@@ -1,68 +0,0 @@
package account_abstraction
import (
"context"
"fmt"
account_abstractionv1 "cosmossdk.io/api/cosmos/accounts/interfaces/account_abstraction/v1"
rotationv1 "cosmossdk.io/api/cosmos/accounts/testing/rotation/v1"
"cosmossdk.io/api/cosmos/crypto/secp256k1"
"cosmossdk.io/collections"
"cosmossdk.io/x/accounts/accountstd"
"github.com/cosmos/cosmos-sdk/codec"
)
var (
PubKeyPrefix = collections.NewPrefix(0)
SequencePrefix = collections.NewPrefix(1)
)
var _ accountstd.Interface = (*PartialAccount)(nil)
func NewPartialAccount(d accountstd.Dependencies) (PartialAccount, error) {
return PartialAccount{
PubKey: collections.NewItem(d.SchemaBuilder, PubKeyPrefix, "pubkey", codec.CollValueV2[secp256k1.PubKey]()),
Sequence: collections.NewItem(d.SchemaBuilder, SequencePrefix, "sequence", collections.Uint64Value),
}, nil
}
// PartialAccount implements the Account interface. It also
// implements the account_abstraction interface, it only implements
// the minimum methods required to be a valid account_abstraction
// implementer.
type PartialAccount struct {
PubKey collections.Item[*secp256k1.PubKey]
Sequence collections.Item[uint64]
}
func (a PartialAccount) Init(ctx context.Context, msg *rotationv1.MsgInit) (*rotationv1.MsgInitResponse, error) {
return nil, fmt.Errorf("not implemented")
}
func (a PartialAccount) RotatePubKey(ctx context.Context, msg *rotationv1.MsgRotatePubKey) (*rotationv1.MsgRotatePubKeyResponse, error) {
return nil, fmt.Errorf("not implemented")
}
// Authenticate authenticates the account.
func (a PartialAccount) Authenticate(ctx context.Context, msg *account_abstractionv1.MsgAuthenticate) (*account_abstractionv1.MsgAuthenticateResponse, error) {
return nil, fmt.Errorf("not implemented")
}
// QueryAuthenticateMethods queries the authentication methods of the account.
func (a PartialAccount) QueryAuthenticateMethods(ctx context.Context, req *account_abstractionv1.QueryAuthenticationMethods) (*account_abstractionv1.QueryAuthenticationMethodsResponse, error) {
return nil, fmt.Errorf("not implemented")
}
func (a PartialAccount) RegisterInitHandler(builder *accountstd.InitBuilder) {
accountstd.RegisterInitHandler(builder, a.Init)
}
func (a PartialAccount) RegisterExecuteHandlers(builder *accountstd.ExecuteBuilder) {
accountstd.RegisterExecuteHandler(builder, a.RotatePubKey)
accountstd.RegisterExecuteHandler(builder, a.Authenticate) // implements account_abstraction
}
func (a PartialAccount) RegisterQueryHandlers(builder *accountstd.QueryBuilder) {
accountstd.RegisterQueryHandler(builder, a.QueryAuthenticateMethods) // implements account_abstraction
}
+80
View File
@@ -0,0 +1,80 @@
package accounts
import (
"context"
"testing"
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/runtime/protoiface"
"cosmossdk.io/collections/colltest"
"cosmossdk.io/core/address"
"cosmossdk.io/core/event"
"cosmossdk.io/x/accounts/internal/implementation"
)
var _ address.Codec = (*addressCodec)(nil)
type addressCodec struct{}
func (a addressCodec) StringToBytes(text string) ([]byte, error) { return []byte(text), nil }
func (a addressCodec) BytesToString(bz []byte) (string, error) { return string(bz), nil }
type eventService struct{}
func (e eventService) Emit(ctx context.Context, event protoiface.MessageV1) error { return nil }
func (e eventService) EmitKV(ctx context.Context, eventType string, attrs ...event.Attribute) error {
return nil
}
func (e eventService) EmitNonConsensus(ctx context.Context, event protoiface.MessageV1) error {
return nil
}
func (e eventService) EventManager(ctx context.Context) event.Manager { return e }
func newKeeper(t *testing.T, accounts ...implementation.AccountCreatorFunc) (Keeper, context.Context) {
t.Helper()
ss, ctx := colltest.MockStore()
m, err := NewKeeper(ss, eventService{}, nil, addressCodec{}, nil, nil, nil, accounts...)
require.NoError(t, err)
return m, ctx
}
var _ QueryRouter = (*mockQuery)(nil)
type mockQuery func(ctx context.Context, req, resp proto.Message) error
func (m mockQuery) HybridHandlerByRequestName(_ string) []func(ctx context.Context, req, resp protoiface.MessageV1) error {
return []func(ctx context.Context, req, resp protoiface.MessageV1) error{func(ctx context.Context, req, resp protoiface.MessageV1) error {
return m(ctx, req.(proto.Message), resp.(proto.Message))
}}
}
var _ SignerProvider = (*mockSigner)(nil)
type mockSigner func(msg proto.Message) ([]byte, error)
func (m mockSigner) GetSigners(msg proto.Message) ([][]byte, error) {
s, err := m(msg)
if err != nil {
return nil, err
}
return [][]byte{s}, nil
}
var _ MsgRouter = (*mockExec)(nil)
type mockExec func(ctx context.Context, msg, msgResp proto.Message) error
func (m mockExec) HybridHandlerByMsgName(_ string) func(ctx context.Context, req, resp protoiface.MessageV1) error {
return func(ctx context.Context, req, resp protoiface.MessageV1) error {
return m(ctx, req.(proto.Message), resp.(proto.Message))
}
}
func (m mockExec) ResponseNameByRequestName(name string) string {
return name + "Response"
}
+99 -79
View File
@@ -35,12 +35,9 @@ type UserOperation struct {
// authentication_data defines the authentication data associated with the authentication method.
// It is the account implementer duty to assess that the UserOperation is properly signed.
AuthenticationData []byte `protobuf:"bytes,3,opt,name=authentication_data,json=authenticationData,proto3" json:"authentication_data,omitempty"`
// sequence defines the sequence number of the account, the authentication method might require this
// to ensure non-replayability.
Sequence uint64 `protobuf:"varint,4,opt,name=sequence,proto3" json:"sequence,omitempty"`
// authentication_gas_limit expresses the gas limit to be used for the authentication part of the
// UserOperation.
AuthenticationGasLimit uint64 `protobuf:"varint,5,opt,name=authentication_gas_limit,json=authenticationGasLimit,proto3" json:"authentication_gas_limit,omitempty"`
AuthenticationGasLimit uint64 `protobuf:"varint,4,opt,name=authentication_gas_limit,json=authenticationGasLimit,proto3" json:"authentication_gas_limit,omitempty"`
// bundler_payment_messages expresses a list of messages that the account
// executes to pay the bundler for submitting the UserOperation.
// It can be empty if the bundler does not need any form of payment,
@@ -50,18 +47,18 @@ type UserOperation struct {
// - NFT payment
// - IBC Token payment.
// - Payment through delegations.
BundlerPaymentMessages []*types.Any `protobuf:"bytes,6,rep,name=bundler_payment_messages,json=bundlerPaymentMessages,proto3" json:"bundler_payment_messages,omitempty"`
BundlerPaymentMessages []*types.Any `protobuf:"bytes,5,rep,name=bundler_payment_messages,json=bundlerPaymentMessages,proto3" json:"bundler_payment_messages,omitempty"`
// bundler_payment_gas_limit defines the gas limit to be used for the bundler payment.
// This ensures that, since the bundler executes a list of UserOperations and there needs to
// be minimal trust between bundler and UserOperation sender, the sender cannot consume
// the whole bundle gas.
BundlerPaymentGasLimit uint64 `protobuf:"varint,7,opt,name=bundler_payment_gas_limit,json=bundlerPaymentGasLimit,proto3" json:"bundler_payment_gas_limit,omitempty"`
BundlerPaymentGasLimit uint64 `protobuf:"varint,6,opt,name=bundler_payment_gas_limit,json=bundlerPaymentGasLimit,proto3" json:"bundler_payment_gas_limit,omitempty"`
// execution_messages expresses a list of messages that the account wants to execute.
// This concretely is the intent of the transaction expressed as a UserOperation.
ExecutionMessages []*types.Any `protobuf:"bytes,8,rep,name=execution_messages,json=executionMessages,proto3" json:"execution_messages,omitempty"`
ExecutionMessages []*types.Any `protobuf:"bytes,7,rep,name=execution_messages,json=executionMessages,proto3" json:"execution_messages,omitempty"`
// execution_gas_limit defines the gas limit to be used for the execution of the UserOperation's
// execution messages.
ExecutionGasLimit uint64 `protobuf:"varint,9,opt,name=execution_gas_limit,json=executionGasLimit,proto3" json:"execution_gas_limit,omitempty"`
ExecutionGasLimit uint64 `protobuf:"varint,8,opt,name=execution_gas_limit,json=executionGasLimit,proto3" json:"execution_gas_limit,omitempty"`
}
func (m *UserOperation) Reset() { *m = UserOperation{} }
@@ -118,13 +115,6 @@ func (m *UserOperation) GetAuthenticationData() []byte {
return nil
}
func (m *UserOperation) GetSequence() uint64 {
if m != nil {
return m.Sequence
}
return 0
}
func (m *UserOperation) GetAuthenticationGasLimit() uint64 {
if m != nil {
return m.AuthenticationGasLimit
@@ -161,6 +151,7 @@ func (m *UserOperation) GetExecutionGasLimit() uint64 {
}
// UserOperationResponse defines the response of a UserOperation.
// If the operation fails the error field will be populated.
type UserOperationResponse struct {
// authentication_gas_used defines the gas used for the authentication part of the UserOperation.
AuthenticationGasUsed uint64 `protobuf:"varint,1,opt,name=authentication_gas_used,json=authenticationGasUsed,proto3" json:"authentication_gas_used,omitempty"`
@@ -173,6 +164,12 @@ type UserOperationResponse struct {
ExecutionGasUsed uint64 `protobuf:"varint,4,opt,name=execution_gas_used,json=executionGasUsed,proto3" json:"execution_gas_used,omitempty"`
// execution_responses defines the responses of the execution messages.
ExecutionResponses []*types.Any `protobuf:"bytes,5,rep,name=execution_responses,json=executionResponses,proto3" json:"execution_responses,omitempty"`
// error defines the error that occurred during the execution of the UserOperation.
// If the error is not empty, the UserOperation failed.
// Other fields might be populated even if the error is not empty, for example
// if the operation fails after the authentication step, the authentication_gas_used
// field will be populated.
Error string `protobuf:"bytes,6,opt,name=error,proto3" json:"error,omitempty"`
}
func (m *UserOperationResponse) Reset() { *m = UserOperationResponse{} }
@@ -243,6 +240,13 @@ func (m *UserOperationResponse) GetExecutionResponses() []*types.Any {
return nil
}
func (m *UserOperationResponse) GetError() string {
if m != nil {
return m.Error
}
return ""
}
func init() {
proto.RegisterType((*UserOperation)(nil), "cosmos.accounts.v1.UserOperation")
proto.RegisterType((*UserOperationResponse)(nil), "cosmos.accounts.v1.UserOperationResponse")
@@ -253,36 +257,36 @@ func init() {
}
var fileDescriptor_9f9bcc910ad46d4b = []byte{
// 463 bytes of a gzipped FileDescriptorProto
// 461 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x93, 0xcd, 0x6e, 0xd3, 0x40,
0x14, 0x85, 0xe3, 0x24, 0x0d, 0xed, 0x00, 0x12, 0x4c, 0x9b, 0x74, 0x9a, 0x85, 0x15, 0x75, 0x95,
0x45, 0x35, 0x56, 0x29, 0xe2, 0x67, 0xc9, 0x9f, 0xd8, 0x50, 0xa8, 0x2c, 0x75, 0xc3, 0xc6, 0x9a,
0xd8, 0x97, 0xd4, 0x22, 0x9e, 0x09, 0xbe, 0xe3, 0xaa, 0x79, 0x0b, 0x1e, 0x8b, 0x1d, 0x5d, 0xb2,
0x44, 0xc9, 0x8b, 0xa0, 0xcc, 0xf8, 0x27, 0x8e, 0x51, 0x76, 0x19, 0xdd, 0x73, 0xee, 0x39, 0xf9,
0xc6, 0x43, 0xce, 0x42, 0x85, 0x89, 0x42, 0x4f, 0x84, 0xa1, 0xca, 0xa4, 0x46, 0xef, 0xf6, 0xbc,
0xf8, 0x1d, 0x88, 0x09, 0xea, 0x54, 0x84, 0x3a, 0x56, 0x92, 0xcf, 0x53, 0xa5, 0x15, 0xa5, 0x56,
0xcd, 0x0b, 0x35, 0xbf, 0x3d, 0x1f, 0x9e, 0x4c, 0x95, 0x9a, 0xce, 0xc0, 0x33, 0x8a, 0x49, 0xf6,
0xcd, 0x13, 0x72, 0x61, 0xe5, 0xa7, 0xab, 0x0e, 0x79, 0x7c, 0x8d, 0x90, 0x7e, 0x99, 0x43, 0x2a,
0xd6, 0x6b, 0xe8, 0x80, 0xf4, 0x10, 0x64, 0x04, 0x29, 0x73, 0x46, 0xce, 0xf8, 0xc0, 0xcf, 0x4f,
0xf4, 0x82, 0xf4, 0x45, 0xa6, 0x6f, 0x40, 0xea, 0x38, 0x34, 0xca, 0x20, 0x01, 0x7d, 0xa3, 0x22,
0xd6, 0x36, 0xb2, 0xa3, 0xfa, 0xf0, 0xd2, 0xcc, 0xa8, 0x47, 0x0e, 0xb7, 0x4c, 0x91, 0xd0, 0x82,
0x75, 0x46, 0xce, 0xf8, 0x91, 0x4f, 0xeb, 0xa3, 0xf7, 0x42, 0x0b, 0x3a, 0x24, 0xfb, 0x08, 0x3f,
0x32, 0x90, 0x21, 0xb0, 0xee, 0xc8, 0x19, 0x77, 0xfd, 0xf2, 0x4c, 0x5f, 0x11, 0xb6, 0xb5, 0x6c,
0x2a, 0x30, 0x98, 0xc5, 0x49, 0xac, 0xd9, 0x9e, 0xd1, 0x0e, 0xea, 0xf3, 0x8f, 0x02, 0x3f, 0xad,
0xa7, 0xf4, 0x33, 0x61, 0x93, 0x4c, 0x46, 0x33, 0x48, 0x83, 0xb9, 0x58, 0x24, 0x20, 0x75, 0x90,
0x00, 0xa2, 0x98, 0x02, 0xb2, 0xde, 0xa8, 0x33, 0x7e, 0xf8, 0xec, 0x88, 0x5b, 0x46, 0xbc, 0x60,
0xc4, 0xdf, 0xc8, 0x85, 0x3f, 0xc8, 0x5d, 0x57, 0xd6, 0x74, 0x99, 0x7b, 0xe8, 0x6b, 0x72, 0xb2,
0xbd, 0xaf, 0xaa, 0xf2, 0xc0, 0x56, 0xa9, 0x5b, 0xcb, 0x2a, 0xef, 0x08, 0x85, 0x3b, 0x08, 0xb3,
0x9c, 0x60, 0x5e, 0x62, 0x7f, 0x47, 0x89, 0xa7, 0xa5, 0xbe, 0xcc, 0xe7, 0xe4, 0xb0, 0x5a, 0x52,
0x25, 0x1f, 0x98, 0xe4, 0x4a, 0x5f, 0x84, 0x9e, 0xfe, 0x6e, 0x93, 0x7e, 0xed, 0x96, 0x7d, 0xc0,
0xb9, 0x92, 0x08, 0xf4, 0x05, 0x39, 0xfe, 0x0f, 0xd3, 0x0c, 0x21, 0x32, 0xd7, 0xdf, 0xf5, 0xfb,
0x0d, 0xa4, 0xd7, 0x08, 0x11, 0x7d, 0xd9, 0x24, 0x5a, 0x1a, 0xdb, 0xd6, 0xd8, 0x00, 0x60, 0x8c,
0x57, 0x4d, 0x74, 0x69, 0x5e, 0x06, 0x59, 0x67, 0x07, 0x86, 0xe3, 0xfa, 0xbe, 0xe2, 0x1f, 0x20,
0x3d, 0xdb, 0x24, 0x5a, 0x96, 0xb0, 0x1f, 0xcf, 0x93, 0x4d, 0x16, 0x26, 0xff, 0xc3, 0x26, 0xba,
0x2a, 0x79, 0x6f, 0x47, 0x72, 0xb5, 0xbe, 0x0c, 0x7d, 0xfb, 0xfc, 0xd7, 0xd2, 0x75, 0xee, 0x97,
0xae, 0xf3, 0x77, 0xe9, 0x3a, 0x3f, 0x57, 0x6e, 0xeb, 0x7e, 0xe5, 0xb6, 0xfe, 0xac, 0xdc, 0xd6,
0xd7, 0xa1, 0x7d, 0x80, 0x18, 0x7d, 0xe7, 0xb1, 0xf2, 0xee, 0x36, 0x9f, 0xed, 0xa4, 0x67, 0xf6,
0x5e, 0xfc, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xea, 0xb4, 0x8f, 0x4f, 0xd3, 0x03, 0x00, 0x00,
0x14, 0x85, 0xe3, 0x24, 0x0d, 0x74, 0x00, 0x09, 0xa6, 0x49, 0xea, 0x76, 0x61, 0x45, 0x5d, 0x65,
0x51, 0x8d, 0x55, 0x8a, 0xf8, 0x59, 0xf2, 0x27, 0x36, 0x14, 0x2a, 0x4b, 0xdd, 0xb0, 0xb1, 0x26,
0xf6, 0x25, 0xb5, 0x88, 0x67, 0xa2, 0xb9, 0xe3, 0xaa, 0x79, 0x0b, 0xde, 0x0a, 0x96, 0x5d, 0xb2,
0x44, 0x89, 0x78, 0x0f, 0x94, 0x19, 0xff, 0xc4, 0x71, 0x95, 0x5d, 0xac, 0x7b, 0xce, 0x3d, 0x27,
0xdf, 0xcc, 0x90, 0xd3, 0x48, 0x62, 0x2a, 0xd1, 0xe7, 0x51, 0x24, 0x33, 0xa1, 0xd1, 0xbf, 0x39,
0x2b, 0x7e, 0x87, 0x7c, 0x82, 0x5a, 0xf1, 0x48, 0x27, 0x52, 0xb0, 0xb9, 0x92, 0x5a, 0x52, 0x6a,
0xd5, 0xac, 0x50, 0xb3, 0x9b, 0xb3, 0xe3, 0xa3, 0xa9, 0x94, 0xd3, 0x19, 0xf8, 0x46, 0x31, 0xc9,
0xbe, 0xfb, 0x5c, 0x2c, 0xac, 0xfc, 0xe4, 0x57, 0x87, 0x3c, 0xb9, 0x42, 0x50, 0x5f, 0xe7, 0xa0,
0xf8, 0x7a, 0x0d, 0x1d, 0x92, 0x1e, 0x82, 0x88, 0x41, 0xb9, 0xce, 0xc8, 0x19, 0xef, 0x07, 0xf9,
0x17, 0x3d, 0x27, 0x03, 0x9e, 0xe9, 0x6b, 0x10, 0x3a, 0x89, 0x8c, 0x32, 0x4c, 0x41, 0x5f, 0xcb,
0xd8, 0x6d, 0x1b, 0x59, 0xbf, 0x3e, 0xbc, 0x30, 0x33, 0xea, 0x93, 0x83, 0x2d, 0x53, 0xcc, 0x35,
0x77, 0x3b, 0x23, 0x67, 0xfc, 0x38, 0xa0, 0xf5, 0xd1, 0x07, 0xae, 0x39, 0x7d, 0x4d, 0xdc, 0x2d,
0xc3, 0x94, 0x63, 0x38, 0x4b, 0xd2, 0x44, 0xbb, 0xdd, 0x91, 0x33, 0xee, 0x06, 0xc3, 0xfa, 0xfc,
0x13, 0xc7, 0xcf, 0xeb, 0x29, 0xfd, 0x42, 0xdc, 0x49, 0x26, 0xe2, 0x19, 0xa8, 0x70, 0xce, 0x17,
0x29, 0x08, 0x1d, 0xa6, 0x80, 0xc8, 0xa7, 0x80, 0xee, 0xde, 0xa8, 0x33, 0x7e, 0xf4, 0xbc, 0xcf,
0x2c, 0x07, 0x56, 0x70, 0x60, 0x6f, 0xc5, 0x22, 0x18, 0xe6, 0xae, 0x4b, 0x6b, 0xba, 0xc8, 0x3d,
0xf4, 0x0d, 0x39, 0xda, 0xde, 0x57, 0x55, 0xe9, 0xd9, 0x2a, 0x75, 0x6b, 0x59, 0xe5, 0x3d, 0xa1,
0x70, 0x0b, 0x51, 0x96, 0x53, 0xca, 0x4b, 0x3c, 0xd8, 0x51, 0xe2, 0x59, 0xa9, 0x2f, 0xf3, 0x19,
0x39, 0xa8, 0x96, 0x54, 0xc9, 0x0f, 0x4d, 0x72, 0xa5, 0x2f, 0x42, 0x4f, 0xfe, 0xb5, 0xc9, 0xa0,
0x76, 0x92, 0x01, 0xe0, 0x5c, 0x0a, 0x04, 0xfa, 0x92, 0x1c, 0xde, 0xc3, 0x34, 0x43, 0x88, 0xcd,
0x11, 0x77, 0x83, 0x41, 0x03, 0xe9, 0x15, 0x42, 0x4c, 0x5f, 0x35, 0x89, 0x96, 0xc6, 0xb6, 0x35,
0x36, 0x00, 0x18, 0xe3, 0x65, 0x13, 0x9d, 0xca, 0xcb, 0xa0, 0xdb, 0xd9, 0x81, 0xe1, 0xb0, 0xbe,
0xaf, 0xf8, 0x07, 0x48, 0x4f, 0x37, 0x89, 0x96, 0x25, 0xec, 0x85, 0x78, 0xba, 0xc9, 0xc2, 0xe4,
0x7f, 0xdc, 0x44, 0x57, 0x25, 0xef, 0xba, 0x05, 0xd5, 0xfa, 0x2a, 0xb4, 0x4f, 0xf6, 0x40, 0x29,
0xa9, 0xcc, 0x69, 0xef, 0x07, 0xf6, 0xe3, 0xdd, 0x8b, 0xdf, 0x4b, 0xcf, 0xb9, 0x5b, 0x7a, 0xce,
0xdf, 0xa5, 0xe7, 0xfc, 0x5c, 0x79, 0xad, 0xbb, 0x95, 0xd7, 0xfa, 0xb3, 0xf2, 0x5a, 0xdf, 0x8e,
0xed, 0xd3, 0xc3, 0xf8, 0x07, 0x4b, 0xa4, 0x7f, 0xbb, 0xf9, 0x60, 0x27, 0x3d, 0x93, 0x76, 0xfe,
0x3f, 0x00, 0x00, 0xff, 0xff, 0xf6, 0xb6, 0x1b, 0x5c, 0xcd, 0x03, 0x00, 0x00,
}
func (m *UserOperation) Marshal() (dAtA []byte, err error) {
@@ -308,7 +312,7 @@ func (m *UserOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) {
if m.ExecutionGasLimit != 0 {
i = encodeVarintAccountAbstraction(dAtA, i, uint64(m.ExecutionGasLimit))
i--
dAtA[i] = 0x48
dAtA[i] = 0x40
}
if len(m.ExecutionMessages) > 0 {
for iNdEx := len(m.ExecutionMessages) - 1; iNdEx >= 0; iNdEx-- {
@@ -321,13 +325,13 @@ func (m *UserOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i = encodeVarintAccountAbstraction(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x42
dAtA[i] = 0x3a
}
}
if m.BundlerPaymentGasLimit != 0 {
i = encodeVarintAccountAbstraction(dAtA, i, uint64(m.BundlerPaymentGasLimit))
i--
dAtA[i] = 0x38
dAtA[i] = 0x30
}
if len(m.BundlerPaymentMessages) > 0 {
for iNdEx := len(m.BundlerPaymentMessages) - 1; iNdEx >= 0; iNdEx-- {
@@ -340,17 +344,12 @@ func (m *UserOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i = encodeVarintAccountAbstraction(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x32
dAtA[i] = 0x2a
}
}
if m.AuthenticationGasLimit != 0 {
i = encodeVarintAccountAbstraction(dAtA, i, uint64(m.AuthenticationGasLimit))
i--
dAtA[i] = 0x28
}
if m.Sequence != 0 {
i = encodeVarintAccountAbstraction(dAtA, i, uint64(m.Sequence))
i--
dAtA[i] = 0x20
}
if len(m.AuthenticationData) > 0 {
@@ -397,6 +396,13 @@ func (m *UserOperationResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if len(m.Error) > 0 {
i -= len(m.Error)
copy(dAtA[i:], m.Error)
i = encodeVarintAccountAbstraction(dAtA, i, uint64(len(m.Error)))
i--
dAtA[i] = 0x32
}
if len(m.ExecutionResponses) > 0 {
for iNdEx := len(m.ExecutionResponses) - 1; iNdEx >= 0; iNdEx-- {
{
@@ -472,9 +478,6 @@ func (m *UserOperation) Size() (n int) {
if l > 0 {
n += 1 + l + sovAccountAbstraction(uint64(l))
}
if m.Sequence != 0 {
n += 1 + sovAccountAbstraction(uint64(m.Sequence))
}
if m.AuthenticationGasLimit != 0 {
n += 1 + sovAccountAbstraction(uint64(m.AuthenticationGasLimit))
}
@@ -526,6 +529,10 @@ func (m *UserOperationResponse) Size() (n int) {
n += 1 + l + sovAccountAbstraction(uint64(l))
}
}
l = len(m.Error)
if l > 0 {
n += 1 + l + sovAccountAbstraction(uint64(l))
}
return n
}
@@ -663,25 +670,6 @@ func (m *UserOperation) Unmarshal(dAtA []byte) error {
}
iNdEx = postIndex
case 4:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Sequence", wireType)
}
m.Sequence = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowAccountAbstraction
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.Sequence |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
case 5:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field AuthenticationGasLimit", wireType)
}
@@ -700,7 +688,7 @@ func (m *UserOperation) Unmarshal(dAtA []byte) error {
break
}
}
case 6:
case 5:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field BundlerPaymentMessages", wireType)
}
@@ -734,7 +722,7 @@ func (m *UserOperation) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 7:
case 6:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field BundlerPaymentGasLimit", wireType)
}
@@ -753,7 +741,7 @@ func (m *UserOperation) Unmarshal(dAtA []byte) error {
break
}
}
case 8:
case 7:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field ExecutionMessages", wireType)
}
@@ -787,7 +775,7 @@ func (m *UserOperation) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 9:
case 8:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field ExecutionGasLimit", wireType)
}
@@ -981,6 +969,38 @@ func (m *UserOperationResponse) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 6:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowAccountAbstraction
}
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 ErrInvalidLengthAccountAbstraction
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthAccountAbstraction
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Error = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipAccountAbstraction(dAtA[iNdEx:])