tutus-chain/cli/smartcontract/rpcbindings/structs/rpcbindings/dynamic_hash/rpcbindings_test.go

2861 lines
76 KiB
Go

// Code generated by neo-go contract generate-rpcwrapper --manifest <file.json> --out <file.go> [--hash <hash>] [--config <config>]; DO NOT EDIT.
// Package structs contains RPC wrappers for Types contract.
package structs
import (
"crypto/elliptic"
"errors"
"fmt"
"github.com/tutus-one/tutus-chain/pkg/crypto/keys"
"github.com/tutus-one/tutus-chain/pkg/tutusrpc/result"
"github.com/tutus-one/tutus-chain/pkg/rpcclient/unwrap"
"github.com/tutus-one/tutus-chain/pkg/smartcontract"
"github.com/tutus-one/tutus-chain/pkg/util"
"github.com/tutus-one/tutus-chain/pkg/vm/stackitem"
"math/big"
"unicode/utf8"
)
// LedgerBlock is a contract-specific ledger.Block type used by its methods.
type LedgerBlock struct {
Hash util.Uint256
Version *big.Int
PrevHash util.Uint256
MerkleRoot util.Uint256
Timestamp *big.Int
Nonce *big.Int
Index *big.Int
PrimaryIndex *big.Int
NextConsensus util.Uint160
TransactionsLength *big.Int
}
// LedgerTransaction is a contract-specific ledger.Transaction type used by its methods.
type LedgerTransaction struct {
Hash util.Uint256
Version *big.Int
Nonce *big.Int
Sender util.Uint160
SysFee *big.Int
NetFee *big.Int
ValidUntilBlock *big.Int
Script []byte
}
// ManagementABI is a contract-specific management.ABI type used by its methods.
type ManagementABI struct {
Methods []*ManagementMethod
Events []*ManagementEvent
}
// ManagementContract is a contract-specific management.Contract type used by its methods.
type ManagementContract struct {
ID *big.Int
UpdateCounter *big.Int
Hash util.Uint160
NEF []byte
Manifest *ManagementManifest
}
// ManagementEvent is a contract-specific management.Event type used by its methods.
type ManagementEvent struct {
Name string
Params []*ManagementParameter
}
// ManagementGroup is a contract-specific management.Group type used by its methods.
type ManagementGroup struct {
PublicKey *keys.PublicKey
Signature []byte
}
// ManagementManifest is a contract-specific management.Manifest type used by its methods.
type ManagementManifest struct {
Name string
Groups []*ManagementGroup
Features map[string]string
SupportedStandards []string
ABI *ManagementABI
Permissions []*ManagementPermission
Trusts []util.Uint160
Extra any
}
// ManagementMethod is a contract-specific management.Method type used by its methods.
type ManagementMethod struct {
Name string
Params []*ManagementParameter
ReturnType *big.Int
Offset *big.Int
Safe bool
}
// ManagementParameter is a contract-specific management.Parameter type used by its methods.
type ManagementParameter struct {
Name string
Type *big.Int
}
// ManagementPermission is a contract-specific management.Permission type used by its methods.
type ManagementPermission struct {
Contract util.Uint160
Methods []string
}
// StructsInternal is a contract-specific structs.Internal type used by its methods.
type StructsInternal struct {
Bool bool
Int *big.Int
Bytes []byte
String string
H160 util.Uint160
H256 util.Uint256
PK *keys.PublicKey
PubKey *keys.PublicKey
Sign []byte
ArrOfBytes [][]byte
ArrOfH160 []util.Uint160
Map map[*big.Int]keys.PublicKeys
Struct *StructsInternal
UnexportedField *big.Int
}
// Invoker is used by ContractReader to call various safe methods.
type Invoker interface {
Call(contract util.Uint160, operation string, params ...any) (*result.Invoke, error)
}
// ContractReader implements safe contract methods.
type ContractReader struct {
invoker Invoker
hash util.Uint160
}
// NewReader creates an instance of ContractReader using provided contract hash and the given Invoker.
func NewReader(invoker Invoker, hash util.Uint160) *ContractReader {
return &ContractReader{invoker, hash}
}
// Block invokes `block` method of contract.
func (c *ContractReader) Block(b *LedgerBlock) (*LedgerBlock, error) {
return itemToLedgerBlock(unwrap.Item(c.invoker.Call(c.hash, "block", b)))
}
// Contract invokes `contract` method of contract.
func (c *ContractReader) Contract(mc *ManagementContract) (*ManagementContract, error) {
return itemToManagementContract(unwrap.Item(c.invoker.Call(c.hash, "contract", mc)))
}
// Struct invokes `struct` method of contract.
func (c *ContractReader) Struct(s *StructsInternal) (*StructsInternal, error) {
return itemToStructsInternal(unwrap.Item(c.invoker.Call(c.hash, "struct", s)))
}
// Transaction invokes `transaction` method of contract.
func (c *ContractReader) Transaction(t *LedgerTransaction) (*LedgerTransaction, error) {
return itemToLedgerTransaction(unwrap.Item(c.invoker.Call(c.hash, "transaction", t)))
}
// itemToLedgerBlock converts stack item into *LedgerBlock.
// NULL item is returned as nil pointer without error.
func itemToLedgerBlock(item stackitem.Item, err error) (*LedgerBlock, error) {
if err != nil {
return nil, err
}
_, null := item.(stackitem.Null)
if null {
return nil, nil
}
var res = new(LedgerBlock)
err = res.FromStackItem(item)
return res, err
}
// Ensure *LedgerBlock is a proper [stackitem.Convertible].
var _ = stackitem.Convertible(&LedgerBlock{})
// Ensure *LedgerBlock is a proper [smartcontract.Convertible].
var _ = smartcontract.Convertible(&LedgerBlock{})
// FromStackItem retrieves fields of LedgerBlock from the given
// [stackitem.Item] or returns an error if it's not possible to do to so.
// It implements [stackitem.Convertible] interface.
func (res *LedgerBlock) FromStackItem(item stackitem.Item) error {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return errors.New("not an array")
}
if len(arr) != 10 {
return errors.New("wrong number of structure elements")
}
var (
index = -1
err error
)
index++
res.Hash, err = func(item stackitem.Item) (util.Uint256, error) {
b, err := item.TryBytes()
if err != nil {
return util.Uint256{}, err
}
u, err := util.Uint256DecodeBytesBE(b)
if err != nil {
return util.Uint256{}, err
}
return u, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field Hash: %w", err)
}
index++
res.Version, err = arr[index].TryInteger()
if err != nil {
return fmt.Errorf("field Version: %w", err)
}
index++
res.PrevHash, err = func(item stackitem.Item) (util.Uint256, error) {
b, err := item.TryBytes()
if err != nil {
return util.Uint256{}, err
}
u, err := util.Uint256DecodeBytesBE(b)
if err != nil {
return util.Uint256{}, err
}
return u, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field PrevHash: %w", err)
}
index++
res.MerkleRoot, err = func(item stackitem.Item) (util.Uint256, error) {
b, err := item.TryBytes()
if err != nil {
return util.Uint256{}, err
}
u, err := util.Uint256DecodeBytesBE(b)
if err != nil {
return util.Uint256{}, err
}
return u, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field MerkleRoot: %w", err)
}
index++
res.Timestamp, err = arr[index].TryInteger()
if err != nil {
return fmt.Errorf("field Timestamp: %w", err)
}
index++
res.Nonce, err = arr[index].TryInteger()
if err != nil {
return fmt.Errorf("field Nonce: %w", err)
}
index++
res.Index, err = arr[index].TryInteger()
if err != nil {
return fmt.Errorf("field Index: %w", err)
}
index++
res.PrimaryIndex, err = arr[index].TryInteger()
if err != nil {
return fmt.Errorf("field PrimaryIndex: %w", err)
}
index++
res.NextConsensus, err = func(item stackitem.Item) (util.Uint160, error) {
b, err := item.TryBytes()
if err != nil {
return util.Uint160{}, err
}
u, err := util.Uint160DecodeBytesBE(b)
if err != nil {
return util.Uint160{}, err
}
return u, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field NextConsensus: %w", err)
}
index++
res.TransactionsLength, err = arr[index].TryInteger()
if err != nil {
return fmt.Errorf("field TransactionsLength: %w", err)
}
return nil
}
// ToStackItem creates [stackitem.Item] representing LedgerBlock.
// It implements [stackitem.Convertible] interface.
func (res *LedgerBlock) ToStackItem() (stackitem.Item, error) {
if res == nil {
return stackitem.Null{}, nil
}
var (
err error
itm stackitem.Item
items = make([]stackitem.Item, 0, 10)
)
itm, err = stackitem.NewByteArray(res.Hash.BytesBE()), error(nil)
if err != nil {
return nil, fmt.Errorf("field Hash: %w", err)
}
items = append(items, itm)
itm, err = (*stackitem.BigInteger)(res.Version), error(nil)
if err != nil {
return nil, fmt.Errorf("field Version: %w", err)
}
items = append(items, itm)
itm, err = stackitem.NewByteArray(res.PrevHash.BytesBE()), error(nil)
if err != nil {
return nil, fmt.Errorf("field PrevHash: %w", err)
}
items = append(items, itm)
itm, err = stackitem.NewByteArray(res.MerkleRoot.BytesBE()), error(nil)
if err != nil {
return nil, fmt.Errorf("field MerkleRoot: %w", err)
}
items = append(items, itm)
itm, err = (*stackitem.BigInteger)(res.Timestamp), error(nil)
if err != nil {
return nil, fmt.Errorf("field Timestamp: %w", err)
}
items = append(items, itm)
itm, err = (*stackitem.BigInteger)(res.Nonce), error(nil)
if err != nil {
return nil, fmt.Errorf("field Nonce: %w", err)
}
items = append(items, itm)
itm, err = (*stackitem.BigInteger)(res.Index), error(nil)
if err != nil {
return nil, fmt.Errorf("field Index: %w", err)
}
items = append(items, itm)
itm, err = (*stackitem.BigInteger)(res.PrimaryIndex), error(nil)
if err != nil {
return nil, fmt.Errorf("field PrimaryIndex: %w", err)
}
items = append(items, itm)
itm, err = stackitem.NewByteArray(res.NextConsensus.BytesBE()), error(nil)
if err != nil {
return nil, fmt.Errorf("field NextConsensus: %w", err)
}
items = append(items, itm)
itm, err = (*stackitem.BigInteger)(res.TransactionsLength), error(nil)
if err != nil {
return nil, fmt.Errorf("field TransactionsLength: %w", err)
}
items = append(items, itm)
return stackitem.NewStruct(items), nil
}
// ToSCParameter creates [smartcontract.Parameter] representing LedgerBlock.
// It implements [smartcontract.Convertible] interface so that LedgerBlock
// could be used with invokers.
func (res *LedgerBlock) ToSCParameter() (smartcontract.Parameter, error) {
if res == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var (
err error
prm smartcontract.Parameter
prms = make([]smartcontract.Parameter, 0, 10)
)
prm, err = smartcontract.NewParameterFromValue(res.Hash)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Hash: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.Version)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Version: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.PrevHash)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field PrevHash: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.MerkleRoot)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field MerkleRoot: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.Timestamp)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Timestamp: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.Nonce)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Nonce: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.Index)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Index: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.PrimaryIndex)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field PrimaryIndex: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.NextConsensus)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field NextConsensus: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.TransactionsLength)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field TransactionsLength: %w", err)
}
prms = append(prms, prm)
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}
// itemToLedgerTransaction converts stack item into *LedgerTransaction.
// NULL item is returned as nil pointer without error.
func itemToLedgerTransaction(item stackitem.Item, err error) (*LedgerTransaction, error) {
if err != nil {
return nil, err
}
_, null := item.(stackitem.Null)
if null {
return nil, nil
}
var res = new(LedgerTransaction)
err = res.FromStackItem(item)
return res, err
}
// Ensure *LedgerTransaction is a proper [stackitem.Convertible].
var _ = stackitem.Convertible(&LedgerTransaction{})
// Ensure *LedgerTransaction is a proper [smartcontract.Convertible].
var _ = smartcontract.Convertible(&LedgerTransaction{})
// FromStackItem retrieves fields of LedgerTransaction from the given
// [stackitem.Item] or returns an error if it's not possible to do to so.
// It implements [stackitem.Convertible] interface.
func (res *LedgerTransaction) FromStackItem(item stackitem.Item) error {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return errors.New("not an array")
}
if len(arr) != 8 {
return errors.New("wrong number of structure elements")
}
var (
index = -1
err error
)
index++
res.Hash, err = func(item stackitem.Item) (util.Uint256, error) {
b, err := item.TryBytes()
if err != nil {
return util.Uint256{}, err
}
u, err := util.Uint256DecodeBytesBE(b)
if err != nil {
return util.Uint256{}, err
}
return u, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field Hash: %w", err)
}
index++
res.Version, err = arr[index].TryInteger()
if err != nil {
return fmt.Errorf("field Version: %w", err)
}
index++
res.Nonce, err = arr[index].TryInteger()
if err != nil {
return fmt.Errorf("field Nonce: %w", err)
}
index++
res.Sender, err = func(item stackitem.Item) (util.Uint160, error) {
b, err := item.TryBytes()
if err != nil {
return util.Uint160{}, err
}
u, err := util.Uint160DecodeBytesBE(b)
if err != nil {
return util.Uint160{}, err
}
return u, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field Sender: %w", err)
}
index++
res.SysFee, err = arr[index].TryInteger()
if err != nil {
return fmt.Errorf("field SysFee: %w", err)
}
index++
res.NetFee, err = arr[index].TryInteger()
if err != nil {
return fmt.Errorf("field NetFee: %w", err)
}
index++
res.ValidUntilBlock, err = arr[index].TryInteger()
if err != nil {
return fmt.Errorf("field ValidUntilBlock: %w", err)
}
index++
res.Script, err = arr[index].TryBytes()
if err != nil {
return fmt.Errorf("field Script: %w", err)
}
return nil
}
// ToStackItem creates [stackitem.Item] representing LedgerTransaction.
// It implements [stackitem.Convertible] interface.
func (res *LedgerTransaction) ToStackItem() (stackitem.Item, error) {
if res == nil {
return stackitem.Null{}, nil
}
var (
err error
itm stackitem.Item
items = make([]stackitem.Item, 0, 8)
)
itm, err = stackitem.NewByteArray(res.Hash.BytesBE()), error(nil)
if err != nil {
return nil, fmt.Errorf("field Hash: %w", err)
}
items = append(items, itm)
itm, err = (*stackitem.BigInteger)(res.Version), error(nil)
if err != nil {
return nil, fmt.Errorf("field Version: %w", err)
}
items = append(items, itm)
itm, err = (*stackitem.BigInteger)(res.Nonce), error(nil)
if err != nil {
return nil, fmt.Errorf("field Nonce: %w", err)
}
items = append(items, itm)
itm, err = stackitem.NewByteArray(res.Sender.BytesBE()), error(nil)
if err != nil {
return nil, fmt.Errorf("field Sender: %w", err)
}
items = append(items, itm)
itm, err = (*stackitem.BigInteger)(res.SysFee), error(nil)
if err != nil {
return nil, fmt.Errorf("field SysFee: %w", err)
}
items = append(items, itm)
itm, err = (*stackitem.BigInteger)(res.NetFee), error(nil)
if err != nil {
return nil, fmt.Errorf("field NetFee: %w", err)
}
items = append(items, itm)
itm, err = (*stackitem.BigInteger)(res.ValidUntilBlock), error(nil)
if err != nil {
return nil, fmt.Errorf("field ValidUntilBlock: %w", err)
}
items = append(items, itm)
itm, err = stackitem.NewByteArray(res.Script), error(nil)
if err != nil {
return nil, fmt.Errorf("field Script: %w", err)
}
items = append(items, itm)
return stackitem.NewStruct(items), nil
}
// ToSCParameter creates [smartcontract.Parameter] representing LedgerTransaction.
// It implements [smartcontract.Convertible] interface so that LedgerTransaction
// could be used with invokers.
func (res *LedgerTransaction) ToSCParameter() (smartcontract.Parameter, error) {
if res == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var (
err error
prm smartcontract.Parameter
prms = make([]smartcontract.Parameter, 0, 8)
)
prm, err = smartcontract.NewParameterFromValue(res.Hash)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Hash: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.Version)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Version: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.Nonce)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Nonce: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.Sender)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Sender: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.SysFee)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field SysFee: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.NetFee)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field NetFee: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.ValidUntilBlock)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field ValidUntilBlock: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.Script)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Script: %w", err)
}
prms = append(prms, prm)
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}
// itemToManagementABI converts stack item into *ManagementABI.
// NULL item is returned as nil pointer without error.
func itemToManagementABI(item stackitem.Item, err error) (*ManagementABI, error) {
if err != nil {
return nil, err
}
_, null := item.(stackitem.Null)
if null {
return nil, nil
}
var res = new(ManagementABI)
err = res.FromStackItem(item)
return res, err
}
// Ensure *ManagementABI is a proper [stackitem.Convertible].
var _ = stackitem.Convertible(&ManagementABI{})
// Ensure *ManagementABI is a proper [smartcontract.Convertible].
var _ = smartcontract.Convertible(&ManagementABI{})
// FromStackItem retrieves fields of ManagementABI from the given
// [stackitem.Item] or returns an error if it's not possible to do to so.
// It implements [stackitem.Convertible] interface.
func (res *ManagementABI) FromStackItem(item stackitem.Item) error {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return errors.New("not an array")
}
if len(arr) != 2 {
return errors.New("wrong number of structure elements")
}
var (
index = -1
err error
)
index++
res.Methods, err = func(item stackitem.Item) ([]*ManagementMethod, error) {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return nil, errors.New("not an array")
}
res := make([]*ManagementMethod, len(arr))
for i := range res {
res[i], err = itemToManagementMethod(arr[i], nil)
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
}
return res, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field Methods: %w", err)
}
index++
res.Events, err = func(item stackitem.Item) ([]*ManagementEvent, error) {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return nil, errors.New("not an array")
}
res := make([]*ManagementEvent, len(arr))
for i := range res {
res[i], err = itemToManagementEvent(arr[i], nil)
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
}
return res, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field Events: %w", err)
}
return nil
}
// ToStackItem creates [stackitem.Item] representing ManagementABI.
// It implements [stackitem.Convertible] interface.
func (res *ManagementABI) ToStackItem() (stackitem.Item, error) {
if res == nil {
return stackitem.Null{}, nil
}
var (
err error
itm stackitem.Item
items = make([]stackitem.Item, 0, 2)
)
itm, err = func(in []*ManagementMethod) (stackitem.Item, error) {
if in == nil {
return stackitem.Null{}, nil
}
var items = make([]stackitem.Item, 0, len(in))
for i, v := range in {
itm, err := v.ToStackItem()
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
items = append(items, itm)
}
return stackitem.NewArray(items), nil
}(res.Methods)
if err != nil {
return nil, fmt.Errorf("field Methods: %w", err)
}
items = append(items, itm)
itm, err = func(in []*ManagementEvent) (stackitem.Item, error) {
if in == nil {
return stackitem.Null{}, nil
}
var items = make([]stackitem.Item, 0, len(in))
for i, v := range in {
itm, err := v.ToStackItem()
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
items = append(items, itm)
}
return stackitem.NewArray(items), nil
}(res.Events)
if err != nil {
return nil, fmt.Errorf("field Events: %w", err)
}
items = append(items, itm)
return stackitem.NewStruct(items), nil
}
// ToSCParameter creates [smartcontract.Parameter] representing ManagementABI.
// It implements [smartcontract.Convertible] interface so that ManagementABI
// could be used with invokers.
func (res *ManagementABI) ToSCParameter() (smartcontract.Parameter, error) {
if res == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var (
err error
prm smartcontract.Parameter
prms = make([]smartcontract.Parameter, 0, 2)
)
prm, err = func(in []*ManagementMethod) (smartcontract.Parameter, error) {
if in == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var prms = make([]smartcontract.Parameter, 0, len(in))
for i, v := range in {
prm, err := v.ToSCParameter()
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("item %d: %w", i, err)
}
prms = append(prms, prm)
}
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}(res.Methods)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Methods: %w", err)
}
prms = append(prms, prm)
prm, err = func(in []*ManagementEvent) (smartcontract.Parameter, error) {
if in == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var prms = make([]smartcontract.Parameter, 0, len(in))
for i, v := range in {
prm, err := v.ToSCParameter()
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("item %d: %w", i, err)
}
prms = append(prms, prm)
}
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}(res.Events)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Events: %w", err)
}
prms = append(prms, prm)
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}
// itemToManagementContract converts stack item into *ManagementContract.
// NULL item is returned as nil pointer without error.
func itemToManagementContract(item stackitem.Item, err error) (*ManagementContract, error) {
if err != nil {
return nil, err
}
_, null := item.(stackitem.Null)
if null {
return nil, nil
}
var res = new(ManagementContract)
err = res.FromStackItem(item)
return res, err
}
// Ensure *ManagementContract is a proper [stackitem.Convertible].
var _ = stackitem.Convertible(&ManagementContract{})
// Ensure *ManagementContract is a proper [smartcontract.Convertible].
var _ = smartcontract.Convertible(&ManagementContract{})
// FromStackItem retrieves fields of ManagementContract from the given
// [stackitem.Item] or returns an error if it's not possible to do to so.
// It implements [stackitem.Convertible] interface.
func (res *ManagementContract) FromStackItem(item stackitem.Item) error {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return errors.New("not an array")
}
if len(arr) != 5 {
return errors.New("wrong number of structure elements")
}
var (
index = -1
err error
)
index++
res.ID, err = arr[index].TryInteger()
if err != nil {
return fmt.Errorf("field ID: %w", err)
}
index++
res.UpdateCounter, err = arr[index].TryInteger()
if err != nil {
return fmt.Errorf("field UpdateCounter: %w", err)
}
index++
res.Hash, err = func(item stackitem.Item) (util.Uint160, error) {
b, err := item.TryBytes()
if err != nil {
return util.Uint160{}, err
}
u, err := util.Uint160DecodeBytesBE(b)
if err != nil {
return util.Uint160{}, err
}
return u, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field Hash: %w", err)
}
index++
res.NEF, err = arr[index].TryBytes()
if err != nil {
return fmt.Errorf("field NEF: %w", err)
}
index++
res.Manifest, err = itemToManagementManifest(arr[index], nil)
if err != nil {
return fmt.Errorf("field Manifest: %w", err)
}
return nil
}
// ToStackItem creates [stackitem.Item] representing ManagementContract.
// It implements [stackitem.Convertible] interface.
func (res *ManagementContract) ToStackItem() (stackitem.Item, error) {
if res == nil {
return stackitem.Null{}, nil
}
var (
err error
itm stackitem.Item
items = make([]stackitem.Item, 0, 5)
)
itm, err = (*stackitem.BigInteger)(res.ID), error(nil)
if err != nil {
return nil, fmt.Errorf("field ID: %w", err)
}
items = append(items, itm)
itm, err = (*stackitem.BigInteger)(res.UpdateCounter), error(nil)
if err != nil {
return nil, fmt.Errorf("field UpdateCounter: %w", err)
}
items = append(items, itm)
itm, err = stackitem.NewByteArray(res.Hash.BytesBE()), error(nil)
if err != nil {
return nil, fmt.Errorf("field Hash: %w", err)
}
items = append(items, itm)
itm, err = stackitem.NewByteArray(res.NEF), error(nil)
if err != nil {
return nil, fmt.Errorf("field NEF: %w", err)
}
items = append(items, itm)
itm, err = res.Manifest.ToStackItem()
if err != nil {
return nil, fmt.Errorf("field Manifest: %w", err)
}
items = append(items, itm)
return stackitem.NewStruct(items), nil
}
// ToSCParameter creates [smartcontract.Parameter] representing ManagementContract.
// It implements [smartcontract.Convertible] interface so that ManagementContract
// could be used with invokers.
func (res *ManagementContract) ToSCParameter() (smartcontract.Parameter, error) {
if res == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var (
err error
prm smartcontract.Parameter
prms = make([]smartcontract.Parameter, 0, 5)
)
prm, err = smartcontract.NewParameterFromValue(res.ID)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field ID: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.UpdateCounter)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field UpdateCounter: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.Hash)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Hash: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.NEF)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field NEF: %w", err)
}
prms = append(prms, prm)
prm, err = res.Manifest.ToSCParameter()
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Manifest: %w", err)
}
prms = append(prms, prm)
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}
// itemToManagementEvent converts stack item into *ManagementEvent.
// NULL item is returned as nil pointer without error.
func itemToManagementEvent(item stackitem.Item, err error) (*ManagementEvent, error) {
if err != nil {
return nil, err
}
_, null := item.(stackitem.Null)
if null {
return nil, nil
}
var res = new(ManagementEvent)
err = res.FromStackItem(item)
return res, err
}
// Ensure *ManagementEvent is a proper [stackitem.Convertible].
var _ = stackitem.Convertible(&ManagementEvent{})
// Ensure *ManagementEvent is a proper [smartcontract.Convertible].
var _ = smartcontract.Convertible(&ManagementEvent{})
// FromStackItem retrieves fields of ManagementEvent from the given
// [stackitem.Item] or returns an error if it's not possible to do to so.
// It implements [stackitem.Convertible] interface.
func (res *ManagementEvent) FromStackItem(item stackitem.Item) error {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return errors.New("not an array")
}
if len(arr) != 2 {
return errors.New("wrong number of structure elements")
}
var (
index = -1
err error
)
index++
res.Name, err = func(item stackitem.Item) (string, error) {
b, err := item.TryBytes()
if err != nil {
return "", err
}
if !utf8.Valid(b) {
return "", errors.New("not a UTF-8 string")
}
return string(b), nil
}(arr[index])
if err != nil {
return fmt.Errorf("field Name: %w", err)
}
index++
res.Params, err = func(item stackitem.Item) ([]*ManagementParameter, error) {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return nil, errors.New("not an array")
}
res := make([]*ManagementParameter, len(arr))
for i := range res {
res[i], err = itemToManagementParameter(arr[i], nil)
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
}
return res, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field Params: %w", err)
}
return nil
}
// ToStackItem creates [stackitem.Item] representing ManagementEvent.
// It implements [stackitem.Convertible] interface.
func (res *ManagementEvent) ToStackItem() (stackitem.Item, error) {
if res == nil {
return stackitem.Null{}, nil
}
var (
err error
itm stackitem.Item
items = make([]stackitem.Item, 0, 2)
)
itm, err = stackitem.NewByteArray([]byte(res.Name)), error(nil)
if err != nil {
return nil, fmt.Errorf("field Name: %w", err)
}
items = append(items, itm)
itm, err = func(in []*ManagementParameter) (stackitem.Item, error) {
if in == nil {
return stackitem.Null{}, nil
}
var items = make([]stackitem.Item, 0, len(in))
for i, v := range in {
itm, err := v.ToStackItem()
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
items = append(items, itm)
}
return stackitem.NewArray(items), nil
}(res.Params)
if err != nil {
return nil, fmt.Errorf("field Params: %w", err)
}
items = append(items, itm)
return stackitem.NewStruct(items), nil
}
// ToSCParameter creates [smartcontract.Parameter] representing ManagementEvent.
// It implements [smartcontract.Convertible] interface so that ManagementEvent
// could be used with invokers.
func (res *ManagementEvent) ToSCParameter() (smartcontract.Parameter, error) {
if res == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var (
err error
prm smartcontract.Parameter
prms = make([]smartcontract.Parameter, 0, 2)
)
prm, err = smartcontract.NewParameterFromValue(res.Name)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Name: %w", err)
}
prms = append(prms, prm)
prm, err = func(in []*ManagementParameter) (smartcontract.Parameter, error) {
if in == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var prms = make([]smartcontract.Parameter, 0, len(in))
for i, v := range in {
prm, err := v.ToSCParameter()
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("item %d: %w", i, err)
}
prms = append(prms, prm)
}
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}(res.Params)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Params: %w", err)
}
prms = append(prms, prm)
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}
// itemToManagementGroup converts stack item into *ManagementGroup.
// NULL item is returned as nil pointer without error.
func itemToManagementGroup(item stackitem.Item, err error) (*ManagementGroup, error) {
if err != nil {
return nil, err
}
_, null := item.(stackitem.Null)
if null {
return nil, nil
}
var res = new(ManagementGroup)
err = res.FromStackItem(item)
return res, err
}
// Ensure *ManagementGroup is a proper [stackitem.Convertible].
var _ = stackitem.Convertible(&ManagementGroup{})
// Ensure *ManagementGroup is a proper [smartcontract.Convertible].
var _ = smartcontract.Convertible(&ManagementGroup{})
// FromStackItem retrieves fields of ManagementGroup from the given
// [stackitem.Item] or returns an error if it's not possible to do to so.
// It implements [stackitem.Convertible] interface.
func (res *ManagementGroup) FromStackItem(item stackitem.Item) error {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return errors.New("not an array")
}
if len(arr) != 2 {
return errors.New("wrong number of structure elements")
}
var (
index = -1
err error
)
index++
res.PublicKey, err = func(item stackitem.Item) (*keys.PublicKey, error) {
b, err := item.TryBytes()
if err != nil {
return nil, err
}
k, err := keys.NewPublicKeyFromBytes(b, elliptic.P256())
if err != nil {
return nil, err
}
return k, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field PublicKey: %w", err)
}
index++
res.Signature, err = arr[index].TryBytes()
if err != nil {
return fmt.Errorf("field Signature: %w", err)
}
return nil
}
// ToStackItem creates [stackitem.Item] representing ManagementGroup.
// It implements [stackitem.Convertible] interface.
func (res *ManagementGroup) ToStackItem() (stackitem.Item, error) {
if res == nil {
return stackitem.Null{}, nil
}
var (
err error
itm stackitem.Item
items = make([]stackitem.Item, 0, 2)
)
itm, err = stackitem.NewByteArray(res.PublicKey.Bytes()), error(nil)
if err != nil {
return nil, fmt.Errorf("field PublicKey: %w", err)
}
items = append(items, itm)
itm, err = stackitem.NewByteArray(res.Signature), error(nil)
if err != nil {
return nil, fmt.Errorf("field Signature: %w", err)
}
items = append(items, itm)
return stackitem.NewStruct(items), nil
}
// ToSCParameter creates [smartcontract.Parameter] representing ManagementGroup.
// It implements [smartcontract.Convertible] interface so that ManagementGroup
// could be used with invokers.
func (res *ManagementGroup) ToSCParameter() (smartcontract.Parameter, error) {
if res == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var (
err error
prm smartcontract.Parameter
prms = make([]smartcontract.Parameter, 0, 2)
)
prm, err = smartcontract.NewParameterFromValue(res.PublicKey)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field PublicKey: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.Signature)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Signature: %w", err)
}
prms = append(prms, prm)
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}
// itemToManagementManifest converts stack item into *ManagementManifest.
// NULL item is returned as nil pointer without error.
func itemToManagementManifest(item stackitem.Item, err error) (*ManagementManifest, error) {
if err != nil {
return nil, err
}
_, null := item.(stackitem.Null)
if null {
return nil, nil
}
var res = new(ManagementManifest)
err = res.FromStackItem(item)
return res, err
}
// Ensure *ManagementManifest is a proper [stackitem.Convertible].
var _ = stackitem.Convertible(&ManagementManifest{})
// Ensure *ManagementManifest is a proper [smartcontract.Convertible].
var _ = smartcontract.Convertible(&ManagementManifest{})
// FromStackItem retrieves fields of ManagementManifest from the given
// [stackitem.Item] or returns an error if it's not possible to do to so.
// It implements [stackitem.Convertible] interface.
func (res *ManagementManifest) FromStackItem(item stackitem.Item) error {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return errors.New("not an array")
}
if len(arr) != 8 {
return errors.New("wrong number of structure elements")
}
var (
index = -1
err error
)
index++
res.Name, err = func(item stackitem.Item) (string, error) {
b, err := item.TryBytes()
if err != nil {
return "", err
}
if !utf8.Valid(b) {
return "", errors.New("not a UTF-8 string")
}
return string(b), nil
}(arr[index])
if err != nil {
return fmt.Errorf("field Name: %w", err)
}
index++
res.Groups, err = func(item stackitem.Item) ([]*ManagementGroup, error) {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return nil, errors.New("not an array")
}
res := make([]*ManagementGroup, len(arr))
for i := range res {
res[i], err = itemToManagementGroup(arr[i], nil)
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
}
return res, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field Groups: %w", err)
}
index++
res.Features, err = func(item stackitem.Item) (map[string]string, error) {
m, ok := item.Value().([]stackitem.MapElement)
if !ok {
return nil, fmt.Errorf("%s is not a map", item.Type().String())
}
res := make(map[string]string)
for i := range m {
k, err := func(item stackitem.Item) (string, error) {
b, err := item.TryBytes()
if err != nil {
return "", err
}
if !utf8.Valid(b) {
return "", errors.New("not a UTF-8 string")
}
return string(b), nil
}(m[i].Key)
if err != nil {
return nil, fmt.Errorf("key %d: %w", i, err)
}
v, err := func(item stackitem.Item) (string, error) {
b, err := item.TryBytes()
if err != nil {
return "", err
}
if !utf8.Valid(b) {
return "", errors.New("not a UTF-8 string")
}
return string(b), nil
}(m[i].Value)
if err != nil {
return nil, fmt.Errorf("value %d: %w", i, err)
}
res[k] = v
}
return res, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field Features: %w", err)
}
index++
res.SupportedStandards, err = func(item stackitem.Item) ([]string, error) {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return nil, errors.New("not an array")
}
res := make([]string, len(arr))
for i := range res {
res[i], err = func(item stackitem.Item) (string, error) {
b, err := item.TryBytes()
if err != nil {
return "", err
}
if !utf8.Valid(b) {
return "", errors.New("not a UTF-8 string")
}
return string(b), nil
}(arr[i])
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
}
return res, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field SupportedStandards: %w", err)
}
index++
res.ABI, err = itemToManagementABI(arr[index], nil)
if err != nil {
return fmt.Errorf("field ABI: %w", err)
}
index++
res.Permissions, err = func(item stackitem.Item) ([]*ManagementPermission, error) {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return nil, errors.New("not an array")
}
res := make([]*ManagementPermission, len(arr))
for i := range res {
res[i], err = itemToManagementPermission(arr[i], nil)
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
}
return res, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field Permissions: %w", err)
}
index++
res.Trusts, err = func(item stackitem.Item) ([]util.Uint160, error) {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return nil, errors.New("not an array")
}
res := make([]util.Uint160, len(arr))
for i := range res {
res[i], err = func(item stackitem.Item) (util.Uint160, error) {
b, err := item.TryBytes()
if err != nil {
return util.Uint160{}, err
}
u, err := util.Uint160DecodeBytesBE(b)
if err != nil {
return util.Uint160{}, err
}
return u, nil
}(arr[i])
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
}
return res, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field Trusts: %w", err)
}
index++
res.Extra, err = arr[index].Value(), error(nil)
if err != nil {
return fmt.Errorf("field Extra: %w", err)
}
return nil
}
// ToStackItem creates [stackitem.Item] representing ManagementManifest.
// It implements [stackitem.Convertible] interface.
func (res *ManagementManifest) ToStackItem() (stackitem.Item, error) {
if res == nil {
return stackitem.Null{}, nil
}
var (
err error
itm stackitem.Item
items = make([]stackitem.Item, 0, 8)
)
itm, err = stackitem.NewByteArray([]byte(res.Name)), error(nil)
if err != nil {
return nil, fmt.Errorf("field Name: %w", err)
}
items = append(items, itm)
itm, err = func(in []*ManagementGroup) (stackitem.Item, error) {
if in == nil {
return stackitem.Null{}, nil
}
var items = make([]stackitem.Item, 0, len(in))
for i, v := range in {
itm, err := v.ToStackItem()
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
items = append(items, itm)
}
return stackitem.NewArray(items), nil
}(res.Groups)
if err != nil {
return nil, fmt.Errorf("field Groups: %w", err)
}
items = append(items, itm)
itm, err = func(in map[string]string) (stackitem.Item, error) {
if in == nil {
return stackitem.Null{}, nil
}
var m = stackitem.NewMap()
for k, v := range in {
iKey, err := stackitem.NewByteArray([]byte(k)), error(nil)
if err != nil {
return nil, fmt.Errorf("key %v: %w", k, err)
}
iVal, err := stackitem.NewByteArray([]byte(v)), error(nil)
if err != nil {
return nil, fmt.Errorf("key %v, wrong value: %w", k, err)
}
m.Add(iKey, iVal)
}
return m, nil
}(res.Features)
if err != nil {
return nil, fmt.Errorf("field Features: %w", err)
}
items = append(items, itm)
itm, err = func(in []string) (stackitem.Item, error) {
if in == nil {
return stackitem.Null{}, nil
}
var items = make([]stackitem.Item, 0, len(in))
for i, v := range in {
itm, err := stackitem.NewByteArray([]byte(v)), error(nil)
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
items = append(items, itm)
}
return stackitem.NewArray(items), nil
}(res.SupportedStandards)
if err != nil {
return nil, fmt.Errorf("field SupportedStandards: %w", err)
}
items = append(items, itm)
itm, err = res.ABI.ToStackItem()
if err != nil {
return nil, fmt.Errorf("field ABI: %w", err)
}
items = append(items, itm)
itm, err = func(in []*ManagementPermission) (stackitem.Item, error) {
if in == nil {
return stackitem.Null{}, nil
}
var items = make([]stackitem.Item, 0, len(in))
for i, v := range in {
itm, err := v.ToStackItem()
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
items = append(items, itm)
}
return stackitem.NewArray(items), nil
}(res.Permissions)
if err != nil {
return nil, fmt.Errorf("field Permissions: %w", err)
}
items = append(items, itm)
itm, err = func(in []util.Uint160) (stackitem.Item, error) {
if in == nil {
return stackitem.Null{}, nil
}
var items = make([]stackitem.Item, 0, len(in))
for i, v := range in {
itm, err := stackitem.NewByteArray(v.BytesBE()), error(nil)
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
items = append(items, itm)
}
return stackitem.NewArray(items), nil
}(res.Trusts)
if err != nil {
return nil, fmt.Errorf("field Trusts: %w", err)
}
items = append(items, itm)
itm, err = stackitem.TryMake(res.Extra)
if err != nil {
return nil, fmt.Errorf("field Extra: %w", err)
}
items = append(items, itm)
return stackitem.NewStruct(items), nil
}
// ToSCParameter creates [smartcontract.Parameter] representing ManagementManifest.
// It implements [smartcontract.Convertible] interface so that ManagementManifest
// could be used with invokers.
func (res *ManagementManifest) ToSCParameter() (smartcontract.Parameter, error) {
if res == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var (
err error
prm smartcontract.Parameter
prms = make([]smartcontract.Parameter, 0, 8)
)
prm, err = smartcontract.NewParameterFromValue(res.Name)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Name: %w", err)
}
prms = append(prms, prm)
prm, err = func(in []*ManagementGroup) (smartcontract.Parameter, error) {
if in == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var prms = make([]smartcontract.Parameter, 0, len(in))
for i, v := range in {
prm, err := v.ToSCParameter()
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("item %d: %w", i, err)
}
prms = append(prms, prm)
}
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}(res.Groups)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Groups: %w", err)
}
prms = append(prms, prm)
prm, err = func(in map[string]string) (smartcontract.Parameter, error) {
if in == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var prms = make([]smartcontract.ParameterPair, 0, len(in))
for k, v := range in {
iKey, err := smartcontract.NewParameterFromValue(k)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("key %v: %w", k, err)
}
iVal, err := smartcontract.NewParameterFromValue(v)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("key %v, wrong value: %w", k, err)
}
prms = append(prms, smartcontract.ParameterPair{Key: iKey, Value: iVal})
}
return smartcontract.Parameter{Type: smartcontract.MapType, Value: prms}, nil
}(res.Features)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Features: %w", err)
}
prms = append(prms, prm)
prm, err = func(in []string) (smartcontract.Parameter, error) {
if in == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var prms = make([]smartcontract.Parameter, 0, len(in))
for i, v := range in {
prm, err := smartcontract.NewParameterFromValue(v)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("item %d: %w", i, err)
}
prms = append(prms, prm)
}
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}(res.SupportedStandards)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field SupportedStandards: %w", err)
}
prms = append(prms, prm)
prm, err = res.ABI.ToSCParameter()
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field ABI: %w", err)
}
prms = append(prms, prm)
prm, err = func(in []*ManagementPermission) (smartcontract.Parameter, error) {
if in == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var prms = make([]smartcontract.Parameter, 0, len(in))
for i, v := range in {
prm, err := v.ToSCParameter()
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("item %d: %w", i, err)
}
prms = append(prms, prm)
}
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}(res.Permissions)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Permissions: %w", err)
}
prms = append(prms, prm)
prm, err = func(in []util.Uint160) (smartcontract.Parameter, error) {
if in == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var prms = make([]smartcontract.Parameter, 0, len(in))
for i, v := range in {
prm, err := smartcontract.NewParameterFromValue(v)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("item %d: %w", i, err)
}
prms = append(prms, prm)
}
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}(res.Trusts)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Trusts: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.Extra)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Extra: %w", err)
}
prms = append(prms, prm)
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}
// itemToManagementMethod converts stack item into *ManagementMethod.
// NULL item is returned as nil pointer without error.
func itemToManagementMethod(item stackitem.Item, err error) (*ManagementMethod, error) {
if err != nil {
return nil, err
}
_, null := item.(stackitem.Null)
if null {
return nil, nil
}
var res = new(ManagementMethod)
err = res.FromStackItem(item)
return res, err
}
// Ensure *ManagementMethod is a proper [stackitem.Convertible].
var _ = stackitem.Convertible(&ManagementMethod{})
// Ensure *ManagementMethod is a proper [smartcontract.Convertible].
var _ = smartcontract.Convertible(&ManagementMethod{})
// FromStackItem retrieves fields of ManagementMethod from the given
// [stackitem.Item] or returns an error if it's not possible to do to so.
// It implements [stackitem.Convertible] interface.
func (res *ManagementMethod) FromStackItem(item stackitem.Item) error {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return errors.New("not an array")
}
if len(arr) != 5 {
return errors.New("wrong number of structure elements")
}
var (
index = -1
err error
)
index++
res.Name, err = func(item stackitem.Item) (string, error) {
b, err := item.TryBytes()
if err != nil {
return "", err
}
if !utf8.Valid(b) {
return "", errors.New("not a UTF-8 string")
}
return string(b), nil
}(arr[index])
if err != nil {
return fmt.Errorf("field Name: %w", err)
}
index++
res.Params, err = func(item stackitem.Item) ([]*ManagementParameter, error) {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return nil, errors.New("not an array")
}
res := make([]*ManagementParameter, len(arr))
for i := range res {
res[i], err = itemToManagementParameter(arr[i], nil)
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
}
return res, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field Params: %w", err)
}
index++
res.ReturnType, err = arr[index].TryInteger()
if err != nil {
return fmt.Errorf("field ReturnType: %w", err)
}
index++
res.Offset, err = arr[index].TryInteger()
if err != nil {
return fmt.Errorf("field Offset: %w", err)
}
index++
res.Safe, err = arr[index].TryBool()
if err != nil {
return fmt.Errorf("field Safe: %w", err)
}
return nil
}
// ToStackItem creates [stackitem.Item] representing ManagementMethod.
// It implements [stackitem.Convertible] interface.
func (res *ManagementMethod) ToStackItem() (stackitem.Item, error) {
if res == nil {
return stackitem.Null{}, nil
}
var (
err error
itm stackitem.Item
items = make([]stackitem.Item, 0, 5)
)
itm, err = stackitem.NewByteArray([]byte(res.Name)), error(nil)
if err != nil {
return nil, fmt.Errorf("field Name: %w", err)
}
items = append(items, itm)
itm, err = func(in []*ManagementParameter) (stackitem.Item, error) {
if in == nil {
return stackitem.Null{}, nil
}
var items = make([]stackitem.Item, 0, len(in))
for i, v := range in {
itm, err := v.ToStackItem()
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
items = append(items, itm)
}
return stackitem.NewArray(items), nil
}(res.Params)
if err != nil {
return nil, fmt.Errorf("field Params: %w", err)
}
items = append(items, itm)
itm, err = (*stackitem.BigInteger)(res.ReturnType), error(nil)
if err != nil {
return nil, fmt.Errorf("field ReturnType: %w", err)
}
items = append(items, itm)
itm, err = (*stackitem.BigInteger)(res.Offset), error(nil)
if err != nil {
return nil, fmt.Errorf("field Offset: %w", err)
}
items = append(items, itm)
itm, err = stackitem.NewBool(res.Safe), error(nil)
if err != nil {
return nil, fmt.Errorf("field Safe: %w", err)
}
items = append(items, itm)
return stackitem.NewStruct(items), nil
}
// ToSCParameter creates [smartcontract.Parameter] representing ManagementMethod.
// It implements [smartcontract.Convertible] interface so that ManagementMethod
// could be used with invokers.
func (res *ManagementMethod) ToSCParameter() (smartcontract.Parameter, error) {
if res == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var (
err error
prm smartcontract.Parameter
prms = make([]smartcontract.Parameter, 0, 5)
)
prm, err = smartcontract.NewParameterFromValue(res.Name)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Name: %w", err)
}
prms = append(prms, prm)
prm, err = func(in []*ManagementParameter) (smartcontract.Parameter, error) {
if in == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var prms = make([]smartcontract.Parameter, 0, len(in))
for i, v := range in {
prm, err := v.ToSCParameter()
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("item %d: %w", i, err)
}
prms = append(prms, prm)
}
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}(res.Params)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Params: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.ReturnType)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field ReturnType: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.Offset)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Offset: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.Safe)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Safe: %w", err)
}
prms = append(prms, prm)
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}
// itemToManagementParameter converts stack item into *ManagementParameter.
// NULL item is returned as nil pointer without error.
func itemToManagementParameter(item stackitem.Item, err error) (*ManagementParameter, error) {
if err != nil {
return nil, err
}
_, null := item.(stackitem.Null)
if null {
return nil, nil
}
var res = new(ManagementParameter)
err = res.FromStackItem(item)
return res, err
}
// Ensure *ManagementParameter is a proper [stackitem.Convertible].
var _ = stackitem.Convertible(&ManagementParameter{})
// Ensure *ManagementParameter is a proper [smartcontract.Convertible].
var _ = smartcontract.Convertible(&ManagementParameter{})
// FromStackItem retrieves fields of ManagementParameter from the given
// [stackitem.Item] or returns an error if it's not possible to do to so.
// It implements [stackitem.Convertible] interface.
func (res *ManagementParameter) FromStackItem(item stackitem.Item) error {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return errors.New("not an array")
}
if len(arr) != 2 {
return errors.New("wrong number of structure elements")
}
var (
index = -1
err error
)
index++
res.Name, err = func(item stackitem.Item) (string, error) {
b, err := item.TryBytes()
if err != nil {
return "", err
}
if !utf8.Valid(b) {
return "", errors.New("not a UTF-8 string")
}
return string(b), nil
}(arr[index])
if err != nil {
return fmt.Errorf("field Name: %w", err)
}
index++
res.Type, err = arr[index].TryInteger()
if err != nil {
return fmt.Errorf("field Type: %w", err)
}
return nil
}
// ToStackItem creates [stackitem.Item] representing ManagementParameter.
// It implements [stackitem.Convertible] interface.
func (res *ManagementParameter) ToStackItem() (stackitem.Item, error) {
if res == nil {
return stackitem.Null{}, nil
}
var (
err error
itm stackitem.Item
items = make([]stackitem.Item, 0, 2)
)
itm, err = stackitem.NewByteArray([]byte(res.Name)), error(nil)
if err != nil {
return nil, fmt.Errorf("field Name: %w", err)
}
items = append(items, itm)
itm, err = (*stackitem.BigInteger)(res.Type), error(nil)
if err != nil {
return nil, fmt.Errorf("field Type: %w", err)
}
items = append(items, itm)
return stackitem.NewStruct(items), nil
}
// ToSCParameter creates [smartcontract.Parameter] representing ManagementParameter.
// It implements [smartcontract.Convertible] interface so that ManagementParameter
// could be used with invokers.
func (res *ManagementParameter) ToSCParameter() (smartcontract.Parameter, error) {
if res == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var (
err error
prm smartcontract.Parameter
prms = make([]smartcontract.Parameter, 0, 2)
)
prm, err = smartcontract.NewParameterFromValue(res.Name)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Name: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.Type)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Type: %w", err)
}
prms = append(prms, prm)
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}
// itemToManagementPermission converts stack item into *ManagementPermission.
// NULL item is returned as nil pointer without error.
func itemToManagementPermission(item stackitem.Item, err error) (*ManagementPermission, error) {
if err != nil {
return nil, err
}
_, null := item.(stackitem.Null)
if null {
return nil, nil
}
var res = new(ManagementPermission)
err = res.FromStackItem(item)
return res, err
}
// Ensure *ManagementPermission is a proper [stackitem.Convertible].
var _ = stackitem.Convertible(&ManagementPermission{})
// Ensure *ManagementPermission is a proper [smartcontract.Convertible].
var _ = smartcontract.Convertible(&ManagementPermission{})
// FromStackItem retrieves fields of ManagementPermission from the given
// [stackitem.Item] or returns an error if it's not possible to do to so.
// It implements [stackitem.Convertible] interface.
func (res *ManagementPermission) FromStackItem(item stackitem.Item) error {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return errors.New("not an array")
}
if len(arr) != 2 {
return errors.New("wrong number of structure elements")
}
var (
index = -1
err error
)
index++
res.Contract, err = func(item stackitem.Item) (util.Uint160, error) {
b, err := item.TryBytes()
if err != nil {
return util.Uint160{}, err
}
u, err := util.Uint160DecodeBytesBE(b)
if err != nil {
return util.Uint160{}, err
}
return u, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field Contract: %w", err)
}
index++
res.Methods, err = func(item stackitem.Item) ([]string, error) {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return nil, errors.New("not an array")
}
res := make([]string, len(arr))
for i := range res {
res[i], err = func(item stackitem.Item) (string, error) {
b, err := item.TryBytes()
if err != nil {
return "", err
}
if !utf8.Valid(b) {
return "", errors.New("not a UTF-8 string")
}
return string(b), nil
}(arr[i])
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
}
return res, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field Methods: %w", err)
}
return nil
}
// ToStackItem creates [stackitem.Item] representing ManagementPermission.
// It implements [stackitem.Convertible] interface.
func (res *ManagementPermission) ToStackItem() (stackitem.Item, error) {
if res == nil {
return stackitem.Null{}, nil
}
var (
err error
itm stackitem.Item
items = make([]stackitem.Item, 0, 2)
)
itm, err = stackitem.NewByteArray(res.Contract.BytesBE()), error(nil)
if err != nil {
return nil, fmt.Errorf("field Contract: %w", err)
}
items = append(items, itm)
itm, err = func(in []string) (stackitem.Item, error) {
if in == nil {
return stackitem.Null{}, nil
}
var items = make([]stackitem.Item, 0, len(in))
for i, v := range in {
itm, err := stackitem.NewByteArray([]byte(v)), error(nil)
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
items = append(items, itm)
}
return stackitem.NewArray(items), nil
}(res.Methods)
if err != nil {
return nil, fmt.Errorf("field Methods: %w", err)
}
items = append(items, itm)
return stackitem.NewStruct(items), nil
}
// ToSCParameter creates [smartcontract.Parameter] representing ManagementPermission.
// It implements [smartcontract.Convertible] interface so that ManagementPermission
// could be used with invokers.
func (res *ManagementPermission) ToSCParameter() (smartcontract.Parameter, error) {
if res == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var (
err error
prm smartcontract.Parameter
prms = make([]smartcontract.Parameter, 0, 2)
)
prm, err = smartcontract.NewParameterFromValue(res.Contract)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Contract: %w", err)
}
prms = append(prms, prm)
prm, err = func(in []string) (smartcontract.Parameter, error) {
if in == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var prms = make([]smartcontract.Parameter, 0, len(in))
for i, v := range in {
prm, err := smartcontract.NewParameterFromValue(v)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("item %d: %w", i, err)
}
prms = append(prms, prm)
}
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}(res.Methods)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Methods: %w", err)
}
prms = append(prms, prm)
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}
// itemToStructsInternal converts stack item into *StructsInternal.
// NULL item is returned as nil pointer without error.
func itemToStructsInternal(item stackitem.Item, err error) (*StructsInternal, error) {
if err != nil {
return nil, err
}
_, null := item.(stackitem.Null)
if null {
return nil, nil
}
var res = new(StructsInternal)
err = res.FromStackItem(item)
return res, err
}
// Ensure *StructsInternal is a proper [stackitem.Convertible].
var _ = stackitem.Convertible(&StructsInternal{})
// Ensure *StructsInternal is a proper [smartcontract.Convertible].
var _ = smartcontract.Convertible(&StructsInternal{})
// FromStackItem retrieves fields of StructsInternal from the given
// [stackitem.Item] or returns an error if it's not possible to do to so.
// It implements [stackitem.Convertible] interface.
func (res *StructsInternal) FromStackItem(item stackitem.Item) error {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return errors.New("not an array")
}
if len(arr) != 14 {
return errors.New("wrong number of structure elements")
}
var (
index = -1
err error
)
index++
res.Bool, err = arr[index].TryBool()
if err != nil {
return fmt.Errorf("field Bool: %w", err)
}
index++
res.Int, err = arr[index].TryInteger()
if err != nil {
return fmt.Errorf("field Int: %w", err)
}
index++
res.Bytes, err = arr[index].TryBytes()
if err != nil {
return fmt.Errorf("field Bytes: %w", err)
}
index++
res.String, err = func(item stackitem.Item) (string, error) {
b, err := item.TryBytes()
if err != nil {
return "", err
}
if !utf8.Valid(b) {
return "", errors.New("not a UTF-8 string")
}
return string(b), nil
}(arr[index])
if err != nil {
return fmt.Errorf("field String: %w", err)
}
index++
res.H160, err = func(item stackitem.Item) (util.Uint160, error) {
b, err := item.TryBytes()
if err != nil {
return util.Uint160{}, err
}
u, err := util.Uint160DecodeBytesBE(b)
if err != nil {
return util.Uint160{}, err
}
return u, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field H160: %w", err)
}
index++
res.H256, err = func(item stackitem.Item) (util.Uint256, error) {
b, err := item.TryBytes()
if err != nil {
return util.Uint256{}, err
}
u, err := util.Uint256DecodeBytesBE(b)
if err != nil {
return util.Uint256{}, err
}
return u, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field H256: %w", err)
}
index++
res.PK, err = func(item stackitem.Item) (*keys.PublicKey, error) {
b, err := item.TryBytes()
if err != nil {
return nil, err
}
k, err := keys.NewPublicKeyFromBytes(b, elliptic.P256())
if err != nil {
return nil, err
}
return k, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field PK: %w", err)
}
index++
res.PubKey, err = func(item stackitem.Item) (*keys.PublicKey, error) {
b, err := item.TryBytes()
if err != nil {
return nil, err
}
k, err := keys.NewPublicKeyFromBytes(b, elliptic.P256())
if err != nil {
return nil, err
}
return k, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field PubKey: %w", err)
}
index++
res.Sign, err = arr[index].TryBytes()
if err != nil {
return fmt.Errorf("field Sign: %w", err)
}
index++
res.ArrOfBytes, err = func(item stackitem.Item) ([][]byte, error) {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return nil, errors.New("not an array")
}
res := make([][]byte, len(arr))
for i := range res {
res[i], err = arr[i].TryBytes()
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
}
return res, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field ArrOfBytes: %w", err)
}
index++
res.ArrOfH160, err = func(item stackitem.Item) ([]util.Uint160, error) {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return nil, errors.New("not an array")
}
res := make([]util.Uint160, len(arr))
for i := range res {
res[i], err = func(item stackitem.Item) (util.Uint160, error) {
b, err := item.TryBytes()
if err != nil {
return util.Uint160{}, err
}
u, err := util.Uint160DecodeBytesBE(b)
if err != nil {
return util.Uint160{}, err
}
return u, nil
}(arr[i])
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
}
return res, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field ArrOfH160: %w", err)
}
index++
res.Map, err = func(item stackitem.Item) (map[*big.Int]keys.PublicKeys, error) {
m, ok := item.Value().([]stackitem.MapElement)
if !ok {
return nil, fmt.Errorf("%s is not a map", item.Type().String())
}
res := make(map[*big.Int]keys.PublicKeys)
for i := range m {
k, err := m[i].Key.TryInteger()
if err != nil {
return nil, fmt.Errorf("key %d: %w", i, err)
}
v, err := func(item stackitem.Item) (keys.PublicKeys, error) {
arr, ok := item.Value().([]stackitem.Item)
if !ok {
return nil, errors.New("not an array")
}
res := make(keys.PublicKeys, len(arr))
for i := range res {
res[i], err = func(item stackitem.Item) (*keys.PublicKey, error) {
b, err := item.TryBytes()
if err != nil {
return nil, err
}
k, err := keys.NewPublicKeyFromBytes(b, elliptic.P256())
if err != nil {
return nil, err
}
return k, nil
}(arr[i])
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
}
return res, nil
}(m[i].Value)
if err != nil {
return nil, fmt.Errorf("value %d: %w", i, err)
}
res[k] = v
}
return res, nil
}(arr[index])
if err != nil {
return fmt.Errorf("field Map: %w", err)
}
index++
res.Struct, err = itemToStructsInternal(arr[index], nil)
if err != nil {
return fmt.Errorf("field Struct: %w", err)
}
index++
res.UnexportedField, err = arr[index].TryInteger()
if err != nil {
return fmt.Errorf("field UnexportedField: %w", err)
}
return nil
}
// ToStackItem creates [stackitem.Item] representing StructsInternal.
// It implements [stackitem.Convertible] interface.
func (res *StructsInternal) ToStackItem() (stackitem.Item, error) {
if res == nil {
return stackitem.Null{}, nil
}
var (
err error
itm stackitem.Item
items = make([]stackitem.Item, 0, 14)
)
itm, err = stackitem.NewBool(res.Bool), error(nil)
if err != nil {
return nil, fmt.Errorf("field Bool: %w", err)
}
items = append(items, itm)
itm, err = (*stackitem.BigInteger)(res.Int), error(nil)
if err != nil {
return nil, fmt.Errorf("field Int: %w", err)
}
items = append(items, itm)
itm, err = stackitem.NewByteArray(res.Bytes), error(nil)
if err != nil {
return nil, fmt.Errorf("field Bytes: %w", err)
}
items = append(items, itm)
itm, err = stackitem.NewByteArray([]byte(res.String)), error(nil)
if err != nil {
return nil, fmt.Errorf("field String: %w", err)
}
items = append(items, itm)
itm, err = stackitem.NewByteArray(res.H160.BytesBE()), error(nil)
if err != nil {
return nil, fmt.Errorf("field H160: %w", err)
}
items = append(items, itm)
itm, err = stackitem.NewByteArray(res.H256.BytesBE()), error(nil)
if err != nil {
return nil, fmt.Errorf("field H256: %w", err)
}
items = append(items, itm)
itm, err = stackitem.NewByteArray(res.PK.Bytes()), error(nil)
if err != nil {
return nil, fmt.Errorf("field PK: %w", err)
}
items = append(items, itm)
itm, err = stackitem.NewByteArray(res.PubKey.Bytes()), error(nil)
if err != nil {
return nil, fmt.Errorf("field PubKey: %w", err)
}
items = append(items, itm)
itm, err = stackitem.NewByteArray(res.Sign), error(nil)
if err != nil {
return nil, fmt.Errorf("field Sign: %w", err)
}
items = append(items, itm)
itm, err = func(in [][]byte) (stackitem.Item, error) {
if in == nil {
return stackitem.Null{}, nil
}
var items = make([]stackitem.Item, 0, len(in))
for i, v := range in {
itm, err := stackitem.NewByteArray(v), error(nil)
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
items = append(items, itm)
}
return stackitem.NewArray(items), nil
}(res.ArrOfBytes)
if err != nil {
return nil, fmt.Errorf("field ArrOfBytes: %w", err)
}
items = append(items, itm)
itm, err = func(in []util.Uint160) (stackitem.Item, error) {
if in == nil {
return stackitem.Null{}, nil
}
var items = make([]stackitem.Item, 0, len(in))
for i, v := range in {
itm, err := stackitem.NewByteArray(v.BytesBE()), error(nil)
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
items = append(items, itm)
}
return stackitem.NewArray(items), nil
}(res.ArrOfH160)
if err != nil {
return nil, fmt.Errorf("field ArrOfH160: %w", err)
}
items = append(items, itm)
itm, err = func(in map[*big.Int]keys.PublicKeys) (stackitem.Item, error) {
if in == nil {
return stackitem.Null{}, nil
}
var m = stackitem.NewMap()
for k, v := range in {
iKey, err := (*stackitem.BigInteger)(k), error(nil)
if err != nil {
return nil, fmt.Errorf("key %v: %w", k, err)
}
iVal, err := func(in keys.PublicKeys) (stackitem.Item, error) {
if in == nil {
return stackitem.Null{}, nil
}
var items = make([]stackitem.Item, 0, len(in))
for i, v := range in {
itm, err := stackitem.NewByteArray(v.Bytes()), error(nil)
if err != nil {
return nil, fmt.Errorf("item %d: %w", i, err)
}
items = append(items, itm)
}
return stackitem.NewArray(items), nil
}(v)
if err != nil {
return nil, fmt.Errorf("key %v, wrong value: %w", k, err)
}
m.Add(iKey, iVal)
}
return m, nil
}(res.Map)
if err != nil {
return nil, fmt.Errorf("field Map: %w", err)
}
items = append(items, itm)
itm, err = res.Struct.ToStackItem()
if err != nil {
return nil, fmt.Errorf("field Struct: %w", err)
}
items = append(items, itm)
itm, err = (*stackitem.BigInteger)(res.UnexportedField), error(nil)
if err != nil {
return nil, fmt.Errorf("field UnexportedField: %w", err)
}
items = append(items, itm)
return stackitem.NewStruct(items), nil
}
// ToSCParameter creates [smartcontract.Parameter] representing StructsInternal.
// It implements [smartcontract.Convertible] interface so that StructsInternal
// could be used with invokers.
func (res *StructsInternal) ToSCParameter() (smartcontract.Parameter, error) {
if res == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var (
err error
prm smartcontract.Parameter
prms = make([]smartcontract.Parameter, 0, 14)
)
prm, err = smartcontract.NewParameterFromValue(res.Bool)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Bool: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.Int)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Int: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.Bytes)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Bytes: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.String)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field String: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.H160)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field H160: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.H256)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field H256: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.PK)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field PK: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.PubKey)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field PubKey: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.Sign)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Sign: %w", err)
}
prms = append(prms, prm)
prm, err = func(in [][]byte) (smartcontract.Parameter, error) {
if in == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var prms = make([]smartcontract.Parameter, 0, len(in))
for i, v := range in {
prm, err := smartcontract.NewParameterFromValue(v)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("item %d: %w", i, err)
}
prms = append(prms, prm)
}
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}(res.ArrOfBytes)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field ArrOfBytes: %w", err)
}
prms = append(prms, prm)
prm, err = func(in []util.Uint160) (smartcontract.Parameter, error) {
if in == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var prms = make([]smartcontract.Parameter, 0, len(in))
for i, v := range in {
prm, err := smartcontract.NewParameterFromValue(v)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("item %d: %w", i, err)
}
prms = append(prms, prm)
}
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}(res.ArrOfH160)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field ArrOfH160: %w", err)
}
prms = append(prms, prm)
prm, err = func(in map[*big.Int]keys.PublicKeys) (smartcontract.Parameter, error) {
if in == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var prms = make([]smartcontract.ParameterPair, 0, len(in))
for k, v := range in {
iKey, err := smartcontract.NewParameterFromValue(k)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("key %v: %w", k, err)
}
iVal, err := func(in keys.PublicKeys) (smartcontract.Parameter, error) {
if in == nil {
return smartcontract.Parameter{Type: smartcontract.AnyType}, nil
}
var prms = make([]smartcontract.Parameter, 0, len(in))
for i, v := range in {
prm, err := smartcontract.NewParameterFromValue(v)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("item %d: %w", i, err)
}
prms = append(prms, prm)
}
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}(v)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("key %v, wrong value: %w", k, err)
}
prms = append(prms, smartcontract.ParameterPair{Key: iKey, Value: iVal})
}
return smartcontract.Parameter{Type: smartcontract.MapType, Value: prms}, nil
}(res.Map)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Map: %w", err)
}
prms = append(prms, prm)
prm, err = res.Struct.ToSCParameter()
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field Struct: %w", err)
}
prms = append(prms, prm)
prm, err = smartcontract.NewParameterFromValue(res.UnexportedField)
if err != nil {
return smartcontract.Parameter{}, fmt.Errorf("field UnexportedField: %w", err)
}
prms = append(prms, prm)
return smartcontract.Parameter{Type: smartcontract.ArrayType, Value: prms}, nil
}