github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/core/state/deposit.go (about) 1 package state 2 3 import ( 4 "errors" 5 "fmt" 6 "math" 7 "math/big" 8 9 "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" 10 ) 11 12 // Deposit represents GAS deposit from a Notary contract. 13 type Deposit struct { 14 Amount *big.Int 15 Till uint32 16 } 17 18 // ToStackItem implements stackitem.Convertible interface. It never returns an 19 // error. 20 func (d *Deposit) ToStackItem() (stackitem.Item, error) { 21 return stackitem.NewStruct([]stackitem.Item{ 22 stackitem.NewBigInteger(d.Amount), 23 stackitem.Make(d.Till), 24 }), nil 25 } 26 27 // FromStackItem implements stackitem.Convertible interface. 28 func (d *Deposit) FromStackItem(it stackitem.Item) error { 29 items, ok := it.Value().([]stackitem.Item) 30 if !ok { 31 return errors.New("not a struct") 32 } 33 if len(items) != 2 { 34 return errors.New("wrong number of elements") 35 } 36 amount, err := items[0].TryInteger() 37 if err != nil { 38 return fmt.Errorf("invalid amount: %w", err) 39 } 40 till, err := items[1].TryInteger() 41 if err != nil { 42 return fmt.Errorf("invalid till: %w", err) 43 } 44 tiu64 := till.Uint64() 45 if !till.IsUint64() || tiu64 > math.MaxUint32 { 46 return errors.New("wrong till value") 47 } 48 d.Amount = amount 49 d.Till = uint32(tiu64) 50 return nil 51 }