github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/cli/smartcontract/testdata/rpcbindings/structs/rpcbindings_dynamic_hash.out (about)

     1  // Code generated by neo-go contract generate-rpcwrapper --manifest <file.json> --out <file.go> [--hash <hash>] [--config <config>]; DO NOT EDIT.
     2  
     3  // Package structs contains RPC wrappers for Types contract.
     4  package structs
     5  
     6  import (
     7  	"crypto/elliptic"
     8  	"errors"
     9  	"fmt"
    10  	"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
    11  	"github.com/nspcc-dev/neo-go/pkg/neorpc/result"
    12  	"github.com/nspcc-dev/neo-go/pkg/rpcclient/unwrap"
    13  	"github.com/nspcc-dev/neo-go/pkg/util"
    14  	"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
    15  	"math/big"
    16  	"unicode/utf8"
    17  )
    18  
    19  // LedgerBlock is a contract-specific ledger.Block type used by its methods.
    20  type LedgerBlock struct {
    21  	Hash               util.Uint256
    22  	Version            *big.Int
    23  	PrevHash           util.Uint256
    24  	MerkleRoot         util.Uint256
    25  	Timestamp          *big.Int
    26  	Nonce              *big.Int
    27  	Index              *big.Int
    28  	NextConsensus      util.Uint160
    29  	TransactionsLength *big.Int
    30  }
    31  
    32  // LedgerTransaction is a contract-specific ledger.Transaction type used by its methods.
    33  type LedgerTransaction struct {
    34  	Hash            util.Uint256
    35  	Version         *big.Int
    36  	Nonce           *big.Int
    37  	Sender          util.Uint160
    38  	SysFee          *big.Int
    39  	NetFee          *big.Int
    40  	ValidUntilBlock *big.Int
    41  	Script          []byte
    42  }
    43  
    44  // ManagementABI is a contract-specific management.ABI type used by its methods.
    45  type ManagementABI struct {
    46  	Methods []*ManagementMethod
    47  	Events  []*ManagementEvent
    48  }
    49  
    50  // ManagementContract is a contract-specific management.Contract type used by its methods.
    51  type ManagementContract struct {
    52  	ID            *big.Int
    53  	UpdateCounter *big.Int
    54  	Hash          util.Uint160
    55  	NEF           []byte
    56  	Manifest      *ManagementManifest
    57  }
    58  
    59  // ManagementEvent is a contract-specific management.Event type used by its methods.
    60  type ManagementEvent struct {
    61  	Name   string
    62  	Params []*ManagementParameter
    63  }
    64  
    65  // ManagementGroup is a contract-specific management.Group type used by its methods.
    66  type ManagementGroup struct {
    67  	PublicKey *keys.PublicKey
    68  	Signature []byte
    69  }
    70  
    71  // ManagementManifest is a contract-specific management.Manifest type used by its methods.
    72  type ManagementManifest struct {
    73  	Name               string
    74  	Groups             []*ManagementGroup
    75  	Features           map[string]string
    76  	SupportedStandards []string
    77  	ABI                *ManagementABI
    78  	Permissions        []*ManagementPermission
    79  	Trusts             []util.Uint160
    80  	Extra              any
    81  }
    82  
    83  // ManagementMethod is a contract-specific management.Method type used by its methods.
    84  type ManagementMethod struct {
    85  	Name       string
    86  	Params     []*ManagementParameter
    87  	ReturnType *big.Int
    88  	Offset     *big.Int
    89  	Safe       bool
    90  }
    91  
    92  // ManagementParameter is a contract-specific management.Parameter type used by its methods.
    93  type ManagementParameter struct {
    94  	Name string
    95  	Type *big.Int
    96  }
    97  
    98  // ManagementPermission is a contract-specific management.Permission type used by its methods.
    99  type ManagementPermission struct {
   100  	Contract util.Uint160
   101  	Methods  []string
   102  }
   103  
   104  // StructsInternal is a contract-specific structs.Internal type used by its methods.
   105  type StructsInternal struct {
   106  	Bool            bool
   107  	Int             *big.Int
   108  	Bytes           []byte
   109  	String          string
   110  	H160            util.Uint160
   111  	H256            util.Uint256
   112  	PK              *keys.PublicKey
   113  	PubKey          *keys.PublicKey
   114  	Sign            []byte
   115  	ArrOfBytes      [][]byte
   116  	ArrOfH160       []util.Uint160
   117  	Map             map[*big.Int]keys.PublicKeys
   118  	Struct          *StructsInternal
   119  	UnexportedField *big.Int
   120  }
   121  
   122  // Invoker is used by ContractReader to call various safe methods.
   123  type Invoker interface {
   124  	Call(contract util.Uint160, operation string, params ...any) (*result.Invoke, error)
   125  }
   126  
   127  // ContractReader implements safe contract methods.
   128  type ContractReader struct {
   129  	invoker Invoker
   130  	hash    util.Uint160
   131  }
   132  
   133  // NewReader creates an instance of ContractReader using provided contract hash and the given Invoker.
   134  func NewReader(invoker Invoker, hash util.Uint160) *ContractReader {
   135  	return &ContractReader{invoker, hash}
   136  }
   137  
   138  // Block invokes `block` method of contract.
   139  func (c *ContractReader) Block(b *LedgerBlock) (*LedgerBlock, error) {
   140  	return itemToLedgerBlock(unwrap.Item(c.invoker.Call(c.hash, "block", b)))
   141  }
   142  
   143  // Contract invokes `contract` method of contract.
   144  func (c *ContractReader) Contract(mc *ManagementContract) (*ManagementContract, error) {
   145  	return itemToManagementContract(unwrap.Item(c.invoker.Call(c.hash, "contract", mc)))
   146  }
   147  
   148  // Struct invokes `struct` method of contract.
   149  func (c *ContractReader) Struct(s *StructsInternal) (*StructsInternal, error) {
   150  	return itemToStructsInternal(unwrap.Item(c.invoker.Call(c.hash, "struct", s)))
   151  }
   152  
   153  // Transaction invokes `transaction` method of contract.
   154  func (c *ContractReader) Transaction(t *LedgerTransaction) (*LedgerTransaction, error) {
   155  	return itemToLedgerTransaction(unwrap.Item(c.invoker.Call(c.hash, "transaction", t)))
   156  }
   157  
   158  // itemToLedgerBlock converts stack item into *LedgerBlock.
   159  func itemToLedgerBlock(item stackitem.Item, err error) (*LedgerBlock, error) {
   160  	if err != nil {
   161  		return nil, err
   162  	}
   163  	var res = new(LedgerBlock)
   164  	err = res.FromStackItem(item)
   165  	return res, err
   166  }
   167  
   168  // FromStackItem retrieves fields of LedgerBlock from the given
   169  // [stackitem.Item] or returns an error if it's not possible to do to so.
   170  func (res *LedgerBlock) FromStackItem(item stackitem.Item) error {
   171  	arr, ok := item.Value().([]stackitem.Item)
   172  	if !ok {
   173  		return errors.New("not an array")
   174  	}
   175  	if len(arr) != 9 {
   176  		return errors.New("wrong number of structure elements")
   177  	}
   178  
   179  	var (
   180  		index = -1
   181  		err   error
   182  	)
   183  	index++
   184  	res.Hash, err = func(item stackitem.Item) (util.Uint256, error) {
   185  		b, err := item.TryBytes()
   186  		if err != nil {
   187  			return util.Uint256{}, err
   188  		}
   189  		u, err := util.Uint256DecodeBytesBE(b)
   190  		if err != nil {
   191  			return util.Uint256{}, err
   192  		}
   193  		return u, nil
   194  	}(arr[index])
   195  	if err != nil {
   196  		return fmt.Errorf("field Hash: %w", err)
   197  	}
   198  
   199  	index++
   200  	res.Version, err = arr[index].TryInteger()
   201  	if err != nil {
   202  		return fmt.Errorf("field Version: %w", err)
   203  	}
   204  
   205  	index++
   206  	res.PrevHash, err = func(item stackitem.Item) (util.Uint256, error) {
   207  		b, err := item.TryBytes()
   208  		if err != nil {
   209  			return util.Uint256{}, err
   210  		}
   211  		u, err := util.Uint256DecodeBytesBE(b)
   212  		if err != nil {
   213  			return util.Uint256{}, err
   214  		}
   215  		return u, nil
   216  	}(arr[index])
   217  	if err != nil {
   218  		return fmt.Errorf("field PrevHash: %w", err)
   219  	}
   220  
   221  	index++
   222  	res.MerkleRoot, err = func(item stackitem.Item) (util.Uint256, error) {
   223  		b, err := item.TryBytes()
   224  		if err != nil {
   225  			return util.Uint256{}, err
   226  		}
   227  		u, err := util.Uint256DecodeBytesBE(b)
   228  		if err != nil {
   229  			return util.Uint256{}, err
   230  		}
   231  		return u, nil
   232  	}(arr[index])
   233  	if err != nil {
   234  		return fmt.Errorf("field MerkleRoot: %w", err)
   235  	}
   236  
   237  	index++
   238  	res.Timestamp, err = arr[index].TryInteger()
   239  	if err != nil {
   240  		return fmt.Errorf("field Timestamp: %w", err)
   241  	}
   242  
   243  	index++
   244  	res.Nonce, err = arr[index].TryInteger()
   245  	if err != nil {
   246  		return fmt.Errorf("field Nonce: %w", err)
   247  	}
   248  
   249  	index++
   250  	res.Index, err = arr[index].TryInteger()
   251  	if err != nil {
   252  		return fmt.Errorf("field Index: %w", err)
   253  	}
   254  
   255  	index++
   256  	res.NextConsensus, err = func(item stackitem.Item) (util.Uint160, error) {
   257  		b, err := item.TryBytes()
   258  		if err != nil {
   259  			return util.Uint160{}, err
   260  		}
   261  		u, err := util.Uint160DecodeBytesBE(b)
   262  		if err != nil {
   263  			return util.Uint160{}, err
   264  		}
   265  		return u, nil
   266  	}(arr[index])
   267  	if err != nil {
   268  		return fmt.Errorf("field NextConsensus: %w", err)
   269  	}
   270  
   271  	index++
   272  	res.TransactionsLength, err = arr[index].TryInteger()
   273  	if err != nil {
   274  		return fmt.Errorf("field TransactionsLength: %w", err)
   275  	}
   276  
   277  	return nil
   278  }
   279  
   280  // itemToLedgerTransaction converts stack item into *LedgerTransaction.
   281  func itemToLedgerTransaction(item stackitem.Item, err error) (*LedgerTransaction, error) {
   282  	if err != nil {
   283  		return nil, err
   284  	}
   285  	var res = new(LedgerTransaction)
   286  	err = res.FromStackItem(item)
   287  	return res, err
   288  }
   289  
   290  // FromStackItem retrieves fields of LedgerTransaction from the given
   291  // [stackitem.Item] or returns an error if it's not possible to do to so.
   292  func (res *LedgerTransaction) FromStackItem(item stackitem.Item) error {
   293  	arr, ok := item.Value().([]stackitem.Item)
   294  	if !ok {
   295  		return errors.New("not an array")
   296  	}
   297  	if len(arr) != 8 {
   298  		return errors.New("wrong number of structure elements")
   299  	}
   300  
   301  	var (
   302  		index = -1
   303  		err   error
   304  	)
   305  	index++
   306  	res.Hash, err = func(item stackitem.Item) (util.Uint256, error) {
   307  		b, err := item.TryBytes()
   308  		if err != nil {
   309  			return util.Uint256{}, err
   310  		}
   311  		u, err := util.Uint256DecodeBytesBE(b)
   312  		if err != nil {
   313  			return util.Uint256{}, err
   314  		}
   315  		return u, nil
   316  	}(arr[index])
   317  	if err != nil {
   318  		return fmt.Errorf("field Hash: %w", err)
   319  	}
   320  
   321  	index++
   322  	res.Version, err = arr[index].TryInteger()
   323  	if err != nil {
   324  		return fmt.Errorf("field Version: %w", err)
   325  	}
   326  
   327  	index++
   328  	res.Nonce, err = arr[index].TryInteger()
   329  	if err != nil {
   330  		return fmt.Errorf("field Nonce: %w", err)
   331  	}
   332  
   333  	index++
   334  	res.Sender, err = func(item stackitem.Item) (util.Uint160, error) {
   335  		b, err := item.TryBytes()
   336  		if err != nil {
   337  			return util.Uint160{}, err
   338  		}
   339  		u, err := util.Uint160DecodeBytesBE(b)
   340  		if err != nil {
   341  			return util.Uint160{}, err
   342  		}
   343  		return u, nil
   344  	}(arr[index])
   345  	if err != nil {
   346  		return fmt.Errorf("field Sender: %w", err)
   347  	}
   348  
   349  	index++
   350  	res.SysFee, err = arr[index].TryInteger()
   351  	if err != nil {
   352  		return fmt.Errorf("field SysFee: %w", err)
   353  	}
   354  
   355  	index++
   356  	res.NetFee, err = arr[index].TryInteger()
   357  	if err != nil {
   358  		return fmt.Errorf("field NetFee: %w", err)
   359  	}
   360  
   361  	index++
   362  	res.ValidUntilBlock, err = arr[index].TryInteger()
   363  	if err != nil {
   364  		return fmt.Errorf("field ValidUntilBlock: %w", err)
   365  	}
   366  
   367  	index++
   368  	res.Script, err = arr[index].TryBytes()
   369  	if err != nil {
   370  		return fmt.Errorf("field Script: %w", err)
   371  	}
   372  
   373  	return nil
   374  }
   375  
   376  // itemToManagementABI converts stack item into *ManagementABI.
   377  func itemToManagementABI(item stackitem.Item, err error) (*ManagementABI, error) {
   378  	if err != nil {
   379  		return nil, err
   380  	}
   381  	var res = new(ManagementABI)
   382  	err = res.FromStackItem(item)
   383  	return res, err
   384  }
   385  
   386  // FromStackItem retrieves fields of ManagementABI from the given
   387  // [stackitem.Item] or returns an error if it's not possible to do to so.
   388  func (res *ManagementABI) FromStackItem(item stackitem.Item) error {
   389  	arr, ok := item.Value().([]stackitem.Item)
   390  	if !ok {
   391  		return errors.New("not an array")
   392  	}
   393  	if len(arr) != 2 {
   394  		return errors.New("wrong number of structure elements")
   395  	}
   396  
   397  	var (
   398  		index = -1
   399  		err   error
   400  	)
   401  	index++
   402  	res.Methods, err = func(item stackitem.Item) ([]*ManagementMethod, error) {
   403  		arr, ok := item.Value().([]stackitem.Item)
   404  		if !ok {
   405  			return nil, errors.New("not an array")
   406  		}
   407  		res := make([]*ManagementMethod, len(arr))
   408  		for i := range res {
   409  			res[i], err = itemToManagementMethod(arr[i], nil)
   410  			if err != nil {
   411  				return nil, fmt.Errorf("item %d: %w", i, err)
   412  			}
   413  		}
   414  		return res, nil
   415  	}(arr[index])
   416  	if err != nil {
   417  		return fmt.Errorf("field Methods: %w", err)
   418  	}
   419  
   420  	index++
   421  	res.Events, err = func(item stackitem.Item) ([]*ManagementEvent, error) {
   422  		arr, ok := item.Value().([]stackitem.Item)
   423  		if !ok {
   424  			return nil, errors.New("not an array")
   425  		}
   426  		res := make([]*ManagementEvent, len(arr))
   427  		for i := range res {
   428  			res[i], err = itemToManagementEvent(arr[i], nil)
   429  			if err != nil {
   430  				return nil, fmt.Errorf("item %d: %w", i, err)
   431  			}
   432  		}
   433  		return res, nil
   434  	}(arr[index])
   435  	if err != nil {
   436  		return fmt.Errorf("field Events: %w", err)
   437  	}
   438  
   439  	return nil
   440  }
   441  
   442  // itemToManagementContract converts stack item into *ManagementContract.
   443  func itemToManagementContract(item stackitem.Item, err error) (*ManagementContract, error) {
   444  	if err != nil {
   445  		return nil, err
   446  	}
   447  	var res = new(ManagementContract)
   448  	err = res.FromStackItem(item)
   449  	return res, err
   450  }
   451  
   452  // FromStackItem retrieves fields of ManagementContract from the given
   453  // [stackitem.Item] or returns an error if it's not possible to do to so.
   454  func (res *ManagementContract) FromStackItem(item stackitem.Item) error {
   455  	arr, ok := item.Value().([]stackitem.Item)
   456  	if !ok {
   457  		return errors.New("not an array")
   458  	}
   459  	if len(arr) != 5 {
   460  		return errors.New("wrong number of structure elements")
   461  	}
   462  
   463  	var (
   464  		index = -1
   465  		err   error
   466  	)
   467  	index++
   468  	res.ID, err = arr[index].TryInteger()
   469  	if err != nil {
   470  		return fmt.Errorf("field ID: %w", err)
   471  	}
   472  
   473  	index++
   474  	res.UpdateCounter, err = arr[index].TryInteger()
   475  	if err != nil {
   476  		return fmt.Errorf("field UpdateCounter: %w", err)
   477  	}
   478  
   479  	index++
   480  	res.Hash, err = func(item stackitem.Item) (util.Uint160, error) {
   481  		b, err := item.TryBytes()
   482  		if err != nil {
   483  			return util.Uint160{}, err
   484  		}
   485  		u, err := util.Uint160DecodeBytesBE(b)
   486  		if err != nil {
   487  			return util.Uint160{}, err
   488  		}
   489  		return u, nil
   490  	}(arr[index])
   491  	if err != nil {
   492  		return fmt.Errorf("field Hash: %w", err)
   493  	}
   494  
   495  	index++
   496  	res.NEF, err = arr[index].TryBytes()
   497  	if err != nil {
   498  		return fmt.Errorf("field NEF: %w", err)
   499  	}
   500  
   501  	index++
   502  	res.Manifest, err = itemToManagementManifest(arr[index], nil)
   503  	if err != nil {
   504  		return fmt.Errorf("field Manifest: %w", err)
   505  	}
   506  
   507  	return nil
   508  }
   509  
   510  // itemToManagementEvent converts stack item into *ManagementEvent.
   511  func itemToManagementEvent(item stackitem.Item, err error) (*ManagementEvent, error) {
   512  	if err != nil {
   513  		return nil, err
   514  	}
   515  	var res = new(ManagementEvent)
   516  	err = res.FromStackItem(item)
   517  	return res, err
   518  }
   519  
   520  // FromStackItem retrieves fields of ManagementEvent from the given
   521  // [stackitem.Item] or returns an error if it's not possible to do to so.
   522  func (res *ManagementEvent) FromStackItem(item stackitem.Item) error {
   523  	arr, ok := item.Value().([]stackitem.Item)
   524  	if !ok {
   525  		return errors.New("not an array")
   526  	}
   527  	if len(arr) != 2 {
   528  		return errors.New("wrong number of structure elements")
   529  	}
   530  
   531  	var (
   532  		index = -1
   533  		err   error
   534  	)
   535  	index++
   536  	res.Name, err = func(item stackitem.Item) (string, error) {
   537  		b, err := item.TryBytes()
   538  		if err != nil {
   539  			return "", err
   540  		}
   541  		if !utf8.Valid(b) {
   542  			return "", errors.New("not a UTF-8 string")
   543  		}
   544  		return string(b), nil
   545  	}(arr[index])
   546  	if err != nil {
   547  		return fmt.Errorf("field Name: %w", err)
   548  	}
   549  
   550  	index++
   551  	res.Params, err = func(item stackitem.Item) ([]*ManagementParameter, error) {
   552  		arr, ok := item.Value().([]stackitem.Item)
   553  		if !ok {
   554  			return nil, errors.New("not an array")
   555  		}
   556  		res := make([]*ManagementParameter, len(arr))
   557  		for i := range res {
   558  			res[i], err = itemToManagementParameter(arr[i], nil)
   559  			if err != nil {
   560  				return nil, fmt.Errorf("item %d: %w", i, err)
   561  			}
   562  		}
   563  		return res, nil
   564  	}(arr[index])
   565  	if err != nil {
   566  		return fmt.Errorf("field Params: %w", err)
   567  	}
   568  
   569  	return nil
   570  }
   571  
   572  // itemToManagementGroup converts stack item into *ManagementGroup.
   573  func itemToManagementGroup(item stackitem.Item, err error) (*ManagementGroup, error) {
   574  	if err != nil {
   575  		return nil, err
   576  	}
   577  	var res = new(ManagementGroup)
   578  	err = res.FromStackItem(item)
   579  	return res, err
   580  }
   581  
   582  // FromStackItem retrieves fields of ManagementGroup from the given
   583  // [stackitem.Item] or returns an error if it's not possible to do to so.
   584  func (res *ManagementGroup) FromStackItem(item stackitem.Item) error {
   585  	arr, ok := item.Value().([]stackitem.Item)
   586  	if !ok {
   587  		return errors.New("not an array")
   588  	}
   589  	if len(arr) != 2 {
   590  		return errors.New("wrong number of structure elements")
   591  	}
   592  
   593  	var (
   594  		index = -1
   595  		err   error
   596  	)
   597  	index++
   598  	res.PublicKey, err = func(item stackitem.Item) (*keys.PublicKey, error) {
   599  		b, err := item.TryBytes()
   600  		if err != nil {
   601  			return nil, err
   602  		}
   603  		k, err := keys.NewPublicKeyFromBytes(b, elliptic.P256())
   604  		if err != nil {
   605  			return nil, err
   606  		}
   607  		return k, nil
   608  	}(arr[index])
   609  	if err != nil {
   610  		return fmt.Errorf("field PublicKey: %w", err)
   611  	}
   612  
   613  	index++
   614  	res.Signature, err = arr[index].TryBytes()
   615  	if err != nil {
   616  		return fmt.Errorf("field Signature: %w", err)
   617  	}
   618  
   619  	return nil
   620  }
   621  
   622  // itemToManagementManifest converts stack item into *ManagementManifest.
   623  func itemToManagementManifest(item stackitem.Item, err error) (*ManagementManifest, error) {
   624  	if err != nil {
   625  		return nil, err
   626  	}
   627  	var res = new(ManagementManifest)
   628  	err = res.FromStackItem(item)
   629  	return res, err
   630  }
   631  
   632  // FromStackItem retrieves fields of ManagementManifest from the given
   633  // [stackitem.Item] or returns an error if it's not possible to do to so.
   634  func (res *ManagementManifest) FromStackItem(item stackitem.Item) error {
   635  	arr, ok := item.Value().([]stackitem.Item)
   636  	if !ok {
   637  		return errors.New("not an array")
   638  	}
   639  	if len(arr) != 8 {
   640  		return errors.New("wrong number of structure elements")
   641  	}
   642  
   643  	var (
   644  		index = -1
   645  		err   error
   646  	)
   647  	index++
   648  	res.Name, err = func(item stackitem.Item) (string, error) {
   649  		b, err := item.TryBytes()
   650  		if err != nil {
   651  			return "", err
   652  		}
   653  		if !utf8.Valid(b) {
   654  			return "", errors.New("not a UTF-8 string")
   655  		}
   656  		return string(b), nil
   657  	}(arr[index])
   658  	if err != nil {
   659  		return fmt.Errorf("field Name: %w", err)
   660  	}
   661  
   662  	index++
   663  	res.Groups, err = func(item stackitem.Item) ([]*ManagementGroup, error) {
   664  		arr, ok := item.Value().([]stackitem.Item)
   665  		if !ok {
   666  			return nil, errors.New("not an array")
   667  		}
   668  		res := make([]*ManagementGroup, len(arr))
   669  		for i := range res {
   670  			res[i], err = itemToManagementGroup(arr[i], nil)
   671  			if err != nil {
   672  				return nil, fmt.Errorf("item %d: %w", i, err)
   673  			}
   674  		}
   675  		return res, nil
   676  	}(arr[index])
   677  	if err != nil {
   678  		return fmt.Errorf("field Groups: %w", err)
   679  	}
   680  
   681  	index++
   682  	res.Features, err = func(item stackitem.Item) (map[string]string, error) {
   683  		m, ok := item.Value().([]stackitem.MapElement)
   684  		if !ok {
   685  			return nil, fmt.Errorf("%s is not a map", item.Type().String())
   686  		}
   687  		res := make(map[string]string)
   688  		for i := range m {
   689  			k, err := func(item stackitem.Item) (string, error) {
   690  				b, err := item.TryBytes()
   691  				if err != nil {
   692  					return "", err
   693  				}
   694  				if !utf8.Valid(b) {
   695  					return "", errors.New("not a UTF-8 string")
   696  				}
   697  				return string(b), nil
   698  			}(m[i].Key)
   699  			if err != nil {
   700  				return nil, fmt.Errorf("key %d: %w", i, err)
   701  			}
   702  			v, err := func(item stackitem.Item) (string, error) {
   703  				b, err := item.TryBytes()
   704  				if err != nil {
   705  					return "", err
   706  				}
   707  				if !utf8.Valid(b) {
   708  					return "", errors.New("not a UTF-8 string")
   709  				}
   710  				return string(b), nil
   711  			}(m[i].Value)
   712  			if err != nil {
   713  				return nil, fmt.Errorf("value %d: %w", i, err)
   714  			}
   715  			res[k] = v
   716  		}
   717  		return res, nil
   718  	}(arr[index])
   719  	if err != nil {
   720  		return fmt.Errorf("field Features: %w", err)
   721  	}
   722  
   723  	index++
   724  	res.SupportedStandards, err = func(item stackitem.Item) ([]string, error) {
   725  		arr, ok := item.Value().([]stackitem.Item)
   726  		if !ok {
   727  			return nil, errors.New("not an array")
   728  		}
   729  		res := make([]string, len(arr))
   730  		for i := range res {
   731  			res[i], err = func(item stackitem.Item) (string, error) {
   732  				b, err := item.TryBytes()
   733  				if err != nil {
   734  					return "", err
   735  				}
   736  				if !utf8.Valid(b) {
   737  					return "", errors.New("not a UTF-8 string")
   738  				}
   739  				return string(b), nil
   740  			}(arr[i])
   741  			if err != nil {
   742  				return nil, fmt.Errorf("item %d: %w", i, err)
   743  			}
   744  		}
   745  		return res, nil
   746  	}(arr[index])
   747  	if err != nil {
   748  		return fmt.Errorf("field SupportedStandards: %w", err)
   749  	}
   750  
   751  	index++
   752  	res.ABI, err = itemToManagementABI(arr[index], nil)
   753  	if err != nil {
   754  		return fmt.Errorf("field ABI: %w", err)
   755  	}
   756  
   757  	index++
   758  	res.Permissions, err = func(item stackitem.Item) ([]*ManagementPermission, error) {
   759  		arr, ok := item.Value().([]stackitem.Item)
   760  		if !ok {
   761  			return nil, errors.New("not an array")
   762  		}
   763  		res := make([]*ManagementPermission, len(arr))
   764  		for i := range res {
   765  			res[i], err = itemToManagementPermission(arr[i], nil)
   766  			if err != nil {
   767  				return nil, fmt.Errorf("item %d: %w", i, err)
   768  			}
   769  		}
   770  		return res, nil
   771  	}(arr[index])
   772  	if err != nil {
   773  		return fmt.Errorf("field Permissions: %w", err)
   774  	}
   775  
   776  	index++
   777  	res.Trusts, err = func(item stackitem.Item) ([]util.Uint160, error) {
   778  		arr, ok := item.Value().([]stackitem.Item)
   779  		if !ok {
   780  			return nil, errors.New("not an array")
   781  		}
   782  		res := make([]util.Uint160, len(arr))
   783  		for i := range res {
   784  			res[i], err = func(item stackitem.Item) (util.Uint160, error) {
   785  				b, err := item.TryBytes()
   786  				if err != nil {
   787  					return util.Uint160{}, err
   788  				}
   789  				u, err := util.Uint160DecodeBytesBE(b)
   790  				if err != nil {
   791  					return util.Uint160{}, err
   792  				}
   793  				return u, nil
   794  			}(arr[i])
   795  			if err != nil {
   796  				return nil, fmt.Errorf("item %d: %w", i, err)
   797  			}
   798  		}
   799  		return res, nil
   800  	}(arr[index])
   801  	if err != nil {
   802  		return fmt.Errorf("field Trusts: %w", err)
   803  	}
   804  
   805  	index++
   806  	res.Extra, err = arr[index].Value(), error(nil)
   807  	if err != nil {
   808  		return fmt.Errorf("field Extra: %w", err)
   809  	}
   810  
   811  	return nil
   812  }
   813  
   814  // itemToManagementMethod converts stack item into *ManagementMethod.
   815  func itemToManagementMethod(item stackitem.Item, err error) (*ManagementMethod, error) {
   816  	if err != nil {
   817  		return nil, err
   818  	}
   819  	var res = new(ManagementMethod)
   820  	err = res.FromStackItem(item)
   821  	return res, err
   822  }
   823  
   824  // FromStackItem retrieves fields of ManagementMethod from the given
   825  // [stackitem.Item] or returns an error if it's not possible to do to so.
   826  func (res *ManagementMethod) FromStackItem(item stackitem.Item) error {
   827  	arr, ok := item.Value().([]stackitem.Item)
   828  	if !ok {
   829  		return errors.New("not an array")
   830  	}
   831  	if len(arr) != 5 {
   832  		return errors.New("wrong number of structure elements")
   833  	}
   834  
   835  	var (
   836  		index = -1
   837  		err   error
   838  	)
   839  	index++
   840  	res.Name, err = func(item stackitem.Item) (string, error) {
   841  		b, err := item.TryBytes()
   842  		if err != nil {
   843  			return "", err
   844  		}
   845  		if !utf8.Valid(b) {
   846  			return "", errors.New("not a UTF-8 string")
   847  		}
   848  		return string(b), nil
   849  	}(arr[index])
   850  	if err != nil {
   851  		return fmt.Errorf("field Name: %w", err)
   852  	}
   853  
   854  	index++
   855  	res.Params, err = func(item stackitem.Item) ([]*ManagementParameter, error) {
   856  		arr, ok := item.Value().([]stackitem.Item)
   857  		if !ok {
   858  			return nil, errors.New("not an array")
   859  		}
   860  		res := make([]*ManagementParameter, len(arr))
   861  		for i := range res {
   862  			res[i], err = itemToManagementParameter(arr[i], nil)
   863  			if err != nil {
   864  				return nil, fmt.Errorf("item %d: %w", i, err)
   865  			}
   866  		}
   867  		return res, nil
   868  	}(arr[index])
   869  	if err != nil {
   870  		return fmt.Errorf("field Params: %w", err)
   871  	}
   872  
   873  	index++
   874  	res.ReturnType, err = arr[index].TryInteger()
   875  	if err != nil {
   876  		return fmt.Errorf("field ReturnType: %w", err)
   877  	}
   878  
   879  	index++
   880  	res.Offset, err = arr[index].TryInteger()
   881  	if err != nil {
   882  		return fmt.Errorf("field Offset: %w", err)
   883  	}
   884  
   885  	index++
   886  	res.Safe, err = arr[index].TryBool()
   887  	if err != nil {
   888  		return fmt.Errorf("field Safe: %w", err)
   889  	}
   890  
   891  	return nil
   892  }
   893  
   894  // itemToManagementParameter converts stack item into *ManagementParameter.
   895  func itemToManagementParameter(item stackitem.Item, err error) (*ManagementParameter, error) {
   896  	if err != nil {
   897  		return nil, err
   898  	}
   899  	var res = new(ManagementParameter)
   900  	err = res.FromStackItem(item)
   901  	return res, err
   902  }
   903  
   904  // FromStackItem retrieves fields of ManagementParameter from the given
   905  // [stackitem.Item] or returns an error if it's not possible to do to so.
   906  func (res *ManagementParameter) FromStackItem(item stackitem.Item) error {
   907  	arr, ok := item.Value().([]stackitem.Item)
   908  	if !ok {
   909  		return errors.New("not an array")
   910  	}
   911  	if len(arr) != 2 {
   912  		return errors.New("wrong number of structure elements")
   913  	}
   914  
   915  	var (
   916  		index = -1
   917  		err   error
   918  	)
   919  	index++
   920  	res.Name, err = func(item stackitem.Item) (string, error) {
   921  		b, err := item.TryBytes()
   922  		if err != nil {
   923  			return "", err
   924  		}
   925  		if !utf8.Valid(b) {
   926  			return "", errors.New("not a UTF-8 string")
   927  		}
   928  		return string(b), nil
   929  	}(arr[index])
   930  	if err != nil {
   931  		return fmt.Errorf("field Name: %w", err)
   932  	}
   933  
   934  	index++
   935  	res.Type, err = arr[index].TryInteger()
   936  	if err != nil {
   937  		return fmt.Errorf("field Type: %w", err)
   938  	}
   939  
   940  	return nil
   941  }
   942  
   943  // itemToManagementPermission converts stack item into *ManagementPermission.
   944  func itemToManagementPermission(item stackitem.Item, err error) (*ManagementPermission, error) {
   945  	if err != nil {
   946  		return nil, err
   947  	}
   948  	var res = new(ManagementPermission)
   949  	err = res.FromStackItem(item)
   950  	return res, err
   951  }
   952  
   953  // FromStackItem retrieves fields of ManagementPermission from the given
   954  // [stackitem.Item] or returns an error if it's not possible to do to so.
   955  func (res *ManagementPermission) FromStackItem(item stackitem.Item) error {
   956  	arr, ok := item.Value().([]stackitem.Item)
   957  	if !ok {
   958  		return errors.New("not an array")
   959  	}
   960  	if len(arr) != 2 {
   961  		return errors.New("wrong number of structure elements")
   962  	}
   963  
   964  	var (
   965  		index = -1
   966  		err   error
   967  	)
   968  	index++
   969  	res.Contract, err = func(item stackitem.Item) (util.Uint160, error) {
   970  		b, err := item.TryBytes()
   971  		if err != nil {
   972  			return util.Uint160{}, err
   973  		}
   974  		u, err := util.Uint160DecodeBytesBE(b)
   975  		if err != nil {
   976  			return util.Uint160{}, err
   977  		}
   978  		return u, nil
   979  	}(arr[index])
   980  	if err != nil {
   981  		return fmt.Errorf("field Contract: %w", err)
   982  	}
   983  
   984  	index++
   985  	res.Methods, err = func(item stackitem.Item) ([]string, error) {
   986  		arr, ok := item.Value().([]stackitem.Item)
   987  		if !ok {
   988  			return nil, errors.New("not an array")
   989  		}
   990  		res := make([]string, len(arr))
   991  		for i := range res {
   992  			res[i], err = func(item stackitem.Item) (string, error) {
   993  				b, err := item.TryBytes()
   994  				if err != nil {
   995  					return "", err
   996  				}
   997  				if !utf8.Valid(b) {
   998  					return "", errors.New("not a UTF-8 string")
   999  				}
  1000  				return string(b), nil
  1001  			}(arr[i])
  1002  			if err != nil {
  1003  				return nil, fmt.Errorf("item %d: %w", i, err)
  1004  			}
  1005  		}
  1006  		return res, nil
  1007  	}(arr[index])
  1008  	if err != nil {
  1009  		return fmt.Errorf("field Methods: %w", err)
  1010  	}
  1011  
  1012  	return nil
  1013  }
  1014  
  1015  // itemToStructsInternal converts stack item into *StructsInternal.
  1016  func itemToStructsInternal(item stackitem.Item, err error) (*StructsInternal, error) {
  1017  	if err != nil {
  1018  		return nil, err
  1019  	}
  1020  	var res = new(StructsInternal)
  1021  	err = res.FromStackItem(item)
  1022  	return res, err
  1023  }
  1024  
  1025  // FromStackItem retrieves fields of StructsInternal from the given
  1026  // [stackitem.Item] or returns an error if it's not possible to do to so.
  1027  func (res *StructsInternal) FromStackItem(item stackitem.Item) error {
  1028  	arr, ok := item.Value().([]stackitem.Item)
  1029  	if !ok {
  1030  		return errors.New("not an array")
  1031  	}
  1032  	if len(arr) != 14 {
  1033  		return errors.New("wrong number of structure elements")
  1034  	}
  1035  
  1036  	var (
  1037  		index = -1
  1038  		err   error
  1039  	)
  1040  	index++
  1041  	res.Bool, err = arr[index].TryBool()
  1042  	if err != nil {
  1043  		return fmt.Errorf("field Bool: %w", err)
  1044  	}
  1045  
  1046  	index++
  1047  	res.Int, err = arr[index].TryInteger()
  1048  	if err != nil {
  1049  		return fmt.Errorf("field Int: %w", err)
  1050  	}
  1051  
  1052  	index++
  1053  	res.Bytes, err = arr[index].TryBytes()
  1054  	if err != nil {
  1055  		return fmt.Errorf("field Bytes: %w", err)
  1056  	}
  1057  
  1058  	index++
  1059  	res.String, err = func(item stackitem.Item) (string, error) {
  1060  		b, err := item.TryBytes()
  1061  		if err != nil {
  1062  			return "", err
  1063  		}
  1064  		if !utf8.Valid(b) {
  1065  			return "", errors.New("not a UTF-8 string")
  1066  		}
  1067  		return string(b), nil
  1068  	}(arr[index])
  1069  	if err != nil {
  1070  		return fmt.Errorf("field String: %w", err)
  1071  	}
  1072  
  1073  	index++
  1074  	res.H160, err = func(item stackitem.Item) (util.Uint160, error) {
  1075  		b, err := item.TryBytes()
  1076  		if err != nil {
  1077  			return util.Uint160{}, err
  1078  		}
  1079  		u, err := util.Uint160DecodeBytesBE(b)
  1080  		if err != nil {
  1081  			return util.Uint160{}, err
  1082  		}
  1083  		return u, nil
  1084  	}(arr[index])
  1085  	if err != nil {
  1086  		return fmt.Errorf("field H160: %w", err)
  1087  	}
  1088  
  1089  	index++
  1090  	res.H256, err = func(item stackitem.Item) (util.Uint256, error) {
  1091  		b, err := item.TryBytes()
  1092  		if err != nil {
  1093  			return util.Uint256{}, err
  1094  		}
  1095  		u, err := util.Uint256DecodeBytesBE(b)
  1096  		if err != nil {
  1097  			return util.Uint256{}, err
  1098  		}
  1099  		return u, nil
  1100  	}(arr[index])
  1101  	if err != nil {
  1102  		return fmt.Errorf("field H256: %w", err)
  1103  	}
  1104  
  1105  	index++
  1106  	res.PK, err = func(item stackitem.Item) (*keys.PublicKey, error) {
  1107  		b, err := item.TryBytes()
  1108  		if err != nil {
  1109  			return nil, err
  1110  		}
  1111  		k, err := keys.NewPublicKeyFromBytes(b, elliptic.P256())
  1112  		if err != nil {
  1113  			return nil, err
  1114  		}
  1115  		return k, nil
  1116  	}(arr[index])
  1117  	if err != nil {
  1118  		return fmt.Errorf("field PK: %w", err)
  1119  	}
  1120  
  1121  	index++
  1122  	res.PubKey, err = func(item stackitem.Item) (*keys.PublicKey, error) {
  1123  		b, err := item.TryBytes()
  1124  		if err != nil {
  1125  			return nil, err
  1126  		}
  1127  		k, err := keys.NewPublicKeyFromBytes(b, elliptic.P256())
  1128  		if err != nil {
  1129  			return nil, err
  1130  		}
  1131  		return k, nil
  1132  	}(arr[index])
  1133  	if err != nil {
  1134  		return fmt.Errorf("field PubKey: %w", err)
  1135  	}
  1136  
  1137  	index++
  1138  	res.Sign, err = arr[index].TryBytes()
  1139  	if err != nil {
  1140  		return fmt.Errorf("field Sign: %w", err)
  1141  	}
  1142  
  1143  	index++
  1144  	res.ArrOfBytes, err = func(item stackitem.Item) ([][]byte, error) {
  1145  		arr, ok := item.Value().([]stackitem.Item)
  1146  		if !ok {
  1147  			return nil, errors.New("not an array")
  1148  		}
  1149  		res := make([][]byte, len(arr))
  1150  		for i := range res {
  1151  			res[i], err = arr[i].TryBytes()
  1152  			if err != nil {
  1153  				return nil, fmt.Errorf("item %d: %w", i, err)
  1154  			}
  1155  		}
  1156  		return res, nil
  1157  	}(arr[index])
  1158  	if err != nil {
  1159  		return fmt.Errorf("field ArrOfBytes: %w", err)
  1160  	}
  1161  
  1162  	index++
  1163  	res.ArrOfH160, err = func(item stackitem.Item) ([]util.Uint160, error) {
  1164  		arr, ok := item.Value().([]stackitem.Item)
  1165  		if !ok {
  1166  			return nil, errors.New("not an array")
  1167  		}
  1168  		res := make([]util.Uint160, len(arr))
  1169  		for i := range res {
  1170  			res[i], err = func(item stackitem.Item) (util.Uint160, error) {
  1171  				b, err := item.TryBytes()
  1172  				if err != nil {
  1173  					return util.Uint160{}, err
  1174  				}
  1175  				u, err := util.Uint160DecodeBytesBE(b)
  1176  				if err != nil {
  1177  					return util.Uint160{}, err
  1178  				}
  1179  				return u, nil
  1180  			}(arr[i])
  1181  			if err != nil {
  1182  				return nil, fmt.Errorf("item %d: %w", i, err)
  1183  			}
  1184  		}
  1185  		return res, nil
  1186  	}(arr[index])
  1187  	if err != nil {
  1188  		return fmt.Errorf("field ArrOfH160: %w", err)
  1189  	}
  1190  
  1191  	index++
  1192  	res.Map, err = func(item stackitem.Item) (map[*big.Int]keys.PublicKeys, error) {
  1193  		m, ok := item.Value().([]stackitem.MapElement)
  1194  		if !ok {
  1195  			return nil, fmt.Errorf("%s is not a map", item.Type().String())
  1196  		}
  1197  		res := make(map[*big.Int]keys.PublicKeys)
  1198  		for i := range m {
  1199  			k, err := m[i].Key.TryInteger()
  1200  			if err != nil {
  1201  				return nil, fmt.Errorf("key %d: %w", i, err)
  1202  			}
  1203  			v, err := func(item stackitem.Item) (keys.PublicKeys, error) {
  1204  				arr, ok := item.Value().([]stackitem.Item)
  1205  				if !ok {
  1206  					return nil, errors.New("not an array")
  1207  				}
  1208  				res := make(keys.PublicKeys, len(arr))
  1209  				for i := range res {
  1210  					res[i], err = func(item stackitem.Item) (*keys.PublicKey, error) {
  1211  						b, err := item.TryBytes()
  1212  						if err != nil {
  1213  							return nil, err
  1214  						}
  1215  						k, err := keys.NewPublicKeyFromBytes(b, elliptic.P256())
  1216  						if err != nil {
  1217  							return nil, err
  1218  						}
  1219  						return k, nil
  1220  					}(arr[i])
  1221  					if err != nil {
  1222  						return nil, fmt.Errorf("item %d: %w", i, err)
  1223  					}
  1224  				}
  1225  				return res, nil
  1226  			}(m[i].Value)
  1227  			if err != nil {
  1228  				return nil, fmt.Errorf("value %d: %w", i, err)
  1229  			}
  1230  			res[k] = v
  1231  		}
  1232  		return res, nil
  1233  	}(arr[index])
  1234  	if err != nil {
  1235  		return fmt.Errorf("field Map: %w", err)
  1236  	}
  1237  
  1238  	index++
  1239  	res.Struct, err = itemToStructsInternal(arr[index], nil)
  1240  	if err != nil {
  1241  		return fmt.Errorf("field Struct: %w", err)
  1242  	}
  1243  
  1244  	index++
  1245  	res.UnexportedField, err = arr[index].TryInteger()
  1246  	if err != nil {
  1247  		return fmt.Errorf("field UnexportedField: %w", err)
  1248  	}
  1249  
  1250  	return nil
  1251  }