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 }