github.com/MetalBlockchain/metalgo@v1.11.9/vms/platformvm/stakeable/stakeable_lock.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package stakeable
     5  
     6  import (
     7  	"errors"
     8  
     9  	"github.com/MetalBlockchain/metalgo/vms/components/avax"
    10  )
    11  
    12  var (
    13  	errInvalidLocktime      = errors.New("invalid locktime")
    14  	errNestedStakeableLocks = errors.New("shouldn't nest stakeable locks")
    15  )
    16  
    17  type LockOut struct {
    18  	Locktime             uint64 `serialize:"true" json:"locktime"`
    19  	avax.TransferableOut `serialize:"true" json:"output"`
    20  }
    21  
    22  func (s *LockOut) Addresses() [][]byte {
    23  	if addressable, ok := s.TransferableOut.(avax.Addressable); ok {
    24  		return addressable.Addresses()
    25  	}
    26  	return nil
    27  }
    28  
    29  func (s *LockOut) Verify() error {
    30  	if s.Locktime == 0 {
    31  		return errInvalidLocktime
    32  	}
    33  	if _, nested := s.TransferableOut.(*LockOut); nested {
    34  		return errNestedStakeableLocks
    35  	}
    36  	return s.TransferableOut.Verify()
    37  }
    38  
    39  type LockIn struct {
    40  	Locktime            uint64 `serialize:"true" json:"locktime"`
    41  	avax.TransferableIn `serialize:"true" json:"input"`
    42  }
    43  
    44  func (s *LockIn) Verify() error {
    45  	if s.Locktime == 0 {
    46  		return errInvalidLocktime
    47  	}
    48  	if _, nested := s.TransferableIn.(*LockIn); nested {
    49  		return errNestedStakeableLocks
    50  	}
    51  	return s.TransferableIn.Verify()
    52  }