xrpld
Loading...
Searching...
No Matches
batch.cpp
1#include <test/jtx/batch.h>
2
3#include <test/jtx/Account.h>
4#include <test/jtx/Env.h>
5#include <test/jtx/JTx.h>
6#include <test/jtx/utility.h>
7
8#include <xrpl/basics/Number.h>
9#include <xrpl/basics/contract.h>
10#include <xrpl/basics/strHex.h>
11#include <xrpl/json/json_value.h>
12#include <xrpl/json/to_string.h>
13#include <xrpl/protocol/Batch.h>
14#include <xrpl/protocol/Protocol.h>
15#include <xrpl/protocol/PublicKey.h>
16#include <xrpl/protocol/SField.h>
17#include <xrpl/protocol/STAmount.h>
18#include <xrpl/protocol/STObject.h>
19#include <xrpl/protocol/STTx.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 <cstddef>
27#include <cstdint>
28#include <optional>
29#include <ostream>
30#include <utility>
31
32namespace xrpl::test::jtx::batch {
33
35calcBatchFee(test::jtx::Env const& env, uint32_t const& numSigners, uint32_t const& txns)
36{
37 XRPAmount const feeDrops = env.current()->fees().base;
38 return ((numSigners + 2) * feeDrops) + feeDrops * txns;
39}
40
43 test::jtx::Env const& env,
44 uint32_t const& numSigners,
45 uint32_t const& txns)
46{
47 XRPAmount const feeDrops = env.current()->fees().base;
48 return ((numSigners + 2) * feeDrops) + feeDrops * (kConfidentialFeeMultiplier + 1) * txns;
49}
50
51// Batch.
53outer(jtx::Account const& account, uint32_t seq, STAmount const& fee, std::uint32_t flags)
54{
55 json::Value jv;
56 jv[jss::TransactionType] = jss::Batch;
57 jv[jss::Account] = account.human();
58 jv[jss::RawTransactions] = json::Value{json::ValueType::Array};
59 jv[jss::Sequence] = seq;
60 jv[jss::Flags] = flags;
61 jv[jss::Fee] = to_string(fee);
62 return jv;
63}
64
65void
66Inner::operator()(Env& env, JTx& jt) const
67{
68 auto const index = jt.jv[jss::RawTransactions].size();
69 json::Value& batchTransaction = jt.jv[jss::RawTransactions][index];
70
71 // Initialize the batch transaction
72 batchTransaction = json::Value{};
73 batchTransaction[jss::RawTransaction] = txn_;
74}
75
76void
77Sig::operator()(Env& env, JTx& jt) const
78{
79 auto const mySigners = signers;
81 try
82 {
83 // required to cast the STObject to STTx
84 jt.jv[jss::SigningPubKey] = "";
85 st = parse(jt.jv);
86 }
87 catch (ParseError const&)
88 {
89 env.test.log << pretty(jt.jv) << std::endl;
90 rethrow();
91 }
92 STTx const& stx = STTx{std::move(*st)};
93 auto& js = jt[sfBatchSigners.getJsonName()];
94 for (std::size_t i = 0; i < mySigners.size(); ++i)
95 {
96 auto const& e = mySigners[i];
97 auto& jo = js[i][sfBatchSigner.getJsonName()];
98 jo[jss::Account] = e.acct.human();
99 jo[jss::SigningPubKey] = strHex(e.sig.pk().slice());
100
101 Serializer msg;
103 // NOLINTNEXTLINE(bugprone-unchecked-optional-access)
104 auto const sig = xrpl::sign(*publicKeyType(e.sig.pk().slice()), e.sig.sk(), msg.slice());
105 jo[sfTxnSignature.getJsonName()] = strHex(Slice{sig.data(), sig.size()});
106 }
107}
108
109void
110Msig::operator()(Env& env, JTx& jt) const
111{
112 auto const mySigners = signers;
114 try
115 {
116 // required to cast the STObject to STTx
117 jt.jv[jss::SigningPubKey] = "";
118 st = parse(jt.jv);
119 }
120 catch (ParseError const&)
121 {
122 env.test.log << pretty(jt.jv) << std::endl;
123 rethrow();
124 }
125 STTx const& stx = STTx{std::move(*st)};
126 auto& bs = jt[sfBatchSigners.getJsonName()];
127 auto const index = jt[sfBatchSigners.jsonName].size();
128 auto& bso = bs[index][sfBatchSigner.getJsonName()];
129 bso[jss::Account] = master.human();
130 bso[jss::SigningPubKey] = "";
131 auto& is = bso[sfSigners.getJsonName()];
132 for (std::size_t i = 0; i < mySigners.size(); ++i)
133 {
134 auto const& e = mySigners[i];
135 auto& iso = is[i][sfSigner.getJsonName()];
136 iso[jss::Account] = e.acct.human();
137 iso[jss::SigningPubKey] = strHex(e.sig.pk().slice());
138
139 Serializer msg;
141 finishMultiSigningData(e.acct.id(), msg);
142 // NOLINTNEXTLINE(bugprone-unchecked-optional-access)
143 auto const sig = xrpl::sign(*publicKeyType(e.sig.pk().slice()), e.sig.sk(), msg.slice());
144 iso[sfTxnSignature.getJsonName()] = strHex(Slice{sig.data(), sig.size()});
145 }
146}
147
148} // namespace xrpl::test::jtx::batch
LogOs< char > log
Logging output stream.
Definition suite.h:146
Represents a JSON value.
Definition json_value.h:130
UInt size() const
Number of values in array or object.
std::uint32_t getFlags() const
Definition STObject.cpp:507
std::vector< uint256 > const & getBatchTransactionIDs() const
Retrieves a batch of transaction IDs from the STTx.
Definition STTx.cpp:574
Slice slice() const noexcept
Definition Serializer.h:44
An immutable linear range of bytes.
Definition Slice.h:26
Immutable cryptographic account descriptor.
Definition jtx/Account.h:17
A transaction testing environment.
Definition Env.h:143
beast::unit_test::Suite & test
Definition Env.h:145
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
Definition Env.h:353
void operator()(Env &, JTx &jtx) const
Definition batch.cpp:66
std::vector< Reg > signers
Definition batch.h:134
void operator()(Env &, JTx &jt) const
Definition batch.cpp:110
std::vector< Reg > signers
Definition batch.h:110
void operator()(Env &, JTx &jt) const
Definition batch.cpp:77
T endl(T... args)
@ Array
array value (ordered list)
Definition json_value.h:25
Helpers for constructing Batch test transactions.
Definition batch.h:18
XRPAmount calcConfidentialBatchFee(jtx::Env const &env, uint32_t const &numSigners, uint32_t const &txns=0)
Calculate the expected Batch fee when inner transactions are confidential MPT transactions.
Definition batch.cpp:42
json::Value outer(jtx::Account const &account, uint32_t seq, STAmount const &fee, std::uint32_t flags)
Build an outer Batch transaction JSON object.
Definition batch.cpp:53
XRPAmount calcBatchFee(jtx::Env const &env, uint32_t const &numSigners, uint32_t const &txns=0)
Calculate the expected outer Batch transaction fee.
Definition batch.cpp:35
STObject parse(json::Value const &jv)
Convert JSON to STObject.
Definition utility.cpp:31
constexpr XRPAmount
Convert XRP to drops (integral types).
Definition TxTest.h:48
std::string strHex(FwdIt begin, FwdIt end)
Definition strHex.h:10
constexpr std::uint32_t kConfidentialFeeMultiplier
Extra base fee multiplier charged to confidential MPT transactions.
Definition Protocol.h:364
std::string to_string(BaseUInt< Bits, Tag > const &a)
Definition base_uint.h:633
std::optional< KeyType > publicKeyType(Slice const &slice)
Returns the type of public key.
XRPL_NO_SANITIZE_ADDRESS void rethrow()
Rethrow the exception currently being handled.
Definition contract.h:33
void finishMultiSigningData(AccountID const &signingID, Serializer &s)
Definition Sign.h:64
Buffer sign(PublicKey const &pk, SecretKey const &sk, Slice const &message)
Generate a signature for a message.
void serializeBatch(Serializer &msg, std::uint32_t const &flags, std::vector< uint256 > const &txids)
Execution context for applying a JSON transaction.
Definition JTx.h:23
json::Value jv
Definition JTx.h:24
Thrown when parse fails.
Definition utility.h:16