From 532def2db9a063d8abff04a02f996ddaf9101355 Mon Sep 17 00:00:00 2001 From: "Soon Xiang, Yan" <65216986+yan-soon@users.noreply.github.com> Date: Tue, 23 Jul 2024 16:24:45 +0800 Subject: [PATCH] Feat/optimise oracle (#6) * add chainID to signing of oracle votes * update gossip interval to 250ms * add lifecycle hook for checking if oracle result exist * add pruning oracle vote logic for already committed results * add sig prefix for oracle votes signing * add signType to sigPrefix * add configs and init for oracle subaccount signing * update oracle votes signing and verification flow with new sig prefixes wip * add hook to check if subaccount belongs to val * update oracle votes signing and verification flow with new sig prefixes done * update subAccount and pubKey fields with proper camel casing * abstract out getter and creation of sig prefix * fix lint on signer test * remove naming of updateMtx field to improve code readability * add helper func to get signature without prefix, and handle signature index errors --------- Co-authored-by: yan-soon --- abci/client/grpc_client.go | 8 + abci/client/mocks/client.go | 156 ++- abci/client/socket_client.go | 22 + abci/types/application.go | 10 + abci/types/messages.go | 12 + abci/types/mocks/application.go | 156 ++- abci/types/types.pb.go | 1806 ++++++++++++++++++++------ config/config.go | 31 +- config/toml.go | 6 + node/node.go | 17 +- oracle/reactor.go | 76 +- oracle/service/runner/runner.go | 40 +- oracle/service/types/info.go | 15 +- oracle/service/utils/utils.go | 49 + privval/file.go | 9 +- privval/retry_signer_client.go | 4 +- privval/signer_client.go | 3 +- privval/signer_client_test.go | 32 +- privval/signer_requestHandler.go | 10 +- proto/tendermint/abci/types.proto | 22 + proto/tendermint/oracle/types.pb.go | 141 +- proto/tendermint/oracle/types.proto | 5 +- proto/tendermint/privval/types.pb.go | 169 ++- proto/tendermint/privval/types.proto | 1 + proxy/app_conn.go | 12 + proxy/mocks/app_conn_consensus.go | 146 ++- state/execution.go | 4 +- types/oracle.go | 9 +- types/priv_validator.go | 7 +- 29 files changed, 2297 insertions(+), 681 deletions(-) create mode 100644 oracle/service/utils/utils.go diff --git a/abci/client/grpc_client.go b/abci/client/grpc_client.go index 0b337eb8d43..cabb09b36de 100644 --- a/abci/client/grpc_client.go +++ b/abci/client/grpc_client.go @@ -257,3 +257,11 @@ 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)) +} + +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 b48cbdd19f1..6e0840bd505 100644 --- a/abci/client/mocks/client.go +++ b/abci/client/mocks/client.go @@ -123,6 +123,84 @@ 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 +} + +// 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) @@ -189,6 +267,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 +510,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 +628,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..182be0ebeaa 100644 --- a/abci/client/socket_client.go +++ b/abci/client/socket_client.go @@ -445,6 +445,28 @@ 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) 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 ffb43865dd1..3634da421fe 100644 --- a/abci/types/application.go +++ b/abci/types/application.go @@ -39,6 +39,8 @@ 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) + DoesSubAccountBelongToVal(context.Context, *RequestDoesSubAccountBelongToVal) (*ResponseDoesSubAccountBelongToVal, error) } //------------------------------------------------------- @@ -136,3 +138,11 @@ 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 +} + +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 2bd4421de53..dbf7acd2801 100644 --- a/abci/types/messages.go +++ b/abci/types/messages.go @@ -142,6 +142,18 @@ func ToRequestValidateOracleVotes(req *RequestValidateOracleVotes) *Request { } } +func ToRequestDoesOracleResultExist(req *RequestDoesOracleResultExist) *Request { + return &Request{ + Value: &Request_DoesOracleResultExist{req}, + } +} + +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 061bee9c225..0ccd7673992 100644 --- a/abci/types/mocks/application.go +++ b/abci/types/mocks/application.go @@ -92,6 +92,84 @@ 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 +} + +// 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) @@ -118,6 +196,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 +378,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 +456,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..a7bdb6656fa 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{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{32, 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{34, 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{36, 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{40, 0} + return fileDescriptor_252557cfdd89a31a, []int{42, 0} } type Request struct { @@ -268,6 +268,8 @@ type Request struct { // *Request_CreateOracleResultTx // *Request_FetchOracleVotes // *Request_ValidateOracleVotes + // *Request_DoesOracleResultExist + // *Request_DoesSubAccountBelongToVal Value isRequest_Value `protobuf_oneof:"value"` } @@ -367,26 +369,34 @@ 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"` +} +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() {} +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 { @@ -528,6 +538,20 @@ 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 +} + +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{}{ @@ -550,6 +574,8 @@ func (*Request) XXX_OneofWrappers() []interface{} { (*Request_CreateOracleResultTx)(nil), (*Request_FetchOracleVotes)(nil), (*Request_ValidateOracleVotes)(nil), + (*Request_DoesOracleResultExist)(nil), + (*Request_DoesSubAccountBelongToVal)(nil), } } @@ -1769,6 +1795,94 @@ 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 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: // @@ -1792,6 +1906,8 @@ type Response struct { // *Response_CreateOracleResultTx // *Response_FetchOracleVotes // *Response_ValidateOracleVotes + // *Response_DoesOracleResultExist + // *Response_DoesSubAccountBelongToVal Value isResponse_Value `protobuf_oneof:"value"` } @@ -1799,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{20} + return fileDescriptor_252557cfdd89a31a, []int{22} } func (m *Response) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1894,27 +2010,35 @@ 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"` +} +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() {} +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 { @@ -2063,6 +2187,20 @@ 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 +} + +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{}{ @@ -2086,6 +2224,8 @@ func (*Response) XXX_OneofWrappers() []interface{} { (*Response_CreateOracleResultTx)(nil), (*Response_FetchOracleVotes)(nil), (*Response_ValidateOracleVotes)(nil), + (*Response_DoesOracleResultExist)(nil), + (*Response_DoesSubAccountBelongToVal)(nil), } } @@ -2098,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{21} + return fileDescriptor_252557cfdd89a31a, []int{23} } func (m *ResponseException) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2142,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{22} + return fileDescriptor_252557cfdd89a31a, []int{24} } func (m *ResponseEcho) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2185,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{23} + return fileDescriptor_252557cfdd89a31a, []int{25} } func (m *ResponseFlush) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2226,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{24} + return fileDescriptor_252557cfdd89a31a, []int{26} } func (m *ResponseInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2300,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{25} + return fileDescriptor_252557cfdd89a31a, []int{27} } func (m *ResponseInitChain) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2367,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{26} + return fileDescriptor_252557cfdd89a31a, []int{28} } func (m *ResponseQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2474,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{27} + return fileDescriptor_252557cfdd89a31a, []int{29} } func (m *ResponseCheckTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2567,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{28} + return fileDescriptor_252557cfdd89a31a, []int{30} } func (m *ResponseCommit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2611,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{29} + return fileDescriptor_252557cfdd89a31a, []int{31} } func (m *ResponseListSnapshots) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2655,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{30} + return fileDescriptor_252557cfdd89a31a, []int{32} } func (m *ResponseOfferSnapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2699,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{31} + return fileDescriptor_252557cfdd89a31a, []int{33} } func (m *ResponseLoadSnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2745,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{32} + return fileDescriptor_252557cfdd89a31a, []int{34} } func (m *ResponseApplySnapshotChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2803,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{33} + return fileDescriptor_252557cfdd89a31a, []int{35} } func (m *ResponsePrepareProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2847,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{34} + return fileDescriptor_252557cfdd89a31a, []int{36} } func (m *ResponseProcessProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2891,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{35} + return fileDescriptor_252557cfdd89a31a, []int{37} } func (m *ResponseExtendVote) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2935,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{36} + return fileDescriptor_252557cfdd89a31a, []int{38} } func (m *ResponseVerifyVoteExtension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2990,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{37} + return fileDescriptor_252557cfdd89a31a, []int{39} } func (m *ResponseFinalizeBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3062,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{38} + return fileDescriptor_252557cfdd89a31a, []int{40} } func (m *ResponseCreateOracleResultTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3106,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{39} + return fileDescriptor_252557cfdd89a31a, []int{41} } func (m *ResponseFetchOracleVotes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3150,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{40} + return fileDescriptor_252557cfdd89a31a, []int{42} } func (m *ResponseValidateOracleVotes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3186,6 +3326,94 @@ 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{43} +} +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 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) { + 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 +} + 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 +3423,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{45} } func (m *CommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3253,7 +3481,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{46} } func (m *ExtendedCommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3308,7 +3536,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{47} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3362,7 +3590,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{48} } func (m *EventAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3430,7 +3658,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{49} } func (m *ExecTxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3529,7 +3757,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{50} } func (m *TxResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3596,7 +3824,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{51} } func (m *Validator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3648,7 +3876,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{52} } func (m *ValidatorUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3700,7 +3928,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{53} } func (m *VoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3758,7 +3986,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{54} } func (m *ExtendedVoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3833,7 +4061,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{55} } func (m *Misbehavior) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3909,7 +4137,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{56} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4001,6 +4229,8 @@ 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((*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") @@ -4022,6 +4252,8 @@ 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((*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") @@ -4039,226 +4271,238 @@ 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, + // 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. @@ -4292,6 +4536,8 @@ 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) + DoesSubAccountBelongToVal(ctx context.Context, in *RequestDoesSubAccountBelongToVal, opts ...grpc.CallOption) (*ResponseDoesSubAccountBelongToVal, error) } type aBCIClient struct { @@ -4473,6 +4719,24 @@ 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 +} + +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) @@ -4494,6 +4758,8 @@ 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) + DoesSubAccountBelongToVal(context.Context, *RequestDoesSubAccountBelongToVal) (*ResponseDoesSubAccountBelongToVal, error) } // UnimplementedABCIServer can be embedded to have forward compatible implementations. @@ -4557,6 +4823,12 @@ 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 (*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) @@ -4904,6 +5176,42 @@ 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) +} + +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), @@ -4984,6 +5292,14 @@ var _ABCI_serviceDesc = grpc.ServiceDesc{ MethodName: "ValidateOracleVotes", Handler: _ABCI_ValidateOracleVotes_Handler, }, + { + MethodName: "DoesOracleResultExist", + Handler: _ABCI_DoesOracleResultExist_Handler, + }, + { + MethodName: "DoesSubAccountBelongToVal", + Handler: _ABCI_DoesSubAccountBelongToVal_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "tendermint/abci/types.proto", @@ -5436,26 +5752,72 @@ func (m *Request_ValidateOracleVotes) MarshalToSizedBuffer(dAtA []byte) (int, er } return len(dAtA) - i, nil } -func (m *RequestEcho) 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 *RequestEcho) MarshalTo(dAtA []byte) (int, error) { +func (m *Request_DoesOracleResultExist) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *RequestEcho) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Request_DoesOracleResultExist) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l + 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 *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) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RequestEcho) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RequestEcho) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l if len(m.Message) > 0 { i -= len(m.Message) copy(dAtA[i:], m.Message) @@ -5601,12 +5963,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 + 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 -= n21 - i = encodeVarintTypes(dAtA, i, uint64(n21)) + i -= n23 + i = encodeVarintTypes(dAtA, i, uint64(n23)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -5901,12 +6263,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 + 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 -= n23 - i = encodeVarintTypes(dAtA, i, uint64(n23)) + i -= n25 + i = encodeVarintTypes(dAtA, i, uint64(n25)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -5989,12 +6351,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 + 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 -= n25 - i = encodeVarintTypes(dAtA, i, uint64(n25)) + i -= n27 + i = encodeVarintTypes(dAtA, i, uint64(n27)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -6112,12 +6474,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 + 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 -= n28 - i = encodeVarintTypes(dAtA, i, uint64(n28)) + i -= n30 + i = encodeVarintTypes(dAtA, i, uint64(n30)) i-- dAtA[i] = 0x1a if m.Height != 0 { @@ -6218,12 +6580,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 + 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 -= n29 - i = encodeVarintTypes(dAtA, i, uint64(n29)) + i -= n31 + i = encodeVarintTypes(dAtA, i, uint64(n31)) i-- dAtA[i] = 0x32 if m.Height != 0 { @@ -6371,6 +6733,66 @@ 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 *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) @@ -6841,6 +7263,52 @@ 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 *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) @@ -7352,20 +7820,20 @@ func (m *ResponseApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, err } } if len(m.RefetchChunks) > 0 { - dAtA54 := make([]byte, len(m.RefetchChunks)*10) - var j53 int + dAtA58 := make([]byte, len(m.RefetchChunks)*10) + var j57 int for _, num := range m.RefetchChunks { for num >= 1<<7 { - dAtA54[j53] = uint8(uint64(num)&0x7f | 0x80) + dAtA58[j57] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j53++ + j57++ } - dAtA54[j53] = uint8(num) - j53++ + dAtA58[j57] = uint8(num) + j57++ } - i -= j53 - copy(dAtA[i:], dAtA54[:j53]) - i = encodeVarintTypes(dAtA, i, uint64(j53)) + i -= j57 + copy(dAtA[i:], dAtA58[:j57]) + i = encodeVarintTypes(dAtA, i, uint64(j57)) i-- dAtA[i] = 0x12 } @@ -7672,6 +8140,72 @@ 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 *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 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) @@ -8165,12 +8699,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 + 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 -= n61 - i = encodeVarintTypes(dAtA, i, uint64(n61)) + i -= n65 + i = encodeVarintTypes(dAtA, i, uint64(n65)) i-- dAtA[i] = 0x22 if m.Height != 0 { @@ -8499,6 +9033,30 @@ 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 *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 @@ -8912,43 +9470,69 @@ func (m *RequestValidateOracleVotes) Size() (n int) { return n } -func (m *Response) Size() (n int) { +func (m *RequestDoesOracleResultExist) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Value != nil { - n += m.Value.Size() + l = len(m.Key) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) } return n } -func (m *Response_Exception) Size() (n int) { +func (m *RequestDoesSubAccountBelongToVal) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Exception != nil { - l = m.Exception.Size() + l = len(m.Address) + if l > 0 { n += 1 + l + sovTypes(uint64(l)) } return n } -func (m *Response_Echo) Size() (n int) { + +func (m *Response) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Echo != nil { - l = m.Echo.Size() - n += 1 + l + sovTypes(uint64(l)) + if m.Value != nil { + n += m.Value.Size() } return n } -func (m *Response_Flush) Size() (n int) { + +func (m *Response_Exception) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Exception != nil { + l = m.Exception.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_Echo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Echo != nil { + l = m.Echo.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *Response_Flush) Size() (n int) { if m == nil { return 0 } @@ -9164,6 +9748,30 @@ 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 *Response_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 *ResponseException) Size() (n int) { if m == nil { return 0 @@ -9533,6 +10141,30 @@ 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 *ResponseDoesSubAccountBelongToVal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.BelongsToVal { + n += 2 + } + return n +} + func (m *CommitInfo) Size() (n int) { if m == nil { return 0 @@ -10483,6 +11115,76 @@ 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 + 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:]) @@ -13366,6 +14068,172 @@ 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 *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 @@ -14095,6 +14963,76 @@ 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 + 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:]) @@ -16496,6 +17434,146 @@ 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 *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) + 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/config/config.go b/config/config.go index 08fcaa2e72e..c11ecf05475 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 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:"sub_account_key_file_path"` } +const ( + DefaultOracleSubAccountKeyName = "oracle_sub_account_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: 100 * time.Millisecond, // 0.1s - 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_sub_account_key.json) } } @@ -874,6 +888,11 @@ func TestOracleConfig() *OracleConfig { return cfg } +// 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. func (cfg *OracleConfig) ValidateBasic() error { if cfg.MaxOracleGossipBlocksDelayed <= 0 { diff --git a/config/toml.go b/config/toml.go index 306996d5cff..6ffb655f5e0 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 sub account signing for votes +enable_sub_account_signing = {{ .Oracle.EnableSubAccountSigning }} + +# 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 102a6acbcc1..1fd1ed0cbeb 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,21 @@ func NewNodeWithContext(ctx context.Context, } // Make OracleReactor - oracleReactor := oracle.NewReactor(config.Oracle, pubKey, privValidator, proxyApp.Consensus()) + oracleSigningKey := privValidator + oraclePubKey := pubKey + + 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() + if err != nil { + return nil, fmt.Errorf("can't get oracle sub account pubkey: %w", err) + } + } + + 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 fa4ac14dee9..5b5cffeffa7 100644 --- a/oracle/reactor.go +++ b/oracle/reactor.go @@ -1,20 +1,28 @@ package oracle import ( + "bytes" + "context" "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" "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" 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" @@ -124,26 +132,72 @@ 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, 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 + 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 } - pubKey := val.PubKey // skip if its own buffer if oracleR.OracleInfo.PubKey.Equals(pubKey) { return } - if success := pubKey.VerifySignature(types.OracleVoteSignBytes(msg), msg.Signature); !success { - logrus.Errorf("failed signature verification for validator: %v, skipping gossip", val.Address) + // 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) { + // 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 + } + + // 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 + 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 } preLockTime := time.Now().UnixMilli() - oracleR.OracleInfo.GossipVoteBuffer.UpdateMtx.Lock() + oracleR.OracleInfo.GossipVoteBuffer.Lock() currentGossipVote, ok := oracleR.OracleInfo.GossipVoteBuffer.Buffer[pubKey.Address().String()] if !ok { @@ -158,7 +212,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 { @@ -215,7 +269,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 @@ -225,7 +279,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 fdf551b2698..34b5d5d9a11 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" @@ -52,36 +53,43 @@ 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) // 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, err := utils.FormSignaturePrefix(oracleInfo.Config.EnableSubAccountSigning, oracleInfo.PubKey.Type()) + if err != nil { + log.Errorf("processSignVoteQueue: unable to form sig prefix: %v", err) + return + } + // signing of vote should append the signature field of gossipVote - if err := oracleInfo.PrivValidator.SignOracleVote("", newGossipVote); 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 } // 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 { @@ -123,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{}) @@ -137,15 +145,25 @@ 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 { + continue + } + if vote.Timestamp >= latestAllowableTimestamp { newVotes = append(newVotes, vote) } } 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) @@ -155,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 3bfed9b532f..5d291efb1c5 100644 --- a/oracle/service/types/info.go +++ b/oracle/service/types/info.go @@ -22,11 +22,18 @@ 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} +var SubAccountSigPrefix = []byte{0x01} + +var Ed25519SignType = []byte{0x02} +var Sr25519SignType = []byte{0x03} +var Secp256k1SignType = []byte{0x04} diff --git a/oracle/service/utils/utils.go b/oracle/service/utils/utils.go new file mode 100644 index 00000000000..52bd3093072 --- /dev/null +++ b/oracle/service/utils/utils.go @@ -0,0 +1,49 @@ +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, 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) { + 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 +} + +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/file.go b/privval/file.go index 287e13d9e5e..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(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(vote *oracleproto.GossipedVotes) error { - signBytes := types.OracleVoteSignBytes(vote) +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 f620bf0bf5a..0a6a6c96027 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" + "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" @@ -201,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{ { @@ -216,7 +223,7 @@ func TestSignerOracleVote(t *testing.T) { } have := &oracleproto.GossipedVotes{ - Validator: valAddr, + PubKey: scPubKey.Bytes(), SignedTimestamp: 2, Votes: []*oracleproto.Vote{ { @@ -240,21 +247,20 @@ func TestSignerOracleVote(t *testing.T) { } }) - require.NoError(t, tc.mockPV.SignOracleVote("", want)) - require.NoError(t, tc.signerClient.SignOracleVote("", have)) + sigPrefix, err := utils.FormSignaturePrefix(false, "ed25519") + assert.Equal(t, err, nil) - assert.Equal(t, want.Signature, have.Signature) + require.NoError(t, tc.mockPV.SignOracleVote(tc.chainID, want, sigPrefix)) + require.NoError(t, tc.signerClient.SignOracleVote(tc.chainID, have, sigPrefix)) - // test get pubkey - pvPubKey, err := tc.mockPV.GetPubKey() - require.NoError(t, err) + assert.Equal(t, want.Signature, have.Signature) - scPubKey, err := tc.signerClient.GetPubKey() - require.NoError(t, err) + 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(want), want.Signature)) - require.True(t, scPubKey.VerifySignature(types.OracleVoteSignBytes(have), have.Signature)) + require.True(t, pvPubKey.VerifySignature(types.OracleVoteSignBytes(tc.chainID, want), signatureWithoutPrefix)) + require.True(t, scPubKey.VerifySignature(types.OracleVoteSignBytes(tc.chainID, have), signatureWithoutPrefix)) } } diff --git a/privval/signer_requestHandler.go b/privval/signer_requestHandler.go index 1ae19e166c3..e4e6afe044a 100644 --- a/privval/signer_requestHandler.go +++ b/privval/signer_requestHandler.go @@ -67,9 +67,17 @@ 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 + sigPrefix := r.SignOracleVoteRequest.SignaturePrefix - err = privVal.SignOracleVote("", 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/abci/types.proto b/proto/tendermint/abci/types.proto index de84f213506..9026f6adf81 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -38,6 +38,8 @@ service ABCI { rpc CreateOracleResultTx(RequestCreateOracleResultTx) returns (ResponseCreateOracleResultTx); rpc FetchOracleVotes(RequestFetchOracleVotes) returns (ResponseFetchOracleVotes); rpc ValidateOracleVotes(RequestValidateOracleVotes) returns (ResponseValidateOracleVotes); + rpc DoesOracleResultExist(RequestDoesOracleResultExist) returns (ResponseDoesOracleResultExist); + rpc DoesSubAccountBelongToVal(RequestDoesSubAccountBelongToVal) returns (ResponseDoesSubAccountBelongToVal); } //---------------------------------------- @@ -64,6 +66,8 @@ message Request { RequestCreateOracleResultTx create_oracle_result_tx = 21; RequestFetchOracleVotes fetch_oracle_votes = 22; RequestValidateOracleVotes validate_oracle_votes = 23; + RequestDoesOracleResultExist does_oracle_result_exist = 24; + RequestDoesSubAccountBelongToVal does_sub_account_belong_to_val = 25; } reserved 4, 7, 9, 10; // SetOption, BeginBlock, DeliverTx, EndBlock } @@ -211,6 +215,14 @@ message RequestValidateOracleVotes { bytes oracle_tx = 1; } +message RequestDoesOracleResultExist { + string key = 1; +} + +message RequestDoesSubAccountBelongToVal { + bytes address = 1; +} + //---------------------------------------- // Response types @@ -236,6 +248,8 @@ message Response { ResponseCreateOracleResultTx create_oracle_result_tx = 22; ResponseFetchOracleVotes fetch_oracle_votes = 23; ResponseValidateOracleVotes validate_oracle_votes = 24; + ResponseDoesOracleResultExist does_oracle_result_exist = 25; + ResponseDoesSubAccountBelongToVal does_sub_account_belong_to_val = 26; } reserved 5, 8, 10, 11; // SetOption, BeginBlock, DeliverTx, EndBlock } @@ -403,6 +417,14 @@ message ResponseValidateOracleVotes { } } +message ResponseDoesOracleResultExist { + bool does_exist = 1; +} + +message ResponseDoesSubAccountBelongToVal { + bool belongs_to_val = 1; +} + //---------------------------------------- // Misc. diff --git a/proto/tendermint/oracle/types.pb.go b/proto/tendermint/oracle/types.pb.go index 9932768d2ab..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 { - Validator []byte `protobuf:"bytes,1,opt,name=validator,proto3" json:"validator,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) GetValidator() []byte { +func (m *GossipedVotes) GetPubKey() []byte { if m != nil { - return m.Validator + return m.PubKey } return nil } @@ -159,9 +159,10 @@ 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=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"` } func (m *CanonicalGossipedVotes) Reset() { *m = CanonicalGossipedVotes{} } @@ -197,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 } @@ -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,28 @@ 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, + // 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) { @@ -344,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 } @@ -374,6 +384,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-- @@ -393,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 } @@ -444,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)) } @@ -470,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)) } @@ -483,6 +500,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 } @@ -688,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 { @@ -715,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: @@ -859,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 { @@ -886,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: @@ -944,6 +965,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..670c7ba8cc0 100644 --- a/proto/tendermint/oracle/types.proto +++ b/proto/tendermint/oracle/types.proto @@ -11,14 +11,15 @@ message Vote { } message GossipedVotes { - bytes validator = 1; + bytes pub_key = 1; repeated Vote votes = 2; int64 signed_timestamp = 3; bytes signature = 4; } message CanonicalGossipedVotes { - bytes validator = 1; + bytes pub_key = 1; repeated Vote votes = 2; int64 signed_timestamp = 3; + string chain_id = 4; } 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/proxy/app_conn.go b/proxy/app_conn.go index 6d411b91c29..9c3c20a3f8d 100644 --- a/proxy/app_conn.go +++ b/proxy/app_conn.go @@ -27,6 +27,8 @@ 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) + DoesSubAccountBelongToVal(context.Context, *types.RequestDoesSubAccountBelongToVal) (*types.ResponseDoesSubAccountBelongToVal, error) } type AppConnMempool interface { @@ -127,6 +129,16 @@ 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) +} + +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 5b4e653e0ec..10816a9f1e8 100644 --- a/proxy/mocks/app_conn_consensus.go +++ b/proxy/mocks/app_conn_consensus.go @@ -41,6 +41,84 @@ 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 +} + +// 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() @@ -81,24 +159,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 +185,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 +211,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 +289,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) 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 { diff --git a/types/oracle.go b/types/oracle.go index c917140e9af..0066ee5b31f 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, + PubKey: vote.PubKey, Votes: vote.Votes, SignedTimestamp: vote.SignedTimestamp, + ChainId: chainID, } } diff --git a/types/priv_validator.go b/types/priv_validator.go index 45da4d6a337..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 { - signBytes := OracleVoteSignBytes(vote) +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