Skip to content

Commit

Permalink
Split out signer types to separate source files
Browse files Browse the repository at this point in the history
  • Loading branch information
mdehoog committed Aug 16, 2023
1 parent b8fcf90 commit e920cef
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 82 deletions.
32 changes: 32 additions & 0 deletions signer/ecdsa_signer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package signer

import (
"crypto/ecdsa"
"math/big"

opcrypto "github.com/ethereum-optimism/optimism/op-service/crypto"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
)

type ecdsaSigner struct {
*ecdsa.PrivateKey
}

func (s *ecdsaSigner) Address() common.Address {
return crypto.PubkeyToAddress(s.PublicKey)
}

func (s *ecdsaSigner) SignerFn(chainID *big.Int) bind.SignerFn {
return opcrypto.PrivateKeySignerFn(s.PrivateKey, chainID)
}

func (s *ecdsaSigner) SignData(data []byte) ([]byte, error) {
sig, err := crypto.Sign(crypto.Keccak256(data), s.PrivateKey)
if err != nil {
return nil, err
}
sig[crypto.RecoveryIDOffset] += 27
return sig, err
}
82 changes: 0 additions & 82 deletions signer/signer.go
Original file line number Diff line number Diff line change
@@ -1,19 +1,14 @@
package signer

import (
"crypto/ecdsa"
"fmt"
"math/big"

"github.com/decred/dcrd/hdkeychain/v3"
opcrypto "github.com/ethereum-optimism/optimism/op-service/crypto"
"github.com/ethereum/go-ethereum/accounts"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/accounts/usbwallet"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/tyler-smith/go-bip39"
)

type Signer interface {
Expand Down Expand Up @@ -68,80 +63,3 @@ func CreateSigner(privateKey, mnemonic, hdPath string) (Signer, error) {
account: account,
}, nil
}

type ecdsaSigner struct {
*ecdsa.PrivateKey
}

func (s *ecdsaSigner) Address() common.Address {
return crypto.PubkeyToAddress(s.PublicKey)
}

func (s *ecdsaSigner) SignerFn(chainID *big.Int) bind.SignerFn {
return opcrypto.PrivateKeySignerFn(s.PrivateKey, chainID)
}

func (s *ecdsaSigner) SignData(data []byte) ([]byte, error) {
sig, err := crypto.Sign(crypto.Keccak256(data), s.PrivateKey)
if err != nil {
return nil, err
}
sig[crypto.RecoveryIDOffset] += 27
return sig, err
}

type walletSigner struct {
wallet accounts.Wallet
account accounts.Account
}

func (s *walletSigner) Address() common.Address {
return s.account.Address
}

func (s *walletSigner) SignerFn(chainID *big.Int) bind.SignerFn {
return func(address common.Address, tx *types.Transaction) (*types.Transaction, error) {
return s.wallet.SignTx(s.account, tx, chainID)
}
}

func (s *walletSigner) SignData(data []byte) ([]byte, error) {
return s.wallet.SignData(s.account, accounts.MimetypeTypedData, data)
}

func derivePrivateKey(mnemonic string, path accounts.DerivationPath) (*ecdsa.PrivateKey, error) {
// Parse the seed string into the master BIP32 key.
seed, err := bip39.NewSeedWithErrorChecking(mnemonic, "")
if err != nil {
return nil, err
}

privKey, err := hdkeychain.NewMaster(seed, fakeNetworkParams{})
if err != nil {
return nil, err
}

for _, child := range path {
privKey, err = privKey.Child(child)
if err != nil {
return nil, err
}
}

rawPrivKey, err := privKey.SerializedPrivKey()
if err != nil {
return nil, err
}

return crypto.ToECDSA(rawPrivKey)
}

type fakeNetworkParams struct{}

func (f fakeNetworkParams) HDPrivKeyVersion() [4]byte {
return [4]byte{}
}

func (f fakeNetworkParams) HDPubKeyVersion() [4]byte {
return [4]byte{}
}
70 changes: 70 additions & 0 deletions signer/wallet_signer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package signer

import (
"crypto/ecdsa"
"math/big"

"github.com/decred/dcrd/hdkeychain/v3"
"github.com/ethereum/go-ethereum/accounts"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/tyler-smith/go-bip39"
)

type walletSigner struct {
wallet accounts.Wallet
account accounts.Account
}

func (s *walletSigner) Address() common.Address {
return s.account.Address
}

func (s *walletSigner) SignerFn(chainID *big.Int) bind.SignerFn {
return func(address common.Address, tx *types.Transaction) (*types.Transaction, error) {
return s.wallet.SignTx(s.account, tx, chainID)
}
}

func (s *walletSigner) SignData(data []byte) ([]byte, error) {
return s.wallet.SignData(s.account, accounts.MimetypeTypedData, data)
}

func derivePrivateKey(mnemonic string, path accounts.DerivationPath) (*ecdsa.PrivateKey, error) {
// Parse the seed string into the master BIP32 key.
seed, err := bip39.NewSeedWithErrorChecking(mnemonic, "")
if err != nil {
return nil, err
}

privKey, err := hdkeychain.NewMaster(seed, fakeNetworkParams{})
if err != nil {
return nil, err
}

for _, child := range path {
privKey, err = privKey.Child(child)
if err != nil {
return nil, err
}
}

rawPrivKey, err := privKey.SerializedPrivKey()
if err != nil {
return nil, err
}

return crypto.ToECDSA(rawPrivKey)
}

type fakeNetworkParams struct{}

func (f fakeNetworkParams) HDPrivKeyVersion() [4]byte {
return [4]byte{}
}

func (f fakeNetworkParams) HDPubKeyVersion() [4]byte {
return [4]byte{}
}

0 comments on commit e920cef

Please sign in to comment.