mirror of https://github.com/lightninglabs/loop
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.
112 lines
2.3 KiB
Go
112 lines
2.3 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
|
|
|
|
// 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
|
|
|
|
// WithdrawalSweepAddress is the address that is used to
|
|
// cooperatively sweep the deposit to before it is expired.
|
|
WithdrawalSweepAddress string
|
|
|
|
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
|
|
}
|