package types
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
|
|
"github.com/gogo/protobuf/jsonpb"
|
|
|
|
types "github.com/tendermint/tendermint/proto/tendermint/types"
|
|
)
|
|
|
|
const (
|
|
CodeTypeOK uint32 = 0
|
|
)
|
|
|
|
// IsOK returns true if Code is OK.
|
|
func (r ResponseCheckTx) IsOK() bool {
|
|
return r.Code == CodeTypeOK
|
|
}
|
|
|
|
// IsErr returns true if Code is something other than OK.
|
|
func (r ResponseCheckTx) IsErr() bool {
|
|
return r.Code != CodeTypeOK
|
|
}
|
|
|
|
// IsOK returns true if Code is OK.
|
|
func (r ResponseDeliverTx) IsOK() bool {
|
|
return r.Code == CodeTypeOK
|
|
}
|
|
|
|
// IsErr returns true if Code is something other than OK.
|
|
func (r ResponseDeliverTx) IsErr() bool {
|
|
return r.Code != CodeTypeOK
|
|
}
|
|
|
|
// IsOK returns true if Code is OK.
|
|
func (r ExecTxResult) IsOK() bool {
|
|
return r.Code == CodeTypeOK
|
|
}
|
|
|
|
// IsErr returns true if Code is something other than OK.
|
|
func (r ExecTxResult) IsErr() bool {
|
|
return r.Code != CodeTypeOK
|
|
}
|
|
|
|
// IsOK returns true if Code is OK.
|
|
func (r ResponseQuery) IsOK() bool {
|
|
return r.Code == CodeTypeOK
|
|
}
|
|
|
|
// IsErr returns true if Code is something other than OK.
|
|
func (r ResponseQuery) IsErr() bool {
|
|
return r.Code != CodeTypeOK
|
|
}
|
|
|
|
func (r ResponsePrepareProposal) IsTxStatusUnknown() bool {
|
|
return r.ModifiedTxStatus == ResponsePrepareProposal_UNKNOWN
|
|
}
|
|
|
|
func (r ResponsePrepareProposal) IsTxStatusModified() bool {
|
|
return r.ModifiedTxStatus == ResponsePrepareProposal_MODIFIED
|
|
}
|
|
|
|
func (r ResponseProcessProposal) IsAccepted() bool {
|
|
return r.Status == ResponseProcessProposal_ACCEPT
|
|
}
|
|
|
|
func (r ResponseProcessProposal) IsStatusUnknown() bool {
|
|
return r.Status == ResponseProcessProposal_UNKNOWN
|
|
}
|
|
|
|
// IsStatusUnknown returns true if Code is Unknown
|
|
func (r ResponseVerifyVoteExtension) IsStatusUnknown() bool {
|
|
return r.Status == ResponseVerifyVoteExtension_UNKNOWN
|
|
}
|
|
|
|
// IsOK returns true if Code is OK
|
|
func (r ResponseVerifyVoteExtension) IsOK() bool {
|
|
return r.Status == ResponseVerifyVoteExtension_ACCEPT
|
|
}
|
|
|
|
// IsErr returns true if Code is something other than OK.
|
|
func (r ResponseVerifyVoteExtension) IsErr() bool {
|
|
return r.Status != ResponseVerifyVoteExtension_ACCEPT
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
// override JSON marshaling so we emit defaults (ie. disable omitempty)
|
|
|
|
var (
|
|
jsonpbMarshaller = jsonpb.Marshaler{
|
|
EnumsAsInts: true,
|
|
EmitDefaults: true,
|
|
}
|
|
jsonpbUnmarshaller = jsonpb.Unmarshaler{}
|
|
)
|
|
|
|
func (r *ResponseCheckTx) MarshalJSON() ([]byte, error) {
|
|
s, err := jsonpbMarshaller.MarshalToString(r)
|
|
return []byte(s), err
|
|
}
|
|
|
|
func (r *ResponseCheckTx) UnmarshalJSON(b []byte) error {
|
|
reader := bytes.NewBuffer(b)
|
|
return jsonpbUnmarshaller.Unmarshal(reader, r)
|
|
}
|
|
|
|
func (r *ResponseDeliverTx) MarshalJSON() ([]byte, error) {
|
|
s, err := jsonpbMarshaller.MarshalToString(r)
|
|
return []byte(s), err
|
|
}
|
|
|
|
func (r *ResponseDeliverTx) UnmarshalJSON(b []byte) error {
|
|
reader := bytes.NewBuffer(b)
|
|
return jsonpbUnmarshaller.Unmarshal(reader, r)
|
|
}
|
|
|
|
func (r *ResponseQuery) MarshalJSON() ([]byte, error) {
|
|
s, err := jsonpbMarshaller.MarshalToString(r)
|
|
return []byte(s), err
|
|
}
|
|
|
|
func (r *ResponseQuery) UnmarshalJSON(b []byte) error {
|
|
reader := bytes.NewBuffer(b)
|
|
return jsonpbUnmarshaller.Unmarshal(reader, r)
|
|
}
|
|
|
|
func (r *ResponseCommit) MarshalJSON() ([]byte, error) {
|
|
s, err := jsonpbMarshaller.MarshalToString(r)
|
|
return []byte(s), err
|
|
}
|
|
|
|
func (r *ResponseCommit) UnmarshalJSON(b []byte) error {
|
|
reader := bytes.NewBuffer(b)
|
|
return jsonpbUnmarshaller.Unmarshal(reader, r)
|
|
}
|
|
|
|
func (r *EventAttribute) MarshalJSON() ([]byte, error) {
|
|
s, err := jsonpbMarshaller.MarshalToString(r)
|
|
return []byte(s), err
|
|
}
|
|
|
|
func (r *EventAttribute) UnmarshalJSON(b []byte) error {
|
|
reader := bytes.NewBuffer(b)
|
|
return jsonpbUnmarshaller.Unmarshal(reader, r)
|
|
}
|
|
|
|
// Some compile time assertions to ensure we don't
|
|
// have accidental runtime surprises later on.
|
|
|
|
// jsonEncodingRoundTripper ensures that asserted
|
|
// interfaces implement both MarshalJSON and UnmarshalJSON
|
|
type jsonRoundTripper interface {
|
|
json.Marshaler
|
|
json.Unmarshaler
|
|
}
|
|
|
|
var _ jsonRoundTripper = (*ResponseCommit)(nil)
|
|
var _ jsonRoundTripper = (*ResponseQuery)(nil)
|
|
var _ jsonRoundTripper = (*ResponseDeliverTx)(nil)
|
|
var _ jsonRoundTripper = (*ResponseCheckTx)(nil)
|
|
|
|
var _ jsonRoundTripper = (*EventAttribute)(nil)
|
|
|
|
// -----------------------------------------------
|
|
// construct Result data
|
|
|
|
func RespondExtendVote(appDataToSign, appDataSelfAuthenticating []byte) ResponseExtendVote {
|
|
return ResponseExtendVote{
|
|
VoteExtension: &types.VoteExtension{
|
|
AppDataToSign: appDataToSign,
|
|
AppDataSelfAuthenticating: appDataSelfAuthenticating,
|
|
},
|
|
}
|
|
}
|
|
|
|
func RespondVerifyVoteExtension(ok bool) ResponseVerifyVoteExtension {
|
|
status := ResponseVerifyVoteExtension_REJECT
|
|
if ok {
|
|
status = ResponseVerifyVoteExtension_ACCEPT
|
|
}
|
|
return ResponseVerifyVoteExtension{
|
|
Status: status,
|
|
}
|
|
}
|
|
|
|
// deterministicExecTxResult constructs a copy of response that omits
|
|
// non-deterministic fields. The input response is not modified.
|
|
func deterministicExecTxResult(response *ExecTxResult) *ExecTxResult {
|
|
return &ExecTxResult{
|
|
Code: response.Code,
|
|
Data: response.Data,
|
|
GasWanted: response.GasWanted,
|
|
GasUsed: response.GasUsed,
|
|
}
|
|
}
|
|
|
|
// MarshalTxResults encodes the the TxResults as a list of byte
|
|
// slices. It strips off the non-deterministic pieces of the TxResults
|
|
// so that the resulting data can be used for hash comparisons and used
|
|
// in Merkle proofs.
|
|
func MarshalTxResults(r []*ExecTxResult) ([][]byte, error) {
|
|
s := make([][]byte, len(r))
|
|
for i, e := range r {
|
|
d := deterministicExecTxResult(e)
|
|
b, err := d.Marshal()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
s[i] = b
|
|
}
|
|
return s, nil
|
|
}
|