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/GRPCHandlers.h>
29 #include <ripple/rpc/impl/GRPCHelpers.h>
30 #include <ripple/rpc/impl/RPCHelpers.h>
31 #include <ripple/rpc/impl/TransactionSign.h>
68 ret[jss::deprecated] =
69 "Signing support in the 'submit' command has been "
70 "deprecated and will be removed in a future version "
71 "of the server. Please migrate to a standalone "
81 if (!ret || !ret->size())
90 stpTrans = std::make_shared<STTx const>(
std::ref(sitTrans));
94 jvResult[jss::error] =
"invalidTransaction";
95 jvResult[jss::error_exception] = e.
what();
113 jvResult[jss::error] =
"invalidTransaction";
114 jvResult[jss::error_exception] =
"fails local checks: " + reason;
121 auto tpTrans = std::make_shared<Transaction>(stpTrans, reason, context.
app);
122 if (tpTrans->getStatus() !=
NEW)
124 jvResult[jss::error] =
"invalidTransaction";
125 jvResult[jss::error_exception] =
"fails local checks: " + reason;
139 jvResult[jss::error] =
"internalSubmit";
140 jvResult[jss::error_exception] = e.
what();
148 jvResult[jss::tx_blob] =
149 strHex(tpTrans->getSTransaction()->getSerializer().peekData());
158 jvResult[jss::engine_result] = sToken;
159 jvResult[jss::engine_result_code] = tpTrans->getResult();
160 jvResult[jss::engine_result_message] = sHuman;
162 auto const submitResult = tpTrans->getSubmitResult();
164 jvResult[jss::accepted] = submitResult.any();
165 jvResult[jss::applied] = submitResult.applied;
166 jvResult[jss::broadcast] = submitResult.broadcast;
167 jvResult[jss::queued] = submitResult.queued;
168 jvResult[jss::kept] = submitResult.kept;
170 if (
auto currentLedgerState = tpTrans->getCurrentLedgerState())
172 jvResult[jss::account_sequence_next] =
173 safe_cast<Json::Value::UInt>(
174 currentLedgerState->accountSeqNext);
175 jvResult[jss::account_sequence_available] =
176 safe_cast<Json::Value::UInt>(
177 currentLedgerState->accountSeqAvail);
178 jvResult[jss::open_ledger_cost] =
179 to_string(currentLedgerState->minFeeRequired);
180 jvResult[jss::validated_ledger_index] =
181 safe_cast<Json::Value::UInt>(
182 currentLedgerState->validatedLedger);
190 jvResult[jss::error] =
"internalJson";
191 jvResult[jss::error_exception] = e.
what();
202 org::xrpl::rpc::v1::SubmitTransactionResponse result;
203 grpc::Status status = grpc::Status::OK;
206 auto request = context.
params;
208 std::string const& tx = request.signed_transaction();
218 stpTrans = std::make_shared<STTx const>(
std::ref(sitTrans));
222 grpc::Status errorStatus{
223 grpc::StatusCode::INVALID_ARGUMENT,
225 return {result, errorStatus};
242 grpc::Status errorStatus{
243 grpc::StatusCode::INVALID_ARGUMENT,
244 "invalid transaction: " + reason};
245 return {result, errorStatus};
250 auto tpTrans = std::make_shared<Transaction>(stpTrans, reason, context.
app);
251 if (tpTrans->getStatus() !=
NEW)
253 grpc::Status errorStatus{
254 grpc::StatusCode::INVALID_ARGUMENT,
255 "invalid transaction: " + reason};
256 return {result, errorStatus};
269 grpc::Status errorStatus{
270 grpc::StatusCode::INVALID_ARGUMENT,
272 return {result, errorStatus};
278 RPC::convert(*result.mutable_engine_result(), tpTrans->getResult());
285 result.mutable_engine_result()->set_result(sToken);
286 result.set_engine_result_code(
TERtoInt(tpTrans->getResult()));
287 result.set_engine_result_message(sHuman);
289 uint256 hash = tpTrans->getID();
290 result.set_hash(hash.
data(), hash.
size());
292 return {result, status};