Use new tmlibs/common.Error for sdk.Error
This commit is contained in:
parent
12f71876e8
commit
7487f67346
|
@ -87,7 +87,6 @@ func NewBaseApp(name string, cdc *wire.Codec, logger log.Logger, db dbm.DB) *Bas
|
||||||
txDecoder: defaultTxDecoder(cdc),
|
txDecoder: defaultTxDecoder(cdc),
|
||||||
}
|
}
|
||||||
// Register the undefined & root codespaces, which should not be used by any modules
|
// Register the undefined & root codespaces, which should not be used by any modules
|
||||||
app.codespacer.RegisterOrPanic(sdk.CodespaceUndefined)
|
|
||||||
app.codespacer.RegisterOrPanic(sdk.CodespaceRoot)
|
app.codespacer.RegisterOrPanic(sdk.CodespaceRoot)
|
||||||
return app
|
return app
|
||||||
}
|
}
|
||||||
|
@ -137,7 +136,7 @@ func defaultTxDecoder(cdc *wire.Codec) sdk.TxDecoder {
|
||||||
// are registered by MakeTxCodec
|
// are registered by MakeTxCodec
|
||||||
err := cdc.UnmarshalBinary(txBytes, &tx)
|
err := cdc.UnmarshalBinary(txBytes, &tx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, sdk.ErrTxDecode("").Trace(err.Error())
|
return nil, sdk.ErrTxDecode("").TraceSDK(err.Error())
|
||||||
}
|
}
|
||||||
return tx, nil
|
return tx, nil
|
||||||
}
|
}
|
||||||
|
@ -486,7 +485,6 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte, tx sdk.Tx) (result sdk
|
||||||
// Validate the Msg.
|
// Validate the Msg.
|
||||||
err := msg.ValidateBasic()
|
err := msg.ValidateBasic()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = err.WithDefaultCodespace(sdk.CodespaceRoot)
|
|
||||||
return err.Result()
|
return err.Result()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,13 +41,13 @@ func (msg MsgSetTrend) String() string {
|
||||||
// Validate Basic is used to quickly disqualify obviously invalid messages quickly
|
// Validate Basic is used to quickly disqualify obviously invalid messages quickly
|
||||||
func (msg MsgSetTrend) ValidateBasic() sdk.Error {
|
func (msg MsgSetTrend) ValidateBasic() sdk.Error {
|
||||||
if len(msg.Sender) == 0 {
|
if len(msg.Sender) == 0 {
|
||||||
return sdk.ErrUnknownAddress(msg.Sender.String()).Trace("")
|
return sdk.ErrUnknownAddress(msg.Sender.String()).TraceSDK("")
|
||||||
}
|
}
|
||||||
if strings.Contains(msg.Cool, "hot") {
|
if strings.Contains(msg.Cool, "hot") {
|
||||||
return sdk.ErrUnauthorized("").Trace("hot is not cool")
|
return sdk.ErrUnauthorized("").TraceSDK("hot is not cool")
|
||||||
}
|
}
|
||||||
if strings.Contains(msg.Cool, "warm") {
|
if strings.Contains(msg.Cool, "warm") {
|
||||||
return sdk.ErrUnauthorized("").Trace("warm is not very cool")
|
return sdk.ErrUnauthorized("").TraceSDK("warm is not very cool")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -91,7 +91,7 @@ func (msg MsgQuiz) String() string {
|
||||||
// Validate Basic is used to quickly disqualify obviously invalid messages quickly
|
// Validate Basic is used to quickly disqualify obviously invalid messages quickly
|
||||||
func (msg MsgQuiz) ValidateBasic() sdk.Error {
|
func (msg MsgQuiz) ValidateBasic() sdk.Error {
|
||||||
if len(msg.Sender) == 0 {
|
if len(msg.Sender) == 0 {
|
||||||
return sdk.ErrUnknownAddress(msg.Sender.String()).Trace("")
|
return sdk.ErrUnknownAddress(msg.Sender.String()).TraceSDK("")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,9 +55,6 @@ const (
|
||||||
CodeOutOfGas CodeType = 12
|
CodeOutOfGas CodeType = 12
|
||||||
|
|
||||||
// CodespaceRoot is a codespace for error codes in this file only.
|
// CodespaceRoot is a codespace for error codes in this file only.
|
||||||
// Notice that 0 is an "unset" codespace, which can be overridden with
|
|
||||||
// Error.WithDefaultCodespace().
|
|
||||||
CodespaceUndefined CodespaceType = 0
|
|
||||||
CodespaceRoot CodespaceType = 1
|
CodespaceRoot CodespaceType = 1
|
||||||
|
|
||||||
// Maximum reservable codespace (2^16 - 1)
|
// Maximum reservable codespace (2^16 - 1)
|
||||||
|
@ -141,49 +138,64 @@ func ErrOutOfGas(msg string) Error {
|
||||||
//----------------------------------------
|
//----------------------------------------
|
||||||
// Error & sdkError
|
// Error & sdkError
|
||||||
|
|
||||||
|
type cmnError = cmn.Error
|
||||||
|
|
||||||
// sdk Error type
|
// sdk Error type
|
||||||
type Error interface {
|
type Error interface {
|
||||||
Error() string
|
// Implements cmn.Error
|
||||||
|
// Error() string
|
||||||
|
// Stacktrace() cmn.Error
|
||||||
|
// Trace(offset int, format string, args ...interface{}) cmn.Error
|
||||||
|
// Data() interface{}
|
||||||
|
cmnError
|
||||||
|
|
||||||
|
// convenience
|
||||||
|
TraceSDK(format string, args ...interface{}) Error
|
||||||
|
|
||||||
Code() CodeType
|
Code() CodeType
|
||||||
Codespace() CodespaceType
|
Codespace() CodespaceType
|
||||||
ABCILog() string
|
ABCILog() string
|
||||||
ABCICode() ABCICodeType
|
ABCICode() ABCICodeType
|
||||||
WithDefaultCodespace(codespace CodespaceType) Error
|
|
||||||
Trace(msg string) Error
|
|
||||||
T() interface{}
|
|
||||||
Result() Result
|
Result() Result
|
||||||
QueryResult() abci.ResponseQuery
|
QueryResult() abci.ResponseQuery
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewError - create an error
|
// NewError - create an error.
|
||||||
func NewError(codespace CodespaceType, code CodeType, msg string) Error {
|
func NewError(codespace CodespaceType, code CodeType, format string, args ...interface{}) Error {
|
||||||
return newError(codespace, code, msg)
|
return newError(codespace, code, format, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newErrorWithRootCodespace(code CodeType, msg string) *sdkError {
|
func newErrorWithRootCodespace(code CodeType, format string, args ...interface{}) *sdkError {
|
||||||
return newError(CodespaceRoot, code, msg)
|
return newError(CodespaceRoot, code, format, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newError(codespace CodespaceType, code CodeType, msg string) *sdkError {
|
func newError(codespace CodespaceType, code CodeType, format string, args ...interface{}) *sdkError {
|
||||||
if msg == "" {
|
if format == "" {
|
||||||
msg = CodeToDefaultMsg(code)
|
format = CodeToDefaultMsg(code)
|
||||||
}
|
}
|
||||||
return &sdkError{
|
return &sdkError{
|
||||||
codespace: codespace,
|
codespace: codespace,
|
||||||
code: code,
|
code: code,
|
||||||
err: cmn.NewErrorWithT(code, msg),
|
cmnError: cmn.NewError(format, args...),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type sdkError struct {
|
type sdkError struct {
|
||||||
codespace CodespaceType
|
codespace CodespaceType
|
||||||
code CodeType
|
code CodeType
|
||||||
err cmn.Error
|
cmnError
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implements ABCIError.
|
// Implements ABCIError.
|
||||||
|
func (err *sdkError) TraceSDK(format string, args ...interface{}) Error {
|
||||||
|
err.Trace(1, format, args...)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Implements ABCIError.
|
||||||
|
// Overrides err.Error.Error().
|
||||||
func (err *sdkError) Error() string {
|
func (err *sdkError) Error() string {
|
||||||
return fmt.Sprintf("Error{%d:%d,%#v}", err.codespace, err.code, err.err)
|
return fmt.Sprintf("Error{%d:%d,%#v}", err.codespace, err.code, err.cmnError)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implements ABCIError.
|
// Implements ABCIError.
|
||||||
|
@ -209,33 +221,7 @@ Code: %v
|
||||||
ABCICode: %v
|
ABCICode: %v
|
||||||
Error: %#v
|
Error: %#v
|
||||||
=== /ABCI Log ===
|
=== /ABCI Log ===
|
||||||
`, err.codespace, err.code, err.ABCICode(), err.err)
|
`, err.codespace, err.code, err.ABCICode(), err.cmnError)
|
||||||
}
|
|
||||||
|
|
||||||
// Add tracing information with msg.
|
|
||||||
func (err *sdkError) Trace(msg string) Error {
|
|
||||||
return &sdkError{
|
|
||||||
codespace: err.codespace,
|
|
||||||
code: err.code,
|
|
||||||
err: err.err.Trace(msg),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Implements Error.
|
|
||||||
func (err *sdkError) WithDefaultCodespace(cs CodespaceType) Error {
|
|
||||||
codespace := err.codespace
|
|
||||||
if codespace == CodespaceUndefined {
|
|
||||||
codespace = cs
|
|
||||||
}
|
|
||||||
return &sdkError{
|
|
||||||
codespace: codespace,
|
|
||||||
code: err.code,
|
|
||||||
err: err.err,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (err *sdkError) T() interface{} {
|
|
||||||
return err.err.T()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (err *sdkError) Result() Result {
|
func (err *sdkError) Result() Result {
|
||||||
|
|
|
@ -27,28 +27,28 @@ func (msg MsgSend) ValidateBasic() sdk.Error {
|
||||||
// this just makes sure all the inputs and outputs are properly formatted,
|
// this just makes sure all the inputs and outputs are properly formatted,
|
||||||
// not that they actually have the money inside
|
// not that they actually have the money inside
|
||||||
if len(msg.Inputs) == 0 {
|
if len(msg.Inputs) == 0 {
|
||||||
return ErrNoInputs(DefaultCodespace).Trace("")
|
return ErrNoInputs(DefaultCodespace).TraceSDK("")
|
||||||
}
|
}
|
||||||
if len(msg.Outputs) == 0 {
|
if len(msg.Outputs) == 0 {
|
||||||
return ErrNoOutputs(DefaultCodespace).Trace("")
|
return ErrNoOutputs(DefaultCodespace).TraceSDK("")
|
||||||
}
|
}
|
||||||
// make sure all inputs and outputs are individually valid
|
// make sure all inputs and outputs are individually valid
|
||||||
var totalIn, totalOut sdk.Coins
|
var totalIn, totalOut sdk.Coins
|
||||||
for _, in := range msg.Inputs {
|
for _, in := range msg.Inputs {
|
||||||
if err := in.ValidateBasic(); err != nil {
|
if err := in.ValidateBasic(); err != nil {
|
||||||
return err.Trace("")
|
return err.TraceSDK("")
|
||||||
}
|
}
|
||||||
totalIn = totalIn.Plus(in.Coins)
|
totalIn = totalIn.Plus(in.Coins)
|
||||||
}
|
}
|
||||||
for _, out := range msg.Outputs {
|
for _, out := range msg.Outputs {
|
||||||
if err := out.ValidateBasic(); err != nil {
|
if err := out.ValidateBasic(); err != nil {
|
||||||
return err.Trace("")
|
return err.TraceSDK("")
|
||||||
}
|
}
|
||||||
totalOut = totalOut.Plus(out.Coins)
|
totalOut = totalOut.Plus(out.Coins)
|
||||||
}
|
}
|
||||||
// make sure inputs and outputs match
|
// make sure inputs and outputs match
|
||||||
if !totalIn.IsEqual(totalOut) {
|
if !totalIn.IsEqual(totalOut) {
|
||||||
return sdk.ErrInvalidCoins(totalIn.String()).Trace("inputs and outputs don't match")
|
return sdk.ErrInvalidCoins(totalIn.String()).TraceSDK("inputs and outputs don't match")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -107,11 +107,11 @@ func (msg MsgIssue) Type() string { return "bank" } // TODO: "bank/issue"
|
||||||
func (msg MsgIssue) ValidateBasic() sdk.Error {
|
func (msg MsgIssue) ValidateBasic() sdk.Error {
|
||||||
// XXX
|
// XXX
|
||||||
if len(msg.Outputs) == 0 {
|
if len(msg.Outputs) == 0 {
|
||||||
return ErrNoOutputs(DefaultCodespace).Trace("")
|
return ErrNoOutputs(DefaultCodespace).TraceSDK("")
|
||||||
}
|
}
|
||||||
for _, out := range msg.Outputs {
|
for _, out := range msg.Outputs {
|
||||||
if err := out.ValidateBasic(); err != nil {
|
if err := out.ValidateBasic(); err != nil {
|
||||||
return err.Trace("")
|
return err.TraceSDK("")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -65,7 +65,7 @@ func (p IBCPacket) GetSignBytes() []byte {
|
||||||
// validator the ibc packey
|
// validator the ibc packey
|
||||||
func (p IBCPacket) ValidateBasic() sdk.Error {
|
func (p IBCPacket) ValidateBasic() sdk.Error {
|
||||||
if p.SrcChain == p.DestChain {
|
if p.SrcChain == p.DestChain {
|
||||||
return ErrIdenticalChains(DefaultCodespace).Trace("")
|
return ErrIdenticalChains(DefaultCodespace).TraceSDK("")
|
||||||
}
|
}
|
||||||
if !p.Coins.IsValid() {
|
if !p.Coins.IsValid() {
|
||||||
return sdk.ErrInvalidCoins("")
|
return sdk.ErrInvalidCoins("")
|
||||||
|
|
Loading…
Reference in New Issue