|
5 | 5 | "crypto/rand" |
6 | 6 | "errors" |
7 | 7 | "fmt" |
| 8 | + "github.com/btcsuite/btcd/wire" |
8 | 9 | "strings" |
9 | 10 | "time" |
10 | 11 |
|
@@ -804,152 +805,65 @@ func (f *FSM) FetchSignPushSweeplessSweepTxAction(ctx context.Context, |
804 | 805 | f.Warnf("unable to decode sweep address: %v", err) |
805 | 806 | } |
806 | 807 |
|
807 | | - // Standard fee. |
808 | | - feeRate := chainfee.SatPerKWeight(fetchResp.StandardFeeInfo.FeeRate) |
809 | | - serverNonces, err := toNonces(fetchResp.StandardFeeInfo.Nonces) |
810 | | - if err != nil { |
811 | | - err = fmt.Errorf("unable to convert server nonces: %w", err) |
812 | | - |
813 | | - return f.HandleError(err) |
814 | | - } |
815 | | - |
816 | | - // High fee. |
817 | | - highFeeRate := chainfee.SatPerKWeight(fetchResp.HighFeeInfo.FeeRate) |
818 | | - serverHighFeeNonces, err := toNonces(fetchResp.HighFeeInfo.Nonces) |
819 | | - if err != nil { |
820 | | - err = fmt.Errorf("unable to convert high fee server "+ |
821 | | - "nonces: %w", err) |
822 | | - |
823 | | - return f.HandleError(err) |
824 | | - } |
825 | | - |
826 | | - // Extremely high fee. |
827 | | - extremeFeeRate := chainfee.SatPerKWeight( |
828 | | - fetchResp.ExtremeFeeInfo.FeeRate, |
829 | | - ) |
830 | | - serverExtremeNonces, err := toNonces( |
831 | | - fetchResp.ExtremeFeeInfo.Nonces, |
832 | | - ) |
833 | | - if err != nil { |
834 | | - err = fmt.Errorf("unable to convert extremely high fee "+ |
835 | | - "server nonces: %w", err) |
836 | | - |
837 | | - return f.HandleError(err) |
838 | | - } |
839 | | - |
840 | | - // Standard sessions. |
841 | | - sessions, nonces, err := f.loopIn.createMusig2Sessions( |
842 | | - ctx, f.cfg.Signer, |
843 | | - ) |
844 | | - if err != nil { |
845 | | - return f.HandleError(err) |
846 | | - } |
847 | | - clientNonces, err := toNonces(nonces) |
848 | | - if err != nil { |
849 | | - return f.HandleError(err) |
850 | | - } |
851 | | - |
852 | | - // High fee sessions. |
853 | | - highFeeSessions, highFeeClientNonces, err := |
854 | | - f.loopIn.createMusig2Sessions(ctx, f.cfg.Signer) |
855 | | - |
856 | | - if err != nil { |
857 | | - return f.HandleError(err) |
858 | | - } |
859 | | - highClientNonces, err := toNonces(highFeeClientNonces) |
860 | | - if err != nil { |
861 | | - return f.HandleError(err) |
862 | | - } |
863 | | - |
864 | | - // Extremely high sessions. |
865 | | - extremeSessions, extremeClientNonces, err := |
866 | | - f.loopIn.createMusig2Sessions(ctx, f.cfg.Signer) |
867 | | - |
868 | | - if err != nil { |
869 | | - return f.HandleError(err) |
870 | | - } |
871 | | - extremelyHighClientNonces, err := toNonces(extremeClientNonces) |
872 | | - if err != nil { |
873 | | - return f.HandleError(err) |
874 | | - } |
| 808 | + clientResponse := make(map[uint64]*looprpc.ClientSweeplessSigningInfo) |
875 | 809 |
|
876 | | - // Create standard fee. |
877 | | - sweepTx, err := f.loopIn.createSweeplessSweepTx(address, feeRate) |
878 | | - if err != nil { |
879 | | - err = fmt.Errorf("unable to create sweepless sweep tx: %w", err) |
880 | | - return f.HandleError(err) |
881 | | - } |
882 | | - |
883 | | - // Create high fee. |
884 | | - highFeeSweepTx, err := f.loopIn.createSweeplessSweepTx( |
885 | | - address, highFeeRate, |
| 810 | + var ( |
| 811 | + nonces [][]byte |
| 812 | + clientNonces [][musig2.PubNonceSize]byte |
| 813 | + serverNonces [][musig2.PubNonceSize]byte |
| 814 | + sessions []*input.MuSig2SessionInfo |
| 815 | + sweepTx *wire.MsgTx |
| 816 | + sweeplessClientSigs [][]byte |
886 | 817 | ) |
887 | | - if err != nil { |
888 | | - err = fmt.Errorf("unable to create high fee sweepless sweep "+ |
889 | | - "tx: %w", err) |
890 | | - |
891 | | - return f.HandleError(err) |
892 | | - } |
893 | | - |
894 | | - // Create extremely high fee. |
895 | | - extremelyHighFeeSweepTx, err := f.loopIn.createSweeplessSweepTx( |
896 | | - address, extremeFeeRate, |
897 | | - ) |
898 | | - if err != nil { |
899 | | - err = fmt.Errorf("unable to create extremely high fee "+ |
900 | | - "sweepless sweep tx: %w", err) |
901 | | - |
902 | | - return f.HandleError(err) |
903 | | - } |
| 818 | + for feeRate, serverInfo := range fetchResp.FeeRateToNonces { |
| 819 | + satPerKW := chainfee.SatPerKWeight(feeRate) |
| 820 | + serverNonces, err = toNonces(serverInfo.Nonces) |
| 821 | + if err != nil { |
| 822 | + err = fmt.Errorf("unable to convert server nonces: %w", |
| 823 | + err) |
| 824 | + return f.HandleError(err) |
| 825 | + } |
904 | 826 |
|
905 | | - // Sign standard. |
906 | | - sweeplessClientSigs, err := f.loopIn.signMusig2Tx( |
907 | | - ctx, sweepTx, f.cfg.Signer, sessions, serverNonces, |
908 | | - ) |
909 | | - if err != nil { |
910 | | - err = fmt.Errorf("unable to sign sweepless sweep tx: %w", err) |
911 | | - return f.HandleError(err) |
912 | | - } |
| 827 | + sessions, nonces, err = f.loopIn.createMusig2Sessions( |
| 828 | + ctx, f.cfg.Signer, |
| 829 | + ) |
| 830 | + if err != nil { |
| 831 | + return f.HandleError(err) |
| 832 | + } |
913 | 833 |
|
914 | | - // Sign high fee. |
915 | | - highFeeSigs, err := f.loopIn.signMusig2Tx( |
916 | | - ctx, highFeeSweepTx, f.cfg.Signer, highFeeSessions, |
917 | | - serverHighFeeNonces, |
918 | | - ) |
919 | | - if err != nil { |
920 | | - err = fmt.Errorf("unable to sign high fee sweepless sweep "+ |
921 | | - "tx: %w", err) |
| 834 | + clientNonces, err = toNonces(nonces) |
| 835 | + if err != nil { |
| 836 | + return f.HandleError(err) |
| 837 | + } |
922 | 838 |
|
923 | | - return f.HandleError(err) |
924 | | - } |
| 839 | + sweepTx, err = f.loopIn.createSweeplessSweepTx( |
| 840 | + address, satPerKW, |
| 841 | + ) |
| 842 | + if err != nil { |
| 843 | + err = fmt.Errorf("unable to create sweepless sweep "+ |
| 844 | + "tx: %w", err) |
| 845 | + return f.HandleError(err) |
| 846 | + } |
925 | 847 |
|
926 | | - // Sign extremely high fee. |
927 | | - extremelyHighSigs, err := f.loopIn.signMusig2Tx( |
928 | | - ctx, extremelyHighFeeSweepTx, f.cfg.Signer, extremeSessions, |
929 | | - serverExtremeNonces, |
930 | | - ) |
931 | | - if err != nil { |
932 | | - err = fmt.Errorf("unable to sign extremely high fee "+ |
933 | | - "sweepless sweep tx: %w", err) |
| 848 | + sweeplessClientSigs, err = f.loopIn.signMusig2Tx( |
| 849 | + ctx, sweepTx, f.cfg.Signer, sessions, serverNonces, |
| 850 | + ) |
| 851 | + if err != nil { |
| 852 | + err = fmt.Errorf("unable to sign sweepless sweep tx: "+ |
| 853 | + "%w", err) |
| 854 | + return f.HandleError(err) |
| 855 | + } |
934 | 856 |
|
935 | | - return f.HandleError(err) |
| 857 | + clientResponse[feeRate] = &looprpc.ClientSweeplessSigningInfo{ |
| 858 | + Nonces: fromNonces(clientNonces), |
| 859 | + Sigs: sweeplessClientSigs, |
| 860 | + } |
936 | 861 | } |
937 | 862 |
|
938 | 863 | // Push sweepless sigs to the server. |
939 | 864 | req := &looprpc.PushStaticAddressSweeplessSigsRequest{ |
940 | | - SwapHash: f.loopIn.SwapHash[:], |
941 | | - StandardSigningInfo: &looprpc.ClientSweeplessSigningInfo{ |
942 | | - Nonces: fromNonces(clientNonces), |
943 | | - Sigs: sweeplessClientSigs, |
944 | | - }, |
945 | | - HighFeeSigningInfo: &looprpc.ClientSweeplessSigningInfo{ |
946 | | - Nonces: fromNonces(highClientNonces), |
947 | | - Sigs: highFeeSigs, |
948 | | - }, |
949 | | - ExtremeFeeSigningInfo: &looprpc.ClientSweeplessSigningInfo{ |
950 | | - Nonces: fromNonces(extremelyHighClientNonces), |
951 | | - Sigs: extremelyHighSigs, |
952 | | - }, |
| 865 | + SwapHash: f.loopIn.SwapHash[:], |
| 866 | + SigningInfo: clientResponse, |
953 | 867 | } |
954 | 868 | _, err = f.cfg.Server.PushStaticAddressSweeplessSigs(ctx, req) |
955 | 869 | if err != nil { |
|
0 commit comments