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  }