20 #include <ripple/app/ledger/LedgerMaster.h>
21 #include <ripple/app/ledger/TransactionMaster.h>
22 #include <ripple/app/misc/NetworkOPs.h>
23 #include <ripple/app/misc/Transaction.h>
24 #include <ripple/net/RPCErr.h>
25 #include <ripple/protocol/ErrorCodes.h>
26 #include <ripple/protocol/jss.h>
27 #include <ripple/rpc/Context.h>
28 #include <ripple/rpc/DeliveredAmount.h>
29 #include <ripple/rpc/impl/RPCHelpers.h>
30 #include <ripple/rpc/impl/GRPCHelpers.h>
31 #include <ripple/rpc/GRPCHandlers.h>
32 #include <ripple/basics/ToString.h>
44 if (txid.
size () != 64)
48 [](std::string::value_type c)
50 return !std::isxdigit (static_cast<unsigned char>(c));
53 return (ret == txid.
end ());
63 if (seq >
ledgerMaster.getValidatedLedger ()->info().seq)
115 constexpr uint16_t MAX_RANGE = 1000;
133 boost::variant<std::shared_ptr<Transaction>,
bool> v =
144 txn = boost::get<std::shared_ptr<Transaction>>(v);
185 result.
meta = std::move(blob);
194 result.
meta = std::make_shared<TxMeta>(
195 txn->
getID(), ledger->
seq(), *rawMeta);
214 org::xrpl::rpc::v1::GetTransactionResponse response;
215 grpc::Status status = grpc::Status::OK;
225 grpc::StatusCode::NOT_FOUND,
226 "txn not found. searched_all = " +
234 status = {grpc::StatusCode::NOT_FOUND,
"txn not found"};
236 status = {grpc::StatusCode::INTERNAL, error.message()};
242 auto& txn = result.
txn;
248 response.set_transaction_binary(s.
data(), s.
size());
255 response.set_hash(context.
params.hash());
257 auto ledgerIndex = txn->getLedger();
258 response.set_ledger_index(ledgerIndex);
264 response.mutable_date()->set_value(
265 ct->time_since_epoch().count());
269 *response.mutable_meta()->mutable_transaction_result(),
271 response.mutable_meta()->mutable_transaction_result()->set_result(
275 if (
auto blob = std::get_if<Blob>(&result.
meta))
279 response.set_meta_binary(slice.
data(), slice.
size());
289 getDeliveredAmount(context, stTxn, *meta, txn->getLedger());
293 *response.mutable_meta()->mutable_delivered_amount(),
298 response.set_validated(result.
validated);
300 return {response, status};
319 response[jss::searched_all] =
321 error.inject(response);
325 error.inject(response);
334 if (
auto blob = std::get_if<Blob>(&result.
meta))
346 insertDeliveredAmount(
347 response[jss::meta], context, result.
txn, *meta);
350 response[jss::validated] = result.
validated;
368 args.
hash = from_hex_text<uint256>(txHash);
397 org::xrpl::rpc::v1::GetTransactionResponse response;
398 grpc::Status status = grpc::Status::OK;
401 org::xrpl::rpc::v1::GetTransactionRequest& request = context.
params;
409 grpc::Status errorStatus{grpc::StatusCode::INVALID_ARGUMENT,
410 "ledger hash malformed"};
411 return {response, errorStatus};
414 args.
binary = request.binary();
416 if (request.ledger_range().ledger_index_min() != 0 &&
417 request.ledger_range().ledger_index_max() != 0)
420 request.ledger_range().ledger_index_min(),
421 request.ledger_range().ledger_index_max());
std::size_t size() const noexcept
Returns the number of bytes in the storage.
@ ledgerMaster
ledger master data for signing
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
tx_type txRead(key_type const &key) const override
Read a transaction from the tx map.
Json::Value getJson(JsonOptions options, bool binary=false) const
An immutable linear range of bytes.
std::shared_ptr< Transaction > fetch(uint256 const &, error_code_i &ec)
std::pair< org::xrpl::rpc::v1::GetAccountTransactionHistoryResponse, grpc::Status > populateProtoResponse(std::pair< AccountTxResult, RPC::Status > const &res, AccountTxArgs const &args, RPC::GRPCContext< org::xrpl::rpc::v1::GetAccountTransactionHistoryRequest > const &context)
std::shared_ptr< SHAMapItem const > const & peekItem(uint256 const &id) const
LedgerMaster & ledgerMaster
std::uint8_t const * data() const noexcept
Return a pointer to beginning of the storage.
Serializer getSerializer() const
std::string transToken(TER code)
std::string to_string(ListDisposition disposition)
uint256 const & getID() const
std::optional< std::pair< uint32_t, uint32_t > > ledgerRange
constexpr static std::size_t size()
void const * data() const noexcept
LedgerInfo const & info() const override
Returns information about the ledger.
void convert(org::xrpl::rpc::v1::TransactionResult &to, TER from)
@ objectValue
object value (collection of name/value pairs).
virtual LedgerMaster & getLedgerMaster()=0
LedgerIndex getLedger() const
bool getMetaHex(Ledger const &ledger, uint256 const &transID, std::string &hex)
std::pair< org::xrpl::rpc::v1::GetTransactionResponse, grpc::Status > doTxGrpc(RPC::GRPCContext< org::xrpl::rpc::v1::GetTransactionRequest > &context)
std::shared_ptr< Ledger const > getLedgerBySeq(std::uint32_t index)
bool isMember(const char *key) const
Return true if the object has a member named key.
ClosedInterval< T > range(T low, T high)
Create a closed range interval.
static bool isHexTxID(std::string const &txid)
Json::Value rpcError(int iError, Json::Value jvResult)
Status represents the results of an operation that might fail.
SHAMap const & txMap() const
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Json::Value populateJsonResponse(std::pair< AccountTxResult, RPC::Status > const &res, AccountTxArgs const &args, RPC::JsonContext const &context)
std::size_t size() const noexcept
std::pair< TxResult, RPC::Status > doTxHelp(RPC::Context &context, TxArgs const &args)
LedgerIndex seq() const
Returns the sequence number of the base ledger.
boost::optional< NetClock::time_point > getCloseTimeBySeq(LedgerIndex ledgerIndex)
static base_uint fromVoid(void const *data)
Json::Value doTxJson(RPC::JsonContext &)
std::variant< std::shared_ptr< TxMeta >, Blob > meta
std::string strHex(FwdIt begin, FwdIt end)
boost::icl::closed_interval< T > ClosedInterval
A closed interval over the domain T.
static bool isValidated(LedgerMaster &ledgerMaster, std::uint32_t seq, uint256 const &hash)
The context of information needed to call an RPC.
std::string asString() const
Returns the unquoted string value.
virtual TransactionMaster & getMasterTransaction()=0