diff --git a/lib/bitcoind.js b/lib/bitcoind.js index f79701e3..b0939817 100644 --- a/lib/bitcoind.js +++ b/lib/bitcoind.js @@ -731,6 +731,10 @@ Wallet.prototype.isEncrypted = function() { return bitcoindjs.walletEncrypted(); }; +Wallet.prototype.dumpPrivKey = function(options) { + return bitcoindjs.dumpPrivKey(options || {}); +}; + Wallet.prototype.setTxFee = function(options) { return bitcoindjs.walletSetTxFee(options || {}); }; diff --git a/src/bitcoindjs.cc b/src/bitcoindjs.cc index 676a155c..abdfbcf9 100644 --- a/src/bitcoindjs.cc +++ b/src/bitcoindjs.cc @@ -193,6 +193,7 @@ NAN_METHOD(WalletPassphraseChange); NAN_METHOD(WalletLock); NAN_METHOD(WalletEncrypt); NAN_METHOD(WalletEncrypted); +NAN_METHOD(WalletDumpPrivKey); NAN_METHOD(WalletSetTxFee); NAN_METHOD(WalletImportKey); @@ -2931,9 +2932,12 @@ NAN_METHOD(WalletListAccounts) { if (!pwalletMain->GetKey(keyID, vchSecret)) { return NanThrowError("Private key for address is not known"); } - std::string priv = CBitcoinSecret(vchSecret).ToString(); - a->Set(NanNew("privkeycompressed"), NanNew(vchSecret.IsCompressed())); - a->Set(NanNew("privkey"), NanNew(priv)); + + if (!pwalletMain->IsCrypted()) { + std::string priv = CBitcoinSecret(vchSecret).ToString(); + a->Set(NanNew("privkeycompressed"), NanNew(vchSecret.IsCompressed())); + a->Set(NanNew("privkey"), NanNew(priv)); + } CPubKey vchPubKey; pwalletMain->GetPubKey(keyID, vchPubKey); @@ -3188,6 +3192,52 @@ NAN_METHOD(WalletEncrypted) { NanReturnValue(NanNew(isEncrypted)); } +/** + * WalletDumpPrivKey() + * bitcoindjs.walletDumpPrivKey(options) + * Dump private key + */ + +NAN_METHOD(WalletDumpPrivKey) { + NanScope(); + + if (args.Length() < 1 || !args[0]->IsObject()) { + return NanThrowError( + "Usage: bitcoindjs.walletDumpPrivKey(options)"); + } + + Local options = Local::Cast(args[0]); + String::Utf8Value addr_(options->Get(NanNew("address"))->ToString()); + std::string addr = std::string(*addr_); + + CBitcoinAddress address(addr); + + Local obj = NanNew(); + obj->Set(NanNew("address"), NanNew(address.ToString())); + + CKeyID keyID; + if (!address.GetKeyID(keyID)) { + return NanThrowError("Address does not refer to a key"); + } + CKey vchSecret; + if (!pwalletMain->GetKey(keyID, vchSecret)) { + return NanThrowError("Private key for address is not known"); + } + + if (!pwalletMain->IsCrypted()) { + std::string priv = CBitcoinSecret(vchSecret).ToString(); + obj->Set(NanNew("privkeycompressed"), NanNew(vchSecret.IsCompressed())); + obj->Set(NanNew("privkey"), NanNew(priv)); + } + + CPubKey vchPubKey; + pwalletMain->GetPubKey(keyID, vchPubKey); + obj->Set(NanNew("pubkeycompressed"), NanNew(vchPubKey.IsCompressed())); + obj->Set(NanNew("pubkey"), NanNew(HexStr(vchPubKey))); + + NanReturnValue(obj); +} + /** * WalletSetTxFee() * bitcoindjs.walletSetTxFee(options) @@ -3733,6 +3783,7 @@ init(Handle target) { NODE_SET_METHOD(target, "walletLock", WalletLock); NODE_SET_METHOD(target, "walletEncrypt", WalletEncrypt); NODE_SET_METHOD(target, "walletEncrypted", WalletEncrypted); + NODE_SET_METHOD(target, "walletDumpPrivKey", WalletDumpPrivKey); NODE_SET_METHOD(target, "walletSetTxFee", WalletSetTxFee); NODE_SET_METHOD(target, "walletImportKey", WalletImportKey); }