aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Lange <fjl@twurst.com>2016-04-30 05:09:37 +0800
committerFelix Lange <fjl@twurst.com>2016-04-30 05:09:37 +0800
commit1c20313a6a1a35d5f540f878e7c263327c2ccfc1 (patch)
tree4835cd7f3085edb6c6ed41b62edf15be9f9e42dc
parentcfa999f006c30613aa4acce42d8edad056f39c10 (diff)
parent572da73d4d475db0443f457d9383a3d513f189ee (diff)
downloadgo-tangerine-1c20313a6a1a35d5f540f878e7c263327c2ccfc1.tar.gz
go-tangerine-1c20313a6a1a35d5f540f878e7c263327c2ccfc1.tar.zst
go-tangerine-1c20313a6a1a35d5f540f878e7c263327c2ccfc1.zip
Merge pull request #2493 from almindor/develop
eth: add personal_importRawKey
-rw-r--r--accounts/account_manager.go7
-rw-r--r--eth/api.go11
-rw-r--r--internal/web3ext/web3ext.go27
3 files changed, 38 insertions, 7 deletions
diff --git a/accounts/account_manager.go b/accounts/account_manager.go
index 56499672e..3afadf6b2 100644
--- a/accounts/account_manager.go
+++ b/accounts/account_manager.go
@@ -284,7 +284,12 @@ func (am *Manager) Import(keyJSON []byte, passphrase, newPassphrase string) (Acc
// ImportECDSA stores the given key into the key directory, encrypting it with the passphrase.
func (am *Manager) ImportECDSA(priv *ecdsa.PrivateKey, passphrase string) (Account, error) {
- return am.importKey(newKeyFromECDSA(priv), passphrase)
+ key := newKeyFromECDSA(priv)
+ if am.cache.hasAddress(key.Address) {
+ return Account{}, fmt.Errorf("account already exists")
+ }
+
+ return am.importKey(key, passphrase)
}
func (am *Manager) importKey(key *Key, passphrase string) (Account, error) {
diff --git a/eth/api.go b/eth/api.go
index 02b34541f..2c84cf471 100644
--- a/eth/api.go
+++ b/eth/api.go
@@ -18,6 +18,7 @@ package eth
import (
"bytes"
+ "encoding/hex"
"encoding/json"
"errors"
"fmt"
@@ -448,6 +449,16 @@ func (s *PrivateAccountAPI) NewAccount(password string) (common.Address, error)
return common.Address{}, err
}
+func (s *PrivateAccountAPI) ImportRawKey(privkey string, password string) (common.Address, error) {
+ hexkey, err := hex.DecodeString(privkey)
+ if err != nil {
+ return common.Address{}, err
+ }
+
+ acc, err := s.am.ImportECDSA(crypto.ToECDSA(hexkey), password)
+ return acc.Address, err
+}
+
// UnlockAccount will unlock the account associated with the given address with
// the given password for duration seconds. If duration is nil it will use a
// default of 300 seconds. It returns an indication if the account was unlocked.
diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go
index bc1e46921..14700b05c 100644
--- a/internal/web3ext/web3ext.go
+++ b/internal/web3ext/web3ext.go
@@ -18,12 +18,13 @@
package web3ext
var Modules = map[string]string{
- "txpool": TxPool_JS,
- "admin": Admin_JS,
- "eth": Eth_JS,
- "miner": Miner_JS,
- "debug": Debug_JS,
- "net": Net_JS,
+ "txpool": TxPool_JS,
+ "admin": Admin_JS,
+ "personal": Personal_JS,
+ "eth": Eth_JS,
+ "miner": Miner_JS,
+ "debug": Debug_JS,
+ "net": Net_JS,
}
const TxPool_JS = `
@@ -175,6 +176,20 @@ web3._extend({
});
`
+const Personal_JS = `
+web3._extend({
+ property: 'personal',
+ methods:
+ [
+ new web3._extend.Method({
+ name: 'importRawKey',
+ call: 'personal_importRawKey',
+ params: 2
+ })
+ ]
+});
+`
+
const Eth_JS = `
web3._extend({
property: 'eth',