mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-11-30 09:33:36 +00:00
rpc: move all top*FromStack
client functions to a separate file
Some of them are shared between multiple RPC client APIs, so let's keep them in a separate place for better maintainability.
This commit is contained in:
parent
30e7d9a8b0
commit
347f7ed576
4 changed files with 77 additions and 70 deletions
77
pkg/rpc/client/helper.go
Normal file
77
pkg/rpc/client/helper.go
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
package client
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/elliptic"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/rpc/response/result"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
|
||||||
|
)
|
||||||
|
|
||||||
|
// getInvocationError returns an error in case of bad VM state or empty stack.
|
||||||
|
func getInvocationError(result *result.Invoke) error {
|
||||||
|
if result.State != "HALT" {
|
||||||
|
return fmt.Errorf("invocation failed: %s", result.FaultException)
|
||||||
|
}
|
||||||
|
if len(result.Stack) == 0 {
|
||||||
|
return errors.New("result stack is empty")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// topBoolFromStack returns the top boolean value from stack.
|
||||||
|
func topBoolFromStack(st []stackitem.Item) (bool, error) {
|
||||||
|
index := len(st) - 1 // top stack element is last in the array
|
||||||
|
result, ok := st[index].Value().(bool)
|
||||||
|
if !ok {
|
||||||
|
return false, fmt.Errorf("invalid stack item type: %s", st[index].Type())
|
||||||
|
}
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// topIntFromStack returns the top integer value from stack.
|
||||||
|
func topIntFromStack(st []stackitem.Item) (int64, error) {
|
||||||
|
index := len(st) - 1 // top stack element is last in the array
|
||||||
|
bi, err := st[index].TryInteger()
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return bi.Int64(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// topPublicKeysFromStack returns the top array of public keys from stack.
|
||||||
|
func topPublicKeysFromStack(st []stackitem.Item) (keys.PublicKeys, error) {
|
||||||
|
index := len(st) - 1 // top stack element is last in the array
|
||||||
|
var (
|
||||||
|
pks keys.PublicKeys
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
items, ok := st[index].Value().([]stackitem.Item)
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("invalid stack item type: %s", st[index].Type())
|
||||||
|
}
|
||||||
|
pks = make(keys.PublicKeys, len(items))
|
||||||
|
for i, item := range items {
|
||||||
|
val, ok := item.Value().([]byte)
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("invalid array element #%d: %s", i, item.Type())
|
||||||
|
}
|
||||||
|
pks[i], err = keys.NewPublicKeyFromBytes(val, elliptic.P256())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return pks, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// top string from stack returns the top string from stack.
|
||||||
|
func topStringFromStack(st []stackitem.Item) (string, error) {
|
||||||
|
index := len(st) - 1 // top stack element is last in the array
|
||||||
|
bs, err := st[index].TryBytes()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return string(bs), nil
|
||||||
|
}
|
|
@ -3,14 +3,12 @@ package client
|
||||||
// Various non-policy things from native contracts.
|
// Various non-policy things from native contracts.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/elliptic"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/native/nativenames"
|
"github.com/nspcc-dev/neo-go/pkg/core/native/nativenames"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/native/noderoles"
|
"github.com/nspcc-dev/neo-go/pkg/core/native/noderoles"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetOraclePrice invokes `getPrice` method on a native Oracle contract.
|
// GetOraclePrice invokes `getPrice` method on a native Oracle contract.
|
||||||
|
@ -65,28 +63,3 @@ func (c *Client) GetDesignatedByRole(role noderoles.Role, index uint32) (keys.Pu
|
||||||
}
|
}
|
||||||
return topPublicKeysFromStack(result.Stack)
|
return topPublicKeysFromStack(result.Stack)
|
||||||
}
|
}
|
||||||
|
|
||||||
// topPublicKeysFromStack returns the top array of public keys from stack.
|
|
||||||
func topPublicKeysFromStack(st []stackitem.Item) (keys.PublicKeys, error) {
|
|
||||||
index := len(st) - 1 // top stack element is last in the array
|
|
||||||
var (
|
|
||||||
pks keys.PublicKeys
|
|
||||||
err error
|
|
||||||
)
|
|
||||||
items, ok := st[index].Value().([]stackitem.Item)
|
|
||||||
if !ok {
|
|
||||||
return nil, fmt.Errorf("invalid stack item type: %s", st[index].Type())
|
|
||||||
}
|
|
||||||
pks = make(keys.PublicKeys, len(items))
|
|
||||||
for i, item := range items {
|
|
||||||
val, ok := item.Value().([]byte)
|
|
||||||
if !ok {
|
|
||||||
return nil, fmt.Errorf("invalid array element #%d: %s", i, item.Type())
|
|
||||||
}
|
|
||||||
pks[i], err = keys.NewPublicKeyFromBytes(val, elliptic.P256())
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return pks, nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,19 +1,16 @@
|
||||||
package client
|
package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
|
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/io"
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpc/response/result"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/callflag"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/callflag"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm/emit"
|
"github.com/nspcc-dev/neo-go/pkg/vm/emit"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm/opcode"
|
"github.com/nspcc-dev/neo-go/pkg/vm/opcode"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/wallet"
|
"github.com/nspcc-dev/neo-go/pkg/wallet"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -221,32 +218,3 @@ func (c *Client) MultiTransferNEP17(acc *wallet.Account, gas int64, recipients [
|
||||||
|
|
||||||
return c.SendRawTransaction(tx)
|
return c.SendRawTransaction(tx)
|
||||||
}
|
}
|
||||||
|
|
||||||
func topIntFromStack(st []stackitem.Item) (int64, error) {
|
|
||||||
index := len(st) - 1 // top stack element is last in the array
|
|
||||||
bi, err := st[index].TryInteger()
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return bi.Int64(), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func topStringFromStack(st []stackitem.Item) (string, error) {
|
|
||||||
index := len(st) - 1 // top stack element is last in the array
|
|
||||||
bs, err := st[index].TryBytes()
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return string(bs), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// getInvocationError returns an error in case of bad VM state or empty stack.
|
|
||||||
func getInvocationError(result *result.Invoke) error {
|
|
||||||
if result.State != "HALT" {
|
|
||||||
return fmt.Errorf("invocation failed: %s", result.FaultException)
|
|
||||||
}
|
|
||||||
if len(result.Stack) == 0 {
|
|
||||||
return errors.New("result stack is empty")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -6,7 +6,6 @@ import (
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/native/nativenames"
|
"github.com/nspcc-dev/neo-go/pkg/core/native/nativenames"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetFeePerByte invokes `getFeePerByte` method on a native Policy contract.
|
// GetFeePerByte invokes `getFeePerByte` method on a native Policy contract.
|
||||||
|
@ -80,13 +79,3 @@ func (c *Client) IsBlocked(hash util.Uint160) (bool, error) {
|
||||||
}
|
}
|
||||||
return topBoolFromStack(result.Stack)
|
return topBoolFromStack(result.Stack)
|
||||||
}
|
}
|
||||||
|
|
||||||
// topBoolFromStack returns the top boolean value from stack
|
|
||||||
func topBoolFromStack(st []stackitem.Item) (bool, error) {
|
|
||||||
index := len(st) - 1 // top stack element is last in the array
|
|
||||||
result, ok := st[index].Value().(bool)
|
|
||||||
if !ok {
|
|
||||||
return false, fmt.Errorf("invalid stack item type: %s", st[index].Type())
|
|
||||||
}
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue