xrpld
Loading...
Searching...
No Matches
utility.cpp
1#include <test/jtx/utility.h>
2
3#include <test/jtx/Account.h>
4
5#include <xrpld/rpc/RPCCall.h>
6
7#include <xrpl/basics/contract.h>
8#include <xrpl/basics/strHex.h>
9#include <xrpl/beast/utility/Journal.h>
10#include <xrpl/json/json_value.h>
11#include <xrpl/ledger/ReadView.h>
12#include <xrpl/protocol/AccountID.h>
13#include <xrpl/protocol/ErrorCodes.h>
14#include <xrpl/protocol/HashPrefix.h>
15#include <xrpl/protocol/Indexes.h>
16#include <xrpl/protocol/Protocol.h>
17#include <xrpl/protocol/SField.h>
18#include <xrpl/protocol/STObject.h>
19#include <xrpl/protocol/STParsedJSON.h>
20#include <xrpl/protocol/SecretKey.h>
21#include <xrpl/protocol/Serializer.h>
22#include <xrpl/protocol/Sign.h>
23#include <xrpl/protocol/XRPAmount.h>
24#include <xrpl/protocol/jss.h>
25
26#include <stdexcept>
27#include <utility>
28#include <vector>
29
30namespace xrpl::test::jtx {
31
32STObject
34{
35 STParsedJSONObject p("tx_json", jv);
36 if (!p.object)
38 return std::move(*p.object);
39}
40
42signatureRole(SField const* subField)
43{
44 if (subField == nullptr)
46 if (auto const role = xrpl::signatureRole(*subField))
47 return *role;
48 Throw<std::runtime_error>(subField->getName() + " does not hold a transaction signature.");
49}
50
51void
52sign(json::Value& jv, Account const& account, json::Value& sigObject, HashPrefix prefix)
53{
54 sigObject[jss::SigningPubKey] = strHex(account.pk().slice());
55 Serializer ss;
56 ss.add32(prefix);
58 auto const sig = xrpl::sign(account.pk(), account.sk(), ss.slice());
59 sigObject[jss::TxnSignature] = strHex(Slice{sig.data(), sig.size()});
60}
61
62void
63sign(json::Value& jv, Account const& account)
64{
65 sign(jv, account, jv);
66}
67
68void
69fillFee(json::Value& jv, ReadView const& view)
70{
71 if (jv.isMember(jss::Fee))
72 return;
73
74 auto const base = view.fees().base;
75
76 // For confidential transactions, the fee is higher because confidential
77 // transaction processing is more expensive.
78 auto const txType = jv[jss::TransactionType].asString();
79 if (txType == jss::ConfidentialMPTConvert || txType == jss::ConfidentialMPTConvertBack ||
80 txType == jss::ConfidentialMPTSend || txType == jss::ConfidentialMPTMergeInbox ||
81 txType == jss::ConfidentialMPTClawback || txType == jss::ConfidentialMPTMirrorUpdate ||
82 txType == jss::ConfidentialMPTHolderKeyUpdate)
83 {
84 jv[jss::Fee] = to_string(base * (kConfidentialFeeMultiplier + 1));
85 }
86 else
87 {
88 jv[jss::Fee] = to_string(base);
89 }
90}
91
92void
93fillSeq(json::Value& jv, ReadView const& view)
94{
95 if (jv.isMember(jss::Sequence))
96 return;
97 auto const account = parseBase58<AccountID>(jv[jss::Account].asString());
98 if (!account)
99 Throw<ParseError>("unexpected invalid Account");
100 auto const ar = view.read(keylet::account(*account));
101 if (!ar)
102 Throw<ParseError>("unexpected missing account root");
103 jv[jss::Sequence] = ar->getFieldU32(sfSequence);
104}
105
107cmdToJSONRPC(std::vector<std::string> const& args, beast::Journal j, unsigned int apiVersion)
108{
110 auto const paramsObj = rpcCmdToJson(args, jv, apiVersion, j);
111
112 // Re-use jv to return our formatted result.
113 jv.clear();
114
115 // Allow parser to rewrite method.
116 jv[jss::method] = paramsObj.isMember(jss::method) ? paramsObj[jss::method].asString() : args[0];
117
118 // If paramsObj is not empty, put it in a [params] array.
119 if (paramsObj.begin() != paramsObj.end())
120 {
121 auto& paramsArray = jv[jss::params] = json::ValueType::Array;
122 paramsArray.append(paramsObj);
123 }
124 if (paramsObj.isMember(jss::jsonrpc))
125 jv[jss::jsonrpc] = paramsObj[jss::jsonrpc];
126 if (paramsObj.isMember(jss::ripplerpc))
127 jv[jss::ripplerpc] = paramsObj[jss::ripplerpc];
128 if (paramsObj.isMember(jss::id))
129 jv[jss::id] = paramsObj[jss::id];
130 return jv;
131}
132} // namespace xrpl::test::jtx
A generic endpoint for log messages.
Definition Journal.h:44
Represents a JSON value.
Definition json_value.h:117
std::string asString() const
Returns the unquoted string value.
bool isMember(char const *key) const
Return true if the object has a member named key.
void clear()
Remove all object members and array elements.
A view into a ledger.
Definition ReadView.h:41
virtual Fees const & fees() const =0
Returns the fees for the base ledger.
virtual SLE::const_pointer read(Keylet const &k) const =0
Return the state item associated with a key.
Identifies fields.
Definition SField.h:132
std::string const & getName() const
Definition SField.h:198
void addWithoutSigningFields(Serializer &s) const
Definition STObject.h:994
Holds the serialized result of parsing an input JSON object.
std::optional< STObject > object
The STObject if the parse was successful.
json::Value error
On failure, an appropriate set of error values.
Slice slice() const noexcept
Definition Serializer.h:141
An immutable linear range of bytes.
Definition Slice.h:28
Immutable cryptographic account descriptor.
Definition jtx/Account.h:21
@ Array
array value (ordered list)
Definition json_value.h:28
@ Object
object value (collection of name/value pairs).
Definition json_value.h:29
Keylet account(AccountID const &id) noexcept
AccountID root.
Definition Indexes.cpp:220
void sign(json::Value &jv, Account const &account, json::Value &sigObject, HashPrefix prefix)
Sign automatically into a specific Json field of the jv object.
Definition utility.cpp:52
void fillFee(json::Value &jv, ReadView const &view)
Set the fee automatically.
Definition utility.cpp:69
STObject parse(json::Value const &jv)
Convert JSON to STObject.
Definition utility.cpp:33
json::Value cmdToJSONRPC(std::vector< std::string > const &args, beast::Journal j, unsigned int apiVersion)
Given an xrpld unit test rpc command, return the corresponding JSON.
Definition utility.cpp:107
void fillSeq(json::Value &jv, ReadView const &view)
Set the sequence number automatically.
Definition utility.cpp:93
SignatureRole signatureRole(SField const *subField)
The role that signs into an optional signature subfield.
Definition utility.cpp:42
std::optional< SignatureRole > signatureRole(SField const &sigField)
The role that signs into the given field.
std::optional< AccountID > parseBase58(std::string const &s)
Parse AccountID from checked, base58 string.
std::string strHex(FwdIt begin, FwdIt end)
Definition strHex.h:13
constexpr std::uint32_t kConfidentialFeeMultiplier
Extra base fee multiplier charged to confidential MPT transactions.
Definition Protocol.h:551
std::string to_string(BaseUInt< Bits, Tag > const &a)
Definition base_uint.h:657
json::Value rpcCmdToJson(std::vector< std::string > const &args, json::Value &retParams, unsigned int apiVersion, beast::Journal j)
Definition RPCCall.cpp:1916
std::string rpcErrorString(json::Value const &jv)
Returns a single string with the contents of an RPC error.
SignatureRole
The signature slots on a transaction.
Definition Sign.h:23
@ Transaction
The transaction's own signature, in sfTxnSignature or sfSigners.
Definition Sign.h:27
HashPrefix
Prefix for hashing functions.
Definition HashPrefix.h:35
Buffer sign(PublicKey const &pk, SecretKey const &sk, Slice const &message)
Generate a signature for a message.
XRPL_NO_SANITIZE_ADDRESS void Throw(Args &&... args)
Definition contract.h:52
XRPAmount base
Cost of a reference transaction in drops.