You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
loop/staticaddr/deposit/deposit.go

108 lines
2.1 KiB
Go

package deposit
import (
"crypto/rand"
"fmt"
"sync"
"github.com/btcsuite/btcd/btcutil"
"github.com/btcsuite/btcd/chaincfg/chainhash"
"github.com/btcsuite/btcd/wire"
"github.com/lightninglabs/loop/fsm"
)
// ID is a unique identifier for a deposit.
type ID [IdLength]byte
// FromByteSlice creates a deposit id from a byte slice.
func (r *ID) FromByteSlice(b []byte) error {
if len(b) != IdLength {
return fmt.Errorf("deposit id must be 32 bytes, got %d, %x",
len(b), b)
}
copy(r[:], b)
return nil
}
// Deposit bundles an utxo at a static address together with manager-relevant
// data.
type Deposit struct {
// ID is the unique identifier of the deposit.
ID ID
// State is the current state of the deposit.
State fsm.StateType
// The outpoint of the deposit.
wire.OutPoint
// Value is the amount of the deposit.
Value btcutil.Amount
// ConfirmationHeight is the absolute height at which the deposit was
// first confirmed.
ConfirmationHeight int64
// TimeOutSweepPkScript is the pk script that is used to sweep the
// deposit to after it is expired.
TimeOutSweepPkScript []byte
// ExpirySweepTxid is the transaction id of the expiry sweep.
ExpirySweepTxid chainhash.Hash
sync.Mutex
}
// IsInPendingState returns true if the deposit is pending.
func (d *Deposit) IsInPendingState() bool {
d.Lock()
defer d.Unlock()
return !d.IsInFinalState()
}
// IsInFinalState returns true if the deposit is final.
func (d *Deposit) IsInFinalState() bool {
d.Lock()
defer d.Unlock()
return d.State == Expired || d.State == Failed
}
func (d *Deposit) isExpired(currentHeight, expiry uint32) bool {
d.Lock()
defer d.Unlock()
return currentHeight >= uint32(d.ConfirmationHeight)+expiry
}
func (d *Deposit) getState() fsm.StateType {
d.Lock()
defer d.Unlock()
return d.State
}
func (d *Deposit) setState(state fsm.StateType) {
d.Lock()
defer d.Unlock()
d.State = state
}
func (d *Deposit) isInState(state fsm.StateType) bool {
d.Lock()
defer d.Unlock()
return d.State == state
}
// GetRandomDepositID generates a random deposit ID.
func GetRandomDepositID() (ID, error) {
var id ID
_, err := rand.Read(id[:])
return id, err
}