From 7619dbcc212f22bc6b95ee74b8dda9fa43bf5b68 Mon Sep 17 00:00:00 2001
From: RafilxTenfen <rafaeltenfen.rt@gmail.com>
Date: Thu, 10 Oct 2024 17:12:32 -0300
Subject: [PATCH] chore: refactory signer signature handling

---
 keyring/signer.go | 90 +++++++++++++++++++++++++++++------------------
 1 file changed, 55 insertions(+), 35 deletions(-)

diff --git a/keyring/signer.go b/keyring/signer.go
index efe04ef..6ecea53 100644
--- a/keyring/signer.go
+++ b/keyring/signer.go
@@ -7,7 +7,9 @@ import (
 	"github.com/babylonlabs-io/babylon/btcstaking"
 	"github.com/babylonlabs-io/covenant-emulator/covenant"
 
+	asig "github.com/babylonlabs-io/babylon/crypto/schnorr-adaptor-signature"
 	"github.com/btcsuite/btcd/btcec/v2"
+	"github.com/btcsuite/btcd/btcec/v2/schnorr"
 	"github.com/btcsuite/btcd/chaincfg/chainhash"
 	secp "github.com/decred/dcrd/dcrec/secp256k1/v4"
 )
@@ -74,51 +76,21 @@ func (kcs KeyringSigner) SignTransactions(req covenant.SigningRequest) (*covenan
 	}
 
 	for stakingTxHash, signingTxReq := range req.SigningTxsReqByStkTxHash {
-		// for each signing tx request
-
 		slashSigs := make([][]byte, 0, len(signingTxReq.FpEncKeys))
 		slashUnbondingSigs := make([][]byte, 0, len(signingTxReq.FpEncKeys))
 		for _, fpEncKey := range signingTxReq.FpEncKeys {
-			// creates slash sigs
-			// TODO: split to diff func
-			slashSig, err := btcstaking.EncSignTxWithOneScriptSpendInputStrict(
-				signingTxReq.SlashingTx,
-				signingTxReq.StakingTx,
-				signingTxReq.StakingOutputIdx,
-				signingTxReq.SlashingPkScriptPath,
-				covenantPrivKey,
-				fpEncKey,
-			)
+			slashSig, slashUnbondingSig, err := slashUnbondSig(covenantPrivKey, signingTxReq, fpEncKey)
 			if err != nil {
-				return nil, fmt.Errorf("failed to sign adaptor slash signature with finality provider public key %s: %w", fpEncKey.ToBytes(), err)
+				return nil, err
 			}
-			slashSigs = append(slashSigs, slashSig.MustMarshal())
 
-			// TODO: split to diff func
-			// creates slash unbonding sig
-			slashUnbondingSig, err := btcstaking.EncSignTxWithOneScriptSpendInputStrict(
-				signingTxReq.SlashUnbondingTx,
-				signingTxReq.UnbondingTx,
-				0, // 0th output is always the unbonding script output
-				signingTxReq.UnbondingTxSlashingPkScriptPath,
-				covenantPrivKey,
-				fpEncKey,
-			)
-			if err != nil {
-				return nil, fmt.Errorf("failed to sign adaptor slash unbonding signature with finality provider public key %s: %w", fpEncKey.ToBytes(), err)
-			}
+			slashSigs = append(slashSigs, slashSig.MustMarshal())
 			slashUnbondingSigs = append(slashUnbondingSigs, slashUnbondingSig.MustMarshal())
 		}
 
-		unbondingSig, err := btcstaking.SignTxWithOneScriptSpendInputStrict(
-			signingTxReq.UnbondingTx,
-			signingTxReq.StakingTx,
-			signingTxReq.StakingOutputIdx,
-			signingTxReq.StakingTxUnbondingPkScriptPath,
-			covenantPrivKey,
-		)
+		unbondingSig, err := unbondSig(covenantPrivKey, signingTxReq)
 		if err != nil {
-			return nil, fmt.Errorf("failed to sign unbonding tx: %w", err)
+			return nil, err
 		}
 
 		resp[stakingTxHash] = covenant.SignaturesResponse{
@@ -132,3 +104,51 @@ func (kcs KeyringSigner) SignTransactions(req covenant.SigningRequest) (*covenan
 		SignaturesByStkTxHash: resp,
 	}, nil
 }
+
+func slashUnbondSig(
+	covenantPrivKey *secp.PrivateKey,
+	signingTxReq covenant.SigningTxsRequest,
+	fpEncKey *asig.EncryptionKey,
+) (slashSig, slashUnbondingSig *asig.AdaptorSignature, err error) {
+	// creates slash sigs
+	slashSig, err = btcstaking.EncSignTxWithOneScriptSpendInputStrict(
+		signingTxReq.SlashingTx,
+		signingTxReq.StakingTx,
+		signingTxReq.StakingOutputIdx,
+		signingTxReq.SlashingPkScriptPath,
+		covenantPrivKey,
+		fpEncKey,
+	)
+	if err != nil {
+		return nil, nil, fmt.Errorf("failed to sign adaptor slash signature with finality provider public key %s: %w", fpEncKey.ToBytes(), err)
+	}
+
+	// creates slash unbonding sig
+	slashUnbondingSig, err = btcstaking.EncSignTxWithOneScriptSpendInputStrict(
+		signingTxReq.SlashUnbondingTx,
+		signingTxReq.UnbondingTx,
+		0, // 0th output is always the unbonding script output
+		signingTxReq.UnbondingTxSlashingPkScriptPath,
+		covenantPrivKey,
+		fpEncKey,
+	)
+	if err != nil {
+		return nil, nil, fmt.Errorf("failed to sign adaptor slash unbonding signature with finality provider public key %s: %w", fpEncKey.ToBytes(), err)
+	}
+
+	return slashSig, slashUnbondingSig, nil
+}
+
+func unbondSig(covenantPrivKey *secp.PrivateKey, signingTxReq covenant.SigningTxsRequest) (*schnorr.Signature, error) {
+	unbondingSig, err := btcstaking.SignTxWithOneScriptSpendInputStrict(
+		signingTxReq.UnbondingTx,
+		signingTxReq.StakingTx,
+		signingTxReq.StakingOutputIdx,
+		signingTxReq.StakingTxUnbondingPkScriptPath,
+		covenantPrivKey,
+	)
+	if err != nil {
+		return nil, fmt.Errorf("failed to sign unbonding tx: %w", err)
+	}
+	return unbondingSig, nil
+}