rippled
Loading...
Searching...
No Matches
multisign.cpp
1#include <test/jtx/multisign.h>
2#include <test/jtx/utility.h>
3
4#include <xrpl/basics/contract.h>
5#include <xrpl/protocol/Sign.h>
6#include <xrpl/protocol/jss.h>
7
8#include <optional>
9
10namespace xrpl {
11namespace test {
12namespace jtx {
13
15signers(Account const& account, std::uint32_t quorum, std::vector<signer> const& v)
16{
17 Json::Value jv;
18 jv[jss::Account] = account.human();
19 jv[jss::TransactionType] = jss::SignerListSet;
20 jv[sfSignerQuorum.getJsonName()] = quorum;
21 auto& ja = jv[sfSignerEntries.getJsonName()];
22 for (std::size_t i = 0; i < v.size(); ++i)
23 {
24 auto const& e = v[i];
25 auto& je = ja[i][sfSignerEntry.getJsonName()];
26 je[jss::Account] = e.account.human();
27 je[sfSignerWeight.getJsonName()] = e.weight;
28 if (e.tag)
29 je[sfWalletLocator.getJsonName()] = to_string(*e.tag);
30 }
31 return jv;
32}
33
35signers(Account const& account, none_t)
36{
37 Json::Value jv;
38 jv[jss::Account] = account.human();
39 jv[jss::TransactionType] = jss::SignerListSet;
40 jv[sfSignerQuorum.getJsonName()] = 0;
41 return jv;
42}
43
44//------------------------------------------------------------------------------
45
46void
47msig::operator()(Env& env, JTx& jt) const
48{
49 auto const mySigners = signers;
50 auto callback = [subField = subField, mySigners, &env](Env&, JTx& jtx) {
51 // Where to put the signature. Supports sfCounterPartySignature.
52 auto& sigObject = subField ? jtx[*subField] : jtx.jv;
53
54 // The signing pub key is only required at the top level.
55 if (!subField)
56 sigObject[sfSigningPubKey] = "";
57 else if (sigObject.isNull())
58 sigObject = Json::Value(Json::objectValue);
60 try
61 {
62 st = parse(jtx.jv);
63 }
64 catch (parse_error const&)
65 {
66 env.test.log << pretty(jtx.jv) << std::endl;
67 Rethrow();
68 }
69 auto& js = sigObject[sfSigners];
70 for (std::size_t i = 0; i < mySigners.size(); ++i)
71 {
72 auto const& e = mySigners[i];
73 auto& jo = js[i][sfSigner.getJsonName()];
74 jo[jss::Account] = e.acct.human();
75 jo[jss::SigningPubKey] = strHex(e.sig.pk().slice());
76
77 Serializer ss{buildMultiSigningData(*st, e.acct.id())};
78 auto const sig = xrpl::sign(*publicKeyType(e.sig.pk().slice()), e.sig.sk(), ss.slice());
79 jo[sfTxnSignature.getJsonName()] = strHex(Slice{sig.data(), sig.size()});
80 }
81 };
82 if (!subField)
83 jt.mainSigners.emplace_back(callback);
84 else
85 jt.postSigners.emplace_back(callback);
86}
87
88} // namespace jtx
89} // namespace test
90} // namespace xrpl
Represents a JSON value.
Definition json_value.h:131
log_os< char > log
Logging output stream.
Definition suite.h:145
An immutable linear range of bytes.
Definition Slice.h:27
Immutable cryptographic account descriptor.
Definition Account.h:20
A transaction testing environment.
Definition Env.h:98
beast::unit_test::suite & test
Definition Env.h:100
void operator()(Env &, JTx &jt) const
Definition multisign.cpp:47
SField const *const subField
Alternative transaction object field in which to place the signer list.
Definition multisign.h:49
std::vector< Reg > signers
Definition multisign.h:44
Set the regular signature on a JTx.
Definition sig.h:16
T endl(T... args)
@ objectValue
object value (collection of name/value pairs).
Definition json_value.h:27
Json::Value signers(Account const &account, std::uint32_t quorum, std::vector< signer > const &v)
Definition multisign.cpp:15
STObject parse(Json::Value const &jv)
Convert JSON to STObject.
Definition utility.cpp:18
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6
std::string to_string(base_uint< Bits, Tag > const &a)
Definition base_uint.h:598
std::string strHex(FwdIt begin, FwdIt end)
Definition strHex.h:11
std::optional< KeyType > publicKeyType(Slice const &slice)
Returns the type of public key.
Buffer sign(PublicKey const &pk, SecretKey const &sk, Slice const &message)
Generate a signature for a message.
void Rethrow()
Rethrow the exception currently being handled.
Definition contract.h:29
Serializer buildMultiSigningData(STObject const &obj, AccountID const &signingID)
Return a Serializer suitable for computing a multisigning TxnSignature.
Definition Sign.cpp:67
T size(T... args)
Execution context for applying a JSON transaction.
Definition JTx.h:26
std::vector< std::function< void(Env &, JTx &)> > postSigners
Definition JTx.h:41
std::vector< std::function< void(Env &, JTx &)> > mainSigners
Definition JTx.h:38
Thrown when parse fails.
Definition utility.h:19