#include #include std::optional accountFromStringStrict(std::string const& account) { boost::optional result; auto const publicKey = ripple::parseBase58( ripple::TokenType::AccountPublic, account); if (publicKey) result = ripple::calcAccountID(*publicKey); else result = ripple::parseBase58(account); if (result) return result.value(); else return {}; } std::pair< std::shared_ptr, std::shared_ptr> deserializeTxPlusMeta(Backend::TransactionAndMetadata const& blobs) { std::pair< std::shared_ptr, std::shared_ptr> result; { ripple::SerialIter s{ blobs.transaction.data(), blobs.transaction.size()}; result.first = std::make_shared(s); } { ripple::SerialIter s{blobs.metadata.data(), blobs.metadata.size()}; result.second = std::make_shared(s, ripple::sfMetadata); } return result; } boost::json::object toJson(ripple::STBase const& obj) { auto start = std::chrono::system_clock::now(); boost::json::value value = boost::json::parse( obj.getJson(ripple::JsonOptions::none).toStyledString()); auto end = std::chrono::system_clock::now(); value.as_object()["deserialization_time_microseconds"] = std::chrono::duration_cast(end - start) .count(); return value.as_object(); } boost::json::object toJson(ripple::SLE const& sle) { auto start = std::chrono::system_clock::now(); boost::json::value value = boost::json::parse( sle.getJson(ripple::JsonOptions::none).toStyledString()); auto end = std::chrono::system_clock::now(); value.as_object()["deserialization_time_microseconds"] = std::chrono::duration_cast(end - start) .count(); return value.as_object(); } boost::json::object toJson(ripple::LedgerInfo const& lgrInfo) { boost::json::object header; header["ledger_sequence"] = lgrInfo.seq; header["ledger_hash"] = ripple::strHex(lgrInfo.hash); header["txns_hash"] = ripple::strHex(lgrInfo.txHash); header["state_hash"] = ripple::strHex(lgrInfo.accountHash); header["parent_hash"] = ripple::strHex(lgrInfo.parentHash); header["total_coins"] = ripple::to_string(lgrInfo.drops); header["close_flags"] = lgrInfo.closeFlags; // Always show fields that contribute to the ledger hash header["parent_close_time"] = lgrInfo.parentCloseTime.time_since_epoch().count(); header["close_time"] = lgrInfo.closeTime.time_since_epoch().count(); header["close_time_resolution"] = lgrInfo.closeTimeResolution.count(); return header; } std::optional ledgerSequenceFromRequest( boost::json::object const& request, BackendInterface const& backend) { if (not request.contains("ledger_index")) { return backend.fetchLatestLedgerSequence(); } else { return request.at("ledger_index").as_int64(); } } std::vector ledgerInfoToBlob(ripple::LedgerInfo const& info) { ripple::Serializer s; s.add32(info.seq); s.add64(info.drops.drops()); s.addBitString(info.parentHash); s.addBitString(info.txHash); s.addBitString(info.accountHash); s.add32(info.parentCloseTime.time_since_epoch().count()); s.add32(info.closeTime.time_since_epoch().count()); s.add8(info.closeTimeResolution.count()); s.add8(info.closeFlags); s.addBitString(info.hash); return s.peekData(); }