major fixes to latest wallet calls.

This commit is contained in:
Christopher Jeffrey 2014-10-01 15:14:20 -07:00
parent e3ae084e6b
commit 0d9d4608f8
1 changed files with 59 additions and 49 deletions

View File

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