fcff17c336
This commit will allow the general public to build lnd without jumping through hoops setting up their local git branches nicely with all of our forks.
74 lines
2.1 KiB
Go
74 lines
2.1 KiB
Go
package lnwallet
|
|
|
|
import (
|
|
"encoding/hex"
|
|
|
|
"github.com/roasbeef/btcd/btcjson"
|
|
"github.com/roasbeef/btcd/wire"
|
|
"github.com/roasbeef/btcutil"
|
|
"github.com/roasbeef/btcutil/coinset"
|
|
)
|
|
|
|
// lnCoin represents a single unspet output. Its purpose is to convert a regular
|
|
// output to a struct adhering to the coinset.Coin interface
|
|
type lnCoin struct {
|
|
hash *wire.ShaHash
|
|
index uint32
|
|
value btcutil.Amount
|
|
pkScript []byte
|
|
numConfs int64
|
|
valueAge int64
|
|
}
|
|
|
|
func (l *lnCoin) Hash() *wire.ShaHash { return l.hash }
|
|
func (l *lnCoin) Index() uint32 { return l.index }
|
|
func (l *lnCoin) Value() btcutil.Amount { return l.value }
|
|
func (l *lnCoin) PkScript() []byte { return l.pkScript }
|
|
func (l *lnCoin) NumConfs() int64 { return l.numConfs }
|
|
func (l *lnCoin) ValueAge() int64 { return l.valueAge }
|
|
|
|
// Ensure lnCoin adheres to the coinset.Coin interface.
|
|
var _ coinset.Coin = (*lnCoin)(nil)
|
|
|
|
// newLnCoin creates a new "coin" from the passed output. Coins are required
|
|
// in order to perform coin selection upon.
|
|
func newLnCoin(output *btcjson.ListUnspentResult) (coinset.Coin, error) {
|
|
txid, err := wire.NewShaHashFromStr(output.TxID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
pkScript, err := hex.DecodeString(output.ScriptPubKey)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &lnCoin{
|
|
hash: txid,
|
|
// btcjson.ListUnspentResult shows the amount in BTC,
|
|
// translate into Satoshi so coin selection can work properly.
|
|
value: btcutil.Amount(output.Amount * 1e8),
|
|
index: output.Vout,
|
|
pkScript: pkScript,
|
|
numConfs: output.Confirmations,
|
|
// TODO(roasbeef): output.Amount should be a int64, damn json-RPC :/
|
|
valueAge: output.Confirmations * int64(output.Amount),
|
|
}, nil
|
|
}
|
|
|
|
// outputsToCoins converts a slice of transaction outputs to a coin-selectable
|
|
// slice of "Coins"s.
|
|
func outputsToCoins(outputs []*btcjson.ListUnspentResult) ([]coinset.Coin, error) {
|
|
coins := make([]coinset.Coin, len(outputs))
|
|
for i, output := range outputs {
|
|
coin, err := newLnCoin(output)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
coins[i] = coin
|
|
}
|
|
|
|
return coins, nil
|
|
}
|