[#474] morph/client: Add FaultException to error msg

If non-"HALT" `State` occurs after
calling `InvokeFunction` NeoGo client
method, add `FaultException` information
to returning error. Add returning state
check to `NotaryInvoke` method of the
morph/client.

Signed-off-by: Pavel Karpy <carpawell@nspcc.ru>
This commit is contained in:
Pavel Karpy 2021-04-09 23:10:59 +03:00 committed by Alex Vanin
parent f6f2e4d10f
commit 4a4aee82e0
2 changed files with 19 additions and 1 deletions

View file

@ -2,6 +2,7 @@ package client
import ( import (
"context" "context"
"fmt"
"time" "time"
"github.com/nspcc-dev/neo-go/pkg/core/native/noderoles" "github.com/nspcc-dev/neo-go/pkg/core/native/noderoles"
@ -48,6 +49,18 @@ var ErrNilClient = errors.New("client is nil")
// HaltState returned if TestInvoke function processed without panic. // HaltState returned if TestInvoke function processed without panic.
const HaltState = "HALT" const HaltState = "HALT"
type NotHaltStateError struct {
state, exception string
}
func (e *NotHaltStateError) Error() string {
return fmt.Sprintf(
"chain/client: contract execution finished with state %s; exception: %s",
e.state,
e.exception,
)
}
var errEmptyInvocationScript = errors.New("got empty invocation script from neo node") var errEmptyInvocationScript = errors.New("got empty invocation script from neo node")
var errScriptDecode = errors.New("could not decode invocation script from neo node") var errScriptDecode = errors.New("could not decode invocation script from neo node")
@ -132,7 +145,7 @@ func (c *Client) TestInvoke(contract util.Uint160, method string, args ...interf
} }
if val.State != HaltState { if val.State != HaltState {
return nil, errors.Errorf("chain/client: contract execution finished with state %s", val.State) return nil, &NotHaltStateError{state: val.State, exception: val.FaultException}
} }
return val.Stack, nil return val.Stack, nil

View file

@ -222,6 +222,11 @@ func (c *Client) notaryInvoke(committee bool, contract util.Uint160, method stri
return err return err
} }
// check invocation state
if test.State != HaltState {
return &NotHaltStateError{state: test.State, exception: test.FaultException}
}
// if test invocation failed, then return error // if test invocation failed, then return error
if len(test.Script) == 0 { if len(test.Script) == 0 {
return errEmptyInvocationScript return errEmptyInvocationScript