multi: add coin selection strategy option to all on-chain rpcs
In this commit, we add the coin selection strategy option to the following on-chain RPCs `fundpsbt`, `batchopenchannel`, `estimatefee`, `sendcoins`, `sendmany`, and `sendoutputs`.
This commit is contained in:
11 files changed
+107
-40
No files matched your search
@@ -978,8 +978,8 @@ func (b *BtcWallet) ImportTaprootScript(scope waddrmgr.KeyScope,
|
||||
//
|
||||
// This is a part of the WalletController interface.
|
||||
func (b *BtcWallet) SendOutputs(outputs []*wire.TxOut,
|
||||
feeRate chainfee.SatPerKWeight, minConfs int32,
|
||||
label string) (*wire.MsgTx, error) {
|
||||
feeRate chainfee.SatPerKWeight, minConfs int32, label string,
|
||||
strategy base.CoinSelectionStrategy) (*wire.MsgTx, error) {
|
||||
|
||||
// Convert our fee rate from sat/kw to sat/kb since it's required by
|
||||
// SendOutputs.
|
||||
@@ -997,7 +997,7 @@ func (b *BtcWallet) SendOutputs(outputs []*wire.TxOut,
|
||||
|
||||
return b.wallet.SendOutputs(
|
||||
outputs, nil, defaultAccount, minConfs, feeSatPerKB,
|
||||
b.cfg.CoinSelectionStrategy, label,
|
||||
strategy, label,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1016,6 +1016,7 @@ func (b *BtcWallet) SendOutputs(outputs []*wire.TxOut,
|
||||
// This is a part of the WalletController interface.
|
||||
func (b *BtcWallet) CreateSimpleTx(outputs []*wire.TxOut,
|
||||
feeRate chainfee.SatPerKWeight, minConfs int32,
|
||||
strategy base.CoinSelectionStrategy,
|
||||
dryRun bool) (*txauthor.AuthoredTx, error) {
|
||||
|
||||
// The fee rate is passed in using units of sat/kw, so we'll convert
|
||||
@@ -1048,7 +1049,7 @@ func (b *BtcWallet) CreateSimpleTx(outputs []*wire.TxOut,
|
||||
|
||||
return b.wallet.CreateSimpleTx(
|
||||
nil, defaultAccount, outputs, minConfs, feeSatPerKB,
|
||||
b.cfg.CoinSelectionStrategy, dryRun,
|
||||
strategy, dryRun,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -73,7 +73,8 @@ var (
|
||||
// This is a part of the WalletController interface.
|
||||
func (b *BtcWallet) FundPsbt(packet *psbt.Packet, minConfs int32,
|
||||
feeRate chainfee.SatPerKWeight, accountName string,
|
||||
changeScope *waddrmgr.KeyScope) (int32, error) {
|
||||
changeScope *waddrmgr.KeyScope,
|
||||
strategy wallet.CoinSelectionStrategy) (int32, error) {
|
||||
|
||||
// The fee rate is passed in using units of sat/kw, so we'll convert
|
||||
// this to sat/KB as the CreateSimpleTx method requires this unit.
|
||||
@@ -134,7 +135,7 @@ func (b *BtcWallet) FundPsbt(packet *psbt.Packet, minConfs int32,
|
||||
// the partial TX information in the packet.
|
||||
return b.wallet.FundPsbt(
|
||||
packet, keyScope, minConfs, accountNum, feeSatPerKB,
|
||||
b.cfg.CoinSelectionStrategy, opts...,
|
||||
strategy, opts...,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -345,7 +345,8 @@ type WalletController interface {
|
||||
//
|
||||
// NOTE: This method requires the global coin selection lock to be held.
|
||||
SendOutputs(outputs []*wire.TxOut, feeRate chainfee.SatPerKWeight,
|
||||
minConfs int32, label string) (*wire.MsgTx, error)
|
||||
minConfs int32, label string,
|
||||
strategy base.CoinSelectionStrategy) (*wire.MsgTx, error)
|
||||
|
||||
// CreateSimpleTx creates a Bitcoin transaction paying to the specified
|
||||
// outputs. The transaction is not broadcasted to the network. In the
|
||||
@@ -360,7 +361,8 @@ type WalletController interface {
|
||||
//
|
||||
// NOTE: This method requires the global coin selection lock to be held.
|
||||
CreateSimpleTx(outputs []*wire.TxOut, feeRate chainfee.SatPerKWeight,
|
||||
minConfs int32, dryRun bool) (*txauthor.AuthoredTx, error)
|
||||
minConfs int32, strategy base.CoinSelectionStrategy,
|
||||
dryRun bool) (*txauthor.AuthoredTx, error)
|
||||
|
||||
// GetTransactionDetails returns a detailed description of a transaction
|
||||
// given its transaction hash.
|
||||
@@ -465,7 +467,8 @@ type WalletController interface {
|
||||
// to lock the inputs before handing them out.
|
||||
FundPsbt(packet *psbt.Packet, minConfs int32,
|
||||
feeRate chainfee.SatPerKWeight, account string,
|
||||
changeScope *waddrmgr.KeyScope) (int32, error)
|
||||
changeScope *waddrmgr.KeyScope,
|
||||
strategy base.CoinSelectionStrategy) (int32, error)
|
||||
|
||||
// SignPsbt expects a partial transaction with all inputs and outputs
|
||||
// fully declared and tries to sign all unsigned inputs that have all
|
||||
|
||||
+6
-3
@@ -146,14 +146,16 @@ func (w *mockWalletController) ImportTaprootScript(waddrmgr.KeyScope,
|
||||
|
||||
// SendOutputs currently returns dummy values.
|
||||
func (w *mockWalletController) SendOutputs([]*wire.TxOut,
|
||||
chainfee.SatPerKWeight, int32, string) (*wire.MsgTx, error) {
|
||||
chainfee.SatPerKWeight, int32, string,
|
||||
base.CoinSelectionStrategy) (*wire.MsgTx, error) {
|
||||
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// CreateSimpleTx currently returns dummy values.
|
||||
func (w *mockWalletController) CreateSimpleTx([]*wire.TxOut,
|
||||
chainfee.SatPerKWeight, int32, bool) (*txauthor.AuthoredTx, error) {
|
||||
chainfee.SatPerKWeight, int32, base.CoinSelectionStrategy,
|
||||
bool) (*txauthor.AuthoredTx, error) {
|
||||
|
||||
return nil, nil
|
||||
}
|
||||
@@ -214,7 +216,8 @@ func (w *mockWalletController) ListLeasedOutputs() (
|
||||
|
||||
// FundPsbt currently does nothing.
|
||||
func (w *mockWalletController) FundPsbt(*psbt.Packet, int32,
|
||||
chainfee.SatPerKWeight, string, *waddrmgr.KeyScope) (int32, error) {
|
||||
chainfee.SatPerKWeight, string, *waddrmgr.KeyScope,
|
||||
base.CoinSelectionStrategy) (int32, error) {
|
||||
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
@@ -121,11 +121,11 @@ func (r *RPCKeyRing) NewAddress(addrType lnwallet.AddressType, change bool,
|
||||
//
|
||||
// NOTE: This method only signs with BIP49/84 keys.
|
||||
func (r *RPCKeyRing) SendOutputs(outputs []*wire.TxOut,
|
||||
feeRate chainfee.SatPerKWeight, minConfs int32,
|
||||
label string) (*wire.MsgTx, error) {
|
||||
feeRate chainfee.SatPerKWeight, minConfs int32, label string,
|
||||
strategy basewallet.CoinSelectionStrategy) (*wire.MsgTx, error) {
|
||||
|
||||
tx, err := r.WalletController.SendOutputs(
|
||||
outputs, feeRate, minConfs, label,
|
||||
outputs, feeRate, minConfs, label, strategy,
|
||||
)
|
||||
if err != nil && err != basewallet.ErrTxUnsigned {
|
||||
return nil, err
|
||||
|
||||
@@ -170,6 +170,7 @@ func sendCoins(t *testing.T, miner *rpctest.Harness,
|
||||
|
||||
tx, err := sender.SendOutputs(
|
||||
[]*wire.TxOut{output}, feeRate, minConf, labels.External,
|
||||
sender.Cfg.CoinSelectionStrategy,
|
||||
)
|
||||
require.NoError(t, err, "unable to send transaction")
|
||||
|
||||
@@ -1189,6 +1190,7 @@ func testListTransactionDetails(miner *rpctest.Harness,
|
||||
burnOutput := wire.NewTxOut(outputAmt, outputScript)
|
||||
burnTX, err := alice.SendOutputs(
|
||||
[]*wire.TxOut{burnOutput}, 2500, 1, labels.External,
|
||||
alice.Cfg.CoinSelectionStrategy,
|
||||
)
|
||||
require.NoError(t, err, "unable to create burn tx")
|
||||
burnTXID := burnTX.TxHash()
|
||||
@@ -1448,6 +1450,7 @@ func testTransactionSubscriptions(miner *rpctest.Harness,
|
||||
burnOutput := wire.NewTxOut(outputAmt, outputScript)
|
||||
tx, err := alice.SendOutputs(
|
||||
[]*wire.TxOut{burnOutput}, 2500, 1, labels.External,
|
||||
alice.Cfg.CoinSelectionStrategy,
|
||||
)
|
||||
require.NoError(t, err, "unable to create tx")
|
||||
txid := tx.TxHash()
|
||||
@@ -1636,6 +1639,7 @@ func newTx(t *testing.T, r *rpctest.Harness, pubKey *btcec.PublicKey,
|
||||
}
|
||||
tx, err := alice.SendOutputs(
|
||||
[]*wire.TxOut{newOutput}, 2500, 1, labels.External,
|
||||
alice.Cfg.CoinSelectionStrategy,
|
||||
)
|
||||
require.NoError(t, err, "unable to create output")
|
||||
|
||||
@@ -1951,6 +1955,7 @@ func testSignOutputUsingTweaks(r *rpctest.Harness,
|
||||
}
|
||||
tx, err := alice.SendOutputs(
|
||||
[]*wire.TxOut{newOutput}, 2500, 1, labels.External,
|
||||
alice.Cfg.CoinSelectionStrategy,
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to create output: %v", err)
|
||||
@@ -2069,6 +2074,7 @@ func testReorgWalletBalance(r *rpctest.Harness, w *lnwallet.LightningWallet,
|
||||
}
|
||||
tx, err := w.SendOutputs(
|
||||
[]*wire.TxOut{output}, 2500, 1, labels.External,
|
||||
w.Cfg.CoinSelectionStrategy,
|
||||
)
|
||||
require.NoError(t, err, "unable to send outputs")
|
||||
txid := tx.TxHash()
|
||||
@@ -2293,6 +2299,7 @@ func testSpendUnconfirmed(miner *rpctest.Harness,
|
||||
}
|
||||
_, err = bob.SendOutputs(
|
||||
[]*wire.TxOut{output}, txFeeRate, 0, labels.External,
|
||||
bob.Cfg.CoinSelectionStrategy,
|
||||
)
|
||||
if err == nil {
|
||||
t.Fatalf("should have not been able to pay due to insufficient balance: %v", err)
|
||||
@@ -2319,6 +2326,7 @@ func testSpendUnconfirmed(miner *rpctest.Harness,
|
||||
// using confirmed outputs only.
|
||||
_, err = bob.SendOutputs(
|
||||
[]*wire.TxOut{output}, txFeeRate, 1, labels.External,
|
||||
bob.Cfg.CoinSelectionStrategy,
|
||||
)
|
||||
if err == nil {
|
||||
t.Fatalf("should have not been able to pay due to insufficient balance: %v", err)
|
||||
@@ -2559,7 +2567,8 @@ func testCreateSimpleTx(r *rpctest.Harness, w *lnwallet.LightningWallet,
|
||||
|
||||
// Now try creating a tx spending to these outputs.
|
||||
createTx, createErr := w.CreateSimpleTx(
|
||||
outputs, feeRate, minConfs, true,
|
||||
outputs, feeRate, minConfs,
|
||||
w.Cfg.CoinSelectionStrategy, true,
|
||||
)
|
||||
switch {
|
||||
case test.valid && createErr != nil:
|
||||
@@ -2578,6 +2587,7 @@ func testCreateSimpleTx(r *rpctest.Harness, w *lnwallet.LightningWallet,
|
||||
// that the change output position might be different.
|
||||
tx, sendErr := w.SendOutputs(
|
||||
outputs, feeRate, minConfs, labels.External,
|
||||
w.Cfg.CoinSelectionStrategy,
|
||||
)
|
||||
switch {
|
||||
case test.valid && sendErr != nil:
|
||||
|
||||
Reference in new issue
Block a user