diff --git a/api/clients/v2/payload_disperser.go b/api/clients/v2/payload_disperser.go
index e285cb61bc..68997af691 100644
--- a/api/clients/v2/payload_disperser.go
+++ b/api/clients/v2/payload_disperser.go
@@ -36,11 +36,9 @@ func BuildPayloadDisperser(log logging.Logger, payloadDispCfg PayloadDisperserCo
 	kzgConfig *kzg.KzgConfig, encoderCfg *encoding.Config) (*PayloadDisperser, error) {
 	
 	// 1 - verify key semantics and create signer
-	var signer core.BlobRequestSigner
-	if len(payloadDispCfg.SignerPaymentKey) == 64 {
-		signer = auth.NewLocalBlobRequestSigner(payloadDispCfg.SignerPaymentKey)
-	} else {
-		return nil, fmt.Errorf("invalid length for signer private key")
+	signer, err := auth.NewLocalBlobRequestSigner(payloadDispCfg.SignerPaymentKey)
+	if err != nil {
+		return nil, fmt.Errorf("new local blob request signer: %w", err)
 	}
 
 	// 2 - create prover
diff --git a/core/auth/v2/auth_test.go b/core/auth/v2/auth_test.go
index 3d22b66c3f..da8dedeea6 100644
--- a/core/auth/v2/auth_test.go
+++ b/core/auth/v2/auth_test.go
@@ -19,7 +19,8 @@ var (
 )
 
 func TestAuthentication(t *testing.T) {
-	signer := auth.NewLocalBlobRequestSigner(privateKeyHex)
+	signer, err := auth.NewLocalBlobRequestSigner(privateKeyHex)
+	assert.NoError(t, err)
 	authenticator := auth.NewAuthenticator()
 
 	accountId, err := signer.GetAccountID()
@@ -36,7 +37,8 @@ func TestAuthentication(t *testing.T) {
 }
 
 func TestAuthenticationFail(t *testing.T) {
-	signer := auth.NewLocalBlobRequestSigner(privateKeyHex)
+	signer, err := auth.NewLocalBlobRequestSigner(privateKeyHex)
+	assert.NoError(t, err)
 	authenticator := auth.NewAuthenticator()
 
 	accountId, err := signer.GetAccountID()
@@ -45,7 +47,8 @@ func TestAuthenticationFail(t *testing.T) {
 	header := testHeader(t, accountId)
 
 	wrongPrivateKeyHex := "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcded"
-	signer = auth.NewLocalBlobRequestSigner(wrongPrivateKeyHex)
+	signer, err = auth.NewLocalBlobRequestSigner(wrongPrivateKeyHex)
+	assert.NoError(t, err)
 
 	// Sign the header
 	signature, err := signer.SignBlobRequest(header)
@@ -113,7 +116,8 @@ func testHeader(t *testing.T, accountID string) *corev2.BlobHeader {
 }
 
 func TestAuthenticatePaymentStateRequestValid(t *testing.T) {
-	signer := auth.NewLocalBlobRequestSigner(privateKeyHex)
+	signer, err := auth.NewLocalBlobRequestSigner(privateKeyHex)
+	assert.NoError(t, err)
 	authenticator := auth.NewAuthenticator()
 
 	signature, err := signer.SignPaymentStateRequest()
@@ -143,11 +147,13 @@ func TestAuthenticatePaymentStateRequestInvalidPublicKey(t *testing.T) {
 }
 
 func TestAuthenticatePaymentStateRequestSignatureMismatch(t *testing.T) {
-	signer := auth.NewLocalBlobRequestSigner(privateKeyHex)
+	signer, err := auth.NewLocalBlobRequestSigner(privateKeyHex)
+	assert.NoError(t, err)
 	authenticator := auth.NewAuthenticator()
 
 	// Create a different signer with wrong private key
-	wrongSigner := auth.NewLocalBlobRequestSigner("0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcded")
+	wrongSigner, err := auth.NewLocalBlobRequestSigner("0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcded")
+	assert.NoError(t, err)
 
 	// Sign with wrong key
 	accountId, err := signer.GetAccountID()
@@ -162,7 +168,8 @@ func TestAuthenticatePaymentStateRequestSignatureMismatch(t *testing.T) {
 }
 
 func TestAuthenticatePaymentStateRequestCorruptedSignature(t *testing.T) {
-	signer := auth.NewLocalBlobRequestSigner(privateKeyHex)
+	signer, err := auth.NewLocalBlobRequestSigner(privateKeyHex)
+	assert.NoError(t, err)
 	authenticator := auth.NewAuthenticator()
 
 	accountId, err := signer.GetAccountID()
diff --git a/core/auth/v2/signer.go b/core/auth/v2/signer.go
index bbfef3eca9..6314d5c7a2 100644
--- a/core/auth/v2/signer.go
+++ b/core/auth/v2/signer.go
@@ -4,7 +4,6 @@ import (
 	"crypto/ecdsa"
 	"crypto/sha256"
 	"fmt"
-	"log"
 
 	core "github.com/Layr-Labs/eigenda/core/v2"
 	"github.com/ethereum/go-ethereum/common"
@@ -17,16 +16,16 @@ type LocalBlobRequestSigner struct {
 
 var _ core.BlobRequestSigner = &LocalBlobRequestSigner{}
 
-func NewLocalBlobRequestSigner(privateKeyHex string) *LocalBlobRequestSigner {
+func NewLocalBlobRequestSigner(privateKeyHex string) (*LocalBlobRequestSigner, error) {
 	privateKeyBytes := common.FromHex(privateKeyHex)
 	privateKey, err := crypto.ToECDSA(privateKeyBytes)
 	if err != nil {
-		log.Fatalf("Failed to parse private key: %v", err)
+		return nil, fmt.Errorf("create ECDSA private key: %w", err)
 	}
 
 	return &LocalBlobRequestSigner{
 		PrivateKey: privateKey,
-	}
+	}, nil
 }
 
 func (s *LocalBlobRequestSigner) SignBlobRequest(header *core.BlobHeader) ([]byte, error) {
diff --git a/core/auth/v2/signer_test.go b/core/auth/v2/signer_test.go
index b17022bcd3..0fa0f99a8e 100644
--- a/core/auth/v2/signer_test.go
+++ b/core/auth/v2/signer_test.go
@@ -20,7 +20,8 @@ func TestGetAccountID(t *testing.T) {
 	expectedAccountID := "0x1aa8226f6d354380dDE75eE6B634875c4203e522"
 
 	// Create signer instance
-	signer := NewLocalBlobRequestSigner(privateKey)
+	signer, err := NewLocalBlobRequestSigner(privateKey)
+	require.NoError(t, err)
 
 	// Get account ID
 	accountID, err := signer.GetAccountID()
@@ -30,7 +31,8 @@ func TestGetAccountID(t *testing.T) {
 
 func TestSignBlobRequest(t *testing.T) {
 	privateKey := "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcded"
-	signer := NewLocalBlobRequestSigner(privateKey)
+	signer, err := NewLocalBlobRequestSigner(privateKey)
+	require.NoError(t, err)
 	accountID, err := signer.GetAccountID()
 	require.NoError(t, err)
 	require.Equal(t, "0x1aa8226f6d354380dDE75eE6B634875c4203e522", accountID)
@@ -99,7 +101,8 @@ func TestSignBlobRequest(t *testing.T) {
 
 func TestSignPaymentStateRequest(t *testing.T) {
 	privateKey := "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcded"
-	signer := NewLocalBlobRequestSigner(privateKey)
+	signer, err := NewLocalBlobRequestSigner(privateKey)
+	require.NoError(t, err)
 	expectedAddr := "0x1aa8226f6d354380dDE75eE6B634875c4203e522"
 	accountID, err := signer.GetAccountID()
 	require.NoError(t, err)
diff --git a/disperser/apiserver/server_v2_test.go b/disperser/apiserver/server_v2_test.go
index 8dc267ac4d..fbe13c094a 100644
--- a/disperser/apiserver/server_v2_test.go
+++ b/disperser/apiserver/server_v2_test.go
@@ -72,7 +72,8 @@ func TestV2DisperseBlob(t *testing.T) {
 	}
 	blobHeader, err := corev2.BlobHeaderFromProtobuf(blobHeaderProto)
 	assert.NoError(t, err)
-	signer := auth.NewLocalBlobRequestSigner(privateKeyHex)
+	signer, err := auth.NewLocalBlobRequestSigner(privateKeyHex)
+	assert.NoError(t, err)
 	sig, err := signer.SignBlobRequest(blobHeader)
 	assert.NoError(t, err)
 
@@ -121,7 +122,8 @@ func TestV2DisperseBlobRequestValidation(t *testing.T) {
 	data := make([]byte, 50)
 	_, err := rand.Read(data)
 	assert.NoError(t, err)
-	signer := auth.NewLocalBlobRequestSigner(privateKeyHex)
+	signer, err := auth.NewLocalBlobRequestSigner(privateKeyHex)
+	assert.NoError(t, err)
 	data = codec.ConvertByPaddingEmptyByte(data)
 	commitments, err := prover.GetCommitmentsForPaddedLength(data)
 	assert.NoError(t, err)
@@ -530,7 +532,8 @@ func newTestServerV2(t *testing.T) *testComponents {
 
 	err = s.RefreshOnchainState(context.Background())
 	assert.NoError(t, err)
-	signer := auth.NewLocalBlobRequestSigner(privateKeyHex)
+	signer, err := auth.NewLocalBlobRequestSigner(privateKeyHex)
+	assert.NoError(t, err)
 	p := &peer.Peer{
 		Addr: &net.TCPAddr{
 			IP:   net.ParseIP("0.0.0.0"),
@@ -581,7 +584,8 @@ func TestInvalidLength(t *testing.T) {
 	}
 	blobHeader, err := corev2.BlobHeaderFromProtobuf(blobHeaderProto)
 	assert.NoError(t, err)
-	signer := auth.NewLocalBlobRequestSigner(privateKeyHex)
+	signer, err := auth.NewLocalBlobRequestSigner(privateKeyHex)
+	assert.NoError(t, err)
 	sig, err := signer.SignBlobRequest(blobHeader)
 	assert.NoError(t, err)
 
diff --git a/inabox/tests/integration_v2_test.go b/inabox/tests/integration_v2_test.go
index e4e539b0fd..35b6b28ff9 100644
--- a/inabox/tests/integration_v2_test.go
+++ b/inabox/tests/integration_v2_test.go
@@ -32,7 +32,8 @@ var _ = Describe("Inabox v2 Integration", func() {
 		defer cancel()
 
 		privateKeyHex := "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcded"
-		signer := auth.NewLocalBlobRequestSigner(privateKeyHex)
+		signer, err := auth.NewLocalBlobRequestSigner(privateKeyHex)
+		Expect(err).To(BeNil())
 
 		disp, err := clients.NewDisperserClient(&clients.DisperserClientConfig{
 			Hostname: "localhost",
diff --git a/test/v2/test_client.go b/test/v2/test_client.go
index c1fade82f8..bcbd894422 100644
--- a/test/v2/test_client.go
+++ b/test/v2/test_client.go
@@ -97,7 +97,8 @@ func NewTestClient(t *testing.T, config *TestClientConfig) *TestClient {
 	privateKeyString = strings.Trim(privateKeyString, "\n \t")
 	privateKeyString, _ = strings.CutPrefix(privateKeyString, "0x")
 
-	signer := auth.NewLocalBlobRequestSigner(privateKeyString)
+	signer, err := auth.NewLocalBlobRequestSigner(privateKeyString)
+	require.NoError(t, err)
 	signerAccountId, err := signer.GetAccountID()
 	require.NoError(t, err)
 	accountId := gethcommon.HexToAddress(signerAccountId)
diff --git a/tools/traffic/generator_v2.go b/tools/traffic/generator_v2.go
index 5772a3502d..330af46def 100644
--- a/tools/traffic/generator_v2.go
+++ b/tools/traffic/generator_v2.go
@@ -57,12 +57,9 @@ func NewTrafficGeneratorV2(config *config.Config) (*Generator, error) {
 		return nil, err
 	}
 
-	var signer *auth.LocalBlobRequestSigner
-	if config.SignerPrivateKey != "" {
-		signer = auth.NewLocalBlobRequestSigner(config.SignerPrivateKey)
-	} else {
-		logger.Error("signer private key is required")
-		return nil, fmt.Errorf("signer private key is required")
+	signer, err := auth.NewLocalBlobRequestSigner(config.SignerPrivateKey)
+	if err != nil {
+		return nil, fmt.Errorf("new local blob request signer: %w", err)
 	}
 
 	signerAccountId, err := signer.GetAccountID()