20 #include <ripple/app/ledger/LedgerMaster.h>
21 #include <ripple/app/misc/HashRouter.h>
22 #include <ripple/app/misc/Transaction.h>
23 #include <ripple/app/tx/apply.h>
24 #include <ripple/net/RPCErr.h>
25 #include <ripple/protocol/ErrorCodes.h>
26 #include <ripple/resource/Fees.h>
27 #include <ripple/rpc/Context.h>
28 #include <ripple/rpc/impl/TransactionSign.h>
29 #include <ripple/rpc/GRPCHandlers.h>
30 #include <ripple/rpc/impl/RPCHelpers.h>
31 #include <ripple/rpc/impl/GRPCHelpers.h>
56 "Signing is not supported by this server.");
63 ret[jss::deprecated] =
"Signing support in the 'submit' command has been "
64 "deprecated and will be removed in a future version "
65 "of the server. Please migrate to a standalone "
75 if (!ret || !ret->size ())
84 stpTrans = std::make_shared<STTx const> (
std::ref (sitTrans));
88 jvResult[jss::error] =
"invalidTransaction";
89 jvResult[jss::error_exception] = e.
what ();
104 jvResult[jss::error] =
"invalidTransaction";
105 jvResult[jss::error_exception] =
"fails local checks: " + reason;
112 auto tpTrans = std::make_shared<Transaction> (
113 stpTrans, reason, context.
app);
114 if (tpTrans->getStatus() !=
NEW)
116 jvResult[jss::error] =
"invalidTransaction";
117 jvResult[jss::error_exception] =
"fails local checks: " + reason;
131 jvResult[jss::error] =
"internalSubmit";
132 jvResult[jss::error_exception] = e.
what ();
141 jvResult[jss::tx_blob] =
strHex (
142 tpTrans->getSTransaction ()->getSerializer ().peekData ());
151 jvResult[jss::engine_result] = sToken;
152 jvResult[jss::engine_result_code] = tpTrans->getResult ();
153 jvResult[jss::engine_result_message] = sHuman;
155 auto const submitResult = tpTrans->getSubmitResult();
157 jvResult[jss::accepted] = submitResult.any();
158 jvResult[jss::applied] = submitResult.applied;
159 jvResult[jss::broadcast] = submitResult.broadcast;
160 jvResult[jss::queued] = submitResult.queued;
161 jvResult[jss::kept] = submitResult.kept;
163 if (
auto currentLedgerState = tpTrans->getCurrentLedgerState())
165 jvResult[jss::account_sequence_next]
166 = safe_cast<Json::Value::UInt>(currentLedgerState->accountSeqNext);
167 jvResult[jss::account_sequence_available]
168 = safe_cast<Json::Value::UInt>(currentLedgerState->accountSeqAvail);
169 jvResult[jss::open_ledger_cost]
170 =
to_string(currentLedgerState->minFeeRequired);
171 jvResult[jss::validated_ledger_index]
172 = safe_cast<Json::Value::UInt>(currentLedgerState->validatedLedger);
180 jvResult[jss::error] =
"internalJson";
181 jvResult[jss::error_exception] = e.
what ();
191 org::xrpl::rpc::v1::SubmitTransactionResponse result;
192 grpc::Status status = grpc::Status::OK;
195 auto request = context.
params;
197 std::string const& tx = request.signed_transaction();
207 stpTrans = std::make_shared<STTx const>(
std::ref(sitTrans));
211 grpc::Status errorStatus{
212 grpc::StatusCode::INVALID_ARGUMENT,
214 return {result, errorStatus};
231 grpc::Status errorStatus{grpc::StatusCode::INVALID_ARGUMENT,
232 "invalid transaction: " + reason};
233 return {result, errorStatus};
238 auto tpTrans = std::make_shared<Transaction>(stpTrans, reason, context.
app);
239 if (tpTrans->getStatus() !=
NEW)
241 grpc::Status errorStatus{grpc::StatusCode::INVALID_ARGUMENT,
242 "invalid transaction: " + reason};
243 return {result, errorStatus};
256 grpc::Status errorStatus{
257 grpc::StatusCode::INVALID_ARGUMENT,
259 return {result, errorStatus};
265 RPC::convert(*result.mutable_engine_result(), tpTrans->getResult());
272 result.mutable_engine_result()->set_result(sToken);
273 result.set_engine_result_code(
TERtoInt(tpTrans->getResult()));
274 result.set_engine_result_message(sHuman);
276 uint256 hash = tpTrans->getID();
277 result.set_hash(hash.
data(), hash.
size());
279 return {result, status};