diff --git a/ethwallet/ethwallet.go b/ethwallet/ethwallet.go index 9def9037..dd281325 100644 --- a/ethwallet/ethwallet.go +++ b/ethwallet/ethwallet.go @@ -275,6 +275,18 @@ func (w *Wallet) SignMessage(message []byte) ([]byte, error) { return sig, nil } +func (w *Wallet) SignData(data []byte) ([]byte, error) { + h := crypto.Keccak256(data) + + sig, err := crypto.Sign(h, w.hdnode.PrivateKey()) + if err != nil { + return []byte{}, err + } + sig[64] += 27 + + return sig, nil +} + func (w *Wallet) IsValidSignature(msg, sig []byte) (bool, error) { recoveredAddress, err := RecoverAddress(msg, sig) if err != nil { diff --git a/ethwallet/ethwallet_test.go b/ethwallet/ethwallet_test.go index f364a37f..6bc3e0c7 100644 --- a/ethwallet/ethwallet_test.go +++ b/ethwallet/ethwallet_test.go @@ -6,6 +6,7 @@ import ( "github.com/0xsequence/ethkit/ethwallet" "github.com/0xsequence/ethkit/go-ethereum/common/hexutil" + "github.com/0xsequence/ethkit/go-ethereum/crypto" "github.com/stretchr/testify/assert" ) @@ -109,3 +110,21 @@ func TestWalletSignAndRecover(t *testing.T) { assert.NoError(t, err) assert.True(t, valid) } + +func TestWalletSignDataAndRecover(t *testing.T) { + wallet, err := ethwallet.NewWalletFromPrivateKey("3c121e5b2c2b2426f386bfc0257820846d77610c20e0fd4144417fb8fd79bfb8") + assert.NoError(t, err) + + address := wallet.Address() + assert.NoError(t, err) + assert.Equal(t, "0x95a7D93FEf729ed829C761FF0e035BB6Dd2c7052", address.String()) + + data := []byte("hi") + sig, err := wallet.SignData(data) + assert.NoError(t, err) + + recoveredAddress, err := ethwallet.RecoverAddressFromDigest(crypto.Keccak256(data), sig) + assert.NoError(t, err) + + assert.Equal(t, address, recoveredAddress) +}