Json::Value accounts ( Ledger::ref lrLedger, RippleAddress const& naMasterGenerator, NetworkOPs& netOps) { Json::Value jsonAccounts (Json::arrayValue); // YYY Don't want to leak to thin server that these accounts are related. // YYY Would be best to alternate requests to servers and to cache results. unsigned int uIndex = 0; do { RippleAddress naAccount; naAccount.setAccountPublic (naMasterGenerator, uIndex++); AccountState::pointer as = netOps.getAccountState (lrLedger, naAccount); if (as) { Json::Value jsonAccount (Json::objectValue); as->addJson (jsonAccount); jsonAccounts.append (jsonAccount); } else { uIndex = 0; } } while (uIndex); return jsonAccounts; }
// TODO(tom): what is that "default"? Json::Value doAccountInfo (RPC::Context& context) { auto& params = context.params; Ledger::pointer ledger; Json::Value result = RPC::lookupLedger (params, ledger, context.netOps); if (!ledger) return result; if (!params.isMember (jss::account) && !params.isMember (jss::ident)) return RPC::missing_field_error (jss::account); std::string strIdent = params.isMember (jss::account) ? params[jss::account].asString () : params[jss::ident].asString (); bool bIndex; int iIndex = params.isMember (jss::account_index) ? params[jss::account_index].asUInt () : 0; bool bStrict = params.isMember (jss::strict) && params[jss::strict].asBool (); RippleAddress naAccount; // Get info on account. auto jvAccepted = RPC::accountFromString ( naAccount, bIndex, strIdent, iIndex, bStrict); if (!jvAccepted.empty ()) return jvAccepted; AccountState::pointer asAccepted = getAccountState(*ledger, naAccount, getApp().getSLECache()); if (asAccepted) { asAccepted->addJson (jvAccepted); // See if there's a SignerEntries for this account. AccountID const account = naAccount.getAccountID (); uint256 const signerListIndex = getSignerListIndex (account); auto const signerList = fetch(*ledger, signerListIndex, getApp().getSLECache()); if (signerList) { // Return multi-signing information if there are multi-signers. static const Json::StaticString multiSignersName("multisigners"); jvAccepted[multiSignersName] = signerList->getJson (0); Json::Value& multiSignerJson = jvAccepted[multiSignersName]; // Remove unwanted fields. multiSignerJson.removeMember (sfFlags.getName ()); multiSignerJson.removeMember (sfLedgerEntryType.getName ()); multiSignerJson.removeMember (sfOwnerNode.getName ()); multiSignerJson.removeMember ("index"); } result[jss::account_data] = jvAccepted; } else { result[jss::account] = naAccount.humanAccountID (); RPC::inject_error (rpcACT_NOT_FOUND, result); } return result; }