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.
68 auto& sigObject = subField ? jtx[*subField] : jtx.jv;
69
70 // The signing pub key is only required at the top level.
71 if (!subField)
72 {
73 sigObject[sfSigningPubKey] = "";
74 }
75 else if (sigObject.isNull())
76 {
78 }
80 try
81 {
82 st = parse(jtx.jv);
83 }
84 catch (ParseError const&)
85 {
86 env.test.log << pretty(jtx.jv) << std::endl;
87 rethrow();
88 }
89 auto& js = sigObject[sfSigners];
90 for (std::size_t i = 0; i < mySigners.size(); ++i)
91 {
92 auto const& e = mySigners[i];
93 auto& jo = js[i][sfSigner.getJsonName()];
94 jo[jss::Account] = e.acct.human();
95 jo[jss::SigningPubKey] = strHex(e.sig.pk().slice());
96
97 Serializer const ss{buildMultiSigningData(*st, e.acct.id())};
98 auto const sig = xrpl::sign(*publicKeyType(e.sig.pk().slice()), e.sig.sk(), ss.slice());
99 jo[sfTxnSignature.getJsonName()] = strHex(Slice{sig.data(), sig.size()});
100 }
101 };
102 if (subField == nullptr)
103 {
104 jt.mainSigners.emplace_back(callback);
105 }
106 else
107 {
108 jt.postSigners.emplace_back(callback);
109 }
110}
111
112} // namespace xrpl::test::jtx
LogOs< char > log
Logging output stream.
Definition suite.h:146
Represents a JSON value.
Definition json_value.h:130
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
void operator()(Env &, JTx &jt) const
Definition multisign.cpp:63
std::vector< Reg > signers
Definition multisign.h:41
SField const *const subField
Alternative transaction object field in which to place the signer list.
Definition multisign.h:46
T endl(T... args)
@ Object
object value (collection of name/value pairs).
Definition json_value.h:26
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:10
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
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:23
std::vector< std::function< void(Env &, JTx &)> > postSigners
Definition JTx.h:38
std::vector< std::function< void(Env &, JTx &)> > mainSigners
Definition JTx.h:35
Thrown when parse fails.
Definition utility.h:16