Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
184 changes: 49 additions & 135 deletions staticaddr/loopin/actions.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"github.com/btcsuite/btcd/btcec/v2/schnorr/musig2"
"github.com/btcsuite/btcd/btcutil"
"github.com/btcsuite/btcd/txscript"
"github.com/btcsuite/btcd/wire"
"github.com/btcsuite/btcwallet/chain"
"github.com/lightninglabs/lndclient"
"github.com/lightninglabs/loop"
Expand Down Expand Up @@ -804,152 +805,65 @@ func (f *FSM) FetchSignPushSweeplessSweepTxAction(ctx context.Context,
f.Warnf("unable to decode sweep address: %v", err)
}

// Standard fee.
feeRate := chainfee.SatPerKWeight(fetchResp.StandardFeeInfo.FeeRate)
serverNonces, err := toNonces(fetchResp.StandardFeeInfo.Nonces)
if err != nil {
err = fmt.Errorf("unable to convert server nonces: %w", err)

return f.HandleError(err)
}

// High fee.
highFeeRate := chainfee.SatPerKWeight(fetchResp.HighFeeInfo.FeeRate)
serverHighFeeNonces, err := toNonces(fetchResp.HighFeeInfo.Nonces)
if err != nil {
err = fmt.Errorf("unable to convert high fee server "+
"nonces: %w", err)

return f.HandleError(err)
}

// Extremely high fee.
extremeFeeRate := chainfee.SatPerKWeight(
fetchResp.ExtremeFeeInfo.FeeRate,
)
serverExtremeNonces, err := toNonces(
fetchResp.ExtremeFeeInfo.Nonces,
)
if err != nil {
err = fmt.Errorf("unable to convert extremely high fee "+
"server nonces: %w", err)

return f.HandleError(err)
}

// Standard sessions.
sessions, nonces, err := f.loopIn.createMusig2Sessions(
ctx, f.cfg.Signer,
)
if err != nil {
return f.HandleError(err)
}
clientNonces, err := toNonces(nonces)
if err != nil {
return f.HandleError(err)
}

// High fee sessions.
highFeeSessions, highFeeClientNonces, err :=
f.loopIn.createMusig2Sessions(ctx, f.cfg.Signer)

if err != nil {
return f.HandleError(err)
}
highClientNonces, err := toNonces(highFeeClientNonces)
if err != nil {
return f.HandleError(err)
}

// Extremely high sessions.
extremeSessions, extremeClientNonces, err :=
f.loopIn.createMusig2Sessions(ctx, f.cfg.Signer)

if err != nil {
return f.HandleError(err)
}
extremelyHighClientNonces, err := toNonces(extremeClientNonces)
if err != nil {
return f.HandleError(err)
}
clientResponse := make(map[uint64]*looprpc.ClientSweeplessSigningInfo)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I propose to preallocate the space in the map:

clientResponse := make(
  map[uint64]*looprpc.ClientSweeplessSigningInfo,
  len(fetchResp.FeeRateToNonces),
)


// Create standard fee.
sweepTx, err := f.loopIn.createSweeplessSweepTx(address, feeRate)
if err != nil {
err = fmt.Errorf("unable to create sweepless sweep tx: %w", err)
return f.HandleError(err)
}

// Create high fee.
highFeeSweepTx, err := f.loopIn.createSweeplessSweepTx(
address, highFeeRate,
var (
nonces [][]byte
clientNonces [][musig2.PubNonceSize]byte
serverNonces [][musig2.PubNonceSize]byte
sessions []*input.MuSig2SessionInfo
sweepTx *wire.MsgTx
sweeplessClientSigs [][]byte
)
if err != nil {
err = fmt.Errorf("unable to create high fee sweepless sweep "+
"tx: %w", err)

return f.HandleError(err)
}

// Create extremely high fee.
extremelyHighFeeSweepTx, err := f.loopIn.createSweeplessSweepTx(
address, extremeFeeRate,
)
if err != nil {
err = fmt.Errorf("unable to create extremely high fee "+
"sweepless sweep tx: %w", err)

return f.HandleError(err)
}
for feeRate, serverInfo := range fetchResp.FeeRateToNonces {
satPerKW := chainfee.SatPerKWeight(feeRate)
serverNonces, err = toNonces(serverInfo.Nonces)
if err != nil {
err = fmt.Errorf("unable to convert server nonces: %w",
err)
return f.HandleError(err)
}

// Sign standard.
sweeplessClientSigs, err := f.loopIn.signMusig2Tx(
ctx, sweepTx, f.cfg.Signer, sessions, serverNonces,
)
if err != nil {
err = fmt.Errorf("unable to sign sweepless sweep tx: %w", err)
return f.HandleError(err)
}
sessions, nonces, err = f.loopIn.createMusig2Sessions(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think, resources represented by sessions leak in the signer. We should close them. It is not related to this PR, therefore let's add TODO here to clean sessions in the future.

ctx, f.cfg.Signer,
)
if err != nil {
return f.HandleError(err)
}

// Sign high fee.
highFeeSigs, err := f.loopIn.signMusig2Tx(
ctx, highFeeSweepTx, f.cfg.Signer, highFeeSessions,
serverHighFeeNonces,
)
if err != nil {
err = fmt.Errorf("unable to sign high fee sweepless sweep "+
"tx: %w", err)
clientNonces, err = toNonces(nonces)
if err != nil {
return f.HandleError(err)
}

return f.HandleError(err)
}
sweepTx, err = f.loopIn.createSweeplessSweepTx(
address, satPerKW,
)
if err != nil {
err = fmt.Errorf("unable to create sweepless sweep "+
"tx: %w", err)
return f.HandleError(err)
}

// Sign extremely high fee.
extremelyHighSigs, err := f.loopIn.signMusig2Tx(
ctx, extremelyHighFeeSweepTx, f.cfg.Signer, extremeSessions,
serverExtremeNonces,
)
if err != nil {
err = fmt.Errorf("unable to sign extremely high fee "+
"sweepless sweep tx: %w", err)
sweeplessClientSigs, err = f.loopIn.signMusig2Tx(
ctx, sweepTx, f.cfg.Signer, sessions, serverNonces,
)
if err != nil {
err = fmt.Errorf("unable to sign sweepless sweep tx: "+
"%w", err)
return f.HandleError(err)
}

return f.HandleError(err)
clientResponse[feeRate] = &looprpc.ClientSweeplessSigningInfo{
Nonces: fromNonces(clientNonces),
Sigs: sweeplessClientSigs,
}
}

// Push sweepless sigs to the server.
req := &looprpc.PushStaticAddressSweeplessSigsRequest{
SwapHash: f.loopIn.SwapHash[:],
StandardSigningInfo: &looprpc.ClientSweeplessSigningInfo{
Nonces: fromNonces(clientNonces),
Sigs: sweeplessClientSigs,
},
HighFeeSigningInfo: &looprpc.ClientSweeplessSigningInfo{
Nonces: fromNonces(highClientNonces),
Sigs: highFeeSigs,
},
ExtremeFeeSigningInfo: &looprpc.ClientSweeplessSigningInfo{
Nonces: fromNonces(extremelyHighClientNonces),
Sigs: extremelyHighSigs,
},
SwapHash: f.loopIn.SwapHash[:],
SigningInfo: clientResponse,
}
_, err = f.cfg.Server.PushStaticAddressSweeplessSigs(ctx, req)
if err != nil {
Expand Down
Loading
Loading