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 }