From 643aa56be6fc551fc03c5fd71ebfd70c9db8e723 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 9 Jul 2024 12:48:16 +0800 Subject: [PATCH 01/15] add chainID to signing of oracle votes --- oracle/reactor.go | 2 +- oracle/service/runner/runner.go | 2 +- privval/file.go | 6 +- privval/signer_client_test.go | 8 +-- privval/signer_requestHandler.go | 9 ++- proto/tendermint/oracle/types.pb.go | 92 ++++++++++++++++++++++------- proto/tendermint/oracle/types.proto | 1 + types/oracle.go | 7 ++- types/priv_validator.go | 2 +- 9 files changed, 95 insertions(+), 34 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index fa4ac14dee9..f2fb90ac5b2 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -137,7 +137,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { return } - if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { + if success := pubKey.VerifySignature(types.OracleVoteSignBytes(oracleR.ConsensusState.GetState().ChainID, msg), msg.Signature); !success { logrus.Errorf("failed signature verification for validator: %v, skipping gossip", val.Address) return } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index fdf551b2698..0ebc9a212d5 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -71,7 +71,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State } // signing of vote should append the signature field of gossipVote - if err := oracleInfo.PrivValidator.SignOracleVote("", newGossipVote); err != nil { + if err := oracleInfo.PrivValidator.SignOracleVote(consensusState.GetState().ChainID, newGossipVote); err != nil { log.Errorf("processSignVoteQueue: error signing oracle votes") return } diff --git a/privval/file.go b/privval/file.go index 287e13d9e5e..ecfad0f68bf 100644 --- a/privval/file.go +++ b/privval/file.go @@ -279,7 +279,7 @@ func (pv *FilePV) SignProposal(chainID string, proposal *cmtproto.Proposal) erro // SignOracleVote signs a canonical representation of the vote, along with the // chainID. Implements PrivValidator. func (pv *FilePV) SignOracleVote(chainID string, vote *oracleproto.GossipedVotes) error { - if err := pv.signOracleVote(vote); err != nil { + if err := pv.signOracleVote(chainID, vote); err != nil { return fmt.Errorf("error signing vote: %v", err) } return nil @@ -309,8 +309,8 @@ func (pv *FilePV) String() string { ) } -func (pv *FilePV) signOracleVote(vote *oracleproto.GossipedVotes) error { - signBytes := types.OracleVoteSignBytes(vote) +func (pv *FilePV) signOracleVote(chainID string, vote *oracleproto.GossipedVotes) error { + signBytes := types.OracleVoteSignBytes(chainID, vote) sig, err := pv.Key.PrivKey.Sign(signBytes) if err != nil { return err diff --git a/privval/signer_client_test.go b/privval/signer_client_test.go index f620bf0bf5a..b981136242e 100644 --- a/privval/signer_client_test.go +++ b/privval/signer_client_test.go @@ -240,8 +240,8 @@ func TestSignerOracleVote(t *testing.T) { } }) - require.NoError(t, tc.mockPV.SignOracleVote("", want)) - require.NoError(t, tc.signerClient.SignOracleVote("", have)) + require.NoError(t, tc.mockPV.SignOracleVote(tc.chainID, want)) + require.NoError(t, tc.signerClient.SignOracleVote(tc.chainID, have)) assert.Equal(t, want.Signature, have.Signature) @@ -253,8 +253,8 @@ func TestSignerOracleVote(t *testing.T) { require.NoError(t, err) // test verify sig with pv and signing client signatures - require.True(t, pvPubKey.VerifySignature(types.OracleVoteSignBytes(want), want.Signature)) - require.True(t, scPubKey.VerifySignature(types.OracleVoteSignBytes(have), have.Signature)) + require.True(t, pvPubKey.VerifySignature(types.OracleVoteSignBytes(tc.chainID, want), want.Signature)) + require.True(t, scPubKey.VerifySignature(types.OracleVoteSignBytes(tc.chainID, have), have.Signature)) } } diff --git a/privval/signer_requestHandler.go b/privval/signer_requestHandler.go index 1ae19e166c3..bbc778c35d8 100644 --- a/privval/signer_requestHandler.go +++ b/privval/signer_requestHandler.go @@ -67,9 +67,16 @@ func DefaultValidationRequestHandler( } case *privvalproto.Message_SignOracleVoteRequest: + if r.SignOracleVoteRequest.ChainId != chainID { + res = mustWrapMsg(&privvalproto.SignedOracleVoteResponse{ + Vote: oracleproto.GossipedVotes{}, Error: &privvalproto.RemoteSignerError{ + Code: 0, Description: "unable to sign oracle votes"}}) + return res, fmt.Errorf("want chainID: %s, got chainID: %s", r.SignOracleVoteRequest.GetChainId(), chainID) + } + vote := r.SignOracleVoteRequest.Vote - err = privVal.SignOracleVote("", vote) + err = privVal.SignOracleVote(chainID, vote) if err != nil { res = mustWrapMsg(&privvalproto.SignedOracleVoteResponse{ Vote: oracleproto.GossipedVotes{}, Error: &privvalproto.RemoteSignerError{Code: 0, Description: err.Error()}}) diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 9932768d2ab..63831c6e7ca 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -162,6 +162,7 @@ type CanonicalGossipedVotes struct { Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` + ChainId string `protobuf:"bytes,4,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` } func (m *CanonicalGossipedVotes) Reset() { *m = CanonicalGossipedVotes{} } @@ -218,6 +219,13 @@ func (m *CanonicalGossipedVotes) GetSignedTimestamp() int64 { return 0 } +func (m *CanonicalGossipedVotes) GetChainId() string { + if m != nil { + return m.ChainId + } + return "" +} + func init() { proto.RegisterType((*Vote)(nil), "tendermint.oracle.Vote") proto.RegisterType((*GossipedVotes)(nil), "tendermint.oracle.GossipedVotes") @@ -227,26 +235,27 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 300 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0x41, 0x4a, 0xc4, 0x30, - 0x14, 0x86, 0x9b, 0x69, 0x15, 0x1b, 0x47, 0xd4, 0x2c, 0xb4, 0xe0, 0x18, 0x4a, 0x57, 0x75, 0x61, - 0x0b, 0xea, 0x09, 0x74, 0x21, 0x6e, 0x5c, 0x14, 0x71, 0xe1, 0x66, 0x48, 0x9b, 0x38, 0x06, 0xda, - 0xa6, 0x34, 0x6f, 0x06, 0xbc, 0xc5, 0x5c, 0xc2, 0xbb, 0xb8, 0x9c, 0xa5, 0x4b, 0x69, 0x2f, 0x22, - 0x4d, 0xc1, 0x8a, 0xbd, 0xc0, 0xec, 0x1e, 0xdf, 0xff, 0xbf, 0xfc, 0x7f, 0xe0, 0xe1, 0x73, 0x10, - 0x25, 0x17, 0x75, 0x21, 0x4b, 0x88, 0x55, 0xcd, 0xb2, 0x5c, 0xc4, 0xf0, 0x5e, 0x09, 0x1d, 0x55, - 0xb5, 0x02, 0x45, 0x8e, 0x07, 0x39, 0xea, 0xe5, 0x40, 0x63, 0xe7, 0x59, 0x81, 0x20, 0x33, 0xec, - 0xae, 0x58, 0x2e, 0x39, 0x03, 0x55, 0x7b, 0xc8, 0x47, 0xa1, 0x9b, 0x0c, 0x80, 0x9c, 0x61, 0xb7, - 0xf7, 0xcf, 0x25, 0xf7, 0x26, 0x46, 0xdd, 0xeb, 0xc1, 0x03, 0xef, 0x56, 0x41, 0x16, 0x42, 0x03, - 0x2b, 0x2a, 0xcf, 0xf6, 0x51, 0x68, 0x27, 0x03, 0x20, 0x04, 0x3b, 0x9c, 0x01, 0xf3, 0x1c, 0xb3, - 0x65, 0xe6, 0xe0, 0x03, 0xe1, 0x83, 0x7b, 0xa5, 0xb5, 0xac, 0x04, 0xef, 0xd2, 0xf5, 0x38, 0x7e, - 0xfa, 0x37, 0xfe, 0x12, 0xef, 0xac, 0x3a, 0x9b, 0x37, 0xf1, 0xed, 0x70, 0xff, 0xea, 0x34, 0x1a, - 0xfd, 0x23, 0xea, 0x9e, 0x49, 0x7a, 0x17, 0xb9, 0xc0, 0x47, 0x5a, 0x2e, 0x4a, 0xc1, 0xe7, 0xff, - 0x7b, 0x1d, 0xf6, 0xfc, 0xe9, 0xb7, 0xdd, 0x0c, 0xbb, 0x1d, 0x62, 0xb0, 0xac, 0x85, 0xa9, 0x38, - 0x4d, 0x06, 0x10, 0xac, 0x11, 0x3e, 0xb9, 0x63, 0xa5, 0x2a, 0x65, 0xc6, 0xf2, 0xad, 0x28, 0x7c, - 0xfb, 0xf8, 0xd9, 0x50, 0xb4, 0x69, 0x28, 0xfa, 0x6e, 0x28, 0x5a, 0xb7, 0xd4, 0xda, 0xb4, 0xd4, - 0xfa, 0x6a, 0xa9, 0xf5, 0x72, 0xb3, 0x90, 0xf0, 0xb6, 0x4c, 0xa3, 0x4c, 0x15, 0x71, 0xa6, 0x0a, - 0x01, 0xe9, 0x2b, 0x0c, 0x83, 0x39, 0x80, 0x78, 0x74, 0x1e, 0xe9, 0xae, 0x11, 0xae, 0x7f, 0x02, - 0x00, 0x00, 0xff, 0xff, 0xc4, 0x33, 0x57, 0xc2, 0x3a, 0x02, 0x00, 0x00, + // 317 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0x31, 0x4e, 0xc3, 0x30, + 0x14, 0x86, 0xeb, 0xb6, 0x40, 0x63, 0x8a, 0x00, 0x0f, 0x10, 0x44, 0xb1, 0xaa, 0x4e, 0x65, 0x20, + 0x91, 0x80, 0x13, 0xc0, 0x80, 0xba, 0x30, 0x44, 0x88, 0x81, 0xa5, 0x72, 0x63, 0xd3, 0x5a, 0x6a, + 0xec, 0x28, 0x7e, 0xad, 0xc4, 0x2d, 0xb8, 0x04, 0x13, 0x17, 0x61, 0xec, 0xc8, 0x88, 0x92, 0x8b, + 0x20, 0xdb, 0x12, 0x41, 0xe4, 0x02, 0x6c, 0x2f, 0xdf, 0xff, 0x5e, 0xfe, 0xdf, 0xf6, 0xc3, 0x67, + 0x20, 0x14, 0x17, 0x45, 0x26, 0x15, 0xc4, 0xba, 0x60, 0xe9, 0x52, 0xc4, 0xf0, 0x92, 0x0b, 0x13, + 0xe5, 0x85, 0x06, 0x4d, 0x0e, 0x6b, 0x39, 0xf2, 0xf2, 0xc8, 0xe0, 0xee, 0xa3, 0x06, 0x41, 0x06, + 0x38, 0x58, 0xb3, 0xa5, 0xe4, 0x0c, 0x74, 0x11, 0xa2, 0x21, 0x1a, 0x07, 0x49, 0x0d, 0xc8, 0x29, + 0x0e, 0x7c, 0xff, 0x54, 0xf2, 0xb0, 0xed, 0xd4, 0x9e, 0x07, 0x13, 0x6e, 0x47, 0x41, 0x66, 0xc2, + 0x00, 0xcb, 0xf2, 0xb0, 0x33, 0x44, 0xe3, 0x4e, 0x52, 0x03, 0x42, 0x70, 0x97, 0x33, 0x60, 0x61, + 0xd7, 0x4d, 0xb9, 0x7a, 0xf4, 0x86, 0xf0, 0xde, 0x9d, 0x36, 0x46, 0xe6, 0x82, 0x5b, 0x77, 0xd3, + 0xb4, 0xef, 0xff, 0xb6, 0xbf, 0xc0, 0x5b, 0x6b, 0xdb, 0x16, 0xb6, 0x87, 0x9d, 0xf1, 0xee, 0xe5, + 0x71, 0xd4, 0x38, 0x47, 0x64, 0x7f, 0x93, 0xf8, 0x2e, 0x72, 0x8e, 0x0f, 0x8c, 0x9c, 0x2b, 0xc1, + 0xa7, 0x7f, 0x73, 0xed, 0x7b, 0xfe, 0xf0, 0x93, 0x6e, 0x80, 0x03, 0x8b, 0x18, 0xac, 0x0a, 0xe1, + 0x22, 0xf6, 0x93, 0x1a, 0x8c, 0xde, 0x11, 0x3e, 0xba, 0x65, 0x4a, 0x2b, 0x99, 0xb2, 0xe5, 0xff, + 0x08, 0x7c, 0x82, 0x7b, 0xe9, 0x82, 0x49, 0x65, 0x1f, 0xc2, 0x5f, 0xe9, 0x8e, 0xfb, 0x9e, 0xf0, + 0x9b, 0xfb, 0x8f, 0x92, 0xa2, 0x4d, 0x49, 0xd1, 0x57, 0x49, 0xd1, 0x6b, 0x45, 0x5b, 0x9b, 0x8a, + 0xb6, 0x3e, 0x2b, 0xda, 0x7a, 0xba, 0x9e, 0x4b, 0x58, 0xac, 0x66, 0x51, 0xaa, 0xb3, 0x38, 0xd5, + 0x99, 0x80, 0xd9, 0x33, 0xd4, 0x85, 0xdb, 0x8d, 0xb8, 0xb1, 0x39, 0xb3, 0x6d, 0x27, 0x5c, 0x7d, + 0x07, 0x00, 0x00, 0xff, 0xff, 0x30, 0xed, 0x57, 0xbb, 0x55, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -374,6 +383,13 @@ func (m *CanonicalGossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) _ = i var l int _ = l + if len(m.ChainId) > 0 { + i -= len(m.ChainId) + copy(dAtA[i:], m.ChainId) + i = encodeVarintTypes(dAtA, i, uint64(len(m.ChainId))) + i-- + dAtA[i] = 0x22 + } if m.SignedTimestamp != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.SignedTimestamp)) i-- @@ -483,6 +499,10 @@ func (m *CanonicalGossipedVotes) Size() (n int) { if m.SignedTimestamp != 0 { n += 1 + sovTypes(uint64(m.SignedTimestamp)) } + l = len(m.ChainId) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } return n } @@ -944,6 +964,38 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { break } } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChainId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index ac73cf30bed..e8f4fd009e0 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -21,4 +21,5 @@ message CanonicalGossipedVotes { bytes validator = 1; repeated Vote votes = 2; int64 signed_timestamp = 3; + string chain_id = 4; } diff --git a/types/oracle.go b/types/oracle.go index c917140e9af..7185b42e97d 100644 --- a/types/oracle.go +++ b/types/oracle.go @@ -5,8 +5,8 @@ import ( oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" ) -func OracleVoteSignBytes(vote *oracleproto.GossipedVotes) []byte { - pb := CanonicalizeOracleVote(vote) +func OracleVoteSignBytes(chainID string, vote *oracleproto.GossipedVotes) []byte { + pb := CanonicalizeOracleVote(chainID, vote) bz, err := protoio.MarshalDelimited(&pb) if err != nil { panic(err) @@ -15,10 +15,11 @@ func OracleVoteSignBytes(vote *oracleproto.GossipedVotes) []byte { return bz } -func CanonicalizeOracleVote(vote *oracleproto.GossipedVotes) oracleproto.CanonicalGossipedVotes { +func CanonicalizeOracleVote(chainID string, vote *oracleproto.GossipedVotes) oracleproto.CanonicalGossipedVotes { return oracleproto.CanonicalGossipedVotes{ Validator: vote.Validator, Votes: vote.Votes, SignedTimestamp: vote.SignedTimestamp, + ChainId: chainID, } } diff --git a/types/priv_validator.go b/types/priv_validator.go index 45da4d6a337..6c75c09f9bf 100644 --- a/types/priv_validator.go +++ b/types/priv_validator.go @@ -102,7 +102,7 @@ func (pv MockPV) SignVote(chainID string, vote *cmtproto.Vote) error { // Implements PrivValidator. func (pv MockPV) SignOracleVote(chainID string, vote *oracleproto.GossipedVotes) error { - signBytes := OracleVoteSignBytes(vote) + signBytes := OracleVoteSignBytes(chainID, vote) sig, err := pv.PrivKey.Sign(signBytes) if err != nil { return err From fd50b0e43535bc6748ec0c10cd582adda1ba6bb6 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Tue, 9 Jul 2024 14:54:22 +0800 Subject: [PATCH 02/15] update gossip interval to 250ms --- config/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.go b/config/config.go index 08fcaa2e72e..b331e1184ec 100644 --- a/config/config.go +++ b/config/config.go @@ -861,7 +861,7 @@ func DefaultOracleConfig() *OracleConfig { MaxOracleGossipBlocksDelayed: 3, // keep all gossipVotes from at most 3 blocks behind MaxOracleGossipAge: 20, // keep all gossipVotes from at most 20s ago SignInterval: 100 * time.Millisecond, // 0.1s - GossipInterval: 100 * time.Millisecond, // 0.1s + GossipInterval: 250 * time.Millisecond, // 0.25s PruneInterval: 500 * time.Millisecond, // 0.5s MaxGossipMsgSize: 65536, } From 54f5c5cdc988c16031519ee8617fc693b6d4821f Mon Sep 17 00:00:00 2001 From: yan-soon Date: Wed, 10 Jul 2024 14:35:45 +0800 Subject: [PATCH 03/15] add lifecycle hook for checking if oracle result exist --- abci/client/grpc_client.go | 4 + abci/client/mocks/client.go | 130 ++-- abci/client/socket_client.go | 11 + abci/types/application.go | 5 + abci/types/messages.go | 6 + abci/types/mocks/application.go | 130 ++-- abci/types/types.pb.go | 1213 +++++++++++++++++++++-------- proto/tendermint/abci/types.proto | 11 + proxy/app_conn.go | 6 + proxy/mocks/app_conn_consensus.go | 120 +-- 10 files changed, 1147 insertions(+), 489 deletions(-) diff --git a/abci/client/grpc_client.go b/abci/client/grpc_client.go index 0b337eb8d43..b626cb298a4 100644 --- a/abci/client/grpc_client.go +++ b/abci/client/grpc_client.go @@ -257,3 +257,7 @@ func (cli *grpcClient) FetchOracleVotes(ctx context.Context, req *types.RequestF func (cli *grpcClient) ValidateOracleVotes(ctx context.Context, req *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { return cli.client.ValidateOracleVotes(ctx, types.ToRequestValidateOracleVotes(req).GetValidateOracleVotes(), grpc.WaitForReady(true)) } + +func (cli *grpcClient) DoesOracleResultExist(ctx context.Context, req *types.RequestDoesOracleResultExist) (*types.ResponseDoesOracleResultExist, error) { + return cli.client.DoesOracleResultExist(ctx, types.ToRequestDoesOracleResultExist(req).GetDoesOracleResultExist(), grpc.WaitForReady(true)) +} diff --git a/abci/client/mocks/client.go b/abci/client/mocks/client.go index b48cbdd19f1..8bfe3e0f1c0 100644 --- a/abci/client/mocks/client.go +++ b/abci/client/mocks/client.go @@ -123,6 +123,58 @@ func (_m *Client) Commit(_a0 context.Context, _a1 *types.RequestCommit) (*types. return r0, r1 } +// CreateOracleResultTx provides a mock function with given fields: _a0, _a1 +func (_m *Client) CreateOracleResultTx(_a0 context.Context, _a1 *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseCreateOracleResultTx + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestCreateOracleResultTx) *types.ResponseCreateOracleResultTx); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseCreateOracleResultTx) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestCreateOracleResultTx) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DoesOracleResultExist provides a mock function with given fields: _a0, _a1 +func (_m *Client) DoesOracleResultExist(_a0 context.Context, _a1 *types.RequestDoesOracleResultExist) (*types.ResponseDoesOracleResultExist, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseDoesOracleResultExist + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesOracleResultExist) (*types.ResponseDoesOracleResultExist, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesOracleResultExist) *types.ResponseDoesOracleResultExist); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseDoesOracleResultExist) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestDoesOracleResultExist) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // Echo provides a mock function with given fields: _a0, _a1 func (_m *Client) Echo(_a0 context.Context, _a1 string) (*types.ResponseEcho, error) { ret := _m.Called(_a0, _a1) @@ -189,6 +241,32 @@ func (_m *Client) ExtendVote(_a0 context.Context, _a1 *types.RequestExtendVote) return r0, r1 } +// FetchOracleVotes provides a mock function with given fields: _a0, _a1 +func (_m *Client) FetchOracleVotes(_a0 context.Context, _a1 *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseFetchOracleVotes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFetchOracleVotes) *types.ResponseFetchOracleVotes); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseFetchOracleVotes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestFetchOracleVotes) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // FinalizeBlock provides a mock function with given fields: _a0, _a1 func (_m *Client) FinalizeBlock(_a0 context.Context, _a1 *types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error) { ret := _m.Called(_a0, _a1) @@ -406,32 +484,6 @@ func (_m *Client) OnStop() { _m.Called() } -// FetchOracleVotes provides a mock function with given fields: _a0, _a1 -func (_m *Client) FetchOracleVotes(_a0 context.Context, _a1 *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) { - ret := _m.Called(_a0, _a1) - - var r0 *types.ResponseFetchOracleVotes - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error)); ok { - return rf(_a0, _a1) - } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFetchOracleVotes) *types.ResponseFetchOracleVotes); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponseFetchOracleVotes) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestFetchOracleVotes) error); ok { - r1 = rf(_a0, _a1) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // PrepareProposal provides a mock function with given fields: _a0, _a1 func (_m *Client) PrepareProposal(_a0 context.Context, _a1 *types.RequestPrepareProposal) (*types.ResponsePrepareProposal, error) { ret := _m.Called(_a0, _a1) @@ -550,32 +602,6 @@ func (_m *Client) SetResponseCallback(_a0 abcicli.Callback) { _m.Called(_a0) } -// CreateOracleResultTx provides a mock function with given fields: _a0, _a1 -func (_m *Client) CreateOracleResultTx(_a0 context.Context, _a1 *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error) { - ret := _m.Called(_a0, _a1) - - var r0 *types.ResponseCreateOracleResultTx - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error)); ok { - return rf(_a0, _a1) - } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestCreateOracleResultTx) *types.ResponseCreateOracleResultTx); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponseCreateOracleResultTx) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestCreateOracleResultTx) error); ok { - r1 = rf(_a0, _a1) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // Start provides a mock function with given fields: func (_m *Client) Start() error { ret := _m.Called() diff --git a/abci/client/socket_client.go b/abci/client/socket_client.go index a5012387047..fd9fa62c652 100644 --- a/abci/client/socket_client.go +++ b/abci/client/socket_client.go @@ -445,6 +445,17 @@ func (cli *socketClient) ValidateOracleVotes(ctx context.Context, req *types.Req return reqRes.Response.GetValidateOracleVotes(), cli.Error() } +func (cli *socketClient) DoesOracleResultExist(ctx context.Context, req *types.RequestDoesOracleResultExist) (*types.ResponseDoesOracleResultExist, error) { + reqRes, err := cli.queueRequest(ctx, types.ToRequestDoesOracleResultExist(req)) + if err != nil { + return nil, err + } + if err := cli.Flush(ctx); err != nil { + return nil, err + } + return reqRes.Response.GetDoesOracleResultExist(), cli.Error() +} + func (cli *socketClient) queueRequest(ctx context.Context, req *types.Request) (*ReqRes, error) { reqres := NewReqRes(req) diff --git a/abci/types/application.go b/abci/types/application.go index ffb43865dd1..8920a413842 100644 --- a/abci/types/application.go +++ b/abci/types/application.go @@ -39,6 +39,7 @@ type Application interface { CreateOracleResultTx(context.Context, *RequestCreateOracleResultTx) (*ResponseCreateOracleResultTx, error) FetchOracleVotes(context.Context, *RequestFetchOracleVotes) (*ResponseFetchOracleVotes, error) ValidateOracleVotes(context.Context, *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) + DoesOracleResultExist(context.Context, *RequestDoesOracleResultExist) (*ResponseDoesOracleResultExist, error) } //------------------------------------------------------- @@ -136,3 +137,7 @@ func (BaseApplication) FetchOracleVotes(_ context.Context, req *RequestFetchOrac func (BaseApplication) ValidateOracleVotes(_ context.Context, req *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) { return &ResponseValidateOracleVotes{}, nil } + +func (BaseApplication) DoesOracleResultExist(_ context.Context, req *RequestDoesOracleResultExist) (*ResponseDoesOracleResultExist, error) { + return &ResponseDoesOracleResultExist{}, nil +} diff --git a/abci/types/messages.go b/abci/types/messages.go index 2bd4421de53..00937962524 100644 --- a/abci/types/messages.go +++ b/abci/types/messages.go @@ -142,6 +142,12 @@ func ToRequestValidateOracleVotes(req *RequestValidateOracleVotes) *Request { } } +func ToRequestDoesOracleResultExist(req *RequestDoesOracleResultExist) *Request { + return &Request{ + Value: &Request_DoesOracleResultExist{req}, + } +} + //---------------------------------------- func ToResponseException(errStr string) *Response { diff --git a/abci/types/mocks/application.go b/abci/types/mocks/application.go index 061bee9c225..1f3baca9fc0 100644 --- a/abci/types/mocks/application.go +++ b/abci/types/mocks/application.go @@ -92,6 +92,58 @@ func (_m *Application) Commit(_a0 context.Context, _a1 *types.RequestCommit) (*t return r0, r1 } +// CreateOracleResultTx provides a mock function with given fields: _a0, _a1 +func (_m *Application) CreateOracleResultTx(_a0 context.Context, _a1 *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseCreateOracleResultTx + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestCreateOracleResultTx) *types.ResponseCreateOracleResultTx); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseCreateOracleResultTx) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestCreateOracleResultTx) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DoesOracleResultExist provides a mock function with given fields: _a0, _a1 +func (_m *Application) DoesOracleResultExist(_a0 context.Context, _a1 *types.RequestDoesOracleResultExist) (*types.ResponseDoesOracleResultExist, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseDoesOracleResultExist + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesOracleResultExist) (*types.ResponseDoesOracleResultExist, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesOracleResultExist) *types.ResponseDoesOracleResultExist); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseDoesOracleResultExist) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestDoesOracleResultExist) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // ExtendVote provides a mock function with given fields: _a0, _a1 func (_m *Application) ExtendVote(_a0 context.Context, _a1 *types.RequestExtendVote) (*types.ResponseExtendVote, error) { ret := _m.Called(_a0, _a1) @@ -118,6 +170,32 @@ func (_m *Application) ExtendVote(_a0 context.Context, _a1 *types.RequestExtendV return r0, r1 } +// FetchOracleVotes provides a mock function with given fields: _a0, _a1 +func (_m *Application) FetchOracleVotes(_a0 context.Context, _a1 *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseFetchOracleVotes + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFetchOracleVotes) *types.ResponseFetchOracleVotes); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseFetchOracleVotes) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestFetchOracleVotes) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // FinalizeBlock provides a mock function with given fields: _a0, _a1 func (_m *Application) FinalizeBlock(_a0 context.Context, _a1 *types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error) { ret := _m.Called(_a0, _a1) @@ -274,32 +352,6 @@ func (_m *Application) OfferSnapshot(_a0 context.Context, _a1 *types.RequestOffe return r0, r1 } -// FetchOracleVotes provides a mock function with given fields: _a0, _a1 -func (_m *Application) FetchOracleVotes(_a0 context.Context, _a1 *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) { - ret := _m.Called(_a0, _a1) - - var r0 *types.ResponseFetchOracleVotes - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error)); ok { - return rf(_a0, _a1) - } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFetchOracleVotes) *types.ResponseFetchOracleVotes); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponseFetchOracleVotes) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestFetchOracleVotes) error); ok { - r1 = rf(_a0, _a1) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // PrepareProposal provides a mock function with given fields: _a0, _a1 func (_m *Application) PrepareProposal(_a0 context.Context, _a1 *types.RequestPrepareProposal) (*types.ResponsePrepareProposal, error) { ret := _m.Called(_a0, _a1) @@ -378,32 +430,6 @@ func (_m *Application) Query(_a0 context.Context, _a1 *types.RequestQuery) (*typ return r0, r1 } -// CreateOracleResultTx provides a mock function with given fields: _a0, _a1 -func (_m *Application) CreateOracleResultTx(_a0 context.Context, _a1 *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error) { - ret := _m.Called(_a0, _a1) - - var r0 *types.ResponseCreateOracleResultTx - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error)); ok { - return rf(_a0, _a1) - } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestCreateOracleResultTx) *types.ResponseCreateOracleResultTx); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponseCreateOracleResultTx) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestCreateOracleResultTx) error); ok { - r1 = rf(_a0, _a1) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // ValidateOracleVotes provides a mock function with given fields: _a0, _a1 func (_m *Application) ValidateOracleVotes(_a0 context.Context, _a1 *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { ret := _m.Called(_a0, _a1) diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index 25cc23dcafe..d1512f70482 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -122,7 +122,7 @@ func (x ResponseOfferSnapshot_Result) String() string { } func (ResponseOfferSnapshot_Result) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{30, 0} + return fileDescriptor_252557cfdd89a31a, []int{31, 0} } type ResponseApplySnapshotChunk_Result int32 @@ -159,7 +159,7 @@ func (x ResponseApplySnapshotChunk_Result) String() string { } func (ResponseApplySnapshotChunk_Result) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{32, 0} + return fileDescriptor_252557cfdd89a31a, []int{33, 0} } type ResponseProcessProposal_ProposalStatus int32 @@ -187,7 +187,7 @@ func (x ResponseProcessProposal_ProposalStatus) String() string { } func (ResponseProcessProposal_ProposalStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{34, 0} + return fileDescriptor_252557cfdd89a31a, []int{35, 0} } type ResponseVerifyVoteExtension_VerifyStatus int32 @@ -219,7 +219,7 @@ func (x ResponseVerifyVoteExtension_VerifyStatus) String() string { } func (ResponseVerifyVoteExtension_VerifyStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{36, 0} + return fileDescriptor_252557cfdd89a31a, []int{37, 0} } type ResponseValidateOracleVotes_Status int32 @@ -244,7 +244,7 @@ func (x ResponseValidateOracleVotes_Status) String() string { } func (ResponseValidateOracleVotes_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{40, 0} + return fileDescriptor_252557cfdd89a31a, []int{41, 0} } type Request struct { @@ -268,6 +268,7 @@ type Request struct { // *Request_CreateOracleResultTx // *Request_FetchOracleVotes // *Request_ValidateOracleVotes + // *Request_DoesOracleResultExist Value isRequest_Value `protobuf_oneof:"value"` } @@ -367,26 +368,30 @@ type Request_FetchOracleVotes struct { type Request_ValidateOracleVotes struct { ValidateOracleVotes *RequestValidateOracleVotes `protobuf:"bytes,23,opt,name=validate_oracle_votes,json=validateOracleVotes,proto3,oneof" json:"validate_oracle_votes,omitempty"` } - -func (*Request_Echo) isRequest_Value() {} -func (*Request_Flush) isRequest_Value() {} -func (*Request_Info) isRequest_Value() {} -func (*Request_InitChain) isRequest_Value() {} -func (*Request_Query) isRequest_Value() {} -func (*Request_CheckTx) isRequest_Value() {} -func (*Request_Commit) isRequest_Value() {} -func (*Request_ListSnapshots) isRequest_Value() {} -func (*Request_OfferSnapshot) isRequest_Value() {} -func (*Request_LoadSnapshotChunk) isRequest_Value() {} -func (*Request_ApplySnapshotChunk) isRequest_Value() {} -func (*Request_PrepareProposal) isRequest_Value() {} -func (*Request_ProcessProposal) isRequest_Value() {} -func (*Request_ExtendVote) isRequest_Value() {} -func (*Request_VerifyVoteExtension) isRequest_Value() {} -func (*Request_FinalizeBlock) isRequest_Value() {} -func (*Request_CreateOracleResultTx) isRequest_Value() {} -func (*Request_FetchOracleVotes) isRequest_Value() {} -func (*Request_ValidateOracleVotes) isRequest_Value() {} +type Request_DoesOracleResultExist struct { + DoesOracleResultExist *RequestDoesOracleResultExist `protobuf:"bytes,24,opt,name=does_oracle_result_exist,json=doesOracleResultExist,proto3,oneof" json:"does_oracle_result_exist,omitempty"` +} + +func (*Request_Echo) isRequest_Value() {} +func (*Request_Flush) isRequest_Value() {} +func (*Request_Info) isRequest_Value() {} +func (*Request_InitChain) isRequest_Value() {} +func (*Request_Query) isRequest_Value() {} +func (*Request_CheckTx) isRequest_Value() {} +func (*Request_Commit) isRequest_Value() {} +func (*Request_ListSnapshots) isRequest_Value() {} +func (*Request_OfferSnapshot) isRequest_Value() {} +func (*Request_LoadSnapshotChunk) isRequest_Value() {} +func (*Request_ApplySnapshotChunk) isRequest_Value() {} +func (*Request_PrepareProposal) isRequest_Value() {} +func (*Request_ProcessProposal) isRequest_Value() {} +func (*Request_ExtendVote) isRequest_Value() {} +func (*Request_VerifyVoteExtension) isRequest_Value() {} +func (*Request_FinalizeBlock) isRequest_Value() {} +func (*Request_CreateOracleResultTx) isRequest_Value() {} +func (*Request_FetchOracleVotes) isRequest_Value() {} +func (*Request_ValidateOracleVotes) isRequest_Value() {} +func (*Request_DoesOracleResultExist) isRequest_Value() {} func (m *Request) GetValue() isRequest_Value { if m != nil { @@ -528,6 +533,13 @@ func (m *Request) GetValidateOracleVotes() *RequestValidateOracleVotes { return nil } +func (m *Request) GetDoesOracleResultExist() *RequestDoesOracleResultExist { + if x, ok := m.GetValue().(*Request_DoesOracleResultExist); ok { + return x.DoesOracleResultExist + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*Request) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -550,6 +562,7 @@ func (*Request) XXX_OneofWrappers() []interface{} { (*Request_CreateOracleResultTx)(nil), (*Request_FetchOracleVotes)(nil), (*Request_ValidateOracleVotes)(nil), + (*Request_DoesOracleResultExist)(nil), } } @@ -1769,6 +1782,50 @@ func (m *RequestValidateOracleVotes) GetOracleTx() []byte { return nil } +type RequestDoesOracleResultExist struct { + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` +} + +func (m *RequestDoesOracleResultExist) Reset() { *m = RequestDoesOracleResultExist{} } +func (m *RequestDoesOracleResultExist) String() string { return proto.CompactTextString(m) } +func (*RequestDoesOracleResultExist) ProtoMessage() {} +func (*RequestDoesOracleResultExist) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{20} +} +func (m *RequestDoesOracleResultExist) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RequestDoesOracleResultExist) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RequestDoesOracleResultExist.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RequestDoesOracleResultExist) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestDoesOracleResultExist.Merge(m, src) +} +func (m *RequestDoesOracleResultExist) XXX_Size() int { + return m.Size() +} +func (m *RequestDoesOracleResultExist) XXX_DiscardUnknown() { + xxx_messageInfo_RequestDoesOracleResultExist.DiscardUnknown(m) +} + +var xxx_messageInfo_RequestDoesOracleResultExist proto.InternalMessageInfo + +func (m *RequestDoesOracleResultExist) GetKey() string { + if m != nil { + return m.Key + } + return "" +} + type Response struct { // Types that are valid to be assigned to Value: // @@ -1792,6 +1849,7 @@ type Response struct { // *Response_CreateOracleResultTx // *Response_FetchOracleVotes // *Response_ValidateOracleVotes + // *Response_DoesOracleResultExist Value isResponse_Value `protobuf_oneof:"value"` } @@ -1799,7 +1857,7 @@ func (m *Response) Reset() { *m = Response{} } func (m *Response) String() string { return proto.CompactTextString(m) } func (*Response) ProtoMessage() {} func (*Response) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{20} + return fileDescriptor_252557cfdd89a31a, []int{21} } func (m *Response) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1894,27 +1952,31 @@ type Response_FetchOracleVotes struct { type Response_ValidateOracleVotes struct { ValidateOracleVotes *ResponseValidateOracleVotes `protobuf:"bytes,24,opt,name=validate_oracle_votes,json=validateOracleVotes,proto3,oneof" json:"validate_oracle_votes,omitempty"` } - -func (*Response_Exception) isResponse_Value() {} -func (*Response_Echo) isResponse_Value() {} -func (*Response_Flush) isResponse_Value() {} -func (*Response_Info) isResponse_Value() {} -func (*Response_InitChain) isResponse_Value() {} -func (*Response_Query) isResponse_Value() {} -func (*Response_CheckTx) isResponse_Value() {} -func (*Response_Commit) isResponse_Value() {} -func (*Response_ListSnapshots) isResponse_Value() {} -func (*Response_OfferSnapshot) isResponse_Value() {} -func (*Response_LoadSnapshotChunk) isResponse_Value() {} -func (*Response_ApplySnapshotChunk) isResponse_Value() {} -func (*Response_PrepareProposal) isResponse_Value() {} -func (*Response_ProcessProposal) isResponse_Value() {} -func (*Response_ExtendVote) isResponse_Value() {} -func (*Response_VerifyVoteExtension) isResponse_Value() {} -func (*Response_FinalizeBlock) isResponse_Value() {} -func (*Response_CreateOracleResultTx) isResponse_Value() {} -func (*Response_FetchOracleVotes) isResponse_Value() {} -func (*Response_ValidateOracleVotes) isResponse_Value() {} +type Response_DoesOracleResultExist struct { + DoesOracleResultExist *ResponseDoesOracleResultExist `protobuf:"bytes,25,opt,name=does_oracle_result_exist,json=doesOracleResultExist,proto3,oneof" json:"does_oracle_result_exist,omitempty"` +} + +func (*Response_Exception) isResponse_Value() {} +func (*Response_Echo) isResponse_Value() {} +func (*Response_Flush) isResponse_Value() {} +func (*Response_Info) isResponse_Value() {} +func (*Response_InitChain) isResponse_Value() {} +func (*Response_Query) isResponse_Value() {} +func (*Response_CheckTx) isResponse_Value() {} +func (*Response_Commit) isResponse_Value() {} +func (*Response_ListSnapshots) isResponse_Value() {} +func (*Response_OfferSnapshot) isResponse_Value() {} +func (*Response_LoadSnapshotChunk) isResponse_Value() {} +func (*Response_ApplySnapshotChunk) isResponse_Value() {} +func (*Response_PrepareProposal) isResponse_Value() {} +func (*Response_ProcessProposal) isResponse_Value() {} +func (*Response_ExtendVote) isResponse_Value() {} +func (*Response_VerifyVoteExtension) isResponse_Value() {} +func (*Response_FinalizeBlock) isResponse_Value() {} +func (*Response_CreateOracleResultTx) isResponse_Value() {} +func (*Response_FetchOracleVotes) isResponse_Value() {} +func (*Response_ValidateOracleVotes) isResponse_Value() {} +func (*Response_DoesOracleResultExist) isResponse_Value() {} func (m *Response) GetValue() isResponse_Value { if m != nil { @@ -2063,6 +2125,13 @@ func (m *Response) GetValidateOracleVotes() *ResponseValidateOracleVotes { return nil } +func (m *Response) GetDoesOracleResultExist() *ResponseDoesOracleResultExist { + if x, ok := m.GetValue().(*Response_DoesOracleResultExist); ok { + return x.DoesOracleResultExist + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*Response) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -2086,6 +2155,7 @@ func (*Response) XXX_OneofWrappers() []interface{} { (*Response_CreateOracleResultTx)(nil), (*Response_FetchOracleVotes)(nil), (*Response_ValidateOracleVotes)(nil), + (*Response_DoesOracleResultExist)(nil), } } @@ -2098,7 +2168,7 @@ func (m *ResponseException) Reset() { *m = ResponseException{} } func (m *ResponseException) String() string { return proto.CompactTextString(m) } func (*ResponseException) ProtoMessage() {} func (*ResponseException) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{21} + return fileDescriptor_252557cfdd89a31a, []int{22} } func (m *ResponseException) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2142,7 +2212,7 @@ func (m *ResponseEcho) Reset() { *m = ResponseEcho{} } func (m *ResponseEcho) String() string { return proto.CompactTextString(m) } func (*ResponseEcho) ProtoMessage() {} func (*ResponseEcho) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{22} + return fileDescriptor_252557cfdd89a31a, []int{23} } func (m *ResponseEcho) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2185,7 +2255,7 @@ func (m *ResponseFlush) Reset() { *m = ResponseFlush{} } func (m *ResponseFlush) String() string { return proto.CompactTextString(m) } func (*ResponseFlush) ProtoMessage() {} func (*ResponseFlush) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{23} + return fileDescriptor_252557cfdd89a31a, []int{24} } func (m *ResponseFlush) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2226,7 +2296,7 @@ func (m *ResponseInfo) Reset() { *m = ResponseInfo{} } func (m *ResponseInfo) String() string { return proto.CompactTextString(m) } func (*ResponseInfo) ProtoMessage() {} func (*ResponseInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{24} + return fileDescriptor_252557cfdd89a31a, []int{25} } func (m *ResponseInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2300,7 +2370,7 @@ func (m *ResponseInitChain) Reset() { *m = ResponseInitChain{} } func (m *ResponseInitChain) String() string { return proto.CompactTextString(m) } func (*ResponseInitChain) ProtoMessage() {} func (*ResponseInitChain) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{25} + return fileDescriptor_252557cfdd89a31a, []int{26} } func (m *ResponseInitChain) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2367,7 +2437,7 @@ func (m *ResponseQuery) Reset() { *m = ResponseQuery{} } func (m *ResponseQuery) String() string { return proto.CompactTextString(m) } func (*ResponseQuery) ProtoMessage() {} func (*ResponseQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{26} + return fileDescriptor_252557cfdd89a31a, []int{27} } func (m *ResponseQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2474,7 +2544,7 @@ func (m *ResponseCheckTx) Reset() { *m = ResponseCheckTx{} } func (m *ResponseCheckTx) String() string { return proto.CompactTextString(m) } func (*ResponseCheckTx) ProtoMessage() {} func (*ResponseCheckTx) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{27} + return fileDescriptor_252557cfdd89a31a, []int{28} } func (m *ResponseCheckTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2567,7 +2637,7 @@ func (m *ResponseCommit) Reset() { *m = ResponseCommit{} } func (m *ResponseCommit) String() string { return proto.CompactTextString(m) } func (*ResponseCommit) ProtoMessage() {} func (*ResponseCommit) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{28} + return fileDescriptor_252557cfdd89a31a, []int{29} } func (m *ResponseCommit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2611,7 +2681,7 @@ func (m *ResponseListSnapshots) Reset() { *m = ResponseListSnapshots{} } func (m *ResponseListSnapshots) String() string { return proto.CompactTextString(m) } func (*ResponseListSnapshots) ProtoMessage() {} func (*ResponseListSnapshots) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{29} + return fileDescriptor_252557cfdd89a31a, []int{30} } func (m *ResponseListSnapshots) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2655,7 +2725,7 @@ func (m *ResponseOfferSnapshot) Reset() { *m = ResponseOfferSnapshot{} } func (m *ResponseOfferSnapshot) String() string { return proto.CompactTextString(m) } func (*ResponseOfferSnapshot) ProtoMessage() {} func (*ResponseOfferSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{30} + return fileDescriptor_252557cfdd89a31a, []int{31} } func (m *ResponseOfferSnapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2699,7 +2769,7 @@ func (m *ResponseLoadSnapshotChunk) Reset() { *m = ResponseLoadSnapshotC func (m *ResponseLoadSnapshotChunk) String() string { return proto.CompactTextString(m) } func (*ResponseLoadSnapshotChunk) ProtoMessage() {} func (*ResponseLoadSnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{31} + return fileDescriptor_252557cfdd89a31a, []int{32} } func (m *ResponseLoadSnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2745,7 +2815,7 @@ func (m *ResponseApplySnapshotChunk) Reset() { *m = ResponseApplySnapsho func (m *ResponseApplySnapshotChunk) String() string { return proto.CompactTextString(m) } func (*ResponseApplySnapshotChunk) ProtoMessage() {} func (*ResponseApplySnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{32} + return fileDescriptor_252557cfdd89a31a, []int{33} } func (m *ResponseApplySnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2803,7 +2873,7 @@ func (m *ResponsePrepareProposal) Reset() { *m = ResponsePrepareProposal func (m *ResponsePrepareProposal) String() string { return proto.CompactTextString(m) } func (*ResponsePrepareProposal) ProtoMessage() {} func (*ResponsePrepareProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{33} + return fileDescriptor_252557cfdd89a31a, []int{34} } func (m *ResponsePrepareProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2847,7 +2917,7 @@ func (m *ResponseProcessProposal) Reset() { *m = ResponseProcessProposal func (m *ResponseProcessProposal) String() string { return proto.CompactTextString(m) } func (*ResponseProcessProposal) ProtoMessage() {} func (*ResponseProcessProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{34} + return fileDescriptor_252557cfdd89a31a, []int{35} } func (m *ResponseProcessProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2891,7 +2961,7 @@ func (m *ResponseExtendVote) Reset() { *m = ResponseExtendVote{} } func (m *ResponseExtendVote) String() string { return proto.CompactTextString(m) } func (*ResponseExtendVote) ProtoMessage() {} func (*ResponseExtendVote) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{35} + return fileDescriptor_252557cfdd89a31a, []int{36} } func (m *ResponseExtendVote) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2935,7 +3005,7 @@ func (m *ResponseVerifyVoteExtension) Reset() { *m = ResponseVerifyVoteE func (m *ResponseVerifyVoteExtension) String() string { return proto.CompactTextString(m) } func (*ResponseVerifyVoteExtension) ProtoMessage() {} func (*ResponseVerifyVoteExtension) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{36} + return fileDescriptor_252557cfdd89a31a, []int{37} } func (m *ResponseVerifyVoteExtension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2990,7 +3060,7 @@ func (m *ResponseFinalizeBlock) Reset() { *m = ResponseFinalizeBlock{} } func (m *ResponseFinalizeBlock) String() string { return proto.CompactTextString(m) } func (*ResponseFinalizeBlock) ProtoMessage() {} func (*ResponseFinalizeBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{37} + return fileDescriptor_252557cfdd89a31a, []int{38} } func (m *ResponseFinalizeBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3062,7 +3132,7 @@ func (m *ResponseCreateOracleResultTx) Reset() { *m = ResponseCreateOrac func (m *ResponseCreateOracleResultTx) String() string { return proto.CompactTextString(m) } func (*ResponseCreateOracleResultTx) ProtoMessage() {} func (*ResponseCreateOracleResultTx) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{38} + return fileDescriptor_252557cfdd89a31a, []int{39} } func (m *ResponseCreateOracleResultTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3106,7 +3176,7 @@ func (m *ResponseFetchOracleVotes) Reset() { *m = ResponseFetchOracleVot func (m *ResponseFetchOracleVotes) String() string { return proto.CompactTextString(m) } func (*ResponseFetchOracleVotes) ProtoMessage() {} func (*ResponseFetchOracleVotes) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{39} + return fileDescriptor_252557cfdd89a31a, []int{40} } func (m *ResponseFetchOracleVotes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3150,7 +3220,7 @@ func (m *ResponseValidateOracleVotes) Reset() { *m = ResponseValidateOra func (m *ResponseValidateOracleVotes) String() string { return proto.CompactTextString(m) } func (*ResponseValidateOracleVotes) ProtoMessage() {} func (*ResponseValidateOracleVotes) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{40} + return fileDescriptor_252557cfdd89a31a, []int{41} } func (m *ResponseValidateOracleVotes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3186,6 +3256,50 @@ func (m *ResponseValidateOracleVotes) GetStatus() ResponseValidateOracleVotes_St return ResponseValidateOracleVotes_ABSENT } +type ResponseDoesOracleResultExist struct { + DoesExist bool `protobuf:"varint,1,opt,name=does_exist,json=doesExist,proto3" json:"does_exist,omitempty"` +} + +func (m *ResponseDoesOracleResultExist) Reset() { *m = ResponseDoesOracleResultExist{} } +func (m *ResponseDoesOracleResultExist) String() string { return proto.CompactTextString(m) } +func (*ResponseDoesOracleResultExist) ProtoMessage() {} +func (*ResponseDoesOracleResultExist) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{42} +} +func (m *ResponseDoesOracleResultExist) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResponseDoesOracleResultExist) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResponseDoesOracleResultExist.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ResponseDoesOracleResultExist) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseDoesOracleResultExist.Merge(m, src) +} +func (m *ResponseDoesOracleResultExist) XXX_Size() int { + return m.Size() +} +func (m *ResponseDoesOracleResultExist) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseDoesOracleResultExist.DiscardUnknown(m) +} + +var xxx_messageInfo_ResponseDoesOracleResultExist proto.InternalMessageInfo + +func (m *ResponseDoesOracleResultExist) GetDoesExist() bool { + if m != nil { + return m.DoesExist + } + return false +} + type CommitInfo struct { Round int32 `protobuf:"varint,1,opt,name=round,proto3" json:"round,omitempty"` Votes []VoteInfo `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes"` @@ -3195,7 +3309,7 @@ func (m *CommitInfo) Reset() { *m = CommitInfo{} } func (m *CommitInfo) String() string { return proto.CompactTextString(m) } func (*CommitInfo) ProtoMessage() {} func (*CommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{41} + return fileDescriptor_252557cfdd89a31a, []int{43} } func (m *CommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3253,7 +3367,7 @@ func (m *ExtendedCommitInfo) Reset() { *m = ExtendedCommitInfo{} } func (m *ExtendedCommitInfo) String() string { return proto.CompactTextString(m) } func (*ExtendedCommitInfo) ProtoMessage() {} func (*ExtendedCommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{42} + return fileDescriptor_252557cfdd89a31a, []int{44} } func (m *ExtendedCommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3308,7 +3422,7 @@ func (m *Event) Reset() { *m = Event{} } func (m *Event) String() string { return proto.CompactTextString(m) } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{43} + return fileDescriptor_252557cfdd89a31a, []int{45} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3362,7 +3476,7 @@ func (m *EventAttribute) Reset() { *m = EventAttribute{} } func (m *EventAttribute) String() string { return proto.CompactTextString(m) } func (*EventAttribute) ProtoMessage() {} func (*EventAttribute) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{44} + return fileDescriptor_252557cfdd89a31a, []int{46} } func (m *EventAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3430,7 +3544,7 @@ func (m *ExecTxResult) Reset() { *m = ExecTxResult{} } func (m *ExecTxResult) String() string { return proto.CompactTextString(m) } func (*ExecTxResult) ProtoMessage() {} func (*ExecTxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{45} + return fileDescriptor_252557cfdd89a31a, []int{47} } func (m *ExecTxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3529,7 +3643,7 @@ func (m *TxResult) Reset() { *m = TxResult{} } func (m *TxResult) String() string { return proto.CompactTextString(m) } func (*TxResult) ProtoMessage() {} func (*TxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{46} + return fileDescriptor_252557cfdd89a31a, []int{48} } func (m *TxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3596,7 +3710,7 @@ func (m *Validator) Reset() { *m = Validator{} } func (m *Validator) String() string { return proto.CompactTextString(m) } func (*Validator) ProtoMessage() {} func (*Validator) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{47} + return fileDescriptor_252557cfdd89a31a, []int{49} } func (m *Validator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3648,7 +3762,7 @@ func (m *ValidatorUpdate) Reset() { *m = ValidatorUpdate{} } func (m *ValidatorUpdate) String() string { return proto.CompactTextString(m) } func (*ValidatorUpdate) ProtoMessage() {} func (*ValidatorUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{48} + return fileDescriptor_252557cfdd89a31a, []int{50} } func (m *ValidatorUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3700,7 +3814,7 @@ func (m *VoteInfo) Reset() { *m = VoteInfo{} } func (m *VoteInfo) String() string { return proto.CompactTextString(m) } func (*VoteInfo) ProtoMessage() {} func (*VoteInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{49} + return fileDescriptor_252557cfdd89a31a, []int{51} } func (m *VoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3758,7 +3872,7 @@ func (m *ExtendedVoteInfo) Reset() { *m = ExtendedVoteInfo{} } func (m *ExtendedVoteInfo) String() string { return proto.CompactTextString(m) } func (*ExtendedVoteInfo) ProtoMessage() {} func (*ExtendedVoteInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{50} + return fileDescriptor_252557cfdd89a31a, []int{52} } func (m *ExtendedVoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3833,7 +3947,7 @@ func (m *Misbehavior) Reset() { *m = Misbehavior{} } func (m *Misbehavior) String() string { return proto.CompactTextString(m) } func (*Misbehavior) ProtoMessage() {} func (*Misbehavior) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{51} + return fileDescriptor_252557cfdd89a31a, []int{53} } func (m *Misbehavior) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3909,7 +4023,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{52} + return fileDescriptor_252557cfdd89a31a, []int{54} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4001,6 +4115,7 @@ func init() { proto.RegisterType((*RequestCreateOracleResultTx)(nil), "tendermint.abci.RequestCreateOracleResultTx") proto.RegisterType((*RequestFetchOracleVotes)(nil), "tendermint.abci.RequestFetchOracleVotes") proto.RegisterType((*RequestValidateOracleVotes)(nil), "tendermint.abci.RequestValidateOracleVotes") + proto.RegisterType((*RequestDoesOracleResultExist)(nil), "tendermint.abci.RequestDoesOracleResultExist") proto.RegisterType((*Response)(nil), "tendermint.abci.Response") proto.RegisterType((*ResponseException)(nil), "tendermint.abci.ResponseException") proto.RegisterType((*ResponseEcho)(nil), "tendermint.abci.ResponseEcho") @@ -4022,6 +4137,7 @@ func init() { proto.RegisterType((*ResponseCreateOracleResultTx)(nil), "tendermint.abci.ResponseCreateOracleResultTx") proto.RegisterType((*ResponseFetchOracleVotes)(nil), "tendermint.abci.ResponseFetchOracleVotes") proto.RegisterType((*ResponseValidateOracleVotes)(nil), "tendermint.abci.ResponseValidateOracleVotes") + proto.RegisterType((*ResponseDoesOracleResultExist)(nil), "tendermint.abci.ResponseDoesOracleResultExist") proto.RegisterType((*CommitInfo)(nil), "tendermint.abci.CommitInfo") proto.RegisterType((*ExtendedCommitInfo)(nil), "tendermint.abci.ExtendedCommitInfo") proto.RegisterType((*Event)(nil), "tendermint.abci.Event") @@ -4039,226 +4155,231 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3495 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcb, 0x8f, 0x1b, 0xc7, - 0xd1, 0xe7, 0xf0, 0xb5, 0x64, 0xf1, 0xb1, 0xb3, 0xbd, 0x2b, 0x89, 0xa2, 0xa4, 0xdd, 0xd5, 0x18, - 0xb6, 0x65, 0xc9, 0xde, 0xf5, 0x27, 0x7d, 0xb2, 0x2d, 0xc8, 0xfe, 0x00, 0x2e, 0x45, 0x89, 0xbb, - 0x92, 0x77, 0xd7, 0xb3, 0x94, 0xfc, 0xe9, 0x7b, 0x78, 0x3c, 0x4b, 0x36, 0xc9, 0xb1, 0x48, 0xce, - 0x78, 0x66, 0xb8, 0xe6, 0xfa, 0x14, 0xd8, 0x09, 0x10, 0x18, 0x08, 0x60, 0x20, 0x17, 0x1f, 0xe2, - 0x43, 0x0e, 0xb9, 0xe4, 0x2f, 0x08, 0x10, 0x20, 0xa7, 0x1c, 0x7c, 0xc8, 0xc1, 0xc7, 0x9c, 0x9c, - 0xc0, 0xba, 0x19, 0xc8, 0x29, 0x87, 0x5c, 0x83, 0x7e, 0xcc, 0x8b, 0x9c, 0xe1, 0x43, 0x76, 0x0e, - 0x41, 0x72, 0x9b, 0x2e, 0x56, 0x55, 0x77, 0x57, 0x57, 0x77, 0x55, 0xff, 0xaa, 0x09, 0x17, 0x6c, - 0x3c, 0x68, 0x61, 0xb3, 0xaf, 0x0d, 0xec, 0x6d, 0xf5, 0xb8, 0xa9, 0x6d, 0xdb, 0xa7, 0x06, 0xb6, - 0xb6, 0x0c, 0x53, 0xb7, 0x75, 0xb4, 0xec, 0xfd, 0xb8, 0x45, 0x7e, 0x2c, 0x5f, 0xf2, 0x71, 0x37, - 0xcd, 0x53, 0xc3, 0xd6, 0xb7, 0x0d, 0x53, 0xd7, 0xdb, 0x8c, 0xbf, 0x7c, 0x71, 0xf2, 0xe7, 0x27, - 0xf8, 0x94, 0x6b, 0x0b, 0x08, 0xd3, 0x5e, 0xb6, 0x0d, 0xd5, 0x54, 0xfb, 0xce, 0xcf, 0x9b, 0x13, - 0x3f, 0x9f, 0xa8, 0x3d, 0xad, 0xa5, 0xda, 0xba, 0xc9, 0x39, 0x36, 0x3a, 0xba, 0xde, 0xe9, 0xe1, - 0x6d, 0xda, 0x3a, 0x1e, 0xb6, 0xb7, 0x6d, 0xad, 0x8f, 0x2d, 0x5b, 0xed, 0x1b, 0x9c, 0x61, 0xad, - 0xa3, 0x77, 0x74, 0xfa, 0xb9, 0x4d, 0xbe, 0x42, 0xfa, 0xd5, 0x4d, 0xb5, 0xd9, 0xc3, 0xfe, 0x49, - 0x4a, 0x4f, 0x73, 0xb0, 0x24, 0xe3, 0x0f, 0x87, 0xd8, 0xb2, 0xd1, 0x75, 0x48, 0xe2, 0x66, 0x57, - 0x2f, 0x09, 0x9b, 0xc2, 0x95, 0xdc, 0xf5, 0x8b, 0x5b, 0x63, 0xf3, 0xdf, 0xe2, 0x7c, 0xb5, 0x66, - 0x57, 0xaf, 0xc7, 0x64, 0xca, 0x8b, 0x6e, 0x42, 0xaa, 0xdd, 0x1b, 0x5a, 0xdd, 0x52, 0x9c, 0x0a, - 0x5d, 0x8a, 0x12, 0xba, 0x4b, 0x98, 0xea, 0x31, 0x99, 0x71, 0x93, 0xae, 0xb4, 0x41, 0x5b, 0x2f, - 0x25, 0xa6, 0x77, 0xb5, 0x3b, 0x68, 0xd3, 0xae, 0x08, 0x2f, 0xda, 0x01, 0xd0, 0x06, 0x9a, 0xad, - 0x34, 0xbb, 0xaa, 0x36, 0x28, 0xa5, 0xa8, 0xe4, 0xe5, 0x68, 0x49, 0xcd, 0xae, 0x12, 0xc6, 0x7a, - 0x4c, 0xce, 0x6a, 0x4e, 0x83, 0x0c, 0xf7, 0xc3, 0x21, 0x36, 0x4f, 0x4b, 0xe9, 0xe9, 0xc3, 0x7d, - 0x87, 0x30, 0x91, 0xe1, 0x52, 0x6e, 0xf4, 0x26, 0x64, 0x9a, 0x5d, 0xdc, 0x7c, 0xa2, 0xd8, 0xa3, - 0x52, 0x86, 0x4a, 0x6e, 0x44, 0x49, 0x56, 0x09, 0x5f, 0x63, 0x54, 0x8f, 0xc9, 0x4b, 0x4d, 0xf6, - 0x89, 0xde, 0x80, 0x74, 0x53, 0xef, 0xf7, 0x35, 0xbb, 0x94, 0xa3, 0xb2, 0xeb, 0x91, 0xb2, 0x94, - 0xab, 0x1e, 0x93, 0x39, 0x3f, 0xda, 0x87, 0x62, 0x4f, 0xb3, 0x6c, 0xc5, 0x1a, 0xa8, 0x86, 0xd5, - 0xd5, 0x6d, 0xab, 0x94, 0xa7, 0x1a, 0x9e, 0x8f, 0xd2, 0xf0, 0x40, 0xb3, 0xec, 0x23, 0x87, 0xb9, - 0x1e, 0x93, 0x0b, 0x3d, 0x3f, 0x81, 0xe8, 0xd3, 0xdb, 0x6d, 0x6c, 0xba, 0x0a, 0x4b, 0x85, 0xe9, - 0xfa, 0x0e, 0x08, 0xb7, 0x23, 0x4f, 0xf4, 0xe9, 0x7e, 0x02, 0xfa, 0x5f, 0x58, 0xed, 0xe9, 0x6a, - 0xcb, 0x55, 0xa7, 0x34, 0xbb, 0xc3, 0xc1, 0x93, 0x52, 0x91, 0x2a, 0x7d, 0x29, 0x72, 0x90, 0xba, - 0xda, 0x72, 0x54, 0x54, 0x89, 0x40, 0x3d, 0x26, 0xaf, 0xf4, 0xc6, 0x89, 0xe8, 0x3d, 0x58, 0x53, - 0x0d, 0xa3, 0x77, 0x3a, 0xae, 0x7d, 0x99, 0x6a, 0xbf, 0x1a, 0xa5, 0xbd, 0x42, 0x64, 0xc6, 0xd5, - 0x23, 0x75, 0x82, 0x8a, 0x1a, 0x20, 0x1a, 0x26, 0x36, 0x54, 0x13, 0x2b, 0x86, 0xa9, 0x1b, 0xba, - 0xa5, 0xf6, 0x4a, 0x22, 0xd5, 0xfd, 0x62, 0x94, 0xee, 0x43, 0xc6, 0x7f, 0xc8, 0xd9, 0xeb, 0x31, - 0x79, 0xd9, 0x08, 0x92, 0x98, 0x56, 0xbd, 0x89, 0x2d, 0xcb, 0xd3, 0xba, 0x32, 0x4b, 0x2b, 0xe5, - 0x0f, 0x6a, 0x0d, 0x90, 0x50, 0x0d, 0x72, 0x78, 0x44, 0xc4, 0x95, 0x13, 0xdd, 0xc6, 0x25, 0x44, - 0x15, 0x4a, 0x91, 0x3b, 0x94, 0xb2, 0x3e, 0xd2, 0x6d, 0x5c, 0x8f, 0xc9, 0x80, 0xdd, 0x16, 0x52, - 0xe1, 0xcc, 0x09, 0x36, 0xb5, 0xf6, 0x29, 0x55, 0xa3, 0xd0, 0x5f, 0x2c, 0x4d, 0x1f, 0x94, 0x56, - 0xa9, 0xc2, 0x6b, 0x51, 0x0a, 0x1f, 0x51, 0x21, 0xa2, 0xa2, 0xe6, 0x88, 0xd4, 0x63, 0xf2, 0xea, - 0xc9, 0x24, 0x99, 0xb8, 0x58, 0x5b, 0x1b, 0xa8, 0x3d, 0xed, 0x63, 0xac, 0x1c, 0xf7, 0xf4, 0xe6, - 0x93, 0xd2, 0xda, 0x74, 0x17, 0xbb, 0xcb, 0xb9, 0x77, 0x08, 0x33, 0x71, 0xb1, 0xb6, 0x9f, 0x80, - 0x30, 0x9c, 0x6b, 0x9a, 0x58, 0xb5, 0xb1, 0xc2, 0x4e, 0x2f, 0xc5, 0xc4, 0xd6, 0xb0, 0x67, 0x93, - 0x9d, 0x78, 0x86, 0x2a, 0x7e, 0x39, 0x72, 0x37, 0x51, 0xb1, 0x03, 0x2a, 0x25, 0x53, 0x21, 0xba, - 0x2d, 0xd7, 0x9a, 0x21, 0x74, 0xf4, 0xdf, 0x80, 0xda, 0xd8, 0x6e, 0x76, 0x9d, 0x5e, 0x88, 0x7d, - 0xac, 0xd2, 0x59, 0xda, 0xc3, 0x95, 0xc8, 0xa1, 0x13, 0x09, 0xa6, 0x88, 0x18, 0x81, 0x6c, 0x38, - 0xb1, 0x3d, 0x46, 0xa3, 0x36, 0x67, 0x47, 0x39, 0x0e, 0x2a, 0x3f, 0x37, 0xc3, 0xe6, 0x5c, 0x28, - 0xa8, 0x7f, 0xf5, 0x64, 0x92, 0xbc, 0xb3, 0x04, 0xa9, 0x13, 0xb5, 0x37, 0xc4, 0x7b, 0xc9, 0x4c, - 0x52, 0x4c, 0xed, 0x25, 0x33, 0x4b, 0x62, 0x66, 0x2f, 0x99, 0xc9, 0x8a, 0xb0, 0x97, 0xcc, 0x80, - 0x98, 0x93, 0x5e, 0x84, 0x9c, 0xef, 0xf0, 0x46, 0x25, 0x58, 0xea, 0x63, 0xcb, 0x52, 0x3b, 0x98, - 0x9e, 0xf5, 0x59, 0xd9, 0x69, 0x4a, 0x45, 0xc8, 0xfb, 0x0f, 0x6c, 0xe9, 0x73, 0xc1, 0x95, 0x24, - 0x67, 0x31, 0x91, 0x3c, 0xc1, 0x26, 0x75, 0x19, 0x2e, 0xc9, 0x9b, 0xe8, 0x39, 0x28, 0xd0, 0xe5, - 0x56, 0x9c, 0xdf, 0x49, 0x40, 0x48, 0xca, 0x79, 0x4a, 0x7c, 0xc4, 0x99, 0x36, 0x20, 0x67, 0x5c, - 0x37, 0x5c, 0x96, 0x04, 0x65, 0x01, 0xe3, 0xba, 0xe1, 0x30, 0x5c, 0x86, 0x3c, 0xb1, 0x81, 0xcb, - 0x91, 0xa4, 0x9d, 0xe4, 0x08, 0x8d, 0xb3, 0x48, 0x7f, 0x88, 0x83, 0x38, 0x7e, 0xc8, 0xa3, 0x37, - 0x20, 0x49, 0xc2, 0x21, 0x0f, 0x5d, 0xe5, 0x2d, 0x16, 0x2b, 0xb7, 0x9c, 0x58, 0xb9, 0xd5, 0x70, - 0x62, 0xe5, 0x4e, 0xe6, 0xab, 0x6f, 0x36, 0x62, 0x9f, 0xff, 0x69, 0x43, 0x90, 0xa9, 0x04, 0x3a, - 0x4f, 0x8e, 0x76, 0x55, 0x1b, 0x28, 0x5a, 0x8b, 0x0e, 0x39, 0x4b, 0xce, 0x6d, 0x55, 0x1b, 0xec, - 0xb6, 0xd0, 0x03, 0x10, 0x9b, 0xfa, 0xc0, 0xc2, 0x03, 0x6b, 0x68, 0x29, 0x2c, 0x5a, 0xf3, 0x80, - 0x15, 0x08, 0x3b, 0x2c, 0x9c, 0x56, 0x1d, 0xce, 0x43, 0xca, 0x28, 0x2f, 0x37, 0x83, 0x04, 0x74, - 0x17, 0xc0, 0x0d, 0xe9, 0x56, 0x29, 0xb9, 0x99, 0xb8, 0x92, 0xbb, 0xbe, 0x39, 0xb1, 0xf8, 0x8f, - 0x1c, 0x96, 0x87, 0x06, 0x59, 0xe5, 0x9d, 0x24, 0x19, 0xae, 0xec, 0x93, 0x44, 0x2f, 0xc0, 0xb2, - 0x6a, 0x18, 0x8a, 0x65, 0x13, 0x87, 0x3a, 0x3e, 0x25, 0x9e, 0x44, 0x62, 0x61, 0x5e, 0x2e, 0xa8, - 0x86, 0x71, 0x44, 0xa8, 0x3b, 0x84, 0x88, 0x9e, 0x87, 0x22, 0x89, 0x7b, 0x9a, 0xda, 0x53, 0xba, - 0x58, 0xeb, 0x74, 0x6d, 0x1a, 0xf3, 0x12, 0x72, 0x81, 0x53, 0xeb, 0x94, 0x28, 0xb5, 0xdc, 0x15, - 0xa7, 0x31, 0x0f, 0x21, 0x48, 0xb6, 0x54, 0x5b, 0xa5, 0x96, 0xcc, 0xcb, 0xf4, 0x9b, 0xd0, 0x0c, - 0xd5, 0xee, 0x72, 0xfb, 0xd0, 0x6f, 0x74, 0x16, 0xd2, 0x5c, 0x6d, 0x82, 0xaa, 0xe5, 0x2d, 0xb4, - 0x06, 0x29, 0xc3, 0xd4, 0x4f, 0x30, 0x5d, 0xba, 0x8c, 0xcc, 0x1a, 0x92, 0x0c, 0xc5, 0x60, 0x7c, - 0x44, 0x45, 0x88, 0xdb, 0x23, 0xde, 0x4b, 0xdc, 0x1e, 0xa1, 0x57, 0x21, 0x49, 0x0c, 0x49, 0xfb, - 0x28, 0x86, 0x64, 0x04, 0x5c, 0xae, 0x71, 0x6a, 0x60, 0x99, 0x72, 0x4a, 0xcb, 0x50, 0x08, 0xc4, - 0x4d, 0xe9, 0x2c, 0xac, 0x85, 0x85, 0x41, 0xa9, 0xeb, 0xd2, 0x03, 0xe1, 0x0c, 0xdd, 0x84, 0x8c, - 0x1b, 0x07, 0x99, 0xe3, 0x9c, 0x9f, 0xe8, 0xd6, 0x61, 0x96, 0x5d, 0x56, 0xe2, 0x31, 0x64, 0x01, - 0xba, 0x2a, 0xcf, 0x7a, 0xf2, 0xf2, 0x92, 0x6a, 0x18, 0x75, 0xd5, 0xea, 0x4a, 0xef, 0x43, 0x29, - 0x2a, 0xc6, 0xf9, 0x0c, 0x26, 0x50, 0xb7, 0x77, 0x0c, 0x76, 0x16, 0xd2, 0x6d, 0xdd, 0xec, 0xab, - 0x36, 0x55, 0x56, 0x90, 0x79, 0x8b, 0x18, 0x92, 0xc5, 0xbb, 0x04, 0x25, 0xb3, 0x86, 0xa4, 0xc0, - 0xf9, 0xc8, 0x38, 0x47, 0x44, 0xb4, 0x41, 0x0b, 0x33, 0xb3, 0x16, 0x64, 0xd6, 0xf0, 0x14, 0xb1, - 0xc1, 0xb2, 0x06, 0xe9, 0xd6, 0xa2, 0x73, 0xa5, 0xfa, 0xb3, 0x32, 0x6f, 0x49, 0x5f, 0x24, 0xe0, - 0x6c, 0x78, 0xb4, 0x43, 0x9b, 0x90, 0xef, 0xab, 0x23, 0xc5, 0x1e, 0x71, 0xb7, 0x13, 0xe8, 0xc2, - 0x43, 0x5f, 0x1d, 0x35, 0x46, 0xcc, 0xe7, 0x44, 0x48, 0xd8, 0x23, 0xab, 0x14, 0xdf, 0x4c, 0x5c, - 0xc9, 0xcb, 0xe4, 0x13, 0x3d, 0x84, 0x95, 0x9e, 0xde, 0x54, 0x7b, 0x4a, 0x4f, 0xb5, 0x6c, 0x85, - 0xa7, 0x41, 0x6c, 0x13, 0x3d, 0x37, 0x61, 0x6c, 0x16, 0xb7, 0x70, 0x8b, 0xad, 0x27, 0x39, 0x70, - 0xb8, 0xff, 0x2f, 0x53, 0x1d, 0x0f, 0x54, 0x67, 0xa9, 0xd1, 0x1d, 0xc8, 0xf5, 0x35, 0xeb, 0x18, - 0x77, 0xd5, 0x13, 0x4d, 0x37, 0xf9, 0x6e, 0x9a, 0x74, 0x9a, 0xb7, 0x3d, 0x1e, 0xae, 0xc9, 0x2f, - 0xe6, 0x5b, 0x92, 0x54, 0xc0, 0x87, 0x9d, 0xd3, 0x24, 0xbd, 0xf0, 0x69, 0xf2, 0x2a, 0xac, 0x0d, - 0xf0, 0xc8, 0x56, 0xbc, 0xfd, 0xca, 0xfc, 0x64, 0x89, 0x9a, 0x1e, 0x91, 0xdf, 0xdc, 0x1d, 0x6e, - 0x11, 0x97, 0x41, 0x2f, 0xd1, 0x7c, 0xc1, 0xd0, 0x2d, 0x6c, 0x2a, 0x6a, 0xab, 0x65, 0x62, 0xcb, - 0xa2, 0x29, 0x66, 0x9e, 0x26, 0x01, 0x94, 0x5e, 0x61, 0x64, 0xe9, 0xa7, 0xfe, 0xa5, 0x09, 0xe6, - 0x07, 0xdc, 0xf0, 0x82, 0x67, 0xf8, 0x23, 0x58, 0xe3, 0xf2, 0xad, 0x80, 0xed, 0x59, 0x9e, 0x7e, - 0x61, 0x72, 0x7f, 0x8d, 0xdb, 0x1c, 0x39, 0xe2, 0xd1, 0x66, 0x4f, 0x3c, 0x9b, 0xd9, 0x11, 0x24, - 0xa9, 0x51, 0x92, 0xec, 0x88, 0x21, 0xdf, 0xff, 0x6c, 0x4b, 0xf1, 0x69, 0x02, 0x56, 0x26, 0x92, - 0x2d, 0x77, 0x62, 0x42, 0xe8, 0xc4, 0xe2, 0xa1, 0x13, 0x4b, 0x2c, 0x3c, 0x31, 0xbe, 0xd6, 0xc9, - 0xd9, 0x6b, 0x9d, 0xfa, 0x01, 0xd7, 0x3a, 0xfd, 0x6c, 0x6b, 0xfd, 0x0f, 0x5d, 0x85, 0x5f, 0x08, - 0x50, 0x8e, 0xce, 0x50, 0x43, 0x97, 0xe3, 0x1a, 0xac, 0xb8, 0x43, 0x71, 0xd5, 0xb3, 0x83, 0x51, - 0x74, 0x7f, 0xe0, 0xfa, 0x23, 0x63, 0xdc, 0xf3, 0x50, 0x1c, 0xcb, 0x9f, 0x99, 0x2b, 0x17, 0x4e, - 0xfc, 0xfd, 0x4b, 0x3f, 0x4e, 0xb8, 0x81, 0x27, 0x90, 0xe4, 0x86, 0xec, 0xd6, 0x77, 0x60, 0xb5, - 0x85, 0x9b, 0x5a, 0xeb, 0x59, 0x37, 0xeb, 0x0a, 0x97, 0xfe, 0xf7, 0x5e, 0x9d, 0xf4, 0x92, 0x4f, - 0x04, 0xb8, 0x30, 0xe5, 0x4a, 0x80, 0xca, 0x90, 0x71, 0x44, 0xb8, 0xab, 0xb8, 0x6d, 0x74, 0x0f, - 0x8a, 0x1d, 0xdd, 0xb2, 0x34, 0x03, 0xb7, 0x78, 0xd6, 0x1e, 0x9f, 0x4c, 0xdc, 0x58, 0x56, 0xbf, - 0x75, 0x8f, 0x33, 0xd2, 0x9c, 0x5c, 0x2e, 0x74, 0xfc, 0x4d, 0xe9, 0x3c, 0x9c, 0x8b, 0xb8, 0x34, - 0x48, 0xb7, 0x3c, 0x27, 0x9e, 0xcc, 0xed, 0xd1, 0x05, 0xc8, 0xf2, 0x5b, 0x83, 0x9b, 0x2e, 0x65, - 0x18, 0xa1, 0x31, 0x92, 0x7e, 0x9b, 0x87, 0x8c, 0x8c, 0x2d, 0x83, 0xa4, 0x9a, 0x68, 0x07, 0xb2, - 0x78, 0xd4, 0xc4, 0x86, 0xed, 0x64, 0xe7, 0xe1, 0x37, 0x44, 0xc6, 0x5d, 0x73, 0x38, 0xeb, 0x31, - 0xd9, 0x13, 0x43, 0x37, 0x38, 0x04, 0x14, 0x8d, 0xe6, 0x70, 0x71, 0x3f, 0x06, 0xf4, 0x9a, 0x83, - 0x01, 0x25, 0x22, 0xe1, 0x0d, 0x26, 0x35, 0x06, 0x02, 0xdd, 0xe0, 0x20, 0x50, 0x72, 0x46, 0x67, - 0x01, 0x14, 0xa8, 0x1a, 0x40, 0x81, 0xd2, 0x33, 0xa6, 0x19, 0x01, 0x03, 0xbd, 0xe6, 0xc0, 0x40, - 0x4b, 0x33, 0x46, 0x3c, 0x86, 0x03, 0xbd, 0xe5, 0xc3, 0x81, 0xb2, 0x54, 0x74, 0x33, 0x52, 0x34, - 0x04, 0x08, 0xba, 0xe5, 0x02, 0x41, 0xf9, 0x48, 0x10, 0x89, 0x0b, 0x8f, 0x23, 0x41, 0x07, 0x13, - 0x48, 0x10, 0x43, 0x6e, 0x5e, 0x88, 0x54, 0x31, 0x03, 0x0a, 0x3a, 0x98, 0x80, 0x82, 0x8a, 0x33, - 0x14, 0xce, 0xc0, 0x82, 0xfe, 0x2f, 0x1c, 0x0b, 0x8a, 0x46, 0x6b, 0xf8, 0x30, 0xe7, 0x03, 0x83, - 0x94, 0x08, 0x30, 0x48, 0x8c, 0xbc, 0x44, 0x33, 0xf5, 0x73, 0xa3, 0x41, 0x0f, 0x43, 0xd0, 0xa0, - 0x95, 0xc8, 0xeb, 0x3f, 0x53, 0x3e, 0x07, 0x1c, 0xf4, 0x30, 0x04, 0x0e, 0x42, 0x33, 0xd5, 0xce, - 0xc4, 0x83, 0xee, 0x06, 0xf1, 0xa0, 0xd5, 0x88, 0x84, 0xda, 0xdb, 0xed, 0x11, 0x80, 0xd0, 0x71, - 0x14, 0x20, 0xb4, 0x16, 0x89, 0xad, 0x30, 0x8d, 0x0b, 0x20, 0x42, 0x07, 0x13, 0x88, 0xd0, 0x99, - 0x19, 0x9e, 0x36, 0x03, 0x12, 0x6a, 0x47, 0x43, 0x42, 0x0c, 0xb0, 0x79, 0x25, 0x7a, 0x5f, 0x2d, - 0x82, 0x09, 0x3d, 0x0e, 0xc5, 0x84, 0xce, 0x45, 0x82, 0x9b, 0x7c, 0xf0, 0xf3, 0x80, 0x42, 0xc7, - 0x51, 0xa0, 0x50, 0x69, 0x96, 0xdd, 0x9f, 0x09, 0x15, 0x4a, 0x89, 0xe9, 0xbd, 0x64, 0x26, 0x23, - 0x66, 0x19, 0x1e, 0xb4, 0x97, 0xcc, 0xe4, 0xc4, 0xbc, 0xf4, 0x12, 0xc9, 0x61, 0xc7, 0xc2, 0x01, - 0xb9, 0x2d, 0x62, 0xd3, 0xd4, 0x4d, 0x8e, 0xef, 0xb0, 0x86, 0x74, 0x05, 0xf2, 0xfe, 0xa3, 0x7f, - 0x0a, 0x82, 0x44, 0x6f, 0xe5, 0xbe, 0xe3, 0x5e, 0xfa, 0x8d, 0xe0, 0xc9, 0x52, 0x0c, 0xc9, 0x8f, - 0x30, 0x64, 0x39, 0xc2, 0xe0, 0xc3, 0x95, 0xe2, 0x41, 0x5c, 0x69, 0x03, 0x72, 0xe4, 0xb6, 0x3d, - 0x06, 0x19, 0xa9, 0x86, 0x0b, 0x19, 0x5d, 0x85, 0x15, 0x9a, 0x32, 0x31, 0xf4, 0x89, 0x27, 0x26, - 0x49, 0x9a, 0x98, 0x2c, 0x93, 0x1f, 0x98, 0x13, 0xb1, 0x0c, 0xe5, 0x15, 0x58, 0xf5, 0xf1, 0xba, - 0xb7, 0x78, 0x86, 0x9f, 0x88, 0x2e, 0x77, 0x85, 0x5f, 0xe7, 0x7f, 0x2f, 0x78, 0x16, 0xf2, 0xb0, - 0xa6, 0x30, 0x58, 0x48, 0xf8, 0x81, 0x60, 0xa1, 0xf8, 0x33, 0xc3, 0x42, 0x7e, 0x54, 0x22, 0x11, - 0x44, 0x25, 0xfe, 0x26, 0x78, 0x6b, 0xe2, 0x82, 0x3c, 0x4d, 0xbd, 0x85, 0x39, 0x4e, 0x40, 0xbf, - 0x49, 0x52, 0xda, 0xd3, 0x3b, 0x1c, 0x0d, 0x20, 0x9f, 0x84, 0xcb, 0x8d, 0xcf, 0x59, 0x1e, 0x7e, - 0x5d, 0x88, 0x81, 0xa5, 0x7e, 0x1c, 0x62, 0x10, 0x21, 0xf1, 0x04, 0xb3, 0xa2, 0x4a, 0x5e, 0x26, - 0x9f, 0x84, 0x8f, 0x3a, 0x1f, 0x4f, 0xe1, 0x58, 0x03, 0xbd, 0x01, 0x59, 0x5a, 0x31, 0x53, 0x74, - 0xc3, 0xe2, 0x85, 0x94, 0x40, 0x72, 0xcb, 0xca, 0x66, 0x5b, 0x87, 0x84, 0xe7, 0xc0, 0xb0, 0x68, - 0x22, 0x46, 0xbf, 0x7c, 0x39, 0x67, 0x36, 0x90, 0x73, 0x5e, 0x84, 0x2c, 0x19, 0xbd, 0x65, 0xa8, - 0x4d, 0x5c, 0x02, 0x3a, 0x50, 0x8f, 0x20, 0xfd, 0x3a, 0x0e, 0xcb, 0x63, 0xf1, 0x38, 0x74, 0xee, - 0x8e, 0x4b, 0xc6, 0x7d, 0xa0, 0xd7, 0x7c, 0xf6, 0x58, 0x07, 0xe8, 0xa8, 0x96, 0xf2, 0x91, 0x3a, - 0xb0, 0x71, 0x8b, 0x1b, 0xc5, 0x47, 0x21, 0xc9, 0x25, 0x69, 0x0d, 0x2d, 0xdc, 0xe2, 0xf8, 0x9b, - 0xdb, 0x46, 0x75, 0x48, 0xe3, 0x13, 0x3c, 0xb0, 0xad, 0xd2, 0x12, 0x5d, 0xf6, 0xb3, 0x93, 0x80, - 0x08, 0xf9, 0x79, 0xa7, 0x44, 0x16, 0xfb, 0xbb, 0x6f, 0x36, 0x44, 0xc6, 0xfd, 0xb2, 0xde, 0xd7, - 0x6c, 0xdc, 0x37, 0xec, 0x53, 0x99, 0xcb, 0x07, 0xad, 0x90, 0x19, 0xb3, 0x02, 0x45, 0x82, 0xf3, - 0x0e, 0xc0, 0x43, 0x6c, 0xaa, 0xe9, 0xa6, 0x66, 0x9f, 0xca, 0x85, 0x3e, 0xee, 0x1b, 0xba, 0xde, - 0x53, 0xd8, 0x1e, 0xaf, 0x40, 0x31, 0x98, 0x7e, 0xa0, 0xe7, 0xa0, 0x60, 0x62, 0x5b, 0xd5, 0x06, - 0x4a, 0xe0, 0x1a, 0x94, 0x67, 0x44, 0xb6, 0xa7, 0xf6, 0x92, 0x19, 0x41, 0x8c, 0xef, 0x25, 0x33, - 0x71, 0x31, 0x21, 0x1d, 0xc2, 0x99, 0xd0, 0xf4, 0x03, 0xbd, 0x0e, 0x59, 0x2f, 0x73, 0x11, 0xe8, - 0x6c, 0xa7, 0x60, 0x6d, 0x1e, 0xaf, 0xf4, 0x3b, 0xc1, 0x53, 0x19, 0x44, 0xef, 0x6a, 0x90, 0x66, - 0xe7, 0x3e, 0x5d, 0xc9, 0xe2, 0x94, 0x43, 0x3f, 0x20, 0xb7, 0xc5, 0x8e, 0x77, 0x99, 0x0b, 0x4b, - 0xef, 0x41, 0x9a, 0x51, 0x50, 0x0e, 0x96, 0x1e, 0xee, 0xdf, 0xdf, 0x3f, 0x78, 0x77, 0x5f, 0x8c, - 0x21, 0x80, 0x74, 0xa5, 0x5a, 0xad, 0x1d, 0x36, 0x44, 0x01, 0x65, 0x21, 0x55, 0xd9, 0x39, 0x90, - 0x1b, 0x62, 0x9c, 0x90, 0xe5, 0xda, 0x5e, 0xad, 0xda, 0x10, 0x13, 0x68, 0x05, 0x0a, 0xec, 0x5b, - 0xb9, 0x7b, 0x20, 0xbf, 0x5d, 0x69, 0x88, 0x49, 0x1f, 0xe9, 0xa8, 0xb6, 0x7f, 0xa7, 0x26, 0x8b, - 0x29, 0xe9, 0x3f, 0xe0, 0x7c, 0x64, 0xaa, 0xe3, 0x41, 0x73, 0x82, 0x0f, 0x9a, 0x93, 0xbe, 0x88, - 0x93, 0x1b, 0x41, 0x54, 0xfe, 0x82, 0xf6, 0xc6, 0x26, 0x7e, 0x7d, 0x81, 0xe4, 0x67, 0x6c, 0xf6, - 0xe4, 0x26, 0x6b, 0x62, 0x16, 0xe4, 0x68, 0xdf, 0xec, 0x04, 0x2a, 0xc8, 0x05, 0x4e, 0xa5, 0x42, - 0x16, 0x63, 0xfb, 0x00, 0x37, 0x6d, 0x85, 0x39, 0x91, 0x45, 0xaf, 0x93, 0x59, 0xc2, 0x46, 0xa8, - 0x47, 0x8c, 0x28, 0xbd, 0xbf, 0x90, 0x2d, 0xb3, 0x90, 0x92, 0x6b, 0x0d, 0xf9, 0xb1, 0x98, 0x40, - 0x08, 0x8a, 0xf4, 0x53, 0x39, 0xda, 0xaf, 0x1c, 0x1e, 0xd5, 0x0f, 0x88, 0x2d, 0x57, 0x61, 0xd9, - 0xb1, 0xa5, 0x43, 0x4c, 0x49, 0xd7, 0xc8, 0x35, 0x2a, 0x34, 0xf9, 0x9a, 0xbc, 0x54, 0x4b, 0xbf, - 0x14, 0xfc, 0xdc, 0xc1, 0x04, 0xea, 0x00, 0xd2, 0x96, 0xad, 0xda, 0x43, 0x8b, 0x1b, 0xf1, 0xf5, - 0x79, 0xb3, 0xb1, 0x2d, 0xe7, 0xe3, 0x88, 0x8a, 0xcb, 0x5c, 0x8d, 0x74, 0x13, 0x8a, 0xc1, 0x5f, - 0xa2, 0x6d, 0xe0, 0x39, 0x51, 0x5c, 0xba, 0x0d, 0x68, 0x32, 0x49, 0x0b, 0x01, 0x18, 0x84, 0x30, - 0x80, 0xe1, 0x57, 0xf4, 0x66, 0x1b, 0x99, 0x90, 0xa1, 0x77, 0xc6, 0x26, 0x79, 0x6b, 0x91, 0x74, - 0x6e, 0x8b, 0xd1, 0xc6, 0xa6, 0x79, 0x03, 0xf2, 0x7e, 0xfa, 0x7c, 0x93, 0xfc, 0x2e, 0xee, 0x6d, - 0xe2, 0x20, 0x12, 0xe2, 0x1d, 0x81, 0xc2, 0xf7, 0x3c, 0x02, 0xdf, 0x04, 0xb0, 0x47, 0x3c, 0x13, - 0x74, 0xe2, 0xe8, 0xa5, 0x10, 0x84, 0x19, 0x37, 0x1b, 0x23, 0xbe, 0x09, 0xb2, 0x36, 0xff, 0xb2, - 0xd0, 0x91, 0x1f, 0x16, 0x1a, 0xd2, 0x18, 0x6b, 0x71, 0xc8, 0x64, 0xde, 0x60, 0xec, 0xc1, 0x47, - 0x8c, 0x6c, 0xa1, 0xc7, 0x70, 0x6e, 0x2c, 0x51, 0x70, 0x55, 0x27, 0xe7, 0xcd, 0x17, 0xce, 0x04, - 0xf3, 0x05, 0x47, 0xb5, 0x3f, 0xda, 0xa7, 0x82, 0xd1, 0xfe, 0x2d, 0xb8, 0x38, 0x2d, 0xdb, 0x45, - 0x97, 0x00, 0xf0, 0x80, 0x04, 0x87, 0x96, 0x87, 0x28, 0x64, 0x39, 0xa5, 0x31, 0x92, 0xee, 0x41, - 0x29, 0x2a, 0x93, 0x45, 0xd7, 0x20, 0x49, 0xaf, 0x1b, 0x2c, 0xdb, 0x39, 0x17, 0x82, 0x81, 0x10, - 0x3e, 0x99, 0x32, 0x49, 0x3f, 0xf3, 0x3b, 0x67, 0x08, 0xb0, 0x71, 0x7f, 0xcc, 0x39, 0x6f, 0x2c, - 0x92, 0xf3, 0x6e, 0x8d, 0xb9, 0xe5, 0x65, 0x48, 0x73, 0x87, 0x24, 0x3e, 0xb8, 0x73, 0x54, 0xdb, - 0x6f, 0x88, 0x31, 0xe2, 0x9c, 0x87, 0x72, 0x8d, 0x36, 0x04, 0xe9, 0x31, 0x80, 0x07, 0x9b, 0x91, - 0x93, 0xd7, 0xd4, 0x87, 0x83, 0x16, 0xed, 0x3c, 0x25, 0xb3, 0x06, 0xba, 0x09, 0x29, 0x3f, 0xca, - 0x33, 0x19, 0xa2, 0x48, 0xe7, 0x3e, 0xd8, 0x8d, 0x71, 0x4b, 0x1a, 0xa0, 0xc9, 0xd2, 0x45, 0x44, - 0x17, 0x6f, 0x05, 0xbb, 0xb8, 0x1c, 0x59, 0x04, 0x09, 0xef, 0xea, 0x63, 0x48, 0xd1, 0x1d, 0x41, - 0x92, 0x11, 0x5a, 0x2f, 0xe3, 0x59, 0x34, 0xf9, 0x46, 0xff, 0x0f, 0xa0, 0xda, 0xb6, 0xa9, 0x1d, - 0x0f, 0xbd, 0x0e, 0x36, 0xc2, 0x77, 0x54, 0xc5, 0xe1, 0xdb, 0xb9, 0xc8, 0xb7, 0xd6, 0x9a, 0x27, - 0xea, 0xdb, 0x5e, 0x3e, 0x85, 0xd2, 0x3e, 0x14, 0x83, 0xb2, 0x4e, 0xde, 0xc7, 0xc6, 0x10, 0xcc, - 0xfb, 0x58, 0x1a, 0xcf, 0xf3, 0x3e, 0x37, 0x6b, 0x4c, 0xb0, 0xa2, 0x20, 0x6d, 0x48, 0x3f, 0x8a, - 0x43, 0xde, 0xbf, 0x21, 0xff, 0xf5, 0x52, 0x33, 0xe9, 0x27, 0x02, 0x64, 0xdc, 0xe9, 0x07, 0x2b, - 0x84, 0x81, 0x92, 0x2a, 0xb3, 0x5e, 0xdc, 0x5f, 0xd6, 0x63, 0x05, 0xd4, 0x84, 0x5b, 0x40, 0xbd, - 0xed, 0xa6, 0x05, 0x51, 0x78, 0x9a, 0xdf, 0xd6, 0xdc, 0xab, 0x9c, 0x2c, 0xe8, 0x36, 0x64, 0xdd, - 0x53, 0x8d, 0x5c, 0xc6, 0x1c, 0x48, 0x55, 0xe0, 0x67, 0x0b, 0x07, 0xc4, 0xd7, 0x20, 0x65, 0xe8, - 0x1f, 0xf1, 0x9a, 0x61, 0x42, 0x66, 0x0d, 0xa9, 0x05, 0xcb, 0x63, 0x47, 0x22, 0xba, 0x0d, 0x4b, - 0xc6, 0xf0, 0x58, 0x71, 0x9c, 0x63, 0x0c, 0x78, 0x76, 0xd2, 0xfc, 0xe1, 0x71, 0x4f, 0x6b, 0xde, - 0xc7, 0xa7, 0xce, 0x60, 0x8c, 0xe1, 0xf1, 0x7d, 0xe6, 0x43, 0xac, 0x97, 0xb8, 0xbf, 0x97, 0x9f, - 0x0b, 0x90, 0x71, 0xf6, 0x04, 0xfa, 0x2f, 0xc8, 0xba, 0xc7, 0xad, 0x5b, 0xf4, 0x8f, 0x3c, 0xa7, - 0xb9, 0x7e, 0x4f, 0x04, 0x55, 0x9c, 0xd7, 0x0a, 0x5a, 0x4b, 0x69, 0xf7, 0x54, 0xe6, 0x4b, 0xc5, - 0xa0, 0xcd, 0xd8, 0x81, 0x4c, 0xe3, 0xd4, 0xee, 0x9d, 0xbb, 0x3d, 0xb5, 0x23, 0xe7, 0xa8, 0xcc, - 0x6e, 0x8b, 0x34, 0x78, 0xc6, 0xfb, 0x57, 0x01, 0xc4, 0xf1, 0x1d, 0xfb, 0xbd, 0x47, 0x37, 0x19, - 0xfe, 0x13, 0x21, 0xe1, 0x1f, 0x6d, 0xc3, 0xaa, 0xcb, 0xa1, 0x58, 0x5a, 0x67, 0xa0, 0xda, 0x43, - 0x13, 0x73, 0xa8, 0x1e, 0xb9, 0x3f, 0x1d, 0x39, 0xbf, 0x4c, 0xce, 0x3a, 0xf5, 0x8c, 0xb3, 0xfe, - 0x34, 0x0e, 0x39, 0x5f, 0xe1, 0x00, 0xfd, 0xa7, 0xef, 0x30, 0x2a, 0x86, 0x44, 0x4c, 0x1f, 0xaf, - 0x57, 0xc0, 0x0f, 0x9a, 0x29, 0xbe, 0xb8, 0x99, 0xa2, 0xca, 0x33, 0x4e, 0x1d, 0x22, 0xb9, 0x70, - 0x1d, 0xe2, 0x65, 0x40, 0xb6, 0x6e, 0xab, 0x3d, 0xe5, 0x44, 0xb7, 0xb5, 0x41, 0x47, 0x61, 0x6e, - 0xc8, 0x8e, 0x0e, 0x91, 0xfe, 0xf2, 0x88, 0xfe, 0x70, 0x48, 0x3d, 0xf2, 0x13, 0x01, 0x32, 0xee, - 0x75, 0x64, 0xd1, 0xf2, 0xfe, 0x59, 0x48, 0xf3, 0x8c, 0x9b, 0xd5, 0xf7, 0x79, 0x2b, 0xb4, 0xe0, - 0x52, 0x86, 0x4c, 0x1f, 0xdb, 0x2a, 0x3d, 0x07, 0x59, 0xb4, 0x77, 0xdb, 0x57, 0x6f, 0x41, 0xce, - 0xf7, 0x34, 0x82, 0x1c, 0x8d, 0xfb, 0xb5, 0x77, 0xc5, 0x58, 0x79, 0xe9, 0xb3, 0x2f, 0x37, 0x13, - 0xfb, 0xf8, 0x23, 0xb2, 0x9b, 0xe5, 0x5a, 0xb5, 0x5e, 0xab, 0xde, 0x17, 0x85, 0x72, 0xee, 0xb3, - 0x2f, 0x37, 0x97, 0x64, 0x4c, 0x01, 0xe9, 0xab, 0xf7, 0x61, 0x79, 0x6c, 0x61, 0x82, 0xe9, 0x1c, - 0x82, 0xe2, 0x9d, 0x87, 0x87, 0x0f, 0x76, 0xab, 0x95, 0x46, 0x4d, 0x79, 0x74, 0xd0, 0xa8, 0x89, - 0x02, 0x3a, 0x07, 0xab, 0x0f, 0x76, 0xef, 0xd5, 0x1b, 0x4a, 0xf5, 0xc1, 0x6e, 0x6d, 0xbf, 0xa1, - 0x54, 0x1a, 0x8d, 0x4a, 0xf5, 0xbe, 0x18, 0xbf, 0xfe, 0x97, 0x02, 0x24, 0x2b, 0x3b, 0xd5, 0x5d, - 0x54, 0x85, 0x24, 0x85, 0x88, 0xa6, 0xbe, 0x1f, 0x2d, 0x4f, 0x2f, 0x2d, 0xa0, 0xbb, 0x90, 0xa2, - 0xe8, 0x11, 0x9a, 0xfe, 0xa0, 0xb4, 0x3c, 0xa3, 0xd6, 0x40, 0x06, 0x43, 0x77, 0xe4, 0xd4, 0x17, - 0xa6, 0xe5, 0xe9, 0xa5, 0x07, 0xf4, 0x00, 0x96, 0x1c, 0xf0, 0x60, 0xd6, 0xb3, 0xcf, 0xf2, 0xcc, - 0x7a, 0x00, 0x99, 0x1a, 0x03, 0x61, 0xa6, 0x3f, 0x3e, 0x2d, 0xcf, 0x28, 0x4a, 0xa0, 0x5d, 0x48, - 0xf3, 0x6b, 0xfa, 0x8c, 0xf7, 0xa4, 0xe5, 0x59, 0x65, 0x06, 0x24, 0x43, 0xd6, 0x83, 0xb7, 0x66, - 0x3f, 0xa9, 0x2d, 0xcf, 0x51, 0x6f, 0x41, 0xef, 0x41, 0x21, 0x08, 0x01, 0xcc, 0xf7, 0x66, 0xb5, - 0x3c, 0x67, 0x41, 0x83, 0xe8, 0x0f, 0xe2, 0x01, 0xf3, 0xbd, 0x61, 0x2d, 0xcf, 0x59, 0xdf, 0x40, - 0x1f, 0xc0, 0xca, 0xe4, 0x7d, 0x7d, 0xfe, 0x27, 0xad, 0xe5, 0x05, 0x2a, 0x1e, 0xa8, 0x0f, 0x28, - 0xe4, 0x9e, 0xbf, 0xc0, 0x0b, 0xd7, 0xf2, 0x22, 0x05, 0x10, 0xd4, 0x82, 0xe5, 0xf1, 0xcb, 0xf3, - 0xbc, 0x2f, 0x5e, 0xcb, 0x73, 0x17, 0x43, 0x58, 0x2f, 0xc1, 0x4b, 0xf7, 0xbc, 0x2f, 0x60, 0xcb, - 0x73, 0xd7, 0x46, 0xd0, 0x43, 0x00, 0xdf, 0xbd, 0x79, 0x8e, 0x17, 0xb1, 0xe5, 0x79, 0xaa, 0x24, - 0xc8, 0x80, 0xd5, 0xb0, 0x0b, 0xf5, 0x22, 0x0f, 0x64, 0xcb, 0x0b, 0x15, 0x4f, 0x88, 0x3f, 0x07, - 0xaf, 0xc6, 0xf3, 0x3d, 0x98, 0x2d, 0xcf, 0x59, 0x45, 0x41, 0x16, 0xac, 0x85, 0x5e, 0x07, 0x17, - 0x7a, 0x3e, 0x5b, 0x5e, 0xac, 0xb2, 0x82, 0x3a, 0x20, 0x4e, 0x5c, 0x22, 0xe7, 0x7e, 0x4d, 0x5b, - 0x9e, 0xbf, 0xc6, 0x42, 0xd7, 0x2b, 0xe4, 0x8e, 0xb9, 0xc8, 0xe3, 0xda, 0xf2, 0x42, 0x45, 0x97, - 0x9d, 0xca, 0x57, 0xdf, 0xae, 0x0b, 0x5f, 0x7f, 0xbb, 0x2e, 0xfc, 0xf9, 0xdb, 0x75, 0xe1, 0xf3, - 0xa7, 0xeb, 0xb1, 0xaf, 0x9f, 0xae, 0xc7, 0xfe, 0xf8, 0x74, 0x3d, 0xf6, 0x3f, 0x2f, 0x76, 0x34, - 0xbb, 0x3b, 0x3c, 0xde, 0x6a, 0xea, 0xfd, 0xed, 0xa6, 0xde, 0xc7, 0xf6, 0x71, 0xdb, 0xf6, 0x3e, - 0xbc, 0xbf, 0x99, 0x1c, 0xa7, 0x69, 0x46, 0x72, 0xe3, 0xef, 0x01, 0x00, 0x00, 0xff, 0xff, 0x89, - 0xf5, 0xc0, 0xc9, 0x86, 0x32, 0x00, 0x00, + // 3583 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcd, 0x6f, 0x1b, 0xc7, + 0x15, 0xe7, 0xf2, 0x4b, 0xe4, 0xe3, 0x87, 0x56, 0x23, 0x59, 0xa6, 0x69, 0x5b, 0x92, 0x37, 0x48, + 0xe2, 0xd8, 0x89, 0x94, 0xda, 0x75, 0x12, 0xc3, 0x49, 0x00, 0x89, 0xa6, 0x4d, 0xc9, 0x8e, 0xa4, + 0xac, 0x68, 0xa7, 0xee, 0x47, 0x36, 0x2b, 0x72, 0x48, 0x6e, 0x4c, 0x72, 0x37, 0xbb, 0x4b, 0x85, + 0xca, 0xa9, 0x48, 0x5a, 0xa0, 0x08, 0x50, 0x20, 0x40, 0x2f, 0x39, 0x34, 0x87, 0x1e, 0xda, 0x43, + 0xff, 0x82, 0x9e, 0x7a, 0xea, 0x21, 0x87, 0x16, 0xc8, 0xb1, 0xa7, 0xb4, 0x48, 0xd0, 0x4b, 0xae, + 0x3d, 0xf4, 0x5a, 0xcc, 0xc7, 0x7e, 0x91, 0xbb, 0xfc, 0x70, 0xd2, 0x43, 0xd1, 0xde, 0x76, 0xde, + 0xbe, 0xf7, 0x66, 0xe7, 0xcd, 0x9b, 0x79, 0x6f, 0x7e, 0x6f, 0x16, 0xce, 0xdb, 0xb8, 0xdf, 0xc4, + 0x66, 0x4f, 0xeb, 0xdb, 0x5b, 0xea, 0x71, 0x43, 0xdb, 0xb2, 0x4f, 0x0d, 0x6c, 0x6d, 0x1a, 0xa6, + 0x6e, 0xeb, 0x68, 0xd1, 0x7b, 0xb9, 0x49, 0x5e, 0x96, 0x2f, 0xfa, 0xb8, 0x1b, 0xe6, 0xa9, 0x61, + 0xeb, 0x5b, 0x86, 0xa9, 0xeb, 0x2d, 0xc6, 0x5f, 0xbe, 0x30, 0xfe, 0xfa, 0x31, 0x3e, 0xe5, 0xda, + 0x02, 0xc2, 0xb4, 0x97, 0x2d, 0x43, 0x35, 0xd5, 0x9e, 0xf3, 0x7a, 0x63, 0xec, 0xf5, 0x89, 0xda, + 0xd5, 0x9a, 0xaa, 0xad, 0x9b, 0x9c, 0x63, 0xbd, 0xad, 0xeb, 0xed, 0x2e, 0xde, 0xa2, 0xad, 0xe3, + 0x41, 0x6b, 0xcb, 0xd6, 0x7a, 0xd8, 0xb2, 0xd5, 0x9e, 0xc1, 0x19, 0x56, 0xda, 0x7a, 0x5b, 0xa7, + 0x8f, 0x5b, 0xe4, 0x29, 0xa4, 0x5f, 0xdd, 0x54, 0x1b, 0x5d, 0xec, 0x1f, 0xa4, 0xf4, 0x97, 0x3c, + 0x2c, 0xc8, 0xf8, 0xbd, 0x01, 0xb6, 0x6c, 0x74, 0x0d, 0x92, 0xb8, 0xd1, 0xd1, 0x4b, 0xc2, 0x86, + 0x70, 0x39, 0x77, 0xed, 0xc2, 0xe6, 0xc8, 0xf8, 0x37, 0x39, 0x5f, 0xb5, 0xd1, 0xd1, 0x6b, 0x31, + 0x99, 0xf2, 0xa2, 0x1b, 0x90, 0x6a, 0x75, 0x07, 0x56, 0xa7, 0x14, 0xa7, 0x42, 0x17, 0xa3, 0x84, + 0xee, 0x10, 0xa6, 0x5a, 0x4c, 0x66, 0xdc, 0xa4, 0x2b, 0xad, 0xdf, 0xd2, 0x4b, 0x89, 0xc9, 0x5d, + 0xed, 0xf6, 0x5b, 0xb4, 0x2b, 0xc2, 0x8b, 0x76, 0x00, 0xb4, 0xbe, 0x66, 0x2b, 0x8d, 0x8e, 0xaa, + 0xf5, 0x4b, 0x29, 0x2a, 0x79, 0x29, 0x5a, 0x52, 0xb3, 0x2b, 0x84, 0xb1, 0x16, 0x93, 0xb3, 0x9a, + 0xd3, 0x20, 0x9f, 0xfb, 0xde, 0x00, 0x9b, 0xa7, 0xa5, 0xf4, 0xe4, 0xcf, 0x7d, 0x93, 0x30, 0x91, + 0xcf, 0xa5, 0xdc, 0xe8, 0x55, 0xc8, 0x34, 0x3a, 0xb8, 0xf1, 0x58, 0xb1, 0x87, 0xa5, 0x0c, 0x95, + 0x5c, 0x8f, 0x92, 0xac, 0x10, 0xbe, 0xfa, 0xb0, 0x16, 0x93, 0x17, 0x1a, 0xec, 0x11, 0xbd, 0x02, + 0xe9, 0x86, 0xde, 0xeb, 0x69, 0x76, 0x29, 0x47, 0x65, 0xd7, 0x22, 0x65, 0x29, 0x57, 0x2d, 0x26, + 0x73, 0x7e, 0xb4, 0x0f, 0xc5, 0xae, 0x66, 0xd9, 0x8a, 0xd5, 0x57, 0x0d, 0xab, 0xa3, 0xdb, 0x56, + 0x29, 0x4f, 0x35, 0x3c, 0x1d, 0xa5, 0xe1, 0xbe, 0x66, 0xd9, 0x47, 0x0e, 0x73, 0x2d, 0x26, 0x17, + 0xba, 0x7e, 0x02, 0xd1, 0xa7, 0xb7, 0x5a, 0xd8, 0x74, 0x15, 0x96, 0x0a, 0x93, 0xf5, 0x1d, 0x10, + 0x6e, 0x47, 0x9e, 0xe8, 0xd3, 0xfd, 0x04, 0xf4, 0x23, 0x58, 0xee, 0xea, 0x6a, 0xd3, 0x55, 0xa7, + 0x34, 0x3a, 0x83, 0xfe, 0xe3, 0x52, 0x91, 0x2a, 0x7d, 0x2e, 0xf2, 0x23, 0x75, 0xb5, 0xe9, 0xa8, + 0xa8, 0x10, 0x81, 0x5a, 0x4c, 0x5e, 0xea, 0x8e, 0x12, 0xd1, 0xdb, 0xb0, 0xa2, 0x1a, 0x46, 0xf7, + 0x74, 0x54, 0xfb, 0x22, 0xd5, 0x7e, 0x25, 0x4a, 0xfb, 0x36, 0x91, 0x19, 0x55, 0x8f, 0xd4, 0x31, + 0x2a, 0xaa, 0x83, 0x68, 0x98, 0xd8, 0x50, 0x4d, 0xac, 0x18, 0xa6, 0x6e, 0xe8, 0x96, 0xda, 0x2d, + 0x89, 0x54, 0xf7, 0xb3, 0x51, 0xba, 0x0f, 0x19, 0xff, 0x21, 0x67, 0xaf, 0xc5, 0xe4, 0x45, 0x23, + 0x48, 0x62, 0x5a, 0xf5, 0x06, 0xb6, 0x2c, 0x4f, 0xeb, 0xd2, 0x34, 0xad, 0x94, 0x3f, 0xa8, 0x35, + 0x40, 0x42, 0x55, 0xc8, 0xe1, 0x21, 0x11, 0x57, 0x4e, 0x74, 0x1b, 0x97, 0x10, 0x55, 0x28, 0x45, + 0xae, 0x50, 0xca, 0xfa, 0x50, 0xb7, 0x71, 0x2d, 0x26, 0x03, 0x76, 0x5b, 0x48, 0x85, 0x33, 0x27, + 0xd8, 0xd4, 0x5a, 0xa7, 0x54, 0x8d, 0x42, 0xdf, 0x58, 0x9a, 0xde, 0x2f, 0x2d, 0x53, 0x85, 0x57, + 0xa3, 0x14, 0x3e, 0xa4, 0x42, 0x44, 0x45, 0xd5, 0x11, 0xa9, 0xc5, 0xe4, 0xe5, 0x93, 0x71, 0x32, + 0x71, 0xb1, 0x96, 0xd6, 0x57, 0xbb, 0xda, 0x07, 0x58, 0x39, 0xee, 0xea, 0x8d, 0xc7, 0xa5, 0x95, + 0xc9, 0x2e, 0x76, 0x87, 0x73, 0xef, 0x10, 0x66, 0xe2, 0x62, 0x2d, 0x3f, 0x01, 0x61, 0x38, 0xdb, + 0x30, 0xb1, 0x6a, 0x63, 0x85, 0xed, 0x5e, 0x8a, 0x89, 0xad, 0x41, 0xd7, 0x26, 0x2b, 0xf1, 0x0c, + 0x55, 0xfc, 0x7c, 0xe4, 0x6a, 0xa2, 0x62, 0x07, 0x54, 0x4a, 0xa6, 0x42, 0x74, 0x59, 0xae, 0x34, + 0x42, 0xe8, 0xe8, 0x07, 0x80, 0x5a, 0xd8, 0x6e, 0x74, 0x9c, 0x5e, 0x88, 0x7d, 0xac, 0xd2, 0x2a, + 0xed, 0xe1, 0x72, 0xe4, 0xa7, 0x13, 0x09, 0xa6, 0x88, 0x18, 0x81, 0x2c, 0x38, 0xb1, 0x35, 0x42, + 0xa3, 0x36, 0x67, 0x5b, 0x39, 0x0e, 0x2a, 0x3f, 0x3b, 0xc5, 0xe6, 0x5c, 0x28, 0xa8, 0x7f, 0xf9, + 0x64, 0x9c, 0x8c, 0x3a, 0x50, 0x6a, 0xea, 0xd8, 0x1a, 0xb1, 0x10, 0x1e, 0x6a, 0x96, 0x5d, 0x2a, + 0xd1, 0x5e, 0x5e, 0x88, 0xea, 0xe5, 0xb6, 0x8e, 0x2d, 0xbf, 0x29, 0xaa, 0x44, 0xa8, 0x16, 0x93, + 0xcf, 0x34, 0xc3, 0x5e, 0xec, 0x2c, 0x40, 0xea, 0x44, 0xed, 0x0e, 0xf0, 0x5e, 0x32, 0x93, 0x14, + 0x53, 0x7b, 0xc9, 0xcc, 0x82, 0x98, 0xd9, 0x4b, 0x66, 0xb2, 0x22, 0xec, 0x25, 0x33, 0x20, 0xe6, + 0xa4, 0x67, 0x21, 0xe7, 0x0b, 0x13, 0xa8, 0x04, 0x0b, 0x3d, 0x6c, 0x59, 0x6a, 0x1b, 0xd3, 0xa8, + 0x92, 0x95, 0x9d, 0xa6, 0x54, 0x84, 0xbc, 0x3f, 0x34, 0x48, 0x9f, 0x08, 0xae, 0x24, 0xd9, 0xf5, + 0x89, 0xe4, 0x09, 0x36, 0xa9, 0x73, 0x72, 0x49, 0xde, 0x44, 0x4f, 0x41, 0x81, 0x3a, 0x96, 0xe2, + 0xbc, 0x27, 0xa1, 0x27, 0x29, 0xe7, 0x29, 0xf1, 0x21, 0x67, 0x5a, 0x87, 0x9c, 0x71, 0xcd, 0x70, + 0x59, 0x12, 0x94, 0x05, 0x8c, 0x6b, 0x86, 0xc3, 0x70, 0x09, 0xf2, 0xc4, 0x0e, 0x2e, 0x47, 0x92, + 0x76, 0x92, 0x23, 0x34, 0xce, 0x22, 0xfd, 0x39, 0x0e, 0xe2, 0x68, 0x38, 0x41, 0xaf, 0x40, 0x92, + 0x04, 0x5e, 0x1e, 0x24, 0xcb, 0x9b, 0x2c, 0x2a, 0x6f, 0x3a, 0x51, 0x79, 0xb3, 0xee, 0x44, 0xe5, + 0x9d, 0xcc, 0xe7, 0x5f, 0xae, 0xc7, 0x3e, 0xf9, 0xdb, 0xba, 0x20, 0x53, 0x09, 0x74, 0x8e, 0x04, + 0x11, 0x55, 0xeb, 0x2b, 0x5a, 0x93, 0x7e, 0x72, 0x96, 0x44, 0x08, 0x55, 0xeb, 0xef, 0x36, 0xd1, + 0x7d, 0x10, 0x1b, 0x7a, 0xdf, 0xc2, 0x7d, 0x6b, 0x60, 0x29, 0x2c, 0x2f, 0xe0, 0xa1, 0x31, 0x10, + 0xe0, 0x58, 0xe0, 0xae, 0x38, 0x9c, 0x87, 0x94, 0x51, 0x5e, 0x6c, 0x04, 0x09, 0xe8, 0x0e, 0x80, + 0x9b, 0x3c, 0x58, 0xa5, 0xe4, 0x46, 0xe2, 0x72, 0xee, 0xda, 0xc6, 0x98, 0x03, 0x3c, 0x74, 0x58, + 0x1e, 0x18, 0xc4, 0x9f, 0x76, 0x92, 0xe4, 0x73, 0x65, 0x9f, 0x24, 0x7a, 0x06, 0x16, 0x55, 0xc3, + 0x50, 0x2c, 0x9b, 0xb8, 0xee, 0xf1, 0x29, 0xf1, 0x59, 0x12, 0x75, 0xf3, 0x72, 0x41, 0x35, 0x8c, + 0x23, 0x42, 0xdd, 0x21, 0x44, 0xf4, 0x34, 0x14, 0x49, 0x84, 0xd5, 0xd4, 0xae, 0xd2, 0xc1, 0x5a, + 0xbb, 0x63, 0xd3, 0xe8, 0x9a, 0x90, 0x0b, 0x9c, 0x5a, 0xa3, 0x44, 0xa9, 0xe9, 0xce, 0x38, 0x8d, + 0xae, 0x08, 0x41, 0xb2, 0xa9, 0xda, 0x2a, 0xb5, 0x64, 0x5e, 0xa6, 0xcf, 0x84, 0x66, 0xa8, 0x76, + 0x87, 0xdb, 0x87, 0x3e, 0xa3, 0x55, 0x48, 0x73, 0xb5, 0x09, 0xaa, 0x96, 0xb7, 0xd0, 0x0a, 0xa4, + 0x0c, 0x53, 0x3f, 0xc1, 0x74, 0xea, 0x32, 0x32, 0x6b, 0x48, 0x32, 0x14, 0x83, 0x91, 0x18, 0x15, + 0x21, 0x6e, 0x0f, 0x79, 0x2f, 0x71, 0x7b, 0x88, 0x5e, 0x84, 0x24, 0x31, 0x24, 0xed, 0xa3, 0x18, + 0x92, 0x7b, 0x70, 0xb9, 0xfa, 0xa9, 0x81, 0x65, 0xca, 0x29, 0x2d, 0x42, 0x21, 0x10, 0xa1, 0xa5, + 0x55, 0x58, 0x09, 0x0b, 0xb8, 0x52, 0xc7, 0xa5, 0x07, 0x02, 0x27, 0xba, 0x01, 0x19, 0x37, 0xe2, + 0x32, 0xc7, 0x39, 0x37, 0xd6, 0xad, 0xc3, 0x2c, 0xbb, 0xac, 0xc4, 0x63, 0xc8, 0x04, 0x74, 0x54, + 0x9e, 0x5f, 0xe5, 0xe5, 0x05, 0xd5, 0x30, 0x6a, 0xaa, 0xd5, 0x91, 0xde, 0x81, 0x52, 0x54, 0x34, + 0xf5, 0x19, 0x4c, 0xa0, 0x6e, 0xef, 0x18, 0x6c, 0x15, 0xd2, 0x2d, 0xdd, 0xec, 0xa9, 0x36, 0x55, + 0x56, 0x90, 0x79, 0x8b, 0x18, 0x92, 0x45, 0xd6, 0x04, 0x25, 0xb3, 0x86, 0xa4, 0xc0, 0xb9, 0xc8, + 0x88, 0x4a, 0x44, 0xb4, 0x7e, 0x13, 0x33, 0xb3, 0x16, 0x64, 0xd6, 0xf0, 0x14, 0xb1, 0x8f, 0x65, + 0x0d, 0xd2, 0xad, 0x45, 0xc7, 0x4a, 0xf5, 0x67, 0x65, 0xde, 0x92, 0x3e, 0x4d, 0xc0, 0x6a, 0x78, + 0x5c, 0x45, 0x1b, 0x90, 0xef, 0xa9, 0x43, 0xc5, 0x1e, 0x72, 0xb7, 0x13, 0xe8, 0xc4, 0x43, 0x4f, + 0x1d, 0xd6, 0x87, 0xcc, 0xe7, 0x44, 0x48, 0xd8, 0x43, 0xab, 0x14, 0xdf, 0x48, 0x5c, 0xce, 0xcb, + 0xe4, 0x11, 0x3d, 0x80, 0xa5, 0xae, 0xde, 0x50, 0xbb, 0x4a, 0x57, 0xb5, 0x6c, 0x85, 0x27, 0x5c, + 0x6c, 0x11, 0x3d, 0x35, 0x66, 0x6c, 0x16, 0x21, 0x71, 0x93, 0xcd, 0x27, 0xd9, 0x70, 0xb8, 0xff, + 0x2f, 0x52, 0x1d, 0xf7, 0x55, 0x67, 0xaa, 0xd1, 0x6d, 0xc8, 0xf5, 0x34, 0xeb, 0x18, 0x77, 0xd4, + 0x13, 0x4d, 0x37, 0xf9, 0x6a, 0x1a, 0x77, 0x9a, 0x37, 0x3c, 0x1e, 0xae, 0xc9, 0x2f, 0xe6, 0x9b, + 0x92, 0x54, 0xc0, 0x87, 0x9d, 0xdd, 0x24, 0x3d, 0xf7, 0x6e, 0xf2, 0x22, 0xac, 0xf4, 0xf1, 0xd0, + 0x56, 0xbc, 0xf5, 0xca, 0xfc, 0x64, 0x81, 0x9a, 0x1e, 0x91, 0x77, 0xee, 0x0a, 0xb7, 0x88, 0xcb, + 0xa0, 0xe7, 0x68, 0x66, 0x62, 0xe8, 0x16, 0x36, 0x15, 0xb5, 0xd9, 0x34, 0xb1, 0x65, 0xd1, 0x64, + 0x36, 0x4f, 0xd3, 0x0d, 0x4a, 0xdf, 0x66, 0x64, 0xe9, 0x17, 0xfe, 0xa9, 0x09, 0x66, 0x22, 0xdc, + 0xf0, 0x82, 0x67, 0xf8, 0x23, 0x58, 0xe1, 0xf2, 0xcd, 0x80, 0xed, 0xd9, 0x89, 0xe0, 0xfc, 0xf8, + 0xfa, 0x1a, 0xb5, 0x39, 0x72, 0xc4, 0xa3, 0xcd, 0x9e, 0x78, 0x32, 0xb3, 0x23, 0x48, 0x52, 0xa3, + 0x24, 0xd9, 0x16, 0x43, 0x9e, 0xff, 0xdb, 0xa6, 0xe2, 0xa3, 0x04, 0x2c, 0x8d, 0xa5, 0x75, 0xee, + 0xc0, 0x84, 0xd0, 0x81, 0xc5, 0x43, 0x07, 0x96, 0x98, 0x7b, 0x60, 0x7c, 0xae, 0x93, 0xd3, 0xe7, + 0x3a, 0xf5, 0x1d, 0xce, 0x75, 0xfa, 0xc9, 0xe6, 0xfa, 0x3f, 0x3a, 0x0b, 0xbf, 0x16, 0xa0, 0x1c, + 0x9d, 0x0b, 0x87, 0x4e, 0xc7, 0x55, 0x58, 0x72, 0x3f, 0xc5, 0x55, 0xcf, 0x36, 0x46, 0xd1, 0x7d, + 0xc1, 0xf5, 0x47, 0xc6, 0xb8, 0xa7, 0xa1, 0x38, 0x92, 0xa9, 0x33, 0x57, 0x2e, 0x9c, 0xf8, 0xfb, + 0x97, 0x7e, 0x96, 0x70, 0x03, 0x4f, 0x20, 0x9d, 0x0e, 0x59, 0xad, 0x6f, 0xc2, 0x72, 0x13, 0x37, + 0xb4, 0xe6, 0x93, 0x2e, 0xd6, 0x25, 0x2e, 0xfd, 0xff, 0xb5, 0x3a, 0xee, 0x25, 0x1f, 0x0a, 0x70, + 0x7e, 0xc2, 0xe1, 0x03, 0x95, 0x21, 0xe3, 0x88, 0x70, 0x57, 0x71, 0xdb, 0xe8, 0x2e, 0x14, 0xdb, + 0xba, 0x65, 0x69, 0x06, 0x6e, 0xf2, 0xf3, 0x41, 0x7c, 0x3c, 0x71, 0x63, 0x09, 0xfe, 0xe6, 0x5d, + 0xce, 0x48, 0xb3, 0x7f, 0xb9, 0xd0, 0xf6, 0x37, 0xa5, 0x73, 0x70, 0x36, 0xe2, 0x78, 0x22, 0xdd, + 0xf4, 0x9c, 0x38, 0xe4, 0x14, 0x71, 0x1e, 0xb2, 0xfc, 0x00, 0xe1, 0xa6, 0x4b, 0x19, 0x46, 0xa8, + 0x0f, 0xa5, 0x17, 0xe1, 0xc2, 0xa4, 0x13, 0x03, 0x71, 0xb4, 0xc7, 0xf8, 0x94, 0xa7, 0xea, 0xe4, + 0x51, 0xfa, 0x5d, 0x01, 0x32, 0x32, 0xb6, 0x0c, 0x92, 0x9c, 0xa2, 0x1d, 0xc8, 0xe2, 0x61, 0x03, + 0x1b, 0xb6, 0x93, 0xcf, 0x87, 0x9f, 0x5e, 0x19, 0x77, 0xd5, 0xe1, 0xac, 0xc5, 0x64, 0x4f, 0x0c, + 0x5d, 0xe7, 0xf0, 0x54, 0x34, 0xd2, 0xc4, 0xc5, 0xfd, 0xf8, 0xd4, 0x4b, 0x0e, 0x3e, 0x95, 0x88, + 0x84, 0x5e, 0x98, 0xd4, 0x08, 0x40, 0x75, 0x9d, 0x03, 0x54, 0xc9, 0x29, 0x9d, 0x05, 0x10, 0xaa, + 0x4a, 0x00, 0xa1, 0x4a, 0x4f, 0x19, 0x66, 0x04, 0x44, 0xf5, 0x92, 0x03, 0x51, 0x2d, 0x4c, 0xf9, + 0xe2, 0x11, 0x8c, 0xea, 0x35, 0x1f, 0x46, 0x95, 0xa5, 0xa2, 0x1b, 0x91, 0xa2, 0x21, 0x20, 0xd5, + 0x4d, 0x17, 0xa4, 0xca, 0x47, 0x02, 0x5c, 0x5c, 0x78, 0x14, 0xa5, 0x3a, 0x18, 0x43, 0xa9, 0x18, + 0xaa, 0xf4, 0x4c, 0xa4, 0x8a, 0x29, 0x30, 0xd5, 0xc1, 0x18, 0x4c, 0x55, 0x9c, 0xa2, 0x70, 0x0a, + 0x4e, 0xf5, 0xe3, 0x70, 0x9c, 0x2a, 0x1a, 0x49, 0xe2, 0x9f, 0x39, 0x1b, 0x50, 0xa5, 0x44, 0x00, + 0x55, 0x62, 0xe4, 0x01, 0x9f, 0xa9, 0x9f, 0x19, 0xa9, 0x7a, 0x10, 0x82, 0x54, 0x2d, 0x45, 0x42, + 0x13, 0x4c, 0xf9, 0x0c, 0x50, 0xd5, 0x83, 0x10, 0xa8, 0x0a, 0x4d, 0x55, 0x3b, 0x15, 0xab, 0xba, + 0x13, 0xc4, 0xaa, 0x96, 0x23, 0x52, 0x70, 0x6f, 0xb5, 0x47, 0x80, 0x55, 0xc7, 0x51, 0x60, 0xd5, + 0x4a, 0x24, 0xee, 0xc3, 0x34, 0xce, 0x81, 0x56, 0x1d, 0x8c, 0xa1, 0x55, 0x67, 0xa6, 0x78, 0xda, + 0x14, 0xb8, 0xaa, 0x15, 0x0d, 0x57, 0xad, 0x46, 0x22, 0x31, 0x7c, 0x5d, 0xcd, 0x83, 0x57, 0x3d, + 0x0a, 0xc5, 0xab, 0xce, 0x46, 0x02, 0xaf, 0xfc, 0xe3, 0x67, 0x01, 0xac, 0x8e, 0xa3, 0x00, 0xab, + 0xd2, 0x34, 0xbb, 0xcf, 0x8e, 0x58, 0x69, 0x13, 0x10, 0xab, 0x73, 0xb4, 0x9b, 0xcd, 0xc8, 0x6e, + 0x9e, 0x1c, 0xb2, 0x4a, 0x89, 0xe9, 0xbd, 0x64, 0x26, 0x23, 0x66, 0x19, 0x58, 0xb5, 0x97, 0xcc, + 0xe4, 0xc4, 0xbc, 0xf4, 0x1c, 0x49, 0xb0, 0x47, 0x22, 0x0f, 0x39, 0xca, 0x62, 0xd3, 0xd4, 0x4d, + 0x1e, 0xd1, 0x58, 0x43, 0xba, 0x0c, 0x79, 0x7f, 0x94, 0x99, 0x00, 0x6f, 0x51, 0xc8, 0xc0, 0x17, + 0x59, 0xa4, 0x3f, 0x08, 0x9e, 0x2c, 0x05, 0xb8, 0xfc, 0xf0, 0x47, 0x96, 0xc3, 0x1f, 0x3e, 0xd0, + 0x2b, 0x1e, 0x04, 0xbd, 0xd6, 0x21, 0xa7, 0x1a, 0x63, 0x78, 0x96, 0x6a, 0xb8, 0x78, 0xd6, 0x15, + 0x58, 0xa2, 0xf9, 0x1c, 0x83, 0xc6, 0x78, 0xd6, 0x94, 0xa4, 0x59, 0xd3, 0x22, 0x79, 0xc1, 0xfc, + 0x95, 0xa5, 0x4f, 0x2f, 0xc0, 0xb2, 0x8f, 0xd7, 0x85, 0x18, 0x18, 0xb8, 0x23, 0xba, 0xdc, 0xdb, + 0x1c, 0x6b, 0xf8, 0x93, 0xe0, 0x59, 0xc8, 0x03, 0xc2, 0xc2, 0x30, 0x2b, 0xe1, 0x3b, 0xc2, 0xac, + 0xe2, 0x4f, 0x8c, 0x59, 0xf9, 0x21, 0x93, 0x44, 0x10, 0x32, 0xf9, 0x97, 0xe0, 0xcd, 0x89, 0x8b, + 0x40, 0x35, 0xf4, 0x26, 0xe6, 0x20, 0x06, 0x7d, 0x26, 0x89, 0x4c, 0x57, 0x6f, 0x73, 0xa8, 0x82, + 0x3c, 0x12, 0x2e, 0x37, 0x15, 0xc8, 0xf2, 0x48, 0xef, 0xe2, 0x1f, 0x2c, 0x2f, 0xe5, 0xf8, 0x07, + 0x4f, 0x82, 0xd2, 0xb4, 0x5f, 0xf2, 0x48, 0xf8, 0xa8, 0xf3, 0xf1, 0xfc, 0x92, 0x35, 0xd0, 0x2b, + 0x90, 0xa5, 0x85, 0x43, 0x45, 0x37, 0x2c, 0x5e, 0x4f, 0x0a, 0x64, 0xde, 0xac, 0x7a, 0xb8, 0x79, + 0x48, 0x78, 0x0e, 0x0c, 0x8b, 0x66, 0x89, 0xf4, 0xc9, 0x97, 0x10, 0x67, 0x03, 0x09, 0xf1, 0x05, + 0xc8, 0x92, 0xaf, 0xb7, 0x0c, 0xb5, 0x81, 0x4b, 0x40, 0x3f, 0xd4, 0x23, 0x48, 0xbf, 0x8f, 0xc3, + 0xe2, 0x48, 0xe8, 0x0f, 0x1d, 0xbb, 0xe3, 0x92, 0x71, 0x1f, 0x22, 0x37, 0x9b, 0x3d, 0xd6, 0x00, + 0xda, 0xaa, 0xa5, 0xbc, 0xaf, 0xf6, 0x6d, 0xdc, 0xe4, 0x46, 0xf1, 0x51, 0x48, 0xe6, 0x4b, 0x5a, + 0x03, 0x0b, 0x37, 0x39, 0x38, 0xe8, 0xb6, 0x51, 0x0d, 0xd2, 0xf8, 0x04, 0xf7, 0x6d, 0xab, 0xb4, + 0x40, 0xa7, 0x7d, 0x75, 0x1c, 0xad, 0x21, 0xaf, 0x77, 0x4a, 0x64, 0xb2, 0xbf, 0xf9, 0x72, 0x5d, + 0x64, 0xdc, 0xcf, 0xeb, 0x3d, 0xcd, 0xc6, 0x3d, 0xc3, 0x3e, 0x95, 0xb9, 0x7c, 0xd0, 0x0a, 0x99, + 0x11, 0x2b, 0x50, 0x98, 0x3a, 0xef, 0xa0, 0x4f, 0xc4, 0xa6, 0x9a, 0x6e, 0x6a, 0xf6, 0xa9, 0x5c, + 0xe8, 0xe1, 0x9e, 0xa1, 0xeb, 0x5d, 0x85, 0xad, 0xf1, 0x6d, 0x28, 0x06, 0x33, 0x1d, 0xf4, 0x14, + 0x14, 0x4c, 0x6c, 0xab, 0x5a, 0x5f, 0x09, 0x9c, 0xd1, 0xf2, 0x8c, 0xc8, 0xd6, 0xd4, 0x5e, 0x32, + 0x23, 0x88, 0xf1, 0xbd, 0x64, 0x26, 0x2e, 0x26, 0xa4, 0x43, 0x38, 0x13, 0x9a, 0xe9, 0xa0, 0x97, + 0x21, 0xeb, 0x25, 0x49, 0x02, 0x1d, 0xed, 0x04, 0x20, 0xd0, 0xe3, 0x95, 0xfe, 0x28, 0x78, 0x2a, + 0x83, 0xd0, 0x62, 0x15, 0xd2, 0x6c, 0xf7, 0xa4, 0x33, 0x59, 0x9c, 0x10, 0x5f, 0x02, 0x72, 0x9b, + 0x6c, 0x8b, 0x94, 0xb9, 0xb0, 0xf4, 0x36, 0xa4, 0x19, 0x05, 0xe5, 0x60, 0xe1, 0xc1, 0xfe, 0xbd, + 0xfd, 0x83, 0xb7, 0xf6, 0xc5, 0x18, 0x02, 0x48, 0x6f, 0x57, 0x2a, 0xd5, 0xc3, 0xba, 0x28, 0xa0, + 0x2c, 0xa4, 0xb6, 0x77, 0x0e, 0xe4, 0xba, 0x18, 0x27, 0x64, 0xb9, 0xba, 0x57, 0xad, 0xd4, 0xc5, + 0x04, 0x5a, 0x82, 0x02, 0x7b, 0x56, 0xee, 0x1c, 0xc8, 0x6f, 0x6c, 0xd7, 0xc5, 0xa4, 0x8f, 0x74, + 0x54, 0xdd, 0xbf, 0x5d, 0x95, 0xc5, 0x94, 0xf4, 0x3d, 0x38, 0x17, 0x99, 0x55, 0x79, 0xb8, 0xa1, + 0xe0, 0xc3, 0x0d, 0xa5, 0x4f, 0xe3, 0xe4, 0xb8, 0x12, 0x95, 0x2a, 0xa1, 0xbd, 0x91, 0x81, 0x5f, + 0x9b, 0x23, 0xcf, 0x1a, 0x19, 0x3d, 0x39, 0x66, 0x9b, 0x98, 0xc5, 0x53, 0xda, 0x37, 0xdb, 0x81, + 0x0a, 0x72, 0x81, 0x53, 0xa9, 0x90, 0xc5, 0xd8, 0xde, 0xc5, 0x0d, 0x5b, 0x61, 0x4e, 0x64, 0xd1, + 0xb3, 0x6e, 0x96, 0xb0, 0x11, 0xea, 0x11, 0x23, 0x4a, 0xef, 0xcc, 0x65, 0xcb, 0x2c, 0xa4, 0xe4, + 0x6a, 0x5d, 0x7e, 0x24, 0x26, 0x10, 0x82, 0x22, 0x7d, 0x54, 0x8e, 0xf6, 0xb7, 0x0f, 0x8f, 0x6a, + 0x07, 0xc4, 0x96, 0xcb, 0xb0, 0xe8, 0xd8, 0xd2, 0x21, 0xa6, 0xa4, 0xab, 0xe4, 0x8c, 0x17, 0x9a, + 0xe7, 0x8d, 0x9f, 0xf8, 0xa5, 0xdf, 0x08, 0x7e, 0xee, 0x60, 0xae, 0x76, 0x00, 0x69, 0xcb, 0x56, + 0xed, 0x81, 0xc5, 0x8d, 0xf8, 0xf2, 0xac, 0x89, 0xdf, 0xa6, 0xf3, 0x70, 0x44, 0xc5, 0x65, 0xae, + 0x46, 0xba, 0x01, 0xc5, 0xe0, 0x9b, 0x68, 0x1b, 0x78, 0x4e, 0x14, 0x97, 0x6e, 0x01, 0x1a, 0xcf, + 0x07, 0x43, 0xd0, 0x0f, 0x21, 0x0c, 0xfd, 0xf8, 0x2d, 0x3d, 0x76, 0x47, 0xe6, 0x7e, 0xe8, 0xcd, + 0x91, 0x41, 0xde, 0x9c, 0x27, 0x73, 0xdc, 0x64, 0xb4, 0x91, 0x61, 0x5e, 0x87, 0xbc, 0x9f, 0x3e, + 0xdb, 0x20, 0xbf, 0x89, 0x7b, 0x8b, 0x38, 0x08, 0xd3, 0x78, 0x5b, 0xa0, 0xf0, 0x2d, 0xb7, 0xc0, + 0x57, 0x01, 0xec, 0x21, 0xcf, 0xa7, 0x9c, 0x38, 0x7a, 0x31, 0x04, 0xfe, 0xc6, 0x8d, 0xfa, 0x90, + 0x2f, 0x82, 0xac, 0xcd, 0x9f, 0x2c, 0x74, 0xe4, 0xc7, 0xac, 0x06, 0x34, 0xc6, 0x5a, 0x1c, 0xcf, + 0x99, 0x35, 0x18, 0x7b, 0xd8, 0x16, 0x23, 0x5b, 0xe8, 0x11, 0x9c, 0x1d, 0x49, 0x14, 0x5c, 0xd5, + 0xc9, 0x59, 0xf3, 0x85, 0x33, 0xc1, 0x7c, 0xc1, 0x51, 0xed, 0x8f, 0xf6, 0xa9, 0x60, 0xb4, 0x7f, + 0x0d, 0x2e, 0x4c, 0x4a, 0xac, 0xd1, 0x45, 0x00, 0xdc, 0x27, 0xc1, 0xa1, 0xe9, 0xc1, 0x1d, 0x59, + 0x4e, 0xa9, 0x0f, 0xa5, 0xbb, 0x50, 0x8a, 0x4a, 0x9a, 0xd1, 0x55, 0x48, 0xd2, 0x93, 0x0d, 0xcb, + 0x76, 0xce, 0x86, 0x00, 0x34, 0x84, 0x4f, 0xa6, 0x4c, 0xd2, 0x2f, 0xfd, 0xce, 0x19, 0x92, 0x09, + 0xdf, 0x1b, 0x71, 0xce, 0xeb, 0xf3, 0xa4, 0xd7, 0x9b, 0x23, 0x6e, 0x79, 0x09, 0xd2, 0xdc, 0x21, + 0x89, 0x0f, 0xee, 0x1c, 0x55, 0xf7, 0xeb, 0x62, 0x8c, 0x38, 0xe7, 0xa1, 0x5c, 0xa5, 0x0d, 0x41, + 0x7a, 0x1d, 0x2e, 0x4e, 0x4c, 0xa4, 0x89, 0x61, 0x68, 0x6a, 0xce, 0x92, 0x71, 0x81, 0xd6, 0xd6, + 0xb2, 0x84, 0x42, 0x5f, 0x4b, 0x8f, 0x00, 0x3c, 0x4c, 0x90, 0xec, 0xdc, 0xa6, 0x3e, 0xe8, 0x37, + 0x29, 0x5f, 0x4a, 0x66, 0x0d, 0x74, 0x03, 0x52, 0x7e, 0x08, 0x6b, 0x3c, 0xc4, 0x91, 0x8f, 0xf7, + 0x61, 0x8a, 0x8c, 0x5b, 0xd2, 0x00, 0x8d, 0xd7, 0x65, 0x22, 0xba, 0x78, 0x2d, 0xd8, 0xc5, 0xa5, + 0xc8, 0x0a, 0x4f, 0x78, 0x57, 0x1f, 0x40, 0x8a, 0xae, 0x28, 0x92, 0xcc, 0xd0, 0x62, 0x20, 0xcf, + 0xc2, 0xc9, 0x33, 0xfa, 0x09, 0x80, 0x6a, 0xdb, 0xa6, 0x76, 0x3c, 0xf0, 0x3a, 0x58, 0x0f, 0x5f, + 0x91, 0xdb, 0x0e, 0xdf, 0xce, 0x05, 0xbe, 0x34, 0x57, 0x3c, 0x51, 0xdf, 0xf2, 0xf4, 0x29, 0x94, + 0xf6, 0xa1, 0x18, 0x94, 0x1d, 0x07, 0xcf, 0xbc, 0xbc, 0x91, 0x1d, 0x03, 0x78, 0xde, 0xe8, 0x66, + 0x9d, 0x09, 0x56, 0xf1, 0xa4, 0x0d, 0xe9, 0xa7, 0x71, 0xc8, 0xfb, 0x17, 0xf4, 0xff, 0x5e, 0x6a, + 0x27, 0xfd, 0x5c, 0x80, 0x8c, 0x3b, 0xfc, 0x60, 0xf9, 0x33, 0x50, 0x2f, 0x66, 0xd6, 0x8b, 0xfb, + 0x6b, 0x96, 0xac, 0x3a, 0x9c, 0x70, 0xab, 0xc3, 0xb7, 0xdc, 0xb4, 0x22, 0x0a, 0xfa, 0xf3, 0xdb, + 0x9a, 0x7b, 0x95, 0x93, 0x45, 0xdd, 0x82, 0xac, 0xbb, 0x2b, 0x92, 0xc3, 0x9c, 0x83, 0x17, 0x0b, + 0x7c, 0x6f, 0xe2, 0x68, 0xff, 0x0a, 0xa4, 0x0c, 0xfd, 0x7d, 0x5e, 0x10, 0x4d, 0xc8, 0xac, 0x21, + 0x35, 0x61, 0x71, 0x64, 0x4b, 0x45, 0xb7, 0x60, 0xc1, 0x18, 0x1c, 0x2b, 0x8e, 0x73, 0x8c, 0xa0, + 0xea, 0xce, 0x31, 0x61, 0x70, 0xdc, 0xd5, 0x1a, 0xf7, 0xf0, 0xa9, 0xf3, 0x31, 0xc6, 0xe0, 0xf8, + 0x1e, 0xf3, 0x21, 0xd6, 0x4b, 0xdc, 0xdf, 0xcb, 0xaf, 0x04, 0xc8, 0x38, 0x6b, 0x02, 0xbd, 0x0e, + 0x59, 0x77, 0xbb, 0x76, 0x6f, 0x34, 0x44, 0xee, 0xf3, 0x5c, 0xbf, 0x27, 0x82, 0xb6, 0x9d, 0xab, + 0x18, 0x5a, 0x53, 0x69, 0x75, 0x55, 0xe6, 0x4b, 0xc5, 0xa0, 0xcd, 0xd8, 0x86, 0x4e, 0xe3, 0xdc, + 0xee, 0xed, 0x3b, 0x5d, 0xb5, 0x2d, 0xe7, 0xa8, 0xcc, 0x6e, 0x93, 0x34, 0x78, 0xc6, 0xfc, 0x4f, + 0x01, 0xc4, 0xd1, 0x15, 0xfb, 0xad, 0xbf, 0x6e, 0x3c, 0x7d, 0x48, 0x84, 0xa4, 0x0f, 0x68, 0x0b, + 0x96, 0x5d, 0x0e, 0xc5, 0xd2, 0xda, 0x7d, 0xd5, 0x1e, 0x98, 0x98, 0xd7, 0x21, 0x90, 0xfb, 0xea, + 0xc8, 0x79, 0x33, 0x3e, 0xea, 0xd4, 0x13, 0x8e, 0xfa, 0xa3, 0x38, 0xe4, 0x7c, 0x55, 0x11, 0xf4, + 0x7d, 0xdf, 0x66, 0x54, 0x0c, 0x89, 0xb8, 0x3e, 0x5e, 0xef, 0x76, 0x42, 0xd0, 0x4c, 0xf1, 0xf9, + 0xcd, 0x14, 0x55, 0x7b, 0x72, 0x8a, 0x2c, 0xc9, 0xb9, 0x8b, 0x2c, 0xcf, 0x03, 0xb2, 0x75, 0x5b, + 0xed, 0x2a, 0x27, 0xba, 0xad, 0xf5, 0xdb, 0x0a, 0x73, 0x43, 0xb6, 0x75, 0x88, 0xf4, 0xcd, 0x43, + 0xfa, 0xe2, 0x90, 0x7a, 0xe4, 0x87, 0x02, 0x64, 0xdc, 0xe3, 0xcc, 0xbc, 0x77, 0x17, 0x56, 0x21, + 0xcd, 0x33, 0x76, 0x76, 0x79, 0x81, 0xb7, 0x42, 0xab, 0x49, 0x65, 0xc8, 0xf4, 0xb0, 0xad, 0xd2, + 0x7d, 0x90, 0x65, 0x0b, 0x6e, 0xfb, 0xca, 0x4d, 0xc8, 0xf9, 0xee, 0x7d, 0x90, 0xad, 0x71, 0xbf, + 0xfa, 0x96, 0x18, 0x2b, 0x2f, 0x7c, 0xfc, 0xd9, 0x46, 0x62, 0x1f, 0xbf, 0x4f, 0x56, 0xb3, 0x5c, + 0xad, 0xd4, 0xaa, 0x95, 0x7b, 0xa2, 0x50, 0xce, 0x7d, 0xfc, 0xd9, 0xc6, 0x82, 0x8c, 0x29, 0x76, + 0x7e, 0xe5, 0x1e, 0x2c, 0x8e, 0x4c, 0x4c, 0x30, 0x1d, 0x44, 0x50, 0xbc, 0xfd, 0xe0, 0xf0, 0xfe, + 0x6e, 0x65, 0xbb, 0x5e, 0x55, 0x1e, 0x1e, 0xd4, 0xab, 0xa2, 0x80, 0xce, 0xc2, 0xf2, 0xfd, 0xdd, + 0xbb, 0xb5, 0xba, 0x52, 0xb9, 0xbf, 0x5b, 0xdd, 0xaf, 0x2b, 0xdb, 0xf5, 0xfa, 0x76, 0xe5, 0x9e, + 0x18, 0xbf, 0xf6, 0x8f, 0x22, 0x24, 0xb7, 0x77, 0x2a, 0xbb, 0xa8, 0x02, 0x49, 0x0a, 0x31, 0x4d, + 0xbc, 0x86, 0x5b, 0x9e, 0x5c, 0x05, 0x41, 0x77, 0x20, 0x45, 0xd1, 0x27, 0x34, 0xf9, 0x5e, 0x6e, + 0x79, 0x4a, 0x59, 0x84, 0x7c, 0x0c, 0x5d, 0x91, 0x13, 0x2f, 0xea, 0x96, 0x27, 0x57, 0x49, 0xd0, + 0x7d, 0x58, 0x70, 0xc0, 0x87, 0x69, 0xb7, 0x67, 0xcb, 0x53, 0x4b, 0x17, 0x64, 0x68, 0x0c, 0xc4, + 0x99, 0x7c, 0x87, 0xb7, 0x3c, 0xa5, 0x7e, 0x82, 0x76, 0x21, 0xcd, 0x8f, 0xf9, 0x53, 0xae, 0xe5, + 0x96, 0xa7, 0x55, 0x44, 0x90, 0x0c, 0x59, 0x0f, 0x1e, 0x9b, 0x7e, 0x33, 0xb9, 0x3c, 0x43, 0x69, + 0x08, 0xbd, 0x0d, 0x85, 0x20, 0x84, 0x30, 0xdb, 0xd5, 0xdf, 0xf2, 0x8c, 0xb5, 0x17, 0xa2, 0x3f, + 0x88, 0x27, 0xcc, 0x76, 0x15, 0xb8, 0x3c, 0x63, 0x29, 0x06, 0xbd, 0x0b, 0x4b, 0xe3, 0xe7, 0xfd, + 0xd9, 0x6f, 0x06, 0x97, 0xe7, 0x28, 0xce, 0xa0, 0x1e, 0xa0, 0x10, 0x9c, 0x60, 0x8e, 0x8b, 0xc2, + 0xe5, 0x79, 0x6a, 0x35, 0xa8, 0x09, 0x8b, 0xa3, 0x87, 0xef, 0x59, 0x2f, 0x0e, 0x97, 0x67, 0xae, + 0xdb, 0xb0, 0x5e, 0x82, 0x87, 0xf6, 0x59, 0x2f, 0x12, 0x97, 0x67, 0x2e, 0xe3, 0xa0, 0x07, 0x00, + 0xbe, 0x73, 0xf7, 0x0c, 0x17, 0x8b, 0xcb, 0xb3, 0x14, 0x74, 0x90, 0x01, 0xcb, 0x61, 0x07, 0xf2, + 0x79, 0xee, 0x19, 0x97, 0xe7, 0xaa, 0xf3, 0x10, 0x7f, 0x0e, 0x1e, 0xad, 0x67, 0xbb, 0x77, 0x5c, + 0x9e, 0xb1, 0xe0, 0x83, 0x2c, 0x58, 0x09, 0x3d, 0x4e, 0xce, 0x75, 0x0b, 0xb9, 0x3c, 0x5f, 0x11, + 0x08, 0xb5, 0x41, 0x1c, 0x3b, 0x84, 0xce, 0x7c, 0x29, 0xb9, 0x3c, 0x7b, 0x39, 0x88, 0xce, 0x57, + 0xc8, 0x19, 0x75, 0x9e, 0x3b, 0xca, 0xe5, 0xb9, 0xea, 0x43, 0xe8, 0x04, 0xce, 0x84, 0x1f, 0x43, + 0xe7, 0xbb, 0xb1, 0x5c, 0x9e, 0xb3, 0x5c, 0xb4, 0xb3, 0xfd, 0xf9, 0x57, 0x6b, 0xc2, 0x17, 0x5f, + 0xad, 0x09, 0x7f, 0xff, 0x6a, 0x4d, 0xf8, 0xe4, 0xeb, 0xb5, 0xd8, 0x17, 0x5f, 0xaf, 0xc5, 0xfe, + 0xfa, 0xf5, 0x5a, 0xec, 0x87, 0xcf, 0xb6, 0x35, 0xbb, 0x33, 0x38, 0xde, 0x6c, 0xe8, 0xbd, 0xad, + 0x86, 0xde, 0xc3, 0xf6, 0x71, 0xcb, 0xf6, 0x1e, 0xbc, 0xbf, 0x84, 0x8e, 0xd3, 0x34, 0x13, 0xba, + 0xfe, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6f, 0x16, 0x63, 0x09, 0x45, 0x34, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4292,6 +4413,7 @@ type ABCIClient interface { CreateOracleResultTx(ctx context.Context, in *RequestCreateOracleResultTx, opts ...grpc.CallOption) (*ResponseCreateOracleResultTx, error) FetchOracleVotes(ctx context.Context, in *RequestFetchOracleVotes, opts ...grpc.CallOption) (*ResponseFetchOracleVotes, error) ValidateOracleVotes(ctx context.Context, in *RequestValidateOracleVotes, opts ...grpc.CallOption) (*ResponseValidateOracleVotes, error) + DoesOracleResultExist(ctx context.Context, in *RequestDoesOracleResultExist, opts ...grpc.CallOption) (*ResponseDoesOracleResultExist, error) } type aBCIClient struct { @@ -4473,6 +4595,15 @@ func (c *aBCIClient) ValidateOracleVotes(ctx context.Context, in *RequestValidat return out, nil } +func (c *aBCIClient) DoesOracleResultExist(ctx context.Context, in *RequestDoesOracleResultExist, opts ...grpc.CallOption) (*ResponseDoesOracleResultExist, error) { + out := new(ResponseDoesOracleResultExist) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCI/DoesOracleResultExist", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ABCIServer is the server API for ABCI service. type ABCIServer interface { Echo(context.Context, *RequestEcho) (*ResponseEcho, error) @@ -4494,6 +4625,7 @@ type ABCIServer interface { CreateOracleResultTx(context.Context, *RequestCreateOracleResultTx) (*ResponseCreateOracleResultTx, error) FetchOracleVotes(context.Context, *RequestFetchOracleVotes) (*ResponseFetchOracleVotes, error) ValidateOracleVotes(context.Context, *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) + DoesOracleResultExist(context.Context, *RequestDoesOracleResultExist) (*ResponseDoesOracleResultExist, error) } // UnimplementedABCIServer can be embedded to have forward compatible implementations. @@ -4557,6 +4689,9 @@ func (*UnimplementedABCIServer) FetchOracleVotes(ctx context.Context, req *Reque func (*UnimplementedABCIServer) ValidateOracleVotes(ctx context.Context, req *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) { return nil, status.Errorf(codes.Unimplemented, "method ValidateOracleVotes not implemented") } +func (*UnimplementedABCIServer) DoesOracleResultExist(ctx context.Context, req *RequestDoesOracleResultExist) (*ResponseDoesOracleResultExist, error) { + return nil, status.Errorf(codes.Unimplemented, "method DoesOracleResultExist not implemented") +} func RegisterABCIServer(s grpc1.Server, srv ABCIServer) { s.RegisterService(&_ABCI_serviceDesc, srv) @@ -4904,6 +5039,24 @@ func _ABCI_ValidateOracleVotes_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _ABCI_DoesOracleResultExist_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestDoesOracleResultExist) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ABCIServer).DoesOracleResultExist(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCI/DoesOracleResultExist", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIServer).DoesOracleResultExist(ctx, req.(*RequestDoesOracleResultExist)) + } + return interceptor(ctx, in, info, handler) +} + var _ABCI_serviceDesc = grpc.ServiceDesc{ ServiceName: "tendermint.abci.ABCI", HandlerType: (*ABCIServer)(nil), @@ -4984,6 +5137,10 @@ var _ABCI_serviceDesc = grpc.ServiceDesc{ MethodName: "ValidateOracleVotes", Handler: _ABCI_ValidateOracleVotes_Handler, }, + { + MethodName: "DoesOracleResultExist", + Handler: _ABCI_DoesOracleResultExist_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "tendermint/abci/types.proto", @@ -5436,6 +5593,29 @@ func (m *Request_ValidateOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, er } return len(dAtA) - i, nil } +func (m *Request_DoesOracleResultExist) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Request_DoesOracleResultExist) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.DoesOracleResultExist != nil { + { + size, err := m.DoesOracleResultExist.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xc2 + } + return len(dAtA) - i, nil +} func (m *RequestEcho) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5601,12 +5781,12 @@ func (m *RequestInitChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - n21, err21 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err21 != nil { - return 0, err21 + n22, err22 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err22 != nil { + return 0, err22 } - i -= n21 - i = encodeVarintTypes(dAtA, i, uint64(n21)) + i -= n22 + i = encodeVarintTypes(dAtA, i, uint64(n22)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -5901,12 +6081,12 @@ func (m *RequestPrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x3a } - n23, err23 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err23 != nil { - return 0, err23 + n24, err24 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err24 != nil { + return 0, err24 } - i -= n23 - i = encodeVarintTypes(dAtA, i, uint64(n23)) + i -= n24 + i = encodeVarintTypes(dAtA, i, uint64(n24)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -5989,12 +6169,12 @@ func (m *RequestProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x3a } - n25, err25 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err25 != nil { - return 0, err25 + n26, err26 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err26 != nil { + return 0, err26 } - i -= n25 - i = encodeVarintTypes(dAtA, i, uint64(n25)) + i -= n26 + i = encodeVarintTypes(dAtA, i, uint64(n26)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -6112,12 +6292,12 @@ func (m *RequestExtendVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x22 } } - n28, err28 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err28 != nil { - return 0, err28 + n29, err29 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err29 != nil { + return 0, err29 } - i -= n28 - i = encodeVarintTypes(dAtA, i, uint64(n28)) + i -= n29 + i = encodeVarintTypes(dAtA, i, uint64(n29)) i-- dAtA[i] = 0x1a if m.Height != 0 { @@ -6218,12 +6398,12 @@ func (m *RequestFinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x3a } - n29, err29 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err29 != nil { - return 0, err29 + n30, err30 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err30 != nil { + return 0, err30 } - i -= n29 - i = encodeVarintTypes(dAtA, i, uint64(n29)) + i -= n30 + i = encodeVarintTypes(dAtA, i, uint64(n30)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -6371,6 +6551,36 @@ func (m *RequestValidateOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } +func (m *RequestDoesOracleResultExist) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RequestDoesOracleResultExist) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RequestDoesOracleResultExist) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *Response) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6841,6 +7051,29 @@ func (m *Response_ValidateOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, e } return len(dAtA) - i, nil } +func (m *Response_DoesOracleResultExist) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_DoesOracleResultExist) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.DoesOracleResultExist != nil { + { + size, err := m.DoesOracleResultExist.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xca + } + return len(dAtA) - i, nil +} func (m *ResponseException) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7352,20 +7585,20 @@ func (m *ResponseApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, err } } if len(m.RefetchChunks) > 0 { - dAtA54 := make([]byte, len(m.RefetchChunks)*10) - var j53 int + dAtA56 := make([]byte, len(m.RefetchChunks)*10) + var j55 int for _, num := range m.RefetchChunks { for num >= 1<<7 { - dAtA54[j53] = uint8(uint64(num)&0x7f | 0x80) + dAtA56[j55] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j53++ + j55++ } - dAtA54[j53] = uint8(num) - j53++ + dAtA56[j55] = uint8(num) + j55++ } - i -= j53 - copy(dAtA[i:], dAtA54[:j53]) - i = encodeVarintTypes(dAtA, i, uint64(j53)) + i -= j55 + copy(dAtA[i:], dAtA56[:j55]) + i = encodeVarintTypes(dAtA, i, uint64(j55)) i-- dAtA[i] = 0x12 } @@ -7672,6 +7905,39 @@ func (m *ResponseValidateOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, er return len(dAtA) - i, nil } +func (m *ResponseDoesOracleResultExist) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseDoesOracleResultExist) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseDoesOracleResultExist) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.DoesExist { + i-- + if m.DoesExist { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *CommitInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -8165,12 +8431,12 @@ func (m *Misbehavior) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x28 } - n61, err61 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err61 != nil { - return 0, err61 + n63, err63 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err63 != nil { + return 0, err63 } - i -= n61 - i = encodeVarintTypes(dAtA, i, uint64(n61)) + i -= n63 + i = encodeVarintTypes(dAtA, i, uint64(n63)) i-- dAtA[i] = 0x22 if m.Height != 0 { @@ -8499,6 +8765,18 @@ func (m *Request_ValidateOracleVotes) Size() (n int) { } return n } +func (m *Request_DoesOracleResultExist) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.DoesOracleResultExist != nil { + l = m.DoesOracleResultExist.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} func (m *RequestEcho) Size() (n int) { if m == nil { return 0 @@ -8912,6 +9190,19 @@ func (m *RequestValidateOracleVotes) Size() (n int) { return n } +func (m *RequestDoesOracleResultExist) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + func (m *Response) Size() (n int) { if m == nil { return 0 @@ -9164,6 +9455,18 @@ func (m *Response_ValidateOracleVotes) Size() (n int) { } return n } +func (m *Response_DoesOracleResultExist) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.DoesOracleResultExist != nil { + l = m.DoesOracleResultExist.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} func (m *ResponseException) Size() (n int) { if m == nil { return 0 @@ -9533,6 +9836,18 @@ func (m *ResponseValidateOracleVotes) Size() (n int) { return n } +func (m *ResponseDoesOracleResultExist) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.DoesExist { + n += 2 + } + return n +} + func (m *CommitInfo) Size() (n int) { if m == nil { return 0 @@ -10483,6 +10798,41 @@ func (m *Request) Unmarshal(dAtA []byte) error { } m.Value = &Request_ValidateOracleVotes{v} iNdEx = postIndex + case 24: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DoesOracleResultExist", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestDoesOracleResultExist{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_DoesOracleResultExist{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -13366,6 +13716,88 @@ func (m *RequestValidateOracleVotes) Unmarshal(dAtA []byte) error { } return nil } +func (m *RequestDoesOracleResultExist) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestDoesOracleResultExist: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestDoesOracleResultExist: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Response) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -14095,6 +14527,41 @@ func (m *Response) Unmarshal(dAtA []byte) error { } m.Value = &Response_ValidateOracleVotes{v} iNdEx = postIndex + case 25: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DoesOracleResultExist", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ResponseDoesOracleResultExist{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Response_DoesOracleResultExist{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -16496,6 +16963,76 @@ func (m *ResponseValidateOracleVotes) Unmarshal(dAtA []byte) error { } return nil } +func (m *ResponseDoesOracleResultExist) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseDoesOracleResultExist: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseDoesOracleResultExist: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DoesExist", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.DoesExist = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *CommitInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index de84f213506..5592fc3d271 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -38,6 +38,7 @@ service ABCI { rpc CreateOracleResultTx(RequestCreateOracleResultTx) returns (ResponseCreateOracleResultTx); rpc FetchOracleVotes(RequestFetchOracleVotes) returns (ResponseFetchOracleVotes); rpc ValidateOracleVotes(RequestValidateOracleVotes) returns (ResponseValidateOracleVotes); + rpc DoesOracleResultExist(RequestDoesOracleResultExist) returns (ResponseDoesOracleResultExist); } //---------------------------------------- @@ -64,6 +65,7 @@ message Request { RequestCreateOracleResultTx create_oracle_result_tx = 21; RequestFetchOracleVotes fetch_oracle_votes = 22; RequestValidateOracleVotes validate_oracle_votes = 23; + RequestDoesOracleResultExist does_oracle_result_exist = 24; } reserved 4, 7, 9, 10; // SetOption, BeginBlock, DeliverTx, EndBlock } @@ -211,6 +213,10 @@ message RequestValidateOracleVotes { bytes oracle_tx = 1; } +message RequestDoesOracleResultExist { + string key = 1; +} + //---------------------------------------- // Response types @@ -236,6 +242,7 @@ message Response { ResponseCreateOracleResultTx create_oracle_result_tx = 22; ResponseFetchOracleVotes fetch_oracle_votes = 23; ResponseValidateOracleVotes validate_oracle_votes = 24; + ResponseDoesOracleResultExist does_oracle_result_exist = 25; } reserved 5, 8, 10, 11; // SetOption, BeginBlock, DeliverTx, EndBlock } @@ -403,6 +410,10 @@ message ResponseValidateOracleVotes { } } +message ResponseDoesOracleResultExist { + bool does_exist = 1; +} + //---------------------------------------- // Misc. diff --git a/proxy/app_conn.go b/proxy/app_conn.go index 6d411b91c29..fd2d6a0f9f3 100644 --- a/proxy/app_conn.go +++ b/proxy/app_conn.go @@ -27,6 +27,7 @@ type AppConnConsensus interface { CreateOracleResultTx(context.Context, *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error) FetchOracleVotes(context.Context, *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) ValidateOracleVotes(context.Context, *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) + DoesOracleResultExist(context.Context, *types.RequestDoesOracleResultExist) (*types.ResponseDoesOracleResultExist, error) } type AppConnMempool interface { @@ -127,6 +128,11 @@ func (app *appConnConsensus) ValidateOracleVotes(ctx context.Context, req *types return app.appConn.ValidateOracleVotes(ctx, req) } +func (app *appConnConsensus) DoesOracleResultExist(ctx context.Context, req *types.RequestDoesOracleResultExist) (*types.ResponseDoesOracleResultExist, error) { + defer addTimeSample(app.metrics.MethodTimingSeconds.With("method", "commit", "type", "sync"))() + return app.appConn.DoesOracleResultExist(ctx, req) +} + //------------------------------------------------ // Implements AppConnMempool (subset of abcicli.Client) diff --git a/proxy/mocks/app_conn_consensus.go b/proxy/mocks/app_conn_consensus.go index 5b4e653e0ec..22f24fd796c 100644 --- a/proxy/mocks/app_conn_consensus.go +++ b/proxy/mocks/app_conn_consensus.go @@ -41,6 +41,58 @@ func (_m *AppConnConsensus) Commit(_a0 context.Context) (*types.ResponseCommit, return r0, r1 } +// CreateOracleResultTx provides a mock function with given fields: _a0, _a1 +func (_m *AppConnConsensus) CreateOracleResultTx(_a0 context.Context, _a1 *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseCreateOracleResultTx + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestCreateOracleResultTx) *types.ResponseCreateOracleResultTx); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseCreateOracleResultTx) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestCreateOracleResultTx) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DoesOracleResultExist provides a mock function with given fields: _a0, _a1 +func (_m *AppConnConsensus) DoesOracleResultExist(_a0 context.Context, _a1 *types.RequestDoesOracleResultExist) (*types.ResponseDoesOracleResultExist, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseDoesOracleResultExist + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesOracleResultExist) (*types.ResponseDoesOracleResultExist, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesOracleResultExist) *types.ResponseDoesOracleResultExist); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseDoesOracleResultExist) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestDoesOracleResultExist) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // Error provides a mock function with given fields: func (_m *AppConnConsensus) Error() error { ret := _m.Called() @@ -81,24 +133,24 @@ func (_m *AppConnConsensus) ExtendVote(_a0 context.Context, _a1 *types.RequestEx return r0, r1 } -// FinalizeBlock provides a mock function with given fields: _a0, _a1 -func (_m *AppConnConsensus) FinalizeBlock(_a0 context.Context, _a1 *types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error) { +// FetchOracleVotes provides a mock function with given fields: _a0, _a1 +func (_m *AppConnConsensus) FetchOracleVotes(_a0 context.Context, _a1 *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) { ret := _m.Called(_a0, _a1) - var r0 *types.ResponseFinalizeBlock + var r0 *types.ResponseFetchOracleVotes var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error)); ok { return rf(_a0, _a1) } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFinalizeBlock) *types.ResponseFinalizeBlock); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFetchOracleVotes) *types.ResponseFetchOracleVotes); ok { r0 = rf(_a0, _a1) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponseFinalizeBlock) + r0 = ret.Get(0).(*types.ResponseFetchOracleVotes) } } - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestFinalizeBlock) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestFetchOracleVotes) error); ok { r1 = rf(_a0, _a1) } else { r1 = ret.Error(1) @@ -107,24 +159,24 @@ func (_m *AppConnConsensus) FinalizeBlock(_a0 context.Context, _a1 *types.Reques return r0, r1 } -// InitChain provides a mock function with given fields: _a0, _a1 -func (_m *AppConnConsensus) InitChain(_a0 context.Context, _a1 *types.RequestInitChain) (*types.ResponseInitChain, error) { +// FinalizeBlock provides a mock function with given fields: _a0, _a1 +func (_m *AppConnConsensus) FinalizeBlock(_a0 context.Context, _a1 *types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error) { ret := _m.Called(_a0, _a1) - var r0 *types.ResponseInitChain + var r0 *types.ResponseFinalizeBlock var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestInitChain) (*types.ResponseInitChain, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error)); ok { return rf(_a0, _a1) } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestInitChain) *types.ResponseInitChain); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFinalizeBlock) *types.ResponseFinalizeBlock); ok { r0 = rf(_a0, _a1) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponseInitChain) + r0 = ret.Get(0).(*types.ResponseFinalizeBlock) } } - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestInitChain) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestFinalizeBlock) error); ok { r1 = rf(_a0, _a1) } else { r1 = ret.Error(1) @@ -133,24 +185,24 @@ func (_m *AppConnConsensus) InitChain(_a0 context.Context, _a1 *types.RequestIni return r0, r1 } -// FetchOracleVotes provides a mock function with given fields: _a0, _a1 -func (_m *AppConnConsensus) FetchOracleVotes(_a0 context.Context, _a1 *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) { +// InitChain provides a mock function with given fields: _a0, _a1 +func (_m *AppConnConsensus) InitChain(_a0 context.Context, _a1 *types.RequestInitChain) (*types.ResponseInitChain, error) { ret := _m.Called(_a0, _a1) - var r0 *types.ResponseFetchOracleVotes + var r0 *types.ResponseInitChain var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestInitChain) (*types.ResponseInitChain, error)); ok { return rf(_a0, _a1) } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFetchOracleVotes) *types.ResponseFetchOracleVotes); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestInitChain) *types.ResponseInitChain); ok { r0 = rf(_a0, _a1) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponseFetchOracleVotes) + r0 = ret.Get(0).(*types.ResponseInitChain) } } - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestFetchOracleVotes) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestInitChain) error); ok { r1 = rf(_a0, _a1) } else { r1 = ret.Error(1) @@ -211,32 +263,6 @@ func (_m *AppConnConsensus) ProcessProposal(_a0 context.Context, _a1 *types.Requ return r0, r1 } -// CreateOracleResultTx provides a mock function with given fields: _a0, _a1 -func (_m *AppConnConsensus) CreateOracleResultTx(_a0 context.Context, _a1 *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error) { - ret := _m.Called(_a0, _a1) - - var r0 *types.ResponseCreateOracleResultTx - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestCreateOracleResultTx) (*types.ResponseCreateOracleResultTx, error)); ok { - return rf(_a0, _a1) - } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestCreateOracleResultTx) *types.ResponseCreateOracleResultTx); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponseCreateOracleResultTx) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestCreateOracleResultTx) error); ok { - r1 = rf(_a0, _a1) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // ValidateOracleVotes provides a mock function with given fields: _a0, _a1 func (_m *AppConnConsensus) ValidateOracleVotes(_a0 context.Context, _a1 *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) { ret := _m.Called(_a0, _a1) From 219031defa026042ecae748f63c83d30e282310b Mon Sep 17 00:00:00 2001 From: yan-soon Date: Wed, 10 Jul 2024 14:56:03 +0800 Subject: [PATCH 04/15] add pruning oracle vote logic for already committed results --- oracle/service/runner/runner.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 0ebc9a212d5..4893b6536b1 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -137,6 +137,17 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { visitedVoteMap[key] = struct{}{} + // also prune votes for a given oracle id and timestamp, that have already been committed as results on chain + res, err := oracleInfo.ProxyApp.DoesOracleResultExist(context.Background(), &abcitypes.RequestDoesOracleResultExist{Key: key}) + if err != nil { + log.Warnf("PruneVoteBuffers: unable to check if oracle result exist for vote: %v: %v", vote, err) + } + + if res.DoesExist { + log.Infof("Pruning vote %v as it already exists on chain", vote) + continue + } + if vote.Timestamp >= latestAllowableTimestamp { newVotes = append(newVotes, vote) } From ae80fc805c3f19502d0754f4d59aa8d3f84de1bf Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 11 Jul 2024 02:30:18 +0800 Subject: [PATCH 05/15] add sig prefix for oracle votes signing --- oracle/service/runner/runner.go | 3 +- oracle/service/types/info.go | 3 + privval/file.go | 7 +- privval/retry_signer_client.go | 4 +- privval/signer_client.go | 3 +- privval/signer_client_test.go | 8 +- privval/signer_requestHandler.go | 3 +- proto/tendermint/privval/types.pb.go | 169 ++++++++++++++++++--------- proto/tendermint/privval/types.proto | 1 + types/priv_validator.go | 5 +- 10 files changed, 134 insertions(+), 72 deletions(-) diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 4893b6536b1..4f8578e37d1 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -71,7 +71,7 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State } // signing of vote should append the signature field of gossipVote - if err := oracleInfo.PrivValidator.SignOracleVote(consensusState.GetState().ChainID, newGossipVote); err != nil { + if err := oracleInfo.PrivValidator.SignOracleVote(consensusState.GetState().ChainID, newGossipVote, []byte{}); err != nil { log.Errorf("processSignVoteQueue: error signing oracle votes") return } @@ -144,7 +144,6 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { } if res.DoesExist { - log.Infof("Pruning vote %v as it already exists on chain", vote) continue } diff --git a/oracle/service/types/info.go b/oracle/service/types/info.go index 3bfed9b532f..48569123276 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -30,3 +30,6 @@ type UnsignedVoteBuffer struct { Buffer []*oracleproto.Vote UpdateMtx cmtsync.RWMutex } + +var MainAccountSigPrefix = []byte{0x00} +var SubAccountSigPrefix = []byte{0x01} diff --git a/privval/file.go b/privval/file.go index ecfad0f68bf..dcb7eb8604a 100644 --- a/privval/file.go +++ b/privval/file.go @@ -278,8 +278,8 @@ func (pv *FilePV) SignProposal(chainID string, proposal *cmtproto.Proposal) erro // SignOracleVote signs a canonical representation of the vote, along with the // chainID. Implements PrivValidator. -func (pv *FilePV) SignOracleVote(chainID string, vote *oracleproto.GossipedVotes) error { - if err := pv.signOracleVote(chainID, vote); err != nil { +func (pv *FilePV) SignOracleVote(chainID string, vote *oracleproto.GossipedVotes, sigPrefix []byte) error { + if err := pv.signOracleVote(chainID, vote, sigPrefix); err != nil { return fmt.Errorf("error signing vote: %v", err) } return nil @@ -309,12 +309,13 @@ func (pv *FilePV) String() string { ) } -func (pv *FilePV) signOracleVote(chainID string, vote *oracleproto.GossipedVotes) error { +func (pv *FilePV) signOracleVote(chainID string, vote *oracleproto.GossipedVotes, sigPrefix []byte) error { signBytes := types.OracleVoteSignBytes(chainID, vote) sig, err := pv.Key.PrivKey.Sign(signBytes) if err != nil { return err } + sig = append(sigPrefix, sig...) vote.Signature = sig return nil diff --git a/privval/retry_signer_client.go b/privval/retry_signer_client.go index 74151c7d4e2..ddb6fb9aac0 100644 --- a/privval/retry_signer_client.go +++ b/privval/retry_signer_client.go @@ -80,10 +80,10 @@ func (sc *RetrySignerClient) SignVote(chainID string, vote *cmtproto.Vote) error return fmt.Errorf("exhausted all attempts to sign vote: %w", err) } -func (sc *RetrySignerClient) SignOracleVote(chainID string, vote *oracleproto.GossipedVotes) error { +func (sc *RetrySignerClient) SignOracleVote(chainID string, vote *oracleproto.GossipedVotes, sigPrefix []byte) error { var err error for i := 0; i < sc.retries || sc.retries == 0; i++ { - err = sc.next.SignOracleVote(chainID, vote) + err = sc.next.SignOracleVote(chainID, vote, sigPrefix) if err == nil { return nil } diff --git a/privval/signer_client.go b/privval/signer_client.go index 5c5f3dbf4ac..090a38b669c 100644 --- a/privval/signer_client.go +++ b/privval/signer_client.go @@ -112,7 +112,7 @@ func (sc *SignerClient) SignVote(chainID string, vote *cmtproto.Vote) error { } // SignVote requests a remote signer to sign a vote -func (sc *SignerClient) SignOracleVote(chainID string, vote *oracleproto.GossipedVotes) error { +func (sc *SignerClient) SignOracleVote(chainID string, vote *oracleproto.GossipedVotes, sigPrefix []byte) error { response, err := sc.endpoint.SendRequest(mustWrapMsg(&privvalproto.SignOracleVoteRequest{Vote: vote, ChainId: chainID})) if err != nil { return err @@ -126,6 +126,7 @@ func (sc *SignerClient) SignOracleVote(chainID string, vote *oracleproto.Gossipe return &RemoteSignerError{Code: int(resp.Error.Code), Description: resp.Error.Description} } + resp.Vote.Signature = append(sigPrefix, resp.Vote.Signature...) *vote = resp.Vote return nil diff --git a/privval/signer_client_test.go b/privval/signer_client_test.go index b981136242e..f8ffa774b07 100644 --- a/privval/signer_client_test.go +++ b/privval/signer_client_test.go @@ -240,8 +240,8 @@ func TestSignerOracleVote(t *testing.T) { } }) - require.NoError(t, tc.mockPV.SignOracleVote(tc.chainID, want)) - require.NoError(t, tc.signerClient.SignOracleVote(tc.chainID, have)) + require.NoError(t, tc.mockPV.SignOracleVote(tc.chainID, want, []byte{0x00})) + require.NoError(t, tc.signerClient.SignOracleVote(tc.chainID, have, []byte{0x00})) assert.Equal(t, want.Signature, have.Signature) @@ -253,8 +253,8 @@ func TestSignerOracleVote(t *testing.T) { require.NoError(t, err) // test verify sig with pv and signing client signatures - require.True(t, pvPubKey.VerifySignature(types.OracleVoteSignBytes(tc.chainID, want), want.Signature)) - require.True(t, scPubKey.VerifySignature(types.OracleVoteSignBytes(tc.chainID, have), have.Signature)) + require.True(t, pvPubKey.VerifySignature(types.OracleVoteSignBytes(tc.chainID, want), want.Signature[1:])) + require.True(t, scPubKey.VerifySignature(types.OracleVoteSignBytes(tc.chainID, have), have.Signature[1:])) } } diff --git a/privval/signer_requestHandler.go b/privval/signer_requestHandler.go index bbc778c35d8..e4e6afe044a 100644 --- a/privval/signer_requestHandler.go +++ b/privval/signer_requestHandler.go @@ -75,8 +75,9 @@ func DefaultValidationRequestHandler( } vote := r.SignOracleVoteRequest.Vote + sigPrefix := r.SignOracleVoteRequest.SignaturePrefix - err = privVal.SignOracleVote(chainID, vote) + err = privVal.SignOracleVote(chainID, vote, sigPrefix) if err != nil { res = mustWrapMsg(&privvalproto.SignedOracleVoteResponse{ Vote: oracleproto.GossipedVotes{}, Error: &privvalproto.RemoteSignerError{Code: 0, Description: err.Error()}}) diff --git a/proto/tendermint/privval/types.pb.go b/proto/tendermint/privval/types.pb.go index 133c9defc17..07b82b04de3 100644 --- a/proto/tendermint/privval/types.pb.go +++ b/proto/tendermint/privval/types.pb.go @@ -427,8 +427,9 @@ func (m *SignedProposalResponse) GetError() *RemoteSignerError { // SignOracleVoteRequest is a request to sign a vote type SignOracleVoteRequest struct { - Vote *oracle.GossipedVotes `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote,omitempty"` - ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + Vote *oracle.GossipedVotes `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote,omitempty"` + ChainId string `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + SignaturePrefix []byte `protobuf:"bytes,3,opt,name=signature_prefix,json=signaturePrefix,proto3" json:"signature_prefix,omitempty"` } func (m *SignOracleVoteRequest) Reset() { *m = SignOracleVoteRequest{} } @@ -478,6 +479,13 @@ func (m *SignOracleVoteRequest) GetChainId() string { return "" } +func (m *SignOracleVoteRequest) GetSignaturePrefix() []byte { + if m != nil { + return m.SignaturePrefix + } + return nil +} + // SignedOracleVoteResponse is a response containing a signed vote or an error type SignedOracleVoteResponse struct { Vote oracle.GossipedVotes `protobuf:"bytes,1,opt,name=vote,proto3" json:"vote"` @@ -813,61 +821,63 @@ func init() { func init() { proto.RegisterFile("tendermint/privval/types.proto", fileDescriptor_cb4e437a5328cf9c) } var fileDescriptor_cb4e437a5328cf9c = []byte{ - // 862 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x4d, 0x6f, 0xdb, 0x46, - 0x10, 0x25, 0x6d, 0xc9, 0xb2, 0x47, 0xfe, 0x50, 0xd6, 0x8e, 0xab, 0xb8, 0x09, 0xe3, 0xaa, 0x68, - 0x9b, 0x1a, 0x05, 0x55, 0xa4, 0x1f, 0x87, 0xa6, 0x97, 0xda, 0x26, 0x42, 0xc1, 0x08, 0xa9, 0xae, - 0x95, 0x26, 0x08, 0x50, 0x10, 0x12, 0xb5, 0xa1, 0x89, 0x58, 0xdc, 0x2d, 0x97, 0x32, 0xa0, 0x73, - 0x0f, 0x05, 0x7a, 0x2a, 0x90, 0x3f, 0xd1, 0x9f, 0x92, 0x63, 0x8e, 0x3d, 0x15, 0x85, 0xfd, 0x47, - 0x0a, 0xed, 0xae, 0xf8, 0x61, 0x4a, 0x69, 0x83, 0xe4, 0xc6, 0x9d, 0x99, 0x7d, 0xf3, 0xde, 0x0c, - 0x1f, 0x41, 0x30, 0x12, 0x12, 0x0d, 0x49, 0x3c, 0x0a, 0xa3, 0xa4, 0xcd, 0xe2, 0xf0, 0xe2, 0xa2, - 0x7f, 0xde, 0x4e, 0x26, 0x8c, 0x70, 0x93, 0xc5, 0x34, 0xa1, 0x08, 0x65, 0x79, 0x53, 0xe5, 0xf7, - 0x6e, 0xe7, 0xee, 0xf8, 0xf1, 0x84, 0x25, 0xb4, 0xfd, 0x82, 0x4c, 0xd4, 0x8d, 0x42, 0x56, 0x20, - 0xe5, 0xf1, 0xf6, 0xee, 0xe4, 0xb2, 0x34, 0xee, 0xfb, 0xe7, 0xa4, 0x90, 0xde, 0x09, 0x68, 0x40, - 0xc5, 0x63, 0x7b, 0xfa, 0x24, 0xa3, 0xad, 0x0e, 0xdc, 0xc0, 0x64, 0x44, 0x13, 0x72, 0x1a, 0x06, - 0x11, 0x89, 0xad, 0x38, 0xa6, 0x31, 0x42, 0x50, 0xf1, 0xe9, 0x90, 0x34, 0xf5, 0x7d, 0xfd, 0x5e, - 0x15, 0x8b, 0x67, 0xb4, 0x0f, 0xf5, 0x21, 0xe1, 0x7e, 0x1c, 0xb2, 0x24, 0xa4, 0x51, 0x73, 0x69, - 0x5f, 0xbf, 0xb7, 0x86, 0xf3, 0xa1, 0xd6, 0x01, 0x6c, 0x74, 0xc7, 0x83, 0x13, 0x32, 0xc1, 0xe4, - 0x97, 0x31, 0xe1, 0x09, 0xba, 0x05, 0xab, 0xfe, 0x59, 0x3f, 0x8c, 0xbc, 0x70, 0x28, 0xa0, 0xd6, - 0x70, 0x4d, 0x9c, 0x3b, 0xc3, 0xd6, 0xef, 0x3a, 0x6c, 0xce, 0x8a, 0x39, 0xa3, 0x11, 0x27, 0xe8, - 0x01, 0xd4, 0xd8, 0x78, 0xe0, 0xbd, 0x20, 0x13, 0x51, 0x5c, 0xbf, 0x7f, 0xdb, 0xcc, 0x0d, 0x48, - 0x0e, 0xc3, 0xec, 0x8e, 0x07, 0xe7, 0xa1, 0x7f, 0x42, 0x26, 0x87, 0x95, 0x57, 0x7f, 0xdf, 0xd5, - 0xf0, 0x0a, 0x13, 0x20, 0xe8, 0x01, 0x54, 0xc9, 0x94, 0xba, 0xe0, 0x55, 0xbf, 0xff, 0x89, 0x59, - 0x9e, 0xad, 0x59, 0xd2, 0x89, 0xe5, 0x9d, 0xd6, 0x53, 0xd8, 0x9a, 0x46, 0x7f, 0xa2, 0x09, 0x99, - 0x51, 0x3f, 0x80, 0xca, 0x05, 0x4d, 0x88, 0x62, 0xb2, 0x9b, 0x87, 0x93, 0x33, 0x15, 0xc5, 0xa2, - 0xa6, 0x20, 0x73, 0xa9, 0x28, 0xf3, 0x57, 0x1d, 0x90, 0x68, 0x38, 0x94, 0xe0, 0x4a, 0xea, 0x97, - 0xff, 0x07, 0x5d, 0x29, 0x94, 0x3d, 0xde, 0x49, 0xdf, 0x19, 0x6c, 0x4f, 0xa3, 0xdd, 0x98, 0x32, - 0xca, 0xfb, 0xe7, 0x33, 0x8d, 0xdf, 0xc2, 0x2a, 0x53, 0x21, 0xc5, 0x64, 0xaf, 0xcc, 0x24, 0xbd, - 0x94, 0xd6, 0xbe, 0x49, 0xef, 0x4b, 0x1d, 0x76, 0xa5, 0xde, 0xac, 0x99, 0xd2, 0xfc, 0xfd, 0xdb, - 0x74, 0x53, 0xda, 0xb3, 0x9e, 0xef, 0xa8, 0xff, 0xe6, 0x34, 0xea, 0x0a, 0x4f, 0xe4, 0xb7, 0xfc, - 0x75, 0x61, 0x0f, 0xfb, 0x79, 0x50, 0x69, 0x20, 0xf3, 0x21, 0xe5, 0x3c, 0x64, 0x72, 0x7d, 0xfc, - 0xbf, 0xf7, 0xfd, 0x52, 0x87, 0xa6, 0xd4, 0x9f, 0x6f, 0xa6, 0x26, 0xf0, 0xdd, 0xdb, 0x75, 0x7b, - 0x7f, 0xfb, 0xdf, 0x80, 0x7a, 0x37, 0x8c, 0x02, 0xa5, 0xba, 0xb5, 0x09, 0xeb, 0xf2, 0x28, 0x79, - 0xb5, 0x7e, 0xab, 0x41, 0xed, 0x11, 0xe1, 0xbc, 0x1f, 0x10, 0x74, 0x02, 0x5b, 0xca, 0x84, 0x5e, - 0x2c, 0xcb, 0x15, 0xdd, 0x8f, 0xe6, 0x75, 0x2c, 0xd8, 0xdd, 0xd6, 0xf0, 0x06, 0x2b, 0xf8, 0xdf, - 0x81, 0x46, 0x06, 0x26, 0x9b, 0x29, 0xfe, 0xad, 0x37, 0xa1, 0xc9, 0x4a, 0x5b, 0xc3, 0x9b, 0xac, - 0xf8, 0x85, 0xf8, 0x11, 0x6e, 0xf0, 0x30, 0x88, 0xbc, 0xe9, 0x44, 0x52, 0x7a, 0xcb, 0x02, 0xf0, - 0xe3, 0x79, 0x80, 0xd7, 0x4c, 0x6d, 0x6b, 0x78, 0x8b, 0x5f, 0xf3, 0xf9, 0x33, 0xd8, 0xe1, 0x62, - 0x5f, 0x33, 0x50, 0x45, 0xb3, 0x22, 0x50, 0x3f, 0x5d, 0x84, 0x5a, 0xf4, 0xb3, 0xad, 0x61, 0xc4, - 0xcb, 0x2e, 0xff, 0x19, 0x6e, 0x0a, 0xba, 0xb3, 0x97, 0x38, 0xa5, 0x5c, 0x15, 0xe0, 0x9f, 0x2d, - 0x02, 0xbf, 0xe6, 0x53, 0x5b, 0xc3, 0xdb, 0x7c, 0x8e, 0x7d, 0x9f, 0x43, 0x53, 0x51, 0xcf, 0x35, - 0x50, 0xf4, 0x57, 0x44, 0x87, 0x83, 0xc5, 0xf4, 0xaf, 0xdb, 0xd3, 0xd6, 0xf0, 0x2e, 0x9f, 0x6f, - 0xdc, 0x63, 0x58, 0x67, 0x61, 0x14, 0xa4, 0xec, 0x6b, 0x02, 0xfb, 0xee, 0xdc, 0x0d, 0x66, 0x6f, - 0x99, 0xad, 0xe1, 0x3a, 0xcb, 0x8e, 0xe8, 0x21, 0x6c, 0x28, 0x14, 0x45, 0x71, 0xb5, 0xec, 0x82, - 0x22, 0x4c, 0x4a, 0x6c, 0x9d, 0xe5, 0xce, 0x68, 0x28, 0x65, 0x7b, 0xd2, 0x32, 0xc5, 0x77, 0x61, - 0x4d, 0x60, 0x7e, 0xbe, 0x48, 0x76, 0xe9, 0x03, 0x60, 0x6b, 0x58, 0xac, 0xa8, 0xfc, 0x65, 0x18, - 0xc1, 0x87, 0x6a, 0xb8, 0xc5, 0x3e, 0x8a, 0x3c, 0x88, 0x46, 0x5f, 0x2c, 0x9e, 0x6f, 0xd9, 0xfe, - 0xb6, 0x86, 0xd5, 0xbe, 0xca, 0xb9, 0xc3, 0x2a, 0x2c, 0xf3, 0xf1, 0xe8, 0xe0, 0x4f, 0x1d, 0x56, - 0x84, 0x73, 0x39, 0x42, 0xb0, 0x69, 0x61, 0xec, 0xe2, 0x53, 0xef, 0xb1, 0x73, 0xe2, 0xb8, 0x4f, - 0x9c, 0x86, 0x86, 0x0c, 0xd8, 0x4b, 0x63, 0xd6, 0xd3, 0xae, 0x75, 0xd4, 0xb3, 0x8e, 0x3d, 0x6c, - 0x9d, 0x76, 0x5d, 0xe7, 0xd4, 0x6a, 0xe8, 0xa8, 0x09, 0x3b, 0x2a, 0xef, 0xb8, 0xde, 0x91, 0xeb, - 0x38, 0xd6, 0x51, 0xaf, 0xe3, 0x3a, 0x8d, 0x25, 0x74, 0x07, 0x6e, 0xa9, 0x4c, 0x16, 0xf6, 0x7a, - 0x9d, 0x47, 0x96, 0xfb, 0xb8, 0xd7, 0x58, 0x46, 0x1f, 0xc0, 0xb6, 0x4a, 0x63, 0xeb, 0x87, 0xe3, - 0x34, 0x51, 0xc9, 0x21, 0x3e, 0xc1, 0x9d, 0x9e, 0x95, 0x66, 0xaa, 0x87, 0xee, 0xab, 0x4b, 0x43, - 0x7f, 0x7d, 0x69, 0xe8, 0xff, 0x5c, 0x1a, 0xfa, 0x1f, 0x57, 0x86, 0xf6, 0xfa, 0xca, 0xd0, 0xfe, - 0xba, 0x32, 0xb4, 0x67, 0xdf, 0x04, 0x61, 0x72, 0x36, 0x1e, 0x98, 0x3e, 0x1d, 0xb5, 0x7d, 0x3a, - 0x22, 0xc9, 0xe0, 0x79, 0x92, 0x3d, 0xc8, 0x1f, 0x90, 0xf2, 0x9f, 0xd1, 0x60, 0x45, 0x64, 0xbe, - 0xfa, 0x37, 0x00, 0x00, 0xff, 0xff, 0x84, 0xfc, 0x98, 0x3d, 0x36, 0x09, 0x00, 0x00, + // 892 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x4b, 0x6f, 0xdb, 0x46, + 0x10, 0x26, 0x6d, 0xc9, 0xb2, 0x47, 0x7e, 0x28, 0x6b, 0xc7, 0x55, 0xdc, 0x44, 0x51, 0x55, 0xb4, + 0x75, 0x8c, 0x42, 0x2a, 0xd2, 0xc7, 0xa1, 0xe9, 0xa5, 0xb6, 0x89, 0x50, 0x30, 0x42, 0xaa, 0x6b, + 0xa5, 0x09, 0x02, 0x14, 0x84, 0x1e, 0x6b, 0x9a, 0x88, 0xc4, 0xdd, 0x72, 0x29, 0xa3, 0x3a, 0xf7, + 0x50, 0xa0, 0xa7, 0x02, 0xf9, 0x13, 0xfd, 0x29, 0x39, 0xe6, 0xd8, 0x53, 0x51, 0xd8, 0x7f, 0xa4, + 0xe0, 0xee, 0x8a, 0x0f, 0x53, 0x4a, 0x1b, 0x38, 0x37, 0xee, 0xcc, 0xec, 0x37, 0xdf, 0x37, 0xb3, + 0x33, 0x20, 0xd4, 0x42, 0xe2, 0x0f, 0x49, 0x30, 0xf6, 0xfc, 0xb0, 0xc5, 0x02, 0xef, 0xe2, 0xa2, + 0x37, 0x6a, 0x85, 0x53, 0x46, 0x78, 0x93, 0x05, 0x34, 0xa4, 0x08, 0x25, 0xfe, 0xa6, 0xf2, 0xef, + 0xdd, 0x4d, 0xdd, 0x19, 0x04, 0x53, 0x16, 0xd2, 0xd6, 0x4b, 0x32, 0x55, 0x37, 0x32, 0x5e, 0x81, + 0x94, 0xc6, 0xdb, 0xbb, 0x97, 0xf2, 0xd2, 0xa0, 0x37, 0x18, 0x91, 0x8c, 0x7b, 0xc7, 0xa5, 0x2e, + 0x15, 0x9f, 0xad, 0xe8, 0x4b, 0x5a, 0x1b, 0x6d, 0xb8, 0x85, 0xc9, 0x98, 0x86, 0xe4, 0xd4, 0x73, + 0x7d, 0x12, 0x18, 0x41, 0x40, 0x03, 0x84, 0xa0, 0x30, 0xa0, 0x43, 0x52, 0xd5, 0xeb, 0xfa, 0x7e, + 0x11, 0x8b, 0x6f, 0x54, 0x87, 0xf2, 0x90, 0xf0, 0x41, 0xe0, 0xb1, 0xd0, 0xa3, 0x7e, 0x75, 0xa9, + 0xae, 0xef, 0xaf, 0xe1, 0xb4, 0xa9, 0x71, 0x00, 0x1b, 0x9d, 0x49, 0xff, 0x84, 0x4c, 0x31, 0xf9, + 0x79, 0x42, 0x78, 0x88, 0xee, 0xc0, 0xea, 0xe0, 0xbc, 0xe7, 0xf9, 0x8e, 0x37, 0x14, 0x50, 0x6b, + 0xb8, 0x24, 0xce, 0xed, 0x61, 0xe3, 0x77, 0x1d, 0x36, 0x67, 0xc1, 0x9c, 0x51, 0x9f, 0x13, 0xf4, + 0x08, 0x4a, 0x6c, 0xd2, 0x77, 0x5e, 0x92, 0xa9, 0x08, 0x2e, 0x3f, 0xbc, 0xdb, 0x4c, 0x15, 0x48, + 0x16, 0xa3, 0xd9, 0x99, 0xf4, 0x47, 0xde, 0xe0, 0x84, 0x4c, 0x0f, 0x0b, 0xaf, 0xff, 0xbe, 0xaf, + 0xe1, 0x15, 0x26, 0x40, 0xd0, 0x23, 0x28, 0x92, 0x88, 0xba, 0xe0, 0x55, 0x7e, 0xf8, 0x49, 0x33, + 0x5f, 0xdb, 0x66, 0x4e, 0x27, 0x96, 0x77, 0x1a, 0xcf, 0x61, 0x2b, 0xb2, 0xfe, 0x48, 0x43, 0x32, + 0xa3, 0x7e, 0x00, 0x85, 0x0b, 0x1a, 0x12, 0xc5, 0x64, 0x37, 0x0d, 0x27, 0x6b, 0x2a, 0x82, 0x45, + 0x4c, 0x46, 0xe6, 0x52, 0x56, 0xe6, 0xaf, 0x3a, 0x20, 0x91, 0x70, 0x28, 0xc1, 0x95, 0xd4, 0x2f, + 0xfe, 0x0f, 0xba, 0x52, 0x28, 0x73, 0xdc, 0x48, 0xdf, 0x39, 0x6c, 0x47, 0xd6, 0x4e, 0x40, 0x19, + 0xe5, 0xbd, 0xd1, 0x4c, 0xe3, 0x37, 0xb0, 0xca, 0x94, 0x49, 0x31, 0xd9, 0xcb, 0x33, 0x89, 0x2f, + 0xc5, 0xb1, 0x6f, 0xd3, 0xfb, 0x4a, 0x87, 0x5d, 0xa9, 0x37, 0x49, 0xa6, 0x34, 0x7f, 0xf7, 0x2e, + 0xd9, 0x94, 0xf6, 0x24, 0xe7, 0x8d, 0xf4, 0xbf, 0xd2, 0xe1, 0x76, 0x64, 0xb6, 0xc5, 0x50, 0xa4, + 0xdb, 0xfc, 0x55, 0xa6, 0x11, 0xf5, 0x34, 0xaa, 0x9c, 0xa0, 0xe6, 0x63, 0xca, 0xb9, 0xc7, 0x64, + 0xff, 0xf8, 0x7f, 0x36, 0x1c, 0x3d, 0x80, 0x0a, 0xf7, 0x5c, 0xbf, 0x17, 0x4e, 0x02, 0xe2, 0xb0, + 0x80, 0x9c, 0x79, 0xbf, 0x54, 0x97, 0xeb, 0xfa, 0xfe, 0x3a, 0xde, 0x8a, 0xed, 0x1d, 0x61, 0x8e, + 0x58, 0x55, 0x65, 0xad, 0xd2, 0xbc, 0x54, 0xb5, 0xbe, 0x7d, 0x37, 0x62, 0xef, 0xef, 0xad, 0x6c, + 0x40, 0xb9, 0xe3, 0xf9, 0xae, 0x2a, 0x50, 0x63, 0x13, 0xd6, 0xe5, 0x51, 0xf2, 0x6a, 0xfc, 0x56, + 0x82, 0xd2, 0x13, 0xc2, 0x79, 0xcf, 0x25, 0xe8, 0x04, 0xb6, 0xd4, 0xc0, 0x3a, 0x81, 0x0c, 0x57, + 0x74, 0x3f, 0x9a, 0x97, 0x31, 0xb3, 0x1a, 0x4c, 0x0d, 0x6f, 0xb0, 0xcc, 0xae, 0xb0, 0xa0, 0x92, + 0x80, 0xc9, 0x64, 0x8a, 0x7f, 0xe3, 0x6d, 0x68, 0x32, 0xd2, 0xd4, 0xf0, 0x26, 0xcb, 0x6e, 0x93, + 0x1f, 0xe0, 0x56, 0x54, 0x70, 0x27, 0xaa, 0x48, 0x4c, 0x6f, 0x59, 0x00, 0x7e, 0x3c, 0x0f, 0xf0, + 0xda, 0x02, 0x30, 0x35, 0xd9, 0xb0, 0xf4, 0x63, 0x79, 0x01, 0x3b, 0x5c, 0xf4, 0x6b, 0x06, 0xaa, + 0x68, 0x16, 0x04, 0xea, 0xa7, 0x8b, 0x50, 0xb3, 0xb3, 0x6f, 0x6a, 0x18, 0xf1, 0xfc, 0x46, 0xf8, + 0x09, 0x6e, 0x0b, 0xba, 0xb3, 0x07, 0x1f, 0x53, 0x2e, 0x0a, 0xf0, 0xcf, 0x16, 0x81, 0x5f, 0x9b, + 0x69, 0x53, 0xc3, 0xdb, 0x7c, 0xce, 0xa8, 0x9f, 0x41, 0x55, 0x51, 0x4f, 0x25, 0x50, 0xf4, 0x57, + 0x44, 0x86, 0x83, 0xc5, 0xf4, 0xaf, 0x8f, 0xb2, 0xa9, 0xe1, 0x5d, 0x3e, 0x7f, 0xc8, 0x8f, 0x61, + 0x9d, 0x79, 0xbe, 0x1b, 0xb3, 0x2f, 0x09, 0xec, 0xfb, 0x73, 0x3b, 0x98, 0xbc, 0x32, 0x53, 0xc3, + 0x65, 0x96, 0x1c, 0xd1, 0x63, 0xd8, 0x50, 0x28, 0x8a, 0xe2, 0x6a, 0x7e, 0x0a, 0xb2, 0x30, 0x31, + 0xb1, 0x75, 0x96, 0x3a, 0xa3, 0xa1, 0x94, 0xed, 0xc8, 0x91, 0xc9, 0xbe, 0x85, 0x35, 0x81, 0xf9, + 0x60, 0x91, 0xec, 0xdc, 0xae, 0x30, 0x35, 0x2c, 0x5a, 0x94, 0x5f, 0x22, 0x63, 0xf8, 0x50, 0x15, + 0x37, 0x9b, 0x47, 0x91, 0x07, 0x91, 0xe8, 0xf3, 0xc5, 0xf5, 0xcd, 0x8f, 0xbf, 0xa9, 0x61, 0xd5, + 0xaf, 0xbc, 0xef, 0xb0, 0x08, 0xcb, 0x7c, 0x32, 0x3e, 0xf8, 0x53, 0x87, 0x15, 0x31, 0xb9, 0x1c, + 0x21, 0xd8, 0x34, 0x30, 0xb6, 0xf1, 0xa9, 0xf3, 0xd4, 0x3a, 0xb1, 0xec, 0x67, 0x56, 0x45, 0x43, + 0x35, 0xd8, 0x8b, 0x6d, 0xc6, 0xf3, 0x8e, 0x71, 0xd4, 0x35, 0x8e, 0x1d, 0x6c, 0x9c, 0x76, 0x6c, + 0xeb, 0xd4, 0xa8, 0xe8, 0xa8, 0x0a, 0x3b, 0xca, 0x6f, 0xd9, 0xce, 0x91, 0x6d, 0x59, 0xc6, 0x51, + 0xb7, 0x6d, 0x5b, 0x95, 0x25, 0x74, 0x0f, 0xee, 0x28, 0x4f, 0x62, 0x76, 0xba, 0xed, 0x27, 0x86, + 0xfd, 0xb4, 0x5b, 0x59, 0x46, 0x1f, 0xc0, 0xb6, 0x72, 0x63, 0xe3, 0xfb, 0xe3, 0xd8, 0x51, 0x48, + 0x21, 0x3e, 0xc3, 0xed, 0xae, 0x11, 0x7b, 0x8a, 0x87, 0xf6, 0xeb, 0xcb, 0x9a, 0xfe, 0xe6, 0xb2, + 0xa6, 0xff, 0x73, 0x59, 0xd3, 0xff, 0xb8, 0xaa, 0x69, 0x6f, 0xae, 0x6a, 0xda, 0x5f, 0x57, 0x35, + 0xed, 0xc5, 0xd7, 0xae, 0x17, 0x9e, 0x4f, 0xfa, 0xcd, 0x01, 0x1d, 0xb7, 0x06, 0x74, 0x4c, 0xc2, + 0xfe, 0x59, 0x98, 0x7c, 0xc8, 0x9f, 0x95, 0xfc, 0x5f, 0x54, 0x7f, 0x45, 0x78, 0xbe, 0xfc, 0x37, + 0x00, 0x00, 0xff, 0xff, 0x10, 0x9b, 0x74, 0xca, 0x62, 0x09, 0x00, 0x00, } func (m *RemoteSignerError) Marshal() (dAtA []byte, err error) { @@ -1174,6 +1184,13 @@ func (m *SignOracleVoteRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.SignaturePrefix) > 0 { + i -= len(m.SignaturePrefix) + copy(dAtA[i:], m.SignaturePrefix) + i = encodeVarintTypes(dAtA, i, uint64(len(m.SignaturePrefix))) + i-- + dAtA[i] = 0x1a + } if len(m.ChainId) > 0 { i -= len(m.ChainId) copy(dAtA[i:], m.ChainId) @@ -1662,6 +1679,10 @@ func (m *SignOracleVoteRequest) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + l = len(m.SignaturePrefix) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } return n } @@ -2710,6 +2731,40 @@ func (m *SignOracleVoteRequest) Unmarshal(dAtA []byte) error { } m.ChainId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SignaturePrefix", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SignaturePrefix = append(m.SignaturePrefix[:0], dAtA[iNdEx:postIndex]...) + if m.SignaturePrefix == nil { + m.SignaturePrefix = []byte{} + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/proto/tendermint/privval/types.proto b/proto/tendermint/privval/types.proto index 2ac38a702d7..4ea3852448d 100644 --- a/proto/tendermint/privval/types.proto +++ b/proto/tendermint/privval/types.proto @@ -61,6 +61,7 @@ message SignedProposalResponse { message SignOracleVoteRequest { tendermint.oracle.GossipedVotes vote = 1; string chain_id = 2; + bytes signature_prefix = 3; } // SignedOracleVoteResponse is a response containing a signed vote or an error diff --git a/types/priv_validator.go b/types/priv_validator.go index 6c75c09f9bf..0072a29d005 100644 --- a/types/priv_validator.go +++ b/types/priv_validator.go @@ -18,7 +18,7 @@ type PrivValidator interface { SignVote(chainID string, vote *cmtproto.Vote) error SignProposal(chainID string, proposal *cmtproto.Proposal) error - SignOracleVote(chainID string, oracleVote *oracleproto.GossipedVotes) error + SignOracleVote(chainID string, oracleVote *oracleproto.GossipedVotes, sigPrefix []byte) error } type PrivValidatorsByAddress []PrivValidator @@ -101,12 +101,13 @@ func (pv MockPV) SignVote(chainID string, vote *cmtproto.Vote) error { } // Implements PrivValidator. -func (pv MockPV) SignOracleVote(chainID string, vote *oracleproto.GossipedVotes) error { +func (pv MockPV) SignOracleVote(chainID string, vote *oracleproto.GossipedVotes, sigPrefix []byte) error { signBytes := OracleVoteSignBytes(chainID, vote) sig, err := pv.PrivKey.Sign(signBytes) if err != nil { return err } + sig = append(sigPrefix, sig...) vote.Signature = sig return nil From 8047295a634c9a7ea1aa9dea2a26e746ae58cdf1 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 11 Jul 2024 02:46:06 +0800 Subject: [PATCH 06/15] add signType to sigPrefix --- oracle/service/types/info.go | 4 ++++ privval/signer_client_test.go | 13 +++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/oracle/service/types/info.go b/oracle/service/types/info.go index 48569123276..cd16f6f9435 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -33,3 +33,7 @@ type UnsignedVoteBuffer struct { var MainAccountSigPrefix = []byte{0x00} var SubAccountSigPrefix = []byte{0x01} + +var Ed25519SignType = []byte{0x02} +var Sr25519SignType = []byte{0x03} +var Secp256k1SignType = []byte{0x04} diff --git a/privval/signer_client_test.go b/privval/signer_client_test.go index f8ffa774b07..33c6b3fa1b9 100644 --- a/privval/signer_client_test.go +++ b/privval/signer_client_test.go @@ -11,6 +11,7 @@ import ( "github.com/cometbft/cometbft/crypto" "github.com/cometbft/cometbft/crypto/tmhash" cmtrand "github.com/cometbft/cometbft/libs/rand" + oracletypes "github.com/cometbft/cometbft/oracle/service/types" cryptoproto "github.com/cometbft/cometbft/proto/tendermint/crypto" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" privvalproto "github.com/cometbft/cometbft/proto/tendermint/privval" @@ -240,8 +241,12 @@ func TestSignerOracleVote(t *testing.T) { } }) - require.NoError(t, tc.mockPV.SignOracleVote(tc.chainID, want, []byte{0x00})) - require.NoError(t, tc.signerClient.SignOracleVote(tc.chainID, have, []byte{0x00})) + sigPrefix := []byte{} + sigPrefix = append(sigPrefix, oracletypes.MainAccountSigPrefix...) + sigPrefix = append(sigPrefix, oracletypes.Ed25519SignType...) + + require.NoError(t, tc.mockPV.SignOracleVote(tc.chainID, want, sigPrefix)) + require.NoError(t, tc.signerClient.SignOracleVote(tc.chainID, have, sigPrefix)) assert.Equal(t, want.Signature, have.Signature) @@ -253,8 +258,8 @@ func TestSignerOracleVote(t *testing.T) { require.NoError(t, err) // test verify sig with pv and signing client signatures - require.True(t, pvPubKey.VerifySignature(types.OracleVoteSignBytes(tc.chainID, want), want.Signature[1:])) - require.True(t, scPubKey.VerifySignature(types.OracleVoteSignBytes(tc.chainID, have), have.Signature[1:])) + require.True(t, pvPubKey.VerifySignature(types.OracleVoteSignBytes(tc.chainID, want), want.Signature[2:])) + require.True(t, scPubKey.VerifySignature(types.OracleVoteSignBytes(tc.chainID, have), have.Signature[2:])) } } From 97443f0ca4f6359ba303df4469ace7fc4e2289a9 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 11 Jul 2024 03:28:37 +0800 Subject: [PATCH 07/15] add configs and init for oracle subaccount signing --- config/config.go | 31 +++++++++++++++++++++++++------ config/toml.go | 6 ++++++ node/node.go | 11 ++++++++++- 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/config/config.go b/config/config.go index b331e1184ec..2013f64c14a 100644 --- a/config/config.go +++ b/config/config.go @@ -853,17 +853,31 @@ type OracleConfig struct { PruneInterval time.Duration `mapstructure:"prune_interval"` // Max allowable size for votes that can be gossiped from peer to peer MaxGossipMsgSize int `mapstructure:"max_gossip_msg_size"` + // Enables subaccount signing for votes + EnableSubaccountSigning bool `mapstructure:"enable_subaccount_signing"` + // Path to the JSON file containing the subaccount key to use to sign oracle votes + SubaccountKeyFilePath string `mapstructure:"subaccount_key_file_path"` } +const ( + DefaultOracleSubaccountKeyName = "oracle_subaccount_key.json" +) + +var ( + defaultOracleSubaccountKeyPath = filepath.Join(DefaultConfigDir, DefaultOracleSubaccountKeyName) +) + // DefaultOracleConfig returns a default configuration for the CometBFT oracle service func DefaultOracleConfig() *OracleConfig { return &OracleConfig{ - MaxOracleGossipBlocksDelayed: 3, // keep all gossipVotes from at most 3 blocks behind - MaxOracleGossipAge: 20, // keep all gossipVotes from at most 20s ago - SignInterval: 100 * time.Millisecond, // 0.1s - GossipInterval: 250 * time.Millisecond, // 0.25s - PruneInterval: 500 * time.Millisecond, // 0.5s - MaxGossipMsgSize: 65536, + MaxOracleGossipBlocksDelayed: 3, // keep all gossipVotes from at most 3 blocks behind + MaxOracleGossipAge: 20, // keep all gossipVotes from at most 20s ago + SignInterval: 100 * time.Millisecond, // 0.1s + GossipInterval: 250 * time.Millisecond, // 0.25s + PruneInterval: 500 * time.Millisecond, // 0.5s + MaxGossipMsgSize: 65536, // only allow p2p of votes of max size 65536 bytes + EnableSubaccountSigning: false, // default to false + SubaccountKeyFilePath: defaultOracleSubaccountKeyPath, // default file path to subaccount key (config/oracle_subaccount_key.json) } } @@ -874,6 +888,11 @@ func TestOracleConfig() *OracleConfig { return cfg } +// SubaccountKeyFile returns the full path to the oracle_subaccount_key.json file +func (cfg *OracleConfig) SubaccountKeyFile(rootDir string) string { + return rootify(cfg.SubaccountKeyFilePath, rootDir) +} + // ValidateBasic performs basic validation and returns an error if any check fails. func (cfg *OracleConfig) ValidateBasic() error { if cfg.MaxOracleGossipBlocksDelayed <= 0 { diff --git a/config/toml.go b/config/toml.go index 306996d5cff..a66c949660b 100644 --- a/config/toml.go +++ b/config/toml.go @@ -427,6 +427,12 @@ prune_interval = "{{ .Oracle.PruneInterval }}" # Max allowable size for votes that can be gossiped from peer to peer max_gossip_msg_size = {{ .Oracle.MaxGossipMsgSize }} +# Enables subaccount signing for votes +enable_subaccount_signing = {{ .Oracle.EnableSubaccountSigning }} + +# Path to the JSON file containing the subaccount key to use to sign oracle votes +subaccount_key_file_path = "{{ .Oracle.SubaccountKeyFilePath }}" + ####################################################### ### State Sync Configuration Options ### ####################################################### diff --git a/node/node.go b/node/node.go index 102a6acbcc1..07e1081217e 100644 --- a/node/node.go +++ b/node/node.go @@ -25,6 +25,7 @@ import ( mempl "github.com/cometbft/cometbft/mempool" "github.com/cometbft/cometbft/p2p" "github.com/cometbft/cometbft/p2p/pex" + "github.com/cometbft/cometbft/privval" "github.com/cometbft/cometbft/proxy" rpccore "github.com/cometbft/cometbft/rpc/core" grpccore "github.com/cometbft/cometbft/rpc/grpc" @@ -377,7 +378,15 @@ func NewNodeWithContext(ctx context.Context, } // Make OracleReactor - oracleReactor := oracle.NewReactor(config.Oracle, pubKey, privValidator, proxyApp.Consensus()) + oracleSigningKey := privValidator + + if config.Oracle.EnableSubaccountSigning { + // use subaccount to sign oracle votes instead + subaccountKey := privval.LoadFilePVEmptyState(config.Oracle.SubaccountKeyFile(config.RootDir), "") + oracleSigningKey = subaccountKey + } + + oracleReactor := oracle.NewReactor(config.Oracle, pubKey, oracleSigningKey, proxyApp.Consensus()) oracleInfo := oracleReactor.OracleInfo // make block executor for consensus and blocksync reactors to execute blocks From 5e95d9e7763885189e713044d8c235f21283fe02 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 12 Jul 2024 16:01:28 +0800 Subject: [PATCH 08/15] update oracle votes signing and verification flow with new sig prefixes wip --- node/node.go | 8 ++- oracle/reactor.go | 49 +++++++++++++--- oracle/service/runner/runner.go | 27 ++++++++- privval/signer_client_test.go | 19 +++--- proto/tendermint/oracle/types.pb.go | 91 +++++++++++++++-------------- proto/tendermint/oracle/types.proto | 4 +- types/oracle.go | 2 +- 7 files changed, 131 insertions(+), 69 deletions(-) diff --git a/node/node.go b/node/node.go index 07e1081217e..c526df84217 100644 --- a/node/node.go +++ b/node/node.go @@ -379,14 +379,20 @@ func NewNodeWithContext(ctx context.Context, // Make OracleReactor oracleSigningKey := privValidator + oraclePubKey := pubKey if config.Oracle.EnableSubaccountSigning { // use subaccount to sign oracle votes instead subaccountKey := privval.LoadFilePVEmptyState(config.Oracle.SubaccountKeyFile(config.RootDir), "") oracleSigningKey = subaccountKey + + oraclePubKey, err = subaccountKey.GetPubKey() + if err != nil { + return nil, fmt.Errorf("can't get oracle subaccount pubkey: %w", err) + } } - oracleReactor := oracle.NewReactor(config.Oracle, pubKey, oracleSigningKey, proxyApp.Consensus()) + oracleReactor := oracle.NewReactor(config.Oracle, oraclePubKey, oracleSigningKey, proxyApp.Consensus()) oracleInfo := oracleReactor.OracleInfo // make block executor for consensus and blocksync reactors to execute blocks diff --git a/oracle/reactor.go b/oracle/reactor.go index f2fb90ac5b2..2a5c1b797bf 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -1,11 +1,16 @@ package oracle import ( + "bytes" "encoding/hex" "fmt" "math" "time" + "github.com/cometbft/cometbft/crypto/ed25519" + "github.com/cometbft/cometbft/crypto/secp256k1" + "github.com/cometbft/cometbft/crypto/sr25519" + "github.com/cometbft/cometbft/config" "github.com/cometbft/cometbft/proxy" @@ -124,21 +129,51 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { oracleR.Logger.Debug("Receive", "src", e.Src, "chId", e.ChannelID, "msg", e.Message) switch msg := e.Message.(type) { case *oracleproto.GossipedVotes: - // verify sig of incoming gossip vote, throw if verification fails - _, val := oracleR.ConsensusState.Validators.GetByAddress(msg.Validator) - if val == nil { - logrus.Debugf("validator: %v not found in validator set, skipping gossip", hex.EncodeToString(msg.Validator)) + // get account and sign type of oracle votes + accountType := []byte{msg.Signature[0]} + signType := []byte{msg.Signature[1]} + var pubKey crypto.PubKey + + // get pubkey based on sign type + if bytes.Equal(signType, oracletypes.Ed25519SignType) { + pubKey = ed25519.PubKey(msg.Pubkey) + } else if bytes.Equal(signType, oracletypes.Sr25519SignType) { + pubKey = sr25519.PubKey(msg.Pubkey) + } else if bytes.Equal(signType, oracletypes.Secp256k1SignType) { + pubKey = secp256k1.PubKey(msg.Pubkey) + } else { + logrus.Errorf("unsupported sign type for validator with pubkey: %v, skipping gossip", hex.EncodeToString(msg.Pubkey)) + return + } + + // check if signer is main account or subaccount + if bytes.Equal(accountType, oracletypes.MainAccountSigPrefix) { + // is main account, verify if oracle votes are from validator + isVal := oracleR.ConsensusState.Validators.HasAddress(pubKey.Address()) + if !isVal { + logrus.Debugf("validator: %v not found in validator set, skipping gossip", pubKey.Address().String()) + return + } + + } else if bytes.Equal(accountType, oracletypes.SubAccountSigPrefix) { + // add hook here to check if subaccount belongs to a validator + // hook should also return the actual address of the val, to be used later + + // is subaccount, verify if the corresponding main account is a validator + } else { + logrus.Errorf("unsupported account type for validator with pubkey: %v, skipping gossip", hex.EncodeToString(msg.Pubkey)) return } - pubKey := val.PubKey // skip if its own buffer if oracleR.OracleInfo.PubKey.Equals(pubKey) { return } - if success := pubKey.VerifySignature(types.OracleVoteSignBytes(oracleR.ConsensusState.GetState().ChainID, msg), msg.Signature); !success { - logrus.Errorf("failed signature verification for validator: %v, skipping gossip", val.Address) + // verify sig of incoming gossip vote, throw if verification fails + // signature starts from index 2 onwards due to the account and sign type prefix bytes + if success := pubKey.VerifySignature(types.OracleVoteSignBytes(oracleR.ConsensusState.GetState().ChainID, msg), msg.Signature[2:]); !success { + logrus.Errorf("failed signature verification for validator: %v, skipping gossip", pubKey.Address().String()) return } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 4f8578e37d1..664eb4eec79 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -65,14 +65,35 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipedVotes{ - Validator: oracleInfo.PubKey.Address(), + Pubkey: oracleInfo.PubKey.Bytes(), SignedTimestamp: time.Now().Unix(), Votes: unsignedVotes, } + // set sigPrefix based on account type and sign type + sigPrefix := []byte{} + if oracleInfo.Config.EnableSubaccountSigning { + sigPrefix = append(sigPrefix, types.SubAccountSigPrefix...) + } else { + sigPrefix = append(sigPrefix, types.MainAccountSigPrefix...) + } + + signType := oracleInfo.PubKey.Type() + switch signType { + case "ed25519": + sigPrefix = append(sigPrefix, types.Ed25519SignType...) + case "sr25519": + sigPrefix = append(sigPrefix, types.Sr25519SignType...) + case "secp256k1": + sigPrefix = append(sigPrefix, types.Secp256k1SignType...) + default: + log.Errorf("processSignVoteQueue: unsupported sign type: %v", signType) + return + } + // signing of vote should append the signature field of gossipVote - if err := oracleInfo.PrivValidator.SignOracleVote(consensusState.GetState().ChainID, newGossipVote, []byte{}); err != nil { - log.Errorf("processSignVoteQueue: error signing oracle votes") + if err := oracleInfo.PrivValidator.SignOracleVote(consensusState.GetState().ChainID, newGossipVote, sigPrefix); err != nil { + log.Errorf("processSignVoteQueue: error signing oracle votes: %v", err) return } diff --git a/privval/signer_client_test.go b/privval/signer_client_test.go index 33c6b3fa1b9..c05f8d7f1a1 100644 --- a/privval/signer_client_test.go +++ b/privval/signer_client_test.go @@ -202,9 +202,15 @@ func TestSignerVote(t *testing.T) { func TestSignerOracleVote(t *testing.T) { for _, tc := range getSignerTestCases(t) { - valAddr := cmtrand.Bytes(crypto.AddressSize) + // test get pubkey + pvPubKey, err := tc.mockPV.GetPubKey() + require.NoError(t, err) + + scPubKey, err := tc.signerClient.GetPubKey() + require.NoError(t, err) + want := &oracleproto.GossipedVotes{ - Validator: valAddr, + Pubkey: pvPubKey.Bytes(), SignedTimestamp: 2, Votes: []*oracleproto.Vote{ { @@ -217,7 +223,7 @@ func TestSignerOracleVote(t *testing.T) { } have := &oracleproto.GossipedVotes{ - Validator: valAddr, + Pubkey: scPubKey.Bytes(), SignedTimestamp: 2, Votes: []*oracleproto.Vote{ { @@ -250,13 +256,6 @@ func TestSignerOracleVote(t *testing.T) { assert.Equal(t, want.Signature, have.Signature) - // test get pubkey - pvPubKey, err := tc.mockPV.GetPubKey() - require.NoError(t, err) - - scPubKey, err := tc.signerClient.GetPubKey() - require.NoError(t, err) - // test verify sig with pv and signing client signatures require.True(t, pvPubKey.VerifySignature(types.OracleVoteSignBytes(tc.chainID, want), want.Signature[2:])) require.True(t, scPubKey.VerifySignature(types.OracleVoteSignBytes(tc.chainID, have), have.Signature[2:])) diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 63831c6e7ca..47e04dd69ac 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -91,7 +91,7 @@ func (m *Vote) GetData() string { } type GossipedVotes struct { - Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + Pubkey []byte `protobuf:"bytes,1,opt,name=pubkey,proto3" json:"pubkey,omitempty"` Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` Signature []byte `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty"` @@ -130,9 +130,9 @@ func (m *GossipedVotes) XXX_DiscardUnknown() { var xxx_messageInfo_GossipedVotes proto.InternalMessageInfo -func (m *GossipedVotes) GetValidator() []byte { +func (m *GossipedVotes) GetPubkey() []byte { if m != nil { - return m.Validator + return m.Pubkey } return nil } @@ -159,7 +159,7 @@ func (m *GossipedVotes) GetSignature() []byte { } type CanonicalGossipedVotes struct { - Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,omitempty"` + Pubkey []byte `protobuf:"bytes,1,opt,name=pubkey,proto3" json:"pubkey,omitempty"` Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` ChainId string `protobuf:"bytes,4,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` @@ -198,9 +198,9 @@ func (m *CanonicalGossipedVotes) XXX_DiscardUnknown() { var xxx_messageInfo_CanonicalGossipedVotes proto.InternalMessageInfo -func (m *CanonicalGossipedVotes) GetValidator() []byte { +func (m *CanonicalGossipedVotes) GetPubkey() []byte { if m != nil { - return m.Validator + return m.Pubkey } return nil } @@ -235,27 +235,28 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 317 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x92, 0x31, 0x4e, 0xc3, 0x30, - 0x14, 0x86, 0xeb, 0xb6, 0x40, 0x63, 0x8a, 0x00, 0x0f, 0x10, 0x44, 0xb1, 0xaa, 0x4e, 0x65, 0x20, - 0x91, 0x80, 0x13, 0xc0, 0x80, 0xba, 0x30, 0x44, 0x88, 0x81, 0xa5, 0x72, 0x63, 0xd3, 0x5a, 0x6a, - 0xec, 0x28, 0x7e, 0xad, 0xc4, 0x2d, 0xb8, 0x04, 0x13, 0x17, 0x61, 0xec, 0xc8, 0x88, 0x92, 0x8b, - 0x20, 0xdb, 0x12, 0x41, 0xe4, 0x02, 0x6c, 0x2f, 0xdf, 0xff, 0x5e, 0xfe, 0xdf, 0xf6, 0xc3, 0x67, - 0x20, 0x14, 0x17, 0x45, 0x26, 0x15, 0xc4, 0xba, 0x60, 0xe9, 0x52, 0xc4, 0xf0, 0x92, 0x0b, 0x13, - 0xe5, 0x85, 0x06, 0x4d, 0x0e, 0x6b, 0x39, 0xf2, 0xf2, 0xc8, 0xe0, 0xee, 0xa3, 0x06, 0x41, 0x06, - 0x38, 0x58, 0xb3, 0xa5, 0xe4, 0x0c, 0x74, 0x11, 0xa2, 0x21, 0x1a, 0x07, 0x49, 0x0d, 0xc8, 0x29, - 0x0e, 0x7c, 0xff, 0x54, 0xf2, 0xb0, 0xed, 0xd4, 0x9e, 0x07, 0x13, 0x6e, 0x47, 0x41, 0x66, 0xc2, - 0x00, 0xcb, 0xf2, 0xb0, 0x33, 0x44, 0xe3, 0x4e, 0x52, 0x03, 0x42, 0x70, 0x97, 0x33, 0x60, 0x61, - 0xd7, 0x4d, 0xb9, 0x7a, 0xf4, 0x86, 0xf0, 0xde, 0x9d, 0x36, 0x46, 0xe6, 0x82, 0x5b, 0x77, 0xd3, - 0xb4, 0xef, 0xff, 0xb6, 0xbf, 0xc0, 0x5b, 0x6b, 0xdb, 0x16, 0xb6, 0x87, 0x9d, 0xf1, 0xee, 0xe5, - 0x71, 0xd4, 0x38, 0x47, 0x64, 0x7f, 0x93, 0xf8, 0x2e, 0x72, 0x8e, 0x0f, 0x8c, 0x9c, 0x2b, 0xc1, - 0xa7, 0x7f, 0x73, 0xed, 0x7b, 0xfe, 0xf0, 0x93, 0x6e, 0x80, 0x03, 0x8b, 0x18, 0xac, 0x0a, 0xe1, - 0x22, 0xf6, 0x93, 0x1a, 0x8c, 0xde, 0x11, 0x3e, 0xba, 0x65, 0x4a, 0x2b, 0x99, 0xb2, 0xe5, 0xff, - 0x08, 0x7c, 0x82, 0x7b, 0xe9, 0x82, 0x49, 0x65, 0x1f, 0xc2, 0x5f, 0xe9, 0x8e, 0xfb, 0x9e, 0xf0, - 0x9b, 0xfb, 0x8f, 0x92, 0xa2, 0x4d, 0x49, 0xd1, 0x57, 0x49, 0xd1, 0x6b, 0x45, 0x5b, 0x9b, 0x8a, - 0xb6, 0x3e, 0x2b, 0xda, 0x7a, 0xba, 0x9e, 0x4b, 0x58, 0xac, 0x66, 0x51, 0xaa, 0xb3, 0x38, 0xd5, - 0x99, 0x80, 0xd9, 0x33, 0xd4, 0x85, 0xdb, 0x8d, 0xb8, 0xb1, 0x39, 0xb3, 0x6d, 0x27, 0x5c, 0x7d, - 0x07, 0x00, 0x00, 0xff, 0xff, 0x30, 0xed, 0x57, 0xbb, 0x55, 0x02, 0x00, 0x00, + // 326 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x92, 0xb1, 0x4e, 0xc3, 0x30, + 0x10, 0x86, 0xeb, 0xb6, 0x94, 0xe6, 0x28, 0x02, 0x3c, 0x94, 0x20, 0x4a, 0x54, 0x75, 0x2a, 0x03, + 0x89, 0x04, 0x3c, 0x01, 0x0c, 0xa8, 0x0b, 0x43, 0x84, 0x18, 0x58, 0x2a, 0x27, 0x36, 0xad, 0x45, + 0x13, 0x47, 0xf1, 0xb5, 0x52, 0xdf, 0x82, 0x37, 0x60, 0xe2, 0x5d, 0x18, 0x3b, 0x32, 0xa2, 0xf6, + 0x45, 0x90, 0x6d, 0x44, 0x24, 0xfa, 0x00, 0x6c, 0x77, 0xdf, 0x7f, 0xe7, 0xfb, 0x7d, 0x3a, 0x38, + 0x43, 0x91, 0x73, 0x51, 0x66, 0x32, 0xc7, 0x48, 0x95, 0x2c, 0x9d, 0x89, 0x08, 0x97, 0x85, 0xd0, + 0x61, 0x51, 0x2a, 0x54, 0xf4, 0xa8, 0x92, 0x43, 0x27, 0x0f, 0x34, 0x34, 0x1f, 0x15, 0x0a, 0xda, + 0x03, 0x6f, 0xc1, 0x66, 0x92, 0x33, 0x54, 0xa5, 0x4f, 0xfa, 0x64, 0xe8, 0xc5, 0x15, 0xa0, 0xa7, + 0xe0, 0xb9, 0xfa, 0xb1, 0xe4, 0x7e, 0xdd, 0xaa, 0x6d, 0x07, 0x46, 0xdc, 0xb4, 0xa2, 0xcc, 0x84, + 0x46, 0x96, 0x15, 0x7e, 0xa3, 0x4f, 0x86, 0x8d, 0xb8, 0x02, 0x94, 0x42, 0x93, 0x33, 0x64, 0x7e, + 0xd3, 0x76, 0xd9, 0x78, 0xf0, 0x46, 0x60, 0xff, 0x4e, 0x69, 0x2d, 0x0b, 0xc1, 0xcd, 0x74, 0x4d, + 0xbb, 0xd0, 0x2a, 0xe6, 0xc9, 0x8b, 0x58, 0xda, 0xd9, 0x9d, 0xf8, 0x27, 0xa3, 0x17, 0xb0, 0xb3, + 0x30, 0x05, 0x7e, 0xbd, 0xdf, 0x18, 0xee, 0x5d, 0x1e, 0x87, 0x5b, 0x3f, 0x08, 0xcd, 0x03, 0xb1, + 0xab, 0xa2, 0xe7, 0x70, 0xa8, 0xe5, 0x24, 0x17, 0x7c, 0xfc, 0xd7, 0xd1, 0x81, 0xe3, 0x0f, 0xbf, + 0xbe, 0x7a, 0xe0, 0x19, 0xc4, 0x70, 0x5e, 0x0a, 0x6b, 0xae, 0x13, 0x57, 0x60, 0xf0, 0x4e, 0xa0, + 0x7b, 0xcb, 0x72, 0x95, 0xcb, 0x94, 0xcd, 0xfe, 0xdb, 0xea, 0x09, 0xb4, 0xd3, 0x29, 0x93, 0xb9, + 0x59, 0xbe, 0x5b, 0xe3, 0xae, 0xcd, 0x47, 0xfc, 0xe6, 0xfe, 0x63, 0x1d, 0x90, 0xd5, 0x3a, 0x20, + 0x5f, 0xeb, 0x80, 0xbc, 0x6e, 0x82, 0xda, 0x6a, 0x13, 0xd4, 0x3e, 0x37, 0x41, 0xed, 0xe9, 0x7a, + 0x22, 0x71, 0x3a, 0x4f, 0xc2, 0x54, 0x65, 0x51, 0xaa, 0x32, 0x81, 0xc9, 0x33, 0x56, 0x81, 0xbd, + 0x87, 0x68, 0xeb, 0x5a, 0x92, 0x96, 0x15, 0xae, 0xbe, 0x03, 0x00, 0x00, 0xff, 0xff, 0x7a, 0x9a, + 0x27, 0x10, 0x49, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -353,10 +354,10 @@ func (m *GossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x12 } } - if len(m.Validator) > 0 { - i -= len(m.Validator) - copy(dAtA[i:], m.Validator) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) + if len(m.Pubkey) > 0 { + i -= len(m.Pubkey) + copy(dAtA[i:], m.Pubkey) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Pubkey))) i-- dAtA[i] = 0xa } @@ -409,10 +410,10 @@ func (m *CanonicalGossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) dAtA[i] = 0x12 } } - if len(m.Validator) > 0 { - i -= len(m.Validator) - copy(dAtA[i:], m.Validator) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Validator))) + if len(m.Pubkey) > 0 { + i -= len(m.Pubkey) + copy(dAtA[i:], m.Pubkey) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Pubkey))) i-- dAtA[i] = 0xa } @@ -460,7 +461,7 @@ func (m *GossipedVotes) Size() (n int) { } var l int _ = l - l = len(m.Validator) + l = len(m.Pubkey) if l > 0 { n += 1 + l + sovTypes(uint64(l)) } @@ -486,7 +487,7 @@ func (m *CanonicalGossipedVotes) Size() (n int) { } var l int _ = l - l = len(m.Validator) + l = len(m.Pubkey) if l > 0 { n += 1 + l + sovTypes(uint64(l)) } @@ -708,7 +709,7 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Pubkey", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -735,9 +736,9 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) - if m.Validator == nil { - m.Validator = []byte{} + m.Pubkey = append(m.Pubkey[:0], dAtA[iNdEx:postIndex]...) + if m.Pubkey == nil { + m.Pubkey = []byte{} } iNdEx = postIndex case 2: @@ -879,7 +880,7 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Pubkey", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -906,9 +907,9 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Validator = append(m.Validator[:0], dAtA[iNdEx:postIndex]...) - if m.Validator == nil { - m.Validator = []byte{} + m.Pubkey = append(m.Pubkey[:0], dAtA[iNdEx:postIndex]...) + if m.Pubkey == nil { + m.Pubkey = []byte{} } iNdEx = postIndex case 2: diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index e8f4fd009e0..a840854f029 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -11,14 +11,14 @@ message Vote { } message GossipedVotes { - bytes validator = 1; + bytes pubkey = 1; repeated Vote votes = 2; int64 signed_timestamp = 3; bytes signature = 4; } message CanonicalGossipedVotes { - bytes validator = 1; + bytes pubkey = 1; repeated Vote votes = 2; int64 signed_timestamp = 3; string chain_id = 4; diff --git a/types/oracle.go b/types/oracle.go index 7185b42e97d..bb6e9e429e7 100644 --- a/types/oracle.go +++ b/types/oracle.go @@ -17,7 +17,7 @@ func OracleVoteSignBytes(chainID string, vote *oracleproto.GossipedVotes) []byte func CanonicalizeOracleVote(chainID string, vote *oracleproto.GossipedVotes) oracleproto.CanonicalGossipedVotes { return oracleproto.CanonicalGossipedVotes{ - Validator: vote.Validator, + Pubkey: vote.Pubkey, Votes: vote.Votes, SignedTimestamp: vote.SignedTimestamp, ChainId: chainID, From 3f994d3f0116ccd0c788a0296240661f3eb2a0aa Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 12 Jul 2024 16:17:52 +0800 Subject: [PATCH 09/15] add hook to check if subaccount belongs to val --- abci/client/grpc_client.go | 4 + abci/client/mocks/client.go | 26 + abci/client/socket_client.go | 11 + abci/types/application.go | 5 + abci/types/messages.go | 6 + abci/types/mocks/application.go | 26 + abci/types/types.pb.go | 1291 +++++++++++++++++++++-------- proto/tendermint/abci/types.proto | 12 + proxy/app_conn.go | 6 + proxy/mocks/app_conn_consensus.go | 26 + 10 files changed, 1064 insertions(+), 349 deletions(-) diff --git a/abci/client/grpc_client.go b/abci/client/grpc_client.go index b626cb298a4..fb7bee64d67 100644 --- a/abci/client/grpc_client.go +++ b/abci/client/grpc_client.go @@ -261,3 +261,7 @@ func (cli *grpcClient) ValidateOracleVotes(ctx context.Context, req *types.Reque func (cli *grpcClient) DoesOracleResultExist(ctx context.Context, req *types.RequestDoesOracleResultExist) (*types.ResponseDoesOracleResultExist, error) { return cli.client.DoesOracleResultExist(ctx, types.ToRequestDoesOracleResultExist(req).GetDoesOracleResultExist(), grpc.WaitForReady(true)) } + +func (cli *grpcClient) DoesSubaccountBelongToVal(ctx context.Context, req *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error) { + return cli.client.DoesSubaccountBelongToVal(ctx, types.ToRequestDoesSubaccountBelongToVal(req).GetDoesSubaccountBelongToVal(), grpc.WaitForReady(true)) +} diff --git a/abci/client/mocks/client.go b/abci/client/mocks/client.go index 8bfe3e0f1c0..16751938e55 100644 --- a/abci/client/mocks/client.go +++ b/abci/client/mocks/client.go @@ -175,6 +175,32 @@ func (_m *Client) DoesOracleResultExist(_a0 context.Context, _a1 *types.RequestD return r0, r1 } +// DoesSubaccountBelongToVal provides a mock function with given fields: _a0, _a1 +func (_m *Client) DoesSubaccountBelongToVal(_a0 context.Context, _a1 *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseDoesSubaccountBelongToVal + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesSubaccountBelongToVal) *types.ResponseDoesSubaccountBelongToVal); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseDoesSubaccountBelongToVal) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestDoesSubaccountBelongToVal) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // Echo provides a mock function with given fields: _a0, _a1 func (_m *Client) Echo(_a0 context.Context, _a1 string) (*types.ResponseEcho, error) { ret := _m.Called(_a0, _a1) diff --git a/abci/client/socket_client.go b/abci/client/socket_client.go index fd9fa62c652..7e9a1b19b0f 100644 --- a/abci/client/socket_client.go +++ b/abci/client/socket_client.go @@ -456,6 +456,17 @@ func (cli *socketClient) DoesOracleResultExist(ctx context.Context, req *types.R return reqRes.Response.GetDoesOracleResultExist(), cli.Error() } +func (cli *socketClient) DoesSubaccountBelongToVal(ctx context.Context, req *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error) { + reqRes, err := cli.queueRequest(ctx, types.ToRequestDoesSubaccountBelongToVal(req)) + if err != nil { + return nil, err + } + if err := cli.Flush(ctx); err != nil { + return nil, err + } + return reqRes.Response.GetDoesSubaccountBelongToVal(), cli.Error() +} + func (cli *socketClient) queueRequest(ctx context.Context, req *types.Request) (*ReqRes, error) { reqres := NewReqRes(req) diff --git a/abci/types/application.go b/abci/types/application.go index 8920a413842..29c934406fa 100644 --- a/abci/types/application.go +++ b/abci/types/application.go @@ -40,6 +40,7 @@ type Application interface { FetchOracleVotes(context.Context, *RequestFetchOracleVotes) (*ResponseFetchOracleVotes, error) ValidateOracleVotes(context.Context, *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) DoesOracleResultExist(context.Context, *RequestDoesOracleResultExist) (*ResponseDoesOracleResultExist, error) + DoesSubaccountBelongToVal(context.Context, *RequestDoesSubaccountBelongToVal) (*ResponseDoesSubaccountBelongToVal, error) } //------------------------------------------------------- @@ -141,3 +142,7 @@ func (BaseApplication) ValidateOracleVotes(_ context.Context, req *RequestValida func (BaseApplication) DoesOracleResultExist(_ context.Context, req *RequestDoesOracleResultExist) (*ResponseDoesOracleResultExist, error) { return &ResponseDoesOracleResultExist{}, nil } + +func (BaseApplication) DoesSubaccountBelongToVal(_ context.Context, req *RequestDoesSubaccountBelongToVal) (*ResponseDoesSubaccountBelongToVal, error) { + return &ResponseDoesSubaccountBelongToVal{}, nil +} diff --git a/abci/types/messages.go b/abci/types/messages.go index 00937962524..b60f6b60c5c 100644 --- a/abci/types/messages.go +++ b/abci/types/messages.go @@ -148,6 +148,12 @@ func ToRequestDoesOracleResultExist(req *RequestDoesOracleResultExist) *Request } } +func ToRequestDoesSubaccountBelongToVal(req *RequestDoesSubaccountBelongToVal) *Request { + return &Request{ + Value: &Request_DoesSubaccountBelongToVal{req}, + } +} + //---------------------------------------- func ToResponseException(errStr string) *Response { diff --git a/abci/types/mocks/application.go b/abci/types/mocks/application.go index 1f3baca9fc0..45297bd1d8b 100644 --- a/abci/types/mocks/application.go +++ b/abci/types/mocks/application.go @@ -144,6 +144,32 @@ func (_m *Application) DoesOracleResultExist(_a0 context.Context, _a1 *types.Req return r0, r1 } +// DoesSubaccountBelongToVal provides a mock function with given fields: _a0, _a1 +func (_m *Application) DoesSubaccountBelongToVal(_a0 context.Context, _a1 *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseDoesSubaccountBelongToVal + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesSubaccountBelongToVal) *types.ResponseDoesSubaccountBelongToVal); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseDoesSubaccountBelongToVal) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestDoesSubaccountBelongToVal) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // ExtendVote provides a mock function with given fields: _a0, _a1 func (_m *Application) ExtendVote(_a0 context.Context, _a1 *types.RequestExtendVote) (*types.ResponseExtendVote, error) { ret := _m.Called(_a0, _a1) diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index d1512f70482..20bf069f43e 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -122,7 +122,7 @@ func (x ResponseOfferSnapshot_Result) String() string { } func (ResponseOfferSnapshot_Result) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{31, 0} + return fileDescriptor_252557cfdd89a31a, []int{32, 0} } type ResponseApplySnapshotChunk_Result int32 @@ -159,7 +159,7 @@ func (x ResponseApplySnapshotChunk_Result) String() string { } func (ResponseApplySnapshotChunk_Result) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{33, 0} + return fileDescriptor_252557cfdd89a31a, []int{34, 0} } type ResponseProcessProposal_ProposalStatus int32 @@ -187,7 +187,7 @@ func (x ResponseProcessProposal_ProposalStatus) String() string { } func (ResponseProcessProposal_ProposalStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{35, 0} + return fileDescriptor_252557cfdd89a31a, []int{36, 0} } type ResponseVerifyVoteExtension_VerifyStatus int32 @@ -219,7 +219,7 @@ func (x ResponseVerifyVoteExtension_VerifyStatus) String() string { } func (ResponseVerifyVoteExtension_VerifyStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{37, 0} + return fileDescriptor_252557cfdd89a31a, []int{38, 0} } type ResponseValidateOracleVotes_Status int32 @@ -244,7 +244,7 @@ func (x ResponseValidateOracleVotes_Status) String() string { } func (ResponseValidateOracleVotes_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{41, 0} + return fileDescriptor_252557cfdd89a31a, []int{42, 0} } type Request struct { @@ -269,6 +269,7 @@ type Request struct { // *Request_FetchOracleVotes // *Request_ValidateOracleVotes // *Request_DoesOracleResultExist + // *Request_DoesSubaccountBelongToVal Value isRequest_Value `protobuf_oneof:"value"` } @@ -371,27 +372,31 @@ type Request_ValidateOracleVotes struct { type Request_DoesOracleResultExist struct { DoesOracleResultExist *RequestDoesOracleResultExist `protobuf:"bytes,24,opt,name=does_oracle_result_exist,json=doesOracleResultExist,proto3,oneof" json:"does_oracle_result_exist,omitempty"` } - -func (*Request_Echo) isRequest_Value() {} -func (*Request_Flush) isRequest_Value() {} -func (*Request_Info) isRequest_Value() {} -func (*Request_InitChain) isRequest_Value() {} -func (*Request_Query) isRequest_Value() {} -func (*Request_CheckTx) isRequest_Value() {} -func (*Request_Commit) isRequest_Value() {} -func (*Request_ListSnapshots) isRequest_Value() {} -func (*Request_OfferSnapshot) isRequest_Value() {} -func (*Request_LoadSnapshotChunk) isRequest_Value() {} -func (*Request_ApplySnapshotChunk) isRequest_Value() {} -func (*Request_PrepareProposal) isRequest_Value() {} -func (*Request_ProcessProposal) isRequest_Value() {} -func (*Request_ExtendVote) isRequest_Value() {} -func (*Request_VerifyVoteExtension) isRequest_Value() {} -func (*Request_FinalizeBlock) isRequest_Value() {} -func (*Request_CreateOracleResultTx) isRequest_Value() {} -func (*Request_FetchOracleVotes) isRequest_Value() {} -func (*Request_ValidateOracleVotes) isRequest_Value() {} -func (*Request_DoesOracleResultExist) isRequest_Value() {} +type Request_DoesSubaccountBelongToVal struct { + DoesSubaccountBelongToVal *RequestDoesSubaccountBelongToVal `protobuf:"bytes,25,opt,name=does_subaccount_belong_to_val,json=doesSubaccountBelongToVal,proto3,oneof" json:"does_subaccount_belong_to_val,omitempty"` +} + +func (*Request_Echo) isRequest_Value() {} +func (*Request_Flush) isRequest_Value() {} +func (*Request_Info) isRequest_Value() {} +func (*Request_InitChain) isRequest_Value() {} +func (*Request_Query) isRequest_Value() {} +func (*Request_CheckTx) isRequest_Value() {} +func (*Request_Commit) isRequest_Value() {} +func (*Request_ListSnapshots) isRequest_Value() {} +func (*Request_OfferSnapshot) isRequest_Value() {} +func (*Request_LoadSnapshotChunk) isRequest_Value() {} +func (*Request_ApplySnapshotChunk) isRequest_Value() {} +func (*Request_PrepareProposal) isRequest_Value() {} +func (*Request_ProcessProposal) isRequest_Value() {} +func (*Request_ExtendVote) isRequest_Value() {} +func (*Request_VerifyVoteExtension) isRequest_Value() {} +func (*Request_FinalizeBlock) isRequest_Value() {} +func (*Request_CreateOracleResultTx) isRequest_Value() {} +func (*Request_FetchOracleVotes) isRequest_Value() {} +func (*Request_ValidateOracleVotes) isRequest_Value() {} +func (*Request_DoesOracleResultExist) isRequest_Value() {} +func (*Request_DoesSubaccountBelongToVal) isRequest_Value() {} func (m *Request) GetValue() isRequest_Value { if m != nil { @@ -540,6 +545,13 @@ func (m *Request) GetDoesOracleResultExist() *RequestDoesOracleResultExist { return nil } +func (m *Request) GetDoesSubaccountBelongToVal() *RequestDoesSubaccountBelongToVal { + if x, ok := m.GetValue().(*Request_DoesSubaccountBelongToVal); ok { + return x.DoesSubaccountBelongToVal + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*Request) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -563,6 +575,7 @@ func (*Request) XXX_OneofWrappers() []interface{} { (*Request_FetchOracleVotes)(nil), (*Request_ValidateOracleVotes)(nil), (*Request_DoesOracleResultExist)(nil), + (*Request_DoesSubaccountBelongToVal)(nil), } } @@ -1826,6 +1839,50 @@ func (m *RequestDoesOracleResultExist) GetKey() string { return "" } +type RequestDoesSubaccountBelongToVal struct { + Address []byte `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` +} + +func (m *RequestDoesSubaccountBelongToVal) Reset() { *m = RequestDoesSubaccountBelongToVal{} } +func (m *RequestDoesSubaccountBelongToVal) String() string { return proto.CompactTextString(m) } +func (*RequestDoesSubaccountBelongToVal) ProtoMessage() {} +func (*RequestDoesSubaccountBelongToVal) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{21} +} +func (m *RequestDoesSubaccountBelongToVal) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RequestDoesSubaccountBelongToVal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RequestDoesSubaccountBelongToVal.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RequestDoesSubaccountBelongToVal) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestDoesSubaccountBelongToVal.Merge(m, src) +} +func (m *RequestDoesSubaccountBelongToVal) XXX_Size() int { + return m.Size() +} +func (m *RequestDoesSubaccountBelongToVal) XXX_DiscardUnknown() { + xxx_messageInfo_RequestDoesSubaccountBelongToVal.DiscardUnknown(m) +} + +var xxx_messageInfo_RequestDoesSubaccountBelongToVal proto.InternalMessageInfo + +func (m *RequestDoesSubaccountBelongToVal) GetAddress() []byte { + if m != nil { + return m.Address + } + return nil +} + type Response struct { // Types that are valid to be assigned to Value: // @@ -1850,6 +1907,7 @@ type Response struct { // *Response_FetchOracleVotes // *Response_ValidateOracleVotes // *Response_DoesOracleResultExist + // *Response_DoesSubaccountBelongToVal Value isResponse_Value `protobuf_oneof:"value"` } @@ -1857,7 +1915,7 @@ func (m *Response) Reset() { *m = Response{} } func (m *Response) String() string { return proto.CompactTextString(m) } func (*Response) ProtoMessage() {} func (*Response) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{21} + return fileDescriptor_252557cfdd89a31a, []int{22} } func (m *Response) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1955,28 +2013,32 @@ type Response_ValidateOracleVotes struct { type Response_DoesOracleResultExist struct { DoesOracleResultExist *ResponseDoesOracleResultExist `protobuf:"bytes,25,opt,name=does_oracle_result_exist,json=doesOracleResultExist,proto3,oneof" json:"does_oracle_result_exist,omitempty"` } - -func (*Response_Exception) isResponse_Value() {} -func (*Response_Echo) isResponse_Value() {} -func (*Response_Flush) isResponse_Value() {} -func (*Response_Info) isResponse_Value() {} -func (*Response_InitChain) isResponse_Value() {} -func (*Response_Query) isResponse_Value() {} -func (*Response_CheckTx) isResponse_Value() {} -func (*Response_Commit) isResponse_Value() {} -func (*Response_ListSnapshots) isResponse_Value() {} -func (*Response_OfferSnapshot) isResponse_Value() {} -func (*Response_LoadSnapshotChunk) isResponse_Value() {} -func (*Response_ApplySnapshotChunk) isResponse_Value() {} -func (*Response_PrepareProposal) isResponse_Value() {} -func (*Response_ProcessProposal) isResponse_Value() {} -func (*Response_ExtendVote) isResponse_Value() {} -func (*Response_VerifyVoteExtension) isResponse_Value() {} -func (*Response_FinalizeBlock) isResponse_Value() {} -func (*Response_CreateOracleResultTx) isResponse_Value() {} -func (*Response_FetchOracleVotes) isResponse_Value() {} -func (*Response_ValidateOracleVotes) isResponse_Value() {} -func (*Response_DoesOracleResultExist) isResponse_Value() {} +type Response_DoesSubaccountBelongToVal struct { + DoesSubaccountBelongToVal *ResponseDoesSubaccountBelongToVal `protobuf:"bytes,26,opt,name=does_subaccount_belong_to_val,json=doesSubaccountBelongToVal,proto3,oneof" json:"does_subaccount_belong_to_val,omitempty"` +} + +func (*Response_Exception) isResponse_Value() {} +func (*Response_Echo) isResponse_Value() {} +func (*Response_Flush) isResponse_Value() {} +func (*Response_Info) isResponse_Value() {} +func (*Response_InitChain) isResponse_Value() {} +func (*Response_Query) isResponse_Value() {} +func (*Response_CheckTx) isResponse_Value() {} +func (*Response_Commit) isResponse_Value() {} +func (*Response_ListSnapshots) isResponse_Value() {} +func (*Response_OfferSnapshot) isResponse_Value() {} +func (*Response_LoadSnapshotChunk) isResponse_Value() {} +func (*Response_ApplySnapshotChunk) isResponse_Value() {} +func (*Response_PrepareProposal) isResponse_Value() {} +func (*Response_ProcessProposal) isResponse_Value() {} +func (*Response_ExtendVote) isResponse_Value() {} +func (*Response_VerifyVoteExtension) isResponse_Value() {} +func (*Response_FinalizeBlock) isResponse_Value() {} +func (*Response_CreateOracleResultTx) isResponse_Value() {} +func (*Response_FetchOracleVotes) isResponse_Value() {} +func (*Response_ValidateOracleVotes) isResponse_Value() {} +func (*Response_DoesOracleResultExist) isResponse_Value() {} +func (*Response_DoesSubaccountBelongToVal) isResponse_Value() {} func (m *Response) GetValue() isResponse_Value { if m != nil { @@ -2132,6 +2194,13 @@ func (m *Response) GetDoesOracleResultExist() *ResponseDoesOracleResultExist { return nil } +func (m *Response) GetDoesSubaccountBelongToVal() *ResponseDoesSubaccountBelongToVal { + if x, ok := m.GetValue().(*Response_DoesSubaccountBelongToVal); ok { + return x.DoesSubaccountBelongToVal + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*Response) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -2156,6 +2225,7 @@ func (*Response) XXX_OneofWrappers() []interface{} { (*Response_FetchOracleVotes)(nil), (*Response_ValidateOracleVotes)(nil), (*Response_DoesOracleResultExist)(nil), + (*Response_DoesSubaccountBelongToVal)(nil), } } @@ -2168,7 +2238,7 @@ func (m *ResponseException) Reset() { *m = ResponseException{} } func (m *ResponseException) String() string { return proto.CompactTextString(m) } func (*ResponseException) ProtoMessage() {} func (*ResponseException) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{22} + return fileDescriptor_252557cfdd89a31a, []int{23} } func (m *ResponseException) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2212,7 +2282,7 @@ func (m *ResponseEcho) Reset() { *m = ResponseEcho{} } func (m *ResponseEcho) String() string { return proto.CompactTextString(m) } func (*ResponseEcho) ProtoMessage() {} func (*ResponseEcho) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{23} + return fileDescriptor_252557cfdd89a31a, []int{24} } func (m *ResponseEcho) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2255,7 +2325,7 @@ func (m *ResponseFlush) Reset() { *m = ResponseFlush{} } func (m *ResponseFlush) String() string { return proto.CompactTextString(m) } func (*ResponseFlush) ProtoMessage() {} func (*ResponseFlush) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{24} + return fileDescriptor_252557cfdd89a31a, []int{25} } func (m *ResponseFlush) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2296,7 +2366,7 @@ func (m *ResponseInfo) Reset() { *m = ResponseInfo{} } func (m *ResponseInfo) String() string { return proto.CompactTextString(m) } func (*ResponseInfo) ProtoMessage() {} func (*ResponseInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{25} + return fileDescriptor_252557cfdd89a31a, []int{26} } func (m *ResponseInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2370,7 +2440,7 @@ func (m *ResponseInitChain) Reset() { *m = ResponseInitChain{} } func (m *ResponseInitChain) String() string { return proto.CompactTextString(m) } func (*ResponseInitChain) ProtoMessage() {} func (*ResponseInitChain) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{26} + return fileDescriptor_252557cfdd89a31a, []int{27} } func (m *ResponseInitChain) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2437,7 +2507,7 @@ func (m *ResponseQuery) Reset() { *m = ResponseQuery{} } func (m *ResponseQuery) String() string { return proto.CompactTextString(m) } func (*ResponseQuery) ProtoMessage() {} func (*ResponseQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{27} + return fileDescriptor_252557cfdd89a31a, []int{28} } func (m *ResponseQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2544,7 +2614,7 @@ func (m *ResponseCheckTx) Reset() { *m = ResponseCheckTx{} } func (m *ResponseCheckTx) String() string { return proto.CompactTextString(m) } func (*ResponseCheckTx) ProtoMessage() {} func (*ResponseCheckTx) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{28} + return fileDescriptor_252557cfdd89a31a, []int{29} } func (m *ResponseCheckTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2637,7 +2707,7 @@ func (m *ResponseCommit) Reset() { *m = ResponseCommit{} } func (m *ResponseCommit) String() string { return proto.CompactTextString(m) } func (*ResponseCommit) ProtoMessage() {} func (*ResponseCommit) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{29} + return fileDescriptor_252557cfdd89a31a, []int{30} } func (m *ResponseCommit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2681,7 +2751,7 @@ func (m *ResponseListSnapshots) Reset() { *m = ResponseListSnapshots{} } func (m *ResponseListSnapshots) String() string { return proto.CompactTextString(m) } func (*ResponseListSnapshots) ProtoMessage() {} func (*ResponseListSnapshots) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{30} + return fileDescriptor_252557cfdd89a31a, []int{31} } func (m *ResponseListSnapshots) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2725,7 +2795,7 @@ func (m *ResponseOfferSnapshot) Reset() { *m = ResponseOfferSnapshot{} } func (m *ResponseOfferSnapshot) String() string { return proto.CompactTextString(m) } func (*ResponseOfferSnapshot) ProtoMessage() {} func (*ResponseOfferSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{31} + return fileDescriptor_252557cfdd89a31a, []int{32} } func (m *ResponseOfferSnapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2769,7 +2839,7 @@ func (m *ResponseLoadSnapshotChunk) Reset() { *m = ResponseLoadSnapshotC func (m *ResponseLoadSnapshotChunk) String() string { return proto.CompactTextString(m) } func (*ResponseLoadSnapshotChunk) ProtoMessage() {} func (*ResponseLoadSnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{32} + return fileDescriptor_252557cfdd89a31a, []int{33} } func (m *ResponseLoadSnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2815,7 +2885,7 @@ func (m *ResponseApplySnapshotChunk) Reset() { *m = ResponseApplySnapsho func (m *ResponseApplySnapshotChunk) String() string { return proto.CompactTextString(m) } func (*ResponseApplySnapshotChunk) ProtoMessage() {} func (*ResponseApplySnapshotChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{33} + return fileDescriptor_252557cfdd89a31a, []int{34} } func (m *ResponseApplySnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2873,7 +2943,7 @@ func (m *ResponsePrepareProposal) Reset() { *m = ResponsePrepareProposal func (m *ResponsePrepareProposal) String() string { return proto.CompactTextString(m) } func (*ResponsePrepareProposal) ProtoMessage() {} func (*ResponsePrepareProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{34} + return fileDescriptor_252557cfdd89a31a, []int{35} } func (m *ResponsePrepareProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2917,7 +2987,7 @@ func (m *ResponseProcessProposal) Reset() { *m = ResponseProcessProposal func (m *ResponseProcessProposal) String() string { return proto.CompactTextString(m) } func (*ResponseProcessProposal) ProtoMessage() {} func (*ResponseProcessProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{35} + return fileDescriptor_252557cfdd89a31a, []int{36} } func (m *ResponseProcessProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2961,7 +3031,7 @@ func (m *ResponseExtendVote) Reset() { *m = ResponseExtendVote{} } func (m *ResponseExtendVote) String() string { return proto.CompactTextString(m) } func (*ResponseExtendVote) ProtoMessage() {} func (*ResponseExtendVote) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{36} + return fileDescriptor_252557cfdd89a31a, []int{37} } func (m *ResponseExtendVote) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3005,7 +3075,7 @@ func (m *ResponseVerifyVoteExtension) Reset() { *m = ResponseVerifyVoteE func (m *ResponseVerifyVoteExtension) String() string { return proto.CompactTextString(m) } func (*ResponseVerifyVoteExtension) ProtoMessage() {} func (*ResponseVerifyVoteExtension) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{37} + return fileDescriptor_252557cfdd89a31a, []int{38} } func (m *ResponseVerifyVoteExtension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3060,7 +3130,7 @@ func (m *ResponseFinalizeBlock) Reset() { *m = ResponseFinalizeBlock{} } func (m *ResponseFinalizeBlock) String() string { return proto.CompactTextString(m) } func (*ResponseFinalizeBlock) ProtoMessage() {} func (*ResponseFinalizeBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{38} + return fileDescriptor_252557cfdd89a31a, []int{39} } func (m *ResponseFinalizeBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3132,7 +3202,7 @@ func (m *ResponseCreateOracleResultTx) Reset() { *m = ResponseCreateOrac func (m *ResponseCreateOracleResultTx) String() string { return proto.CompactTextString(m) } func (*ResponseCreateOracleResultTx) ProtoMessage() {} func (*ResponseCreateOracleResultTx) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{39} + return fileDescriptor_252557cfdd89a31a, []int{40} } func (m *ResponseCreateOracleResultTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3176,7 +3246,7 @@ func (m *ResponseFetchOracleVotes) Reset() { *m = ResponseFetchOracleVot func (m *ResponseFetchOracleVotes) String() string { return proto.CompactTextString(m) } func (*ResponseFetchOracleVotes) ProtoMessage() {} func (*ResponseFetchOracleVotes) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{40} + return fileDescriptor_252557cfdd89a31a, []int{41} } func (m *ResponseFetchOracleVotes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3220,7 +3290,7 @@ func (m *ResponseValidateOracleVotes) Reset() { *m = ResponseValidateOra func (m *ResponseValidateOracleVotes) String() string { return proto.CompactTextString(m) } func (*ResponseValidateOracleVotes) ProtoMessage() {} func (*ResponseValidateOracleVotes) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{41} + return fileDescriptor_252557cfdd89a31a, []int{42} } func (m *ResponseValidateOracleVotes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3264,7 +3334,7 @@ func (m *ResponseDoesOracleResultExist) Reset() { *m = ResponseDoesOracl func (m *ResponseDoesOracleResultExist) String() string { return proto.CompactTextString(m) } func (*ResponseDoesOracleResultExist) ProtoMessage() {} func (*ResponseDoesOracleResultExist) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{42} + return fileDescriptor_252557cfdd89a31a, []int{43} } func (m *ResponseDoesOracleResultExist) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3300,6 +3370,58 @@ func (m *ResponseDoesOracleResultExist) GetDoesExist() bool { return false } +type ResponseDoesSubaccountBelongToVal struct { + BelongsToVal bool `protobuf:"varint,1,opt,name=belongs_to_val,json=belongsToVal,proto3" json:"belongs_to_val,omitempty"` + ValAddress string `protobuf:"bytes,2,opt,name=val_address,json=valAddress,proto3" json:"val_address,omitempty"` +} + +func (m *ResponseDoesSubaccountBelongToVal) Reset() { *m = ResponseDoesSubaccountBelongToVal{} } +func (m *ResponseDoesSubaccountBelongToVal) String() string { return proto.CompactTextString(m) } +func (*ResponseDoesSubaccountBelongToVal) ProtoMessage() {} +func (*ResponseDoesSubaccountBelongToVal) Descriptor() ([]byte, []int) { + return fileDescriptor_252557cfdd89a31a, []int{44} +} +func (m *ResponseDoesSubaccountBelongToVal) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResponseDoesSubaccountBelongToVal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResponseDoesSubaccountBelongToVal.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ResponseDoesSubaccountBelongToVal) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseDoesSubaccountBelongToVal.Merge(m, src) +} +func (m *ResponseDoesSubaccountBelongToVal) XXX_Size() int { + return m.Size() +} +func (m *ResponseDoesSubaccountBelongToVal) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseDoesSubaccountBelongToVal.DiscardUnknown(m) +} + +var xxx_messageInfo_ResponseDoesSubaccountBelongToVal proto.InternalMessageInfo + +func (m *ResponseDoesSubaccountBelongToVal) GetBelongsToVal() bool { + if m != nil { + return m.BelongsToVal + } + return false +} + +func (m *ResponseDoesSubaccountBelongToVal) GetValAddress() string { + if m != nil { + return m.ValAddress + } + return "" +} + type CommitInfo struct { Round int32 `protobuf:"varint,1,opt,name=round,proto3" json:"round,omitempty"` Votes []VoteInfo `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes"` @@ -3309,7 +3431,7 @@ func (m *CommitInfo) Reset() { *m = CommitInfo{} } func (m *CommitInfo) String() string { return proto.CompactTextString(m) } func (*CommitInfo) ProtoMessage() {} func (*CommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{43} + return fileDescriptor_252557cfdd89a31a, []int{45} } func (m *CommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3367,7 +3489,7 @@ func (m *ExtendedCommitInfo) Reset() { *m = ExtendedCommitInfo{} } func (m *ExtendedCommitInfo) String() string { return proto.CompactTextString(m) } func (*ExtendedCommitInfo) ProtoMessage() {} func (*ExtendedCommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{44} + return fileDescriptor_252557cfdd89a31a, []int{46} } func (m *ExtendedCommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3422,7 +3544,7 @@ func (m *Event) Reset() { *m = Event{} } func (m *Event) String() string { return proto.CompactTextString(m) } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{45} + return fileDescriptor_252557cfdd89a31a, []int{47} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3476,7 +3598,7 @@ func (m *EventAttribute) Reset() { *m = EventAttribute{} } func (m *EventAttribute) String() string { return proto.CompactTextString(m) } func (*EventAttribute) ProtoMessage() {} func (*EventAttribute) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{46} + return fileDescriptor_252557cfdd89a31a, []int{48} } func (m *EventAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3544,7 +3666,7 @@ func (m *ExecTxResult) Reset() { *m = ExecTxResult{} } func (m *ExecTxResult) String() string { return proto.CompactTextString(m) } func (*ExecTxResult) ProtoMessage() {} func (*ExecTxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{47} + return fileDescriptor_252557cfdd89a31a, []int{49} } func (m *ExecTxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3643,7 +3765,7 @@ func (m *TxResult) Reset() { *m = TxResult{} } func (m *TxResult) String() string { return proto.CompactTextString(m) } func (*TxResult) ProtoMessage() {} func (*TxResult) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{48} + return fileDescriptor_252557cfdd89a31a, []int{50} } func (m *TxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3710,7 +3832,7 @@ func (m *Validator) Reset() { *m = Validator{} } func (m *Validator) String() string { return proto.CompactTextString(m) } func (*Validator) ProtoMessage() {} func (*Validator) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{49} + return fileDescriptor_252557cfdd89a31a, []int{51} } func (m *Validator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3762,7 +3884,7 @@ func (m *ValidatorUpdate) Reset() { *m = ValidatorUpdate{} } func (m *ValidatorUpdate) String() string { return proto.CompactTextString(m) } func (*ValidatorUpdate) ProtoMessage() {} func (*ValidatorUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{50} + return fileDescriptor_252557cfdd89a31a, []int{52} } func (m *ValidatorUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3814,7 +3936,7 @@ func (m *VoteInfo) Reset() { *m = VoteInfo{} } func (m *VoteInfo) String() string { return proto.CompactTextString(m) } func (*VoteInfo) ProtoMessage() {} func (*VoteInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{51} + return fileDescriptor_252557cfdd89a31a, []int{53} } func (m *VoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3872,7 +3994,7 @@ func (m *ExtendedVoteInfo) Reset() { *m = ExtendedVoteInfo{} } func (m *ExtendedVoteInfo) String() string { return proto.CompactTextString(m) } func (*ExtendedVoteInfo) ProtoMessage() {} func (*ExtendedVoteInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{52} + return fileDescriptor_252557cfdd89a31a, []int{54} } func (m *ExtendedVoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3947,7 +4069,7 @@ func (m *Misbehavior) Reset() { *m = Misbehavior{} } func (m *Misbehavior) String() string { return proto.CompactTextString(m) } func (*Misbehavior) ProtoMessage() {} func (*Misbehavior) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{53} + return fileDescriptor_252557cfdd89a31a, []int{55} } func (m *Misbehavior) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4023,7 +4145,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_252557cfdd89a31a, []int{54} + return fileDescriptor_252557cfdd89a31a, []int{56} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4116,6 +4238,7 @@ func init() { proto.RegisterType((*RequestFetchOracleVotes)(nil), "tendermint.abci.RequestFetchOracleVotes") proto.RegisterType((*RequestValidateOracleVotes)(nil), "tendermint.abci.RequestValidateOracleVotes") proto.RegisterType((*RequestDoesOracleResultExist)(nil), "tendermint.abci.RequestDoesOracleResultExist") + proto.RegisterType((*RequestDoesSubaccountBelongToVal)(nil), "tendermint.abci.RequestDoesSubaccountBelongToVal") proto.RegisterType((*Response)(nil), "tendermint.abci.Response") proto.RegisterType((*ResponseException)(nil), "tendermint.abci.ResponseException") proto.RegisterType((*ResponseEcho)(nil), "tendermint.abci.ResponseEcho") @@ -4138,6 +4261,7 @@ func init() { proto.RegisterType((*ResponseFetchOracleVotes)(nil), "tendermint.abci.ResponseFetchOracleVotes") proto.RegisterType((*ResponseValidateOracleVotes)(nil), "tendermint.abci.ResponseValidateOracleVotes") proto.RegisterType((*ResponseDoesOracleResultExist)(nil), "tendermint.abci.ResponseDoesOracleResultExist") + proto.RegisterType((*ResponseDoesSubaccountBelongToVal)(nil), "tendermint.abci.ResponseDoesSubaccountBelongToVal") proto.RegisterType((*CommitInfo)(nil), "tendermint.abci.CommitInfo") proto.RegisterType((*ExtendedCommitInfo)(nil), "tendermint.abci.ExtendedCommitInfo") proto.RegisterType((*Event)(nil), "tendermint.abci.Event") @@ -4155,231 +4279,239 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3583 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcd, 0x6f, 0x1b, 0xc7, - 0x15, 0xe7, 0xf2, 0x4b, 0xe4, 0xe3, 0x87, 0x56, 0x23, 0x59, 0xa6, 0x69, 0x5b, 0x92, 0x37, 0x48, - 0xe2, 0xd8, 0x89, 0x94, 0xda, 0x75, 0x12, 0xc3, 0x49, 0x00, 0x89, 0xa6, 0x4d, 0xc9, 0x8e, 0xa4, - 0xac, 0x68, 0xa7, 0xee, 0x47, 0x36, 0x2b, 0x72, 0x48, 0x6e, 0x4c, 0x72, 0x37, 0xbb, 0x4b, 0x85, - 0xca, 0xa9, 0x48, 0x5a, 0xa0, 0x08, 0x50, 0x20, 0x40, 0x2f, 0x39, 0x34, 0x87, 0x1e, 0xda, 0x43, - 0xff, 0x82, 0x9e, 0x7a, 0xea, 0x21, 0x87, 0x16, 0xc8, 0xb1, 0xa7, 0xb4, 0x48, 0xd0, 0x4b, 0xae, - 0x3d, 0xf4, 0x5a, 0xcc, 0xc7, 0x7e, 0x91, 0xbb, 0xfc, 0x70, 0xd2, 0x43, 0xd1, 0xde, 0x76, 0xde, - 0xbe, 0xf7, 0x66, 0xe7, 0xcd, 0x9b, 0x79, 0x6f, 0x7e, 0x6f, 0x16, 0xce, 0xdb, 0xb8, 0xdf, 0xc4, - 0x66, 0x4f, 0xeb, 0xdb, 0x5b, 0xea, 0x71, 0x43, 0xdb, 0xb2, 0x4f, 0x0d, 0x6c, 0x6d, 0x1a, 0xa6, - 0x6e, 0xeb, 0x68, 0xd1, 0x7b, 0xb9, 0x49, 0x5e, 0x96, 0x2f, 0xfa, 0xb8, 0x1b, 0xe6, 0xa9, 0x61, - 0xeb, 0x5b, 0x86, 0xa9, 0xeb, 0x2d, 0xc6, 0x5f, 0xbe, 0x30, 0xfe, 0xfa, 0x31, 0x3e, 0xe5, 0xda, - 0x02, 0xc2, 0xb4, 0x97, 0x2d, 0x43, 0x35, 0xd5, 0x9e, 0xf3, 0x7a, 0x63, 0xec, 0xf5, 0x89, 0xda, - 0xd5, 0x9a, 0xaa, 0xad, 0x9b, 0x9c, 0x63, 0xbd, 0xad, 0xeb, 0xed, 0x2e, 0xde, 0xa2, 0xad, 0xe3, - 0x41, 0x6b, 0xcb, 0xd6, 0x7a, 0xd8, 0xb2, 0xd5, 0x9e, 0xc1, 0x19, 0x56, 0xda, 0x7a, 0x5b, 0xa7, - 0x8f, 0x5b, 0xe4, 0x29, 0xa4, 0x5f, 0xdd, 0x54, 0x1b, 0x5d, 0xec, 0x1f, 0xa4, 0xf4, 0x97, 0x3c, - 0x2c, 0xc8, 0xf8, 0xbd, 0x01, 0xb6, 0x6c, 0x74, 0x0d, 0x92, 0xb8, 0xd1, 0xd1, 0x4b, 0xc2, 0x86, - 0x70, 0x39, 0x77, 0xed, 0xc2, 0xe6, 0xc8, 0xf8, 0x37, 0x39, 0x5f, 0xb5, 0xd1, 0xd1, 0x6b, 0x31, - 0x99, 0xf2, 0xa2, 0x1b, 0x90, 0x6a, 0x75, 0x07, 0x56, 0xa7, 0x14, 0xa7, 0x42, 0x17, 0xa3, 0x84, - 0xee, 0x10, 0xa6, 0x5a, 0x4c, 0x66, 0xdc, 0xa4, 0x2b, 0xad, 0xdf, 0xd2, 0x4b, 0x89, 0xc9, 0x5d, - 0xed, 0xf6, 0x5b, 0xb4, 0x2b, 0xc2, 0x8b, 0x76, 0x00, 0xb4, 0xbe, 0x66, 0x2b, 0x8d, 0x8e, 0xaa, - 0xf5, 0x4b, 0x29, 0x2a, 0x79, 0x29, 0x5a, 0x52, 0xb3, 0x2b, 0x84, 0xb1, 0x16, 0x93, 0xb3, 0x9a, - 0xd3, 0x20, 0x9f, 0xfb, 0xde, 0x00, 0x9b, 0xa7, 0xa5, 0xf4, 0xe4, 0xcf, 0x7d, 0x93, 0x30, 0x91, - 0xcf, 0xa5, 0xdc, 0xe8, 0x55, 0xc8, 0x34, 0x3a, 0xb8, 0xf1, 0x58, 0xb1, 0x87, 0xa5, 0x0c, 0x95, - 0x5c, 0x8f, 0x92, 0xac, 0x10, 0xbe, 0xfa, 0xb0, 0x16, 0x93, 0x17, 0x1a, 0xec, 0x11, 0xbd, 0x02, - 0xe9, 0x86, 0xde, 0xeb, 0x69, 0x76, 0x29, 0x47, 0x65, 0xd7, 0x22, 0x65, 0x29, 0x57, 0x2d, 0x26, - 0x73, 0x7e, 0xb4, 0x0f, 0xc5, 0xae, 0x66, 0xd9, 0x8a, 0xd5, 0x57, 0x0d, 0xab, 0xa3, 0xdb, 0x56, - 0x29, 0x4f, 0x35, 0x3c, 0x1d, 0xa5, 0xe1, 0xbe, 0x66, 0xd9, 0x47, 0x0e, 0x73, 0x2d, 0x26, 0x17, - 0xba, 0x7e, 0x02, 0xd1, 0xa7, 0xb7, 0x5a, 0xd8, 0x74, 0x15, 0x96, 0x0a, 0x93, 0xf5, 0x1d, 0x10, - 0x6e, 0x47, 0x9e, 0xe8, 0xd3, 0xfd, 0x04, 0xf4, 0x23, 0x58, 0xee, 0xea, 0x6a, 0xd3, 0x55, 0xa7, - 0x34, 0x3a, 0x83, 0xfe, 0xe3, 0x52, 0x91, 0x2a, 0x7d, 0x2e, 0xf2, 0x23, 0x75, 0xb5, 0xe9, 0xa8, - 0xa8, 0x10, 0x81, 0x5a, 0x4c, 0x5e, 0xea, 0x8e, 0x12, 0xd1, 0xdb, 0xb0, 0xa2, 0x1a, 0x46, 0xf7, - 0x74, 0x54, 0xfb, 0x22, 0xd5, 0x7e, 0x25, 0x4a, 0xfb, 0x36, 0x91, 0x19, 0x55, 0x8f, 0xd4, 0x31, - 0x2a, 0xaa, 0x83, 0x68, 0x98, 0xd8, 0x50, 0x4d, 0xac, 0x18, 0xa6, 0x6e, 0xe8, 0x96, 0xda, 0x2d, - 0x89, 0x54, 0xf7, 0xb3, 0x51, 0xba, 0x0f, 0x19, 0xff, 0x21, 0x67, 0xaf, 0xc5, 0xe4, 0x45, 0x23, - 0x48, 0x62, 0x5a, 0xf5, 0x06, 0xb6, 0x2c, 0x4f, 0xeb, 0xd2, 0x34, 0xad, 0x94, 0x3f, 0xa8, 0x35, - 0x40, 0x42, 0x55, 0xc8, 0xe1, 0x21, 0x11, 0x57, 0x4e, 0x74, 0x1b, 0x97, 0x10, 0x55, 0x28, 0x45, - 0xae, 0x50, 0xca, 0xfa, 0x50, 0xb7, 0x71, 0x2d, 0x26, 0x03, 0x76, 0x5b, 0x48, 0x85, 0x33, 0x27, - 0xd8, 0xd4, 0x5a, 0xa7, 0x54, 0x8d, 0x42, 0xdf, 0x58, 0x9a, 0xde, 0x2f, 0x2d, 0x53, 0x85, 0x57, - 0xa3, 0x14, 0x3e, 0xa4, 0x42, 0x44, 0x45, 0xd5, 0x11, 0xa9, 0xc5, 0xe4, 0xe5, 0x93, 0x71, 0x32, - 0x71, 0xb1, 0x96, 0xd6, 0x57, 0xbb, 0xda, 0x07, 0x58, 0x39, 0xee, 0xea, 0x8d, 0xc7, 0xa5, 0x95, - 0xc9, 0x2e, 0x76, 0x87, 0x73, 0xef, 0x10, 0x66, 0xe2, 0x62, 0x2d, 0x3f, 0x01, 0x61, 0x38, 0xdb, - 0x30, 0xb1, 0x6a, 0x63, 0x85, 0xed, 0x5e, 0x8a, 0x89, 0xad, 0x41, 0xd7, 0x26, 0x2b, 0xf1, 0x0c, - 0x55, 0xfc, 0x7c, 0xe4, 0x6a, 0xa2, 0x62, 0x07, 0x54, 0x4a, 0xa6, 0x42, 0x74, 0x59, 0xae, 0x34, - 0x42, 0xe8, 0xe8, 0x07, 0x80, 0x5a, 0xd8, 0x6e, 0x74, 0x9c, 0x5e, 0x88, 0x7d, 0xac, 0xd2, 0x2a, - 0xed, 0xe1, 0x72, 0xe4, 0xa7, 0x13, 0x09, 0xa6, 0x88, 0x18, 0x81, 0x2c, 0x38, 0xb1, 0x35, 0x42, - 0xa3, 0x36, 0x67, 0x5b, 0x39, 0x0e, 0x2a, 0x3f, 0x3b, 0xc5, 0xe6, 0x5c, 0x28, 0xa8, 0x7f, 0xf9, - 0x64, 0x9c, 0x8c, 0x3a, 0x50, 0x6a, 0xea, 0xd8, 0x1a, 0xb1, 0x10, 0x1e, 0x6a, 0x96, 0x5d, 0x2a, - 0xd1, 0x5e, 0x5e, 0x88, 0xea, 0xe5, 0xb6, 0x8e, 0x2d, 0xbf, 0x29, 0xaa, 0x44, 0xa8, 0x16, 0x93, - 0xcf, 0x34, 0xc3, 0x5e, 0xec, 0x2c, 0x40, 0xea, 0x44, 0xed, 0x0e, 0xf0, 0x5e, 0x32, 0x93, 0x14, - 0x53, 0x7b, 0xc9, 0xcc, 0x82, 0x98, 0xd9, 0x4b, 0x66, 0xb2, 0x22, 0xec, 0x25, 0x33, 0x20, 0xe6, - 0xa4, 0x67, 0x21, 0xe7, 0x0b, 0x13, 0xa8, 0x04, 0x0b, 0x3d, 0x6c, 0x59, 0x6a, 0x1b, 0xd3, 0xa8, - 0x92, 0x95, 0x9d, 0xa6, 0x54, 0x84, 0xbc, 0x3f, 0x34, 0x48, 0x9f, 0x08, 0xae, 0x24, 0xd9, 0xf5, - 0x89, 0xe4, 0x09, 0x36, 0xa9, 0x73, 0x72, 0x49, 0xde, 0x44, 0x4f, 0x41, 0x81, 0x3a, 0x96, 0xe2, - 0xbc, 0x27, 0xa1, 0x27, 0x29, 0xe7, 0x29, 0xf1, 0x21, 0x67, 0x5a, 0x87, 0x9c, 0x71, 0xcd, 0x70, - 0x59, 0x12, 0x94, 0x05, 0x8c, 0x6b, 0x86, 0xc3, 0x70, 0x09, 0xf2, 0xc4, 0x0e, 0x2e, 0x47, 0x92, - 0x76, 0x92, 0x23, 0x34, 0xce, 0x22, 0xfd, 0x39, 0x0e, 0xe2, 0x68, 0x38, 0x41, 0xaf, 0x40, 0x92, - 0x04, 0x5e, 0x1e, 0x24, 0xcb, 0x9b, 0x2c, 0x2a, 0x6f, 0x3a, 0x51, 0x79, 0xb3, 0xee, 0x44, 0xe5, - 0x9d, 0xcc, 0xe7, 0x5f, 0xae, 0xc7, 0x3e, 0xf9, 0xdb, 0xba, 0x20, 0x53, 0x09, 0x74, 0x8e, 0x04, - 0x11, 0x55, 0xeb, 0x2b, 0x5a, 0x93, 0x7e, 0x72, 0x96, 0x44, 0x08, 0x55, 0xeb, 0xef, 0x36, 0xd1, - 0x7d, 0x10, 0x1b, 0x7a, 0xdf, 0xc2, 0x7d, 0x6b, 0x60, 0x29, 0x2c, 0x2f, 0xe0, 0xa1, 0x31, 0x10, - 0xe0, 0x58, 0xe0, 0xae, 0x38, 0x9c, 0x87, 0x94, 0x51, 0x5e, 0x6c, 0x04, 0x09, 0xe8, 0x0e, 0x80, - 0x9b, 0x3c, 0x58, 0xa5, 0xe4, 0x46, 0xe2, 0x72, 0xee, 0xda, 0xc6, 0x98, 0x03, 0x3c, 0x74, 0x58, - 0x1e, 0x18, 0xc4, 0x9f, 0x76, 0x92, 0xe4, 0x73, 0x65, 0x9f, 0x24, 0x7a, 0x06, 0x16, 0x55, 0xc3, - 0x50, 0x2c, 0x9b, 0xb8, 0xee, 0xf1, 0x29, 0xf1, 0x59, 0x12, 0x75, 0xf3, 0x72, 0x41, 0x35, 0x8c, - 0x23, 0x42, 0xdd, 0x21, 0x44, 0xf4, 0x34, 0x14, 0x49, 0x84, 0xd5, 0xd4, 0xae, 0xd2, 0xc1, 0x5a, - 0xbb, 0x63, 0xd3, 0xe8, 0x9a, 0x90, 0x0b, 0x9c, 0x5a, 0xa3, 0x44, 0xa9, 0xe9, 0xce, 0x38, 0x8d, - 0xae, 0x08, 0x41, 0xb2, 0xa9, 0xda, 0x2a, 0xb5, 0x64, 0x5e, 0xa6, 0xcf, 0x84, 0x66, 0xa8, 0x76, - 0x87, 0xdb, 0x87, 0x3e, 0xa3, 0x55, 0x48, 0x73, 0xb5, 0x09, 0xaa, 0x96, 0xb7, 0xd0, 0x0a, 0xa4, - 0x0c, 0x53, 0x3f, 0xc1, 0x74, 0xea, 0x32, 0x32, 0x6b, 0x48, 0x32, 0x14, 0x83, 0x91, 0x18, 0x15, - 0x21, 0x6e, 0x0f, 0x79, 0x2f, 0x71, 0x7b, 0x88, 0x5e, 0x84, 0x24, 0x31, 0x24, 0xed, 0xa3, 0x18, - 0x92, 0x7b, 0x70, 0xb9, 0xfa, 0xa9, 0x81, 0x65, 0xca, 0x29, 0x2d, 0x42, 0x21, 0x10, 0xa1, 0xa5, - 0x55, 0x58, 0x09, 0x0b, 0xb8, 0x52, 0xc7, 0xa5, 0x07, 0x02, 0x27, 0xba, 0x01, 0x19, 0x37, 0xe2, - 0x32, 0xc7, 0x39, 0x37, 0xd6, 0xad, 0xc3, 0x2c, 0xbb, 0xac, 0xc4, 0x63, 0xc8, 0x04, 0x74, 0x54, - 0x9e, 0x5f, 0xe5, 0xe5, 0x05, 0xd5, 0x30, 0x6a, 0xaa, 0xd5, 0x91, 0xde, 0x81, 0x52, 0x54, 0x34, - 0xf5, 0x19, 0x4c, 0xa0, 0x6e, 0xef, 0x18, 0x6c, 0x15, 0xd2, 0x2d, 0xdd, 0xec, 0xa9, 0x36, 0x55, - 0x56, 0x90, 0x79, 0x8b, 0x18, 0x92, 0x45, 0xd6, 0x04, 0x25, 0xb3, 0x86, 0xa4, 0xc0, 0xb9, 0xc8, - 0x88, 0x4a, 0x44, 0xb4, 0x7e, 0x13, 0x33, 0xb3, 0x16, 0x64, 0xd6, 0xf0, 0x14, 0xb1, 0x8f, 0x65, - 0x0d, 0xd2, 0xad, 0x45, 0xc7, 0x4a, 0xf5, 0x67, 0x65, 0xde, 0x92, 0x3e, 0x4d, 0xc0, 0x6a, 0x78, - 0x5c, 0x45, 0x1b, 0x90, 0xef, 0xa9, 0x43, 0xc5, 0x1e, 0x72, 0xb7, 0x13, 0xe8, 0xc4, 0x43, 0x4f, - 0x1d, 0xd6, 0x87, 0xcc, 0xe7, 0x44, 0x48, 0xd8, 0x43, 0xab, 0x14, 0xdf, 0x48, 0x5c, 0xce, 0xcb, - 0xe4, 0x11, 0x3d, 0x80, 0xa5, 0xae, 0xde, 0x50, 0xbb, 0x4a, 0x57, 0xb5, 0x6c, 0x85, 0x27, 0x5c, - 0x6c, 0x11, 0x3d, 0x35, 0x66, 0x6c, 0x16, 0x21, 0x71, 0x93, 0xcd, 0x27, 0xd9, 0x70, 0xb8, 0xff, - 0x2f, 0x52, 0x1d, 0xf7, 0x55, 0x67, 0xaa, 0xd1, 0x6d, 0xc8, 0xf5, 0x34, 0xeb, 0x18, 0x77, 0xd4, - 0x13, 0x4d, 0x37, 0xf9, 0x6a, 0x1a, 0x77, 0x9a, 0x37, 0x3c, 0x1e, 0xae, 0xc9, 0x2f, 0xe6, 0x9b, - 0x92, 0x54, 0xc0, 0x87, 0x9d, 0xdd, 0x24, 0x3d, 0xf7, 0x6e, 0xf2, 0x22, 0xac, 0xf4, 0xf1, 0xd0, - 0x56, 0xbc, 0xf5, 0xca, 0xfc, 0x64, 0x81, 0x9a, 0x1e, 0x91, 0x77, 0xee, 0x0a, 0xb7, 0x88, 0xcb, - 0xa0, 0xe7, 0x68, 0x66, 0x62, 0xe8, 0x16, 0x36, 0x15, 0xb5, 0xd9, 0x34, 0xb1, 0x65, 0xd1, 0x64, - 0x36, 0x4f, 0xd3, 0x0d, 0x4a, 0xdf, 0x66, 0x64, 0xe9, 0x17, 0xfe, 0xa9, 0x09, 0x66, 0x22, 0xdc, - 0xf0, 0x82, 0x67, 0xf8, 0x23, 0x58, 0xe1, 0xf2, 0xcd, 0x80, 0xed, 0xd9, 0x89, 0xe0, 0xfc, 0xf8, - 0xfa, 0x1a, 0xb5, 0x39, 0x72, 0xc4, 0xa3, 0xcd, 0x9e, 0x78, 0x32, 0xb3, 0x23, 0x48, 0x52, 0xa3, - 0x24, 0xd9, 0x16, 0x43, 0x9e, 0xff, 0xdb, 0xa6, 0xe2, 0xa3, 0x04, 0x2c, 0x8d, 0xa5, 0x75, 0xee, - 0xc0, 0x84, 0xd0, 0x81, 0xc5, 0x43, 0x07, 0x96, 0x98, 0x7b, 0x60, 0x7c, 0xae, 0x93, 0xd3, 0xe7, - 0x3a, 0xf5, 0x1d, 0xce, 0x75, 0xfa, 0xc9, 0xe6, 0xfa, 0x3f, 0x3a, 0x0b, 0xbf, 0x16, 0xa0, 0x1c, - 0x9d, 0x0b, 0x87, 0x4e, 0xc7, 0x55, 0x58, 0x72, 0x3f, 0xc5, 0x55, 0xcf, 0x36, 0x46, 0xd1, 0x7d, - 0xc1, 0xf5, 0x47, 0xc6, 0xb8, 0xa7, 0xa1, 0x38, 0x92, 0xa9, 0x33, 0x57, 0x2e, 0x9c, 0xf8, 0xfb, - 0x97, 0x7e, 0x96, 0x70, 0x03, 0x4f, 0x20, 0x9d, 0x0e, 0x59, 0xad, 0x6f, 0xc2, 0x72, 0x13, 0x37, - 0xb4, 0xe6, 0x93, 0x2e, 0xd6, 0x25, 0x2e, 0xfd, 0xff, 0xb5, 0x3a, 0xee, 0x25, 0x1f, 0x0a, 0x70, - 0x7e, 0xc2, 0xe1, 0x03, 0x95, 0x21, 0xe3, 0x88, 0x70, 0x57, 0x71, 0xdb, 0xe8, 0x2e, 0x14, 0xdb, - 0xba, 0x65, 0x69, 0x06, 0x6e, 0xf2, 0xf3, 0x41, 0x7c, 0x3c, 0x71, 0x63, 0x09, 0xfe, 0xe6, 0x5d, - 0xce, 0x48, 0xb3, 0x7f, 0xb9, 0xd0, 0xf6, 0x37, 0xa5, 0x73, 0x70, 0x36, 0xe2, 0x78, 0x22, 0xdd, - 0xf4, 0x9c, 0x38, 0xe4, 0x14, 0x71, 0x1e, 0xb2, 0xfc, 0x00, 0xe1, 0xa6, 0x4b, 0x19, 0x46, 0xa8, - 0x0f, 0xa5, 0x17, 0xe1, 0xc2, 0xa4, 0x13, 0x03, 0x71, 0xb4, 0xc7, 0xf8, 0x94, 0xa7, 0xea, 0xe4, - 0x51, 0xfa, 0x5d, 0x01, 0x32, 0x32, 0xb6, 0x0c, 0x92, 0x9c, 0xa2, 0x1d, 0xc8, 0xe2, 0x61, 0x03, - 0x1b, 0xb6, 0x93, 0xcf, 0x87, 0x9f, 0x5e, 0x19, 0x77, 0xd5, 0xe1, 0xac, 0xc5, 0x64, 0x4f, 0x0c, - 0x5d, 0xe7, 0xf0, 0x54, 0x34, 0xd2, 0xc4, 0xc5, 0xfd, 0xf8, 0xd4, 0x4b, 0x0e, 0x3e, 0x95, 0x88, - 0x84, 0x5e, 0x98, 0xd4, 0x08, 0x40, 0x75, 0x9d, 0x03, 0x54, 0xc9, 0x29, 0x9d, 0x05, 0x10, 0xaa, - 0x4a, 0x00, 0xa1, 0x4a, 0x4f, 0x19, 0x66, 0x04, 0x44, 0xf5, 0x92, 0x03, 0x51, 0x2d, 0x4c, 0xf9, - 0xe2, 0x11, 0x8c, 0xea, 0x35, 0x1f, 0x46, 0x95, 0xa5, 0xa2, 0x1b, 0x91, 0xa2, 0x21, 0x20, 0xd5, - 0x4d, 0x17, 0xa4, 0xca, 0x47, 0x02, 0x5c, 0x5c, 0x78, 0x14, 0xa5, 0x3a, 0x18, 0x43, 0xa9, 0x18, - 0xaa, 0xf4, 0x4c, 0xa4, 0x8a, 0x29, 0x30, 0xd5, 0xc1, 0x18, 0x4c, 0x55, 0x9c, 0xa2, 0x70, 0x0a, - 0x4e, 0xf5, 0xe3, 0x70, 0x9c, 0x2a, 0x1a, 0x49, 0xe2, 0x9f, 0x39, 0x1b, 0x50, 0xa5, 0x44, 0x00, - 0x55, 0x62, 0xe4, 0x01, 0x9f, 0xa9, 0x9f, 0x19, 0xa9, 0x7a, 0x10, 0x82, 0x54, 0x2d, 0x45, 0x42, - 0x13, 0x4c, 0xf9, 0x0c, 0x50, 0xd5, 0x83, 0x10, 0xa8, 0x0a, 0x4d, 0x55, 0x3b, 0x15, 0xab, 0xba, - 0x13, 0xc4, 0xaa, 0x96, 0x23, 0x52, 0x70, 0x6f, 0xb5, 0x47, 0x80, 0x55, 0xc7, 0x51, 0x60, 0xd5, - 0x4a, 0x24, 0xee, 0xc3, 0x34, 0xce, 0x81, 0x56, 0x1d, 0x8c, 0xa1, 0x55, 0x67, 0xa6, 0x78, 0xda, - 0x14, 0xb8, 0xaa, 0x15, 0x0d, 0x57, 0xad, 0x46, 0x22, 0x31, 0x7c, 0x5d, 0xcd, 0x83, 0x57, 0x3d, - 0x0a, 0xc5, 0xab, 0xce, 0x46, 0x02, 0xaf, 0xfc, 0xe3, 0x67, 0x01, 0xac, 0x8e, 0xa3, 0x00, 0xab, - 0xd2, 0x34, 0xbb, 0xcf, 0x8e, 0x58, 0x69, 0x13, 0x10, 0xab, 0x73, 0xb4, 0x9b, 0xcd, 0xc8, 0x6e, - 0x9e, 0x1c, 0xb2, 0x4a, 0x89, 0xe9, 0xbd, 0x64, 0x26, 0x23, 0x66, 0x19, 0x58, 0xb5, 0x97, 0xcc, - 0xe4, 0xc4, 0xbc, 0xf4, 0x1c, 0x49, 0xb0, 0x47, 0x22, 0x0f, 0x39, 0xca, 0x62, 0xd3, 0xd4, 0x4d, - 0x1e, 0xd1, 0x58, 0x43, 0xba, 0x0c, 0x79, 0x7f, 0x94, 0x99, 0x00, 0x6f, 0x51, 0xc8, 0xc0, 0x17, - 0x59, 0xa4, 0x3f, 0x08, 0x9e, 0x2c, 0x05, 0xb8, 0xfc, 0xf0, 0x47, 0x96, 0xc3, 0x1f, 0x3e, 0xd0, - 0x2b, 0x1e, 0x04, 0xbd, 0xd6, 0x21, 0xa7, 0x1a, 0x63, 0x78, 0x96, 0x6a, 0xb8, 0x78, 0xd6, 0x15, - 0x58, 0xa2, 0xf9, 0x1c, 0x83, 0xc6, 0x78, 0xd6, 0x94, 0xa4, 0x59, 0xd3, 0x22, 0x79, 0xc1, 0xfc, - 0x95, 0xa5, 0x4f, 0x2f, 0xc0, 0xb2, 0x8f, 0xd7, 0x85, 0x18, 0x18, 0xb8, 0x23, 0xba, 0xdc, 0xdb, - 0x1c, 0x6b, 0xf8, 0x93, 0xe0, 0x59, 0xc8, 0x03, 0xc2, 0xc2, 0x30, 0x2b, 0xe1, 0x3b, 0xc2, 0xac, - 0xe2, 0x4f, 0x8c, 0x59, 0xf9, 0x21, 0x93, 0x44, 0x10, 0x32, 0xf9, 0x97, 0xe0, 0xcd, 0x89, 0x8b, - 0x40, 0x35, 0xf4, 0x26, 0xe6, 0x20, 0x06, 0x7d, 0x26, 0x89, 0x4c, 0x57, 0x6f, 0x73, 0xa8, 0x82, - 0x3c, 0x12, 0x2e, 0x37, 0x15, 0xc8, 0xf2, 0x48, 0xef, 0xe2, 0x1f, 0x2c, 0x2f, 0xe5, 0xf8, 0x07, - 0x4f, 0x82, 0xd2, 0xb4, 0x5f, 0xf2, 0x48, 0xf8, 0xa8, 0xf3, 0xf1, 0xfc, 0x92, 0x35, 0xd0, 0x2b, - 0x90, 0xa5, 0x85, 0x43, 0x45, 0x37, 0x2c, 0x5e, 0x4f, 0x0a, 0x64, 0xde, 0xac, 0x7a, 0xb8, 0x79, - 0x48, 0x78, 0x0e, 0x0c, 0x8b, 0x66, 0x89, 0xf4, 0xc9, 0x97, 0x10, 0x67, 0x03, 0x09, 0xf1, 0x05, - 0xc8, 0x92, 0xaf, 0xb7, 0x0c, 0xb5, 0x81, 0x4b, 0x40, 0x3f, 0xd4, 0x23, 0x48, 0xbf, 0x8f, 0xc3, - 0xe2, 0x48, 0xe8, 0x0f, 0x1d, 0xbb, 0xe3, 0x92, 0x71, 0x1f, 0x22, 0x37, 0x9b, 0x3d, 0xd6, 0x00, - 0xda, 0xaa, 0xa5, 0xbc, 0xaf, 0xf6, 0x6d, 0xdc, 0xe4, 0x46, 0xf1, 0x51, 0x48, 0xe6, 0x4b, 0x5a, - 0x03, 0x0b, 0x37, 0x39, 0x38, 0xe8, 0xb6, 0x51, 0x0d, 0xd2, 0xf8, 0x04, 0xf7, 0x6d, 0xab, 0xb4, - 0x40, 0xa7, 0x7d, 0x75, 0x1c, 0xad, 0x21, 0xaf, 0x77, 0x4a, 0x64, 0xb2, 0xbf, 0xf9, 0x72, 0x5d, - 0x64, 0xdc, 0xcf, 0xeb, 0x3d, 0xcd, 0xc6, 0x3d, 0xc3, 0x3e, 0x95, 0xb9, 0x7c, 0xd0, 0x0a, 0x99, - 0x11, 0x2b, 0x50, 0x98, 0x3a, 0xef, 0xa0, 0x4f, 0xc4, 0xa6, 0x9a, 0x6e, 0x6a, 0xf6, 0xa9, 0x5c, - 0xe8, 0xe1, 0x9e, 0xa1, 0xeb, 0x5d, 0x85, 0xad, 0xf1, 0x6d, 0x28, 0x06, 0x33, 0x1d, 0xf4, 0x14, - 0x14, 0x4c, 0x6c, 0xab, 0x5a, 0x5f, 0x09, 0x9c, 0xd1, 0xf2, 0x8c, 0xc8, 0xd6, 0xd4, 0x5e, 0x32, - 0x23, 0x88, 0xf1, 0xbd, 0x64, 0x26, 0x2e, 0x26, 0xa4, 0x43, 0x38, 0x13, 0x9a, 0xe9, 0xa0, 0x97, - 0x21, 0xeb, 0x25, 0x49, 0x02, 0x1d, 0xed, 0x04, 0x20, 0xd0, 0xe3, 0x95, 0xfe, 0x28, 0x78, 0x2a, - 0x83, 0xd0, 0x62, 0x15, 0xd2, 0x6c, 0xf7, 0xa4, 0x33, 0x59, 0x9c, 0x10, 0x5f, 0x02, 0x72, 0x9b, - 0x6c, 0x8b, 0x94, 0xb9, 0xb0, 0xf4, 0x36, 0xa4, 0x19, 0x05, 0xe5, 0x60, 0xe1, 0xc1, 0xfe, 0xbd, - 0xfd, 0x83, 0xb7, 0xf6, 0xc5, 0x18, 0x02, 0x48, 0x6f, 0x57, 0x2a, 0xd5, 0xc3, 0xba, 0x28, 0xa0, - 0x2c, 0xa4, 0xb6, 0x77, 0x0e, 0xe4, 0xba, 0x18, 0x27, 0x64, 0xb9, 0xba, 0x57, 0xad, 0xd4, 0xc5, - 0x04, 0x5a, 0x82, 0x02, 0x7b, 0x56, 0xee, 0x1c, 0xc8, 0x6f, 0x6c, 0xd7, 0xc5, 0xa4, 0x8f, 0x74, - 0x54, 0xdd, 0xbf, 0x5d, 0x95, 0xc5, 0x94, 0xf4, 0x3d, 0x38, 0x17, 0x99, 0x55, 0x79, 0xb8, 0xa1, - 0xe0, 0xc3, 0x0d, 0xa5, 0x4f, 0xe3, 0xe4, 0xb8, 0x12, 0x95, 0x2a, 0xa1, 0xbd, 0x91, 0x81, 0x5f, - 0x9b, 0x23, 0xcf, 0x1a, 0x19, 0x3d, 0x39, 0x66, 0x9b, 0x98, 0xc5, 0x53, 0xda, 0x37, 0xdb, 0x81, - 0x0a, 0x72, 0x81, 0x53, 0xa9, 0x90, 0xc5, 0xd8, 0xde, 0xc5, 0x0d, 0x5b, 0x61, 0x4e, 0x64, 0xd1, - 0xb3, 0x6e, 0x96, 0xb0, 0x11, 0xea, 0x11, 0x23, 0x4a, 0xef, 0xcc, 0x65, 0xcb, 0x2c, 0xa4, 0xe4, - 0x6a, 0x5d, 0x7e, 0x24, 0x26, 0x10, 0x82, 0x22, 0x7d, 0x54, 0x8e, 0xf6, 0xb7, 0x0f, 0x8f, 0x6a, - 0x07, 0xc4, 0x96, 0xcb, 0xb0, 0xe8, 0xd8, 0xd2, 0x21, 0xa6, 0xa4, 0xab, 0xe4, 0x8c, 0x17, 0x9a, - 0xe7, 0x8d, 0x9f, 0xf8, 0xa5, 0xdf, 0x08, 0x7e, 0xee, 0x60, 0xae, 0x76, 0x00, 0x69, 0xcb, 0x56, - 0xed, 0x81, 0xc5, 0x8d, 0xf8, 0xf2, 0xac, 0x89, 0xdf, 0xa6, 0xf3, 0x70, 0x44, 0xc5, 0x65, 0xae, - 0x46, 0xba, 0x01, 0xc5, 0xe0, 0x9b, 0x68, 0x1b, 0x78, 0x4e, 0x14, 0x97, 0x6e, 0x01, 0x1a, 0xcf, - 0x07, 0x43, 0xd0, 0x0f, 0x21, 0x0c, 0xfd, 0xf8, 0x2d, 0x3d, 0x76, 0x47, 0xe6, 0x7e, 0xe8, 0xcd, - 0x91, 0x41, 0xde, 0x9c, 0x27, 0x73, 0xdc, 0x64, 0xb4, 0x91, 0x61, 0x5e, 0x87, 0xbc, 0x9f, 0x3e, - 0xdb, 0x20, 0xbf, 0x89, 0x7b, 0x8b, 0x38, 0x08, 0xd3, 0x78, 0x5b, 0xa0, 0xf0, 0x2d, 0xb7, 0xc0, - 0x57, 0x01, 0xec, 0x21, 0xcf, 0xa7, 0x9c, 0x38, 0x7a, 0x31, 0x04, 0xfe, 0xc6, 0x8d, 0xfa, 0x90, - 0x2f, 0x82, 0xac, 0xcd, 0x9f, 0x2c, 0x74, 0xe4, 0xc7, 0xac, 0x06, 0x34, 0xc6, 0x5a, 0x1c, 0xcf, - 0x99, 0x35, 0x18, 0x7b, 0xd8, 0x16, 0x23, 0x5b, 0xe8, 0x11, 0x9c, 0x1d, 0x49, 0x14, 0x5c, 0xd5, - 0xc9, 0x59, 0xf3, 0x85, 0x33, 0xc1, 0x7c, 0xc1, 0x51, 0xed, 0x8f, 0xf6, 0xa9, 0x60, 0xb4, 0x7f, - 0x0d, 0x2e, 0x4c, 0x4a, 0xac, 0xd1, 0x45, 0x00, 0xdc, 0x27, 0xc1, 0xa1, 0xe9, 0xc1, 0x1d, 0x59, - 0x4e, 0xa9, 0x0f, 0xa5, 0xbb, 0x50, 0x8a, 0x4a, 0x9a, 0xd1, 0x55, 0x48, 0xd2, 0x93, 0x0d, 0xcb, - 0x76, 0xce, 0x86, 0x00, 0x34, 0x84, 0x4f, 0xa6, 0x4c, 0xd2, 0x2f, 0xfd, 0xce, 0x19, 0x92, 0x09, - 0xdf, 0x1b, 0x71, 0xce, 0xeb, 0xf3, 0xa4, 0xd7, 0x9b, 0x23, 0x6e, 0x79, 0x09, 0xd2, 0xdc, 0x21, - 0x89, 0x0f, 0xee, 0x1c, 0x55, 0xf7, 0xeb, 0x62, 0x8c, 0x38, 0xe7, 0xa1, 0x5c, 0xa5, 0x0d, 0x41, - 0x7a, 0x1d, 0x2e, 0x4e, 0x4c, 0xa4, 0x89, 0x61, 0x68, 0x6a, 0xce, 0x92, 0x71, 0x81, 0xd6, 0xd6, - 0xb2, 0x84, 0x42, 0x5f, 0x4b, 0x8f, 0x00, 0x3c, 0x4c, 0x90, 0xec, 0xdc, 0xa6, 0x3e, 0xe8, 0x37, - 0x29, 0x5f, 0x4a, 0x66, 0x0d, 0x74, 0x03, 0x52, 0x7e, 0x08, 0x6b, 0x3c, 0xc4, 0x91, 0x8f, 0xf7, - 0x61, 0x8a, 0x8c, 0x5b, 0xd2, 0x00, 0x8d, 0xd7, 0x65, 0x22, 0xba, 0x78, 0x2d, 0xd8, 0xc5, 0xa5, - 0xc8, 0x0a, 0x4f, 0x78, 0x57, 0x1f, 0x40, 0x8a, 0xae, 0x28, 0x92, 0xcc, 0xd0, 0x62, 0x20, 0xcf, - 0xc2, 0xc9, 0x33, 0xfa, 0x09, 0x80, 0x6a, 0xdb, 0xa6, 0x76, 0x3c, 0xf0, 0x3a, 0x58, 0x0f, 0x5f, - 0x91, 0xdb, 0x0e, 0xdf, 0xce, 0x05, 0xbe, 0x34, 0x57, 0x3c, 0x51, 0xdf, 0xf2, 0xf4, 0x29, 0x94, - 0xf6, 0xa1, 0x18, 0x94, 0x1d, 0x07, 0xcf, 0xbc, 0xbc, 0x91, 0x1d, 0x03, 0x78, 0xde, 0xe8, 0x66, - 0x9d, 0x09, 0x56, 0xf1, 0xa4, 0x0d, 0xe9, 0xa7, 0x71, 0xc8, 0xfb, 0x17, 0xf4, 0xff, 0x5e, 0x6a, - 0x27, 0xfd, 0x5c, 0x80, 0x8c, 0x3b, 0xfc, 0x60, 0xf9, 0x33, 0x50, 0x2f, 0x66, 0xd6, 0x8b, 0xfb, - 0x6b, 0x96, 0xac, 0x3a, 0x9c, 0x70, 0xab, 0xc3, 0xb7, 0xdc, 0xb4, 0x22, 0x0a, 0xfa, 0xf3, 0xdb, - 0x9a, 0x7b, 0x95, 0x93, 0x45, 0xdd, 0x82, 0xac, 0xbb, 0x2b, 0x92, 0xc3, 0x9c, 0x83, 0x17, 0x0b, - 0x7c, 0x6f, 0xe2, 0x68, 0xff, 0x0a, 0xa4, 0x0c, 0xfd, 0x7d, 0x5e, 0x10, 0x4d, 0xc8, 0xac, 0x21, - 0x35, 0x61, 0x71, 0x64, 0x4b, 0x45, 0xb7, 0x60, 0xc1, 0x18, 0x1c, 0x2b, 0x8e, 0x73, 0x8c, 0xa0, - 0xea, 0xce, 0x31, 0x61, 0x70, 0xdc, 0xd5, 0x1a, 0xf7, 0xf0, 0xa9, 0xf3, 0x31, 0xc6, 0xe0, 0xf8, - 0x1e, 0xf3, 0x21, 0xd6, 0x4b, 0xdc, 0xdf, 0xcb, 0xaf, 0x04, 0xc8, 0x38, 0x6b, 0x02, 0xbd, 0x0e, - 0x59, 0x77, 0xbb, 0x76, 0x6f, 0x34, 0x44, 0xee, 0xf3, 0x5c, 0xbf, 0x27, 0x82, 0xb6, 0x9d, 0xab, - 0x18, 0x5a, 0x53, 0x69, 0x75, 0x55, 0xe6, 0x4b, 0xc5, 0xa0, 0xcd, 0xd8, 0x86, 0x4e, 0xe3, 0xdc, - 0xee, 0xed, 0x3b, 0x5d, 0xb5, 0x2d, 0xe7, 0xa8, 0xcc, 0x6e, 0x93, 0x34, 0x78, 0xc6, 0xfc, 0x4f, - 0x01, 0xc4, 0xd1, 0x15, 0xfb, 0xad, 0xbf, 0x6e, 0x3c, 0x7d, 0x48, 0x84, 0xa4, 0x0f, 0x68, 0x0b, - 0x96, 0x5d, 0x0e, 0xc5, 0xd2, 0xda, 0x7d, 0xd5, 0x1e, 0x98, 0x98, 0xd7, 0x21, 0x90, 0xfb, 0xea, - 0xc8, 0x79, 0x33, 0x3e, 0xea, 0xd4, 0x13, 0x8e, 0xfa, 0xa3, 0x38, 0xe4, 0x7c, 0x55, 0x11, 0xf4, - 0x7d, 0xdf, 0x66, 0x54, 0x0c, 0x89, 0xb8, 0x3e, 0x5e, 0xef, 0x76, 0x42, 0xd0, 0x4c, 0xf1, 0xf9, - 0xcd, 0x14, 0x55, 0x7b, 0x72, 0x8a, 0x2c, 0xc9, 0xb9, 0x8b, 0x2c, 0xcf, 0x03, 0xb2, 0x75, 0x5b, - 0xed, 0x2a, 0x27, 0xba, 0xad, 0xf5, 0xdb, 0x0a, 0x73, 0x43, 0xb6, 0x75, 0x88, 0xf4, 0xcd, 0x43, - 0xfa, 0xe2, 0x90, 0x7a, 0xe4, 0x87, 0x02, 0x64, 0xdc, 0xe3, 0xcc, 0xbc, 0x77, 0x17, 0x56, 0x21, - 0xcd, 0x33, 0x76, 0x76, 0x79, 0x81, 0xb7, 0x42, 0xab, 0x49, 0x65, 0xc8, 0xf4, 0xb0, 0xad, 0xd2, - 0x7d, 0x90, 0x65, 0x0b, 0x6e, 0xfb, 0xca, 0x4d, 0xc8, 0xf9, 0xee, 0x7d, 0x90, 0xad, 0x71, 0xbf, - 0xfa, 0x96, 0x18, 0x2b, 0x2f, 0x7c, 0xfc, 0xd9, 0x46, 0x62, 0x1f, 0xbf, 0x4f, 0x56, 0xb3, 0x5c, - 0xad, 0xd4, 0xaa, 0x95, 0x7b, 0xa2, 0x50, 0xce, 0x7d, 0xfc, 0xd9, 0xc6, 0x82, 0x8c, 0x29, 0x76, - 0x7e, 0xe5, 0x1e, 0x2c, 0x8e, 0x4c, 0x4c, 0x30, 0x1d, 0x44, 0x50, 0xbc, 0xfd, 0xe0, 0xf0, 0xfe, - 0x6e, 0x65, 0xbb, 0x5e, 0x55, 0x1e, 0x1e, 0xd4, 0xab, 0xa2, 0x80, 0xce, 0xc2, 0xf2, 0xfd, 0xdd, - 0xbb, 0xb5, 0xba, 0x52, 0xb9, 0xbf, 0x5b, 0xdd, 0xaf, 0x2b, 0xdb, 0xf5, 0xfa, 0x76, 0xe5, 0x9e, - 0x18, 0xbf, 0xf6, 0x8f, 0x22, 0x24, 0xb7, 0x77, 0x2a, 0xbb, 0xa8, 0x02, 0x49, 0x0a, 0x31, 0x4d, - 0xbc, 0x86, 0x5b, 0x9e, 0x5c, 0x05, 0x41, 0x77, 0x20, 0x45, 0xd1, 0x27, 0x34, 0xf9, 0x5e, 0x6e, - 0x79, 0x4a, 0x59, 0x84, 0x7c, 0x0c, 0x5d, 0x91, 0x13, 0x2f, 0xea, 0x96, 0x27, 0x57, 0x49, 0xd0, - 0x7d, 0x58, 0x70, 0xc0, 0x87, 0x69, 0xb7, 0x67, 0xcb, 0x53, 0x4b, 0x17, 0x64, 0x68, 0x0c, 0xc4, - 0x99, 0x7c, 0x87, 0xb7, 0x3c, 0xa5, 0x7e, 0x82, 0x76, 0x21, 0xcd, 0x8f, 0xf9, 0x53, 0xae, 0xe5, - 0x96, 0xa7, 0x55, 0x44, 0x90, 0x0c, 0x59, 0x0f, 0x1e, 0x9b, 0x7e, 0x33, 0xb9, 0x3c, 0x43, 0x69, - 0x08, 0xbd, 0x0d, 0x85, 0x20, 0x84, 0x30, 0xdb, 0xd5, 0xdf, 0xf2, 0x8c, 0xb5, 0x17, 0xa2, 0x3f, - 0x88, 0x27, 0xcc, 0x76, 0x15, 0xb8, 0x3c, 0x63, 0x29, 0x06, 0xbd, 0x0b, 0x4b, 0xe3, 0xe7, 0xfd, - 0xd9, 0x6f, 0x06, 0x97, 0xe7, 0x28, 0xce, 0xa0, 0x1e, 0xa0, 0x10, 0x9c, 0x60, 0x8e, 0x8b, 0xc2, - 0xe5, 0x79, 0x6a, 0x35, 0xa8, 0x09, 0x8b, 0xa3, 0x87, 0xef, 0x59, 0x2f, 0x0e, 0x97, 0x67, 0xae, - 0xdb, 0xb0, 0x5e, 0x82, 0x87, 0xf6, 0x59, 0x2f, 0x12, 0x97, 0x67, 0x2e, 0xe3, 0xa0, 0x07, 0x00, - 0xbe, 0x73, 0xf7, 0x0c, 0x17, 0x8b, 0xcb, 0xb3, 0x14, 0x74, 0x90, 0x01, 0xcb, 0x61, 0x07, 0xf2, - 0x79, 0xee, 0x19, 0x97, 0xe7, 0xaa, 0xf3, 0x10, 0x7f, 0x0e, 0x1e, 0xad, 0x67, 0xbb, 0x77, 0x5c, - 0x9e, 0xb1, 0xe0, 0x83, 0x2c, 0x58, 0x09, 0x3d, 0x4e, 0xce, 0x75, 0x0b, 0xb9, 0x3c, 0x5f, 0x11, - 0x08, 0xb5, 0x41, 0x1c, 0x3b, 0x84, 0xce, 0x7c, 0x29, 0xb9, 0x3c, 0x7b, 0x39, 0x88, 0xce, 0x57, - 0xc8, 0x19, 0x75, 0x9e, 0x3b, 0xca, 0xe5, 0xb9, 0xea, 0x43, 0xe8, 0x04, 0xce, 0x84, 0x1f, 0x43, - 0xe7, 0xbb, 0xb1, 0x5c, 0x9e, 0xb3, 0x5c, 0xb4, 0xb3, 0xfd, 0xf9, 0x57, 0x6b, 0xc2, 0x17, 0x5f, - 0xad, 0x09, 0x7f, 0xff, 0x6a, 0x4d, 0xf8, 0xe4, 0xeb, 0xb5, 0xd8, 0x17, 0x5f, 0xaf, 0xc5, 0xfe, - 0xfa, 0xf5, 0x5a, 0xec, 0x87, 0xcf, 0xb6, 0x35, 0xbb, 0x33, 0x38, 0xde, 0x6c, 0xe8, 0xbd, 0xad, - 0x86, 0xde, 0xc3, 0xf6, 0x71, 0xcb, 0xf6, 0x1e, 0xbc, 0xbf, 0x84, 0x8e, 0xd3, 0x34, 0x13, 0xba, - 0xfe, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6f, 0x16, 0x63, 0x09, 0x45, 0x34, 0x00, 0x00, + // 3700 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcd, 0x73, 0x1b, 0xc7, + 0xb1, 0xc7, 0xe2, 0x8b, 0x40, 0xe3, 0x83, 0xcb, 0x21, 0x45, 0x81, 0x90, 0x44, 0x52, 0xeb, 0x27, + 0x5b, 0x96, 0x6c, 0xd2, 0xa6, 0x9e, 0x6c, 0xab, 0x64, 0xbb, 0x8a, 0xa4, 0x20, 0x81, 0x94, 0x4c, + 0xd2, 0x4b, 0x48, 0x7e, 0x7a, 0xef, 0xc5, 0xeb, 0x05, 0x30, 0x00, 0xd6, 0x02, 0xb0, 0x6b, 0xec, + 0x02, 0x06, 0x7d, 0x4a, 0xd9, 0x49, 0x55, 0xca, 0x55, 0xa9, 0x72, 0x55, 0x2e, 0x3e, 0xc4, 0xa9, + 0xca, 0x21, 0x97, 0xfc, 0x05, 0x39, 0xe5, 0xe4, 0x83, 0x0f, 0x39, 0xf8, 0x98, 0x93, 0x93, 0xb2, + 0x6f, 0xbe, 0xe6, 0x90, 0x6b, 0x6a, 0x3e, 0xf6, 0x0b, 0xd8, 0xc5, 0x87, 0xec, 0x1c, 0x52, 0xc9, + 0x6d, 0x67, 0xb6, 0xbb, 0x07, 0xdb, 0xd3, 0x33, 0xfd, 0x9b, 0x5f, 0x0f, 0xe0, 0x82, 0x85, 0xbb, + 0x75, 0xdc, 0xeb, 0x68, 0x5d, 0x6b, 0x5b, 0xad, 0xd6, 0xb4, 0x6d, 0xeb, 0xcc, 0xc0, 0xe6, 0x96, + 0xd1, 0xd3, 0x2d, 0x1d, 0x2d, 0xba, 0x2f, 0xb7, 0xc8, 0xcb, 0xe2, 0x25, 0x8f, 0x74, 0xad, 0x77, + 0x66, 0x58, 0xfa, 0xb6, 0xd1, 0xd3, 0xf5, 0x06, 0x93, 0x2f, 0x5e, 0x1c, 0x7f, 0xfd, 0x04, 0x9f, + 0x71, 0x6b, 0x3e, 0x65, 0x3a, 0xca, 0xb6, 0xa1, 0xf6, 0xd4, 0x8e, 0xfd, 0x7a, 0x73, 0xec, 0xf5, + 0x40, 0x6d, 0x6b, 0x75, 0xd5, 0xd2, 0x7b, 0x5c, 0x62, 0xa3, 0xa9, 0xeb, 0xcd, 0x36, 0xde, 0xa6, + 0xad, 0x6a, 0xbf, 0xb1, 0x6d, 0x69, 0x1d, 0x6c, 0x5a, 0x6a, 0xc7, 0xe0, 0x02, 0x2b, 0x4d, 0xbd, + 0xa9, 0xd3, 0xc7, 0x6d, 0xf2, 0x14, 0x30, 0xae, 0xde, 0x53, 0x6b, 0x6d, 0xec, 0xfd, 0x48, 0xe9, + 0xcb, 0x1c, 0x2c, 0xc8, 0xf8, 0x83, 0x3e, 0x36, 0x2d, 0xb4, 0x03, 0x71, 0x5c, 0x6b, 0xe9, 0x05, + 0x61, 0x53, 0xb8, 0x9a, 0xd9, 0xb9, 0xb8, 0x35, 0xf2, 0xfd, 0x5b, 0x5c, 0xae, 0x54, 0x6b, 0xe9, + 0xe5, 0x88, 0x4c, 0x65, 0xd1, 0x4d, 0x48, 0x34, 0xda, 0x7d, 0xb3, 0x55, 0x88, 0x52, 0xa5, 0x4b, + 0x61, 0x4a, 0x77, 0x89, 0x50, 0x39, 0x22, 0x33, 0x69, 0x32, 0x94, 0xd6, 0x6d, 0xe8, 0x85, 0xd8, + 0xe4, 0xa1, 0x0e, 0xba, 0x0d, 0x3a, 0x14, 0x91, 0x45, 0x7b, 0x00, 0x5a, 0x57, 0xb3, 0x94, 0x5a, + 0x4b, 0xd5, 0xba, 0x85, 0x04, 0xd5, 0xbc, 0x1c, 0xae, 0xa9, 0x59, 0xfb, 0x44, 0xb0, 0x1c, 0x91, + 0xd3, 0x9a, 0xdd, 0x20, 0x3f, 0xf7, 0x83, 0x3e, 0xee, 0x9d, 0x15, 0x92, 0x93, 0x7f, 0xee, 0xdb, + 0x44, 0x88, 0xfc, 0x5c, 0x2a, 0x8d, 0x5e, 0x87, 0x54, 0xad, 0x85, 0x6b, 0x4f, 0x14, 0x6b, 0x58, + 0x48, 0x51, 0xcd, 0x8d, 0x30, 0xcd, 0x7d, 0x22, 0x57, 0x19, 0x96, 0x23, 0xf2, 0x42, 0x8d, 0x3d, + 0xa2, 0xd7, 0x20, 0x59, 0xd3, 0x3b, 0x1d, 0xcd, 0x2a, 0x64, 0xa8, 0xee, 0x7a, 0xa8, 0x2e, 0x95, + 0x2a, 0x47, 0x64, 0x2e, 0x8f, 0x8e, 0x20, 0xdf, 0xd6, 0x4c, 0x4b, 0x31, 0xbb, 0xaa, 0x61, 0xb6, + 0x74, 0xcb, 0x2c, 0x64, 0xa9, 0x85, 0x2b, 0x61, 0x16, 0x1e, 0x68, 0xa6, 0x75, 0x6a, 0x0b, 0x97, + 0x23, 0x72, 0xae, 0xed, 0xed, 0x20, 0xf6, 0xf4, 0x46, 0x03, 0xf7, 0x1c, 0x83, 0x85, 0xdc, 0x64, + 0x7b, 0xc7, 0x44, 0xda, 0xd6, 0x27, 0xf6, 0x74, 0x6f, 0x07, 0xfa, 0x3f, 0x58, 0x6e, 0xeb, 0x6a, + 0xdd, 0x31, 0xa7, 0xd4, 0x5a, 0xfd, 0xee, 0x93, 0x42, 0x9e, 0x1a, 0x7d, 0x3e, 0xf4, 0x47, 0xea, + 0x6a, 0xdd, 0x36, 0xb1, 0x4f, 0x14, 0xca, 0x11, 0x79, 0xa9, 0x3d, 0xda, 0x89, 0xde, 0x85, 0x15, + 0xd5, 0x30, 0xda, 0x67, 0xa3, 0xd6, 0x17, 0xa9, 0xf5, 0x6b, 0x61, 0xd6, 0x77, 0x89, 0xce, 0xa8, + 0x79, 0xa4, 0x8e, 0xf5, 0xa2, 0x0a, 0x88, 0x46, 0x0f, 0x1b, 0x6a, 0x0f, 0x2b, 0x46, 0x4f, 0x37, + 0x74, 0x53, 0x6d, 0x17, 0x44, 0x6a, 0xfb, 0xb9, 0x30, 0xdb, 0x27, 0x4c, 0xfe, 0x84, 0x8b, 0x97, + 0x23, 0xf2, 0xa2, 0xe1, 0xef, 0x62, 0x56, 0xf5, 0x1a, 0x36, 0x4d, 0xd7, 0xea, 0xd2, 0x34, 0xab, + 0x54, 0xde, 0x6f, 0xd5, 0xd7, 0x85, 0x4a, 0x90, 0xc1, 0x43, 0xa2, 0xae, 0x0c, 0x74, 0x0b, 0x17, + 0x10, 0x35, 0x28, 0x85, 0xae, 0x50, 0x2a, 0xfa, 0x48, 0xb7, 0x70, 0x39, 0x22, 0x03, 0x76, 0x5a, + 0x48, 0x85, 0x73, 0x03, 0xdc, 0xd3, 0x1a, 0x67, 0xd4, 0x8c, 0x42, 0xdf, 0x98, 0x9a, 0xde, 0x2d, + 0x2c, 0x53, 0x83, 0xd7, 0xc3, 0x0c, 0x3e, 0xa2, 0x4a, 0xc4, 0x44, 0xc9, 0x56, 0x29, 0x47, 0xe4, + 0xe5, 0xc1, 0x78, 0x37, 0x09, 0xb1, 0x86, 0xd6, 0x55, 0xdb, 0xda, 0x47, 0x58, 0xa9, 0xb6, 0xf5, + 0xda, 0x93, 0xc2, 0xca, 0xe4, 0x10, 0xbb, 0xcb, 0xa5, 0xf7, 0x88, 0x30, 0x09, 0xb1, 0x86, 0xb7, + 0x03, 0x61, 0x38, 0x5f, 0xeb, 0x61, 0xd5, 0xc2, 0x0a, 0xdb, 0xbd, 0x94, 0x1e, 0x36, 0xfb, 0x6d, + 0x8b, 0xac, 0xc4, 0x73, 0xd4, 0xf0, 0x0b, 0xa1, 0xab, 0x89, 0xaa, 0x1d, 0x53, 0x2d, 0x99, 0x2a, + 0xd1, 0x65, 0xb9, 0x52, 0x0b, 0xe8, 0x47, 0xff, 0x03, 0xa8, 0x81, 0xad, 0x5a, 0xcb, 0x1e, 0x85, + 0xf8, 0xc7, 0x2c, 0xac, 0xd2, 0x11, 0xae, 0x86, 0xfe, 0x74, 0xa2, 0xc1, 0x0c, 0x11, 0x27, 0x90, + 0x05, 0x27, 0x36, 0x46, 0xfa, 0xa8, 0xcf, 0xd9, 0x56, 0x8e, 0xfd, 0xc6, 0xcf, 0x4f, 0xf1, 0x39, + 0x57, 0xf2, 0xdb, 0x5f, 0x1e, 0x8c, 0x77, 0xa3, 0x16, 0x14, 0xea, 0x3a, 0x36, 0x47, 0x3c, 0x84, + 0x87, 0x9a, 0x69, 0x15, 0x0a, 0x74, 0x94, 0x17, 0xc3, 0x46, 0xb9, 0xa3, 0x63, 0xd3, 0xeb, 0x8a, + 0x12, 0x51, 0x2a, 0x47, 0xe4, 0x73, 0xf5, 0xa0, 0x17, 0xa8, 0x0f, 0x97, 0xe8, 0x48, 0x66, 0xbf, + 0xaa, 0xd6, 0x6a, 0x7a, 0xbf, 0x6b, 0x29, 0x55, 0xdc, 0xd6, 0xbb, 0x4d, 0xc5, 0xd2, 0x95, 0x81, + 0xda, 0x2e, 0xac, 0xd1, 0xe1, 0x5e, 0x9e, 0x34, 0xdc, 0xa9, 0xa3, 0xbb, 0x47, 0x55, 0x2b, 0xfa, + 0x23, 0x1a, 0xf4, 0x6b, 0xf5, 0xb0, 0x97, 0x7b, 0x0b, 0x90, 0x18, 0xa8, 0xed, 0x3e, 0x3e, 0x8c, + 0xa7, 0xe2, 0x62, 0xe2, 0x30, 0x9e, 0x5a, 0x10, 0x53, 0x87, 0xf1, 0x54, 0x5a, 0x84, 0xc3, 0x78, + 0x0a, 0xc4, 0x8c, 0xf4, 0x1c, 0x64, 0x3c, 0xd9, 0x09, 0x15, 0x60, 0xa1, 0x83, 0x4d, 0x53, 0x6d, + 0x62, 0x9a, 0xcc, 0xd2, 0xb2, 0xdd, 0x94, 0xf2, 0x90, 0xf5, 0x66, 0x24, 0xe9, 0x33, 0xc1, 0xd1, + 0x24, 0xc9, 0x86, 0x68, 0x0e, 0x70, 0x8f, 0xae, 0x09, 0xae, 0xc9, 0x9b, 0xe8, 0x19, 0xc8, 0xd1, + 0x78, 0x56, 0xec, 0xf7, 0x24, 0xe3, 0xc5, 0xe5, 0x2c, 0xed, 0x7c, 0xc4, 0x85, 0x36, 0x20, 0x63, + 0xec, 0x18, 0x8e, 0x48, 0x8c, 0x8a, 0x80, 0xb1, 0x63, 0xd8, 0x02, 0x97, 0x21, 0x4b, 0xfc, 0xe1, + 0x48, 0xc4, 0xe9, 0x20, 0x19, 0xd2, 0xc7, 0x45, 0xa4, 0x3f, 0x45, 0x41, 0x1c, 0xcd, 0x62, 0xe8, + 0x35, 0x88, 0x93, 0x7c, 0xcf, 0x73, 0x73, 0x71, 0x8b, 0x81, 0x81, 0x2d, 0x1b, 0x0c, 0x6c, 0x55, + 0x6c, 0x30, 0xb0, 0x97, 0xfa, 0xea, 0x9b, 0x8d, 0xc8, 0x67, 0x7f, 0xd9, 0x10, 0x64, 0xaa, 0x81, + 0xd6, 0x48, 0xee, 0x52, 0xb5, 0xae, 0xa2, 0xd5, 0xe9, 0x4f, 0x4e, 0x93, 0xc4, 0xa4, 0x6a, 0xdd, + 0x83, 0x3a, 0x7a, 0x00, 0x62, 0x4d, 0xef, 0x9a, 0xb8, 0x6b, 0xf6, 0x4d, 0x85, 0xc1, 0x11, 0x9e, + 0x91, 0x7d, 0x79, 0x95, 0xe1, 0x85, 0x7d, 0x5b, 0xf2, 0x84, 0x0a, 0xca, 0x8b, 0x35, 0x7f, 0x07, + 0xba, 0x0b, 0xe0, 0x60, 0x16, 0xb3, 0x10, 0xdf, 0x8c, 0x5d, 0xcd, 0xec, 0x6c, 0x8e, 0x05, 0xc2, + 0x23, 0x5b, 0xe4, 0xa1, 0x41, 0xc2, 0x78, 0x2f, 0x4e, 0x7e, 0xae, 0xec, 0xd1, 0x44, 0xcf, 0xc2, + 0xa2, 0x6a, 0x18, 0x8a, 0x69, 0x91, 0x15, 0x53, 0x3d, 0x23, 0x4b, 0x85, 0x24, 0xfb, 0xac, 0x9c, + 0x53, 0x0d, 0xe3, 0x94, 0xf4, 0xee, 0x91, 0x4e, 0x74, 0x05, 0xf2, 0x24, 0xb1, 0x6b, 0x6a, 0x5b, + 0x69, 0x61, 0xad, 0xd9, 0xb2, 0x68, 0x52, 0x8f, 0xc9, 0x39, 0xde, 0x5b, 0xa6, 0x9d, 0x52, 0xdd, + 0x99, 0x71, 0x9a, 0xd4, 0x11, 0x82, 0x78, 0x5d, 0xb5, 0x54, 0xea, 0xc9, 0xac, 0x4c, 0x9f, 0x49, + 0x9f, 0xa1, 0x5a, 0x2d, 0xee, 0x1f, 0xfa, 0x8c, 0x56, 0x21, 0xc9, 0xcd, 0xc6, 0xa8, 0x59, 0xde, + 0x42, 0x2b, 0x90, 0x30, 0x7a, 0xfa, 0x00, 0xd3, 0xa9, 0x4b, 0xc9, 0xac, 0x21, 0xc9, 0x90, 0xf7, + 0x03, 0x00, 0x94, 0x87, 0xa8, 0x35, 0xe4, 0xa3, 0x44, 0xad, 0x21, 0x7a, 0x09, 0xe2, 0xc4, 0x91, + 0x74, 0x8c, 0x7c, 0x00, 0xe4, 0xe1, 0x7a, 0x95, 0x33, 0x03, 0xcb, 0x54, 0x52, 0x5a, 0x84, 0x9c, + 0x0f, 0x18, 0x48, 0xab, 0xb0, 0x12, 0x94, 0xe7, 0xa5, 0x96, 0xd3, 0xef, 0xcb, 0xd7, 0xe8, 0x26, + 0xa4, 0x9c, 0x44, 0xcf, 0x02, 0x67, 0x6d, 0x6c, 0x58, 0x5b, 0x58, 0x76, 0x44, 0x49, 0xc4, 0x90, + 0x09, 0x68, 0xa9, 0x1c, 0xd6, 0x65, 0xe5, 0x05, 0xd5, 0x30, 0xca, 0xaa, 0xd9, 0x92, 0xde, 0x83, + 0x42, 0x58, 0x12, 0xf7, 0x38, 0x4c, 0xa0, 0x61, 0x6f, 0x3b, 0x6c, 0x15, 0x92, 0x0d, 0xbd, 0xd7, + 0x51, 0x2d, 0x6a, 0x2c, 0x27, 0xf3, 0x16, 0x71, 0x24, 0x4b, 0xe8, 0x31, 0xda, 0xcd, 0x1a, 0x92, + 0x02, 0x6b, 0xa1, 0x89, 0x9c, 0xa8, 0x68, 0xdd, 0x3a, 0x66, 0x6e, 0xcd, 0xc9, 0xac, 0xe1, 0x1a, + 0x62, 0x3f, 0x96, 0x35, 0xc8, 0xb0, 0x26, 0xfd, 0x56, 0x6a, 0x3f, 0x2d, 0xf3, 0x96, 0xf4, 0x79, + 0x0c, 0x56, 0x83, 0xd3, 0x39, 0xda, 0x84, 0x6c, 0x47, 0x1d, 0x2a, 0xd6, 0x90, 0x87, 0x9d, 0x40, + 0x27, 0x1e, 0x3a, 0xea, 0xb0, 0x32, 0x64, 0x31, 0x27, 0x42, 0xcc, 0x1a, 0x9a, 0x85, 0xe8, 0x66, + 0xec, 0x6a, 0x56, 0x26, 0x8f, 0xe8, 0x21, 0x2c, 0xb5, 0xf5, 0x9a, 0xda, 0x56, 0xda, 0xaa, 0x69, + 0x29, 0x1c, 0xe7, 0xb1, 0x45, 0xf4, 0xcc, 0x98, 0xb3, 0x59, 0x62, 0xc6, 0x75, 0x36, 0x9f, 0x64, + 0xc3, 0xe1, 0xf1, 0xbf, 0x48, 0x6d, 0x3c, 0x50, 0xed, 0xa9, 0x46, 0x77, 0x20, 0xd3, 0xd1, 0xcc, + 0x2a, 0x6e, 0xa9, 0x03, 0x4d, 0xef, 0xf1, 0xd5, 0x34, 0x1e, 0x34, 0x6f, 0xb9, 0x32, 0xdc, 0x92, + 0x57, 0xcd, 0x33, 0x25, 0x09, 0x5f, 0x0c, 0xdb, 0xbb, 0x49, 0x72, 0xee, 0xdd, 0xe4, 0x25, 0x58, + 0xe9, 0xe2, 0xa1, 0xa5, 0xb8, 0xeb, 0x95, 0xc5, 0xc9, 0x02, 0x75, 0x3d, 0x22, 0xef, 0x9c, 0x15, + 0x6e, 0x92, 0x90, 0x41, 0xcf, 0x53, 0x40, 0x64, 0xe8, 0x26, 0xee, 0x29, 0x6a, 0xbd, 0xde, 0xc3, + 0xa6, 0x49, 0x31, 0x74, 0x96, 0xa2, 0x1c, 0xda, 0xbf, 0xcb, 0xba, 0xa5, 0x5f, 0x78, 0xa7, 0xc6, + 0x0f, 0x80, 0xb8, 0xe3, 0x05, 0xd7, 0xf1, 0xa7, 0xb0, 0xc2, 0xf5, 0xeb, 0x3e, 0xdf, 0xb3, 0x83, + 0xc8, 0x85, 0xf1, 0xf5, 0x35, 0xea, 0x73, 0x64, 0xab, 0x87, 0xbb, 0x3d, 0xf6, 0x74, 0x6e, 0x47, + 0x10, 0xa7, 0x4e, 0x89, 0xb3, 0x2d, 0x86, 0x3c, 0xff, 0xab, 0x4d, 0xc5, 0x27, 0x31, 0x58, 0x1a, + 0x43, 0x93, 0xce, 0x87, 0x09, 0x81, 0x1f, 0x16, 0x0d, 0xfc, 0xb0, 0xd8, 0xdc, 0x1f, 0xc6, 0xe7, + 0x3a, 0x3e, 0x7d, 0xae, 0x13, 0x3f, 0xe2, 0x5c, 0x27, 0x9f, 0x6e, 0xae, 0xff, 0xa9, 0xb3, 0xf0, + 0x6b, 0x01, 0x8a, 0xe1, 0x10, 0x3c, 0x70, 0x3a, 0xae, 0xc3, 0x92, 0xf3, 0x53, 0x1c, 0xf3, 0x6c, + 0x63, 0x14, 0x9d, 0x17, 0xdc, 0x7e, 0x68, 0x8e, 0xbb, 0x02, 0xf9, 0x91, 0x03, 0x02, 0x0b, 0xe5, + 0xdc, 0xc0, 0x3b, 0xbe, 0xf4, 0xb3, 0x98, 0x93, 0x78, 0x7c, 0x28, 0x3e, 0x60, 0xb5, 0xbe, 0x0d, + 0xcb, 0x75, 0x5c, 0xd3, 0xea, 0x4f, 0xbb, 0x58, 0x97, 0xb8, 0xf6, 0x7f, 0xd6, 0xea, 0x78, 0x94, + 0x7c, 0x2c, 0xc0, 0x85, 0x09, 0x67, 0x1e, 0x54, 0x84, 0x94, 0xad, 0xc2, 0x43, 0xc5, 0x69, 0xa3, + 0x7b, 0x90, 0x6f, 0xea, 0xa6, 0xa9, 0x19, 0xb8, 0xce, 0x8f, 0x25, 0xd1, 0x71, 0xe0, 0xc6, 0xce, + 0x15, 0x5b, 0xf7, 0xb8, 0x20, 0x3d, 0x74, 0xc8, 0xb9, 0xa6, 0xb7, 0x29, 0xad, 0xc1, 0xf9, 0x90, + 0x53, 0x91, 0x74, 0xcb, 0x0d, 0xe2, 0x80, 0xc3, 0xcb, 0x05, 0x48, 0xf3, 0x73, 0x8b, 0x03, 0x97, + 0x52, 0xac, 0xa3, 0x32, 0x94, 0x5e, 0x82, 0x8b, 0x93, 0x0e, 0x2a, 0x24, 0xd0, 0x9e, 0xe0, 0x33, + 0x0e, 0xd5, 0xc9, 0xa3, 0xf4, 0x3a, 0x6c, 0x4e, 0x3b, 0x6b, 0x10, 0x90, 0x6f, 0xbb, 0x54, 0xe0, + 0xf8, 0x86, 0xbb, 0xf2, 0x37, 0x79, 0x48, 0xc9, 0xd8, 0x34, 0x08, 0xb4, 0x45, 0x7b, 0x90, 0xc6, + 0xc3, 0x1a, 0x36, 0x2c, 0xfb, 0x34, 0x10, 0x7c, 0xe4, 0x66, 0xd2, 0x25, 0x5b, 0xb2, 0x1c, 0x91, + 0x5d, 0x35, 0x74, 0x83, 0x73, 0x6a, 0xe1, 0xf4, 0x18, 0x57, 0xf7, 0x92, 0x6a, 0xaf, 0xd8, 0xa4, + 0x5a, 0x2c, 0x94, 0x2f, 0x62, 0x5a, 0x23, 0xac, 0xda, 0x0d, 0xce, 0xaa, 0xc5, 0xa7, 0x0c, 0xe6, + 0xa3, 0xd5, 0xf6, 0x7d, 0xb4, 0x5a, 0x72, 0xca, 0x67, 0x86, 0xf0, 0x6a, 0xaf, 0xd8, 0xbc, 0xda, + 0xc2, 0x94, 0x5f, 0x3c, 0x42, 0xac, 0xbd, 0xe1, 0x21, 0xd6, 0xd2, 0x54, 0x75, 0x33, 0x54, 0x35, + 0x80, 0x59, 0xbb, 0xe5, 0x30, 0x6b, 0xd9, 0x50, 0x56, 0x8e, 0x2b, 0x8f, 0x52, 0x6b, 0xc7, 0x63, + 0xd4, 0x1a, 0xa3, 0xc2, 0x9e, 0x0d, 0x35, 0x31, 0x85, 0x5b, 0x3b, 0x1e, 0xe3, 0xd6, 0xf2, 0x53, + 0x0c, 0x4e, 0x21, 0xd7, 0xfe, 0x3f, 0x98, 0x5c, 0x0b, 0xa7, 0xbf, 0xf8, 0xcf, 0x9c, 0x8d, 0x5d, + 0x53, 0x42, 0xd8, 0x35, 0x31, 0x94, 0x95, 0x60, 0xe6, 0x67, 0xa6, 0xd7, 0x1e, 0x06, 0xd0, 0x6b, + 0x4b, 0xa1, 0x7c, 0x0a, 0x33, 0x3e, 0x03, 0xbf, 0xf6, 0x30, 0x80, 0x5f, 0x43, 0x53, 0xcd, 0x4e, + 0x25, 0xd8, 0xee, 0xfa, 0x09, 0xb6, 0xe5, 0x10, 0x00, 0xef, 0xae, 0xf6, 0x10, 0x86, 0xad, 0x1a, + 0xc6, 0xb0, 0xad, 0x84, 0x92, 0x55, 0xcc, 0xe2, 0x1c, 0x14, 0xdb, 0xf1, 0x18, 0xc5, 0x76, 0x6e, + 0x4a, 0xa4, 0x4d, 0xe1, 0xd8, 0x1a, 0xe1, 0x1c, 0xdb, 0x6a, 0x28, 0x7d, 0xc4, 0xd7, 0xd5, 0x3c, + 0x24, 0xdb, 0xe3, 0x40, 0x92, 0xed, 0x7c, 0x28, 0x5b, 0xcc, 0x7f, 0xfc, 0x2c, 0x2c, 0x5b, 0x35, + 0x8c, 0x65, 0x2b, 0x4c, 0xf3, 0xfb, 0xec, 0x34, 0x9b, 0x36, 0x81, 0x66, 0x63, 0xbc, 0xd7, 0x56, + 0xe8, 0x30, 0x73, 0xf2, 0x6c, 0x83, 0x69, 0x3c, 0x5b, 0x91, 0x8e, 0xb7, 0x33, 0x71, 0xbc, 0x1f, + 0x46, 0xb4, 0x25, 0xc4, 0xe4, 0x61, 0x3c, 0x95, 0x12, 0xd3, 0x8c, 0x62, 0x3b, 0x8c, 0xa7, 0x32, + 0x62, 0x56, 0x7a, 0x9e, 0x1c, 0x0b, 0x46, 0x32, 0x1e, 0x39, 0x80, 0xe3, 0x5e, 0x4f, 0xef, 0xf1, + 0x3c, 0xcc, 0x1a, 0xd2, 0x55, 0xc8, 0x7a, 0xb3, 0xdb, 0x04, 0x52, 0x8e, 0x12, 0x1d, 0x9e, 0x8c, + 0x26, 0xfd, 0x41, 0x70, 0x75, 0x29, 0x2d, 0xe7, 0x25, 0x6d, 0xd2, 0x9c, 0xb4, 0xf1, 0x50, 0x75, + 0x51, 0x3f, 0x55, 0xb7, 0x01, 0x19, 0xd5, 0x18, 0x63, 0xe1, 0x54, 0xc3, 0x61, 0xe1, 0xae, 0xc1, + 0x12, 0x45, 0xa1, 0x8c, 0xd0, 0xe3, 0x58, 0x2f, 0x4e, 0xb1, 0xde, 0x22, 0x79, 0xc1, 0xd6, 0x09, + 0x03, 0x7d, 0x2f, 0xc2, 0xb2, 0x47, 0xd6, 0x21, 0x46, 0x18, 0x25, 0x25, 0x3a, 0xd2, 0xbb, 0x9c, + 0x21, 0xf9, 0x52, 0x70, 0x3d, 0xe4, 0xd2, 0x77, 0x41, 0x4c, 0x9b, 0xf0, 0x23, 0x31, 0x6d, 0xd1, + 0xa7, 0x66, 0xda, 0xbc, 0x44, 0x4f, 0xcc, 0x4f, 0xf4, 0xfc, 0x5d, 0x70, 0xe7, 0xc4, 0xe1, 0xcd, + 0x6a, 0x7a, 0x1d, 0x73, 0xea, 0x85, 0x3e, 0x13, 0xf8, 0xd5, 0xd6, 0x9b, 0x9c, 0x60, 0x21, 0x8f, + 0x44, 0xca, 0x81, 0x20, 0x69, 0x8e, 0x30, 0x1c, 0xd6, 0x86, 0xa1, 0x69, 0xce, 0xda, 0x70, 0xe8, + 0x96, 0xa4, 0xe3, 0x92, 0x47, 0x22, 0x47, 0x83, 0x8f, 0xa3, 0x62, 0xd6, 0x40, 0xaf, 0x41, 0x9a, + 0x56, 0x59, 0x15, 0xdd, 0x30, 0x79, 0xf1, 0xcd, 0x77, 0x5e, 0x60, 0xa5, 0xd6, 0xad, 0x13, 0x22, + 0x73, 0x6c, 0x98, 0x14, 0xdb, 0xd2, 0x27, 0x0f, 0x8c, 0x4f, 0xfb, 0x60, 0xfc, 0x45, 0x48, 0x93, + 0x5f, 0x6f, 0x1a, 0x6a, 0x0d, 0x17, 0x80, 0xfe, 0x50, 0xb7, 0x43, 0xfa, 0x7d, 0x14, 0x16, 0x47, + 0x20, 0x47, 0xe0, 0xb7, 0xdb, 0x21, 0x19, 0xf5, 0xf0, 0x88, 0xb3, 0xf9, 0x63, 0x1d, 0xa0, 0xa9, + 0x9a, 0xca, 0x87, 0x6a, 0xd7, 0xc2, 0x75, 0xee, 0x14, 0x4f, 0x0f, 0xc1, 0xeb, 0xa4, 0xd5, 0x37, + 0x71, 0x9d, 0x53, 0x9a, 0x4e, 0x1b, 0x95, 0x21, 0x89, 0x07, 0xb8, 0x6b, 0x99, 0x85, 0x05, 0x3a, + 0xed, 0xab, 0xe3, 0x1c, 0x13, 0x79, 0xbd, 0x57, 0x20, 0x93, 0xfd, 0xfd, 0x37, 0x1b, 0x22, 0x93, + 0x7e, 0x41, 0xef, 0x68, 0x16, 0xee, 0x18, 0xd6, 0x99, 0xcc, 0xf5, 0xfd, 0x5e, 0x48, 0x8d, 0x78, + 0x81, 0x92, 0xeb, 0x59, 0x9b, 0x33, 0x23, 0x3e, 0xd5, 0xf4, 0x9e, 0x66, 0x9d, 0xc9, 0xb9, 0x0e, + 0xee, 0x18, 0xba, 0xde, 0x56, 0xd8, 0x1a, 0xdf, 0x85, 0xbc, 0x1f, 0x61, 0xa1, 0x67, 0x20, 0xd7, + 0xc3, 0x96, 0xaa, 0x75, 0x15, 0xdf, 0xc9, 0x32, 0xcb, 0x3a, 0xd9, 0x9a, 0x3a, 0x8c, 0xa7, 0x04, + 0x31, 0x7a, 0x18, 0x4f, 0x45, 0xc5, 0x98, 0x74, 0x02, 0xe7, 0x02, 0x11, 0x16, 0x7a, 0x15, 0xd2, + 0x2e, 0x38, 0x13, 0xe8, 0xd7, 0x4e, 0xa0, 0x2f, 0x5d, 0x59, 0xe9, 0x8f, 0x82, 0x6b, 0xd2, 0x4f, + 0x88, 0x96, 0x20, 0xc9, 0x76, 0x6d, 0x3a, 0x93, 0xf9, 0x09, 0x79, 0xcd, 0xa7, 0xb7, 0xc5, 0xb6, + 0x66, 0x99, 0x2b, 0x4b, 0xef, 0x42, 0x92, 0xf5, 0xa0, 0x0c, 0x2c, 0x3c, 0x3c, 0xba, 0x7f, 0x74, + 0xfc, 0xce, 0x91, 0x18, 0x41, 0x00, 0xc9, 0xdd, 0xfd, 0xfd, 0xd2, 0x49, 0x45, 0x14, 0x50, 0x1a, + 0x12, 0xbb, 0x7b, 0xc7, 0x72, 0x45, 0x8c, 0x92, 0x6e, 0xb9, 0x74, 0x58, 0xda, 0xaf, 0x88, 0x31, + 0xb4, 0x04, 0x39, 0xf6, 0xac, 0xdc, 0x3d, 0x96, 0xdf, 0xda, 0xad, 0x88, 0x71, 0x4f, 0xd7, 0x69, + 0xe9, 0xe8, 0x4e, 0x49, 0x16, 0x13, 0xd2, 0xcb, 0xb0, 0x16, 0x8a, 0xe6, 0x5c, 0xb6, 0x53, 0xf0, + 0xb0, 0x9d, 0xd2, 0xe7, 0x51, 0x72, 0xc8, 0x0a, 0x83, 0x68, 0xe8, 0x70, 0xe4, 0xc3, 0x77, 0xe6, + 0xc0, 0x77, 0x23, 0x5f, 0x8f, 0xae, 0x40, 0xbe, 0x87, 0x59, 0x1e, 0xa7, 0x63, 0xb3, 0x1d, 0x28, + 0x27, 0xe7, 0x78, 0x2f, 0x55, 0x32, 0x99, 0xd8, 0xfb, 0xb8, 0x66, 0x29, 0x2c, 0x88, 0x4c, 0x7a, + 0x42, 0x4f, 0x13, 0x31, 0xd2, 0x7b, 0xca, 0x3a, 0xa5, 0xf7, 0xe6, 0xf2, 0x65, 0x1a, 0x12, 0x72, + 0xa9, 0x22, 0x3f, 0x16, 0x63, 0x08, 0x41, 0x9e, 0x3e, 0x2a, 0xa7, 0x47, 0xbb, 0x27, 0xa7, 0xe5, + 0x63, 0xe2, 0xcb, 0x65, 0x58, 0xb4, 0x7d, 0x69, 0x77, 0x26, 0xa4, 0xeb, 0xe4, 0x64, 0x1a, 0x88, + 0x2f, 0xc7, 0x79, 0x0a, 0xe9, 0xb7, 0x82, 0x57, 0xda, 0x8f, 0x11, 0x8f, 0x21, 0x69, 0x5a, 0xaa, + 0xd5, 0x37, 0xb9, 0x13, 0x5f, 0x9d, 0x15, 0x70, 0x6e, 0xd9, 0x0f, 0xa7, 0x54, 0x5d, 0xe6, 0x66, + 0xa4, 0x9b, 0x90, 0xf7, 0xbf, 0x09, 0xf7, 0x81, 0x1b, 0x44, 0x51, 0xe9, 0x36, 0xa0, 0x71, 0x1c, + 0x1a, 0xc0, 0xd9, 0x08, 0x41, 0x9c, 0xcd, 0xef, 0x28, 0x59, 0x10, 0x8a, 0x39, 0xd1, 0xdb, 0x23, + 0x1f, 0x79, 0x6b, 0x1e, 0xc4, 0xba, 0xc5, 0xfa, 0x46, 0x3e, 0xf3, 0x06, 0x64, 0xbd, 0xfd, 0xb3, + 0x7d, 0xe4, 0xf7, 0x51, 0x77, 0x11, 0xfb, 0xc9, 0x25, 0x77, 0x0b, 0x14, 0x7e, 0xe0, 0x16, 0xf8, + 0x3a, 0x80, 0x35, 0xe4, 0x38, 0xce, 0xce, 0xa3, 0x97, 0x02, 0x48, 0x7b, 0x5c, 0xab, 0x0c, 0xf9, + 0x22, 0x48, 0x5b, 0xfc, 0xc9, 0x44, 0xa7, 0x5e, 0xa6, 0xad, 0x4f, 0x73, 0xac, 0xc9, 0x59, 0xa8, + 0x59, 0x93, 0xb1, 0xcb, 0xc8, 0xb1, 0x6e, 0x13, 0x3d, 0x86, 0xf3, 0x23, 0x40, 0xc1, 0x31, 0x1d, + 0x9f, 0x15, 0x2f, 0x9c, 0xf3, 0xe3, 0x05, 0xdb, 0xb4, 0x37, 0xdb, 0x27, 0xfc, 0xd9, 0xfe, 0x0d, + 0xb8, 0x38, 0x09, 0xd0, 0xa3, 0x4b, 0x00, 0xb8, 0x4b, 0x92, 0x43, 0xdd, 0x25, 0x69, 0xd2, 0xbc, + 0xa7, 0x32, 0x94, 0xee, 0x41, 0x21, 0x0c, 0xac, 0xa3, 0xeb, 0x10, 0xa7, 0x27, 0x2a, 0x86, 0x76, + 0xce, 0x07, 0xd0, 0x4a, 0x44, 0x4e, 0xa6, 0x42, 0xd2, 0x2f, 0xbd, 0xc1, 0x19, 0x80, 0xc0, 0xef, + 0x8f, 0x04, 0xe7, 0x8d, 0x79, 0x60, 0xfd, 0xd6, 0x48, 0x58, 0x5e, 0x86, 0x24, 0x0f, 0x48, 0x12, + 0x83, 0x7b, 0xa7, 0xa5, 0xa3, 0x8a, 0x18, 0x21, 0xc1, 0x79, 0x22, 0x97, 0x68, 0x43, 0x90, 0xde, + 0x84, 0x4b, 0x13, 0x01, 0x3c, 0x71, 0x0c, 0xc5, 0xe9, 0xec, 0x10, 0x20, 0xd0, 0x8a, 0x60, 0x9a, + 0xf4, 0xd0, 0xd7, 0xd2, 0xfb, 0x70, 0x79, 0x2a, 0x20, 0x47, 0xff, 0x05, 0x79, 0x86, 0xed, 0x4d, + 0x1b, 0xdc, 0x33, 0x3b, 0x59, 0xde, 0xcb, 0xa4, 0x36, 0x20, 0x33, 0x50, 0xdb, 0x3e, 0x46, 0x37, + 0x4d, 0xc1, 0x9c, 0xcd, 0x02, 0x3e, 0x06, 0x70, 0x59, 0x53, 0x92, 0x25, 0x7a, 0x7a, 0xbf, 0x5b, + 0xa7, 0xb6, 0x12, 0x32, 0x6b, 0xa0, 0x9b, 0x90, 0xf0, 0x92, 0x7c, 0xe3, 0xe9, 0x94, 0x38, 0xca, + 0xc3, 0xba, 0x32, 0x69, 0x49, 0x03, 0x34, 0x5e, 0xb9, 0x0a, 0x19, 0xe2, 0x0d, 0xff, 0x10, 0x97, + 0x43, 0x6b, 0x60, 0xc1, 0x43, 0x7d, 0x04, 0x09, 0xba, 0x7a, 0x09, 0x70, 0xa2, 0xe5, 0x52, 0x8e, + 0xf8, 0xc9, 0x33, 0xfa, 0x09, 0x80, 0x6a, 0x59, 0x3d, 0xad, 0xda, 0x77, 0x07, 0xd8, 0x08, 0x5e, + 0xfd, 0xbb, 0xb6, 0xdc, 0xde, 0x45, 0xbe, 0x0d, 0xac, 0xb8, 0xaa, 0x9e, 0xad, 0xc0, 0x63, 0x50, + 0x3a, 0x82, 0xbc, 0x5f, 0x77, 0x9c, 0x5e, 0x74, 0x31, 0x2a, 0x9b, 0x00, 0x8e, 0x51, 0x1d, 0x84, + 0x1b, 0x63, 0x35, 0x61, 0xda, 0x90, 0x7e, 0x1a, 0x85, 0xac, 0x77, 0xf3, 0xf8, 0xf7, 0x83, 0x91, + 0xd2, 0xcf, 0x05, 0x48, 0x39, 0x9f, 0xef, 0x2f, 0x10, 0xfb, 0x2a, 0xea, 0xcc, 0x7b, 0x51, 0x6f, + 0x55, 0x97, 0xd5, 0xcf, 0x63, 0x4e, 0xfd, 0xfc, 0xb6, 0x03, 0x61, 0xc2, 0xe8, 0x4d, 0xaf, 0xaf, + 0x79, 0x54, 0xd9, 0x88, 0xed, 0x36, 0xa4, 0x9d, 0x1d, 0x38, 0x9c, 0xfe, 0xa5, 0xb5, 0x7d, 0xfd, + 0x43, 0x5e, 0x32, 0x8e, 0xc9, 0xac, 0x21, 0xd5, 0x61, 0x71, 0x64, 0xfb, 0x46, 0xb7, 0x61, 0xc1, + 0xe8, 0x57, 0x15, 0x3b, 0x38, 0x46, 0xea, 0x0e, 0xf6, 0x91, 0xa4, 0x5f, 0x6d, 0x6b, 0xb5, 0xfb, + 0xf8, 0xcc, 0xfe, 0x31, 0x46, 0xbf, 0x7a, 0x9f, 0xc5, 0x10, 0x1b, 0x25, 0xea, 0x1d, 0xe5, 0x57, + 0x02, 0xa4, 0xec, 0x35, 0x81, 0xde, 0x84, 0xb4, 0x93, 0x1a, 0x9c, 0x3b, 0x1f, 0xa1, 0x39, 0x85, + 0xdb, 0x77, 0x55, 0xd0, 0xae, 0x7d, 0x59, 0x45, 0xab, 0x2b, 0x8d, 0xb6, 0xca, 0x62, 0x29, 0xef, + 0xf7, 0x19, 0x4b, 0x1e, 0x34, 0xa7, 0x1e, 0xdc, 0xb9, 0xdb, 0x56, 0x9b, 0x72, 0x86, 0xea, 0x1c, + 0xd4, 0x49, 0x83, 0xa3, 0xf3, 0xbf, 0x09, 0x20, 0x8e, 0xae, 0xd8, 0x1f, 0xfc, 0xeb, 0xc6, 0xa1, + 0x4a, 0x2c, 0x00, 0xaa, 0xa0, 0x6d, 0x58, 0x76, 0x24, 0x14, 0x53, 0x6b, 0x76, 0x55, 0xab, 0xdf, + 0xc3, 0xbc, 0x52, 0x83, 0x9c, 0x57, 0xa7, 0xf6, 0x9b, 0xf1, 0xaf, 0x4e, 0x3c, 0xe5, 0x57, 0x7f, + 0x12, 0x85, 0x8c, 0xa7, 0x6e, 0x84, 0xfe, 0xdb, 0xb3, 0x19, 0xe5, 0x03, 0xb2, 0xbb, 0x47, 0xd6, + 0xbd, 0xbf, 0xe1, 0x77, 0x53, 0x74, 0x7e, 0x37, 0x85, 0x55, 0xe7, 0xec, 0x32, 0x54, 0x7c, 0xee, + 0x32, 0xd4, 0x0b, 0x80, 0x2c, 0xdd, 0x52, 0xdb, 0xca, 0x40, 0xb7, 0xb4, 0x6e, 0x53, 0x61, 0x61, + 0xc8, 0xb6, 0x0e, 0x91, 0xbe, 0x79, 0x44, 0x5f, 0x9c, 0xd0, 0x88, 0xfc, 0x58, 0x80, 0x94, 0x73, + 0x74, 0x9a, 0xf7, 0x76, 0xc7, 0x2a, 0x24, 0xf9, 0xe9, 0x80, 0x5d, 0xef, 0xe0, 0xad, 0xc0, 0x7a, + 0x5b, 0x11, 0x52, 0x1d, 0x6c, 0xa9, 0x74, 0x1f, 0x64, 0xc8, 0xc4, 0x69, 0x5f, 0xbb, 0x05, 0x19, + 0xcf, 0xcd, 0x18, 0xb2, 0x35, 0x1e, 0x95, 0xde, 0x11, 0x23, 0xc5, 0x85, 0x4f, 0xbf, 0xd8, 0x8c, + 0x1d, 0xe1, 0x0f, 0xc9, 0x6a, 0x96, 0x4b, 0xfb, 0xe5, 0xd2, 0xfe, 0x7d, 0x51, 0x28, 0x66, 0x3e, + 0xfd, 0x62, 0x73, 0x41, 0xc6, 0xb4, 0x3e, 0x70, 0xed, 0x3e, 0x2c, 0x8e, 0x4c, 0x8c, 0x1f, 0x7a, + 0x22, 0xc8, 0xdf, 0x79, 0x78, 0xf2, 0xe0, 0x60, 0x7f, 0xb7, 0x52, 0x52, 0x1e, 0x1d, 0x57, 0x4a, + 0xa2, 0x80, 0xce, 0xc3, 0xf2, 0x83, 0x83, 0x7b, 0xe5, 0x8a, 0xb2, 0xff, 0xe0, 0xa0, 0x74, 0x54, + 0x51, 0x76, 0x2b, 0x95, 0xdd, 0xfd, 0xfb, 0x62, 0x74, 0xe7, 0xfb, 0x45, 0x88, 0xef, 0xee, 0xed, + 0x1f, 0xa0, 0x7d, 0x88, 0x53, 0x3a, 0x6b, 0xe2, 0xfd, 0xe8, 0xe2, 0xe4, 0x4a, 0x0f, 0xba, 0x0b, + 0x09, 0xca, 0x74, 0xa1, 0xc9, 0x17, 0xa6, 0x8b, 0x53, 0x4a, 0x3f, 0xe4, 0xc7, 0xd0, 0x15, 0x39, + 0xf1, 0x06, 0x75, 0x71, 0x72, 0x25, 0x08, 0x3d, 0x80, 0x05, 0x9b, 0xe8, 0x98, 0x76, 0xad, 0xb9, + 0x38, 0xb5, 0x3c, 0x43, 0x3e, 0x8d, 0x11, 0x46, 0x93, 0x2f, 0x57, 0x17, 0xa7, 0xd4, 0x88, 0xd0, + 0x01, 0x24, 0x39, 0xa5, 0x30, 0xe5, 0xbe, 0x74, 0x71, 0x5a, 0xd5, 0x07, 0xc9, 0x90, 0x76, 0xa9, + 0xb8, 0xe9, 0x57, 0xc6, 0x8b, 0x33, 0x94, 0xbf, 0xd0, 0xbb, 0x90, 0xf3, 0xd3, 0x15, 0xb3, 0xdd, + 0xc9, 0x2e, 0xce, 0x58, 0x5f, 0x22, 0xf6, 0xfd, 0xdc, 0xc5, 0x6c, 0x77, 0xb4, 0x8b, 0x33, 0x96, + 0x9b, 0xd0, 0xfb, 0xb0, 0x34, 0xce, 0x2d, 0xcc, 0x7e, 0x65, 0xbb, 0x38, 0x47, 0x01, 0x0a, 0x75, + 0x00, 0x05, 0x70, 0x12, 0x73, 0xdc, 0xe0, 0x2e, 0xce, 0x53, 0x8f, 0x42, 0x75, 0x58, 0x1c, 0x3d, + 0xe8, 0xcf, 0x7a, 0xa3, 0xbb, 0x38, 0x73, 0x6d, 0x8a, 0x8d, 0xe2, 0x27, 0x08, 0x66, 0xbd, 0xe1, + 0x5d, 0x9c, 0xb9, 0x54, 0x85, 0x1e, 0x02, 0x78, 0xce, 0xf8, 0x33, 0xdc, 0xf8, 0x2e, 0xce, 0x52, + 0xb4, 0x42, 0x06, 0x2c, 0x07, 0x1d, 0xfe, 0xe7, 0xb9, 0x00, 0x5e, 0x9c, 0xab, 0x96, 0x45, 0xe2, + 0xd9, 0x7f, 0x8c, 0x9f, 0xed, 0x42, 0x78, 0x71, 0xc6, 0xa2, 0x16, 0x32, 0x61, 0x25, 0xf0, 0xe8, + 0x3a, 0xd7, 0xf5, 0xf0, 0xe2, 0x7c, 0x85, 0x2e, 0xd4, 0x04, 0x71, 0xec, 0xc0, 0x3b, 0xf3, 0x6d, + 0xf1, 0xe2, 0xec, 0x25, 0x2f, 0x3a, 0x5f, 0x01, 0xe7, 0xe1, 0x79, 0x2e, 0x8f, 0x17, 0xe7, 0xaa, + 0x81, 0xa1, 0x01, 0x9c, 0x0b, 0x3e, 0xf2, 0xce, 0x77, 0x95, 0xbc, 0x38, 0x67, 0x49, 0x0c, 0x7d, + 0x2c, 0xc0, 0x5a, 0xf8, 0x59, 0x79, 0xfe, 0x8b, 0xe5, 0xc5, 0xa7, 0xa8, 0x91, 0xed, 0xed, 0x7e, + 0xf5, 0xed, 0xba, 0xf0, 0xf5, 0xb7, 0xeb, 0xc2, 0x5f, 0xbf, 0x5d, 0x17, 0x3e, 0xfb, 0x6e, 0x3d, + 0xf2, 0xf5, 0x77, 0xeb, 0x91, 0x3f, 0x7f, 0xb7, 0x1e, 0xf9, 0xdf, 0xe7, 0x9a, 0x9a, 0xd5, 0xea, + 0x57, 0xb7, 0x6a, 0x7a, 0x67, 0xbb, 0xa6, 0x77, 0xb0, 0x55, 0x6d, 0x58, 0xee, 0x83, 0xfb, 0x1f, + 0xb2, 0x6a, 0x92, 0xc2, 0xb1, 0x1b, 0xff, 0x08, 0x00, 0x00, 0xff, 0xff, 0x78, 0xc5, 0xf8, 0xb5, + 0x63, 0x36, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4414,6 +4546,7 @@ type ABCIClient interface { FetchOracleVotes(ctx context.Context, in *RequestFetchOracleVotes, opts ...grpc.CallOption) (*ResponseFetchOracleVotes, error) ValidateOracleVotes(ctx context.Context, in *RequestValidateOracleVotes, opts ...grpc.CallOption) (*ResponseValidateOracleVotes, error) DoesOracleResultExist(ctx context.Context, in *RequestDoesOracleResultExist, opts ...grpc.CallOption) (*ResponseDoesOracleResultExist, error) + DoesSubaccountBelongToVal(ctx context.Context, in *RequestDoesSubaccountBelongToVal, opts ...grpc.CallOption) (*ResponseDoesSubaccountBelongToVal, error) } type aBCIClient struct { @@ -4604,6 +4737,15 @@ func (c *aBCIClient) DoesOracleResultExist(ctx context.Context, in *RequestDoesO return out, nil } +func (c *aBCIClient) DoesSubaccountBelongToVal(ctx context.Context, in *RequestDoesSubaccountBelongToVal, opts ...grpc.CallOption) (*ResponseDoesSubaccountBelongToVal, error) { + out := new(ResponseDoesSubaccountBelongToVal) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCI/DoesSubaccountBelongToVal", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ABCIServer is the server API for ABCI service. type ABCIServer interface { Echo(context.Context, *RequestEcho) (*ResponseEcho, error) @@ -4626,6 +4768,7 @@ type ABCIServer interface { FetchOracleVotes(context.Context, *RequestFetchOracleVotes) (*ResponseFetchOracleVotes, error) ValidateOracleVotes(context.Context, *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) DoesOracleResultExist(context.Context, *RequestDoesOracleResultExist) (*ResponseDoesOracleResultExist, error) + DoesSubaccountBelongToVal(context.Context, *RequestDoesSubaccountBelongToVal) (*ResponseDoesSubaccountBelongToVal, error) } // UnimplementedABCIServer can be embedded to have forward compatible implementations. @@ -4692,6 +4835,9 @@ func (*UnimplementedABCIServer) ValidateOracleVotes(ctx context.Context, req *Re func (*UnimplementedABCIServer) DoesOracleResultExist(ctx context.Context, req *RequestDoesOracleResultExist) (*ResponseDoesOracleResultExist, error) { return nil, status.Errorf(codes.Unimplemented, "method DoesOracleResultExist not implemented") } +func (*UnimplementedABCIServer) DoesSubaccountBelongToVal(ctx context.Context, req *RequestDoesSubaccountBelongToVal) (*ResponseDoesSubaccountBelongToVal, error) { + return nil, status.Errorf(codes.Unimplemented, "method DoesSubaccountBelongToVal not implemented") +} func RegisterABCIServer(s grpc1.Server, srv ABCIServer) { s.RegisterService(&_ABCI_serviceDesc, srv) @@ -5057,6 +5203,24 @@ func _ABCI_DoesOracleResultExist_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _ABCI_DoesSubaccountBelongToVal_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestDoesSubaccountBelongToVal) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ABCIServer).DoesSubaccountBelongToVal(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/tendermint.abci.ABCI/DoesSubaccountBelongToVal", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ABCIServer).DoesSubaccountBelongToVal(ctx, req.(*RequestDoesSubaccountBelongToVal)) + } + return interceptor(ctx, in, info, handler) +} + var _ABCI_serviceDesc = grpc.ServiceDesc{ ServiceName: "tendermint.abci.ABCI", HandlerType: (*ABCIServer)(nil), @@ -5141,6 +5305,10 @@ var _ABCI_serviceDesc = grpc.ServiceDesc{ MethodName: "DoesOracleResultExist", Handler: _ABCI_DoesOracleResultExist_Handler, }, + { + MethodName: "DoesSubaccountBelongToVal", + Handler: _ABCI_DoesSubaccountBelongToVal_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "tendermint/abci/types.proto", @@ -5616,6 +5784,29 @@ func (m *Request_DoesOracleResultExist) MarshalToSizedBuffer(dAtA []byte) (int, } return len(dAtA) - i, nil } +func (m *Request_DoesSubaccountBelongToVal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Request_DoesSubaccountBelongToVal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.DoesSubaccountBelongToVal != nil { + { + size, err := m.DoesSubaccountBelongToVal.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xca + } + return len(dAtA) - i, nil +} func (m *RequestEcho) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5781,12 +5972,12 @@ func (m *RequestInitChain) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - n22, err22 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err22 != nil { - return 0, err22 + n23, err23 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err23 != nil { + return 0, err23 } - i -= n22 - i = encodeVarintTypes(dAtA, i, uint64(n22)) + i -= n23 + i = encodeVarintTypes(dAtA, i, uint64(n23)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -6081,12 +6272,12 @@ func (m *RequestPrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x3a } - n24, err24 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err24 != nil { - return 0, err24 + n25, err25 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err25 != nil { + return 0, err25 } - i -= n24 - i = encodeVarintTypes(dAtA, i, uint64(n24)) + i -= n25 + i = encodeVarintTypes(dAtA, i, uint64(n25)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -6169,12 +6360,12 @@ func (m *RequestProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x3a } - n26, err26 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err26 != nil { - return 0, err26 + n27, err27 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err27 != nil { + return 0, err27 } - i -= n26 - i = encodeVarintTypes(dAtA, i, uint64(n26)) + i -= n27 + i = encodeVarintTypes(dAtA, i, uint64(n27)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -6292,12 +6483,12 @@ func (m *RequestExtendVote) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x22 } } - n29, err29 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err29 != nil { - return 0, err29 + n30, err30 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err30 != nil { + return 0, err30 } - i -= n29 - i = encodeVarintTypes(dAtA, i, uint64(n29)) + i -= n30 + i = encodeVarintTypes(dAtA, i, uint64(n30)) i-- dAtA[i] = 0x1a if m.Height != 0 { @@ -6398,12 +6589,12 @@ func (m *RequestFinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x3a } - n30, err30 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err30 != nil { - return 0, err30 + n31, err31 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err31 != nil { + return 0, err31 } - i -= n30 - i = encodeVarintTypes(dAtA, i, uint64(n30)) + i -= n31 + i = encodeVarintTypes(dAtA, i, uint64(n31)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -6581,6 +6772,36 @@ func (m *RequestDoesOracleResultExist) MarshalToSizedBuffer(dAtA []byte) (int, e return len(dAtA) - i, nil } +func (m *RequestDoesSubaccountBelongToVal) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RequestDoesSubaccountBelongToVal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RequestDoesSubaccountBelongToVal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *Response) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7074,6 +7295,29 @@ func (m *Response_DoesOracleResultExist) MarshalToSizedBuffer(dAtA []byte) (int, } return len(dAtA) - i, nil } +func (m *Response_DoesSubaccountBelongToVal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Response_DoesSubaccountBelongToVal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.DoesSubaccountBelongToVal != nil { + { + size, err := m.DoesSubaccountBelongToVal.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xd2 + } + return len(dAtA) - i, nil +} func (m *ResponseException) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7585,20 +7829,20 @@ func (m *ResponseApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, err } } if len(m.RefetchChunks) > 0 { - dAtA56 := make([]byte, len(m.RefetchChunks)*10) - var j55 int + dAtA58 := make([]byte, len(m.RefetchChunks)*10) + var j57 int for _, num := range m.RefetchChunks { for num >= 1<<7 { - dAtA56[j55] = uint8(uint64(num)&0x7f | 0x80) + dAtA58[j57] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j55++ + j57++ } - dAtA56[j55] = uint8(num) - j55++ + dAtA58[j57] = uint8(num) + j57++ } - i -= j55 - copy(dAtA[i:], dAtA56[:j55]) - i = encodeVarintTypes(dAtA, i, uint64(j55)) + i -= j57 + copy(dAtA[i:], dAtA58[:j57]) + i = encodeVarintTypes(dAtA, i, uint64(j57)) i-- dAtA[i] = 0x12 } @@ -7938,6 +8182,46 @@ func (m *ResponseDoesOracleResultExist) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } +func (m *ResponseDoesSubaccountBelongToVal) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResponseDoesSubaccountBelongToVal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResponseDoesSubaccountBelongToVal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ValAddress) > 0 { + i -= len(m.ValAddress) + copy(dAtA[i:], m.ValAddress) + i = encodeVarintTypes(dAtA, i, uint64(len(m.ValAddress))) + i-- + dAtA[i] = 0x12 + } + if m.BelongsToVal { + i-- + if m.BelongsToVal { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *CommitInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -8431,12 +8715,12 @@ func (m *Misbehavior) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x28 } - n63, err63 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) - if err63 != nil { - return 0, err63 + n65, err65 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.Time):]) + if err65 != nil { + return 0, err65 } - i -= n63 - i = encodeVarintTypes(dAtA, i, uint64(n63)) + i -= n65 + i = encodeVarintTypes(dAtA, i, uint64(n65)) i-- dAtA[i] = 0x22 if m.Height != 0 { @@ -8777,6 +9061,18 @@ func (m *Request_DoesOracleResultExist) Size() (n int) { } return n } +func (m *Request_DoesSubaccountBelongToVal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.DoesSubaccountBelongToVal != nil { + l = m.DoesSubaccountBelongToVal.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} func (m *RequestEcho) Size() (n int) { if m == nil { return 0 @@ -9203,6 +9499,19 @@ func (m *RequestDoesOracleResultExist) Size() (n int) { return n } +func (m *RequestDoesSubaccountBelongToVal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + func (m *Response) Size() (n int) { if m == nil { return 0 @@ -9455,14 +9764,26 @@ func (m *Response_ValidateOracleVotes) Size() (n int) { } return n } -func (m *Response_DoesOracleResultExist) Size() (n int) { +func (m *Response_DoesOracleResultExist) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.DoesOracleResultExist != nil { + l = m.DoesOracleResultExist.Size() + n += 2 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_DoesSubaccountBelongToVal) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.DoesOracleResultExist != nil { - l = m.DoesOracleResultExist.Size() + if m.DoesSubaccountBelongToVal != nil { + l = m.DoesSubaccountBelongToVal.Size() n += 2 + l + sovTypes(uint64(l)) } return n @@ -9848,6 +10169,22 @@ func (m *ResponseDoesOracleResultExist) Size() (n int) { return n } +func (m *ResponseDoesSubaccountBelongToVal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.BelongsToVal { + n += 2 + } + l = len(m.ValAddress) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + return n +} + func (m *CommitInfo) Size() (n int) { if m == nil { return 0 @@ -10833,6 +11170,41 @@ func (m *Request) Unmarshal(dAtA []byte) error { } m.Value = &Request_DoesOracleResultExist{v} iNdEx = postIndex + case 25: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DoesSubaccountBelongToVal", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RequestDoesSubaccountBelongToVal{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Request_DoesSubaccountBelongToVal{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -13798,6 +14170,90 @@ func (m *RequestDoesOracleResultExist) Unmarshal(dAtA []byte) error { } return nil } +func (m *RequestDoesSubaccountBelongToVal) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestDoesSubaccountBelongToVal: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestDoesSubaccountBelongToVal: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = append(m.Address[:0], dAtA[iNdEx:postIndex]...) + if m.Address == nil { + m.Address = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Response) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -14562,6 +15018,41 @@ func (m *Response) Unmarshal(dAtA []byte) error { } m.Value = &Response_DoesOracleResultExist{v} iNdEx = postIndex + case 26: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DoesSubaccountBelongToVal", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ResponseDoesSubaccountBelongToVal{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &Response_DoesSubaccountBelongToVal{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -17033,6 +17524,108 @@ func (m *ResponseDoesOracleResultExist) Unmarshal(dAtA []byte) error { } return nil } +func (m *ResponseDoesSubaccountBelongToVal) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResponseDoesSubaccountBelongToVal: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResponseDoesSubaccountBelongToVal: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BelongsToVal", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.BelongsToVal = bool(v != 0) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ValAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *CommitInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index 5592fc3d271..aa27af51cda 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -39,6 +39,7 @@ service ABCI { rpc FetchOracleVotes(RequestFetchOracleVotes) returns (ResponseFetchOracleVotes); rpc ValidateOracleVotes(RequestValidateOracleVotes) returns (ResponseValidateOracleVotes); rpc DoesOracleResultExist(RequestDoesOracleResultExist) returns (ResponseDoesOracleResultExist); + rpc DoesSubaccountBelongToVal(RequestDoesSubaccountBelongToVal) returns (ResponseDoesSubaccountBelongToVal); } //---------------------------------------- @@ -66,6 +67,7 @@ message Request { RequestFetchOracleVotes fetch_oracle_votes = 22; RequestValidateOracleVotes validate_oracle_votes = 23; RequestDoesOracleResultExist does_oracle_result_exist = 24; + RequestDoesSubaccountBelongToVal does_subaccount_belong_to_val = 25; } reserved 4, 7, 9, 10; // SetOption, BeginBlock, DeliverTx, EndBlock } @@ -217,6 +219,10 @@ message RequestDoesOracleResultExist { string key = 1; } +message RequestDoesSubaccountBelongToVal { + bytes address = 1; +} + //---------------------------------------- // Response types @@ -243,6 +249,7 @@ message Response { ResponseFetchOracleVotes fetch_oracle_votes = 23; ResponseValidateOracleVotes validate_oracle_votes = 24; ResponseDoesOracleResultExist does_oracle_result_exist = 25; + ResponseDoesSubaccountBelongToVal does_subaccount_belong_to_val = 26; } reserved 5, 8, 10, 11; // SetOption, BeginBlock, DeliverTx, EndBlock } @@ -414,6 +421,11 @@ message ResponseDoesOracleResultExist { bool does_exist = 1; } +message ResponseDoesSubaccountBelongToVal { + bool belongs_to_val = 1; + string val_address = 2; +} + //---------------------------------------- // Misc. diff --git a/proxy/app_conn.go b/proxy/app_conn.go index fd2d6a0f9f3..b0b5891a576 100644 --- a/proxy/app_conn.go +++ b/proxy/app_conn.go @@ -28,6 +28,7 @@ type AppConnConsensus interface { FetchOracleVotes(context.Context, *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) ValidateOracleVotes(context.Context, *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) DoesOracleResultExist(context.Context, *types.RequestDoesOracleResultExist) (*types.ResponseDoesOracleResultExist, error) + DoesSubaccountBelongToVal(context.Context, *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error) } type AppConnMempool interface { @@ -133,6 +134,11 @@ func (app *appConnConsensus) DoesOracleResultExist(ctx context.Context, req *typ return app.appConn.DoesOracleResultExist(ctx, req) } +func (app *appConnConsensus) DoesSubaccountBelongToVal(ctx context.Context, req *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error) { + defer addTimeSample(app.metrics.MethodTimingSeconds.With("method", "commit", "type", "sync"))() + return app.appConn.DoesSubaccountBelongToVal(ctx, req) +} + //------------------------------------------------ // Implements AppConnMempool (subset of abcicli.Client) diff --git a/proxy/mocks/app_conn_consensus.go b/proxy/mocks/app_conn_consensus.go index 22f24fd796c..21d8caaa6c3 100644 --- a/proxy/mocks/app_conn_consensus.go +++ b/proxy/mocks/app_conn_consensus.go @@ -93,6 +93,32 @@ func (_m *AppConnConsensus) DoesOracleResultExist(_a0 context.Context, _a1 *type return r0, r1 } +// DoesSubaccountBelongToVal provides a mock function with given fields: _a0, _a1 +func (_m *AppConnConsensus) DoesSubaccountBelongToVal(_a0 context.Context, _a1 *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error) { + ret := _m.Called(_a0, _a1) + + var r0 *types.ResponseDoesSubaccountBelongToVal + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesSubaccountBelongToVal) *types.ResponseDoesSubaccountBelongToVal); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ResponseDoesSubaccountBelongToVal) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestDoesSubaccountBelongToVal) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // Error provides a mock function with given fields: func (_m *AppConnConsensus) Error() error { ret := _m.Called() From a6908514a108b31242335ae4939bddedfd1464b3 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Fri, 12 Jul 2024 16:34:01 +0800 Subject: [PATCH 10/15] update oracle votes signing and verification flow with new sig prefixes done --- abci/types/types.pb.go | 166 ++++++++++-------------------- oracle/reactor.go | 27 +++-- proto/tendermint/abci/types.proto | 1 - 3 files changed, 76 insertions(+), 118 deletions(-) diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index 20bf069f43e..02645581ac3 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -3371,8 +3371,7 @@ func (m *ResponseDoesOracleResultExist) GetDoesExist() bool { } type ResponseDoesSubaccountBelongToVal struct { - BelongsToVal bool `protobuf:"varint,1,opt,name=belongs_to_val,json=belongsToVal,proto3" json:"belongs_to_val,omitempty"` - ValAddress string `protobuf:"bytes,2,opt,name=val_address,json=valAddress,proto3" json:"val_address,omitempty"` + BelongsToVal bool `protobuf:"varint,1,opt,name=belongs_to_val,json=belongsToVal,proto3" json:"belongs_to_val,omitempty"` } func (m *ResponseDoesSubaccountBelongToVal) Reset() { *m = ResponseDoesSubaccountBelongToVal{} } @@ -3415,13 +3414,6 @@ func (m *ResponseDoesSubaccountBelongToVal) GetBelongsToVal() bool { return false } -func (m *ResponseDoesSubaccountBelongToVal) GetValAddress() string { - if m != nil { - return m.ValAddress - } - return "" -} - type CommitInfo struct { Round int32 `protobuf:"varint,1,opt,name=round,proto3" json:"round,omitempty"` Votes []VoteInfo `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes"` @@ -4279,7 +4271,7 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3700 bytes of a gzipped FileDescriptorProto + // 3687 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcd, 0x73, 0x1b, 0xc7, 0xb1, 0xc7, 0xe2, 0x8b, 0x40, 0xe3, 0x83, 0xcb, 0x21, 0x45, 0x81, 0x90, 0x44, 0x52, 0xeb, 0x27, 0x5b, 0x96, 0x6c, 0xd2, 0xa6, 0x9e, 0x6c, 0xab, 0x64, 0xbb, 0x8a, 0xa4, 0x20, 0x81, 0x94, 0x4c, @@ -4456,62 +4448,61 @@ var fileDescriptor_252557cfdd89a31a = []byte{ 0x8f, 0x04, 0xe7, 0x8d, 0x79, 0x60, 0xfd, 0xd6, 0x48, 0x58, 0x5e, 0x86, 0x24, 0x0f, 0x48, 0x12, 0x83, 0x7b, 0xa7, 0xa5, 0xa3, 0x8a, 0x18, 0x21, 0xc1, 0x79, 0x22, 0x97, 0x68, 0x43, 0x90, 0xde, 0x84, 0x4b, 0x13, 0x01, 0x3c, 0x71, 0x0c, 0xc5, 0xe9, 0xec, 0x10, 0x20, 0xd0, 0x8a, 0x60, 0x9a, - 0xf4, 0xd0, 0xd7, 0xd2, 0xfb, 0x70, 0x79, 0x2a, 0x20, 0x47, 0xff, 0x05, 0x79, 0x86, 0xed, 0x4d, - 0x1b, 0xdc, 0x33, 0x3b, 0x59, 0xde, 0xcb, 0xa4, 0x36, 0x20, 0x33, 0x50, 0xdb, 0x3e, 0x46, 0x37, - 0x4d, 0xc1, 0x9c, 0xcd, 0x02, 0x3e, 0x06, 0x70, 0x59, 0x53, 0x92, 0x25, 0x7a, 0x7a, 0xbf, 0x5b, - 0xa7, 0xb6, 0x12, 0x32, 0x6b, 0xa0, 0x9b, 0x90, 0xf0, 0x92, 0x7c, 0xe3, 0xe9, 0x94, 0x38, 0xca, - 0xc3, 0xba, 0x32, 0x69, 0x49, 0x03, 0x34, 0x5e, 0xb9, 0x0a, 0x19, 0xe2, 0x0d, 0xff, 0x10, 0x97, - 0x43, 0x6b, 0x60, 0xc1, 0x43, 0x7d, 0x04, 0x09, 0xba, 0x7a, 0x09, 0x70, 0xa2, 0xe5, 0x52, 0x8e, - 0xf8, 0xc9, 0x33, 0xfa, 0x09, 0x80, 0x6a, 0x59, 0x3d, 0xad, 0xda, 0x77, 0x07, 0xd8, 0x08, 0x5e, - 0xfd, 0xbb, 0xb6, 0xdc, 0xde, 0x45, 0xbe, 0x0d, 0xac, 0xb8, 0xaa, 0x9e, 0xad, 0xc0, 0x63, 0x50, - 0x3a, 0x82, 0xbc, 0x5f, 0x77, 0x9c, 0x5e, 0x74, 0x31, 0x2a, 0x9b, 0x00, 0x8e, 0x51, 0x1d, 0x84, - 0x1b, 0x63, 0x35, 0x61, 0xda, 0x90, 0x7e, 0x1a, 0x85, 0xac, 0x77, 0xf3, 0xf8, 0xf7, 0x83, 0x91, - 0xd2, 0xcf, 0x05, 0x48, 0x39, 0x9f, 0xef, 0x2f, 0x10, 0xfb, 0x2a, 0xea, 0xcc, 0x7b, 0x51, 0x6f, - 0x55, 0x97, 0xd5, 0xcf, 0x63, 0x4e, 0xfd, 0xfc, 0xb6, 0x03, 0x61, 0xc2, 0xe8, 0x4d, 0xaf, 0xaf, - 0x79, 0x54, 0xd9, 0x88, 0xed, 0x36, 0xa4, 0x9d, 0x1d, 0x38, 0x9c, 0xfe, 0xa5, 0xb5, 0x7d, 0xfd, - 0x43, 0x5e, 0x32, 0x8e, 0xc9, 0xac, 0x21, 0xd5, 0x61, 0x71, 0x64, 0xfb, 0x46, 0xb7, 0x61, 0xc1, - 0xe8, 0x57, 0x15, 0x3b, 0x38, 0x46, 0xea, 0x0e, 0xf6, 0x91, 0xa4, 0x5f, 0x6d, 0x6b, 0xb5, 0xfb, - 0xf8, 0xcc, 0xfe, 0x31, 0x46, 0xbf, 0x7a, 0x9f, 0xc5, 0x10, 0x1b, 0x25, 0xea, 0x1d, 0xe5, 0x57, - 0x02, 0xa4, 0xec, 0x35, 0x81, 0xde, 0x84, 0xb4, 0x93, 0x1a, 0x9c, 0x3b, 0x1f, 0xa1, 0x39, 0x85, - 0xdb, 0x77, 0x55, 0xd0, 0xae, 0x7d, 0x59, 0x45, 0xab, 0x2b, 0x8d, 0xb6, 0xca, 0x62, 0x29, 0xef, - 0xf7, 0x19, 0x4b, 0x1e, 0x34, 0xa7, 0x1e, 0xdc, 0xb9, 0xdb, 0x56, 0x9b, 0x72, 0x86, 0xea, 0x1c, - 0xd4, 0x49, 0x83, 0xa3, 0xf3, 0xbf, 0x09, 0x20, 0x8e, 0xae, 0xd8, 0x1f, 0xfc, 0xeb, 0xc6, 0xa1, - 0x4a, 0x2c, 0x00, 0xaa, 0xa0, 0x6d, 0x58, 0x76, 0x24, 0x14, 0x53, 0x6b, 0x76, 0x55, 0xab, 0xdf, - 0xc3, 0xbc, 0x52, 0x83, 0x9c, 0x57, 0xa7, 0xf6, 0x9b, 0xf1, 0xaf, 0x4e, 0x3c, 0xe5, 0x57, 0x7f, - 0x12, 0x85, 0x8c, 0xa7, 0x6e, 0x84, 0xfe, 0xdb, 0xb3, 0x19, 0xe5, 0x03, 0xb2, 0xbb, 0x47, 0xd6, - 0xbd, 0xbf, 0xe1, 0x77, 0x53, 0x74, 0x7e, 0x37, 0x85, 0x55, 0xe7, 0xec, 0x32, 0x54, 0x7c, 0xee, - 0x32, 0xd4, 0x0b, 0x80, 0x2c, 0xdd, 0x52, 0xdb, 0xca, 0x40, 0xb7, 0xb4, 0x6e, 0x53, 0x61, 0x61, - 0xc8, 0xb6, 0x0e, 0x91, 0xbe, 0x79, 0x44, 0x5f, 0x9c, 0xd0, 0x88, 0xfc, 0x58, 0x80, 0x94, 0x73, - 0x74, 0x9a, 0xf7, 0x76, 0xc7, 0x2a, 0x24, 0xf9, 0xe9, 0x80, 0x5d, 0xef, 0xe0, 0xad, 0xc0, 0x7a, - 0x5b, 0x11, 0x52, 0x1d, 0x6c, 0xa9, 0x74, 0x1f, 0x64, 0xc8, 0xc4, 0x69, 0x5f, 0xbb, 0x05, 0x19, - 0xcf, 0xcd, 0x18, 0xb2, 0x35, 0x1e, 0x95, 0xde, 0x11, 0x23, 0xc5, 0x85, 0x4f, 0xbf, 0xd8, 0x8c, - 0x1d, 0xe1, 0x0f, 0xc9, 0x6a, 0x96, 0x4b, 0xfb, 0xe5, 0xd2, 0xfe, 0x7d, 0x51, 0x28, 0x66, 0x3e, - 0xfd, 0x62, 0x73, 0x41, 0xc6, 0xb4, 0x3e, 0x70, 0xed, 0x3e, 0x2c, 0x8e, 0x4c, 0x8c, 0x1f, 0x7a, - 0x22, 0xc8, 0xdf, 0x79, 0x78, 0xf2, 0xe0, 0x60, 0x7f, 0xb7, 0x52, 0x52, 0x1e, 0x1d, 0x57, 0x4a, - 0xa2, 0x80, 0xce, 0xc3, 0xf2, 0x83, 0x83, 0x7b, 0xe5, 0x8a, 0xb2, 0xff, 0xe0, 0xa0, 0x74, 0x54, - 0x51, 0x76, 0x2b, 0x95, 0xdd, 0xfd, 0xfb, 0x62, 0x74, 0xe7, 0xfb, 0x45, 0x88, 0xef, 0xee, 0xed, - 0x1f, 0xa0, 0x7d, 0x88, 0x53, 0x3a, 0x6b, 0xe2, 0xfd, 0xe8, 0xe2, 0xe4, 0x4a, 0x0f, 0xba, 0x0b, - 0x09, 0xca, 0x74, 0xa1, 0xc9, 0x17, 0xa6, 0x8b, 0x53, 0x4a, 0x3f, 0xe4, 0xc7, 0xd0, 0x15, 0x39, - 0xf1, 0x06, 0x75, 0x71, 0x72, 0x25, 0x08, 0x3d, 0x80, 0x05, 0x9b, 0xe8, 0x98, 0x76, 0xad, 0xb9, - 0x38, 0xb5, 0x3c, 0x43, 0x3e, 0x8d, 0x11, 0x46, 0x93, 0x2f, 0x57, 0x17, 0xa7, 0xd4, 0x88, 0xd0, - 0x01, 0x24, 0x39, 0xa5, 0x30, 0xe5, 0xbe, 0x74, 0x71, 0x5a, 0xd5, 0x07, 0xc9, 0x90, 0x76, 0xa9, - 0xb8, 0xe9, 0x57, 0xc6, 0x8b, 0x33, 0x94, 0xbf, 0xd0, 0xbb, 0x90, 0xf3, 0xd3, 0x15, 0xb3, 0xdd, - 0xc9, 0x2e, 0xce, 0x58, 0x5f, 0x22, 0xf6, 0xfd, 0xdc, 0xc5, 0x6c, 0x77, 0xb4, 0x8b, 0x33, 0x96, - 0x9b, 0xd0, 0xfb, 0xb0, 0x34, 0xce, 0x2d, 0xcc, 0x7e, 0x65, 0xbb, 0x38, 0x47, 0x01, 0x0a, 0x75, - 0x00, 0x05, 0x70, 0x12, 0x73, 0xdc, 0xe0, 0x2e, 0xce, 0x53, 0x8f, 0x42, 0x75, 0x58, 0x1c, 0x3d, - 0xe8, 0xcf, 0x7a, 0xa3, 0xbb, 0x38, 0x73, 0x6d, 0x8a, 0x8d, 0xe2, 0x27, 0x08, 0x66, 0xbd, 0xe1, - 0x5d, 0x9c, 0xb9, 0x54, 0x85, 0x1e, 0x02, 0x78, 0xce, 0xf8, 0x33, 0xdc, 0xf8, 0x2e, 0xce, 0x52, - 0xb4, 0x42, 0x06, 0x2c, 0x07, 0x1d, 0xfe, 0xe7, 0xb9, 0x00, 0x5e, 0x9c, 0xab, 0x96, 0x45, 0xe2, - 0xd9, 0x7f, 0x8c, 0x9f, 0xed, 0x42, 0x78, 0x71, 0xc6, 0xa2, 0x16, 0x32, 0x61, 0x25, 0xf0, 0xe8, - 0x3a, 0xd7, 0xf5, 0xf0, 0xe2, 0x7c, 0x85, 0x2e, 0xd4, 0x04, 0x71, 0xec, 0xc0, 0x3b, 0xf3, 0x6d, - 0xf1, 0xe2, 0xec, 0x25, 0x2f, 0x3a, 0x5f, 0x01, 0xe7, 0xe1, 0x79, 0x2e, 0x8f, 0x17, 0xe7, 0xaa, - 0x81, 0xa1, 0x01, 0x9c, 0x0b, 0x3e, 0xf2, 0xce, 0x77, 0x95, 0xbc, 0x38, 0x67, 0x49, 0x0c, 0x7d, - 0x2c, 0xc0, 0x5a, 0xf8, 0x59, 0x79, 0xfe, 0x8b, 0xe5, 0xc5, 0xa7, 0xa8, 0x91, 0xed, 0xed, 0x7e, - 0xf5, 0xed, 0xba, 0xf0, 0xf5, 0xb7, 0xeb, 0xc2, 0x5f, 0xbf, 0x5d, 0x17, 0x3e, 0xfb, 0x6e, 0x3d, - 0xf2, 0xf5, 0x77, 0xeb, 0x91, 0x3f, 0x7f, 0xb7, 0x1e, 0xf9, 0xdf, 0xe7, 0x9a, 0x9a, 0xd5, 0xea, - 0x57, 0xb7, 0x6a, 0x7a, 0x67, 0xbb, 0xa6, 0x77, 0xb0, 0x55, 0x6d, 0x58, 0xee, 0x83, 0xfb, 0x1f, - 0xb2, 0x6a, 0x92, 0xc2, 0xb1, 0x1b, 0xff, 0x08, 0x00, 0x00, 0xff, 0xff, 0x78, 0xc5, 0xf8, 0xb5, - 0x63, 0x36, 0x00, 0x00, + 0xf4, 0xd0, 0xd7, 0xd2, 0x01, 0x5c, 0x9e, 0x0a, 0xc8, 0xd1, 0x7f, 0x41, 0x9e, 0x61, 0x7b, 0xd3, + 0x06, 0xf7, 0xcc, 0x4e, 0x96, 0xf7, 0x52, 0x29, 0xe9, 0x31, 0x80, 0x4b, 0x8a, 0x92, 0x24, 0xd0, + 0xd3, 0xfb, 0xdd, 0x3a, 0x15, 0x4d, 0xc8, 0xac, 0x81, 0x6e, 0x42, 0xc2, 0xcb, 0xe1, 0x8d, 0x67, + 0x4b, 0xe2, 0x07, 0x0f, 0xa9, 0xca, 0xa4, 0x25, 0x0d, 0xd0, 0x78, 0x61, 0x2a, 0x64, 0x88, 0x37, + 0xfc, 0x43, 0x5c, 0x0e, 0x2d, 0x71, 0x05, 0x0f, 0xf5, 0x11, 0x24, 0xe8, 0xe2, 0x24, 0xb8, 0x88, + 0x56, 0x43, 0x39, 0xa0, 0x27, 0xcf, 0xe8, 0x27, 0x00, 0xaa, 0x65, 0xf5, 0xb4, 0x6a, 0xdf, 0x1d, + 0x60, 0x23, 0x78, 0x71, 0xef, 0xda, 0x72, 0x7b, 0x17, 0xf9, 0x2a, 0x5f, 0x71, 0x55, 0x3d, 0x2b, + 0xdd, 0x63, 0x50, 0x3a, 0x82, 0xbc, 0x5f, 0x77, 0x9c, 0x3d, 0x74, 0x21, 0x28, 0x3b, 0x51, 0x70, + 0x08, 0xea, 0x00, 0xd8, 0x18, 0x2b, 0xf9, 0xd2, 0x86, 0xf4, 0xd3, 0x28, 0x64, 0xbd, 0x7b, 0xc3, + 0xbf, 0x1f, 0x4a, 0x94, 0x7e, 0x2e, 0x40, 0xca, 0xf9, 0x7c, 0x7f, 0xfd, 0xd7, 0x57, 0x30, 0x67, + 0xde, 0x8b, 0x7a, 0x8b, 0xb6, 0xac, 0x3c, 0x1e, 0x73, 0xca, 0xe3, 0xb7, 0x1d, 0x84, 0x12, 0xc6, + 0x5e, 0x7a, 0x7d, 0xcd, 0xa3, 0xca, 0x06, 0x64, 0xb7, 0x21, 0xed, 0x6c, 0xb0, 0xe1, 0xec, 0x2e, + 0x2d, 0xdd, 0xeb, 0x1f, 0xf2, 0x8a, 0x70, 0x4c, 0x66, 0x0d, 0xa9, 0x0e, 0x8b, 0x23, 0xbb, 0x33, + 0xba, 0x0d, 0x0b, 0x46, 0xbf, 0xaa, 0xd8, 0xc1, 0x31, 0x52, 0x56, 0xb0, 0x4f, 0x1c, 0xfd, 0x6a, + 0x5b, 0xab, 0xdd, 0xc7, 0x67, 0xf6, 0x8f, 0x31, 0xfa, 0xd5, 0xfb, 0x2c, 0x86, 0xd8, 0x28, 0x51, + 0xef, 0x28, 0xbf, 0x12, 0x20, 0x65, 0xaf, 0x09, 0xf4, 0x26, 0xa4, 0x9d, 0x9d, 0xdf, 0xb9, 0xd2, + 0x11, 0x9a, 0x32, 0xb8, 0x7d, 0x57, 0x05, 0xed, 0xda, 0x77, 0x51, 0xb4, 0xba, 0xd2, 0x68, 0xab, + 0x2c, 0x96, 0xf2, 0x7e, 0x9f, 0xb1, 0xdc, 0x40, 0x53, 0xe6, 0xc1, 0x9d, 0xbb, 0x6d, 0xb5, 0x29, + 0x67, 0xa8, 0xce, 0x41, 0x9d, 0x34, 0x38, 0xf8, 0xfe, 0x9b, 0x00, 0xe2, 0xe8, 0x8a, 0xfd, 0xc1, + 0xbf, 0x6e, 0x1c, 0x89, 0xc4, 0x02, 0x90, 0x08, 0xda, 0x86, 0x65, 0x47, 0x42, 0x31, 0xb5, 0x66, + 0x57, 0xb5, 0xfa, 0x3d, 0xcc, 0x0b, 0x31, 0xc8, 0x79, 0x75, 0x6a, 0xbf, 0x19, 0xff, 0xea, 0xc4, + 0x53, 0x7e, 0xf5, 0x27, 0x51, 0xc8, 0x78, 0xca, 0x42, 0xe8, 0xbf, 0x3d, 0x9b, 0x51, 0x3e, 0x20, + 0x79, 0x7b, 0x64, 0xdd, 0xeb, 0x19, 0x7e, 0x37, 0x45, 0xe7, 0x77, 0x53, 0x58, 0xf1, 0xcd, 0xae, + 0x32, 0xc5, 0xe7, 0xae, 0x32, 0xbd, 0x00, 0xc8, 0xd2, 0x2d, 0xb5, 0xad, 0x0c, 0x74, 0x4b, 0xeb, + 0x36, 0x15, 0x16, 0x86, 0x6c, 0xeb, 0x10, 0xe9, 0x9b, 0x47, 0xf4, 0xc5, 0x09, 0x8d, 0xc8, 0x8f, + 0x05, 0x48, 0x39, 0x27, 0xa3, 0x79, 0x2f, 0x6f, 0xac, 0x42, 0x92, 0x83, 0x7f, 0x76, 0x7b, 0x83, + 0xb7, 0x02, 0xcb, 0x69, 0x45, 0x48, 0x75, 0xb0, 0xa5, 0xd2, 0x7d, 0x90, 0x01, 0x0f, 0xa7, 0x7d, + 0xed, 0x16, 0x64, 0x3c, 0x17, 0x5f, 0xc8, 0xd6, 0x78, 0x54, 0x7a, 0x47, 0x8c, 0x14, 0x17, 0x3e, + 0xfd, 0x62, 0x33, 0x76, 0x84, 0x3f, 0x24, 0xab, 0x59, 0x2e, 0xed, 0x97, 0x4b, 0xfb, 0xf7, 0x45, + 0xa1, 0x98, 0xf9, 0xf4, 0x8b, 0xcd, 0x05, 0x19, 0x53, 0xfa, 0xff, 0xda, 0x7d, 0x58, 0x1c, 0x99, + 0x18, 0x3f, 0xb2, 0x44, 0x90, 0xbf, 0xf3, 0xf0, 0xe4, 0xc1, 0xc1, 0xfe, 0x6e, 0xa5, 0xa4, 0x3c, + 0x3a, 0xae, 0x94, 0x44, 0x01, 0x9d, 0x87, 0xe5, 0x07, 0x07, 0xf7, 0xca, 0x15, 0x65, 0xff, 0xc1, + 0x41, 0xe9, 0xa8, 0xa2, 0xec, 0x56, 0x2a, 0xbb, 0xfb, 0xf7, 0xc5, 0xe8, 0xce, 0xf7, 0x8b, 0x10, + 0xdf, 0xdd, 0xdb, 0x3f, 0x40, 0xfb, 0x10, 0xa7, 0x6c, 0xd5, 0xc4, 0xeb, 0xcf, 0xc5, 0xc9, 0x85, + 0x1c, 0x74, 0x17, 0x12, 0x94, 0xc8, 0x42, 0x93, 0xef, 0x43, 0x17, 0xa7, 0x54, 0x76, 0xc8, 0x8f, + 0xa1, 0x2b, 0x72, 0xe2, 0x05, 0xe9, 0xe2, 0xe4, 0x42, 0x0f, 0x7a, 0x00, 0x0b, 0x36, 0x8f, 0x31, + 0xed, 0xd6, 0x72, 0x71, 0x6a, 0xf5, 0x85, 0x7c, 0x1a, 0xe3, 0x83, 0x26, 0xdf, 0x9d, 0x2e, 0x4e, + 0x29, 0x01, 0xa1, 0x03, 0x48, 0x72, 0xc6, 0x60, 0xca, 0x75, 0xe8, 0xe2, 0xb4, 0xa2, 0x0e, 0x92, + 0x21, 0xed, 0x32, 0x6d, 0xd3, 0x6f, 0x84, 0x17, 0x67, 0xa8, 0x6e, 0xa1, 0x77, 0x21, 0xe7, 0x67, + 0x23, 0x66, 0xbb, 0x72, 0x5d, 0x9c, 0xb1, 0x7c, 0x44, 0xec, 0xfb, 0xa9, 0x89, 0xd9, 0xae, 0x60, + 0x17, 0x67, 0xac, 0x26, 0xa1, 0xf7, 0x61, 0x69, 0x9c, 0x3a, 0x98, 0xfd, 0x46, 0x76, 0x71, 0x8e, + 0xfa, 0x12, 0xea, 0x00, 0x0a, 0xa0, 0x1c, 0xe6, 0xb8, 0xa0, 0x5d, 0x9c, 0xa7, 0xdc, 0x84, 0xea, + 0xb0, 0x38, 0x7a, 0x8e, 0x9f, 0xf5, 0xc2, 0x76, 0x71, 0xe6, 0xd2, 0x13, 0x1b, 0xc5, 0x7f, 0xfe, + 0x9f, 0xf5, 0x02, 0x77, 0x71, 0xe6, 0x4a, 0x14, 0x7a, 0x08, 0xe0, 0x39, 0xc2, 0xcf, 0x70, 0xa1, + 0xbb, 0x38, 0x4b, 0x4d, 0x0a, 0x19, 0xb0, 0x1c, 0x74, 0xb6, 0x9f, 0xe7, 0x7e, 0x77, 0x71, 0xae, + 0x52, 0x15, 0x89, 0x67, 0xff, 0x29, 0x7d, 0xb6, 0xfb, 0xde, 0xc5, 0x19, 0x6b, 0x56, 0xc8, 0x84, + 0x95, 0xc0, 0x93, 0xe9, 0x5c, 0xb7, 0xbf, 0x8b, 0xf3, 0xd5, 0xb1, 0x50, 0x13, 0xc4, 0xb1, 0xf3, + 0xec, 0xcc, 0x97, 0xc1, 0x8b, 0xb3, 0x57, 0xb4, 0xe8, 0x7c, 0x05, 0x1c, 0x77, 0xe7, 0xb9, 0x1b, + 0x5e, 0x9c, 0xab, 0xc4, 0x85, 0x06, 0x70, 0x2e, 0xf8, 0x44, 0x3b, 0xdf, 0x4d, 0xf1, 0xe2, 0x9c, + 0x15, 0x2f, 0xf4, 0xb1, 0x00, 0x6b, 0xe1, 0x47, 0xe1, 0xf9, 0xef, 0x8d, 0x17, 0x9f, 0xa2, 0x04, + 0xb6, 0xb7, 0xfb, 0xd5, 0xb7, 0xeb, 0xc2, 0xd7, 0xdf, 0xae, 0x0b, 0x7f, 0xfd, 0x76, 0x5d, 0xf8, + 0xec, 0xbb, 0xf5, 0xc8, 0xd7, 0xdf, 0xad, 0x47, 0xfe, 0xfc, 0xdd, 0x7a, 0xe4, 0x7f, 0x9f, 0x6b, + 0x6a, 0x56, 0xab, 0x5f, 0xdd, 0xaa, 0xe9, 0x9d, 0xed, 0x9a, 0xde, 0xc1, 0x56, 0xb5, 0x61, 0xb9, + 0x0f, 0xee, 0x5f, 0xc4, 0xaa, 0x49, 0x0a, 0xc7, 0x6e, 0xfc, 0x23, 0x00, 0x00, 0xff, 0xff, 0x6f, + 0x31, 0x39, 0x69, 0x42, 0x36, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -8202,13 +8193,6 @@ func (m *ResponseDoesSubaccountBelongToVal) MarshalToSizedBuffer(dAtA []byte) (i _ = i var l int _ = l - if len(m.ValAddress) > 0 { - i -= len(m.ValAddress) - copy(dAtA[i:], m.ValAddress) - i = encodeVarintTypes(dAtA, i, uint64(len(m.ValAddress))) - i-- - dAtA[i] = 0x12 - } if m.BelongsToVal { i-- if m.BelongsToVal { @@ -10178,10 +10162,6 @@ func (m *ResponseDoesSubaccountBelongToVal) Size() (n int) { if m.BelongsToVal { n += 2 } - l = len(m.ValAddress) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } return n } @@ -17573,38 +17553,6 @@ func (m *ResponseDoesSubaccountBelongToVal) Unmarshal(dAtA []byte) error { } } m.BelongsToVal = bool(v != 0) - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - 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 ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/oracle/reactor.go b/oracle/reactor.go index 2a5c1b797bf..f02fc4ddae3 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -2,6 +2,7 @@ package oracle import ( "bytes" + "context" "encoding/hex" "fmt" "math" @@ -16,6 +17,7 @@ import ( "github.com/cometbft/cometbft/crypto" + abcitypes "github.com/cometbft/cometbft/abci/types" cs "github.com/cometbft/cometbft/consensus" "github.com/cometbft/cometbft/libs/log" "github.com/cometbft/cometbft/oracle/service/runner" @@ -146,6 +148,11 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { return } + // skip if its own buffer + if oracleR.OracleInfo.PubKey.Equals(pubKey) { + return + } + // check if signer is main account or subaccount if bytes.Equal(accountType, oracletypes.MainAccountSigPrefix) { // is main account, verify if oracle votes are from validator @@ -156,20 +163,24 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { } } else if bytes.Equal(accountType, oracletypes.SubAccountSigPrefix) { - // add hook here to check if subaccount belongs to a validator - // hook should also return the actual address of the val, to be used later - // is subaccount, verify if the corresponding main account is a validator + res, err := oracleR.OracleInfo.ProxyApp.DoesSubaccountBelongToVal(context.Background(), &abcitypes.RequestDoesSubaccountBelongToVal{Address: pubKey.Address()}) + + if err != nil { + logrus.Warnf("unable to check if subaccount: %v belongs to validator: %v", pubKey.Address().String(), err) + return + } + + if !res.BelongsToVal { + logrus.Debugf("subaccount: %v does not belong to a validator, skipping gossip", pubKey.Address().String()) + return + } + } else { logrus.Errorf("unsupported account type for validator with pubkey: %v, skipping gossip", hex.EncodeToString(msg.Pubkey)) return } - // skip if its own buffer - if oracleR.OracleInfo.PubKey.Equals(pubKey) { - return - } - // verify sig of incoming gossip vote, throw if verification fails // signature starts from index 2 onwards due to the account and sign type prefix bytes if success := pubKey.VerifySignature(types.OracleVoteSignBytes(oracleR.ConsensusState.GetState().ChainID, msg), msg.Signature[2:]); !success { diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index aa27af51cda..8a84696f734 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -423,7 +423,6 @@ message ResponseDoesOracleResultExist { message ResponseDoesSubaccountBelongToVal { bool belongs_to_val = 1; - string val_address = 2; } //---------------------------------------- From c4faa49489a82d7ebee5ccfefae212907dfe37d9 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 15 Jul 2024 00:27:44 +0800 Subject: [PATCH 11/15] update subAccount and pubKey fields with proper camel casing --- abci/client/grpc_client.go | 4 +- abci/client/mocks/client.go | 14 +- abci/client/socket_client.go | 6 +- abci/types/application.go | 6 +- abci/types/messages.go | 4 +- abci/types/mocks/application.go | 14 +- abci/types/types.pb.go | 656 ++++++++++++++-------------- config/config.go | 20 +- config/toml.go | 8 +- node/node.go | 12 +- oracle/reactor.go | 12 +- oracle/service/runner/runner.go | 4 +- proto/tendermint/abci/types.proto | 10 +- proto/tendermint/oracle/types.pb.go | 92 ++-- proto/tendermint/oracle/types.proto | 4 +- proxy/app_conn.go | 6 +- proxy/mocks/app_conn_consensus.go | 14 +- types/oracle.go | 2 +- 18 files changed, 444 insertions(+), 444 deletions(-) diff --git a/abci/client/grpc_client.go b/abci/client/grpc_client.go index fb7bee64d67..cabb09b36de 100644 --- a/abci/client/grpc_client.go +++ b/abci/client/grpc_client.go @@ -262,6 +262,6 @@ func (cli *grpcClient) DoesOracleResultExist(ctx context.Context, req *types.Req return cli.client.DoesOracleResultExist(ctx, types.ToRequestDoesOracleResultExist(req).GetDoesOracleResultExist(), grpc.WaitForReady(true)) } -func (cli *grpcClient) DoesSubaccountBelongToVal(ctx context.Context, req *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error) { - return cli.client.DoesSubaccountBelongToVal(ctx, types.ToRequestDoesSubaccountBelongToVal(req).GetDoesSubaccountBelongToVal(), grpc.WaitForReady(true)) +func (cli *grpcClient) DoesSubAccountBelongToVal(ctx context.Context, req *types.RequestDoesSubAccountBelongToVal) (*types.ResponseDoesSubAccountBelongToVal, error) { + return cli.client.DoesSubAccountBelongToVal(ctx, types.ToRequestDoesSubAccountBelongToVal(req).GetDoesSubAccountBelongToVal(), grpc.WaitForReady(true)) } diff --git a/abci/client/mocks/client.go b/abci/client/mocks/client.go index 16751938e55..6e0840bd505 100644 --- a/abci/client/mocks/client.go +++ b/abci/client/mocks/client.go @@ -175,24 +175,24 @@ func (_m *Client) DoesOracleResultExist(_a0 context.Context, _a1 *types.RequestD return r0, r1 } -// DoesSubaccountBelongToVal provides a mock function with given fields: _a0, _a1 -func (_m *Client) DoesSubaccountBelongToVal(_a0 context.Context, _a1 *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error) { +// DoesSubAccountBelongToVal provides a mock function with given fields: _a0, _a1 +func (_m *Client) DoesSubAccountBelongToVal(_a0 context.Context, _a1 *types.RequestDoesSubAccountBelongToVal) (*types.ResponseDoesSubAccountBelongToVal, error) { ret := _m.Called(_a0, _a1) - var r0 *types.ResponseDoesSubaccountBelongToVal + var r0 *types.ResponseDoesSubAccountBelongToVal var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesSubAccountBelongToVal) (*types.ResponseDoesSubAccountBelongToVal, error)); ok { return rf(_a0, _a1) } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesSubaccountBelongToVal) *types.ResponseDoesSubaccountBelongToVal); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesSubAccountBelongToVal) *types.ResponseDoesSubAccountBelongToVal); ok { r0 = rf(_a0, _a1) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponseDoesSubaccountBelongToVal) + r0 = ret.Get(0).(*types.ResponseDoesSubAccountBelongToVal) } } - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestDoesSubaccountBelongToVal) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestDoesSubAccountBelongToVal) error); ok { r1 = rf(_a0, _a1) } else { r1 = ret.Error(1) diff --git a/abci/client/socket_client.go b/abci/client/socket_client.go index 7e9a1b19b0f..182be0ebeaa 100644 --- a/abci/client/socket_client.go +++ b/abci/client/socket_client.go @@ -456,15 +456,15 @@ func (cli *socketClient) DoesOracleResultExist(ctx context.Context, req *types.R return reqRes.Response.GetDoesOracleResultExist(), cli.Error() } -func (cli *socketClient) DoesSubaccountBelongToVal(ctx context.Context, req *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error) { - reqRes, err := cli.queueRequest(ctx, types.ToRequestDoesSubaccountBelongToVal(req)) +func (cli *socketClient) DoesSubAccountBelongToVal(ctx context.Context, req *types.RequestDoesSubAccountBelongToVal) (*types.ResponseDoesSubAccountBelongToVal, error) { + reqRes, err := cli.queueRequest(ctx, types.ToRequestDoesSubAccountBelongToVal(req)) if err != nil { return nil, err } if err := cli.Flush(ctx); err != nil { return nil, err } - return reqRes.Response.GetDoesSubaccountBelongToVal(), cli.Error() + return reqRes.Response.GetDoesSubAccountBelongToVal(), cli.Error() } func (cli *socketClient) queueRequest(ctx context.Context, req *types.Request) (*ReqRes, error) { diff --git a/abci/types/application.go b/abci/types/application.go index 29c934406fa..3634da421fe 100644 --- a/abci/types/application.go +++ b/abci/types/application.go @@ -40,7 +40,7 @@ type Application interface { FetchOracleVotes(context.Context, *RequestFetchOracleVotes) (*ResponseFetchOracleVotes, error) ValidateOracleVotes(context.Context, *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) DoesOracleResultExist(context.Context, *RequestDoesOracleResultExist) (*ResponseDoesOracleResultExist, error) - DoesSubaccountBelongToVal(context.Context, *RequestDoesSubaccountBelongToVal) (*ResponseDoesSubaccountBelongToVal, error) + DoesSubAccountBelongToVal(context.Context, *RequestDoesSubAccountBelongToVal) (*ResponseDoesSubAccountBelongToVal, error) } //------------------------------------------------------- @@ -143,6 +143,6 @@ func (BaseApplication) DoesOracleResultExist(_ context.Context, req *RequestDoes return &ResponseDoesOracleResultExist{}, nil } -func (BaseApplication) DoesSubaccountBelongToVal(_ context.Context, req *RequestDoesSubaccountBelongToVal) (*ResponseDoesSubaccountBelongToVal, error) { - return &ResponseDoesSubaccountBelongToVal{}, nil +func (BaseApplication) DoesSubAccountBelongToVal(_ context.Context, req *RequestDoesSubAccountBelongToVal) (*ResponseDoesSubAccountBelongToVal, error) { + return &ResponseDoesSubAccountBelongToVal{}, nil } diff --git a/abci/types/messages.go b/abci/types/messages.go index b60f6b60c5c..dbf7acd2801 100644 --- a/abci/types/messages.go +++ b/abci/types/messages.go @@ -148,9 +148,9 @@ func ToRequestDoesOracleResultExist(req *RequestDoesOracleResultExist) *Request } } -func ToRequestDoesSubaccountBelongToVal(req *RequestDoesSubaccountBelongToVal) *Request { +func ToRequestDoesSubAccountBelongToVal(req *RequestDoesSubAccountBelongToVal) *Request { return &Request{ - Value: &Request_DoesSubaccountBelongToVal{req}, + Value: &Request_DoesSubAccountBelongToVal{req}, } } diff --git a/abci/types/mocks/application.go b/abci/types/mocks/application.go index 45297bd1d8b..0ccd7673992 100644 --- a/abci/types/mocks/application.go +++ b/abci/types/mocks/application.go @@ -144,24 +144,24 @@ func (_m *Application) DoesOracleResultExist(_a0 context.Context, _a1 *types.Req return r0, r1 } -// DoesSubaccountBelongToVal provides a mock function with given fields: _a0, _a1 -func (_m *Application) DoesSubaccountBelongToVal(_a0 context.Context, _a1 *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error) { +// DoesSubAccountBelongToVal provides a mock function with given fields: _a0, _a1 +func (_m *Application) DoesSubAccountBelongToVal(_a0 context.Context, _a1 *types.RequestDoesSubAccountBelongToVal) (*types.ResponseDoesSubAccountBelongToVal, error) { ret := _m.Called(_a0, _a1) - var r0 *types.ResponseDoesSubaccountBelongToVal + var r0 *types.ResponseDoesSubAccountBelongToVal var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesSubAccountBelongToVal) (*types.ResponseDoesSubAccountBelongToVal, error)); ok { return rf(_a0, _a1) } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesSubaccountBelongToVal) *types.ResponseDoesSubaccountBelongToVal); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesSubAccountBelongToVal) *types.ResponseDoesSubAccountBelongToVal); ok { r0 = rf(_a0, _a1) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponseDoesSubaccountBelongToVal) + r0 = ret.Get(0).(*types.ResponseDoesSubAccountBelongToVal) } } - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestDoesSubaccountBelongToVal) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestDoesSubAccountBelongToVal) error); ok { r1 = rf(_a0, _a1) } else { r1 = ret.Error(1) diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index 02645581ac3..a7bdb6656fa 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -269,7 +269,7 @@ type Request struct { // *Request_FetchOracleVotes // *Request_ValidateOracleVotes // *Request_DoesOracleResultExist - // *Request_DoesSubaccountBelongToVal + // *Request_DoesSubAccountBelongToVal Value isRequest_Value `protobuf_oneof:"value"` } @@ -372,8 +372,8 @@ type Request_ValidateOracleVotes struct { type Request_DoesOracleResultExist struct { DoesOracleResultExist *RequestDoesOracleResultExist `protobuf:"bytes,24,opt,name=does_oracle_result_exist,json=doesOracleResultExist,proto3,oneof" json:"does_oracle_result_exist,omitempty"` } -type Request_DoesSubaccountBelongToVal struct { - DoesSubaccountBelongToVal *RequestDoesSubaccountBelongToVal `protobuf:"bytes,25,opt,name=does_subaccount_belong_to_val,json=doesSubaccountBelongToVal,proto3,oneof" json:"does_subaccount_belong_to_val,omitempty"` +type Request_DoesSubAccountBelongToVal struct { + DoesSubAccountBelongToVal *RequestDoesSubAccountBelongToVal `protobuf:"bytes,25,opt,name=does_sub_account_belong_to_val,json=doesSubAccountBelongToVal,proto3,oneof" json:"does_sub_account_belong_to_val,omitempty"` } func (*Request_Echo) isRequest_Value() {} @@ -396,7 +396,7 @@ func (*Request_CreateOracleResultTx) isRequest_Value() {} func (*Request_FetchOracleVotes) isRequest_Value() {} func (*Request_ValidateOracleVotes) isRequest_Value() {} func (*Request_DoesOracleResultExist) isRequest_Value() {} -func (*Request_DoesSubaccountBelongToVal) isRequest_Value() {} +func (*Request_DoesSubAccountBelongToVal) isRequest_Value() {} func (m *Request) GetValue() isRequest_Value { if m != nil { @@ -545,9 +545,9 @@ func (m *Request) GetDoesOracleResultExist() *RequestDoesOracleResultExist { return nil } -func (m *Request) GetDoesSubaccountBelongToVal() *RequestDoesSubaccountBelongToVal { - if x, ok := m.GetValue().(*Request_DoesSubaccountBelongToVal); ok { - return x.DoesSubaccountBelongToVal +func (m *Request) GetDoesSubAccountBelongToVal() *RequestDoesSubAccountBelongToVal { + if x, ok := m.GetValue().(*Request_DoesSubAccountBelongToVal); ok { + return x.DoesSubAccountBelongToVal } return nil } @@ -575,7 +575,7 @@ func (*Request) XXX_OneofWrappers() []interface{} { (*Request_FetchOracleVotes)(nil), (*Request_ValidateOracleVotes)(nil), (*Request_DoesOracleResultExist)(nil), - (*Request_DoesSubaccountBelongToVal)(nil), + (*Request_DoesSubAccountBelongToVal)(nil), } } @@ -1839,22 +1839,22 @@ func (m *RequestDoesOracleResultExist) GetKey() string { return "" } -type RequestDoesSubaccountBelongToVal struct { +type RequestDoesSubAccountBelongToVal struct { Address []byte `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` } -func (m *RequestDoesSubaccountBelongToVal) Reset() { *m = RequestDoesSubaccountBelongToVal{} } -func (m *RequestDoesSubaccountBelongToVal) String() string { return proto.CompactTextString(m) } -func (*RequestDoesSubaccountBelongToVal) ProtoMessage() {} -func (*RequestDoesSubaccountBelongToVal) Descriptor() ([]byte, []int) { +func (m *RequestDoesSubAccountBelongToVal) Reset() { *m = RequestDoesSubAccountBelongToVal{} } +func (m *RequestDoesSubAccountBelongToVal) String() string { return proto.CompactTextString(m) } +func (*RequestDoesSubAccountBelongToVal) ProtoMessage() {} +func (*RequestDoesSubAccountBelongToVal) Descriptor() ([]byte, []int) { return fileDescriptor_252557cfdd89a31a, []int{21} } -func (m *RequestDoesSubaccountBelongToVal) XXX_Unmarshal(b []byte) error { +func (m *RequestDoesSubAccountBelongToVal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *RequestDoesSubaccountBelongToVal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *RequestDoesSubAccountBelongToVal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_RequestDoesSubaccountBelongToVal.Marshal(b, m, deterministic) + return xxx_messageInfo_RequestDoesSubAccountBelongToVal.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1864,19 +1864,19 @@ func (m *RequestDoesSubaccountBelongToVal) XXX_Marshal(b []byte, deterministic b return b[:n], nil } } -func (m *RequestDoesSubaccountBelongToVal) XXX_Merge(src proto.Message) { - xxx_messageInfo_RequestDoesSubaccountBelongToVal.Merge(m, src) +func (m *RequestDoesSubAccountBelongToVal) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestDoesSubAccountBelongToVal.Merge(m, src) } -func (m *RequestDoesSubaccountBelongToVal) XXX_Size() int { +func (m *RequestDoesSubAccountBelongToVal) XXX_Size() int { return m.Size() } -func (m *RequestDoesSubaccountBelongToVal) XXX_DiscardUnknown() { - xxx_messageInfo_RequestDoesSubaccountBelongToVal.DiscardUnknown(m) +func (m *RequestDoesSubAccountBelongToVal) XXX_DiscardUnknown() { + xxx_messageInfo_RequestDoesSubAccountBelongToVal.DiscardUnknown(m) } -var xxx_messageInfo_RequestDoesSubaccountBelongToVal proto.InternalMessageInfo +var xxx_messageInfo_RequestDoesSubAccountBelongToVal proto.InternalMessageInfo -func (m *RequestDoesSubaccountBelongToVal) GetAddress() []byte { +func (m *RequestDoesSubAccountBelongToVal) GetAddress() []byte { if m != nil { return m.Address } @@ -1907,7 +1907,7 @@ type Response struct { // *Response_FetchOracleVotes // *Response_ValidateOracleVotes // *Response_DoesOracleResultExist - // *Response_DoesSubaccountBelongToVal + // *Response_DoesSubAccountBelongToVal Value isResponse_Value `protobuf_oneof:"value"` } @@ -2013,8 +2013,8 @@ type Response_ValidateOracleVotes struct { type Response_DoesOracleResultExist struct { DoesOracleResultExist *ResponseDoesOracleResultExist `protobuf:"bytes,25,opt,name=does_oracle_result_exist,json=doesOracleResultExist,proto3,oneof" json:"does_oracle_result_exist,omitempty"` } -type Response_DoesSubaccountBelongToVal struct { - DoesSubaccountBelongToVal *ResponseDoesSubaccountBelongToVal `protobuf:"bytes,26,opt,name=does_subaccount_belong_to_val,json=doesSubaccountBelongToVal,proto3,oneof" json:"does_subaccount_belong_to_val,omitempty"` +type Response_DoesSubAccountBelongToVal struct { + DoesSubAccountBelongToVal *ResponseDoesSubAccountBelongToVal `protobuf:"bytes,26,opt,name=does_sub_account_belong_to_val,json=doesSubAccountBelongToVal,proto3,oneof" json:"does_sub_account_belong_to_val,omitempty"` } func (*Response_Exception) isResponse_Value() {} @@ -2038,7 +2038,7 @@ func (*Response_CreateOracleResultTx) isResponse_Value() {} func (*Response_FetchOracleVotes) isResponse_Value() {} func (*Response_ValidateOracleVotes) isResponse_Value() {} func (*Response_DoesOracleResultExist) isResponse_Value() {} -func (*Response_DoesSubaccountBelongToVal) isResponse_Value() {} +func (*Response_DoesSubAccountBelongToVal) isResponse_Value() {} func (m *Response) GetValue() isResponse_Value { if m != nil { @@ -2194,9 +2194,9 @@ func (m *Response) GetDoesOracleResultExist() *ResponseDoesOracleResultExist { return nil } -func (m *Response) GetDoesSubaccountBelongToVal() *ResponseDoesSubaccountBelongToVal { - if x, ok := m.GetValue().(*Response_DoesSubaccountBelongToVal); ok { - return x.DoesSubaccountBelongToVal +func (m *Response) GetDoesSubAccountBelongToVal() *ResponseDoesSubAccountBelongToVal { + if x, ok := m.GetValue().(*Response_DoesSubAccountBelongToVal); ok { + return x.DoesSubAccountBelongToVal } return nil } @@ -2225,7 +2225,7 @@ func (*Response) XXX_OneofWrappers() []interface{} { (*Response_FetchOracleVotes)(nil), (*Response_ValidateOracleVotes)(nil), (*Response_DoesOracleResultExist)(nil), - (*Response_DoesSubaccountBelongToVal)(nil), + (*Response_DoesSubAccountBelongToVal)(nil), } } @@ -3370,22 +3370,22 @@ func (m *ResponseDoesOracleResultExist) GetDoesExist() bool { return false } -type ResponseDoesSubaccountBelongToVal struct { +type ResponseDoesSubAccountBelongToVal struct { BelongsToVal bool `protobuf:"varint,1,opt,name=belongs_to_val,json=belongsToVal,proto3" json:"belongs_to_val,omitempty"` } -func (m *ResponseDoesSubaccountBelongToVal) Reset() { *m = ResponseDoesSubaccountBelongToVal{} } -func (m *ResponseDoesSubaccountBelongToVal) String() string { return proto.CompactTextString(m) } -func (*ResponseDoesSubaccountBelongToVal) ProtoMessage() {} -func (*ResponseDoesSubaccountBelongToVal) Descriptor() ([]byte, []int) { +func (m *ResponseDoesSubAccountBelongToVal) Reset() { *m = ResponseDoesSubAccountBelongToVal{} } +func (m *ResponseDoesSubAccountBelongToVal) String() string { return proto.CompactTextString(m) } +func (*ResponseDoesSubAccountBelongToVal) ProtoMessage() {} +func (*ResponseDoesSubAccountBelongToVal) Descriptor() ([]byte, []int) { return fileDescriptor_252557cfdd89a31a, []int{44} } -func (m *ResponseDoesSubaccountBelongToVal) XXX_Unmarshal(b []byte) error { +func (m *ResponseDoesSubAccountBelongToVal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ResponseDoesSubaccountBelongToVal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ResponseDoesSubAccountBelongToVal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ResponseDoesSubaccountBelongToVal.Marshal(b, m, deterministic) + return xxx_messageInfo_ResponseDoesSubAccountBelongToVal.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3395,19 +3395,19 @@ func (m *ResponseDoesSubaccountBelongToVal) XXX_Marshal(b []byte, deterministic return b[:n], nil } } -func (m *ResponseDoesSubaccountBelongToVal) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResponseDoesSubaccountBelongToVal.Merge(m, src) +func (m *ResponseDoesSubAccountBelongToVal) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResponseDoesSubAccountBelongToVal.Merge(m, src) } -func (m *ResponseDoesSubaccountBelongToVal) XXX_Size() int { +func (m *ResponseDoesSubAccountBelongToVal) XXX_Size() int { return m.Size() } -func (m *ResponseDoesSubaccountBelongToVal) XXX_DiscardUnknown() { - xxx_messageInfo_ResponseDoesSubaccountBelongToVal.DiscardUnknown(m) +func (m *ResponseDoesSubAccountBelongToVal) XXX_DiscardUnknown() { + xxx_messageInfo_ResponseDoesSubAccountBelongToVal.DiscardUnknown(m) } -var xxx_messageInfo_ResponseDoesSubaccountBelongToVal proto.InternalMessageInfo +var xxx_messageInfo_ResponseDoesSubAccountBelongToVal proto.InternalMessageInfo -func (m *ResponseDoesSubaccountBelongToVal) GetBelongsToVal() bool { +func (m *ResponseDoesSubAccountBelongToVal) GetBelongsToVal() bool { if m != nil { return m.BelongsToVal } @@ -4230,7 +4230,7 @@ func init() { proto.RegisterType((*RequestFetchOracleVotes)(nil), "tendermint.abci.RequestFetchOracleVotes") proto.RegisterType((*RequestValidateOracleVotes)(nil), "tendermint.abci.RequestValidateOracleVotes") proto.RegisterType((*RequestDoesOracleResultExist)(nil), "tendermint.abci.RequestDoesOracleResultExist") - proto.RegisterType((*RequestDoesSubaccountBelongToVal)(nil), "tendermint.abci.RequestDoesSubaccountBelongToVal") + proto.RegisterType((*RequestDoesSubAccountBelongToVal)(nil), "tendermint.abci.RequestDoesSubAccountBelongToVal") proto.RegisterType((*Response)(nil), "tendermint.abci.Response") proto.RegisterType((*ResponseException)(nil), "tendermint.abci.ResponseException") proto.RegisterType((*ResponseEcho)(nil), "tendermint.abci.ResponseEcho") @@ -4253,7 +4253,7 @@ func init() { proto.RegisterType((*ResponseFetchOracleVotes)(nil), "tendermint.abci.ResponseFetchOracleVotes") proto.RegisterType((*ResponseValidateOracleVotes)(nil), "tendermint.abci.ResponseValidateOracleVotes") proto.RegisterType((*ResponseDoesOracleResultExist)(nil), "tendermint.abci.ResponseDoesOracleResultExist") - proto.RegisterType((*ResponseDoesSubaccountBelongToVal)(nil), "tendermint.abci.ResponseDoesSubaccountBelongToVal") + proto.RegisterType((*ResponseDoesSubAccountBelongToVal)(nil), "tendermint.abci.ResponseDoesSubAccountBelongToVal") proto.RegisterType((*CommitInfo)(nil), "tendermint.abci.CommitInfo") proto.RegisterType((*ExtendedCommitInfo)(nil), "tendermint.abci.ExtendedCommitInfo") proto.RegisterType((*Event)(nil), "tendermint.abci.Event") @@ -4271,238 +4271,238 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3687 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcd, 0x73, 0x1b, 0xc7, - 0xb1, 0xc7, 0xe2, 0x8b, 0x40, 0xe3, 0x83, 0xcb, 0x21, 0x45, 0x81, 0x90, 0x44, 0x52, 0xeb, 0x27, - 0x5b, 0x96, 0x6c, 0xd2, 0xa6, 0x9e, 0x6c, 0xab, 0x64, 0xbb, 0x8a, 0xa4, 0x20, 0x81, 0x94, 0x4c, - 0xd2, 0x4b, 0x48, 0x7e, 0x7a, 0xef, 0xc5, 0xeb, 0x05, 0x30, 0x00, 0xd6, 0x02, 0xb0, 0x6b, 0xec, - 0x02, 0x06, 0x7d, 0x4a, 0xd9, 0x49, 0x55, 0xca, 0x55, 0xa9, 0x72, 0x55, 0x2e, 0x3e, 0xc4, 0xa9, - 0xca, 0x21, 0x97, 0xfc, 0x05, 0x39, 0xe5, 0xe4, 0x83, 0x0f, 0x39, 0xf8, 0x98, 0x93, 0x93, 0xb2, - 0x6f, 0xbe, 0xe6, 0x90, 0x6b, 0x6a, 0x3e, 0xf6, 0x0b, 0xd8, 0xc5, 0x87, 0xec, 0x1c, 0x52, 0xc9, - 0x6d, 0x67, 0xb6, 0xbb, 0x07, 0xdb, 0xd3, 0x33, 0xfd, 0x9b, 0x5f, 0x0f, 0xe0, 0x82, 0x85, 0xbb, - 0x75, 0xdc, 0xeb, 0x68, 0x5d, 0x6b, 0x5b, 0xad, 0xd6, 0xb4, 0x6d, 0xeb, 0xcc, 0xc0, 0xe6, 0x96, - 0xd1, 0xd3, 0x2d, 0x1d, 0x2d, 0xba, 0x2f, 0xb7, 0xc8, 0xcb, 0xe2, 0x25, 0x8f, 0x74, 0xad, 0x77, - 0x66, 0x58, 0xfa, 0xb6, 0xd1, 0xd3, 0xf5, 0x06, 0x93, 0x2f, 0x5e, 0x1c, 0x7f, 0xfd, 0x04, 0x9f, - 0x71, 0x6b, 0x3e, 0x65, 0x3a, 0xca, 0xb6, 0xa1, 0xf6, 0xd4, 0x8e, 0xfd, 0x7a, 0x73, 0xec, 0xf5, - 0x40, 0x6d, 0x6b, 0x75, 0xd5, 0xd2, 0x7b, 0x5c, 0x62, 0xa3, 0xa9, 0xeb, 0xcd, 0x36, 0xde, 0xa6, - 0xad, 0x6a, 0xbf, 0xb1, 0x6d, 0x69, 0x1d, 0x6c, 0x5a, 0x6a, 0xc7, 0xe0, 0x02, 0x2b, 0x4d, 0xbd, - 0xa9, 0xd3, 0xc7, 0x6d, 0xf2, 0x14, 0x30, 0xae, 0xde, 0x53, 0x6b, 0x6d, 0xec, 0xfd, 0x48, 0xe9, - 0xcb, 0x1c, 0x2c, 0xc8, 0xf8, 0x83, 0x3e, 0x36, 0x2d, 0xb4, 0x03, 0x71, 0x5c, 0x6b, 0xe9, 0x05, - 0x61, 0x53, 0xb8, 0x9a, 0xd9, 0xb9, 0xb8, 0x35, 0xf2, 0xfd, 0x5b, 0x5c, 0xae, 0x54, 0x6b, 0xe9, - 0xe5, 0x88, 0x4c, 0x65, 0xd1, 0x4d, 0x48, 0x34, 0xda, 0x7d, 0xb3, 0x55, 0x88, 0x52, 0xa5, 0x4b, - 0x61, 0x4a, 0x77, 0x89, 0x50, 0x39, 0x22, 0x33, 0x69, 0x32, 0x94, 0xd6, 0x6d, 0xe8, 0x85, 0xd8, - 0xe4, 0xa1, 0x0e, 0xba, 0x0d, 0x3a, 0x14, 0x91, 0x45, 0x7b, 0x00, 0x5a, 0x57, 0xb3, 0x94, 0x5a, - 0x4b, 0xd5, 0xba, 0x85, 0x04, 0xd5, 0xbc, 0x1c, 0xae, 0xa9, 0x59, 0xfb, 0x44, 0xb0, 0x1c, 0x91, - 0xd3, 0x9a, 0xdd, 0x20, 0x3f, 0xf7, 0x83, 0x3e, 0xee, 0x9d, 0x15, 0x92, 0x93, 0x7f, 0xee, 0xdb, - 0x44, 0x88, 0xfc, 0x5c, 0x2a, 0x8d, 0x5e, 0x87, 0x54, 0xad, 0x85, 0x6b, 0x4f, 0x14, 0x6b, 0x58, - 0x48, 0x51, 0xcd, 0x8d, 0x30, 0xcd, 0x7d, 0x22, 0x57, 0x19, 0x96, 0x23, 0xf2, 0x42, 0x8d, 0x3d, - 0xa2, 0xd7, 0x20, 0x59, 0xd3, 0x3b, 0x1d, 0xcd, 0x2a, 0x64, 0xa8, 0xee, 0x7a, 0xa8, 0x2e, 0x95, - 0x2a, 0x47, 0x64, 0x2e, 0x8f, 0x8e, 0x20, 0xdf, 0xd6, 0x4c, 0x4b, 0x31, 0xbb, 0xaa, 0x61, 0xb6, - 0x74, 0xcb, 0x2c, 0x64, 0xa9, 0x85, 0x2b, 0x61, 0x16, 0x1e, 0x68, 0xa6, 0x75, 0x6a, 0x0b, 0x97, - 0x23, 0x72, 0xae, 0xed, 0xed, 0x20, 0xf6, 0xf4, 0x46, 0x03, 0xf7, 0x1c, 0x83, 0x85, 0xdc, 0x64, - 0x7b, 0xc7, 0x44, 0xda, 0xd6, 0x27, 0xf6, 0x74, 0x6f, 0x07, 0xfa, 0x3f, 0x58, 0x6e, 0xeb, 0x6a, - 0xdd, 0x31, 0xa7, 0xd4, 0x5a, 0xfd, 0xee, 0x93, 0x42, 0x9e, 0x1a, 0x7d, 0x3e, 0xf4, 0x47, 0xea, - 0x6a, 0xdd, 0x36, 0xb1, 0x4f, 0x14, 0xca, 0x11, 0x79, 0xa9, 0x3d, 0xda, 0x89, 0xde, 0x85, 0x15, - 0xd5, 0x30, 0xda, 0x67, 0xa3, 0xd6, 0x17, 0xa9, 0xf5, 0x6b, 0x61, 0xd6, 0x77, 0x89, 0xce, 0xa8, - 0x79, 0xa4, 0x8e, 0xf5, 0xa2, 0x0a, 0x88, 0x46, 0x0f, 0x1b, 0x6a, 0x0f, 0x2b, 0x46, 0x4f, 0x37, - 0x74, 0x53, 0x6d, 0x17, 0x44, 0x6a, 0xfb, 0xb9, 0x30, 0xdb, 0x27, 0x4c, 0xfe, 0x84, 0x8b, 0x97, - 0x23, 0xf2, 0xa2, 0xe1, 0xef, 0x62, 0x56, 0xf5, 0x1a, 0x36, 0x4d, 0xd7, 0xea, 0xd2, 0x34, 0xab, - 0x54, 0xde, 0x6f, 0xd5, 0xd7, 0x85, 0x4a, 0x90, 0xc1, 0x43, 0xa2, 0xae, 0x0c, 0x74, 0x0b, 0x17, - 0x10, 0x35, 0x28, 0x85, 0xae, 0x50, 0x2a, 0xfa, 0x48, 0xb7, 0x70, 0x39, 0x22, 0x03, 0x76, 0x5a, - 0x48, 0x85, 0x73, 0x03, 0xdc, 0xd3, 0x1a, 0x67, 0xd4, 0x8c, 0x42, 0xdf, 0x98, 0x9a, 0xde, 0x2d, - 0x2c, 0x53, 0x83, 0xd7, 0xc3, 0x0c, 0x3e, 0xa2, 0x4a, 0xc4, 0x44, 0xc9, 0x56, 0x29, 0x47, 0xe4, - 0xe5, 0xc1, 0x78, 0x37, 0x09, 0xb1, 0x86, 0xd6, 0x55, 0xdb, 0xda, 0x47, 0x58, 0xa9, 0xb6, 0xf5, - 0xda, 0x93, 0xc2, 0xca, 0xe4, 0x10, 0xbb, 0xcb, 0xa5, 0xf7, 0x88, 0x30, 0x09, 0xb1, 0x86, 0xb7, - 0x03, 0x61, 0x38, 0x5f, 0xeb, 0x61, 0xd5, 0xc2, 0x0a, 0xdb, 0xbd, 0x94, 0x1e, 0x36, 0xfb, 0x6d, - 0x8b, 0xac, 0xc4, 0x73, 0xd4, 0xf0, 0x0b, 0xa1, 0xab, 0x89, 0xaa, 0x1d, 0x53, 0x2d, 0x99, 0x2a, - 0xd1, 0x65, 0xb9, 0x52, 0x0b, 0xe8, 0x47, 0xff, 0x03, 0xa8, 0x81, 0xad, 0x5a, 0xcb, 0x1e, 0x85, - 0xf8, 0xc7, 0x2c, 0xac, 0xd2, 0x11, 0xae, 0x86, 0xfe, 0x74, 0xa2, 0xc1, 0x0c, 0x11, 0x27, 0x90, - 0x05, 0x27, 0x36, 0x46, 0xfa, 0xa8, 0xcf, 0xd9, 0x56, 0x8e, 0xfd, 0xc6, 0xcf, 0x4f, 0xf1, 0x39, - 0x57, 0xf2, 0xdb, 0x5f, 0x1e, 0x8c, 0x77, 0xa3, 0x16, 0x14, 0xea, 0x3a, 0x36, 0x47, 0x3c, 0x84, - 0x87, 0x9a, 0x69, 0x15, 0x0a, 0x74, 0x94, 0x17, 0xc3, 0x46, 0xb9, 0xa3, 0x63, 0xd3, 0xeb, 0x8a, - 0x12, 0x51, 0x2a, 0x47, 0xe4, 0x73, 0xf5, 0xa0, 0x17, 0xa8, 0x0f, 0x97, 0xe8, 0x48, 0x66, 0xbf, - 0xaa, 0xd6, 0x6a, 0x7a, 0xbf, 0x6b, 0x29, 0x55, 0xdc, 0xd6, 0xbb, 0x4d, 0xc5, 0xd2, 0x95, 0x81, - 0xda, 0x2e, 0xac, 0xd1, 0xe1, 0x5e, 0x9e, 0x34, 0xdc, 0xa9, 0xa3, 0xbb, 0x47, 0x55, 0x2b, 0xfa, - 0x23, 0x1a, 0xf4, 0x6b, 0xf5, 0xb0, 0x97, 0x7b, 0x0b, 0x90, 0x18, 0xa8, 0xed, 0x3e, 0x3e, 0x8c, - 0xa7, 0xe2, 0x62, 0xe2, 0x30, 0x9e, 0x5a, 0x10, 0x53, 0x87, 0xf1, 0x54, 0x5a, 0x84, 0xc3, 0x78, - 0x0a, 0xc4, 0x8c, 0xf4, 0x1c, 0x64, 0x3c, 0xd9, 0x09, 0x15, 0x60, 0xa1, 0x83, 0x4d, 0x53, 0x6d, - 0x62, 0x9a, 0xcc, 0xd2, 0xb2, 0xdd, 0x94, 0xf2, 0x90, 0xf5, 0x66, 0x24, 0xe9, 0x33, 0xc1, 0xd1, - 0x24, 0xc9, 0x86, 0x68, 0x0e, 0x70, 0x8f, 0xae, 0x09, 0xae, 0xc9, 0x9b, 0xe8, 0x19, 0xc8, 0xd1, - 0x78, 0x56, 0xec, 0xf7, 0x24, 0xe3, 0xc5, 0xe5, 0x2c, 0xed, 0x7c, 0xc4, 0x85, 0x36, 0x20, 0x63, - 0xec, 0x18, 0x8e, 0x48, 0x8c, 0x8a, 0x80, 0xb1, 0x63, 0xd8, 0x02, 0x97, 0x21, 0x4b, 0xfc, 0xe1, - 0x48, 0xc4, 0xe9, 0x20, 0x19, 0xd2, 0xc7, 0x45, 0xa4, 0x3f, 0x45, 0x41, 0x1c, 0xcd, 0x62, 0xe8, - 0x35, 0x88, 0x93, 0x7c, 0xcf, 0x73, 0x73, 0x71, 0x8b, 0x81, 0x81, 0x2d, 0x1b, 0x0c, 0x6c, 0x55, - 0x6c, 0x30, 0xb0, 0x97, 0xfa, 0xea, 0x9b, 0x8d, 0xc8, 0x67, 0x7f, 0xd9, 0x10, 0x64, 0xaa, 0x81, - 0xd6, 0x48, 0xee, 0x52, 0xb5, 0xae, 0xa2, 0xd5, 0xe9, 0x4f, 0x4e, 0x93, 0xc4, 0xa4, 0x6a, 0xdd, - 0x83, 0x3a, 0x7a, 0x00, 0x62, 0x4d, 0xef, 0x9a, 0xb8, 0x6b, 0xf6, 0x4d, 0x85, 0xc1, 0x11, 0x9e, - 0x91, 0x7d, 0x79, 0x95, 0xe1, 0x85, 0x7d, 0x5b, 0xf2, 0x84, 0x0a, 0xca, 0x8b, 0x35, 0x7f, 0x07, - 0xba, 0x0b, 0xe0, 0x60, 0x16, 0xb3, 0x10, 0xdf, 0x8c, 0x5d, 0xcd, 0xec, 0x6c, 0x8e, 0x05, 0xc2, - 0x23, 0x5b, 0xe4, 0xa1, 0x41, 0xc2, 0x78, 0x2f, 0x4e, 0x7e, 0xae, 0xec, 0xd1, 0x44, 0xcf, 0xc2, - 0xa2, 0x6a, 0x18, 0x8a, 0x69, 0x91, 0x15, 0x53, 0x3d, 0x23, 0x4b, 0x85, 0x24, 0xfb, 0xac, 0x9c, - 0x53, 0x0d, 0xe3, 0x94, 0xf4, 0xee, 0x91, 0x4e, 0x74, 0x05, 0xf2, 0x24, 0xb1, 0x6b, 0x6a, 0x5b, - 0x69, 0x61, 0xad, 0xd9, 0xb2, 0x68, 0x52, 0x8f, 0xc9, 0x39, 0xde, 0x5b, 0xa6, 0x9d, 0x52, 0xdd, - 0x99, 0x71, 0x9a, 0xd4, 0x11, 0x82, 0x78, 0x5d, 0xb5, 0x54, 0xea, 0xc9, 0xac, 0x4c, 0x9f, 0x49, - 0x9f, 0xa1, 0x5a, 0x2d, 0xee, 0x1f, 0xfa, 0x8c, 0x56, 0x21, 0xc9, 0xcd, 0xc6, 0xa8, 0x59, 0xde, - 0x42, 0x2b, 0x90, 0x30, 0x7a, 0xfa, 0x00, 0xd3, 0xa9, 0x4b, 0xc9, 0xac, 0x21, 0xc9, 0x90, 0xf7, - 0x03, 0x00, 0x94, 0x87, 0xa8, 0x35, 0xe4, 0xa3, 0x44, 0xad, 0x21, 0x7a, 0x09, 0xe2, 0xc4, 0x91, - 0x74, 0x8c, 0x7c, 0x00, 0xe4, 0xe1, 0x7a, 0x95, 0x33, 0x03, 0xcb, 0x54, 0x52, 0x5a, 0x84, 0x9c, - 0x0f, 0x18, 0x48, 0xab, 0xb0, 0x12, 0x94, 0xe7, 0xa5, 0x96, 0xd3, 0xef, 0xcb, 0xd7, 0xe8, 0x26, - 0xa4, 0x9c, 0x44, 0xcf, 0x02, 0x67, 0x6d, 0x6c, 0x58, 0x5b, 0x58, 0x76, 0x44, 0x49, 0xc4, 0x90, - 0x09, 0x68, 0xa9, 0x1c, 0xd6, 0x65, 0xe5, 0x05, 0xd5, 0x30, 0xca, 0xaa, 0xd9, 0x92, 0xde, 0x83, - 0x42, 0x58, 0x12, 0xf7, 0x38, 0x4c, 0xa0, 0x61, 0x6f, 0x3b, 0x6c, 0x15, 0x92, 0x0d, 0xbd, 0xd7, - 0x51, 0x2d, 0x6a, 0x2c, 0x27, 0xf3, 0x16, 0x71, 0x24, 0x4b, 0xe8, 0x31, 0xda, 0xcd, 0x1a, 0x92, - 0x02, 0x6b, 0xa1, 0x89, 0x9c, 0xa8, 0x68, 0xdd, 0x3a, 0x66, 0x6e, 0xcd, 0xc9, 0xac, 0xe1, 0x1a, - 0x62, 0x3f, 0x96, 0x35, 0xc8, 0xb0, 0x26, 0xfd, 0x56, 0x6a, 0x3f, 0x2d, 0xf3, 0x96, 0xf4, 0x79, - 0x0c, 0x56, 0x83, 0xd3, 0x39, 0xda, 0x84, 0x6c, 0x47, 0x1d, 0x2a, 0xd6, 0x90, 0x87, 0x9d, 0x40, - 0x27, 0x1e, 0x3a, 0xea, 0xb0, 0x32, 0x64, 0x31, 0x27, 0x42, 0xcc, 0x1a, 0x9a, 0x85, 0xe8, 0x66, - 0xec, 0x6a, 0x56, 0x26, 0x8f, 0xe8, 0x21, 0x2c, 0xb5, 0xf5, 0x9a, 0xda, 0x56, 0xda, 0xaa, 0x69, - 0x29, 0x1c, 0xe7, 0xb1, 0x45, 0xf4, 0xcc, 0x98, 0xb3, 0x59, 0x62, 0xc6, 0x75, 0x36, 0x9f, 0x64, - 0xc3, 0xe1, 0xf1, 0xbf, 0x48, 0x6d, 0x3c, 0x50, 0xed, 0xa9, 0x46, 0x77, 0x20, 0xd3, 0xd1, 0xcc, - 0x2a, 0x6e, 0xa9, 0x03, 0x4d, 0xef, 0xf1, 0xd5, 0x34, 0x1e, 0x34, 0x6f, 0xb9, 0x32, 0xdc, 0x92, - 0x57, 0xcd, 0x33, 0x25, 0x09, 0x5f, 0x0c, 0xdb, 0xbb, 0x49, 0x72, 0xee, 0xdd, 0xe4, 0x25, 0x58, - 0xe9, 0xe2, 0xa1, 0xa5, 0xb8, 0xeb, 0x95, 0xc5, 0xc9, 0x02, 0x75, 0x3d, 0x22, 0xef, 0x9c, 0x15, - 0x6e, 0x92, 0x90, 0x41, 0xcf, 0x53, 0x40, 0x64, 0xe8, 0x26, 0xee, 0x29, 0x6a, 0xbd, 0xde, 0xc3, - 0xa6, 0x49, 0x31, 0x74, 0x96, 0xa2, 0x1c, 0xda, 0xbf, 0xcb, 0xba, 0xa5, 0x5f, 0x78, 0xa7, 0xc6, - 0x0f, 0x80, 0xb8, 0xe3, 0x05, 0xd7, 0xf1, 0xa7, 0xb0, 0xc2, 0xf5, 0xeb, 0x3e, 0xdf, 0xb3, 0x83, - 0xc8, 0x85, 0xf1, 0xf5, 0x35, 0xea, 0x73, 0x64, 0xab, 0x87, 0xbb, 0x3d, 0xf6, 0x74, 0x6e, 0x47, - 0x10, 0xa7, 0x4e, 0x89, 0xb3, 0x2d, 0x86, 0x3c, 0xff, 0xab, 0x4d, 0xc5, 0x27, 0x31, 0x58, 0x1a, - 0x43, 0x93, 0xce, 0x87, 0x09, 0x81, 0x1f, 0x16, 0x0d, 0xfc, 0xb0, 0xd8, 0xdc, 0x1f, 0xc6, 0xe7, - 0x3a, 0x3e, 0x7d, 0xae, 0x13, 0x3f, 0xe2, 0x5c, 0x27, 0x9f, 0x6e, 0xae, 0xff, 0xa9, 0xb3, 0xf0, - 0x6b, 0x01, 0x8a, 0xe1, 0x10, 0x3c, 0x70, 0x3a, 0xae, 0xc3, 0x92, 0xf3, 0x53, 0x1c, 0xf3, 0x6c, - 0x63, 0x14, 0x9d, 0x17, 0xdc, 0x7e, 0x68, 0x8e, 0xbb, 0x02, 0xf9, 0x91, 0x03, 0x02, 0x0b, 0xe5, - 0xdc, 0xc0, 0x3b, 0xbe, 0xf4, 0xb3, 0x98, 0x93, 0x78, 0x7c, 0x28, 0x3e, 0x60, 0xb5, 0xbe, 0x0d, - 0xcb, 0x75, 0x5c, 0xd3, 0xea, 0x4f, 0xbb, 0x58, 0x97, 0xb8, 0xf6, 0x7f, 0xd6, 0xea, 0x78, 0x94, - 0x7c, 0x2c, 0xc0, 0x85, 0x09, 0x67, 0x1e, 0x54, 0x84, 0x94, 0xad, 0xc2, 0x43, 0xc5, 0x69, 0xa3, - 0x7b, 0x90, 0x6f, 0xea, 0xa6, 0xa9, 0x19, 0xb8, 0xce, 0x8f, 0x25, 0xd1, 0x71, 0xe0, 0xc6, 0xce, - 0x15, 0x5b, 0xf7, 0xb8, 0x20, 0x3d, 0x74, 0xc8, 0xb9, 0xa6, 0xb7, 0x29, 0xad, 0xc1, 0xf9, 0x90, - 0x53, 0x91, 0x74, 0xcb, 0x0d, 0xe2, 0x80, 0xc3, 0xcb, 0x05, 0x48, 0xf3, 0x73, 0x8b, 0x03, 0x97, - 0x52, 0xac, 0xa3, 0x32, 0x94, 0x5e, 0x82, 0x8b, 0x93, 0x0e, 0x2a, 0x24, 0xd0, 0x9e, 0xe0, 0x33, - 0x0e, 0xd5, 0xc9, 0xa3, 0xf4, 0x3a, 0x6c, 0x4e, 0x3b, 0x6b, 0x10, 0x90, 0x6f, 0xbb, 0x54, 0xe0, - 0xf8, 0x86, 0xbb, 0xf2, 0x37, 0x79, 0x48, 0xc9, 0xd8, 0x34, 0x08, 0xb4, 0x45, 0x7b, 0x90, 0xc6, - 0xc3, 0x1a, 0x36, 0x2c, 0xfb, 0x34, 0x10, 0x7c, 0xe4, 0x66, 0xd2, 0x25, 0x5b, 0xb2, 0x1c, 0x91, - 0x5d, 0x35, 0x74, 0x83, 0x73, 0x6a, 0xe1, 0xf4, 0x18, 0x57, 0xf7, 0x92, 0x6a, 0xaf, 0xd8, 0xa4, - 0x5a, 0x2c, 0x94, 0x2f, 0x62, 0x5a, 0x23, 0xac, 0xda, 0x0d, 0xce, 0xaa, 0xc5, 0xa7, 0x0c, 0xe6, - 0xa3, 0xd5, 0xf6, 0x7d, 0xb4, 0x5a, 0x72, 0xca, 0x67, 0x86, 0xf0, 0x6a, 0xaf, 0xd8, 0xbc, 0xda, - 0xc2, 0x94, 0x5f, 0x3c, 0x42, 0xac, 0xbd, 0xe1, 0x21, 0xd6, 0xd2, 0x54, 0x75, 0x33, 0x54, 0x35, - 0x80, 0x59, 0xbb, 0xe5, 0x30, 0x6b, 0xd9, 0x50, 0x56, 0x8e, 0x2b, 0x8f, 0x52, 0x6b, 0xc7, 0x63, - 0xd4, 0x1a, 0xa3, 0xc2, 0x9e, 0x0d, 0x35, 0x31, 0x85, 0x5b, 0x3b, 0x1e, 0xe3, 0xd6, 0xf2, 0x53, - 0x0c, 0x4e, 0x21, 0xd7, 0xfe, 0x3f, 0x98, 0x5c, 0x0b, 0xa7, 0xbf, 0xf8, 0xcf, 0x9c, 0x8d, 0x5d, - 0x53, 0x42, 0xd8, 0x35, 0x31, 0x94, 0x95, 0x60, 0xe6, 0x67, 0xa6, 0xd7, 0x1e, 0x06, 0xd0, 0x6b, - 0x4b, 0xa1, 0x7c, 0x0a, 0x33, 0x3e, 0x03, 0xbf, 0xf6, 0x30, 0x80, 0x5f, 0x43, 0x53, 0xcd, 0x4e, - 0x25, 0xd8, 0xee, 0xfa, 0x09, 0xb6, 0xe5, 0x10, 0x00, 0xef, 0xae, 0xf6, 0x10, 0x86, 0xad, 0x1a, - 0xc6, 0xb0, 0xad, 0x84, 0x92, 0x55, 0xcc, 0xe2, 0x1c, 0x14, 0xdb, 0xf1, 0x18, 0xc5, 0x76, 0x6e, - 0x4a, 0xa4, 0x4d, 0xe1, 0xd8, 0x1a, 0xe1, 0x1c, 0xdb, 0x6a, 0x28, 0x7d, 0xc4, 0xd7, 0xd5, 0x3c, - 0x24, 0xdb, 0xe3, 0x40, 0x92, 0xed, 0x7c, 0x28, 0x5b, 0xcc, 0x7f, 0xfc, 0x2c, 0x2c, 0x5b, 0x35, - 0x8c, 0x65, 0x2b, 0x4c, 0xf3, 0xfb, 0xec, 0x34, 0x9b, 0x36, 0x81, 0x66, 0x63, 0xbc, 0xd7, 0x56, - 0xe8, 0x30, 0x73, 0xf2, 0x6c, 0x83, 0x69, 0x3c, 0x5b, 0x91, 0x8e, 0xb7, 0x33, 0x71, 0xbc, 0x1f, - 0x46, 0xb4, 0x25, 0xc4, 0xe4, 0x61, 0x3c, 0x95, 0x12, 0xd3, 0x8c, 0x62, 0x3b, 0x8c, 0xa7, 0x32, - 0x62, 0x56, 0x7a, 0x9e, 0x1c, 0x0b, 0x46, 0x32, 0x1e, 0x39, 0x80, 0xe3, 0x5e, 0x4f, 0xef, 0xf1, - 0x3c, 0xcc, 0x1a, 0xd2, 0x55, 0xc8, 0x7a, 0xb3, 0xdb, 0x04, 0x52, 0x8e, 0x12, 0x1d, 0x9e, 0x8c, - 0x26, 0xfd, 0x41, 0x70, 0x75, 0x29, 0x2d, 0xe7, 0x25, 0x6d, 0xd2, 0x9c, 0xb4, 0xf1, 0x50, 0x75, - 0x51, 0x3f, 0x55, 0xb7, 0x01, 0x19, 0xd5, 0x18, 0x63, 0xe1, 0x54, 0xc3, 0x61, 0xe1, 0xae, 0xc1, - 0x12, 0x45, 0xa1, 0x8c, 0xd0, 0xe3, 0x58, 0x2f, 0x4e, 0xb1, 0xde, 0x22, 0x79, 0xc1, 0xd6, 0x09, - 0x03, 0x7d, 0x2f, 0xc2, 0xb2, 0x47, 0xd6, 0x21, 0x46, 0x18, 0x25, 0x25, 0x3a, 0xd2, 0xbb, 0x9c, - 0x21, 0xf9, 0x52, 0x70, 0x3d, 0xe4, 0xd2, 0x77, 0x41, 0x4c, 0x9b, 0xf0, 0x23, 0x31, 0x6d, 0xd1, - 0xa7, 0x66, 0xda, 0xbc, 0x44, 0x4f, 0xcc, 0x4f, 0xf4, 0xfc, 0x5d, 0x70, 0xe7, 0xc4, 0xe1, 0xcd, - 0x6a, 0x7a, 0x1d, 0x73, 0xea, 0x85, 0x3e, 0x13, 0xf8, 0xd5, 0xd6, 0x9b, 0x9c, 0x60, 0x21, 0x8f, - 0x44, 0xca, 0x81, 0x20, 0x69, 0x8e, 0x30, 0x1c, 0xd6, 0x86, 0xa1, 0x69, 0xce, 0xda, 0x70, 0xe8, - 0x96, 0xa4, 0xe3, 0x92, 0x47, 0x22, 0x47, 0x83, 0x8f, 0xa3, 0x62, 0xd6, 0x40, 0xaf, 0x41, 0x9a, - 0x56, 0x59, 0x15, 0xdd, 0x30, 0x79, 0xf1, 0xcd, 0x77, 0x5e, 0x60, 0xa5, 0xd6, 0xad, 0x13, 0x22, - 0x73, 0x6c, 0x98, 0x14, 0xdb, 0xd2, 0x27, 0x0f, 0x8c, 0x4f, 0xfb, 0x60, 0xfc, 0x45, 0x48, 0x93, - 0x5f, 0x6f, 0x1a, 0x6a, 0x0d, 0x17, 0x80, 0xfe, 0x50, 0xb7, 0x43, 0xfa, 0x7d, 0x14, 0x16, 0x47, - 0x20, 0x47, 0xe0, 0xb7, 0xdb, 0x21, 0x19, 0xf5, 0xf0, 0x88, 0xb3, 0xf9, 0x63, 0x1d, 0xa0, 0xa9, - 0x9a, 0xca, 0x87, 0x6a, 0xd7, 0xc2, 0x75, 0xee, 0x14, 0x4f, 0x0f, 0xc1, 0xeb, 0xa4, 0xd5, 0x37, - 0x71, 0x9d, 0x53, 0x9a, 0x4e, 0x1b, 0x95, 0x21, 0x89, 0x07, 0xb8, 0x6b, 0x99, 0x85, 0x05, 0x3a, - 0xed, 0xab, 0xe3, 0x1c, 0x13, 0x79, 0xbd, 0x57, 0x20, 0x93, 0xfd, 0xfd, 0x37, 0x1b, 0x22, 0x93, - 0x7e, 0x41, 0xef, 0x68, 0x16, 0xee, 0x18, 0xd6, 0x99, 0xcc, 0xf5, 0xfd, 0x5e, 0x48, 0x8d, 0x78, - 0x81, 0x92, 0xeb, 0x59, 0x9b, 0x33, 0x23, 0x3e, 0xd5, 0xf4, 0x9e, 0x66, 0x9d, 0xc9, 0xb9, 0x0e, - 0xee, 0x18, 0xba, 0xde, 0x56, 0xd8, 0x1a, 0xdf, 0x85, 0xbc, 0x1f, 0x61, 0xa1, 0x67, 0x20, 0xd7, - 0xc3, 0x96, 0xaa, 0x75, 0x15, 0xdf, 0xc9, 0x32, 0xcb, 0x3a, 0xd9, 0x9a, 0x3a, 0x8c, 0xa7, 0x04, - 0x31, 0x7a, 0x18, 0x4f, 0x45, 0xc5, 0x98, 0x74, 0x02, 0xe7, 0x02, 0x11, 0x16, 0x7a, 0x15, 0xd2, - 0x2e, 0x38, 0x13, 0xe8, 0xd7, 0x4e, 0xa0, 0x2f, 0x5d, 0x59, 0xe9, 0x8f, 0x82, 0x6b, 0xd2, 0x4f, - 0x88, 0x96, 0x20, 0xc9, 0x76, 0x6d, 0x3a, 0x93, 0xf9, 0x09, 0x79, 0xcd, 0xa7, 0xb7, 0xc5, 0xb6, - 0x66, 0x99, 0x2b, 0x4b, 0xef, 0x42, 0x92, 0xf5, 0xa0, 0x0c, 0x2c, 0x3c, 0x3c, 0xba, 0x7f, 0x74, - 0xfc, 0xce, 0x91, 0x18, 0x41, 0x00, 0xc9, 0xdd, 0xfd, 0xfd, 0xd2, 0x49, 0x45, 0x14, 0x50, 0x1a, - 0x12, 0xbb, 0x7b, 0xc7, 0x72, 0x45, 0x8c, 0x92, 0x6e, 0xb9, 0x74, 0x58, 0xda, 0xaf, 0x88, 0x31, - 0xb4, 0x04, 0x39, 0xf6, 0xac, 0xdc, 0x3d, 0x96, 0xdf, 0xda, 0xad, 0x88, 0x71, 0x4f, 0xd7, 0x69, - 0xe9, 0xe8, 0x4e, 0x49, 0x16, 0x13, 0xd2, 0xcb, 0xb0, 0x16, 0x8a, 0xe6, 0x5c, 0xb6, 0x53, 0xf0, - 0xb0, 0x9d, 0xd2, 0xe7, 0x51, 0x72, 0xc8, 0x0a, 0x83, 0x68, 0xe8, 0x70, 0xe4, 0xc3, 0x77, 0xe6, - 0xc0, 0x77, 0x23, 0x5f, 0x8f, 0xae, 0x40, 0xbe, 0x87, 0x59, 0x1e, 0xa7, 0x63, 0xb3, 0x1d, 0x28, - 0x27, 0xe7, 0x78, 0x2f, 0x55, 0x32, 0x99, 0xd8, 0xfb, 0xb8, 0x66, 0x29, 0x2c, 0x88, 0x4c, 0x7a, - 0x42, 0x4f, 0x13, 0x31, 0xd2, 0x7b, 0xca, 0x3a, 0xa5, 0xf7, 0xe6, 0xf2, 0x65, 0x1a, 0x12, 0x72, - 0xa9, 0x22, 0x3f, 0x16, 0x63, 0x08, 0x41, 0x9e, 0x3e, 0x2a, 0xa7, 0x47, 0xbb, 0x27, 0xa7, 0xe5, - 0x63, 0xe2, 0xcb, 0x65, 0x58, 0xb4, 0x7d, 0x69, 0x77, 0x26, 0xa4, 0xeb, 0xe4, 0x64, 0x1a, 0x88, - 0x2f, 0xc7, 0x79, 0x0a, 0xe9, 0xb7, 0x82, 0x57, 0xda, 0x8f, 0x11, 0x8f, 0x21, 0x69, 0x5a, 0xaa, - 0xd5, 0x37, 0xb9, 0x13, 0x5f, 0x9d, 0x15, 0x70, 0x6e, 0xd9, 0x0f, 0xa7, 0x54, 0x5d, 0xe6, 0x66, - 0xa4, 0x9b, 0x90, 0xf7, 0xbf, 0x09, 0xf7, 0x81, 0x1b, 0x44, 0x51, 0xe9, 0x36, 0xa0, 0x71, 0x1c, - 0x1a, 0xc0, 0xd9, 0x08, 0x41, 0x9c, 0xcd, 0xef, 0x28, 0x59, 0x10, 0x8a, 0x39, 0xd1, 0xdb, 0x23, - 0x1f, 0x79, 0x6b, 0x1e, 0xc4, 0xba, 0xc5, 0xfa, 0x46, 0x3e, 0xf3, 0x06, 0x64, 0xbd, 0xfd, 0xb3, - 0x7d, 0xe4, 0xf7, 0x51, 0x77, 0x11, 0xfb, 0xc9, 0x25, 0x77, 0x0b, 0x14, 0x7e, 0xe0, 0x16, 0xf8, - 0x3a, 0x80, 0x35, 0xe4, 0x38, 0xce, 0xce, 0xa3, 0x97, 0x02, 0x48, 0x7b, 0x5c, 0xab, 0x0c, 0xf9, - 0x22, 0x48, 0x5b, 0xfc, 0xc9, 0x44, 0xa7, 0x5e, 0xa6, 0xad, 0x4f, 0x73, 0xac, 0xc9, 0x59, 0xa8, - 0x59, 0x93, 0xb1, 0xcb, 0xc8, 0xb1, 0x6e, 0x13, 0x3d, 0x86, 0xf3, 0x23, 0x40, 0xc1, 0x31, 0x1d, - 0x9f, 0x15, 0x2f, 0x9c, 0xf3, 0xe3, 0x05, 0xdb, 0xb4, 0x37, 0xdb, 0x27, 0xfc, 0xd9, 0xfe, 0x0d, - 0xb8, 0x38, 0x09, 0xd0, 0xa3, 0x4b, 0x00, 0xb8, 0x4b, 0x92, 0x43, 0xdd, 0x25, 0x69, 0xd2, 0xbc, - 0xa7, 0x32, 0x94, 0xee, 0x41, 0x21, 0x0c, 0xac, 0xa3, 0xeb, 0x10, 0xa7, 0x27, 0x2a, 0x86, 0x76, - 0xce, 0x07, 0xd0, 0x4a, 0x44, 0x4e, 0xa6, 0x42, 0xd2, 0x2f, 0xbd, 0xc1, 0x19, 0x80, 0xc0, 0xef, - 0x8f, 0x04, 0xe7, 0x8d, 0x79, 0x60, 0xfd, 0xd6, 0x48, 0x58, 0x5e, 0x86, 0x24, 0x0f, 0x48, 0x12, - 0x83, 0x7b, 0xa7, 0xa5, 0xa3, 0x8a, 0x18, 0x21, 0xc1, 0x79, 0x22, 0x97, 0x68, 0x43, 0x90, 0xde, - 0x84, 0x4b, 0x13, 0x01, 0x3c, 0x71, 0x0c, 0xc5, 0xe9, 0xec, 0x10, 0x20, 0xd0, 0x8a, 0x60, 0x9a, - 0xf4, 0xd0, 0xd7, 0xd2, 0x01, 0x5c, 0x9e, 0x0a, 0xc8, 0xd1, 0x7f, 0x41, 0x9e, 0x61, 0x7b, 0xd3, - 0x06, 0xf7, 0xcc, 0x4e, 0x96, 0xf7, 0x52, 0x29, 0xe9, 0x31, 0x80, 0x4b, 0x8a, 0x92, 0x24, 0xd0, - 0xd3, 0xfb, 0xdd, 0x3a, 0x15, 0x4d, 0xc8, 0xac, 0x81, 0x6e, 0x42, 0xc2, 0xcb, 0xe1, 0x8d, 0x67, - 0x4b, 0xe2, 0x07, 0x0f, 0xa9, 0xca, 0xa4, 0x25, 0x0d, 0xd0, 0x78, 0x61, 0x2a, 0x64, 0x88, 0x37, - 0xfc, 0x43, 0x5c, 0x0e, 0x2d, 0x71, 0x05, 0x0f, 0xf5, 0x11, 0x24, 0xe8, 0xe2, 0x24, 0xb8, 0x88, - 0x56, 0x43, 0x39, 0xa0, 0x27, 0xcf, 0xe8, 0x27, 0x00, 0xaa, 0x65, 0xf5, 0xb4, 0x6a, 0xdf, 0x1d, - 0x60, 0x23, 0x78, 0x71, 0xef, 0xda, 0x72, 0x7b, 0x17, 0xf9, 0x2a, 0x5f, 0x71, 0x55, 0x3d, 0x2b, - 0xdd, 0x63, 0x50, 0x3a, 0x82, 0xbc, 0x5f, 0x77, 0x9c, 0x3d, 0x74, 0x21, 0x28, 0x3b, 0x51, 0x70, - 0x08, 0xea, 0x00, 0xd8, 0x18, 0x2b, 0xf9, 0xd2, 0x86, 0xf4, 0xd3, 0x28, 0x64, 0xbd, 0x7b, 0xc3, - 0xbf, 0x1f, 0x4a, 0x94, 0x7e, 0x2e, 0x40, 0xca, 0xf9, 0x7c, 0x7f, 0xfd, 0xd7, 0x57, 0x30, 0x67, - 0xde, 0x8b, 0x7a, 0x8b, 0xb6, 0xac, 0x3c, 0x1e, 0x73, 0xca, 0xe3, 0xb7, 0x1d, 0x84, 0x12, 0xc6, - 0x5e, 0x7a, 0x7d, 0xcd, 0xa3, 0xca, 0x06, 0x64, 0xb7, 0x21, 0xed, 0x6c, 0xb0, 0xe1, 0xec, 0x2e, - 0x2d, 0xdd, 0xeb, 0x1f, 0xf2, 0x8a, 0x70, 0x4c, 0x66, 0x0d, 0xa9, 0x0e, 0x8b, 0x23, 0xbb, 0x33, - 0xba, 0x0d, 0x0b, 0x46, 0xbf, 0xaa, 0xd8, 0xc1, 0x31, 0x52, 0x56, 0xb0, 0x4f, 0x1c, 0xfd, 0x6a, - 0x5b, 0xab, 0xdd, 0xc7, 0x67, 0xf6, 0x8f, 0x31, 0xfa, 0xd5, 0xfb, 0x2c, 0x86, 0xd8, 0x28, 0x51, - 0xef, 0x28, 0xbf, 0x12, 0x20, 0x65, 0xaf, 0x09, 0xf4, 0x26, 0xa4, 0x9d, 0x9d, 0xdf, 0xb9, 0xd2, - 0x11, 0x9a, 0x32, 0xb8, 0x7d, 0x57, 0x05, 0xed, 0xda, 0x77, 0x51, 0xb4, 0xba, 0xd2, 0x68, 0xab, - 0x2c, 0x96, 0xf2, 0x7e, 0x9f, 0xb1, 0xdc, 0x40, 0x53, 0xe6, 0xc1, 0x9d, 0xbb, 0x6d, 0xb5, 0x29, - 0x67, 0xa8, 0xce, 0x41, 0x9d, 0x34, 0x38, 0xf8, 0xfe, 0x9b, 0x00, 0xe2, 0xe8, 0x8a, 0xfd, 0xc1, - 0xbf, 0x6e, 0x1c, 0x89, 0xc4, 0x02, 0x90, 0x08, 0xda, 0x86, 0x65, 0x47, 0x42, 0x31, 0xb5, 0x66, - 0x57, 0xb5, 0xfa, 0x3d, 0xcc, 0x0b, 0x31, 0xc8, 0x79, 0x75, 0x6a, 0xbf, 0x19, 0xff, 0xea, 0xc4, - 0x53, 0x7e, 0xf5, 0x27, 0x51, 0xc8, 0x78, 0xca, 0x42, 0xe8, 0xbf, 0x3d, 0x9b, 0x51, 0x3e, 0x20, - 0x79, 0x7b, 0x64, 0xdd, 0xeb, 0x19, 0x7e, 0x37, 0x45, 0xe7, 0x77, 0x53, 0x58, 0xf1, 0xcd, 0xae, - 0x32, 0xc5, 0xe7, 0xae, 0x32, 0xbd, 0x00, 0xc8, 0xd2, 0x2d, 0xb5, 0xad, 0x0c, 0x74, 0x4b, 0xeb, - 0x36, 0x15, 0x16, 0x86, 0x6c, 0xeb, 0x10, 0xe9, 0x9b, 0x47, 0xf4, 0xc5, 0x09, 0x8d, 0xc8, 0x8f, - 0x05, 0x48, 0x39, 0x27, 0xa3, 0x79, 0x2f, 0x6f, 0xac, 0x42, 0x92, 0x83, 0x7f, 0x76, 0x7b, 0x83, - 0xb7, 0x02, 0xcb, 0x69, 0x45, 0x48, 0x75, 0xb0, 0xa5, 0xd2, 0x7d, 0x90, 0x01, 0x0f, 0xa7, 0x7d, - 0xed, 0x16, 0x64, 0x3c, 0x17, 0x5f, 0xc8, 0xd6, 0x78, 0x54, 0x7a, 0x47, 0x8c, 0x14, 0x17, 0x3e, - 0xfd, 0x62, 0x33, 0x76, 0x84, 0x3f, 0x24, 0xab, 0x59, 0x2e, 0xed, 0x97, 0x4b, 0xfb, 0xf7, 0x45, - 0xa1, 0x98, 0xf9, 0xf4, 0x8b, 0xcd, 0x05, 0x19, 0x53, 0xfa, 0xff, 0xda, 0x7d, 0x58, 0x1c, 0x99, - 0x18, 0x3f, 0xb2, 0x44, 0x90, 0xbf, 0xf3, 0xf0, 0xe4, 0xc1, 0xc1, 0xfe, 0x6e, 0xa5, 0xa4, 0x3c, - 0x3a, 0xae, 0x94, 0x44, 0x01, 0x9d, 0x87, 0xe5, 0x07, 0x07, 0xf7, 0xca, 0x15, 0x65, 0xff, 0xc1, - 0x41, 0xe9, 0xa8, 0xa2, 0xec, 0x56, 0x2a, 0xbb, 0xfb, 0xf7, 0xc5, 0xe8, 0xce, 0xf7, 0x8b, 0x10, - 0xdf, 0xdd, 0xdb, 0x3f, 0x40, 0xfb, 0x10, 0xa7, 0x6c, 0xd5, 0xc4, 0xeb, 0xcf, 0xc5, 0xc9, 0x85, - 0x1c, 0x74, 0x17, 0x12, 0x94, 0xc8, 0x42, 0x93, 0xef, 0x43, 0x17, 0xa7, 0x54, 0x76, 0xc8, 0x8f, - 0xa1, 0x2b, 0x72, 0xe2, 0x05, 0xe9, 0xe2, 0xe4, 0x42, 0x0f, 0x7a, 0x00, 0x0b, 0x36, 0x8f, 0x31, - 0xed, 0xd6, 0x72, 0x71, 0x6a, 0xf5, 0x85, 0x7c, 0x1a, 0xe3, 0x83, 0x26, 0xdf, 0x9d, 0x2e, 0x4e, - 0x29, 0x01, 0xa1, 0x03, 0x48, 0x72, 0xc6, 0x60, 0xca, 0x75, 0xe8, 0xe2, 0xb4, 0xa2, 0x0e, 0x92, - 0x21, 0xed, 0x32, 0x6d, 0xd3, 0x6f, 0x84, 0x17, 0x67, 0xa8, 0x6e, 0xa1, 0x77, 0x21, 0xe7, 0x67, - 0x23, 0x66, 0xbb, 0x72, 0x5d, 0x9c, 0xb1, 0x7c, 0x44, 0xec, 0xfb, 0xa9, 0x89, 0xd9, 0xae, 0x60, - 0x17, 0x67, 0xac, 0x26, 0xa1, 0xf7, 0x61, 0x69, 0x9c, 0x3a, 0x98, 0xfd, 0x46, 0x76, 0x71, 0x8e, - 0xfa, 0x12, 0xea, 0x00, 0x0a, 0xa0, 0x1c, 0xe6, 0xb8, 0xa0, 0x5d, 0x9c, 0xa7, 0xdc, 0x84, 0xea, - 0xb0, 0x38, 0x7a, 0x8e, 0x9f, 0xf5, 0xc2, 0x76, 0x71, 0xe6, 0xd2, 0x13, 0x1b, 0xc5, 0x7f, 0xfe, - 0x9f, 0xf5, 0x02, 0x77, 0x71, 0xe6, 0x4a, 0x14, 0x7a, 0x08, 0xe0, 0x39, 0xc2, 0xcf, 0x70, 0xa1, - 0xbb, 0x38, 0x4b, 0x4d, 0x0a, 0x19, 0xb0, 0x1c, 0x74, 0xb6, 0x9f, 0xe7, 0x7e, 0x77, 0x71, 0xae, - 0x52, 0x15, 0x89, 0x67, 0xff, 0x29, 0x7d, 0xb6, 0xfb, 0xde, 0xc5, 0x19, 0x6b, 0x56, 0xc8, 0x84, - 0x95, 0xc0, 0x93, 0xe9, 0x5c, 0xb7, 0xbf, 0x8b, 0xf3, 0xd5, 0xb1, 0x50, 0x13, 0xc4, 0xb1, 0xf3, - 0xec, 0xcc, 0x97, 0xc1, 0x8b, 0xb3, 0x57, 0xb4, 0xe8, 0x7c, 0x05, 0x1c, 0x77, 0xe7, 0xb9, 0x1b, - 0x5e, 0x9c, 0xab, 0xc4, 0x85, 0x06, 0x70, 0x2e, 0xf8, 0x44, 0x3b, 0xdf, 0x4d, 0xf1, 0xe2, 0x9c, - 0x15, 0x2f, 0xf4, 0xb1, 0x00, 0x6b, 0xe1, 0x47, 0xe1, 0xf9, 0xef, 0x8d, 0x17, 0x9f, 0xa2, 0x04, - 0xb6, 0xb7, 0xfb, 0xd5, 0xb7, 0xeb, 0xc2, 0xd7, 0xdf, 0xae, 0x0b, 0x7f, 0xfd, 0x76, 0x5d, 0xf8, - 0xec, 0xbb, 0xf5, 0xc8, 0xd7, 0xdf, 0xad, 0x47, 0xfe, 0xfc, 0xdd, 0x7a, 0xe4, 0x7f, 0x9f, 0x6b, - 0x6a, 0x56, 0xab, 0x5f, 0xdd, 0xaa, 0xe9, 0x9d, 0xed, 0x9a, 0xde, 0xc1, 0x56, 0xb5, 0x61, 0xb9, - 0x0f, 0xee, 0x5f, 0xc4, 0xaa, 0x49, 0x0a, 0xc7, 0x6e, 0xfc, 0x23, 0x00, 0x00, 0xff, 0xff, 0x6f, - 0x31, 0x39, 0x69, 0x42, 0x36, 0x00, 0x00, + // 3692 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcd, 0x6f, 0x1b, 0xd7, + 0xb5, 0xe7, 0xf0, 0x4b, 0xe4, 0xe1, 0x87, 0x46, 0x57, 0xb2, 0x4c, 0xd1, 0xb6, 0x24, 0x4f, 0x9e, + 0x13, 0xc7, 0x4e, 0xa4, 0x44, 0x7e, 0x4e, 0x62, 0x38, 0x09, 0x40, 0xc9, 0xb4, 0x29, 0xd9, 0x91, + 0x94, 0x11, 0xed, 0x3c, 0xbf, 0x8f, 0x4c, 0x86, 0xe4, 0x25, 0x39, 0x31, 0xc9, 0x99, 0x70, 0x86, + 0x32, 0x95, 0xd5, 0x43, 0xf2, 0x1e, 0x50, 0x04, 0x28, 0x10, 0xa0, 0x9b, 0x2c, 0x1a, 0x14, 0x5d, + 0x74, 0xd3, 0xbf, 0xa0, 0xab, 0xae, 0x5a, 0x20, 0x8b, 0x2e, 0xb2, 0xec, 0x2a, 0x2d, 0x92, 0x5d, + 0xb6, 0x5d, 0x74, 0x5b, 0xdc, 0x8f, 0xf9, 0x22, 0x67, 0xf8, 0xe1, 0xa4, 0x8b, 0xa2, 0xdd, 0xcd, + 0xbd, 0x73, 0xce, 0xb9, 0x9c, 0x73, 0xcf, 0xbd, 0xe7, 0x77, 0x7f, 0xe7, 0x12, 0x2e, 0x58, 0xb8, + 0xd7, 0xc0, 0xfd, 0xae, 0xd6, 0xb3, 0xb6, 0xd5, 0x5a, 0x5d, 0xdb, 0xb6, 0xce, 0x0c, 0x6c, 0x6e, + 0x19, 0x7d, 0xdd, 0xd2, 0xd1, 0xa2, 0xfb, 0x72, 0x8b, 0xbc, 0x2c, 0x5e, 0xf2, 0x48, 0xd7, 0xfb, + 0x67, 0x86, 0xa5, 0x6f, 0x1b, 0x7d, 0x5d, 0x6f, 0x32, 0xf9, 0xe2, 0xc5, 0xf1, 0xd7, 0x4f, 0xf0, + 0x19, 0xb7, 0xe6, 0x53, 0xa6, 0xa3, 0x6c, 0x1b, 0x6a, 0x5f, 0xed, 0xda, 0xaf, 0x37, 0xc7, 0x5e, + 0x9f, 0xaa, 0x1d, 0xad, 0xa1, 0x5a, 0x7a, 0x9f, 0x4b, 0x6c, 0xb4, 0x74, 0xbd, 0xd5, 0xc1, 0xdb, + 0xb4, 0x55, 0x1b, 0x34, 0xb7, 0x2d, 0xad, 0x8b, 0x4d, 0x4b, 0xed, 0x1a, 0x5c, 0x60, 0xa5, 0xa5, + 0xb7, 0x74, 0xfa, 0xb8, 0x4d, 0x9e, 0x02, 0xc6, 0xd5, 0xfb, 0x6a, 0xbd, 0x83, 0xbd, 0x1f, 0x29, + 0xfd, 0x3e, 0x07, 0x0b, 0x32, 0xfe, 0x68, 0x80, 0x4d, 0x0b, 0xed, 0x40, 0x1c, 0xd7, 0xdb, 0x7a, + 0x41, 0xd8, 0x14, 0xae, 0x66, 0x76, 0x2e, 0x6e, 0x8d, 0x7c, 0xff, 0x16, 0x97, 0x2b, 0xd7, 0xdb, + 0x7a, 0x25, 0x22, 0x53, 0x59, 0x74, 0x13, 0x12, 0xcd, 0xce, 0xc0, 0x6c, 0x17, 0xa2, 0x54, 0xe9, + 0x52, 0x98, 0xd2, 0x5d, 0x22, 0x54, 0x89, 0xc8, 0x4c, 0x9a, 0x0c, 0xa5, 0xf5, 0x9a, 0x7a, 0x21, + 0x36, 0x79, 0xa8, 0xfd, 0x5e, 0x93, 0x0e, 0x45, 0x64, 0xd1, 0x2e, 0x80, 0xd6, 0xd3, 0x2c, 0xa5, + 0xde, 0x56, 0xb5, 0x5e, 0x21, 0x41, 0x35, 0x2f, 0x87, 0x6b, 0x6a, 0xd6, 0x1e, 0x11, 0xac, 0x44, + 0xe4, 0xb4, 0x66, 0x37, 0xc8, 0xcf, 0xfd, 0x68, 0x80, 0xfb, 0x67, 0x85, 0xe4, 0xe4, 0x9f, 0xfb, + 0x2e, 0x11, 0x22, 0x3f, 0x97, 0x4a, 0xa3, 0x37, 0x21, 0x55, 0x6f, 0xe3, 0xfa, 0x13, 0xc5, 0x1a, + 0x16, 0x52, 0x54, 0x73, 0x23, 0x4c, 0x73, 0x8f, 0xc8, 0x55, 0x87, 0x95, 0x88, 0xbc, 0x50, 0x67, + 0x8f, 0xe8, 0x0d, 0x48, 0xd6, 0xf5, 0x6e, 0x57, 0xb3, 0x0a, 0x19, 0xaa, 0xbb, 0x1e, 0xaa, 0x4b, + 0xa5, 0x2a, 0x11, 0x99, 0xcb, 0xa3, 0x43, 0xc8, 0x77, 0x34, 0xd3, 0x52, 0xcc, 0x9e, 0x6a, 0x98, + 0x6d, 0xdd, 0x32, 0x0b, 0x59, 0x6a, 0xe1, 0x4a, 0x98, 0x85, 0x07, 0x9a, 0x69, 0x9d, 0xd8, 0xc2, + 0x95, 0x88, 0x9c, 0xeb, 0x78, 0x3b, 0x88, 0x3d, 0xbd, 0xd9, 0xc4, 0x7d, 0xc7, 0x60, 0x21, 0x37, + 0xd9, 0xde, 0x11, 0x91, 0xb6, 0xf5, 0x89, 0x3d, 0xdd, 0xdb, 0x81, 0xfe, 0x0b, 0x96, 0x3b, 0xba, + 0xda, 0x70, 0xcc, 0x29, 0xf5, 0xf6, 0xa0, 0xf7, 0xa4, 0x90, 0xa7, 0x46, 0x5f, 0x0c, 0xfd, 0x91, + 0xba, 0xda, 0xb0, 0x4d, 0xec, 0x11, 0x85, 0x4a, 0x44, 0x5e, 0xea, 0x8c, 0x76, 0xa2, 0xf7, 0x61, + 0x45, 0x35, 0x8c, 0xce, 0xd9, 0xa8, 0xf5, 0x45, 0x6a, 0xfd, 0x5a, 0x98, 0xf5, 0x12, 0xd1, 0x19, + 0x35, 0x8f, 0xd4, 0xb1, 0x5e, 0x54, 0x05, 0xd1, 0xe8, 0x63, 0x43, 0xed, 0x63, 0xc5, 0xe8, 0xeb, + 0x86, 0x6e, 0xaa, 0x9d, 0x82, 0x48, 0x6d, 0xbf, 0x10, 0x66, 0xfb, 0x98, 0xc9, 0x1f, 0x73, 0xf1, + 0x4a, 0x44, 0x5e, 0x34, 0xfc, 0x5d, 0xcc, 0xaa, 0x5e, 0xc7, 0xa6, 0xe9, 0x5a, 0x5d, 0x9a, 0x66, + 0x95, 0xca, 0xfb, 0xad, 0xfa, 0xba, 0x50, 0x19, 0x32, 0x78, 0x48, 0xd4, 0x95, 0x53, 0xdd, 0xc2, + 0x05, 0x44, 0x0d, 0x4a, 0xa1, 0x2b, 0x94, 0x8a, 0x3e, 0xd2, 0x2d, 0x5c, 0x89, 0xc8, 0x80, 0x9d, + 0x16, 0x52, 0xe1, 0xdc, 0x29, 0xee, 0x6b, 0xcd, 0x33, 0x6a, 0x46, 0xa1, 0x6f, 0x4c, 0x4d, 0xef, + 0x15, 0x96, 0xa9, 0xc1, 0xeb, 0x61, 0x06, 0x1f, 0x51, 0x25, 0x62, 0xa2, 0x6c, 0xab, 0x54, 0x22, + 0xf2, 0xf2, 0xe9, 0x78, 0x37, 0x09, 0xb1, 0xa6, 0xd6, 0x53, 0x3b, 0xda, 0xc7, 0x58, 0xa9, 0x75, + 0xf4, 0xfa, 0x93, 0xc2, 0xca, 0xe4, 0x10, 0xbb, 0xcb, 0xa5, 0x77, 0x89, 0x30, 0x09, 0xb1, 0xa6, + 0xb7, 0x03, 0x61, 0x38, 0x5f, 0xef, 0x63, 0xd5, 0xc2, 0x0a, 0xdb, 0xbd, 0x94, 0x3e, 0x36, 0x07, + 0x1d, 0x8b, 0xac, 0xc4, 0x73, 0xd4, 0xf0, 0x4b, 0xa1, 0xab, 0x89, 0xaa, 0x1d, 0x51, 0x2d, 0x99, + 0x2a, 0xd1, 0x65, 0xb9, 0x52, 0x0f, 0xe8, 0x47, 0xff, 0x01, 0xa8, 0x89, 0xad, 0x7a, 0xdb, 0x1e, + 0x85, 0xf8, 0xc7, 0x2c, 0xac, 0xd2, 0x11, 0xae, 0x86, 0xfe, 0x74, 0xa2, 0xc1, 0x0c, 0x11, 0x27, + 0x90, 0x05, 0x27, 0x36, 0x47, 0xfa, 0xa8, 0xcf, 0xd9, 0x56, 0x8e, 0xfd, 0xc6, 0xcf, 0x4f, 0xf1, + 0x39, 0x57, 0xf2, 0xdb, 0x5f, 0x3e, 0x1d, 0xef, 0x46, 0x6d, 0x28, 0x34, 0x74, 0x6c, 0x8e, 0x78, + 0x08, 0x0f, 0x35, 0xd3, 0x2a, 0x14, 0xe8, 0x28, 0x2f, 0x87, 0x8d, 0x72, 0x47, 0xc7, 0xa6, 0xd7, + 0x15, 0x65, 0xa2, 0x54, 0x89, 0xc8, 0xe7, 0x1a, 0x41, 0x2f, 0xd0, 0x29, 0xac, 0xd3, 0x91, 0xcc, + 0x41, 0x4d, 0x51, 0xeb, 0x75, 0x7d, 0xd0, 0xb3, 0x94, 0x1a, 0xee, 0xe8, 0xbd, 0x96, 0x62, 0xe9, + 0xca, 0xa9, 0xda, 0x29, 0xac, 0xd1, 0xf1, 0x5e, 0x9d, 0x34, 0xde, 0xc9, 0xa0, 0x56, 0x62, 0xba, + 0xbb, 0x54, 0xb5, 0xaa, 0x3f, 0xa2, 0x51, 0xbf, 0xd6, 0x08, 0x7b, 0xb9, 0xbb, 0x00, 0x89, 0x53, + 0xb5, 0x33, 0xc0, 0x07, 0xf1, 0x54, 0x5c, 0x4c, 0x1c, 0xc4, 0x53, 0x0b, 0x62, 0xea, 0x20, 0x9e, + 0x4a, 0x8b, 0x70, 0x10, 0x4f, 0x81, 0x98, 0x91, 0x5e, 0x80, 0x8c, 0x27, 0x3d, 0xa1, 0x02, 0x2c, + 0x74, 0xb1, 0x69, 0xaa, 0x2d, 0x4c, 0xb3, 0x59, 0x5a, 0xb6, 0x9b, 0x52, 0x1e, 0xb2, 0xde, 0x94, + 0x24, 0x7d, 0x2e, 0x38, 0x9a, 0x24, 0xdb, 0x10, 0xcd, 0x53, 0xdc, 0xa7, 0x8b, 0x82, 0x6b, 0xf2, + 0x26, 0x7a, 0x0e, 0x72, 0x34, 0xa0, 0x15, 0xfb, 0x3d, 0x49, 0x79, 0x71, 0x39, 0x4b, 0x3b, 0x1f, + 0x71, 0xa1, 0x0d, 0xc8, 0x18, 0x3b, 0x86, 0x23, 0x12, 0xa3, 0x22, 0x60, 0xec, 0x18, 0xb6, 0xc0, + 0x65, 0xc8, 0x12, 0x7f, 0x38, 0x12, 0x71, 0x3a, 0x48, 0x86, 0xf4, 0x71, 0x11, 0xe9, 0x0f, 0x51, + 0x10, 0x47, 0xd3, 0x18, 0x7a, 0x03, 0xe2, 0x24, 0xe1, 0xf3, 0xe4, 0x5c, 0xdc, 0x62, 0x68, 0x60, + 0xcb, 0x46, 0x03, 0x5b, 0x55, 0x1b, 0x0d, 0xec, 0xa6, 0xbe, 0xfa, 0x66, 0x23, 0xf2, 0xf9, 0x9f, + 0x36, 0x04, 0x99, 0x6a, 0xa0, 0x35, 0x92, 0xbc, 0x54, 0xad, 0xa7, 0x68, 0x0d, 0xfa, 0x93, 0xd3, + 0x24, 0x33, 0xa9, 0x5a, 0x6f, 0xbf, 0x81, 0x1e, 0x80, 0x58, 0xd7, 0x7b, 0x26, 0xee, 0x99, 0x03, + 0x53, 0x61, 0x78, 0x84, 0xa7, 0x64, 0x5f, 0x62, 0x65, 0x80, 0x61, 0xcf, 0x96, 0x3c, 0xa6, 0x82, + 0xf2, 0x62, 0xdd, 0xdf, 0x81, 0xee, 0x02, 0x38, 0xa0, 0xc5, 0x2c, 0xc4, 0x37, 0x63, 0x57, 0x33, + 0x3b, 0x9b, 0x63, 0x81, 0xf0, 0xc8, 0x16, 0x79, 0x68, 0x90, 0x38, 0xde, 0x8d, 0x93, 0x9f, 0x2b, + 0x7b, 0x34, 0xd1, 0xf3, 0xb0, 0xa8, 0x1a, 0x86, 0x62, 0x5a, 0x64, 0xc9, 0xd4, 0xce, 0xc8, 0x5a, + 0x21, 0xd9, 0x3e, 0x2b, 0xe7, 0x54, 0xc3, 0x38, 0x21, 0xbd, 0xbb, 0xa4, 0x13, 0x5d, 0x81, 0x3c, + 0xc9, 0xec, 0x9a, 0xda, 0x51, 0xda, 0x58, 0x6b, 0xb5, 0x2d, 0x9a, 0xd5, 0x63, 0x72, 0x8e, 0xf7, + 0x56, 0x68, 0xa7, 0xd4, 0x70, 0x66, 0x9c, 0x66, 0x75, 0x84, 0x20, 0xde, 0x50, 0x2d, 0x95, 0x7a, + 0x32, 0x2b, 0xd3, 0x67, 0xd2, 0x67, 0xa8, 0x56, 0x9b, 0xfb, 0x87, 0x3e, 0xa3, 0x55, 0x48, 0x72, + 0xb3, 0x31, 0x6a, 0x96, 0xb7, 0xd0, 0x0a, 0x24, 0x8c, 0xbe, 0x7e, 0x8a, 0xe9, 0xd4, 0xa5, 0x64, + 0xd6, 0x90, 0x64, 0xc8, 0xfb, 0x11, 0x00, 0xca, 0x43, 0xd4, 0x1a, 0xf2, 0x51, 0xa2, 0xd6, 0x10, + 0xbd, 0x02, 0x71, 0xe2, 0x48, 0x3a, 0x46, 0x3e, 0x00, 0xf3, 0x70, 0xbd, 0xea, 0x99, 0x81, 0x65, + 0x2a, 0x29, 0x2d, 0x42, 0xce, 0x87, 0x0c, 0xa4, 0x55, 0x58, 0x09, 0x4a, 0xf4, 0x52, 0xdb, 0xe9, + 0xf7, 0x25, 0x6c, 0x74, 0x13, 0x52, 0x4e, 0xa6, 0x67, 0x81, 0xb3, 0x36, 0x36, 0xac, 0x2d, 0x2c, + 0x3b, 0xa2, 0x24, 0x62, 0xc8, 0x04, 0xb4, 0x55, 0x8e, 0xeb, 0xb2, 0xf2, 0x82, 0x6a, 0x18, 0x15, + 0xd5, 0x6c, 0x4b, 0x1f, 0x40, 0x21, 0x2c, 0x8b, 0x7b, 0x1c, 0x26, 0xd0, 0xb0, 0xb7, 0x1d, 0xb6, + 0x0a, 0xc9, 0xa6, 0xde, 0xef, 0xaa, 0x16, 0x35, 0x96, 0x93, 0x79, 0x8b, 0x38, 0x92, 0x65, 0xf4, + 0x18, 0xed, 0x66, 0x0d, 0x49, 0x81, 0xb5, 0xd0, 0x4c, 0x4e, 0x54, 0xb4, 0x5e, 0x03, 0x33, 0xb7, + 0xe6, 0x64, 0xd6, 0x70, 0x0d, 0xb1, 0x1f, 0xcb, 0x1a, 0x64, 0x58, 0x93, 0x7e, 0x2b, 0xb5, 0x9f, + 0x96, 0x79, 0x4b, 0xfa, 0x22, 0x06, 0xab, 0xc1, 0xf9, 0x1c, 0x6d, 0x42, 0xb6, 0xab, 0x0e, 0x15, + 0x6b, 0xc8, 0xc3, 0x4e, 0xa0, 0x13, 0x0f, 0x5d, 0x75, 0x58, 0x1d, 0xb2, 0x98, 0x13, 0x21, 0x66, + 0x0d, 0xcd, 0x42, 0x74, 0x33, 0x76, 0x35, 0x2b, 0x93, 0x47, 0xf4, 0x10, 0x96, 0x3a, 0x7a, 0x5d, + 0xed, 0x28, 0x1d, 0xd5, 0xb4, 0x14, 0x0e, 0xf4, 0xd8, 0x22, 0x7a, 0x6e, 0xcc, 0xd9, 0x2c, 0x33, + 0xe3, 0x06, 0x9b, 0x4f, 0xb2, 0xe1, 0xf0, 0xf8, 0x5f, 0xa4, 0x36, 0x1e, 0xa8, 0xf6, 0x54, 0xa3, + 0x3b, 0x90, 0xe9, 0x6a, 0x66, 0x0d, 0xb7, 0xd5, 0x53, 0x4d, 0xef, 0xf3, 0xd5, 0x34, 0x1e, 0x34, + 0xef, 0xb8, 0x32, 0xdc, 0x92, 0x57, 0xcd, 0x33, 0x25, 0x09, 0x5f, 0x0c, 0xdb, 0xbb, 0x49, 0x72, + 0xee, 0xdd, 0xe4, 0x15, 0x58, 0xe9, 0xe1, 0xa1, 0xa5, 0xb8, 0xeb, 0x95, 0xc5, 0xc9, 0x02, 0x75, + 0x3d, 0x22, 0xef, 0x9c, 0x15, 0x6e, 0x92, 0x90, 0x41, 0x2f, 0x52, 0x44, 0x64, 0xe8, 0x26, 0xee, + 0x2b, 0x6a, 0xa3, 0xd1, 0xc7, 0xa6, 0x49, 0x41, 0x74, 0x96, 0xc2, 0x1c, 0xda, 0x5f, 0x62, 0xdd, + 0xd2, 0x4f, 0xbc, 0x53, 0xe3, 0x47, 0x40, 0xdc, 0xf1, 0x82, 0xeb, 0xf8, 0x13, 0x58, 0xe1, 0xfa, + 0x0d, 0x9f, 0xef, 0xd9, 0x49, 0xe4, 0xc2, 0xf8, 0xfa, 0x1a, 0xf5, 0x39, 0xb2, 0xd5, 0xc3, 0xdd, + 0x1e, 0x7b, 0x36, 0xb7, 0x23, 0x88, 0x53, 0xa7, 0xc4, 0xd9, 0x16, 0x43, 0x9e, 0xff, 0xd1, 0xa6, + 0xe2, 0xd3, 0x18, 0x2c, 0x8d, 0xc1, 0x49, 0xe7, 0xc3, 0x84, 0xc0, 0x0f, 0x8b, 0x06, 0x7e, 0x58, + 0x6c, 0xee, 0x0f, 0xe3, 0x73, 0x1d, 0x9f, 0x3e, 0xd7, 0x89, 0x1f, 0x71, 0xae, 0x93, 0xcf, 0x36, + 0xd7, 0x7f, 0xd7, 0x59, 0xf8, 0xb9, 0x00, 0xc5, 0x70, 0x0c, 0x1e, 0x38, 0x1d, 0xd7, 0x61, 0xc9, + 0xf9, 0x29, 0x8e, 0x79, 0xb6, 0x31, 0x8a, 0xce, 0x0b, 0x6e, 0x3f, 0x34, 0xc7, 0x5d, 0x81, 0xfc, + 0xc8, 0x09, 0x81, 0x85, 0x72, 0xee, 0xd4, 0x3b, 0xbe, 0xf4, 0x7f, 0x31, 0x27, 0xf1, 0xf8, 0x60, + 0x7c, 0xc0, 0x6a, 0x7d, 0x17, 0x96, 0x1b, 0xb8, 0xae, 0x35, 0x9e, 0x75, 0xb1, 0x2e, 0x71, 0xed, + 0x7f, 0xad, 0xd5, 0xf1, 0x28, 0xf9, 0x44, 0x80, 0x0b, 0x13, 0x0e, 0x3d, 0xa8, 0x08, 0x29, 0x5b, + 0x85, 0x87, 0x8a, 0xd3, 0x46, 0xf7, 0x20, 0xdf, 0xd2, 0x4d, 0x53, 0x33, 0x70, 0x83, 0x9f, 0x4b, + 0xa2, 0xe3, 0xc0, 0x8d, 0x1d, 0x2c, 0xb6, 0xee, 0x71, 0x41, 0x7a, 0xea, 0x90, 0x73, 0x2d, 0x6f, + 0x53, 0x5a, 0x83, 0xf3, 0x21, 0xc7, 0x22, 0xe9, 0x96, 0x1b, 0xc4, 0x01, 0xa7, 0x97, 0x0b, 0x90, + 0xe6, 0x07, 0x17, 0x07, 0x2e, 0xa5, 0x58, 0x47, 0x75, 0x28, 0xbd, 0x02, 0x17, 0x27, 0x9d, 0x54, + 0x48, 0xa0, 0x3d, 0xc1, 0x67, 0x1c, 0xaa, 0x93, 0x47, 0xe9, 0x4d, 0xd8, 0x9c, 0x76, 0xd6, 0x20, + 0x20, 0xdf, 0x76, 0xa9, 0xc0, 0xf1, 0x0d, 0x77, 0xe5, 0x2f, 0xf2, 0x90, 0x92, 0xb1, 0x69, 0x10, + 0x68, 0x8b, 0x76, 0x21, 0x8d, 0x87, 0x75, 0x6c, 0x58, 0xf6, 0x69, 0x20, 0xf8, 0xcc, 0xcd, 0xa4, + 0xcb, 0xb6, 0x64, 0x25, 0x22, 0xbb, 0x6a, 0xe8, 0x06, 0x27, 0xd5, 0xc2, 0xf9, 0x31, 0xae, 0xee, + 0x65, 0xd5, 0x5e, 0xb3, 0x59, 0xb5, 0x58, 0x28, 0x61, 0xc4, 0xb4, 0x46, 0x68, 0xb5, 0x1b, 0x9c, + 0x56, 0x8b, 0x4f, 0x19, 0xcc, 0xc7, 0xab, 0xed, 0xf9, 0x78, 0xb5, 0xe4, 0x94, 0xcf, 0x0c, 0x21, + 0xd6, 0x5e, 0xb3, 0x89, 0xb5, 0x85, 0x29, 0xbf, 0x78, 0x84, 0x59, 0x7b, 0xcb, 0xc3, 0xac, 0xa5, + 0xa9, 0xea, 0x66, 0xa8, 0x6a, 0x00, 0xb5, 0x76, 0xcb, 0xa1, 0xd6, 0xb2, 0xa1, 0xb4, 0x1c, 0x57, + 0x1e, 0xe5, 0xd6, 0x8e, 0xc6, 0xb8, 0x35, 0xc6, 0x85, 0x3d, 0x1f, 0x6a, 0x62, 0x0a, 0xb9, 0x76, + 0x34, 0x46, 0xae, 0xe5, 0xa7, 0x18, 0x9c, 0xc2, 0xae, 0xfd, 0x77, 0x30, 0xbb, 0x16, 0xce, 0x7f, + 0xf1, 0x9f, 0x39, 0x1b, 0xbd, 0xa6, 0x84, 0xd0, 0x6b, 0x62, 0x28, 0x2d, 0xc1, 0xcc, 0xcf, 0xcc, + 0xaf, 0x3d, 0x0c, 0xe0, 0xd7, 0x96, 0x42, 0x09, 0x15, 0x66, 0x7c, 0x06, 0x82, 0xed, 0x61, 0x00, + 0xc1, 0x86, 0xa6, 0x9a, 0x9d, 0xca, 0xb0, 0xdd, 0xf5, 0x33, 0x6c, 0xcb, 0x21, 0x00, 0xde, 0x5d, + 0xed, 0x21, 0x14, 0x5b, 0x2d, 0x8c, 0x62, 0x5b, 0x09, 0x65, 0xab, 0x98, 0xc5, 0x39, 0x38, 0xb6, + 0xa3, 0x31, 0x8e, 0xed, 0xdc, 0x94, 0x48, 0x9b, 0x42, 0xb2, 0x35, 0xc3, 0x49, 0xb6, 0xd5, 0x50, + 0xfe, 0x88, 0xaf, 0xab, 0x79, 0x58, 0xb6, 0xc7, 0x81, 0x2c, 0xdb, 0xf9, 0x50, 0xba, 0x98, 0xff, + 0xf8, 0x59, 0x68, 0xb6, 0x5a, 0x18, 0xcd, 0x56, 0x98, 0xe6, 0xf7, 0xd9, 0x79, 0x36, 0x6d, 0x02, + 0xcf, 0xc6, 0x78, 0xaf, 0xad, 0xd0, 0x61, 0xe6, 0x24, 0xda, 0x9e, 0x4e, 0x25, 0xda, 0x8a, 0x74, + 0xc0, 0x9d, 0x89, 0x03, 0xfe, 0x30, 0xa6, 0x2d, 0x21, 0x26, 0x0f, 0xe2, 0xa9, 0x94, 0x98, 0x66, + 0x1c, 0xdb, 0x41, 0x3c, 0x95, 0x11, 0xb3, 0xd2, 0x8b, 0xe4, 0x5c, 0x30, 0x92, 0xf2, 0xc8, 0x09, + 0x1c, 0xf7, 0xfb, 0x7a, 0x9f, 0x27, 0x62, 0xd6, 0x90, 0xae, 0x42, 0xd6, 0x9b, 0xde, 0x26, 0xb0, + 0x72, 0x94, 0xe9, 0xf0, 0xa4, 0x34, 0xe9, 0x37, 0x82, 0xab, 0x4b, 0x79, 0x39, 0x2f, 0x6b, 0x93, + 0xe6, 0xac, 0x8d, 0x87, 0xab, 0x8b, 0xfa, 0xb9, 0xba, 0x0d, 0xc8, 0xa8, 0xc6, 0x18, 0x0d, 0xa7, + 0x1a, 0x0e, 0x0d, 0x77, 0x0d, 0x96, 0x28, 0x0c, 0x65, 0x8c, 0x1e, 0x07, 0x7b, 0x71, 0x0a, 0xf6, + 0x16, 0xc9, 0x0b, 0xb6, 0x50, 0x18, 0xea, 0x7b, 0x19, 0x96, 0x3d, 0xb2, 0x0e, 0x33, 0xc2, 0x38, + 0x29, 0xd1, 0x91, 0x2e, 0x71, 0x8a, 0xe4, 0x77, 0x82, 0xeb, 0x21, 0x97, 0xbf, 0x0b, 0xa2, 0xda, + 0x84, 0x1f, 0x89, 0x6a, 0x8b, 0x3e, 0x33, 0xd5, 0xe6, 0x65, 0x7a, 0x62, 0x7e, 0xa6, 0xe7, 0xaf, + 0x82, 0x3b, 0x27, 0x0e, 0x71, 0x56, 0xd7, 0x1b, 0x98, 0x73, 0x2f, 0xf4, 0x99, 0xe0, 0xaf, 0x8e, + 0xde, 0xe2, 0x0c, 0x0b, 0x79, 0x24, 0x52, 0x0e, 0x06, 0x49, 0x73, 0x88, 0xe1, 0xd0, 0x36, 0x0c, + 0x4e, 0x73, 0xda, 0x86, 0x63, 0xb7, 0x24, 0x1d, 0x97, 0x3c, 0x12, 0x39, 0x1a, 0x7c, 0x1c, 0x16, + 0xb3, 0x06, 0x7a, 0x03, 0xd2, 0xb4, 0xce, 0xaa, 0xe8, 0x86, 0xc9, 0xcb, 0x6f, 0xbe, 0x03, 0x03, + 0x2b, 0xb6, 0x6e, 0x1d, 0x13, 0x99, 0x23, 0xc3, 0xa4, 0xe0, 0x96, 0x3e, 0x79, 0x70, 0x7c, 0xda, + 0x87, 0xe3, 0x2f, 0x42, 0x9a, 0xfc, 0x7a, 0xd3, 0x50, 0xeb, 0xb8, 0x00, 0xf4, 0x87, 0xba, 0x1d, + 0xd2, 0xaf, 0xa3, 0xb0, 0x38, 0x82, 0x39, 0x02, 0xbf, 0xdd, 0x0e, 0xc9, 0xa8, 0x87, 0x48, 0x9c, + 0xcd, 0x1f, 0xeb, 0x00, 0x2d, 0xd5, 0x54, 0x9e, 0xaa, 0x3d, 0x0b, 0x37, 0xb8, 0x53, 0x3c, 0x3d, + 0x04, 0xb0, 0x93, 0xd6, 0xc0, 0xc4, 0x0d, 0xce, 0x69, 0x3a, 0x6d, 0x54, 0x81, 0x24, 0x3e, 0xc5, + 0x3d, 0xcb, 0x2c, 0x2c, 0xd0, 0x69, 0x5f, 0x1d, 0x27, 0x99, 0xc8, 0xeb, 0xdd, 0x02, 0x99, 0xec, + 0xef, 0xbf, 0xd9, 0x10, 0x99, 0xf4, 0x4b, 0x7a, 0x57, 0xb3, 0x70, 0xd7, 0xb0, 0xce, 0x64, 0xae, + 0xef, 0xf7, 0x42, 0x6a, 0xc4, 0x0b, 0x94, 0x5d, 0xcf, 0xda, 0xa4, 0x19, 0xf1, 0xa9, 0xa6, 0xf7, + 0x35, 0xeb, 0x4c, 0xce, 0x75, 0x71, 0xd7, 0xd0, 0xf5, 0x8e, 0xc2, 0xd6, 0x78, 0x09, 0xf2, 0x7e, + 0x88, 0x85, 0x9e, 0x83, 0x5c, 0x1f, 0x5b, 0xaa, 0xd6, 0x53, 0x7c, 0x47, 0xcb, 0x2c, 0xeb, 0x64, + 0x6b, 0xea, 0x20, 0x9e, 0x12, 0xc4, 0xe8, 0x41, 0x3c, 0x15, 0x15, 0x63, 0xd2, 0x31, 0x9c, 0x0b, + 0x84, 0x58, 0xe8, 0x75, 0x48, 0xbb, 0xe8, 0x4c, 0xa0, 0x5f, 0x3b, 0x81, 0xbf, 0x74, 0x65, 0xa5, + 0xdf, 0x0a, 0xae, 0x49, 0x3f, 0x23, 0x5a, 0x86, 0x24, 0xdb, 0xb6, 0xe9, 0x4c, 0xe6, 0x27, 0x24, + 0x36, 0x9f, 0xde, 0x16, 0xdb, 0x9b, 0x65, 0xae, 0x2c, 0xbd, 0x0f, 0x49, 0xd6, 0x83, 0x32, 0xb0, + 0xf0, 0xf0, 0xf0, 0xfe, 0xe1, 0xd1, 0x7b, 0x87, 0x62, 0x04, 0x01, 0x24, 0x4b, 0x7b, 0x7b, 0xe5, + 0xe3, 0xaa, 0x28, 0xa0, 0x34, 0x24, 0x4a, 0xbb, 0x47, 0x72, 0x55, 0x8c, 0x92, 0x6e, 0xb9, 0x7c, + 0x50, 0xde, 0xab, 0x8a, 0x31, 0xb4, 0x04, 0x39, 0xf6, 0xac, 0xdc, 0x3d, 0x92, 0xdf, 0x29, 0x55, + 0xc5, 0xb8, 0xa7, 0xeb, 0xa4, 0x7c, 0x78, 0xa7, 0x2c, 0x8b, 0x09, 0xe9, 0x55, 0x58, 0x0b, 0x85, + 0x73, 0x2e, 0xdd, 0x29, 0x78, 0xe8, 0x4e, 0xe9, 0x8b, 0x28, 0x39, 0x65, 0x85, 0x61, 0x34, 0x74, + 0x30, 0xf2, 0xe1, 0x3b, 0x73, 0x00, 0xbc, 0x91, 0xaf, 0x47, 0x57, 0x20, 0xdf, 0xc7, 0x2c, 0x91, + 0xd3, 0xb1, 0xd9, 0x0e, 0x94, 0x93, 0x73, 0xbc, 0x97, 0x2a, 0x99, 0x4c, 0xec, 0x43, 0x5c, 0xb7, + 0x14, 0x16, 0x44, 0x26, 0x3d, 0xa2, 0xa7, 0x89, 0x18, 0xe9, 0x3d, 0x61, 0x9d, 0xd2, 0x07, 0x73, + 0xf9, 0x32, 0x0d, 0x09, 0xb9, 0x5c, 0x95, 0x1f, 0x8b, 0x31, 0x84, 0x20, 0x4f, 0x1f, 0x95, 0x93, + 0xc3, 0xd2, 0xf1, 0x49, 0xe5, 0x88, 0xf8, 0x72, 0x19, 0x16, 0x6d, 0x5f, 0xda, 0x9d, 0x09, 0xe9, + 0x3a, 0x39, 0x9a, 0x06, 0x02, 0xcc, 0x71, 0xa2, 0x42, 0xfa, 0xa5, 0xe0, 0x95, 0xf6, 0x83, 0xc4, + 0x23, 0x48, 0x9a, 0x96, 0x6a, 0x0d, 0x4c, 0xee, 0xc4, 0xd7, 0x67, 0x45, 0x9c, 0x5b, 0xf6, 0xc3, + 0x09, 0x55, 0x97, 0xb9, 0x19, 0xe9, 0x26, 0xe4, 0xfd, 0x6f, 0xc2, 0x7d, 0xe0, 0x06, 0x51, 0x54, + 0xba, 0x0d, 0x68, 0x1c, 0x88, 0x06, 0x90, 0x36, 0x42, 0x10, 0x69, 0xf3, 0x2b, 0xca, 0x16, 0x84, + 0x82, 0x4e, 0xf4, 0xee, 0xc8, 0x47, 0xde, 0x9a, 0x07, 0xb2, 0x6e, 0xb1, 0xbe, 0x91, 0xcf, 0xbc, + 0x01, 0x59, 0x6f, 0xff, 0x6c, 0x1f, 0xf9, 0x7d, 0xd4, 0x5d, 0xc4, 0x7e, 0x76, 0xc9, 0xdd, 0x02, + 0x85, 0x1f, 0xb8, 0x05, 0xbe, 0x09, 0x60, 0x0d, 0x39, 0x90, 0xb3, 0xf3, 0xe8, 0xa5, 0x00, 0xd6, + 0x1e, 0xd7, 0xab, 0x43, 0xbe, 0x08, 0xd2, 0x16, 0x7f, 0x32, 0xd1, 0x89, 0x97, 0x6a, 0x1b, 0xd0, + 0x1c, 0x6b, 0x72, 0x1a, 0x6a, 0xd6, 0x64, 0xec, 0x52, 0x72, 0xac, 0xdb, 0x44, 0x8f, 0xe1, 0xfc, + 0x08, 0x50, 0x70, 0x4c, 0xc7, 0x67, 0xc5, 0x0b, 0xe7, 0xfc, 0x78, 0xc1, 0x36, 0xed, 0xcd, 0xf6, + 0x09, 0x7f, 0xb6, 0x7f, 0x0b, 0x2e, 0x4e, 0x42, 0xf4, 0xe8, 0x12, 0x00, 0xee, 0x91, 0xe4, 0xd0, + 0x70, 0x59, 0x9a, 0x34, 0xef, 0xa9, 0x0e, 0xa5, 0x7b, 0x50, 0x08, 0x43, 0xeb, 0xe8, 0x3a, 0xc4, + 0xe9, 0x91, 0x8a, 0xa1, 0x9d, 0xf3, 0x01, 0xbc, 0x12, 0x91, 0x93, 0xa9, 0x90, 0xf4, 0x53, 0x6f, + 0x70, 0x06, 0x40, 0xf0, 0xfb, 0x23, 0xc1, 0x79, 0x63, 0x1e, 0x5c, 0xbf, 0x35, 0x12, 0x96, 0x97, + 0x21, 0xc9, 0x03, 0x92, 0xc4, 0xe0, 0xee, 0x49, 0xf9, 0xb0, 0x2a, 0x46, 0x48, 0x70, 0x1e, 0xcb, + 0x65, 0xda, 0x10, 0xa4, 0xb7, 0xe1, 0xd2, 0x44, 0x04, 0x4f, 0x1c, 0x43, 0x81, 0x3a, 0x3b, 0x05, + 0x08, 0xb4, 0x24, 0x98, 0x26, 0x3d, 0xf4, 0xb5, 0xb4, 0x0f, 0x97, 0xa7, 0x02, 0x72, 0xf4, 0x6f, + 0x90, 0x67, 0xd8, 0xde, 0xb4, 0xc1, 0x3d, 0xb3, 0x93, 0xe5, 0xbd, 0x54, 0x4a, 0x7a, 0x0c, 0xe0, + 0xb2, 0xa2, 0x24, 0x09, 0xf4, 0xf5, 0x41, 0xaf, 0x41, 0x45, 0x13, 0x32, 0x6b, 0xa0, 0x9b, 0x90, + 0xf0, 0x92, 0x78, 0xe3, 0xd9, 0x92, 0xf8, 0xc1, 0xc3, 0xaa, 0x32, 0x69, 0x49, 0x03, 0x34, 0x5e, + 0x99, 0x0a, 0x19, 0xe2, 0x2d, 0xff, 0x10, 0x97, 0x43, 0x6b, 0x5c, 0xc1, 0x43, 0x7d, 0x0c, 0x09, + 0xba, 0x38, 0x09, 0x2e, 0xa2, 0xe5, 0x50, 0x0e, 0xe8, 0xc9, 0x33, 0xfa, 0x1f, 0x00, 0xd5, 0xb2, + 0xfa, 0x5a, 0x6d, 0xe0, 0x0e, 0xb0, 0x11, 0xbc, 0xb8, 0x4b, 0xb6, 0xdc, 0xee, 0x45, 0xbe, 0xca, + 0x57, 0x5c, 0x55, 0xcf, 0x4a, 0xf7, 0x18, 0x94, 0x0e, 0x21, 0xef, 0xd7, 0x1d, 0xa7, 0x0f, 0x5d, + 0x08, 0xca, 0x4e, 0x14, 0x1c, 0x82, 0x3a, 0x00, 0x36, 0xc6, 0x6a, 0xbe, 0xb4, 0x21, 0xfd, 0x6f, + 0x14, 0xb2, 0xde, 0xbd, 0xe1, 0x9f, 0x0f, 0x25, 0x4a, 0xff, 0x2f, 0x40, 0xca, 0xf9, 0x7c, 0x7f, + 0x01, 0xd8, 0x57, 0x31, 0x67, 0xde, 0x8b, 0x7a, 0xab, 0xb6, 0xac, 0x3e, 0x1e, 0x73, 0xea, 0xe3, + 0xb7, 0x1d, 0x84, 0x12, 0x46, 0x5f, 0x7a, 0x7d, 0xcd, 0xa3, 0xca, 0x06, 0x64, 0xb7, 0x21, 0xed, + 0x6c, 0xb0, 0xe1, 0xf4, 0x2e, 0xad, 0xdd, 0xeb, 0x4f, 0x79, 0x49, 0x38, 0x26, 0xb3, 0x86, 0xd4, + 0x80, 0xc5, 0x91, 0xdd, 0x19, 0xdd, 0x86, 0x05, 0x63, 0x50, 0x53, 0xec, 0xe0, 0x18, 0xa9, 0x2b, + 0xd8, 0x27, 0x8e, 0x41, 0xad, 0xa3, 0xd5, 0xef, 0xe3, 0x33, 0xfb, 0xc7, 0x18, 0x83, 0xda, 0x7d, + 0x16, 0x43, 0x6c, 0x94, 0xa8, 0x77, 0x94, 0x9f, 0x09, 0x90, 0xb2, 0xd7, 0x04, 0x7a, 0x1b, 0xd2, + 0xce, 0xce, 0xef, 0xdc, 0xe9, 0x08, 0x4d, 0x19, 0xdc, 0xbe, 0xab, 0x82, 0x4a, 0xf6, 0x65, 0x14, + 0xad, 0xa1, 0x34, 0x3b, 0x2a, 0x8b, 0xa5, 0xbc, 0xdf, 0x67, 0x2c, 0x37, 0xd0, 0x94, 0xb9, 0x7f, + 0xe7, 0x6e, 0x47, 0x6d, 0xc9, 0x19, 0xaa, 0xb3, 0xdf, 0x20, 0x0d, 0x0e, 0xbe, 0xff, 0x22, 0x80, + 0x38, 0xba, 0x62, 0x7f, 0xf0, 0xaf, 0x1b, 0x47, 0x22, 0xb1, 0x00, 0x24, 0x82, 0xb6, 0x61, 0xd9, + 0x91, 0x50, 0x4c, 0xad, 0xd5, 0x53, 0xad, 0x41, 0x1f, 0xf3, 0x4a, 0x0c, 0x72, 0x5e, 0x9d, 0xd8, + 0x6f, 0xc6, 0xbf, 0x3a, 0xf1, 0x8c, 0x5f, 0xfd, 0x69, 0x14, 0x32, 0x9e, 0xba, 0x10, 0xfa, 0x77, + 0xcf, 0x66, 0x94, 0x0f, 0x48, 0xde, 0x1e, 0x59, 0xf7, 0x7e, 0x86, 0xdf, 0x4d, 0xd1, 0xf9, 0xdd, + 0x14, 0x56, 0x7d, 0xb3, 0xcb, 0x4c, 0xf1, 0xb9, 0xcb, 0x4c, 0x2f, 0x01, 0xb2, 0x74, 0x4b, 0xed, + 0x28, 0xa7, 0xba, 0xa5, 0xf5, 0x5a, 0x0a, 0x0b, 0x43, 0xb6, 0x75, 0x88, 0xf4, 0xcd, 0x23, 0xfa, + 0xe2, 0x98, 0x46, 0xe4, 0x27, 0x02, 0xa4, 0x9c, 0x93, 0xd1, 0xbc, 0xb7, 0x37, 0x56, 0x21, 0xc9, + 0xc1, 0x3f, 0xbb, 0xbe, 0xc1, 0x5b, 0x81, 0xf5, 0xb4, 0x22, 0xa4, 0xba, 0xd8, 0x52, 0xe9, 0x3e, + 0xc8, 0x80, 0x87, 0xd3, 0xbe, 0x76, 0x0b, 0x32, 0x9e, 0x9b, 0x2f, 0x64, 0x6b, 0x3c, 0x2c, 0xbf, + 0x27, 0x46, 0x8a, 0x0b, 0x9f, 0x7d, 0xb9, 0x19, 0x3b, 0xc4, 0x4f, 0xc9, 0x6a, 0x96, 0xcb, 0x7b, + 0x95, 0xf2, 0xde, 0x7d, 0x51, 0x28, 0x66, 0x3e, 0xfb, 0x72, 0x73, 0x41, 0xc6, 0x94, 0xff, 0xbf, + 0x76, 0x1f, 0x16, 0x47, 0x26, 0xc6, 0x8f, 0x2c, 0x11, 0xe4, 0xef, 0x3c, 0x3c, 0x7e, 0xb0, 0xbf, + 0x57, 0xaa, 0x96, 0x95, 0x47, 0x47, 0xd5, 0xb2, 0x28, 0xa0, 0xf3, 0xb0, 0xfc, 0x60, 0xff, 0x5e, + 0xa5, 0xaa, 0xec, 0x3d, 0xd8, 0x2f, 0x1f, 0x56, 0x95, 0x52, 0xb5, 0x5a, 0xda, 0xbb, 0x2f, 0x46, + 0x77, 0xbe, 0x5f, 0x84, 0x78, 0x69, 0x77, 0x6f, 0x1f, 0xed, 0x41, 0x9c, 0xb2, 0x55, 0x13, 0x2f, + 0x40, 0x17, 0x27, 0x57, 0x72, 0xd0, 0x5d, 0x48, 0x50, 0x22, 0x0b, 0x4d, 0xbe, 0x11, 0x5d, 0x9c, + 0x52, 0xda, 0x21, 0x3f, 0x86, 0xae, 0xc8, 0x89, 0x57, 0xa4, 0x8b, 0x93, 0x2b, 0x3d, 0xe8, 0x01, + 0x2c, 0xd8, 0x3c, 0xc6, 0xb4, 0x7b, 0xcb, 0xc5, 0xa9, 0xe5, 0x17, 0xf2, 0x69, 0x8c, 0x0f, 0x9a, + 0x7c, 0x7b, 0xba, 0x38, 0xa5, 0x06, 0x84, 0xf6, 0x21, 0xc9, 0x19, 0x83, 0x29, 0x17, 0xa2, 0x8b, + 0xd3, 0xaa, 0x3a, 0x48, 0x86, 0xb4, 0xcb, 0xb4, 0x4d, 0xbf, 0x13, 0x5e, 0x9c, 0xa1, 0xbc, 0x85, + 0xde, 0x87, 0x9c, 0x9f, 0x8d, 0x98, 0xed, 0xd2, 0x75, 0x71, 0xc6, 0xfa, 0x11, 0xb1, 0xef, 0xa7, + 0x26, 0x66, 0xbb, 0x84, 0x5d, 0x9c, 0xb1, 0x9c, 0x84, 0x3e, 0x84, 0xa5, 0x71, 0xea, 0x60, 0xf6, + 0x3b, 0xd9, 0xc5, 0x39, 0x0a, 0x4c, 0xa8, 0x0b, 0x28, 0x80, 0x72, 0x98, 0xe3, 0x8a, 0x76, 0x71, + 0x9e, 0x7a, 0x13, 0x6a, 0xc0, 0xe2, 0xe8, 0x39, 0x7e, 0xd6, 0x2b, 0xdb, 0xc5, 0x99, 0x6b, 0x4f, + 0x6c, 0x14, 0xff, 0xf9, 0x7f, 0xd6, 0x2b, 0xdc, 0xc5, 0x99, 0x4b, 0x51, 0xe8, 0x21, 0x80, 0xe7, + 0x08, 0x3f, 0xc3, 0x95, 0xee, 0xe2, 0x2c, 0x45, 0x29, 0x64, 0xc0, 0x72, 0xd0, 0xd9, 0x7e, 0x9e, + 0x1b, 0xde, 0xc5, 0xb9, 0x6a, 0x55, 0x24, 0x9e, 0xfd, 0xa7, 0xf4, 0xd9, 0x6e, 0x7c, 0x17, 0x67, + 0x2c, 0x5a, 0x21, 0x13, 0x56, 0x02, 0x4f, 0xa6, 0x73, 0xdd, 0xff, 0x2e, 0xce, 0x57, 0xc8, 0x42, + 0x2d, 0x10, 0xc7, 0xce, 0xb3, 0x33, 0x5f, 0x07, 0x2f, 0xce, 0x5e, 0xd2, 0xa2, 0xf3, 0x15, 0x70, + 0xdc, 0x9d, 0xe7, 0x76, 0x78, 0x71, 0xae, 0x1a, 0x17, 0x3a, 0x85, 0x73, 0xc1, 0x27, 0xda, 0xf9, + 0xee, 0x8a, 0x17, 0xe7, 0x2c, 0x79, 0xa1, 0x4f, 0x04, 0x58, 0x0b, 0x3f, 0x0a, 0xcf, 0x7f, 0x71, + 0xbc, 0xf8, 0x0c, 0x25, 0xb0, 0xdd, 0xd2, 0x57, 0xdf, 0xae, 0x0b, 0x5f, 0x7f, 0xbb, 0x2e, 0xfc, + 0xf9, 0xdb, 0x75, 0xe1, 0xf3, 0xef, 0xd6, 0x23, 0x5f, 0x7f, 0xb7, 0x1e, 0xf9, 0xe3, 0x77, 0xeb, + 0x91, 0xff, 0x7c, 0xa1, 0xa5, 0x59, 0xed, 0x41, 0x6d, 0xab, 0xae, 0x77, 0xb7, 0xeb, 0x7a, 0x17, + 0x5b, 0xb5, 0xa6, 0xe5, 0x3e, 0xb8, 0x7f, 0x12, 0xab, 0x25, 0x29, 0x1c, 0xbb, 0xf1, 0xb7, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x0f, 0x30, 0x3e, 0x7d, 0x44, 0x36, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4537,7 +4537,7 @@ type ABCIClient interface { FetchOracleVotes(ctx context.Context, in *RequestFetchOracleVotes, opts ...grpc.CallOption) (*ResponseFetchOracleVotes, error) ValidateOracleVotes(ctx context.Context, in *RequestValidateOracleVotes, opts ...grpc.CallOption) (*ResponseValidateOracleVotes, error) DoesOracleResultExist(ctx context.Context, in *RequestDoesOracleResultExist, opts ...grpc.CallOption) (*ResponseDoesOracleResultExist, error) - DoesSubaccountBelongToVal(ctx context.Context, in *RequestDoesSubaccountBelongToVal, opts ...grpc.CallOption) (*ResponseDoesSubaccountBelongToVal, error) + DoesSubAccountBelongToVal(ctx context.Context, in *RequestDoesSubAccountBelongToVal, opts ...grpc.CallOption) (*ResponseDoesSubAccountBelongToVal, error) } type aBCIClient struct { @@ -4728,9 +4728,9 @@ func (c *aBCIClient) DoesOracleResultExist(ctx context.Context, in *RequestDoesO return out, nil } -func (c *aBCIClient) DoesSubaccountBelongToVal(ctx context.Context, in *RequestDoesSubaccountBelongToVal, opts ...grpc.CallOption) (*ResponseDoesSubaccountBelongToVal, error) { - out := new(ResponseDoesSubaccountBelongToVal) - err := c.cc.Invoke(ctx, "/tendermint.abci.ABCI/DoesSubaccountBelongToVal", in, out, opts...) +func (c *aBCIClient) DoesSubAccountBelongToVal(ctx context.Context, in *RequestDoesSubAccountBelongToVal, opts ...grpc.CallOption) (*ResponseDoesSubAccountBelongToVal, error) { + out := new(ResponseDoesSubAccountBelongToVal) + err := c.cc.Invoke(ctx, "/tendermint.abci.ABCI/DoesSubAccountBelongToVal", in, out, opts...) if err != nil { return nil, err } @@ -4759,7 +4759,7 @@ type ABCIServer interface { FetchOracleVotes(context.Context, *RequestFetchOracleVotes) (*ResponseFetchOracleVotes, error) ValidateOracleVotes(context.Context, *RequestValidateOracleVotes) (*ResponseValidateOracleVotes, error) DoesOracleResultExist(context.Context, *RequestDoesOracleResultExist) (*ResponseDoesOracleResultExist, error) - DoesSubaccountBelongToVal(context.Context, *RequestDoesSubaccountBelongToVal) (*ResponseDoesSubaccountBelongToVal, error) + DoesSubAccountBelongToVal(context.Context, *RequestDoesSubAccountBelongToVal) (*ResponseDoesSubAccountBelongToVal, error) } // UnimplementedABCIServer can be embedded to have forward compatible implementations. @@ -4826,8 +4826,8 @@ func (*UnimplementedABCIServer) ValidateOracleVotes(ctx context.Context, req *Re func (*UnimplementedABCIServer) DoesOracleResultExist(ctx context.Context, req *RequestDoesOracleResultExist) (*ResponseDoesOracleResultExist, error) { return nil, status.Errorf(codes.Unimplemented, "method DoesOracleResultExist not implemented") } -func (*UnimplementedABCIServer) DoesSubaccountBelongToVal(ctx context.Context, req *RequestDoesSubaccountBelongToVal) (*ResponseDoesSubaccountBelongToVal, error) { - return nil, status.Errorf(codes.Unimplemented, "method DoesSubaccountBelongToVal not implemented") +func (*UnimplementedABCIServer) DoesSubAccountBelongToVal(ctx context.Context, req *RequestDoesSubAccountBelongToVal) (*ResponseDoesSubAccountBelongToVal, error) { + return nil, status.Errorf(codes.Unimplemented, "method DoesSubAccountBelongToVal not implemented") } func RegisterABCIServer(s grpc1.Server, srv ABCIServer) { @@ -5194,20 +5194,20 @@ func _ABCI_DoesOracleResultExist_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } -func _ABCI_DoesSubaccountBelongToVal_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RequestDoesSubaccountBelongToVal) +func _ABCI_DoesSubAccountBelongToVal_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestDoesSubAccountBelongToVal) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ABCIServer).DoesSubaccountBelongToVal(ctx, in) + return srv.(ABCIServer).DoesSubAccountBelongToVal(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/tendermint.abci.ABCI/DoesSubaccountBelongToVal", + FullMethod: "/tendermint.abci.ABCI/DoesSubAccountBelongToVal", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ABCIServer).DoesSubaccountBelongToVal(ctx, req.(*RequestDoesSubaccountBelongToVal)) + return srv.(ABCIServer).DoesSubAccountBelongToVal(ctx, req.(*RequestDoesSubAccountBelongToVal)) } return interceptor(ctx, in, info, handler) } @@ -5297,8 +5297,8 @@ var _ABCI_serviceDesc = grpc.ServiceDesc{ Handler: _ABCI_DoesOracleResultExist_Handler, }, { - MethodName: "DoesSubaccountBelongToVal", - Handler: _ABCI_DoesSubaccountBelongToVal_Handler, + MethodName: "DoesSubAccountBelongToVal", + Handler: _ABCI_DoesSubAccountBelongToVal_Handler, }, }, Streams: []grpc.StreamDesc{}, @@ -5775,16 +5775,16 @@ func (m *Request_DoesOracleResultExist) MarshalToSizedBuffer(dAtA []byte) (int, } return len(dAtA) - i, nil } -func (m *Request_DoesSubaccountBelongToVal) MarshalTo(dAtA []byte) (int, error) { +func (m *Request_DoesSubAccountBelongToVal) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Request_DoesSubaccountBelongToVal) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Request_DoesSubAccountBelongToVal) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - if m.DoesSubaccountBelongToVal != nil { + if m.DoesSubAccountBelongToVal != nil { { - size, err := m.DoesSubaccountBelongToVal.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.DoesSubAccountBelongToVal.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -6763,7 +6763,7 @@ func (m *RequestDoesOracleResultExist) MarshalToSizedBuffer(dAtA []byte) (int, e return len(dAtA) - i, nil } -func (m *RequestDoesSubaccountBelongToVal) Marshal() (dAtA []byte, err error) { +func (m *RequestDoesSubAccountBelongToVal) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6773,12 +6773,12 @@ func (m *RequestDoesSubaccountBelongToVal) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *RequestDoesSubaccountBelongToVal) MarshalTo(dAtA []byte) (int, error) { +func (m *RequestDoesSubAccountBelongToVal) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *RequestDoesSubaccountBelongToVal) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *RequestDoesSubAccountBelongToVal) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7286,16 +7286,16 @@ func (m *Response_DoesOracleResultExist) MarshalToSizedBuffer(dAtA []byte) (int, } return len(dAtA) - i, nil } -func (m *Response_DoesSubaccountBelongToVal) MarshalTo(dAtA []byte) (int, error) { +func (m *Response_DoesSubAccountBelongToVal) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Response_DoesSubaccountBelongToVal) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Response_DoesSubAccountBelongToVal) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - if m.DoesSubaccountBelongToVal != nil { + if m.DoesSubAccountBelongToVal != nil { { - size, err := m.DoesSubaccountBelongToVal.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.DoesSubAccountBelongToVal.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -8173,7 +8173,7 @@ func (m *ResponseDoesOracleResultExist) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } -func (m *ResponseDoesSubaccountBelongToVal) Marshal() (dAtA []byte, err error) { +func (m *ResponseDoesSubAccountBelongToVal) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -8183,12 +8183,12 @@ func (m *ResponseDoesSubaccountBelongToVal) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ResponseDoesSubaccountBelongToVal) MarshalTo(dAtA []byte) (int, error) { +func (m *ResponseDoesSubAccountBelongToVal) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ResponseDoesSubaccountBelongToVal) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ResponseDoesSubAccountBelongToVal) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -9045,14 +9045,14 @@ func (m *Request_DoesOracleResultExist) Size() (n int) { } return n } -func (m *Request_DoesSubaccountBelongToVal) Size() (n int) { +func (m *Request_DoesSubAccountBelongToVal) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.DoesSubaccountBelongToVal != nil { - l = m.DoesSubaccountBelongToVal.Size() + if m.DoesSubAccountBelongToVal != nil { + l = m.DoesSubAccountBelongToVal.Size() n += 2 + l + sovTypes(uint64(l)) } return n @@ -9483,7 +9483,7 @@ func (m *RequestDoesOracleResultExist) Size() (n int) { return n } -func (m *RequestDoesSubaccountBelongToVal) Size() (n int) { +func (m *RequestDoesSubAccountBelongToVal) Size() (n int) { if m == nil { return 0 } @@ -9760,14 +9760,14 @@ func (m *Response_DoesOracleResultExist) Size() (n int) { } return n } -func (m *Response_DoesSubaccountBelongToVal) Size() (n int) { +func (m *Response_DoesSubAccountBelongToVal) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.DoesSubaccountBelongToVal != nil { - l = m.DoesSubaccountBelongToVal.Size() + if m.DoesSubAccountBelongToVal != nil { + l = m.DoesSubAccountBelongToVal.Size() n += 2 + l + sovTypes(uint64(l)) } return n @@ -10153,7 +10153,7 @@ func (m *ResponseDoesOracleResultExist) Size() (n int) { return n } -func (m *ResponseDoesSubaccountBelongToVal) Size() (n int) { +func (m *ResponseDoesSubAccountBelongToVal) Size() (n int) { if m == nil { return 0 } @@ -11152,7 +11152,7 @@ func (m *Request) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 25: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DoesSubaccountBelongToVal", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DoesSubAccountBelongToVal", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -11179,11 +11179,11 @@ func (m *Request) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &RequestDoesSubaccountBelongToVal{} + v := &RequestDoesSubAccountBelongToVal{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &Request_DoesSubaccountBelongToVal{v} + m.Value = &Request_DoesSubAccountBelongToVal{v} iNdEx = postIndex default: iNdEx = preIndex @@ -14150,7 +14150,7 @@ func (m *RequestDoesOracleResultExist) Unmarshal(dAtA []byte) error { } return nil } -func (m *RequestDoesSubaccountBelongToVal) Unmarshal(dAtA []byte) error { +func (m *RequestDoesSubAccountBelongToVal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -14173,10 +14173,10 @@ func (m *RequestDoesSubaccountBelongToVal) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RequestDoesSubaccountBelongToVal: wiretype end group for non-group") + return fmt.Errorf("proto: RequestDoesSubAccountBelongToVal: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RequestDoesSubaccountBelongToVal: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RequestDoesSubAccountBelongToVal: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -15000,7 +15000,7 @@ func (m *Response) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 26: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DoesSubaccountBelongToVal", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DoesSubAccountBelongToVal", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -15027,11 +15027,11 @@ func (m *Response) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ResponseDoesSubaccountBelongToVal{} + v := &ResponseDoesSubAccountBelongToVal{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &Response_DoesSubaccountBelongToVal{v} + m.Value = &Response_DoesSubAccountBelongToVal{v} iNdEx = postIndex default: iNdEx = preIndex @@ -17504,7 +17504,7 @@ func (m *ResponseDoesOracleResultExist) Unmarshal(dAtA []byte) error { } return nil } -func (m *ResponseDoesSubaccountBelongToVal) Unmarshal(dAtA []byte) error { +func (m *ResponseDoesSubAccountBelongToVal) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -17527,10 +17527,10 @@ func (m *ResponseDoesSubaccountBelongToVal) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ResponseDoesSubaccountBelongToVal: wiretype end group for non-group") + return fmt.Errorf("proto: ResponseDoesSubAccountBelongToVal: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ResponseDoesSubaccountBelongToVal: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ResponseDoesSubAccountBelongToVal: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: diff --git a/config/config.go b/config/config.go index 2013f64c14a..c11ecf05475 100644 --- a/config/config.go +++ b/config/config.go @@ -853,18 +853,18 @@ type OracleConfig struct { PruneInterval time.Duration `mapstructure:"prune_interval"` // Max allowable size for votes that can be gossiped from peer to peer MaxGossipMsgSize int `mapstructure:"max_gossip_msg_size"` - // Enables subaccount signing for votes - EnableSubaccountSigning bool `mapstructure:"enable_subaccount_signing"` + // Enables sub account signing for votes + EnableSubAccountSigning bool `mapstructure:"enable_sub_account_signing"` // Path to the JSON file containing the subaccount key to use to sign oracle votes - SubaccountKeyFilePath string `mapstructure:"subaccount_key_file_path"` + SubAccountKeyFilePath string `mapstructure:"sub_account_key_file_path"` } const ( - DefaultOracleSubaccountKeyName = "oracle_subaccount_key.json" + DefaultOracleSubAccountKeyName = "oracle_sub_account_key.json" ) var ( - defaultOracleSubaccountKeyPath = filepath.Join(DefaultConfigDir, DefaultOracleSubaccountKeyName) + defaultOracleSubAccountKeyPath = filepath.Join(DefaultConfigDir, DefaultOracleSubAccountKeyName) ) // DefaultOracleConfig returns a default configuration for the CometBFT oracle service @@ -876,8 +876,8 @@ func DefaultOracleConfig() *OracleConfig { GossipInterval: 250 * time.Millisecond, // 0.25s PruneInterval: 500 * time.Millisecond, // 0.5s MaxGossipMsgSize: 65536, // only allow p2p of votes of max size 65536 bytes - EnableSubaccountSigning: false, // default to false - SubaccountKeyFilePath: defaultOracleSubaccountKeyPath, // default file path to subaccount key (config/oracle_subaccount_key.json) + EnableSubAccountSigning: false, // default to false + SubAccountKeyFilePath: defaultOracleSubAccountKeyPath, // default file path to subaccount key (config/oracle_sub_account_key.json) } } @@ -888,9 +888,9 @@ func TestOracleConfig() *OracleConfig { return cfg } -// SubaccountKeyFile returns the full path to the oracle_subaccount_key.json file -func (cfg *OracleConfig) SubaccountKeyFile(rootDir string) string { - return rootify(cfg.SubaccountKeyFilePath, rootDir) +// SubAccountKeyFile returns the full path to the oracle_sub_account_key.json file +func (cfg *OracleConfig) SubAccountKeyFile(rootDir string) string { + return rootify(cfg.SubAccountKeyFilePath, rootDir) } // ValidateBasic performs basic validation and returns an error if any check fails. diff --git a/config/toml.go b/config/toml.go index a66c949660b..6ffb655f5e0 100644 --- a/config/toml.go +++ b/config/toml.go @@ -427,11 +427,11 @@ prune_interval = "{{ .Oracle.PruneInterval }}" # Max allowable size for votes that can be gossiped from peer to peer max_gossip_msg_size = {{ .Oracle.MaxGossipMsgSize }} -# Enables subaccount signing for votes -enable_subaccount_signing = {{ .Oracle.EnableSubaccountSigning }} +# Enables sub account signing for votes +enable_sub_account_signing = {{ .Oracle.EnableSubAccountSigning }} -# Path to the JSON file containing the subaccount key to use to sign oracle votes -subaccount_key_file_path = "{{ .Oracle.SubaccountKeyFilePath }}" +# Path to the JSON file containing the sub account key to use to sign oracle votes +sub_account_key_file_path = "{{ .Oracle.SubAccountKeyFilePath }}" ####################################################### ### State Sync Configuration Options ### diff --git a/node/node.go b/node/node.go index c526df84217..1fd1ed0cbeb 100644 --- a/node/node.go +++ b/node/node.go @@ -381,14 +381,14 @@ func NewNodeWithContext(ctx context.Context, oracleSigningKey := privValidator oraclePubKey := pubKey - if config.Oracle.EnableSubaccountSigning { - // use subaccount to sign oracle votes instead - subaccountKey := privval.LoadFilePVEmptyState(config.Oracle.SubaccountKeyFile(config.RootDir), "") - oracleSigningKey = subaccountKey + if config.Oracle.EnableSubAccountSigning { + // use sub account to sign oracle votes instead + subAccountKey := privval.LoadFilePVEmptyState(config.Oracle.SubAccountKeyFile(config.RootDir), "") + oracleSigningKey = subAccountKey - oraclePubKey, err = subaccountKey.GetPubKey() + oraclePubKey, err = subAccountKey.GetPubKey() if err != nil { - return nil, fmt.Errorf("can't get oracle subaccount pubkey: %w", err) + return nil, fmt.Errorf("can't get oracle sub account pubkey: %w", err) } } diff --git a/oracle/reactor.go b/oracle/reactor.go index f02fc4ddae3..50b1a123847 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -138,13 +138,13 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { // get pubkey based on sign type if bytes.Equal(signType, oracletypes.Ed25519SignType) { - pubKey = ed25519.PubKey(msg.Pubkey) + pubKey = ed25519.PubKey(msg.PubKey) } else if bytes.Equal(signType, oracletypes.Sr25519SignType) { - pubKey = sr25519.PubKey(msg.Pubkey) + pubKey = sr25519.PubKey(msg.PubKey) } else if bytes.Equal(signType, oracletypes.Secp256k1SignType) { - pubKey = secp256k1.PubKey(msg.Pubkey) + pubKey = secp256k1.PubKey(msg.PubKey) } else { - logrus.Errorf("unsupported sign type for validator with pubkey: %v, skipping gossip", hex.EncodeToString(msg.Pubkey)) + logrus.Errorf("unsupported sign type for validator with pubkey: %v, skipping gossip", hex.EncodeToString(msg.PubKey)) return } @@ -164,7 +164,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { } else if bytes.Equal(accountType, oracletypes.SubAccountSigPrefix) { // is subaccount, verify if the corresponding main account is a validator - res, err := oracleR.OracleInfo.ProxyApp.DoesSubaccountBelongToVal(context.Background(), &abcitypes.RequestDoesSubaccountBelongToVal{Address: pubKey.Address()}) + res, err := oracleR.OracleInfo.ProxyApp.DoesSubAccountBelongToVal(context.Background(), &abcitypes.RequestDoesSubAccountBelongToVal{Address: pubKey.Address()}) if err != nil { logrus.Warnf("unable to check if subaccount: %v belongs to validator: %v", pubKey.Address().String(), err) @@ -177,7 +177,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { } } else { - logrus.Errorf("unsupported account type for validator with pubkey: %v, skipping gossip", hex.EncodeToString(msg.Pubkey)) + logrus.Errorf("unsupported account type for validator with pubkey: %v, skipping gossip", hex.EncodeToString(msg.PubKey)) return } diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 664eb4eec79..75e5462cb8c 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -65,14 +65,14 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State // batch sign the entire unsignedVoteBuffer and add to gossipBuffer newGossipVote := &oracleproto.GossipedVotes{ - Pubkey: oracleInfo.PubKey.Bytes(), + PubKey: oracleInfo.PubKey.Bytes(), SignedTimestamp: time.Now().Unix(), Votes: unsignedVotes, } // set sigPrefix based on account type and sign type sigPrefix := []byte{} - if oracleInfo.Config.EnableSubaccountSigning { + if oracleInfo.Config.EnableSubAccountSigning { sigPrefix = append(sigPrefix, types.SubAccountSigPrefix...) } else { sigPrefix = append(sigPrefix, types.MainAccountSigPrefix...) diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index 8a84696f734..9026f6adf81 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -39,7 +39,7 @@ service ABCI { rpc FetchOracleVotes(RequestFetchOracleVotes) returns (ResponseFetchOracleVotes); rpc ValidateOracleVotes(RequestValidateOracleVotes) returns (ResponseValidateOracleVotes); rpc DoesOracleResultExist(RequestDoesOracleResultExist) returns (ResponseDoesOracleResultExist); - rpc DoesSubaccountBelongToVal(RequestDoesSubaccountBelongToVal) returns (ResponseDoesSubaccountBelongToVal); + rpc DoesSubAccountBelongToVal(RequestDoesSubAccountBelongToVal) returns (ResponseDoesSubAccountBelongToVal); } //---------------------------------------- @@ -67,7 +67,7 @@ message Request { RequestFetchOracleVotes fetch_oracle_votes = 22; RequestValidateOracleVotes validate_oracle_votes = 23; RequestDoesOracleResultExist does_oracle_result_exist = 24; - RequestDoesSubaccountBelongToVal does_subaccount_belong_to_val = 25; + RequestDoesSubAccountBelongToVal does_sub_account_belong_to_val = 25; } reserved 4, 7, 9, 10; // SetOption, BeginBlock, DeliverTx, EndBlock } @@ -219,7 +219,7 @@ message RequestDoesOracleResultExist { string key = 1; } -message RequestDoesSubaccountBelongToVal { +message RequestDoesSubAccountBelongToVal { bytes address = 1; } @@ -249,7 +249,7 @@ message Response { ResponseFetchOracleVotes fetch_oracle_votes = 23; ResponseValidateOracleVotes validate_oracle_votes = 24; ResponseDoesOracleResultExist does_oracle_result_exist = 25; - ResponseDoesSubaccountBelongToVal does_subaccount_belong_to_val = 26; + ResponseDoesSubAccountBelongToVal does_sub_account_belong_to_val = 26; } reserved 5, 8, 10, 11; // SetOption, BeginBlock, DeliverTx, EndBlock } @@ -421,7 +421,7 @@ message ResponseDoesOracleResultExist { bool does_exist = 1; } -message ResponseDoesSubaccountBelongToVal { +message ResponseDoesSubAccountBelongToVal { bool belongs_to_val = 1; } diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 47e04dd69ac..eb30f597008 100644 --- a/proto/tendermint/oracle/types.pb.go +++ b/proto/tendermint/oracle/types.pb.go @@ -91,7 +91,7 @@ func (m *Vote) GetData() string { } type GossipedVotes struct { - Pubkey []byte `protobuf:"bytes,1,opt,name=pubkey,proto3" json:"pubkey,omitempty"` + PubKey []byte `protobuf:"bytes,1,opt,name=pub_key,json=pubKey,proto3" json:"pub_key,omitempty"` Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` Signature []byte `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty"` @@ -130,9 +130,9 @@ func (m *GossipedVotes) XXX_DiscardUnknown() { var xxx_messageInfo_GossipedVotes proto.InternalMessageInfo -func (m *GossipedVotes) GetPubkey() []byte { +func (m *GossipedVotes) GetPubKey() []byte { if m != nil { - return m.Pubkey + return m.PubKey } return nil } @@ -159,7 +159,7 @@ func (m *GossipedVotes) GetSignature() []byte { } type CanonicalGossipedVotes struct { - Pubkey []byte `protobuf:"bytes,1,opt,name=pubkey,proto3" json:"pubkey,omitempty"` + PubKey []byte `protobuf:"bytes,1,opt,name=pub_key,json=pubKey,proto3" json:"pub_key,omitempty"` Votes []*Vote `protobuf:"bytes,2,rep,name=votes,proto3" json:"votes,omitempty"` SignedTimestamp int64 `protobuf:"varint,3,opt,name=signed_timestamp,json=signedTimestamp,proto3" json:"signed_timestamp,omitempty"` ChainId string `protobuf:"bytes,4,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` @@ -198,9 +198,9 @@ func (m *CanonicalGossipedVotes) XXX_DiscardUnknown() { var xxx_messageInfo_CanonicalGossipedVotes proto.InternalMessageInfo -func (m *CanonicalGossipedVotes) GetPubkey() []byte { +func (m *CanonicalGossipedVotes) GetPubKey() []byte { if m != nil { - return m.Pubkey + return m.PubKey } return nil } @@ -235,28 +235,28 @@ func init() { func init() { proto.RegisterFile("tendermint/oracle/types.proto", fileDescriptor_ed9227d272ed5d90) } var fileDescriptor_ed9227d272ed5d90 = []byte{ - // 326 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x92, 0xb1, 0x4e, 0xc3, 0x30, - 0x10, 0x86, 0xeb, 0xb6, 0x94, 0xe6, 0x28, 0x02, 0x3c, 0x94, 0x20, 0x4a, 0x54, 0x75, 0x2a, 0x03, - 0x89, 0x04, 0x3c, 0x01, 0x0c, 0xa8, 0x0b, 0x43, 0x84, 0x18, 0x58, 0x2a, 0x27, 0x36, 0xad, 0x45, - 0x13, 0x47, 0xf1, 0xb5, 0x52, 0xdf, 0x82, 0x37, 0x60, 0xe2, 0x5d, 0x18, 0x3b, 0x32, 0xa2, 0xf6, - 0x45, 0x90, 0x6d, 0x44, 0x24, 0xfa, 0x00, 0x6c, 0x77, 0xdf, 0x7f, 0xe7, 0xfb, 0x7d, 0x3a, 0x38, - 0x43, 0x91, 0x73, 0x51, 0x66, 0x32, 0xc7, 0x48, 0x95, 0x2c, 0x9d, 0x89, 0x08, 0x97, 0x85, 0xd0, - 0x61, 0x51, 0x2a, 0x54, 0xf4, 0xa8, 0x92, 0x43, 0x27, 0x0f, 0x34, 0x34, 0x1f, 0x15, 0x0a, 0xda, - 0x03, 0x6f, 0xc1, 0x66, 0x92, 0x33, 0x54, 0xa5, 0x4f, 0xfa, 0x64, 0xe8, 0xc5, 0x15, 0xa0, 0xa7, - 0xe0, 0xb9, 0xfa, 0xb1, 0xe4, 0x7e, 0xdd, 0xaa, 0x6d, 0x07, 0x46, 0xdc, 0xb4, 0xa2, 0xcc, 0x84, - 0x46, 0x96, 0x15, 0x7e, 0xa3, 0x4f, 0x86, 0x8d, 0xb8, 0x02, 0x94, 0x42, 0x93, 0x33, 0x64, 0x7e, - 0xd3, 0x76, 0xd9, 0x78, 0xf0, 0x46, 0x60, 0xff, 0x4e, 0x69, 0x2d, 0x0b, 0xc1, 0xcd, 0x74, 0x4d, - 0xbb, 0xd0, 0x2a, 0xe6, 0xc9, 0x8b, 0x58, 0xda, 0xd9, 0x9d, 0xf8, 0x27, 0xa3, 0x17, 0xb0, 0xb3, - 0x30, 0x05, 0x7e, 0xbd, 0xdf, 0x18, 0xee, 0x5d, 0x1e, 0x87, 0x5b, 0x3f, 0x08, 0xcd, 0x03, 0xb1, - 0xab, 0xa2, 0xe7, 0x70, 0xa8, 0xe5, 0x24, 0x17, 0x7c, 0xfc, 0xd7, 0xd1, 0x81, 0xe3, 0x0f, 0xbf, - 0xbe, 0x7a, 0xe0, 0x19, 0xc4, 0x70, 0x5e, 0x0a, 0x6b, 0xae, 0x13, 0x57, 0x60, 0xf0, 0x4e, 0xa0, - 0x7b, 0xcb, 0x72, 0x95, 0xcb, 0x94, 0xcd, 0xfe, 0xdb, 0xea, 0x09, 0xb4, 0xd3, 0x29, 0x93, 0xb9, - 0x59, 0xbe, 0x5b, 0xe3, 0xae, 0xcd, 0x47, 0xfc, 0xe6, 0xfe, 0x63, 0x1d, 0x90, 0xd5, 0x3a, 0x20, - 0x5f, 0xeb, 0x80, 0xbc, 0x6e, 0x82, 0xda, 0x6a, 0x13, 0xd4, 0x3e, 0x37, 0x41, 0xed, 0xe9, 0x7a, - 0x22, 0x71, 0x3a, 0x4f, 0xc2, 0x54, 0x65, 0x51, 0xaa, 0x32, 0x81, 0xc9, 0x33, 0x56, 0x81, 0xbd, - 0x87, 0x68, 0xeb, 0x5a, 0x92, 0x96, 0x15, 0xae, 0xbe, 0x03, 0x00, 0x00, 0xff, 0xff, 0x7a, 0x9a, - 0x27, 0x10, 0x49, 0x02, 0x00, 0x00, + // 333 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x92, 0xc1, 0x4a, 0xfb, 0x40, + 0x10, 0xc6, 0xbb, 0x6d, 0xff, 0x6d, 0xb3, 0xff, 0x8a, 0xba, 0x07, 0x1b, 0xb1, 0x86, 0xd2, 0x53, + 0x3d, 0x98, 0x80, 0xfa, 0x04, 0x7a, 0x90, 0x22, 0x78, 0x08, 0xe2, 0xc1, 0x4b, 0xd9, 0x64, 0xc7, + 0x76, 0xb1, 0xc9, 0x86, 0xec, 0xa4, 0xd0, 0xb7, 0xf0, 0x11, 0x3c, 0xf9, 0x2c, 0x1e, 0x7b, 0xf4, + 0x28, 0xcd, 0x8b, 0x48, 0x76, 0xc1, 0x80, 0x7d, 0x00, 0x6f, 0x93, 0xdf, 0xf7, 0x4d, 0xe6, 0xdb, + 0x61, 0xe8, 0x29, 0x42, 0x2a, 0x20, 0x4f, 0x64, 0x8a, 0x81, 0xca, 0x79, 0xbc, 0x84, 0x00, 0xd7, + 0x19, 0x68, 0x3f, 0xcb, 0x15, 0x2a, 0x76, 0x58, 0xcb, 0xbe, 0x95, 0xc7, 0x9a, 0xb6, 0x1f, 0x15, + 0x02, 0x1b, 0x52, 0x67, 0xc5, 0x97, 0x52, 0x70, 0x54, 0xb9, 0x4b, 0x46, 0x64, 0xe2, 0x84, 0x35, + 0x60, 0x27, 0xd4, 0xb1, 0xfe, 0x99, 0x14, 0x6e, 0xd3, 0xa8, 0x3d, 0x0b, 0xa6, 0xa2, 0x6a, 0x45, + 0x99, 0x80, 0x46, 0x9e, 0x64, 0x6e, 0x6b, 0x44, 0x26, 0xad, 0xb0, 0x06, 0x8c, 0xd1, 0xb6, 0xe0, + 0xc8, 0xdd, 0xb6, 0xe9, 0x32, 0xf5, 0xf8, 0x8d, 0xd0, 0xbd, 0x5b, 0xa5, 0xb5, 0xcc, 0x40, 0x54, + 0xd3, 0x35, 0x1b, 0xd0, 0x6e, 0x56, 0x44, 0xb3, 0x17, 0x58, 0x9b, 0xe1, 0xfd, 0xb0, 0x93, 0x15, + 0xd1, 0x1d, 0xac, 0xd9, 0x39, 0xfd, 0xb7, 0xaa, 0x1c, 0x6e, 0x73, 0xd4, 0x9a, 0xfc, 0xbf, 0x18, + 0xf8, 0x3b, 0x4f, 0xf0, 0xab, 0x3f, 0x84, 0xd6, 0xc5, 0xce, 0xe8, 0x81, 0x96, 0xf3, 0x14, 0xc4, + 0xec, 0x77, 0xa4, 0x7d, 0xcb, 0x1f, 0x7e, 0x82, 0x0d, 0xa9, 0x53, 0x21, 0x8e, 0x45, 0x0e, 0x26, + 0x5d, 0x3f, 0xac, 0xc1, 0xf8, 0x9d, 0xd0, 0xa3, 0x1b, 0x9e, 0xaa, 0x54, 0xc6, 0x7c, 0xf9, 0xe7, + 0x59, 0x8f, 0x69, 0x2f, 0x5e, 0x70, 0x99, 0x56, 0xeb, 0xb7, 0x8b, 0xec, 0x9a, 0xef, 0xa9, 0xb8, + 0xbe, 0xff, 0xd8, 0x7a, 0x64, 0xb3, 0xf5, 0xc8, 0xd7, 0xd6, 0x23, 0xaf, 0xa5, 0xd7, 0xd8, 0x94, + 0x5e, 0xe3, 0xb3, 0xf4, 0x1a, 0x4f, 0x57, 0x73, 0x89, 0x8b, 0x22, 0xf2, 0x63, 0x95, 0x04, 0xb1, + 0x4a, 0x00, 0xa3, 0x67, 0xac, 0x0b, 0x73, 0x11, 0xc1, 0xce, 0xbd, 0x44, 0x1d, 0x23, 0x5c, 0x7e, + 0x07, 0x00, 0x00, 0xff, 0xff, 0xc8, 0x18, 0xe2, 0xab, 0x4b, 0x02, 0x00, 0x00, } func (m *Vote) Marshal() (dAtA []byte, err error) { @@ -354,10 +354,10 @@ func (m *GossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x12 } } - if len(m.Pubkey) > 0 { - i -= len(m.Pubkey) - copy(dAtA[i:], m.Pubkey) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Pubkey))) + if len(m.PubKey) > 0 { + i -= len(m.PubKey) + copy(dAtA[i:], m.PubKey) + i = encodeVarintTypes(dAtA, i, uint64(len(m.PubKey))) i-- dAtA[i] = 0xa } @@ -410,10 +410,10 @@ func (m *CanonicalGossipedVotes) MarshalToSizedBuffer(dAtA []byte) (int, error) dAtA[i] = 0x12 } } - if len(m.Pubkey) > 0 { - i -= len(m.Pubkey) - copy(dAtA[i:], m.Pubkey) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Pubkey))) + if len(m.PubKey) > 0 { + i -= len(m.PubKey) + copy(dAtA[i:], m.PubKey) + i = encodeVarintTypes(dAtA, i, uint64(len(m.PubKey))) i-- dAtA[i] = 0xa } @@ -461,7 +461,7 @@ func (m *GossipedVotes) Size() (n int) { } var l int _ = l - l = len(m.Pubkey) + l = len(m.PubKey) if l > 0 { n += 1 + l + sovTypes(uint64(l)) } @@ -487,7 +487,7 @@ func (m *CanonicalGossipedVotes) Size() (n int) { } var l int _ = l - l = len(m.Pubkey) + l = len(m.PubKey) if l > 0 { n += 1 + l + sovTypes(uint64(l)) } @@ -709,7 +709,7 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pubkey", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PubKey", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -736,9 +736,9 @@ func (m *GossipedVotes) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Pubkey = append(m.Pubkey[:0], dAtA[iNdEx:postIndex]...) - if m.Pubkey == nil { - m.Pubkey = []byte{} + m.PubKey = append(m.PubKey[:0], dAtA[iNdEx:postIndex]...) + if m.PubKey == nil { + m.PubKey = []byte{} } iNdEx = postIndex case 2: @@ -880,7 +880,7 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pubkey", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PubKey", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -907,9 +907,9 @@ func (m *CanonicalGossipedVotes) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Pubkey = append(m.Pubkey[:0], dAtA[iNdEx:postIndex]...) - if m.Pubkey == nil { - m.Pubkey = []byte{} + m.PubKey = append(m.PubKey[:0], dAtA[iNdEx:postIndex]...) + if m.PubKey == nil { + m.PubKey = []byte{} } iNdEx = postIndex case 2: diff --git a/proto/tendermint/oracle/types.proto b/proto/tendermint/oracle/types.proto index a840854f029..670c7ba8cc0 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -11,14 +11,14 @@ message Vote { } message GossipedVotes { - bytes pubkey = 1; + bytes pub_key = 1; repeated Vote votes = 2; int64 signed_timestamp = 3; bytes signature = 4; } message CanonicalGossipedVotes { - bytes pubkey = 1; + bytes pub_key = 1; repeated Vote votes = 2; int64 signed_timestamp = 3; string chain_id = 4; diff --git a/proxy/app_conn.go b/proxy/app_conn.go index b0b5891a576..9c3c20a3f8d 100644 --- a/proxy/app_conn.go +++ b/proxy/app_conn.go @@ -28,7 +28,7 @@ type AppConnConsensus interface { FetchOracleVotes(context.Context, *types.RequestFetchOracleVotes) (*types.ResponseFetchOracleVotes, error) ValidateOracleVotes(context.Context, *types.RequestValidateOracleVotes) (*types.ResponseValidateOracleVotes, error) DoesOracleResultExist(context.Context, *types.RequestDoesOracleResultExist) (*types.ResponseDoesOracleResultExist, error) - DoesSubaccountBelongToVal(context.Context, *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error) + DoesSubAccountBelongToVal(context.Context, *types.RequestDoesSubAccountBelongToVal) (*types.ResponseDoesSubAccountBelongToVal, error) } type AppConnMempool interface { @@ -134,9 +134,9 @@ func (app *appConnConsensus) DoesOracleResultExist(ctx context.Context, req *typ return app.appConn.DoesOracleResultExist(ctx, req) } -func (app *appConnConsensus) DoesSubaccountBelongToVal(ctx context.Context, req *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error) { +func (app *appConnConsensus) DoesSubAccountBelongToVal(ctx context.Context, req *types.RequestDoesSubAccountBelongToVal) (*types.ResponseDoesSubAccountBelongToVal, error) { defer addTimeSample(app.metrics.MethodTimingSeconds.With("method", "commit", "type", "sync"))() - return app.appConn.DoesSubaccountBelongToVal(ctx, req) + return app.appConn.DoesSubAccountBelongToVal(ctx, req) } //------------------------------------------------ diff --git a/proxy/mocks/app_conn_consensus.go b/proxy/mocks/app_conn_consensus.go index 21d8caaa6c3..10816a9f1e8 100644 --- a/proxy/mocks/app_conn_consensus.go +++ b/proxy/mocks/app_conn_consensus.go @@ -93,24 +93,24 @@ func (_m *AppConnConsensus) DoesOracleResultExist(_a0 context.Context, _a1 *type return r0, r1 } -// DoesSubaccountBelongToVal provides a mock function with given fields: _a0, _a1 -func (_m *AppConnConsensus) DoesSubaccountBelongToVal(_a0 context.Context, _a1 *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error) { +// DoesSubAccountBelongToVal provides a mock function with given fields: _a0, _a1 +func (_m *AppConnConsensus) DoesSubAccountBelongToVal(_a0 context.Context, _a1 *types.RequestDoesSubAccountBelongToVal) (*types.ResponseDoesSubAccountBelongToVal, error) { ret := _m.Called(_a0, _a1) - var r0 *types.ResponseDoesSubaccountBelongToVal + var r0 *types.ResponseDoesSubAccountBelongToVal var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesSubaccountBelongToVal) (*types.ResponseDoesSubaccountBelongToVal, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesSubAccountBelongToVal) (*types.ResponseDoesSubAccountBelongToVal, error)); ok { return rf(_a0, _a1) } - if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesSubaccountBelongToVal) *types.ResponseDoesSubaccountBelongToVal); ok { + if rf, ok := ret.Get(0).(func(context.Context, *types.RequestDoesSubAccountBelongToVal) *types.ResponseDoesSubAccountBelongToVal); ok { r0 = rf(_a0, _a1) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.ResponseDoesSubaccountBelongToVal) + r0 = ret.Get(0).(*types.ResponseDoesSubAccountBelongToVal) } } - if rf, ok := ret.Get(1).(func(context.Context, *types.RequestDoesSubaccountBelongToVal) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *types.RequestDoesSubAccountBelongToVal) error); ok { r1 = rf(_a0, _a1) } else { r1 = ret.Error(1) diff --git a/types/oracle.go b/types/oracle.go index bb6e9e429e7..0066ee5b31f 100644 --- a/types/oracle.go +++ b/types/oracle.go @@ -17,7 +17,7 @@ func OracleVoteSignBytes(chainID string, vote *oracleproto.GossipedVotes) []byte func CanonicalizeOracleVote(chainID string, vote *oracleproto.GossipedVotes) oracleproto.CanonicalGossipedVotes { return oracleproto.CanonicalGossipedVotes{ - Pubkey: vote.Pubkey, + PubKey: vote.PubKey, Votes: vote.Votes, SignedTimestamp: vote.SignedTimestamp, ChainId: chainID, From 0da46e4fc59d5032228febaf96b53a6917250976 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 18 Jul 2024 03:28:46 +0800 Subject: [PATCH 12/15] abstract out getter and creation of sig prefix --- oracle/reactor.go | 4 ++-- oracle/service/runner/runner.go | 21 ++++-------------- oracle/service/utils/utils.go | 38 +++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 19 deletions(-) create mode 100644 oracle/service/utils/utils.go diff --git a/oracle/reactor.go b/oracle/reactor.go index 50b1a123847..91392f1970a 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -22,6 +22,7 @@ import ( "github.com/cometbft/cometbft/libs/log" "github.com/cometbft/cometbft/oracle/service/runner" oracletypes "github.com/cometbft/cometbft/oracle/service/types" + "github.com/cometbft/cometbft/oracle/service/utils" "github.com/cometbft/cometbft/p2p" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" "github.com/cometbft/cometbft/types" @@ -132,8 +133,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { switch msg := e.Message.(type) { case *oracleproto.GossipedVotes: // get account and sign type of oracle votes - accountType := []byte{msg.Signature[0]} - signType := []byte{msg.Signature[1]} + accountType, signType := utils.GetAccountSignTypeFromSignature(msg.Signature) var pubKey crypto.PubKey // get pubkey based on sign type diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 75e5462cb8c..3b6598a6c45 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -10,6 +10,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/cometbft/cometbft/oracle/service/types" + "github.com/cometbft/cometbft/oracle/service/utils" abcitypes "github.com/cometbft/cometbft/abci/types" cs "github.com/cometbft/cometbft/consensus" @@ -71,23 +72,9 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State } // set sigPrefix based on account type and sign type - sigPrefix := []byte{} - if oracleInfo.Config.EnableSubAccountSigning { - sigPrefix = append(sigPrefix, types.SubAccountSigPrefix...) - } else { - sigPrefix = append(sigPrefix, types.MainAccountSigPrefix...) - } - - signType := oracleInfo.PubKey.Type() - switch signType { - case "ed25519": - sigPrefix = append(sigPrefix, types.Ed25519SignType...) - case "sr25519": - sigPrefix = append(sigPrefix, types.Sr25519SignType...) - case "secp256k1": - sigPrefix = append(sigPrefix, types.Secp256k1SignType...) - default: - log.Errorf("processSignVoteQueue: unsupported sign type: %v", signType) + sigPrefix, err := utils.FormSignaturePrefix(oracleInfo.Config.EnableSubAccountSigning, oracleInfo.PubKey.Type()) + if err != nil { + log.Errorf("processSignVoteQueue: unable to form sig prefix: %v", err) return } diff --git a/oracle/service/utils/utils.go b/oracle/service/utils/utils.go new file mode 100644 index 00000000000..8635700262f --- /dev/null +++ b/oracle/service/utils/utils.go @@ -0,0 +1,38 @@ +package utils + +import ( + "fmt" + + "github.com/cometbft/cometbft/oracle/service/types" +) + +// signature prefix for oracle votes is as such: +// index 0: accountType (if votes are signed by main val or oracle delegate) +// index 1: signType (type of key used: ed25519/sr25519/secp256k1) + +func GetAccountSignTypeFromSignature(signature []byte) (accountType []byte, signType []byte) { + return []byte{signature[0]}, []byte{signature[1]} +} + +func FormSignaturePrefix(isSubAccount bool, signType string) ([]byte, error) { + sigPrefix := []byte{} + + if isSubAccount { + sigPrefix = append(sigPrefix, types.SubAccountSigPrefix...) + } else { + sigPrefix = append(sigPrefix, types.MainAccountSigPrefix...) + } + + switch signType { + case "ed25519": + sigPrefix = append(sigPrefix, types.Ed25519SignType...) + case "sr25519": + sigPrefix = append(sigPrefix, types.Sr25519SignType...) + case "secp256k1": + sigPrefix = append(sigPrefix, types.Secp256k1SignType...) + default: + return nil, fmt.Errorf("FormSignaturePrefix: unsupported sign type: %v", signType) + } + + return sigPrefix, nil +} From c7eee39456efc8cc45ba25f45fc17d4aae5d5927 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 18 Jul 2024 03:31:53 +0800 Subject: [PATCH 13/15] fix lint on signer test --- privval/signer_client_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/privval/signer_client_test.go b/privval/signer_client_test.go index c05f8d7f1a1..3eedcf462c9 100644 --- a/privval/signer_client_test.go +++ b/privval/signer_client_test.go @@ -210,7 +210,7 @@ func TestSignerOracleVote(t *testing.T) { require.NoError(t, err) want := &oracleproto.GossipedVotes{ - Pubkey: pvPubKey.Bytes(), + PubKey: pvPubKey.Bytes(), SignedTimestamp: 2, Votes: []*oracleproto.Vote{ { @@ -223,7 +223,7 @@ func TestSignerOracleVote(t *testing.T) { } have := &oracleproto.GossipedVotes{ - Pubkey: scPubKey.Bytes(), + PubKey: scPubKey.Bytes(), SignedTimestamp: 2, Votes: []*oracleproto.Vote{ { From eb3b33c900e528e093f861bfebe90b61658954a5 Mon Sep 17 00:00:00 2001 From: yan-soon Date: Thu, 18 Jul 2024 14:34:38 +0800 Subject: [PATCH 14/15] remove naming of updateMtx field to improve code readability --- oracle/reactor.go | 8 ++++---- oracle/service/runner/runner.go | 16 ++++++++-------- oracle/service/types/info.go | 8 ++++---- state/execution.go | 4 ++-- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 91392f1970a..96ac07da7de 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -189,7 +189,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { } preLockTime := time.Now().UnixMilli() - oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Lock() + oracleR.OracleInfo.GossipVoteBuffer.Lock() currentGossipVote, ok := oracleR.OracleInfo.GossipVoteBuffer.Buffer[pubKey.Address().String()] if !ok { @@ -204,7 +204,7 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { oracleR.OracleInfo.GossipVoteBuffer.Buffer[pubKey.Address().String()] = msg } } - oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() + oracleR.OracleInfo.GossipVoteBuffer.Unlock() postLockTime := time.Now().UnixMilli() diff := postLockTime - preLockTime if diff > 100 { @@ -261,7 +261,7 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { } preLockTime := time.Now().UnixMilli() - oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RLock() + oracleR.OracleInfo.GossipVoteBuffer.RLock() votes := []*oracleproto.GossipedVotes{} for _, gossipVote := range oracleR.OracleInfo.GossipVoteBuffer.Buffer { // stop sending gossip votes that have passed the maxGossipVoteAge @@ -271,7 +271,7 @@ func (oracleR *Reactor) broadcastVoteRoutine(peer p2p.Peer) { votes = append(votes, gossipVote) } - oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() + oracleR.OracleInfo.GossipVoteBuffer.RUnlock() postLockTime := time.Now().UnixMilli() diff := postLockTime - preLockTime if diff > 100 { diff --git a/oracle/service/runner/runner.go b/oracle/service/runner/runner.go index 3b6598a6c45..34b5d5d9a11 100644 --- a/oracle/service/runner/runner.go +++ b/oracle/service/runner/runner.go @@ -53,13 +53,13 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State // batch sign the new votes, along with existing votes in gossipVoteBuffer, if any // append new batch into unsignedVotesBuffer, need to mutex lock as it will clash with concurrent pruning - oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() + oracleInfo.UnsignedVoteBuffer.Lock() oracleInfo.UnsignedVoteBuffer.Buffer = append(oracleInfo.UnsignedVoteBuffer.Buffer, votes...) unsignedVotes := []*oracleproto.Vote{} unsignedVotes = append(unsignedVotes, oracleInfo.UnsignedVoteBuffer.Buffer...) - oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() + oracleInfo.UnsignedVoteBuffer.Unlock() // sort the votes so that we can rebuild it in a deterministic order, when uncompressing SortOracleVotes(unsignedVotes) @@ -86,10 +86,10 @@ func ProcessSignVoteQueue(oracleInfo *types.OracleInfo, consensusState *cs.State // need to mutex lock as it will clash with concurrent gossip preLockTime := time.Now().UnixMilli() - oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() + oracleInfo.GossipVoteBuffer.Lock() address := oracleInfo.PubKey.Address().String() oracleInfo.GossipVoteBuffer.Buffer[address] = newGossipVote - oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() + oracleInfo.GossipVoteBuffer.Unlock() postLockTime := time.Now().UnixMilli() diff := postLockTime - preLockTime if diff > 100 { @@ -131,7 +131,7 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { latestAllowableTimestamp = oracleInfo.BlockTimestamps[0] } - oracleInfo.UnsignedVoteBuffer.UpdateMtx.Lock() + oracleInfo.UnsignedVoteBuffer.Lock() newVotes := []*oracleproto.Vote{} unsignedVoteBuffer := oracleInfo.UnsignedVoteBuffer.Buffer visitedVoteMap := make(map[string]struct{}) @@ -160,10 +160,10 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { } } oracleInfo.UnsignedVoteBuffer.Buffer = newVotes - oracleInfo.UnsignedVoteBuffer.UpdateMtx.Unlock() + oracleInfo.UnsignedVoteBuffer.Unlock() preLockTime := time.Now().UnixMilli() - oracleInfo.GossipVoteBuffer.UpdateMtx.Lock() + oracleInfo.GossipVoteBuffer.Lock() gossipBuffer := oracleInfo.GossipVoteBuffer.Buffer // prune gossipedVotes that are older than the latestAllowableTimestamp, which is the max(earliest block timestamp collected, current time - maxOracleGossipAge) @@ -173,7 +173,7 @@ func PruneVoteBuffers(oracleInfo *types.OracleInfo, consensusState *cs.State) { } } oracleInfo.GossipVoteBuffer.Buffer = gossipBuffer - oracleInfo.GossipVoteBuffer.UpdateMtx.Unlock() + oracleInfo.GossipVoteBuffer.Unlock() postLockTime := time.Now().UnixMilli() diff := postLockTime - preLockTime if diff > 100 { diff --git a/oracle/service/types/info.go b/oracle/service/types/info.go index cd16f6f9435..5d291efb1c5 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -22,13 +22,13 @@ type OracleInfo struct { BlockTimestamps []int64 } type GossipVoteBuffer struct { - Buffer map[string]*oracleproto.GossipedVotes - UpdateMtx cmtsync.RWMutex + Buffer map[string]*oracleproto.GossipedVotes + cmtsync.RWMutex } type UnsignedVoteBuffer struct { - Buffer []*oracleproto.Vote - UpdateMtx cmtsync.RWMutex + Buffer []*oracleproto.Vote + cmtsync.RWMutex } var MainAccountSigPrefix = []byte{0x00} diff --git a/state/execution.go b/state/execution.go index 846a9d3a6d6..c88c872589d 100644 --- a/state/execution.go +++ b/state/execution.go @@ -169,13 +169,13 @@ func (blockExec *BlockExecutor) CreateProposalBlock( // check if oracle's gossipVoteMap has any results preLockTime := time.Now().UnixMilli() - blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RLock() + blockExec.oracleInfo.GossipVoteBuffer.RLock() oracleVotesBuffer := blockExec.oracleInfo.GossipVoteBuffer.Buffer votes := []*oracleproto.GossipedVotes{} for _, vote := range oracleVotesBuffer { votes = append(votes, vote) } - blockExec.oracleInfo.GossipVoteBuffer.UpdateMtx.RUnlock() + blockExec.oracleInfo.GossipVoteBuffer.RUnlock() postLockTime := time.Now().UnixMilli() diff := postLockTime - preLockTime if diff > 100 { From 29628c8806a8b2e12012dbeddfe5481da1f715ae Mon Sep 17 00:00:00 2001 From: yan-soon Date: Mon, 22 Jul 2024 20:44:33 +0800 Subject: [PATCH 15/15] add helper func to get signature without prefix, and handle signature index errors --- oracle/reactor.go | 12 ++++++++++-- oracle/service/utils/utils.go | 15 +++++++++++++-- privval/signer_client_test.go | 14 ++++++++------ 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/oracle/reactor.go b/oracle/reactor.go index 96ac07da7de..5b5cffeffa7 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -133,7 +133,11 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { switch msg := e.Message.(type) { case *oracleproto.GossipedVotes: // get account and sign type of oracle votes - accountType, signType := utils.GetAccountSignTypeFromSignature(msg.Signature) + accountType, signType, err := utils.GetAccountSignTypeFromSignature(msg.Signature) + if err != nil { + logrus.Errorf("unable to get account and sign type from signature: %v", msg.Signature) + return + } var pubKey crypto.PubKey // get pubkey based on sign type @@ -183,7 +187,11 @@ func (oracleR *Reactor) Receive(e p2p.Envelope) { // verify sig of incoming gossip vote, throw if verification fails // signature starts from index 2 onwards due to the account and sign type prefix bytes - if success := pubKey.VerifySignature(types.OracleVoteSignBytes(oracleR.ConsensusState.GetState().ChainID, msg), msg.Signature[2:]); !success { + signatureWithoutPrefix, err := utils.GetSignatureWithoutPrefix(msg.Signature) + if err != nil { + logrus.Errorf("unable to get signature without prefix, invalid signature: %v", msg.Signature) + } + if success := pubKey.VerifySignature(types.OracleVoteSignBytes(oracleR.ConsensusState.GetState().ChainID, msg), signatureWithoutPrefix); !success { logrus.Errorf("failed signature verification for validator: %v, skipping gossip", pubKey.Address().String()) return } diff --git a/oracle/service/utils/utils.go b/oracle/service/utils/utils.go index 8635700262f..52bd3093072 100644 --- a/oracle/service/utils/utils.go +++ b/oracle/service/utils/utils.go @@ -10,8 +10,11 @@ import ( // index 0: accountType (if votes are signed by main val or oracle delegate) // index 1: signType (type of key used: ed25519/sr25519/secp256k1) -func GetAccountSignTypeFromSignature(signature []byte) (accountType []byte, signType []byte) { - return []byte{signature[0]}, []byte{signature[1]} +func GetAccountSignTypeFromSignature(signature []byte) (accountType []byte, signType []byte, err error) { + if len(signature) < 2 { + return nil, nil, fmt.Errorf("GetAccountSignTypeFromSignature: invalid signature: %v", signature) + } + return []byte{signature[0]}, []byte{signature[1]}, nil } func FormSignaturePrefix(isSubAccount bool, signType string) ([]byte, error) { @@ -36,3 +39,11 @@ func FormSignaturePrefix(isSubAccount bool, signType string) ([]byte, error) { return sigPrefix, nil } + +func GetSignatureWithoutPrefix(prefixedSig []byte) ([]byte, error) { + if len(prefixedSig) < 2 { + return nil, fmt.Errorf("GetSignature: invalid signature: %v", prefixedSig) + } + + return prefixedSig[2:], nil +} diff --git a/privval/signer_client_test.go b/privval/signer_client_test.go index 3eedcf462c9..0a6a6c96027 100644 --- a/privval/signer_client_test.go +++ b/privval/signer_client_test.go @@ -11,7 +11,7 @@ import ( "github.com/cometbft/cometbft/crypto" "github.com/cometbft/cometbft/crypto/tmhash" cmtrand "github.com/cometbft/cometbft/libs/rand" - oracletypes "github.com/cometbft/cometbft/oracle/service/types" + "github.com/cometbft/cometbft/oracle/service/utils" cryptoproto "github.com/cometbft/cometbft/proto/tendermint/crypto" oracleproto "github.com/cometbft/cometbft/proto/tendermint/oracle" privvalproto "github.com/cometbft/cometbft/proto/tendermint/privval" @@ -247,18 +247,20 @@ func TestSignerOracleVote(t *testing.T) { } }) - sigPrefix := []byte{} - sigPrefix = append(sigPrefix, oracletypes.MainAccountSigPrefix...) - sigPrefix = append(sigPrefix, oracletypes.Ed25519SignType...) + sigPrefix, err := utils.FormSignaturePrefix(false, "ed25519") + assert.Equal(t, err, nil) require.NoError(t, tc.mockPV.SignOracleVote(tc.chainID, want, sigPrefix)) require.NoError(t, tc.signerClient.SignOracleVote(tc.chainID, have, sigPrefix)) assert.Equal(t, want.Signature, have.Signature) + signatureWithoutPrefix, err := utils.GetSignatureWithoutPrefix(have.Signature) + assert.Equal(t, err, nil) + // test verify sig with pv and signing client signatures - require.True(t, pvPubKey.VerifySignature(types.OracleVoteSignBytes(tc.chainID, want), want.Signature[2:])) - require.True(t, scPubKey.VerifySignature(types.OracleVoteSignBytes(tc.chainID, have), have.Signature[2:])) + require.True(t, pvPubKey.VerifySignature(types.OracleVoteSignBytes(tc.chainID, want), signatureWithoutPrefix)) + require.True(t, scPubKey.VerifySignature(types.OracleVoteSignBytes(tc.chainID, have), signatureWithoutPrefix)) } }