19 #include <ripple/protocol/AccountID.h>
20 #include <ripple/protocol/Feature.h>
21 #include <ripple/protocol/SField.h>
22 #include <ripple/protocol/TxFlags.h>
23 #include <ripple/protocol/jss.h>
33 testcase(
"RippleState Freeze");
35 using namespace test::jtx;
36 Env env(*
this, features);
39 Account alice{
"alice"};
42 env.fund(XRP(1000), G1, alice, bob);
45 env.trust(G1[
"USD"](100), bob);
46 env.trust(G1[
"USD"](100), alice);
49 env(pay(G1, bob, G1[
"USD"](10)));
50 env(pay(G1, alice, G1[
"USD"](100)));
53 env(offer(alice, XRP(500), G1[
"USD"](100)));
57 auto lines = getAccountLines(env, bob);
58 if (!BEAST_EXPECT(checkArraySize(lines[jss::lines], 1u)))
60 BEAST_EXPECT(lines[jss::lines][0u][jss::account] == G1.human());
61 BEAST_EXPECT(lines[jss::lines][0u][jss::limit] ==
"100");
62 BEAST_EXPECT(lines[jss::lines][0u][jss::balance] ==
"10");
66 auto lines = getAccountLines(env, alice);
67 if (!BEAST_EXPECT(checkArraySize(lines[jss::lines], 1u)))
69 BEAST_EXPECT(lines[jss::lines][0u][jss::account] == G1.human());
70 BEAST_EXPECT(lines[jss::lines][0u][jss::limit] ==
"100");
71 BEAST_EXPECT(lines[jss::lines][0u][jss::balance] ==
"100");
77 env(pay(alice, bob, G1[
"USD"](1)));
80 env(pay(bob, alice, G1[
"USD"](1)));
88 auto affected = env.meta()->getJson(
90 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
105 env(offer(bob, G1[
"USD"](5), XRP(25)));
106 auto affected = env.meta()->getJson(
108 if (!BEAST_EXPECT(checkArraySize(affected, 5u)))
127 env(pay(alice, bob, G1[
"USD"](1)));
130 env(pay(bob, alice, G1[
"USD"](1)), ter(
tecPATH_DRY));
136 auto lines = getAccountLines(env, G1);
138 for (
auto const& it : lines[jss::lines])
140 if (it[jss::account] == bob.human())
146 if (!BEAST_EXPECT(bobLine))
148 BEAST_EXPECT(bobLine[jss::freeze] ==
true);
149 BEAST_EXPECT(bobLine[jss::balance] ==
"-16");
154 auto lines = getAccountLines(env, bob);
156 for (
auto const& it : lines[jss::lines])
158 if (it[jss::account] == G1.human())
164 if (!BEAST_EXPECT(g1Line))
166 BEAST_EXPECT(g1Line[jss::freeze_peer] ==
true);
167 BEAST_EXPECT(g1Line[jss::balance] ==
"16");
174 auto affected = env.meta()->getJson(
176 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
183 BEAST_EXPECT(!(ff[jss::Flags].asUInt() &
lsfLowFreeze));
192 testcase(
"Global Freeze");
194 using namespace test::jtx;
195 Env env(*
this, features);
203 env.fund(XRP(12000), G1);
204 env.fund(XRP(1000), A1);
205 env.fund(XRP(20000), A2, A3, A4);
208 env.trust(G1[
"USD"](1200), A1);
209 env.trust(G1[
"USD"](200), A2);
210 env.trust(G1[
"BTC"](100), A3);
211 env.trust(G1[
"BTC"](100), A4);
214 env(pay(G1, A1, G1[
"USD"](1000)));
215 env(pay(G1, A2, G1[
"USD"](100)));
216 env(pay(G1, A3, G1[
"BTC"](100)));
217 env(pay(G1, A4, G1[
"BTC"](100)));
220 env(offer(G1, XRP(10000), G1[
"USD"](100)), txflags(
tfPassive));
221 env(offer(G1, G1[
"USD"](100), XRP(10000)), txflags(
tfPassive));
222 env(offer(A1, XRP(10000), G1[
"USD"](100)), txflags(
tfPassive));
223 env(offer(A2, G1[
"USD"](100), XRP(10000)), txflags(
tfPassive));
243 auto offers = env.rpc(
246 "XRP")[jss::result][jss::offers];
247 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
250 for (
auto const& offer : offers)
252 accounts.
insert(offer[jss::Account].asString());
254 BEAST_EXPECT(accounts.
find(A2.human()) !=
std::end(accounts));
255 BEAST_EXPECT(accounts.
find(G1.human()) !=
std::end(accounts));
261 std::string(
"USD/") + G1.human())[jss::result][jss::offers];
262 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
265 for (
auto const& offer : offers)
267 accounts.
insert(offer[jss::Account].asString());
269 BEAST_EXPECT(accounts.
find(A1.human()) !=
std::end(accounts));
270 BEAST_EXPECT(accounts.
find(G1.human()) !=
std::end(accounts));
276 env(offer(A3, G1[
"BTC"](1), XRP(1)));
279 env(offer(A4, XRP(1), G1[
"BTC"](1)));
282 env(pay(G1, A2, G1[
"USD"](1)));
285 env(pay(A2, G1, G1[
"USD"](1)));
288 env(pay(A2, A1, G1[
"USD"](1)));
291 env(pay(A1, A2, G1[
"USD"](1)));
304 env(offer(A3, G1[
"BTC"](1), XRP(1)), ter(
tecFROZEN));
307 env(offer(A4, XRP(1), G1[
"BTC"](1)), ter(
tecFROZEN));
313 auto offers = getAccountOffers(env, G1)[jss::offers];
314 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
322 std::string(
"USD/") + G1.human())[jss::result][jss::offers];
323 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
329 "XRP")[jss::result][jss::offers];
330 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
337 env(pay(G1, A2, G1[
"USD"](1)));
340 env(pay(A2, G1, G1[
"USD"](1)));
350 testcase(
"No Freeze");
352 using namespace test::jtx;
353 Env env(*
this, features);
358 env.fund(XRP(12000), G1);
359 env.fund(XRP(1000), A1);
362 env.trust(G1[
"USD"](1000), A1);
365 env(pay(G1, A1, G1[
"USD"](1000)));
394 if (!BEAST_EXPECT(checkArraySize(affected, 1u)))
399 BEAST_EXPECT(let == jss::AccountRoot);
405 testcase(
"Offers for Frozen Trust Lines");
407 using namespace test::jtx;
408 Env env(*
this, features);
415 env.fund(XRP(1000), G1, A3, A4);
416 env.fund(XRP(2000), A2);
419 env.trust(G1[
"USD"](1000), A2);
420 env.trust(G1[
"USD"](2000), A3);
421 env.trust(G1[
"USD"](2000), A4);
424 env(pay(G1, A3, G1[
"USD"](2000)));
425 env(pay(G1, A4, G1[
"USD"](2000)));
428 env(offer(A3, XRP(1000), G1[
"USD"](1000)), txflags(
tfPassive));
433 env(pay(A2, G1, G1[
"USD"](1)), paths(G1[
"USD"]), sendmax(XRP(1)));
437 auto offers = getAccountOffers(env, A3)[jss::offers];
438 if (!BEAST_EXPECT(checkArraySize(offers, 1u)))
441 offers[0u][jss::taker_gets] ==
445 env(offer(A4, XRP(999), G1[
"USD"](999)));
452 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
459 BEAST_EXPECT(!(ff[jss::Flags].asUInt() &
lsfLowFreeze));
464 offers = getAccountOffers(env, A3)[jss::offers];
465 if (!BEAST_EXPECT(checkArraySize(offers, 1u)))
469 env(pay(A2, G1, G1[
"USD"](1)), paths(G1[
"USD"]), sendmax(XRP(1)));
473 offers = getAccountOffers(env, A3)[jss::offers];
474 if (!BEAST_EXPECT(checkArraySize(offers, 0u)))
482 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
493 env(offer(A2, G1[
"USD"](999), XRP(999)));
496 if (!BEAST_EXPECT(checkArraySize(affected, 8u)))
504 offers = getAccountOffers(env, A4)[jss::offers];
505 if (!BEAST_EXPECT(checkArraySize(offers, 0u)))
519 using namespace test::jtx;
520 auto const sa = supported_amendments();