xrpld
Loading...
Searching...
No Matches
AmendmentBlocked_test.cpp
1#include <test/jtx/Env.h>
2#include <test/jtx/WSClient.h>
3#include <test/jtx/amount.h>
4#include <test/jtx/envconfig.h>
5#include <test/jtx/multisign.h>
6#include <test/jtx/noop.h>
7#include <test/jtx/pay.h>
8#include <test/jtx/regkey.h>
9#include <test/jtx/sig.h>
10
11#include <xrpld/core/Config.h>
12
13#include <xrpl/basics/strHex.h>
14#include <xrpl/beast/unit_test/suite.h>
15#include <xrpl/config/Constants.h>
16#include <xrpl/json/to_string.h>
17#include <xrpl/protocol/KeyType.h>
18#include <xrpl/protocol/Serializer.h>
19#include <xrpl/protocol/jss.h>
20#include <xrpl/server/NetworkOPs.h>
21
22#include <memory>
23#include <string>
24
25namespace xrpl {
26
28{
29 void
31 {
32 using namespace test::jtx;
33 Env env{*this, envconfig([](std::unique_ptr<Config> cfg) {
34 cfg->loadFromString(std::string("[") + Sections::kSigningSupport + "]\ntrue");
35 return cfg;
36 })};
37 auto const gw = Account{"gateway"};
38 auto const usd = gw["USD"];
39 auto const alice = Account{"alice"};
40 auto const bob = Account{"bob"};
41 Account const ali{"ali", KeyType::Secp256k1};
42 env.fund(XRP(10000), alice, bob, gw);
43 env.memoize(ali);
44 // This close() ensures that all the accounts get created and their
45 // default ripple flag gets set before the trust lines are created.
46 // Without it, the ordering manages to create alice's trust line with
47 // noRipple set on gw's end. The existing tests pass either way, but
48 // better to do it right.
49 env.close();
50 env.trust(usd(600), alice);
51 env.trust(usd(700), bob);
52 env(pay(gw, alice, usd(70)));
53 env(pay(gw, bob, usd(50)));
54 env.close();
55
56 auto wsc = test::makeWSClient(env.app().config());
57
58 auto current = env.current();
59 // ledger_accept
60 auto jr = env.rpc("ledger_accept")[jss::result];
61 BEAST_EXPECT(jr[jss::ledger_current_index] == current->seq() + 1);
62 BEAST_EXPECT(!jr.isMember(jss::warnings));
63
64 // ledger_current
65 jr = env.rpc("ledger_current")[jss::result];
66 BEAST_EXPECT(jr[jss::ledger_current_index] == current->seq() + 1);
67 BEAST_EXPECT(!jr.isMember(jss::warnings));
68
69 // owner_info
70 jr = env.rpc("owner_info", alice.human())[jss::result];
71 BEAST_EXPECT(jr.isMember(jss::accepted) && jr.isMember(jss::current));
72 BEAST_EXPECT(!jr.isMember(jss::warnings));
73
74 // path_find
75 json::Value pfReq;
76 pfReq[jss::subcommand] = "create";
77 pfReq[jss::source_account] = alice.human();
78 pfReq[jss::destination_account] = bob.human();
79 pfReq[jss::destination_amount] = bob["USD"](20).value().getJson(JsonOptions::Values::None);
80 jr = wsc->invoke("path_find", pfReq)[jss::result];
81 BEAST_EXPECT(
82 jr.isMember(jss::alternatives) && jr[jss::alternatives].isArray() &&
83 jr[jss::alternatives].size() == 1);
84 BEAST_EXPECT(!jr.isMember(jss::warnings));
85
86 // submit
87 auto jt = env.jt(noop(alice));
88 Serializer s;
89 jt.stx->add(s);
90 jr = env.rpc("submit", strHex(s.slice()))[jss::result];
91 BEAST_EXPECT(jr.isMember(jss::engine_result) && jr[jss::engine_result] == "tesSUCCESS");
92 BEAST_EXPECT(!jr.isMember(jss::warnings));
93
94 // submit_multisigned
95 env(signers(bob, 1, {{alice, 1}}), Sig(bob));
96 env(regkey(alice, ali));
97 env.close();
98
99 json::Value setTx;
100 setTx[jss::Account] = bob.human();
101 setTx[jss::TransactionType] = jss::AccountSet;
102 setTx[jss::Fee] = (8 * env.current()->fees().base).jsonClipped();
103 setTx[jss::Sequence] = env.seq(bob);
104 setTx[jss::SigningPubKey] = "";
105
106 json::Value signFor;
107 signFor[jss::tx_json] = setTx;
108 signFor[jss::account] = alice.human();
109 signFor[jss::secret] = ali.name();
110 jr = env.rpc("json", "sign_for", to_string(signFor))[jss::result];
111 BEAST_EXPECT(jr[jss::status] == "success");
112 BEAST_EXPECT(!jr.isMember(jss::warnings));
113
114 json::Value msReq;
115 msReq[jss::tx_json] = jr[jss::tx_json];
116 jr = env.rpc("json", "submit_multisigned", to_string(msReq))[jss::result];
117 BEAST_EXPECT(jr.isMember(jss::engine_result) && jr[jss::engine_result] == "tesSUCCESS");
118 BEAST_EXPECT(!jr.isMember(jss::warnings));
119
120 // set up an amendment warning. Nothing changes
121
122 env.app().getOPs().setAmendmentWarned();
123
124 current = env.current();
125 // ledger_accept
126 jr = env.rpc("ledger_accept")[jss::result];
127 BEAST_EXPECT(jr[jss::ledger_current_index] == current->seq() + 1);
128 BEAST_EXPECT(!jr.isMember(jss::warnings));
129
130 // ledger_current
131 jr = env.rpc("ledger_current")[jss::result];
132 BEAST_EXPECT(jr[jss::ledger_current_index] == current->seq() + 1);
133 BEAST_EXPECT(!jr.isMember(jss::warnings));
134
135 // owner_info
136 jr = env.rpc("owner_info", alice.human())[jss::result];
137 BEAST_EXPECT(jr.isMember(jss::accepted) && jr.isMember(jss::current));
138 BEAST_EXPECT(!jr.isMember(jss::warnings));
139
140 // path_find
141 pfReq[jss::subcommand] = "create";
142 pfReq[jss::source_account] = alice.human();
143 pfReq[jss::destination_account] = bob.human();
144 pfReq[jss::destination_amount] = bob["USD"](20).value().getJson(JsonOptions::Values::None);
145 jr = wsc->invoke("path_find", pfReq)[jss::result];
146 BEAST_EXPECT(
147 jr.isMember(jss::alternatives) && jr[jss::alternatives].isArray() &&
148 jr[jss::alternatives].size() == 1);
149 BEAST_EXPECT(!jr.isMember(jss::warnings));
150
151 // submit
152 jt = env.jt(noop(alice));
153 s.erase();
154 jt.stx->add(s);
155 jr = env.rpc("submit", strHex(s.slice()))[jss::result];
156 BEAST_EXPECT(jr.isMember(jss::engine_result) && jr[jss::engine_result] == "tesSUCCESS");
157 BEAST_EXPECT(!jr.isMember(jss::warnings));
158
159 // submit_multisigned
160 env(signers(bob, 1, {{alice, 1}}), Sig(bob));
161 env(regkey(alice, ali));
162 env.close();
163
164 setTx[jss::Account] = bob.human();
165 setTx[jss::TransactionType] = jss::AccountSet;
166 setTx[jss::Fee] = (8 * env.current()->fees().base).jsonClipped();
167 setTx[jss::Sequence] = env.seq(bob);
168 setTx[jss::SigningPubKey] = "";
169
170 signFor[jss::tx_json] = setTx;
171 signFor[jss::account] = alice.human();
172 signFor[jss::secret] = ali.name();
173 jr = env.rpc("json", "sign_for", to_string(signFor))[jss::result];
174 BEAST_EXPECT(jr[jss::status] == "success");
175 BEAST_EXPECT(!jr.isMember(jss::warnings));
176
177 msReq[jss::tx_json] = jr[jss::tx_json];
178 jr = env.rpc("json", "submit_multisigned", to_string(msReq))[jss::result];
179 BEAST_EXPECT(jr.isMember(jss::engine_result) && jr[jss::engine_result] == "tesSUCCESS");
180 BEAST_EXPECT(!jr.isMember(jss::warnings));
181
182 // make the network amendment blocked...now all the same
183 // requests should fail
184
185 env.app().getOPs().setAmendmentBlocked();
186
187 // ledger_accept
188 jr = env.rpc("ledger_accept")[jss::result];
189 BEAST_EXPECT(jr.isMember(jss::error) && jr[jss::error] == "amendmentBlocked");
190 BEAST_EXPECT(jr[jss::status] == "error");
191 BEAST_EXPECT(!jr.isMember(jss::warnings));
192
193 // ledger_current
194 jr = env.rpc("ledger_current")[jss::result];
195 BEAST_EXPECT(jr.isMember(jss::error) && jr[jss::error] == "amendmentBlocked");
196 BEAST_EXPECT(jr[jss::status] == "error");
197 BEAST_EXPECT(!jr.isMember(jss::warnings));
198
199 // owner_info
200 jr = env.rpc("owner_info", alice.human())[jss::result];
201 BEAST_EXPECT(jr.isMember(jss::error) && jr[jss::error] == "amendmentBlocked");
202 BEAST_EXPECT(jr[jss::status] == "error");
203 BEAST_EXPECT(!jr.isMember(jss::warnings));
204
205 // path_find
206 jr = wsc->invoke("path_find", pfReq)[jss::result];
207 BEAST_EXPECT(jr.isMember(jss::error) && jr[jss::error] == "amendmentBlocked");
208 BEAST_EXPECT(jr[jss::status] == "error");
209 BEAST_EXPECT(!jr.isMember(jss::warnings));
210
211 // submit
212 jr = env.rpc("submit", strHex(s.slice()))[jss::result];
213 BEAST_EXPECT(jr.isMember(jss::error) && jr[jss::error] == "amendmentBlocked");
214 BEAST_EXPECT(jr[jss::status] == "error");
215 BEAST_EXPECT(!jr.isMember(jss::warnings));
216
217 // submit_multisigned
218 setTx[jss::Sequence] = env.seq(bob);
219 signFor[jss::tx_json] = setTx;
220 jr = env.rpc("json", "sign_for", to_string(signFor))[jss::result];
221 BEAST_EXPECT(jr[jss::status] == "success");
222 msReq[jss::tx_json] = jr[jss::tx_json];
223 jr = env.rpc("json", "submit_multisigned", to_string(msReq))[jss::result];
224 BEAST_EXPECT(jr.isMember(jss::error) && jr[jss::error] == "amendmentBlocked");
225 BEAST_EXPECT(!jr.isMember(jss::warnings));
226 }
227
228public:
229 void
230 run() override
231 {
233 }
234};
235
236BEAST_DEFINE_TESTSUITE(AmendmentBlocked, rpc, xrpl);
237
238} // namespace xrpl
A testsuite class.
Definition suite.h:50
Represents a JSON value.
Definition json_value.h:130
void run() override
Runs the suite.
Slice slice() const noexcept
Definition Serializer.h:44
std::unique_ptr< WSClient > makeWSClient(Config const &cfg, bool v2, unsigned rpcVersion, std::unordered_map< std::string, std::string > const &headers)
Returns a client operating through WebSockets/S.
Definition WSClient.cpp:329
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
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
BEAST_DEFINE_TESTSUITE(AccountTxPaging, app, xrpl)
static constexpr auto kSigningSupport
Definition Constants.h:57