xrpld
Loading...
Searching...
No Matches
multisign.cpp
1#include <test/jtx/multisign.h>
2
3#include <test/jtx/Account.h>
4#include <test/jtx/Env.h>
5#include <test/jtx/JTx.h>
6#include <test/jtx/tags.h>
7#include <test/jtx/utility.h>
8
9#include <xrpl/basics/base_uint.h>
10#include <xrpl/basics/contract.h>
11#include <xrpl/basics/strHex.h>
12#include <xrpl/json/json_value.h>
13#include <xrpl/json/to_string.h>
14#include <xrpl/protocol/PublicKey.h>
15#include <xrpl/protocol/SField.h>
16#include <xrpl/protocol/STObject.h>
17#include <xrpl/protocol/SecretKey.h>
18#include <xrpl/protocol/Serializer.h>
19#include <xrpl/protocol/Sign.h>
20#include <xrpl/protocol/jss.h>
21
22#include <cstddef>
23#include <cstdint>
24#include <optional>
25#include <ostream>
26#include <vector>
27
28namespace xrpl::test::jtx {
29
30json::Value
31signers(Account const& account, std::uint32_t quorum, std::vector<Signer> const& v)
32{
33 json::Value jv;
34 jv[jss::Account] = account.human();
35 jv[jss::TransactionType] = jss::SignerListSet;
36 jv[sfSignerQuorum.getJsonName()] = quorum;
37 auto& ja = jv[sfSignerEntries.getJsonName()];
38 for (std::size_t i = 0; i < v.size(); ++i)
39 {
40 auto const& e = v[i];
41 auto& je = ja[i][sfSignerEntry.getJsonName()];
42 je[jss::Account] = e.account.human();
43 je[sfSignerWeight.getJsonName()] = e.weight;
44 if (e.tag)
45 je[sfWalletLocator.getJsonName()] = to_string(*e.tag);
46 }
47 return jv;
48}
49
51signers(Account const& account, NoneT)
52{
53 json::Value jv;
54 jv[jss::Account] = account.human();
55 jv[jss::TransactionType] = jss::SignerListSet;
56 jv[sfSignerQuorum.getJsonName()] = 0;
57 return jv;
58}
59
60//------------------------------------------------------------------------------
61
62void
63Msig::operator()(Env& env, JTx& jt) const
64{
65 auto const mySigners = signers;
66 auto callback = [subField = subField, mySigners, &env](Env&, JTx& jtx) {
67 // Where to put the signature. Supports sfCounterPartySignature and
68 // sfSponsorSignature.
69 auto& sigObject = subField ? jtx[*subField] : jtx.jv;
70
71 // The signing pub key is only required at the top level.
72 if (!subField)
73 {
74 sigObject[sfSigningPubKey] = "";
75 }
76 else if (sigObject.isNull())
77 {
79 }
81 try
82 {
83 st = parse(jtx.jv);
84 }
85 catch (ParseError const&)
86 {
87 env.test.log << pretty(jtx.jv) << std::endl;
88 rethrow();
89 }
90 auto& js = sigObject[sfSigners];
91 for (std::size_t i = 0; i < mySigners.size(); ++i)
92 {
93 auto const& e = mySigners[i];
94 auto& jo = js[i][sfSigner.getJsonName()];
95 jo[jss::Account] = e.acct.human();
96 jo[jss::SigningPubKey] = strHex(e.sig.pk().slice());
97
98 Serializer const ss{buildMultiSigningData(*st, e.acct.id())};
99 auto const sig = xrpl::sign(*publicKeyType(e.sig.pk().slice()), e.sig.sk(), ss.slice());
100 jo[sfTxnSignature.getJsonName()] = strHex(Slice{sig.data(), sig.size()});
101 }
102 };
103 if (subField == nullptr)
104 {
105 jt.mainSigners.emplace_back(callback);
106 }
107 else
108 {
109 jt.postSigners.emplace_back(callback);
110 }
111}
112
113} // namespace xrpl::test::jtx
LogOs< char > log
Logging output stream.
Definition suite.h:150
Represents a JSON value.
Definition json_value.h:117
Slice slice() const noexcept
Definition Serializer.h:45
An immutable linear range of bytes.
Definition Slice.h:28
Immutable cryptographic account descriptor.
Definition jtx/Account.h:21
A transaction testing environment.
Definition Env.h:161
beast::unit_test::Suite & test
Definition Env.h:163
void operator()(Env &, JTx &jt) const
Definition multisign.cpp:63
std::vector< Reg > signers
Definition multisign.h:55
SField const *const subField
Alternative transaction object field in which to place the signer list.
Definition multisign.h:61
T endl(T... args)
@ Object
object value (collection of name/value pairs).
Definition json_value.h:29
STObject parse(json::Value const &jv)
Convert JSON to STObject.
Definition utility.cpp:31
json::Value signers(Account const &account, std::uint32_t quorum, std::vector< Signer > const &v)
Definition multisign.cpp:31
std::string strHex(FwdIt begin, FwdIt end)
Definition strHex.h:13
std::string to_string(BaseUInt< Bits, Tag > const &a)
Definition base_uint.h:651
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:36
Buffer sign(PublicKey const &pk, SecretKey const &sk, Slice const &message)
Generate a signature for a message.
Serializer buildMultiSigningData(STObject const &obj, AccountID const &signingID)
Return a Serializer suitable for computing a multisigning TxnSignature.
T size(T... args)
Execution context for applying a JSON transaction.
Definition JTx.h:27
std::vector< std::function< void(Env &, JTx &)> > postSigners
Definition JTx.h:42
std::vector< std::function< void(Env &, JTx &)> > mainSigners
Definition JTx.h:39
Thrown when parse fails.
Definition utility.h:20