This commit is contained in:
manojsdoshi
2021-01-27 00:52:49 +00:00
parent 46ee4c24ed
commit 7ffc2e332b
2825 changed files with 90173 additions and 62954 deletions

View File

@@ -382,237 +382,280 @@ $(function() {
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <span class="comment">// second test the strand does not have the best quality (the</span></div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <span class="comment">// implementation has to handle this case correct and not mark the</span></div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="comment">// strand dry until the liquidity is actually used)</span></div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; {</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; <a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html">Env</a> env(*<span class="keyword">this</span>, features);</div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; </div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#ae2349266cb09d1f1c3de06606ebdf9e2">fund</a>(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(100000000), gw, alice, bob, carol);</div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; </div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a90fecf3c0f6cdc1c40761e19917bf65a">trust</a>(USD(4000), alice);</div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; env(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a7816b23daf9b325ea1f88cc121a53d05">pay</a>(gw, alice, USD(4000)));</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a90fecf3c0f6cdc1c40761e19917bf65a">trust</a>(USD(1000), carol);</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; env(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a7816b23daf9b325ea1f88cc121a53d05">pay</a>(gw, carol, USD(3)));</div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; </div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; <span class="comment">// The implementation allows any single step to consume at most 1000</span></div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; <span class="comment">// offers. With the `FlowSortStrands` feature enabled, if the total</span></div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; <span class="comment">// number of offers consumed by all the steps combined exceeds 1500, the</span></div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; <span class="comment">// payment stops.</span></div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; {</div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; <a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html">Env</a> env(*<span class="keyword">this</span>, features);</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; </div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#ae2349266cb09d1f1c3de06606ebdf9e2">fund</a>(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(100000000), gw, alice, bob, carol);</div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; </div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; <span class="comment">// Notice the strand with the 800 unfunded offers has the initial</span></div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; <span class="comment">// best quality</span></div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 2000, alice, EUR(2), <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(1));</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 300, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(1), USD(4));</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(</div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; env, 801, carol, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(1), USD(3)); <span class="comment">// only one offer is funded</span></div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 1000, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(1), USD(3));</div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; </div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 1, alice, EUR(500), USD(500));</div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; </div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; <span class="comment">// Bob offers to buy 2000 USD for 2000 EUR; He starts with 2000 EUR</span></div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; <span class="comment">// 1. The best quality is the autobridged offers that take 2 EUR</span></div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; <span class="comment">// and give 4 USD.</span></div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <span class="comment">// Bob spends 600 EUR and receives 1200 USD.</span></div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; <span class="comment">// 2. The best quality is the autobridged offers that take 2 EUR</span></div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; <span class="comment">// and give 3 USD.</span></div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; <span class="comment">// a. One of Carol&#39;s offers is taken. This leaves her other</span></div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; <span class="comment">// offers unfunded.</span></div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <span class="comment">// b. Carol&#39;s remaining 800 offers are consumed as unfunded.</span></div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="comment">// c. 199 of alice&#39;s XRP(1) to USD(3) offers are consumed.</span></div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="comment">// A book step is allowed to consume a maxium of 1000 offers</span></div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; <span class="comment">// at a given quality, and that limit is now reached.</span></div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; <span class="comment">// d. Now the strand is dry, even though there are still funded</span></div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <span class="comment">// XRP(1) to USD(3) offers available. Bob has spent 400 EUR and</span></div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="comment">// received 600 USD in this step. (200 funded offers consumed</span></div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; <span class="comment">// 800 unfunded offers)</span></div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; <span class="comment">// 3. The best is the non-autobridged offers that takes 500 EUR and</span></div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="comment">// gives 500 USD.</span></div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <span class="comment">// Bob has 2000 EUR, and has spent 600+400=1000 EUR. He has 1000</span></div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; <span class="comment">// left. Bob spent 500 EUR and receives 500 USD.</span></div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; <span class="comment">// In total: Bob spent EUR(600 + 400 + 500) = EUR(1500). He started</span></div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; <span class="comment">// with 2000 so has 500 remaining</span></div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <span class="comment">// Bob received USD(1200 + 600 + 500) = USD(2300).</span></div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; <span class="comment">// Alice spent 300*4 + 199*3 + 500 = 2297 USD. She started</span></div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <span class="comment">// with 4000 so has 1703 USD remaining. Alice received</span></div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; <span class="comment">// 600 + 400 + 500 = 1500 EUR</span></div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a90fecf3c0f6cdc1c40761e19917bf65a">trust</a>(EUR(10000), bob);</div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a2c5dcd5bbad5c5b767ff713b6f7cb1ed">close</a>();</div>
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; env(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a7816b23daf9b325ea1f88cc121a53d05">pay</a>(gw, bob, EUR(2000)));</div>
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a2c5dcd5bbad5c5b767ff713b6f7cb1ed">close</a>();</div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; env(offer(bob, USD(4000), EUR(4000)));</div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a2c5dcd5bbad5c5b767ff713b6f7cb1ed">close</a>();</div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; </div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1balance.html">balance</a>(bob, USD(2300)));</div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1balance.html">balance</a>(bob, EUR(500)));</div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owner__count.html">offers</a>(bob, 1));</div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owners.html">owners</a>(bob, 3));</div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; </div>
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1balance.html">balance</a>(alice, USD(1703)));</div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1balance.html">balance</a>(alice, EUR(1500)));</div>
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> numAOffers =</div>
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; 2000 + 300 + 1000 + 1 - (2 * 300 + 2 * 199 + 1 + 1);</div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owner__count.html">offers</a>(alice, numAOffers));</div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owners.html">owners</a>(alice, numAOffers + 2));</div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; </div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owner__count.html">offers</a>(carol, 0));</div>
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; }</div>
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; {</div>
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; <a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html">Env</a> env(*<span class="keyword">this</span>, features);</div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; </div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#ae2349266cb09d1f1c3de06606ebdf9e2">fund</a>(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(100000000), gw, alice, bob, carol);</div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; </div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a90fecf3c0f6cdc1c40761e19917bf65a">trust</a>(USD(4000), alice);</div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; env(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a7816b23daf9b325ea1f88cc121a53d05">pay</a>(gw, alice, USD(4000)));</div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a90fecf3c0f6cdc1c40761e19917bf65a">trust</a>(USD(1000), carol);</div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; env(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a7816b23daf9b325ea1f88cc121a53d05">pay</a>(gw, carol, USD(3)));</div>
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; </div>
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; <span class="comment">// Notice the strand with the 800 unfunded offers does not have the</span></div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; <span class="comment">// initial best quality</span></div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 1, alice, EUR(1), USD(10));</div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 2000, alice, EUR(2), <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(1));</div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 300, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(1), USD(4));</div>
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(</div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; env, 801, carol, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(1), USD(3)); <span class="comment">// only one offer is funded</span></div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 1000, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(1), USD(3));</div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a90fecf3c0f6cdc1c40761e19917bf65a">trust</a>(USD(4000), alice);</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; env(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a7816b23daf9b325ea1f88cc121a53d05">pay</a>(gw, alice, USD(4000)));</div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a90fecf3c0f6cdc1c40761e19917bf65a">trust</a>(USD(1000), carol);</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; env(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a7816b23daf9b325ea1f88cc121a53d05">pay</a>(gw, carol, USD(3)));</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; </div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; <span class="comment">// Notice the strand with the 800 unfunded offers has the initial</span></div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <span class="comment">// best quality</span></div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 2000, alice, EUR(2), <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(1));</div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 100, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(1), USD(4));</div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(</div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; env, 801, carol, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(1), USD(3)); <span class="comment">// only one offer is funded</span></div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 1000, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(1), USD(3));</div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; </div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 1, alice, EUR(500), USD(500));</div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; </div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; <span class="comment">// Bob offers to buy 2000 USD for 2000 EUR; He starts with 2000 EUR</span></div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; <span class="comment">// 1. The best quality is the autobridged offers that take 2 EUR</span></div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; <span class="comment">// and give 4 USD.</span></div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; <span class="comment">// Bob spends 200 EUR and receives 400 USD.</span></div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <span class="comment">// 100 EUR-&gt;XRP offers consumed.</span></div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="comment">// 100 XRP-&gt;USD offers consumed.</span></div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="comment">// 200 total offers consumed.</span></div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; <span class="comment">// 2. The best quality is the autobridged offers that take 2 EUR</span></div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <span class="comment">// and give 3 USD.</span></div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="comment">// a. One of Carol&#39;s offers is taken. This leaves her other</span></div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; <span class="comment">// offers unfunded.</span></div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; <span class="comment">// b. Carol&#39;s remaining 800 offers are consumed as unfunded.</span></div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="comment">// c. 199 of alice&#39;s XRP(1) to USD(3) offers are consumed.</span></div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <span class="comment">// A book step is allowed to consume a maxium of 1000 offers</span></div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; <span class="comment">// at a given quality, and that limit is now reached.</span></div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; <span class="comment">// d. Now the strand is dry, even though there are still funded</span></div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; <span class="comment">// XRP(1) to USD(3) offers available.</span></div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <span class="comment">// Bob has spent 400 EUR and received 600 USD in this step.</span></div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; <span class="comment">// 200 EUR-&gt;XRP offers consumed</span></div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <span class="comment">// 800 unfunded XRP-&gt;USD offers consumed</span></div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; <span class="comment">// 200 funded XRP-&gt;USD offers consumed (1 carol, 199 alice)</span></div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; <span class="comment">// 1400 total offers consumed so far (100 left before the</span></div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <span class="comment">// limit)</span></div>
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; <span class="comment">// 3. The best is the non-autobridged offers that takes 500 EUR and</span></div>
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <span class="comment">// gives 500 USD.</span></div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <span class="comment">// Bob started with 2000 EUR</span></div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; <span class="comment">// Bob spent 500 EUR (100+400)</span></div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <span class="comment">// Bob has 1500 EUR left</span></div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <span class="comment">// In this step:</span></div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <span class="comment">// Bob spents 500 EUR and receives 500 USD.</span></div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <span class="comment">// In total:</span></div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="comment">// Bob spent 1100 EUR (200 + 400 + 500)</span></div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; <span class="comment">// Bob has 900 EUR remaining (2000 - 1100)</span></div>
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <span class="comment">// Bob received 1500 USD (400 + 600 + 500)</span></div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; <span class="comment">// Alice spent 1497 USD (100*4 + 199*3 + 500)</span></div>
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; <span class="comment">// Alice has 2503 remaining (4000 - 1497)</span></div>
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; <span class="comment">// Alice received 1100 EUR (200 + 400 + 500)</span></div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a90fecf3c0f6cdc1c40761e19917bf65a">trust</a>(EUR(10000), bob);</div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a2c5dcd5bbad5c5b767ff713b6f7cb1ed">close</a>();</div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; env(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a7816b23daf9b325ea1f88cc121a53d05">pay</a>(gw, bob, EUR(2000)));</div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a2c5dcd5bbad5c5b767ff713b6f7cb1ed">close</a>();</div>
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; env(offer(bob, USD(4000), EUR(4000)));</div>
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a2c5dcd5bbad5c5b767ff713b6f7cb1ed">close</a>();</div>
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; </div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1balance.html">balance</a>(bob, USD(1500)));</div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1balance.html">balance</a>(bob, EUR(900)));</div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owner__count.html">offers</a>(bob, 1));</div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owners.html">owners</a>(bob, 3));</div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; </div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1balance.html">balance</a>(alice, USD(2503)));</div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1balance.html">balance</a>(alice, EUR(1100)));</div>
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> numAOffers =</div>
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; 2000 + 100 + 1000 + 1 - (2 * 100 + 2 * 199 + 1 + 1);</div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owner__count.html">offers</a>(alice, numAOffers));</div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owners.html">owners</a>(alice, numAOffers + 2));</div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; </div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owner__count.html">offers</a>(carol, 0));</div>
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; }</div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; {</div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html">Env</a> env(*<span class="keyword">this</span>, features);</div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; </div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 1, alice, EUR(499), USD(499));</div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#ae2349266cb09d1f1c3de06606ebdf9e2">fund</a>(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(100000000), gw, alice, bob, carol);</div>
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; </div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; <span class="comment">// Bob offers to buy 2000 USD for 2000 EUR; He starts with 2000 EUR</span></div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; <span class="comment">// 1. The best quality is the offer that takes 1 EUR and gives 10</span></div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; <span class="comment">// USD</span></div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; <span class="comment">// Bob spends 1 EUR and receives 10 USD.</span></div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; <span class="comment">// 2. The best quality is the autobridged offers that takes 2 EUR</span></div>
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; <span class="comment">// and gives 4 USD.</span></div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; <span class="comment">// Bob spends 600 EUR and receives 1200 USD.</span></div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; <span class="comment">// 3. The best quality is the autobridged offers that takes 2 EUR</span></div>
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; <span class="comment">// and gives 3 USD.</span></div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; <span class="comment">// a. One of Carol&#39;s offers is taken. This leaves her other</span></div>
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <span class="comment">// offers unfunded.</span></div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; <span class="comment">// b. Carol&#39;s remaining 800 offers are consumed as unfunded.</span></div>
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; <span class="comment">// c. 199 of alice&#39;s XRP(1) to USD(3) offers are consumed.</span></div>
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; <span class="comment">// A book step is allowed to consume a maxium of 1000 offers</span></div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; <span class="comment">// at a given quality, and that limit is now reached.</span></div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <span class="comment">// d. Now the strand is dry, even though there are still funded</span></div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; <span class="comment">// XRP(1) to USD(3) offers available. Bob has spent 400 EUR and</span></div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <span class="comment">// received 600 USD in this step. (200 funded offers consumed</span></div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; <span class="comment">// 800 unfunded offers)</span></div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; <span class="comment">// 4. The best is the non-autobridged offers that takes 499 EUR and</span></div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="comment">// gives 499 USD.</span></div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; <span class="comment">// Bob has 2000 EUR, and has spent 1+600+400=1001 EUR. He has</span></div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="comment">// 999 left. Bob spent 499 EUR and receives 499 USD.</span></div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; <span class="comment">// In total: Bob spent EUR(1 + 600 + 400 + 499) = EUR(1500). He</span></div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; <span class="comment">// started with 2000 so has 500 remaining</span></div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; <span class="comment">// Bob received USD(10 + 1200 + 600 + 499) = USD(2309).</span></div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; <span class="comment">// Alice spent 10 + 300*4 + 199*3 + 499 = 2306 USD. She</span></div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; <span class="comment">// started with 4000 so has 1704 USD remaining. Alice</span></div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <span class="comment">// received 600 + 400 + 500 = 1500 EUR</span></div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a90fecf3c0f6cdc1c40761e19917bf65a">trust</a>(EUR(10000), bob);</div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a2c5dcd5bbad5c5b767ff713b6f7cb1ed">close</a>();</div>
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; env(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a7816b23daf9b325ea1f88cc121a53d05">pay</a>(gw, bob, EUR(2000)));</div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a2c5dcd5bbad5c5b767ff713b6f7cb1ed">close</a>();</div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; env(offer(bob, USD(4000), EUR(4000)));</div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a2c5dcd5bbad5c5b767ff713b6f7cb1ed">close</a>();</div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; </div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1balance.html">balance</a>(bob, USD(2309)));</div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1balance.html">balance</a>(bob, EUR(500)));</div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owner__count.html">offers</a>(bob, 1));</div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owners.html">owners</a>(bob, 3));</div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; </div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1balance.html">balance</a>(alice, USD(1694)));</div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1balance.html">balance</a>(alice, EUR(1500)));</div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> numAOffers =</div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; 1 + 2000 + 300 + 1000 + 1 - (1 + 2 * 300 + 2 * 199 + 1 + 1);</div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owner__count.html">offers</a>(alice, numAOffers));</div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owners.html">owners</a>(alice, numAOffers + 2));</div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; </div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owner__count.html">offers</a>(carol, 0));</div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; }</div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; }</div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a90fecf3c0f6cdc1c40761e19917bf65a">trust</a>(USD(4000), alice);</div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; env(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a7816b23daf9b325ea1f88cc121a53d05">pay</a>(gw, alice, USD(4000)));</div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a90fecf3c0f6cdc1c40761e19917bf65a">trust</a>(USD(1000), carol);</div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; env(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a7816b23daf9b325ea1f88cc121a53d05">pay</a>(gw, carol, USD(3)));</div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; </div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; <span class="comment">// Notice the strand with the 800 unfunded offers does not have the</span></div>
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; <span class="comment">// initial best quality</span></div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 1, alice, EUR(1), USD(10));</div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 2000, alice, EUR(2), <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(1));</div>
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 100, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(1), USD(4));</div>
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(</div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; env, 801, carol, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(1), USD(3)); <span class="comment">// only one offer is funded</span></div>
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 1000, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(1), USD(3));</div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; </div>
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 1, alice, EUR(499), USD(499));</div>
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; </div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; <span class="comment">// Bob offers to buy 2000 USD for 2000 EUR; He starts with 2000 EUR</span></div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <span class="comment">// 1. The best quality is the offer that takes 1 EUR and gives 10</span></div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; <span class="comment">// USD</span></div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <span class="comment">// Bob spends 1 EUR and receives 10 USD.</span></div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; <span class="comment">// 2. The best quality is the autobridged offers that takes 2 EUR</span></div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="comment">// and gives 4 USD.</span></div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; <span class="comment">// Bob spends 200 EUR and receives 400 USD.</span></div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; <span class="comment">// 3. The best quality is the autobridged offers that takes 2 EUR</span></div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; <span class="comment">// and gives 3 USD.</span></div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; <span class="comment">// a. One of Carol&#39;s offers is taken. This leaves her other</span></div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; <span class="comment">// offers unfunded.</span></div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; <span class="comment">// b. Carol&#39;s remaining 800 offers are consumed as unfunded.</span></div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <span class="comment">// c. 199 of alice&#39;s XRP(1) to USD(3) offers are consumed.</span></div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; <span class="comment">// A book step is allowed to consume a maxium of 1000 offers</span></div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <span class="comment">// at a given quality, and that limit is now reached.</span></div>
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; <span class="comment">// d. Now the strand is dry, even though there are still funded</span></div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; <span class="comment">// XRP(1) to USD(3) offers available. Bob has spent 400 EUR and</span></div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <span class="comment">// received 600 USD in this step. (200 funded offers consumed</span></div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; <span class="comment">// 800 unfunded offers)</span></div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <span class="comment">// 4. The best is the non-autobridged offers that takes 499 EUR and</span></div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; <span class="comment">// gives 499 USD.</span></div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <span class="comment">// Bob has 2000 EUR, and has spent 1+200+400=601 EUR. He has</span></div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; <span class="comment">// 1399 left. Bob spent 499 EUR and receives 499 USD.</span></div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; <span class="comment">// In total: Bob spent EUR(1 + 200 + 400 + 499) = EUR(1100). He</span></div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <span class="comment">// started with 2000 so has 900 remaining</span></div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; <span class="comment">// Bob received USD(10 + 400 + 600 + 499) = USD(1509).</span></div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; <span class="comment">// Alice spent 10 + 100*4 + 199*3 + 499 = 1506 USD. She</span></div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; <span class="comment">// started with 4000 so has 2494 USD remaining. Alice</span></div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <span class="comment">// received 200 + 400 + 500 = 1100 EUR</span></div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a90fecf3c0f6cdc1c40761e19917bf65a">trust</a>(EUR(10000), bob);</div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a2c5dcd5bbad5c5b767ff713b6f7cb1ed">close</a>();</div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; env(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a7816b23daf9b325ea1f88cc121a53d05">pay</a>(gw, bob, EUR(2000)));</div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a2c5dcd5bbad5c5b767ff713b6f7cb1ed">close</a>();</div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; env(offer(bob, USD(4000), EUR(4000)));</div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a2c5dcd5bbad5c5b767ff713b6f7cb1ed">close</a>();</div>
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; </div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; <span class="keywordtype">void</span></div>
<div class="line"><a name="l00458"></a><span class="lineno"><a class="line" href="classripple_1_1test_1_1CrossingLimits__test.html#a61f86d33282cf5af0daf95751f5df7e7"> 458</a></span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a61f86d33282cf5af0daf95751f5df7e7">testAutoBridgedLimits</a>(<a class="code" href="classripple_1_1FeatureBitset.html">FeatureBitset</a> features)</div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; {</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="comment">// Taker and FlowCross are too different in the way they handle</span></div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; <span class="comment">// autobridging to make one test suit both approaches.</span></div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; <span class="comment">// o Taker alternates between books, completing one full increment</span></div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <span class="comment">// before returning to make another pass.</span></div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; <span class="comment">// o FlowCross extracts as much as possible in one book at one Quality</span></div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <span class="comment">// before proceeding to the other book. This reduces the number of</span></div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; <span class="comment">// times we change books.</span></div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="comment">// So the tests for the two forms of autobridging are separate.</span></div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <span class="keywordflow">if</span> (features[<a class="code" href="namespaceripple.html#a2cb56a55020f266d207ee04d66cc97ae">featureFlowCross</a>])</div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#ab9f2e28dc08f49e5b945dfef203d8ee1">testAutoBridgedLimitsFlowCross</a>(features);</div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a5739bcfc6b3b05195eb2a83a8ed232da">testAutoBridgedLimitsTaker</a>(features);</div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; }</div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; </div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <span class="keywordtype">void</span></div>
<div class="line"><a name="l00478"></a><span class="lineno"><a class="line" href="classripple_1_1test_1_1CrossingLimits__test.html#ae0e36128e971357ad17d26467308e7e2"> 478</a></span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#ae0e36128e971357ad17d26467308e7e2">testOfferOverflow</a>(<a class="code" href="classripple_1_1FeatureBitset.html">FeatureBitset</a> features)</div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; {</div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; testcase(<span class="stringliteral">&quot;Offer Overflow&quot;</span>);</div>
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; </div>
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; <span class="keyword">using namespace </span>jtx;</div>
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; </div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> gw = <a class="code" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a>(<span class="stringliteral">&quot;gateway&quot;</span>);</div>
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> alice = <a class="code" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a>(<span class="stringliteral">&quot;alice&quot;</span>);</div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> bob = <a class="code" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a>(<span class="stringliteral">&quot;bob&quot;</span>);</div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; </div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> USD = gw[<span class="stringliteral">&quot;USD&quot;</span>];</div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; </div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; <a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html">Env</a> env(*<span class="keyword">this</span>, features);</div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; </div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#ae2349266cb09d1f1c3de06606ebdf9e2">fund</a>(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(100000000), gw, alice, bob);</div>
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; </div>
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a90fecf3c0f6cdc1c40761e19917bf65a">trust</a>(USD(8000), alice);</div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a90fecf3c0f6cdc1c40761e19917bf65a">trust</a>(USD(8000), bob);</div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a2c5dcd5bbad5c5b767ff713b6f7cb1ed">close</a>();</div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1balance.html">balance</a>(bob, USD(1509)));</div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1balance.html">balance</a>(bob, EUR(900)));</div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owner__count.html">offers</a>(bob, 1));</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owners.html">owners</a>(bob, 3));</div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; </div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1balance.html">balance</a>(alice, USD(2494)));</div>
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1balance.html">balance</a>(alice, EUR(1100)));</div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> numAOffers =</div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; 1 + 2000 + 100 + 1000 + 1 - (1 + 2 * 100 + 2 * 199 + 1 + 1);</div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owner__count.html">offers</a>(alice, numAOffers));</div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owners.html">owners</a>(alice, numAOffers + 2));</div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; </div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1owner__count.html">offers</a>(carol, 0));</div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; }</div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; }</div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; </div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; <span class="keywordtype">void</span></div>
<div class="line"><a name="l00474"></a><span class="lineno"><a class="line" href="classripple_1_1test_1_1CrossingLimits__test.html#a61f86d33282cf5af0daf95751f5df7e7"> 474</a></span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a61f86d33282cf5af0daf95751f5df7e7">testAutoBridgedLimits</a>(<a class="code" href="classripple_1_1FeatureBitset.html">FeatureBitset</a> features)</div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; {</div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; <span class="comment">// Taker and FlowCross are too different in the way they handle</span></div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <span class="comment">// autobridging to make one test suit both approaches.</span></div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; <span class="comment">// o Taker alternates between books, completing one full increment</span></div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <span class="comment">// before returning to make another pass.</span></div>
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; <span class="comment">// o FlowCross extracts as much as possible in one book at one Quality</span></div>
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; <span class="comment">// before proceeding to the other book. This reduces the number of</span></div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; <span class="comment">// times we change books.</span></div>
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="comment">//</span></div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; <span class="comment">// So the tests for the two forms of autobridging are separate.</span></div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; <span class="keywordflow">if</span> (features[<a class="code" href="namespaceripple.html#a2cb56a55020f266d207ee04d66cc97ae">featureFlowCross</a>])</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#ab9f2e28dc08f49e5b945dfef203d8ee1">testAutoBridgedLimitsFlowCross</a>(features);</div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a5739bcfc6b3b05195eb2a83a8ed232da">testAutoBridgedLimitsTaker</a>(features);</div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; }</div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; </div>
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; <span class="keywordtype">void</span></div>
<div class="line"><a name="l00494"></a><span class="lineno"><a class="line" href="classripple_1_1test_1_1CrossingLimits__test.html#ae0e36128e971357ad17d26467308e7e2"> 494</a></span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#ae0e36128e971357ad17d26467308e7e2">testOfferOverflow</a>(<a class="code" href="classripple_1_1FeatureBitset.html">FeatureBitset</a> features)</div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; {</div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; testcase(<span class="stringliteral">&quot;Offer Overflow&quot;</span>);</div>
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; </div>
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; env(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a7816b23daf9b325ea1f88cc121a53d05">pay</a>(gw, alice, USD(8000)));</div>
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a2c5dcd5bbad5c5b767ff713b6f7cb1ed">close</a>();</div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; </div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; <span class="comment">// The new flow cross handles consuming excessive offers differently</span></div>
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; <span class="comment">// than the old offer crossing code. In the old code, the total number</span></div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; <span class="comment">// of consumed offers is tracked, and the crossings will stop after this</span></div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; <span class="comment">// limit is hit. In the new code, the number of offers is tracked per</span></div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; <span class="comment">// offerbook and per quality. This test shows how they can differ. Set</span></div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; <span class="comment">// up a book with many offers. At each quality keep the number of offers</span></div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; <span class="comment">// below the limit. However, if all the offers are consumed it would</span></div>
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; <span class="comment">// create a tecOVERSIZE error.</span></div>
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 998, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(1.00), USD(1));</div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 998, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(0.99), USD(1));</div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 998, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(0.98), USD(1));</div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 998, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(0.97), USD(1));</div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 998, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(0.96), USD(1));</div>
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 998, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(0.95), USD(1));</div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; </div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; <span class="keywordtype">bool</span> <span class="keyword">const</span> withFlowCross = features[<a class="code" href="namespaceripple.html#a2cb56a55020f266d207ee04d66cc97ae">featureFlowCross</a>];</div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; env(offer(bob, USD(8000), <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(8000)),</div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <a class="code" href="classripple_1_1test_1_1jtx_1_1ter.html">ter</a>(withFlowCross ? <a class="code" href="classripple_1_1TERSubset.html">TER</a>{<a class="code" href="namespaceripple.html#aa298e929e02f59c2b05a30ee8805b38caad531e9d2f46a3a6e6f01934097e7053">tecOVERSIZE</a>} : <a class="code" href="namespaceripple.html#aabc7f150d5082c73116a1cd5962b434da28c7d8b3ed759d363503a05fcd59f151">tesSUCCESS</a>));</div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a2c5dcd5bbad5c5b767ff713b6f7cb1ed">close</a>();</div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; </div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1balance.html">balance</a>(bob, USD(withFlowCross ? 0 : 850)));</div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; }</div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; </div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; <span class="keywordtype">void</span></div>
<div class="line"><a name="l00525"></a><span class="lineno"><a class="line" href="classripple_1_1test_1_1CrossingLimits__test.html#a88c77a86d501d32f185243a2bdcff22c"> 525</a></span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a88c77a86d501d32f185243a2bdcff22c">run</a>()<span class="keyword"> override</span></div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; <span class="keyword">auto</span> testAll = [<span class="keyword">this</span>](<a class="code" href="classripple_1_1FeatureBitset.html">FeatureBitset</a> features) {</div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a8090e559549e6be418e5a0d922d73932">testStepLimit</a>(features);</div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a85834a72d995b4cd9fc66528388f6f8d">testCrossingLimit</a>(features);</div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a56fa8b7c649d3195d5276f71e7d5c3f6">testStepAndCrossingLimit</a>(features);</div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a61f86d33282cf5af0daf95751f5df7e7">testAutoBridgedLimits</a>(features);</div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#ae0e36128e971357ad17d26467308e7e2">testOfferOverflow</a>(features);</div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; };</div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; <span class="keyword">using namespace </span>jtx;</div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> sa = <a class="code" href="namespaceripple_1_1test_1_1jtx.html#af5441d84d5977d52246c5226313560d4">supported_amendments</a>();</div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; testAll(sa - <a class="code" href="namespaceripple.html#a2cb56a55020f266d207ee04d66cc97ae">featureFlowCross</a>);</div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; testAll(sa);</div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; }</div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160;};</div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; </div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160;<a class="code" href="namespaceripple_1_1test.html#a1e21fbfd1eb95324d619bd5bd7d9a85f">BEAST_DEFINE_TESTSUITE_MANUAL_PRIO</a>(CrossingLimits, tx, <a class="code" href="namespaceripple.html">ripple</a>, 10);</div>
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; <span class="keyword">using namespace </span>jtx;</div>
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; </div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> gw = <a class="code" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a>(<span class="stringliteral">&quot;gateway&quot;</span>);</div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> alice = <a class="code" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a>(<span class="stringliteral">&quot;alice&quot;</span>);</div>
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> bob = <a class="code" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a>(<span class="stringliteral">&quot;bob&quot;</span>);</div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; </div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> USD = gw[<span class="stringliteral">&quot;USD&quot;</span>];</div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; </div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; <a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html">Env</a> env(*<span class="keyword">this</span>, features);</div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; </div>
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#ae2349266cb09d1f1c3de06606ebdf9e2">fund</a>(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(100000000), gw, alice, bob);</div>
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; </div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a90fecf3c0f6cdc1c40761e19917bf65a">trust</a>(USD(8000), alice);</div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a90fecf3c0f6cdc1c40761e19917bf65a">trust</a>(USD(8000), bob);</div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a2c5dcd5bbad5c5b767ff713b6f7cb1ed">close</a>();</div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; </div>
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; env(<a class="code" href="namespaceripple_1_1test_1_1jtx.html#a7816b23daf9b325ea1f88cc121a53d05">pay</a>(gw, alice, USD(8000)));</div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a2c5dcd5bbad5c5b767ff713b6f7cb1ed">close</a>();</div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; </div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; <span class="comment">// The new flow cross handles consuming excessive offers differently</span></div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="comment">// than the old offer crossing code. In the old code, the total number</span></div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; <span class="comment">// of consumed offers is tracked, and the crossings will stop after this</span></div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; <span class="comment">// limit is hit. In the new code, the number of offers is tracked per</span></div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <span class="comment">// offerbook and per quality. This test shows how they can differ. Set</span></div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; <span class="comment">// up a book with many offers. At each quality keep the number of offers</span></div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; <span class="comment">// below the limit. However, if all the offers are consumed it would</span></div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; <span class="comment">// create a tecOVERSIZE error.</span></div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; </div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; <span class="comment">// The featureFlowSortStrands introduces a way of tracking the total</span></div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; <span class="comment">// number of consumed offers; with this feature the transaction no</span></div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; <span class="comment">// longer fails with a tecOVERSIZE error.</span></div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; <span class="comment">// The implementation allows any single step to consume at most 1000</span></div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; <span class="comment">// offers. With the `FlowSortStrands` feature enabled, if the total</span></div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; <span class="comment">// number of offers consumed by all the steps combined exceeds 1500, the</span></div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; <span class="comment">// payment stops. Since the first set of offers consumes 998 offers, the</span></div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; <span class="comment">// second set will consume 998, which is not over the limit and the</span></div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; <span class="comment">// payment stops. So 2*998, or 1996 is the expected value when</span></div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; <span class="comment">// `FlowSortStrands` is enabled.</span></div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 998, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(1.00), USD(1));</div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 998, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(0.99), USD(1));</div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 998, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(0.98), USD(1));</div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 998, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(0.97), USD(1));</div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 998, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(0.96), USD(1));</div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">n_offers</a>(env, 998, alice, <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(0.95), USD(1));</div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; </div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160;} <span class="comment">// namespace test</span></div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160;} <span class="comment">// namespace ripple</span></div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; <span class="keywordtype">bool</span> <span class="keyword">const</span> withFlowCross = features[<a class="code" href="namespaceripple.html#a2cb56a55020f266d207ee04d66cc97ae">featureFlowCross</a>];</div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; <span class="keywordtype">bool</span> <span class="keyword">const</span> withSortStrands = features[<a class="code" href="namespaceripple.html#aa4a3b6da5fd09c790148fab25803d4bc">featureFlowSortStrands</a>];</div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; </div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> expectedTER = [&amp;]() -&gt; <a class="code" href="classripple_1_1TERSubset.html">TER</a> {</div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; <span class="keywordflow">if</span> (withFlowCross &amp;&amp; !withSortStrands)</div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classripple_1_1TERSubset.html">TER</a>{<a class="code" href="namespaceripple.html#aa298e929e02f59c2b05a30ee8805b38caad531e9d2f46a3a6e6f01934097e7053">tecOVERSIZE</a>};</div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceripple.html#aabc7f150d5082c73116a1cd5962b434da28c7d8b3ed759d363503a05fcd59f151">tesSUCCESS</a>;</div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; }();</div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; </div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; env(offer(bob, USD(8000), <a class="code" href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">XRP</a>(8000)), <a class="code" href="classripple_1_1test_1_1jtx_1_1ter.html">ter</a>(expectedTER));</div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a2c5dcd5bbad5c5b767ff713b6f7cb1ed">close</a>();</div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; </div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> expectedUSD = [&amp;] {</div>
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; <span class="keywordflow">if</span> (!withFlowCross)</div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; <span class="keywordflow">return</span> USD(850);</div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="keywordflow">if</span> (!withSortStrands)</div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; <span class="keywordflow">return</span> USD(0);</div>
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; <span class="keywordflow">return</span> USD(1996);</div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; }();</div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; </div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; env.<a class="code" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code" href="classripple_1_1test_1_1jtx_1_1balance.html">balance</a>(bob, expectedUSD));</div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; }</div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; </div>
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; <span class="keywordtype">void</span></div>
<div class="line"><a name="l00567"></a><span class="lineno"><a class="line" href="classripple_1_1test_1_1CrossingLimits__test.html#a88c77a86d501d32f185243a2bdcff22c"> 567</a></span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a88c77a86d501d32f185243a2bdcff22c">run</a>()<span class="keyword"> override</span></div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; <span class="keyword">auto</span> testAll = [<span class="keyword">this</span>](<a class="code" href="classripple_1_1FeatureBitset.html">FeatureBitset</a> features) {</div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a8090e559549e6be418e5a0d922d73932">testStepLimit</a>(features);</div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a85834a72d995b4cd9fc66528388f6f8d">testCrossingLimit</a>(features);</div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a56fa8b7c649d3195d5276f71e7d5c3f6">testStepAndCrossingLimit</a>(features);</div>
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#a61f86d33282cf5af0daf95751f5df7e7">testAutoBridgedLimits</a>(features);</div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; <a class="code" href="classripple_1_1test_1_1CrossingLimits__test.html#ae0e36128e971357ad17d26467308e7e2">testOfferOverflow</a>(features);</div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; };</div>
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; <span class="keyword">using namespace </span>jtx;</div>
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> sa = <a class="code" href="namespaceripple_1_1test_1_1jtx.html#af5441d84d5977d52246c5226313560d4">supported_amendments</a>();</div>
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; testAll(sa);</div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; testAll(sa - <a class="code" href="namespaceripple.html#aa4a3b6da5fd09c790148fab25803d4bc">featureFlowSortStrands</a>);</div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; testAll(sa - <a class="code" href="namespaceripple.html#a2cb56a55020f266d207ee04d66cc97ae">featureFlowCross</a> - <a class="code" href="namespaceripple.html#aa4a3b6da5fd09c790148fab25803d4bc">featureFlowSortStrands</a>);</div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; }</div>
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160;};</div>
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; </div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160;<a class="code" href="namespaceripple_1_1test.html#a1e21fbfd1eb95324d619bd5bd7d9a85f">BEAST_DEFINE_TESTSUITE_MANUAL_PRIO</a>(CrossingLimits, tx, <a class="code" href="namespaceripple.html">ripple</a>, 10);</div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; </div>
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160;} <span class="comment">// namespace test</span></div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160;} <span class="comment">// namespace ripple</span></div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="anamespaceripple_html_aee6c41ec9be20b8705502ae9290ef2b0"><div class="ttname"><a href="namespaceripple.html#aee6c41ec9be20b8705502ae9290ef2b0">ripple::sfOwnerCount</a></div><div class="ttdeci">const SF_UINT32 sfOwnerCount</div></div>
<div class="ttc" id="anamespaceripple_1_1test_1_1jtx_html_a37cf35ddf6bc8f4c6cbfa3fba57d6815"><div class="ttname"><a href="namespaceripple_1_1test_1_1jtx.html#a37cf35ddf6bc8f4c6cbfa3fba57d6815">ripple::test::jtx::XRP</a></div><div class="ttdeci">const XRP_t XRP</div><div class="ttdoc">Converts to XRP Issue or STAmount.</div><div class="ttdef"><b>Definition:</b> <a href="amount_8cpp_source.html#l00105">amount.cpp:105</a></div></div>
@@ -626,14 +669,15 @@ $(function() {
<div class="ttc" id="anamespaceripple_html_aa298e929e02f59c2b05a30ee8805b38caad531e9d2f46a3a6e6f01934097e7053"><div class="ttname"><a href="namespaceripple.html#aa298e929e02f59c2b05a30ee8805b38caad531e9d2f46a3a6e6f01934097e7053">ripple::tecOVERSIZE</a></div><div class="ttdeci">@ tecOVERSIZE</div><div class="ttdef"><b>Definition:</b> <a href="TER_8h_source.html#l00272">TER.h:272</a></div></div>
<div class="ttc" id="anamespaceripple_1_1test_html_a1e21fbfd1eb95324d619bd5bd7d9a85f"><div class="ttname"><a href="namespaceripple_1_1test.html#a1e21fbfd1eb95324d619bd5bd7d9a85f">ripple::test::BEAST_DEFINE_TESTSUITE_MANUAL_PRIO</a></div><div class="ttdeci">BEAST_DEFINE_TESTSUITE_MANUAL_PRIO(CrossingLimits, tx, ripple, 10)</div></div>
<div class="ttc" id="anamespaceripple_html_a7cc64e12723fbc9606d85442a2569fedac68271a63ddbc431c307beb7d2918275"><div class="ttname"><a href="namespaceripple.html#a7cc64e12723fbc9606d85442a2569fedac68271a63ddbc431c307beb7d2918275">ripple::QualityDirection::out</a></div><div class="ttdeci">@ out</div></div>
<div class="ttc" id="aclassripple_1_1test_1_1CrossingLimits__test_html_a61f86d33282cf5af0daf95751f5df7e7"><div class="ttname"><a href="classripple_1_1test_1_1CrossingLimits__test.html#a61f86d33282cf5af0daf95751f5df7e7">ripple::test::CrossingLimits_test::testAutoBridgedLimits</a></div><div class="ttdeci">void testAutoBridgedLimits(FeatureBitset features)</div><div class="ttdef"><b>Definition:</b> <a href="CrossingLimits__test_8cpp_source.html#l00458">CrossingLimits_test.cpp:458</a></div></div>
<div class="ttc" id="aclassripple_1_1test_1_1CrossingLimits__test_html_a61f86d33282cf5af0daf95751f5df7e7"><div class="ttname"><a href="classripple_1_1test_1_1CrossingLimits__test.html#a61f86d33282cf5af0daf95751f5df7e7">ripple::test::CrossingLimits_test::testAutoBridgedLimits</a></div><div class="ttdeci">void testAutoBridgedLimits(FeatureBitset features)</div><div class="ttdef"><b>Definition:</b> <a href="CrossingLimits__test_8cpp_source.html#l00474">CrossingLimits_test.cpp:474</a></div></div>
<div class="ttc" id="aclassripple_1_1TERSubset_html"><div class="ttname"><a href="classripple_1_1TERSubset.html">ripple::TERSubset&lt; CanCvtToTER &gt;</a></div></div>
<div class="ttc" id="aclassripple_1_1test_1_1CrossingLimits__test_html_a6eb4597def34cc7ee1d71e7fd66b7fc0"><div class="ttname"><a href="classripple_1_1test_1_1CrossingLimits__test.html#a6eb4597def34cc7ee1d71e7fd66b7fc0">ripple::test::CrossingLimits_test::n_offers</a></div><div class="ttdeci">void n_offers(jtx::Env &amp;env, std::size_t n, jtx::Account const &amp;account, STAmount const &amp;in, STAmount const &amp;out)</div><div class="ttdef"><b>Definition:</b> <a href="CrossingLimits__test_8cpp_source.html#l00029">CrossingLimits_test.cpp:29</a></div></div>
<div class="ttc" id="aclassripple_1_1STAmount_html"><div class="ttname"><a href="classripple_1_1STAmount.html">ripple::STAmount</a></div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8h_source.html#l00042">STAmount.h:42</a></div></div>
<div class="ttc" id="aclassripple_1_1STAmount_html"><div class="ttname"><a href="classripple_1_1STAmount.html">ripple::STAmount</a></div><div class="ttdef"><b>Definition:</b> <a href="STAmount_8h_source.html#l00043">STAmount.h:43</a></div></div>
<div class="ttc" id="aclassripple_1_1test_1_1CrossingLimits__test_html_a85834a72d995b4cd9fc66528388f6f8d"><div class="ttname"><a href="classripple_1_1test_1_1CrossingLimits__test.html#a85834a72d995b4cd9fc66528388f6f8d">ripple::test::CrossingLimits_test::testCrossingLimit</a></div><div class="ttdeci">void testCrossingLimit(FeatureBitset features)</div><div class="ttdef"><b>Definition:</b> <a href="CrossingLimits__test_8cpp_source.html#l00088">CrossingLimits_test.cpp:88</a></div></div>
<div class="ttc" id="anamespaceripple_1_1test_1_1jtx_html_af5441d84d5977d52246c5226313560d4"><div class="ttname"><a href="namespaceripple_1_1test_1_1jtx.html#af5441d84d5977d52246c5226313560d4">ripple::test::jtx::supported_amendments</a></div><div class="ttdeci">FeatureBitset supported_amendments()</div><div class="ttdef"><b>Definition:</b> <a href="Env_8h_source.html#l00070">Env.h:70</a></div></div>
<div class="ttc" id="aclassripple_1_1test_1_1CrossingLimits__test_html_a56fa8b7c649d3195d5276f71e7d5c3f6"><div class="ttname"><a href="classripple_1_1test_1_1CrossingLimits__test.html#a56fa8b7c649d3195d5276f71e7d5c3f6">ripple::test::CrossingLimits_test::testStepAndCrossingLimit</a></div><div class="ttdeci">void testStepAndCrossingLimit(FeatureBitset features)</div><div class="ttdef"><b>Definition:</b> <a href="CrossingLimits__test_8cpp_source.html#l00128">CrossingLimits_test.cpp:128</a></div></div>
<div class="ttc" id="aclassripple_1_1test_1_1CrossingLimits__test_html_a88c77a86d501d32f185243a2bdcff22c"><div class="ttname"><a href="classripple_1_1test_1_1CrossingLimits__test.html#a88c77a86d501d32f185243a2bdcff22c">ripple::test::CrossingLimits_test::run</a></div><div class="ttdeci">void run() override</div><div class="ttdef"><b>Definition:</b> <a href="CrossingLimits__test_8cpp_source.html#l00525">CrossingLimits_test.cpp:525</a></div></div>
<div class="ttc" id="aclassripple_1_1test_1_1CrossingLimits__test_html_a88c77a86d501d32f185243a2bdcff22c"><div class="ttname"><a href="classripple_1_1test_1_1CrossingLimits__test.html#a88c77a86d501d32f185243a2bdcff22c">ripple::test::CrossingLimits_test::run</a></div><div class="ttdeci">void run() override</div><div class="ttdef"><b>Definition:</b> <a href="CrossingLimits__test_8cpp_source.html#l00567">CrossingLimits_test.cpp:567</a></div></div>
<div class="ttc" id="anamespaceripple_html_aa4a3b6da5fd09c790148fab25803d4bc"><div class="ttname"><a href="namespaceripple.html#aa4a3b6da5fd09c790148fab25803d4bc">ripple::featureFlowSortStrands</a></div><div class="ttdeci">const uint256 featureFlowSortStrands</div><div class="ttdef"><b>Definition:</b> <a href="Feature_8cpp_source.html#l00192">Feature.cpp:192</a></div></div>
<div class="ttc" id="anamespaceripple_html"><div class="ttname"><a href="namespaceripple.html">ripple</a></div><div class="ttdoc">Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.</div><div class="ttdef"><b>Definition:</b> <a href="RCLCensorshipDetector_8h_source.html#l00029">RCLCensorshipDetector.h:29</a></div></div>
<div class="ttc" id="aclassripple_1_1test_1_1CrossingLimits__test_html"><div class="ttname"><a href="classripple_1_1test_1_1CrossingLimits__test.html">ripple::test::CrossingLimits_test</a></div><div class="ttdef"><b>Definition:</b> <a href="CrossingLimits__test_8cpp_source.html#l00025">CrossingLimits_test.cpp:25</a></div></div>
<div class="ttc" id="anamespaceripple_1_1test_1_1jtx_html_a7816b23daf9b325ea1f88cc121a53d05"><div class="ttname"><a href="namespaceripple_1_1test_1_1jtx.html#a7816b23daf9b325ea1f88cc121a53d05">ripple::test::jtx::pay</a></div><div class="ttdeci">Json::Value pay(Account const &amp;account, Account const &amp;to, AnyAmount amount)</div><div class="ttdoc">Create a payment.</div><div class="ttdef"><b>Definition:</b> <a href="pay_8cpp_source.html#l00029">pay.cpp:29</a></div></div>
@@ -641,12 +685,12 @@ $(function() {
<div class="ttc" id="aclassripple_1_1test_1_1jtx_1_1Env_html_a2c5dcd5bbad5c5b767ff713b6f7cb1ed"><div class="ttname"><a href="classripple_1_1test_1_1jtx_1_1Env.html#a2c5dcd5bbad5c5b767ff713b6f7cb1ed">ripple::test::jtx::Env::close</a></div><div class="ttdeci">bool close(NetClock::time_point closeTime, boost::optional&lt; std::chrono::milliseconds &gt; consensusDelay=boost::none)</div><div class="ttdoc">Close and advance the ledger.</div><div class="ttdef"><b>Definition:</b> <a href="Env_8cpp_source.html#l00121">Env.cpp:121</a></div></div>
<div class="ttc" id="aclassripple_1_1test_1_1jtx_1_1Env_html_ae2349266cb09d1f1c3de06606ebdf9e2"><div class="ttname"><a href="classripple_1_1test_1_1jtx_1_1Env.html#ae2349266cb09d1f1c3de06606ebdf9e2">ripple::test::jtx::Env::fund</a></div><div class="ttdeci">void fund(bool setDefaultRipple, STAmount const &amp;amount, Account const &amp;account)</div><div class="ttdef"><b>Definition:</b> <a href="Env_8cpp_source.html#l00219">Env.cpp:219</a></div></div>
<div class="ttc" id="aclassripple_1_1test_1_1jtx_1_1Env_html_ad63e69c823183e7e8991752b1cf8985f"><div class="ttname"><a href="classripple_1_1test_1_1jtx_1_1Env.html#ad63e69c823183e7e8991752b1cf8985f">ripple::test::jtx::Env::le</a></div><div class="ttdeci">std::shared_ptr&lt; SLE const &gt; le(Account const &amp;account) const</div><div class="ttdoc">Return an account root.</div><div class="ttdef"><b>Definition:</b> <a href="Env_8cpp_source.html#l00207">Env.cpp:207</a></div></div>
<div class="ttc" id="aclassripple_1_1FeatureBitset_html"><div class="ttname"><a href="classripple_1_1FeatureBitset.html">ripple::FeatureBitset</a></div><div class="ttdef"><b>Definition:</b> <a href="Feature_8h_source.html#l00156">Feature.h:156</a></div></div>
<div class="ttc" id="aclassripple_1_1FeatureBitset_html"><div class="ttname"><a href="classripple_1_1FeatureBitset.html">ripple::FeatureBitset</a></div><div class="ttdef"><b>Definition:</b> <a href="Feature_8h_source.html#l00159">Feature.h:159</a></div></div>
<div class="ttc" id="asize_t_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/types/size_t.html">std::size_t</a></div></div>
<div class="ttc" id="aclassripple_1_1test_1_1jtx_1_1Account_html"><div class="ttname"><a href="classripple_1_1test_1_1jtx_1_1Account.html">ripple::test::jtx::Account</a></div><div class="ttdoc">Immutable cryptographic account descriptor.</div><div class="ttdef"><b>Definition:</b> <a href="Account_8h_source.html#l00037">Account.h:37</a></div></div>
<div class="ttc" id="aclassripple_1_1test_1_1CrossingLimits__test_html_a5739bcfc6b3b05195eb2a83a8ed232da"><div class="ttname"><a href="classripple_1_1test_1_1CrossingLimits__test.html#a5739bcfc6b3b05195eb2a83a8ed232da">ripple::test::CrossingLimits_test::testAutoBridgedLimitsTaker</a></div><div class="ttdeci">void testAutoBridgedLimitsTaker(FeatureBitset features)</div><div class="ttdef"><b>Definition:</b> <a href="CrossingLimits__test_8cpp_source.html#l00193">CrossingLimits_test.cpp:193</a></div></div>
<div class="ttc" id="aclassripple_1_1test_1_1CrossingLimits__test_html_ae0e36128e971357ad17d26467308e7e2"><div class="ttname"><a href="classripple_1_1test_1_1CrossingLimits__test.html#ae0e36128e971357ad17d26467308e7e2">ripple::test::CrossingLimits_test::testOfferOverflow</a></div><div class="ttdeci">void testOfferOverflow(FeatureBitset features)</div><div class="ttdef"><b>Definition:</b> <a href="CrossingLimits__test_8cpp_source.html#l00478">CrossingLimits_test.cpp:478</a></div></div>
<div class="ttc" id="anamespaceripple_html_a2cb56a55020f266d207ee04d66cc97ae"><div class="ttname"><a href="namespaceripple.html#a2cb56a55020f266d207ee04d66cc97ae">ripple::featureFlowCross</a></div><div class="ttdeci">const uint256 featureFlowCross</div><div class="ttdef"><b>Definition:</b> <a href="Feature_8cpp_source.html#l00166">Feature.cpp:166</a></div></div>
<div class="ttc" id="aclassripple_1_1test_1_1CrossingLimits__test_html_ae0e36128e971357ad17d26467308e7e2"><div class="ttname"><a href="classripple_1_1test_1_1CrossingLimits__test.html#ae0e36128e971357ad17d26467308e7e2">ripple::test::CrossingLimits_test::testOfferOverflow</a></div><div class="ttdeci">void testOfferOverflow(FeatureBitset features)</div><div class="ttdef"><b>Definition:</b> <a href="CrossingLimits__test_8cpp_source.html#l00494">CrossingLimits_test.cpp:494</a></div></div>
<div class="ttc" id="anamespaceripple_html_a2cb56a55020f266d207ee04d66cc97ae"><div class="ttname"><a href="namespaceripple.html#a2cb56a55020f266d207ee04d66cc97ae">ripple::featureFlowCross</a></div><div class="ttdeci">const uint256 featureFlowCross</div><div class="ttdef"><b>Definition:</b> <a href="Feature_8cpp_source.html#l00168">Feature.cpp:168</a></div></div>
<div class="ttc" id="anamespaceripple_html_aabc7f150d5082c73116a1cd5962b434da28c7d8b3ed759d363503a05fcd59f151"><div class="ttname"><a href="namespaceripple.html#aabc7f150d5082c73116a1cd5962b434da28c7d8b3ed759d363503a05fcd59f151">ripple::tesSUCCESS</a></div><div class="ttdeci">@ tesSUCCESS</div><div class="ttdef"><b>Definition:</b> <a href="TER_8h_source.html#l00216">TER.h:216</a></div></div>
<div class="ttc" id="aclassripple_1_1test_1_1jtx_1_1Env_html"><div class="ttname"><a href="classripple_1_1test_1_1jtx_1_1Env.html">ripple::test::jtx::Env</a></div><div class="ttdoc">A transaction testing environment.</div><div class="ttdef"><b>Definition:</b> <a href="Env_8h_source.html#l00115">Env.h:115</a></div></div>
<div class="ttc" id="aclassripple_1_1test_1_1CrossingLimits__test_html_ab9f2e28dc08f49e5b945dfef203d8ee1"><div class="ttname"><a href="classripple_1_1test_1_1CrossingLimits__test.html#ab9f2e28dc08f49e5b945dfef203d8ee1">ripple::test::CrossingLimits_test::testAutoBridgedLimitsFlowCross</a></div><div class="ttdeci">void testAutoBridgedLimitsFlowCross(FeatureBitset features)</div><div class="ttdef"><b>Definition:</b> <a href="CrossingLimits__test_8cpp_source.html#l00289">CrossingLimits_test.cpp:289</a></div></div>