diff --git a/lib/bitcoind.js b/lib/bitcoind.js index ff9f7d29..bd9d84b8 100644 --- a/lib/bitcoind.js +++ b/lib/bitcoind.js @@ -771,6 +771,14 @@ Wallet.prototype.import = function(options, callback) { return bitcoindjs.walletImportWallet(options || {}, callback); }; +Wallet.prototype.changeLabel = function(options) { + return bitcoindjs.walletChangeLabel(options || {}); +}; + +Wallet.prototype.deleteAccount = function(options) { + return bitcoindjs.walletDeleteAccount(options || {}); +}; + Wallet = new Wallet; /** diff --git a/src/bitcoindjs.cc b/src/bitcoindjs.cc index a1244457..d70a3e92 100644 --- a/src/bitcoindjs.cc +++ b/src/bitcoindjs.cc @@ -204,6 +204,8 @@ NAN_METHOD(WalletSetTxFee); NAN_METHOD(WalletImportKey); NAN_METHOD(WalletDumpWallet); NAN_METHOD(WalletImportWallet); +NAN_METHOD(WalletChangeLabel); +NAN_METHOD(WalletDeleteAccount); /** * Node.js Internal Function Templates @@ -4036,6 +4038,126 @@ async_import_wallet_after(uv_work_t *req) { delete req; } +/** + * WalletChangeLabel() + * bitcoindjs.walletChangeLabel(options) + * Change account label + */ + +NAN_METHOD(WalletChangeLabel) { + NanScope(); + + if (args.Length() < 1 || !args[0]->IsObject()) { + return NanThrowError( + "Usage: bitcoindjs.walletChangeLabel(options)"); + } + + Local options = Local::Cast(args[0]); + + std::string accountName = std::string(""); + if (options->Get(NanNew("account"))->IsString()) { + String::Utf8Value accountName_(options->Get(NanNew("account"))->ToString()); + accountName = std::string(*accountName_); + } + + std::string addr = std::string(""); + if (options->Get(NanNew("address"))->IsString()) { + String::Utf8Value addr_(options->Get(NanNew("address"))->ToString()); + addr = std::string(*addr_); + } + + String::Utf8Value label_(options->Get(NanNew("label"))->ToString()); + std::string label = std::string(*label_); + + // LOCK2(cs_main, pwalletMain->cs_wallet); + + CWalletDB walletdb(pwalletMain->strWalletFile); + + CAccount account; + walletdb.ReadAccount(accountName, account); + + if (accountName.empty()) { + BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, CAddressBookData)& item, pwalletMain->mapAddressBook) { + const CBitcoinAddress& address = item.first; + const string& strName = item.second.name; + if (address.ToString() == addr) { + accountName = strName; + break; + } + } + } + + // Find all addresses that have the given account + BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, CAddressBookData)& item, pwalletMain->mapAddressBook) { + const CBitcoinAddress& address = item.first; + const string& strName = item.second.name; + if (strName == accountName) { + walletdb.WriteName(address.ToString(), label); + walletdb.WritePurpose(address.ToString(), std::string("receive")); + // pwalletMain->SetAddressBook(address, accountName, std::string("receive")); + } + } + + NanReturnValue(True()); +} + +/** + * WalletDeleteAccount() + * bitcoindjs.walletDeleteAccount(options) + * Delete account and all associated addresses + */ + +NAN_METHOD(WalletDeleteAccount) { + NanScope(); + + if (args.Length() < 1 || !args[0]->IsObject()) { + return NanThrowError( + "Usage: bitcoindjs.walletDeleteAccount(options)"); + } + + std::string accountName = std::string(""); + if (options->Get(NanNew("account"))->IsString()) { + String::Utf8Value accountName_(options->Get(NanNew("account"))->ToString()); + accountName = std::string(*accountName_); + } + + std::string addr = std::string(""); + if (options->Get(NanNew("address"))->IsString()) { + String::Utf8Value addr_(options->Get(NanNew("address"))->ToString()); + addr = std::string(*addr_); + } + + // LOCK2(cs_main, pwalletMain->cs_wallet); + + CWalletDB walletdb(pwalletMain->strWalletFile); + + CAccount account; + walletdb.ReadAccount(accountName, account); + + if (accountName.empty()) { + BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, CAddressBookData)& item, pwalletMain->mapAddressBook) { + const CBitcoinAddress& address = item.first; + const string& strName = item.second.name; + if (address.ToString() == addr) { + accountName = strName; + break; + } + } + } + + // Find all addresses that have the given account + BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, CAddressBookData)& item, pwalletMain->mapAddressBook) { + const CBitcoinAddress& address = item.first; + const string& strName = item.second.name; + if (strName == accountName) { + walletdb.EraseName(address.ToString()); + walletdb.ErasePurpose(address.ToString()); + } + } + + NanReturnValue(True()); +} + /** * Conversions * cblock_to_jsblock(cblock, cblock_index, jsblock, is_new) @@ -4425,6 +4547,8 @@ init(Handle target) { NODE_SET_METHOD(target, "walletImportKey", WalletImportKey); NODE_SET_METHOD(target, "walletDumpWallet", WalletDumpWallet); NODE_SET_METHOD(target, "walletImportWallet", WalletImportWallet); + NODE_SET_METHOD(target, "walletChangeLabel", WalletChangeLabel); + NODE_SET_METHOD(target, "walletDeleteAccount", WalletDeleteAccount); } NODE_MODULE(bitcoindjs, init)