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