diff --git a/src/bitcoindjs.cc b/src/bitcoindjs.cc index 678f5dc6..81ed6f26 100644 --- a/src/bitcoindjs.cc +++ b/src/bitcoindjs.cc @@ -1359,23 +1359,10 @@ NAN_METHOD(WalletNewAddress) { pwalletMain->SetAddressBook(keyID, strAccount, "receive"); - NanReturnValue(NanNew(CBitcoinAddress(keyID).ToString()).c_str()); + NanReturnValue(NanNew(CBitcoinAddress(keyID).ToString().c_str())); } -NAN_METHOD(WalletGetAccountAddress) { - NanScope(); - - if (args.Length() < 1 || !args[0]->IsObject()) { - return NanThrowError( - "Usage: bitcoindjs.walletGetAccountAddress(options)"); - } - - Local options = Local::Cast(args[0]); - String::Utf8Value name_(options->Get(NanNew("name"))->ToString()); - std::string strAccount = std::string(*name_); - - bool bForceNew = options->Get(NanNew("new"))->ToBoolean(); - +CBitcoinAddress GetAccountAddress(std::string strAccount, bool bForceNew=false) { CWalletDB walletdb(pwalletMain->strWalletFile); CAccount account; @@ -1402,13 +1389,34 @@ NAN_METHOD(WalletGetAccountAddress) { // Generate a new key if (!account.vchPubKey.IsValid() || bForceNew || bKeyUsed) { if (!pwalletMain->GetKeyFromPool(account.vchPubKey)) { - return NanThrowError("Error: Keypool ran out, please call keypoolrefill first"); + NanThrowError("Keypool ran out, please call keypoolrefill first"); + //CTxDestination dest = CNoDestination(); + CBitcoinAddress addr; + //addr.Set(dest); + return addr; } pwalletMain->SetAddressBook(account.vchPubKey.GetID(), strAccount, "receive"); walletdb.WriteAccount(strAccount, account); } - return NanReturnValue(NanNew(CBitcoinAddress(account.vchPubKey.GetID())).c_str()); + return CBitcoinAddress(account.vchPubKey.GetID()); +} + +NAN_METHOD(WalletGetAccountAddress) { + NanScope(); + + if (args.Length() < 1 || !args[0]->IsObject()) { + return NanThrowError( + "Usage: bitcoindjs.walletGetAccountAddress(options)"); + } + + Local options = Local::Cast(args[0]); + String::Utf8Value account_(options->Get(NanNew("account"))->ToString()); + std::string strAccount = std::string(*account_); + + std::string ret = GetAccountAddress(strAccount).ToString(); + + NanReturnValue(NanNew(ret.c_str())); } NAN_METHOD(WalletSetAccount) { @@ -1694,24 +1702,26 @@ NAN_METHOD(WalletCreateMultiSigAddress) { Local options = Local::Cast(args[0]); int nRequired = options->Get(NanNew("nRequired"))->IntegerValue(); - Local keys = options->Get(NanNew("keys")); + Local keys = Local::Cast(options->Get(NanNew("keys"))); // Gather public keys if (nRequired < 1) { return NanThrowError( "a multisignature address must require at least one key to redeem"); } - if ((int)keys.Length() < nRequired) { - return NanThrowError( - strprintf("not enough keys supplied " - "(got %"PRIszu" keys, but need at least %d to redeem)", - keys.Length(), nRequired)); + if ((int)keys->Length() < nRequired) { + char s[150] = {0}; + snprintf(s, sizeof(s), + "not enough keys supplied (got %"PRIszu" keys, but need at least %d to redeem)", + keys->Length(), nRequired); + NanThrowError(s); + NanReturnValue(Undefined()); } std::vector pubkeys; - pubkeys.resize(keys.Length()); + pubkeys.resize(keys->Length()); - for (unsigned int i = 0; i < keys.Length(); i++) { + for (unsigned int i = 0; i < keys->Length(); i++) { String::Utf8Value key_(keys->Get(i)->ToString()); const std::string& ks = std::string(*key_); @@ -1721,14 +1731,14 @@ NAN_METHOD(WalletCreateMultiSigAddress) { if (pwalletMain && address.IsValid()) { CKeyID keyID; if (!address.GetKeyID(keyID)) { - return NanThrowError(strprintf("%s does not refer to a key", ks)); + return NanThrowError((ks + std::string(" does not refer to a key")).c_str()); } CPubKey vchPubKey; if (!pwalletMain->GetPubKey(keyID, vchPubKey)) { - return NanThrowError(strprintf("no full public key for address %s", ks)); + return NanThrowError((std::string("no full public key for address ") + ks).c_str()); } if (!vchPubKey.IsFullyValid()) { - return NanThrowError("Invalid public key: " + ks); + return NanThrowError((std::string("Invalid public key: ") + ks).c_str()); } pubkeys[i] = vchPubKey; } else @@ -1737,11 +1747,11 @@ NAN_METHOD(WalletCreateMultiSigAddress) { if (IsHex(ks)) { CPubKey vchPubKey(ParseHex(ks)); if (!vchPubKey.IsFullyValid()) { - return NanThrowError("Invalid public key: " + ks); + return NanThrowError((std::string("Invalid public key: ") + ks).c_str()); } pubkeys[i] = vchPubKey; } else { - return NanThrowError("Invalid public key: " + ks); + return NanThrowError((std::string("Invalid public key: ") + ks).c_str()); } } CScript inner; @@ -1752,8 +1762,8 @@ NAN_METHOD(WalletCreateMultiSigAddress) { CBitcoinAddress address(innerID); Local result = NanNew(); - result->Set(NanNew("address"), address.ToString()); - result->Set(NanNew("redeemScript"), HexStr(inner.begin(), inner.end())); + result->Set(NanNew("address"), NanNew(address.ToString())); + result->Set(NanNew("redeemScript"), NanNew(HexStr(inner.begin(), inner.end()))); NanReturnValue(result); } @@ -1956,7 +1966,7 @@ NAN_METHOD(WalletListTransactions) { "Usage: bitcoindjs.walletListTransactions(options)"); } - Local options = Local::Cast(args[0]); + // Local options = Local::Cast(args[0]); NanReturnValue(Undefined()); } @@ -2065,7 +2075,7 @@ NAN_METHOD(WalletGetTransaction) { "Usage: bitcoindjs.walletGetTransaction(options)"); } - Local options = Local::Cast(args[0]); + // Local options = Local::Cast(args[0]); NanReturnValue(Undefined()); } @@ -2175,7 +2185,7 @@ NAN_METHOD(WalletLock) { "Usage: bitcoindjs.walletLock(options)"); } - Local options = Local::Cast(args[0]); + // Local options = Local::Cast(args[0]); if (!pwalletMain->IsCrypted()) { return NanThrowError("Error: running with an unencrypted wallet, but walletlock was called."); @@ -2572,8 +2582,8 @@ jsblock_to_cblock(const Local obj, CBlock& block, CBlockIndex* blockinde block->hashMerkleRoot = obj->Get(NanNew("merkleroot"))->ToString(); block->vMerkleTree = obj->Get(NanNew("merkletree"))->ToString(); - Local txs = obj->Get("tx"); - for (int ti = 0; ti < txs.Length(); ti++) { + Local txs = Local::Cast(obj->Get("tx")); + for (int ti = 0; ti < txs->Length(); ti++) { Local entry = txs->Get(ti); CTransaction tx; @@ -2587,8 +2597,8 @@ jsblock_to_cblock(const Local obj, CBlock& block, CBlockIndex* blockinde tx.nVersion = entry->Get(NanNew("version"))->IntegerValue(); tx.nLockTime = entry->Get(NanNew("locktime"))->IntegerValue(); - Local vin = entry->Get("vin"); - for (int vi = 0; vi < vin.Length(); vi++) { + Local vin = Local::Cast(entry->Get("vin")); + for (int vi = 0; vi < vin->Length(); vi++) { CTxIn txin; Local in = vin->Get(vi); if (in->Get(NanNew("coinbase"))->IsString()) { @@ -2603,8 +2613,8 @@ jsblock_to_cblock(const Local obj, CBlock& block, CBlockIndex* blockinde (boost::int64_t)txin.nSequence = in->Get(NanNew("sequence"))->IntegerValue(); } - Local vout = entry->Get("vout"); - for (unsigned int vo = 0; vo < vout.Length(); vo++) { + Local vout = Local::Cast(entry->Get("vout")); + for (unsigned int vo = 0; vo < vout->Length(); vo++) { const CTxOut txout; Local out = vout->Get(vo); @@ -2629,8 +2639,8 @@ jsblock_to_cblock(const Local obj, CBlock& block, CBlockIndex* blockinde } else { nRequired = out->Set(NanNew("reqSigs"))->IntegerValue(); GetTxnOutputType(type) = out->Set(NanNew("type"))->ToString(); - Local a = out->Get("addresses"); - for (int ai = 0; ai < a.Length(); ai++) { + Local a = Local::Cast(out->Get("addresses")); + for (int ai = 0; ai < a->Length(); ai++) { CTxDestination addr; CBitcoinAddress(addr).ToString() = a->Get(ai)->ToString(); } @@ -2676,8 +2686,8 @@ jstx_to_ctx(const Local entry, CTransaction& tx, uint256 hashBlock) { tx.nVersion = entry->Get(NanNew("version"))->IntegerValue(); tx.nLockTime = entry->Get(NanNew("locktime"))->IntegerValue(); - Local vin = entry->Get("vin"); - for (int vi = 0; vi < vin.Length(); vi++) { + Local vin = Local::Cast(entry->Get("vin")); + for (int vi = 0; vi < vin->Length(); vi++) { const CTxIn txin; Local in = vin->Get(vi); if (in->Get(NanNew("coinbase")->IsString()) { @@ -2692,8 +2702,8 @@ jstx_to_ctx(const Local entry, CTransaction& tx, uint256 hashBlock) { (boost::int64_t)txin.nSequence = in->Get(NanNew("sequence"))->IntegerValue(); } - Local vout = entry->Get("vout"); - for (unsigned int vo = 0; vo < vout.Length(); vo++) { + Local vout = Local::Cast(entry->Get("vout")); + for (unsigned int vo = 0; vo < vout->Length(); vo++) { CTxOut txout; Local out = vout->Get(vo); txout.nValue = out->Get(NanNew("value"))->IntegerValue(); @@ -2714,8 +2724,8 @@ jstx_to_ctx(const Local entry, CTransaction& tx, uint256 hashBlock) { } else { nRequired = out->Get(NanNew("reqSigs"))->IntegerValue(); GetTxnOutputType(type) = out->Get(NanNew("type"))->ToString(); - Local a = out->Get("addresses"); - for (int ai = 0; ai < a.Length(); ai++) { + Local a = Local::Cast(out->Get("addresses")); + for (int ai = 0; ai < a->Length(); ai++) { CTxDestination addr; CBitcoinAddress(addr).ToString() = a->get(ai)->ToString(); }