This commit is contained in:
bthomee
2025-08-05 17:13:37 +00:00
parent f4b9019010
commit 36b5821405
3 changed files with 336 additions and 253 deletions

View File

@@ -756,158 +756,213 @@ $(function() {
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno"> 678</span> <a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.set(</div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno"> 679</span> UpdateArg{.series = {{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 742, 2}}, .fee = baseFee});</div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno"> 680</span> }</div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno"> 681</span> }</div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno"> 682</span> </div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno"> 683</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno"><a class="line" href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#a97221c6e2f664356839503e104305367"> 684</a></span> <a class="code hl_function" href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#a97221c6e2f664356839503e104305367">testMultisig</a>(<a class="code hl_class" href="classripple_1_1FeatureBitset.html">FeatureBitset</a> features)</div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno"> 685</span> {</div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno"> 686</span> testcase(<span class="stringliteral">&quot;Multisig&quot;</span>);</div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno"> 687</span> <span class="keyword">using namespace </span>jtx;</div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno"> 688</span> Oracle::setFee(100&#39;000);</div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno"> 689</span> </div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno"> 690</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Env.html">Env</a> env(*<span class="keyword">this</span>, features);</div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno"> 691</span> <span class="keyword">auto</span> <span class="keyword">const</span> baseFee =</div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno"> 692</span> <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(env.<a class="code hl_function" href="classripple_1_1test_1_1jtx_1_1Env.html#a65bedb2e0babbd55343f721de9008a37">current</a>()-&gt;fees().base.drops());</div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno"> 693</span> </div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno"> 694</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a> <span class="keyword">const</span> alice{<span class="stringliteral">&quot;alice&quot;</span>, <a class="code hl_enumvalue" href="namespaceripple.html#a9de744cfdefe1132969eb982e57e4ddea82c2b7829b8129e5a2d53665ba4b4757">KeyType::secp256k1</a>};</div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno"> 695</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a> <span class="keyword">const</span> bogie{<span class="stringliteral">&quot;bogie&quot;</span>, <a class="code hl_enumvalue" href="namespaceripple.html#a9de744cfdefe1132969eb982e57e4ddea82c2b7829b8129e5a2d53665ba4b4757">KeyType::secp256k1</a>};</div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno"> 696</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a> <span class="keyword">const</span> ed{<span class="stringliteral">&quot;ed&quot;</span>, <a class="code hl_enumvalue" href="namespaceripple.html#a9de744cfdefe1132969eb982e57e4ddea82c2b7829b8129e5a2d53665ba4b4757">KeyType::secp256k1</a>};</div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno"> 697</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a> <span class="keyword">const</span> becky{<span class="stringliteral">&quot;becky&quot;</span>, <a class="code hl_enumvalue" href="namespaceripple.html#a9de744cfdefe1132969eb982e57e4ddea8183aa2c95dc1385c8f58bf1917fcb0b">KeyType::ed25519</a>};</div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno"> 698</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a> <span class="keyword">const</span> zelda{<span class="stringliteral">&quot;zelda&quot;</span>, <a class="code hl_enumvalue" href="namespaceripple.html#a9de744cfdefe1132969eb982e57e4ddea82c2b7829b8129e5a2d53665ba4b4757">KeyType::secp256k1</a>};</div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno"> 699</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a> <span class="keyword">const</span> bob{<span class="stringliteral">&quot;bob&quot;</span>, <a class="code hl_enumvalue" href="namespaceripple.html#a9de744cfdefe1132969eb982e57e4ddea82c2b7829b8129e5a2d53665ba4b4757">KeyType::secp256k1</a>};</div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno"> 700</span> env.<a class="code hl_function" href="classripple_1_1test_1_1jtx_1_1Env.html#ae2349266cb09d1f1c3de06606ebdf9e2">fund</a>(<a class="code hl_variable" href="namespaceripple_1_1test_1_1jtx.html#aea9cd3d4e6b5df2e62d53b34b605957e">XRP</a>(10&#39;000), alice, becky, zelda, ed, bob);</div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno"> 681</span> </div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno"> 682</span> <span class="keywordflow">for</span> (<span class="keywordtype">bool</span> <span class="keyword">const</span> withFixOrder : {<span class="keyword">false</span>, <span class="keyword">true</span>})</div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno"> 683</span> {</div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno"> 684</span> <span class="comment">// Should be same order as creation</span></div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno"> 685</span> Env env(</div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno"> 686</span> *<span class="keyword">this</span>,</div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno"> 687</span> withFixOrder ? <a class="code hl_function" href="namespaceripple_1_1test_1_1jtx.html#a8e5379a68ca5b5ae718e77312c2f1f94">testable_amendments</a>()</div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno"> 688</span> : <a class="code hl_function" href="namespaceripple_1_1test_1_1jtx.html#a8e5379a68ca5b5ae718e77312c2f1f94">testable_amendments</a>() - fixPriceOracleOrder);</div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno"> 689</span> <span class="keyword">auto</span> <span class="keyword">const</span> baseFee =</div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno"> 690</span> <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(env.current()-&gt;fees().base.drops());</div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno"> 691</span> </div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno"> 692</span> <span class="keyword">auto</span> test = [&amp;](Env&amp; env, <a class="code hl_typedef" href="namespaceripple_1_1test_1_1jtx_1_1oracle.html#a1780dbf4d66e7975435c7d7ee45a8a8f">DataSeries</a> <span class="keyword">const</span>&amp; series) {</div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno"> 693</span> env.fund(<a class="code hl_variable" href="namespaceripple_1_1test_1_1jtx.html#aea9cd3d4e6b5df2e62d53b34b605957e">XRP</a>(1&#39;000), owner);</div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno"> 694</span> Oracle <a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>(</div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno"> 695</span> env, {.owner = owner, .series = series, .fee = baseFee});</div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno"> 696</span> BEAST_EXPECT(<a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.exists());</div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno"> 697</span> <span class="keyword">auto</span> sle = env.le(<a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">keylet::oracle</a>(owner, <a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.documentID()));</div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno"> 698</span> BEAST_EXPECT(</div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno"> 699</span> sle-&gt;getFieldArray(sfPriceDataSeries).size() ==</div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno"> 700</span> series.size());</div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno"> 701</span> </div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno"> 702</span> <span class="comment">// alice uses a regular key with the master disabled.</span></div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno"> 703</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a> <span class="keyword">const</span> alie{<span class="stringliteral">&quot;alie&quot;</span>, <a class="code hl_enumvalue" href="namespaceripple.html#a9de744cfdefe1132969eb982e57e4ddea82c2b7829b8129e5a2d53665ba4b4757">KeyType::secp256k1</a>};</div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno"> 704</span> env(<a class="code hl_function" href="namespaceripple_1_1test_1_1jtx.html#a25348362262144c3927b86f8d349fd86">regkey</a>(alice, alie));</div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno"> 705</span> env(<a class="code hl_function" href="namespaceripple_1_1test_1_1jtx.html#a50cacef3867fc01273aa9c29231f9a7c">fset</a>(alice, <a class="code hl_variable" href="namespaceripple.html#a67cb8f38f9c204304ea44fcff2953438">asfDisableMaster</a>), <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1sig.html">sig</a>(alice));</div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno"> 706</span> </div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno"> 707</span> <span class="comment">// Attach signers to alice.</span></div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno"> 708</span> env(signers(alice, 2, {{becky, 1}, {bogie, 1}, {ed, 2}}), <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1sig.html">sig</a>(alie));</div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno"> 709</span> env.<a class="code hl_function" href="classripple_1_1test_1_1jtx_1_1Env.html#a69095691c9bcfab1f3d69c645f2dbe33">close</a>();</div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno"> 710</span> <span class="comment">// if multiSignReserve disabled then its 2 + 1 per signer</span></div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno"> 711</span> <span class="keywordtype">int</span> <span class="keyword">const</span> signerListOwners{features[featureMultiSignReserve] ? 1 : 5};</div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno"> 712</span> env.<a class="code hl_function" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1owners.html">owners</a>(alice, signerListOwners));</div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno"> 702</span> <span class="keyword">auto</span> <span class="keyword">const</span> beforeQuoteAssetName1 =</div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno"> 703</span> sle-&gt;getFieldArray(sfPriceDataSeries)[0]</div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno"> 704</span> .getFieldCurrency(sfQuoteAsset)</div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno"> 705</span> .getText();</div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno"> 706</span> <span class="keyword">auto</span> <span class="keyword">const</span> beforeQuoteAssetName2 =</div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno"> 707</span> sle-&gt;getFieldArray(sfPriceDataSeries)[1]</div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno"> 708</span> .getFieldCurrency(sfQuoteAsset)</div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno"> 709</span> .getText();</div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno"> 710</span> </div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno"> 711</span> <a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.set(UpdateArg{.series = series, .fee = baseFee});</div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno"> 712</span> sle = env.le(<a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">keylet::oracle</a>(owner, <a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.documentID()));</div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno"> 713</span> </div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno"> 714</span> <span class="comment">// Create</span></div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno"> 715</span> <span class="comment">// Force close (true) and time advancement because the close time</span></div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno"> 716</span> <span class="comment">// is no longer 0.</span></div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno"> 717</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1oracle_1_1Oracle.html">Oracle</a> oracle(</div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno"> 718</span> env,</div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno"> 719</span> <a class="code hl_struct" href="structripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg.html">CreateArg</a>{.<a class="code hl_variable" href="structripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg.html#a92e584f6ad1e01c8943fa6732517c5a9">owner</a> = alice, .fee = baseFee, .close = <span class="keyword">true</span>},</div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno"> 720</span> <span class="keyword">false</span>);</div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno"> 721</span> oracle.set(<a class="code hl_struct" href="structripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg.html">CreateArg</a>{</div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno"> 722</span> .<a class="code hl_variable" href="structripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg.html#ae8dbfa217979a76d804bd875a758e917">msig</a> = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1msig.html">msig</a>(becky), .fee = baseFee, .err = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1ter.html">ter</a>(<a class="code hl_enumvalue" href="namespaceripple.html#a75cb21d7f1df42f2fdc8efddb79b63f4aafd3fcc27f093dd96e977fb0f07044f1">tefBAD_QUORUM</a>)});</div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno"> 723</span> oracle.set(<a class="code hl_struct" href="structripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg.html">CreateArg</a>{</div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno"> 724</span> .<a class="code hl_variable" href="structripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg.html#ae8dbfa217979a76d804bd875a758e917">msig</a> = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1msig.html">msig</a>(zelda), .fee = baseFee, .err = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1ter.html">ter</a>(<a class="code hl_enumvalue" href="namespaceripple.html#a75cb21d7f1df42f2fdc8efddb79b63f4ab2a35b856d8227d6717984f63aa5a445">tefBAD_SIGNATURE</a>)});</div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno"> 725</span> oracle.set(<a class="code hl_struct" href="structripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg.html">CreateArg</a>{.<a class="code hl_variable" href="structripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg.html#ae8dbfa217979a76d804bd875a758e917">msig</a> = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1msig.html">msig</a>(becky, bogie), .fee = baseFee});</div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno"> 726</span> BEAST_EXPECT(oracle.exists());</div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno"> 727</span> </div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno"> 728</span> <span class="comment">// Update</span></div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno"> 729</span> oracle.set(<a class="code hl_struct" href="structripple_1_1test_1_1jtx_1_1oracle_1_1UpdateArg.html">UpdateArg</a>{</div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno"> 730</span> .<a class="code hl_variable" href="structripple_1_1test_1_1jtx_1_1oracle_1_1UpdateArg.html#ab5f28bfb56ed9e15ab80e9a44c045696">series</a> = {{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 740, 1}},</div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno"> 731</span> .msig = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1msig.html">msig</a>(becky),</div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno"> 732</span> .fee = baseFee,</div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno"> 733</span> .err = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1ter.html">ter</a>(<a class="code hl_enumvalue" href="namespaceripple.html#a75cb21d7f1df42f2fdc8efddb79b63f4aafd3fcc27f093dd96e977fb0f07044f1">tefBAD_QUORUM</a>)});</div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno"> 734</span> oracle.set(<a class="code hl_struct" href="structripple_1_1test_1_1jtx_1_1oracle_1_1UpdateArg.html">UpdateArg</a>{</div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno"> 735</span> .<a class="code hl_variable" href="structripple_1_1test_1_1jtx_1_1oracle_1_1UpdateArg.html#ab5f28bfb56ed9e15ab80e9a44c045696">series</a> = {{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 740, 1}},</div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno"> 736</span> .msig = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1msig.html">msig</a>(zelda),</div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno"> 737</span> .fee = baseFee,</div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno"> 738</span> .err = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1ter.html">ter</a>(<a class="code hl_enumvalue" href="namespaceripple.html#a75cb21d7f1df42f2fdc8efddb79b63f4ab2a35b856d8227d6717984f63aa5a445">tefBAD_SIGNATURE</a>)});</div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno"> 739</span> oracle.set(<a class="code hl_struct" href="structripple_1_1test_1_1jtx_1_1oracle_1_1UpdateArg.html">UpdateArg</a>{</div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno"> 740</span> .<a class="code hl_variable" href="structripple_1_1test_1_1jtx_1_1oracle_1_1UpdateArg.html#ab5f28bfb56ed9e15ab80e9a44c045696">series</a> = {{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 741, 1}},</div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno"> 741</span> .msig = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1msig.html">msig</a>(becky, bogie),</div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno"> 742</span> .fee = baseFee});</div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno"> 743</span> BEAST_EXPECT(oracle.expectPrice({{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 741, 1}}));</div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno"> 744</span> <span class="comment">// remove the signer list</span></div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno"> 745</span> env(signers(alice, jtx::none), <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1sig.html">sig</a>(alie));</div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno"> 746</span> env.close();</div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno"> 747</span> env.require(<a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1owners.html">owners</a>(alice, 1));</div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno"> 748</span> <span class="comment">// create new signer list</span></div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno"> 749</span> env(signers(alice, 2, {{zelda, 1}, {bob, 1}, {ed, 2}}), sig(alie));</div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno"> 750</span> env.close();</div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno"> 751</span> <span class="comment">// old list fails</span></div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno"> 752</span> oracle.set(UpdateArg{</div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno"> 753</span> .series = {{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 740, 1}},</div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno"> 754</span> .msig = msig(becky, bogie),</div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno"> 755</span> .fee = baseFee,</div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno"> 756</span> .err = ter(<a class="code hl_enumvalue" href="namespaceripple.html#a75cb21d7f1df42f2fdc8efddb79b63f4ab2a35b856d8227d6717984f63aa5a445">tefBAD_SIGNATURE</a>)});</div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno"> 757</span> <span class="comment">// updated list succeeds</span></div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno"> 758</span> <a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.set(UpdateArg{</div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno"> 759</span> .series = {{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 7412, 2}},</div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno"> 760</span> .msig = msig(zelda, bob),</div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno"> 761</span> .fee = baseFee});</div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno"> 762</span> BEAST_EXPECT(<a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.expectPrice({{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 7412, 2}}));</div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno"> 763</span> <a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.set(UpdateArg{</div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno"> 764</span> .series = {{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 74245, 3}},</div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno"> 765</span> .msig = msig(ed),</div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno"> 766</span> .fee = baseFee});</div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno"> 767</span> BEAST_EXPECT(<a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.expectPrice({{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 74245, 3}}));</div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno"> 714</span> <span class="keyword">auto</span> <span class="keyword">const</span> afterQuoteAssetName1 =</div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno"> 715</span> sle-&gt;getFieldArray(sfPriceDataSeries)[0]</div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno"> 716</span> .getFieldCurrency(sfQuoteAsset)</div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno"> 717</span> .getText();</div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno"> 718</span> <span class="keyword">auto</span> <span class="keyword">const</span> afterQuoteAssetName2 =</div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno"> 719</span> sle-&gt;getFieldArray(sfPriceDataSeries)[1]</div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno"> 720</span> .getFieldCurrency(sfQuoteAsset)</div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno"> 721</span> .getText();</div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno"> 722</span> </div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno"> 723</span> <span class="keywordflow">if</span> (env.current()-&gt;rules().enabled(fixPriceOracleOrder))</div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno"> 724</span> {</div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno"> 725</span> BEAST_EXPECT(afterQuoteAssetName1 == beforeQuoteAssetName1);</div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno"> 726</span> BEAST_EXPECT(afterQuoteAssetName2 == beforeQuoteAssetName2);</div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno"> 727</span> }</div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno"> 728</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno"> 729</span> {</div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno"> 730</span> BEAST_EXPECT(afterQuoteAssetName1 != beforeQuoteAssetName1);</div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno"> 731</span> BEAST_EXPECT(afterQuoteAssetName2 != beforeQuoteAssetName2);</div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno"> 732</span> }</div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno"> 733</span> };</div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno"> 734</span> test(env, {{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 742, 2}, {<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;EUR&quot;</span>, 711, 2}});</div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno"> 735</span> }</div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno"> 736</span> }</div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno"> 737</span> </div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno"> 738</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno"><a class="line" href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#a97221c6e2f664356839503e104305367"> 739</a></span> <a class="code hl_function" href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#a97221c6e2f664356839503e104305367">testMultisig</a>(<a class="code hl_class" href="classripple_1_1FeatureBitset.html">FeatureBitset</a> features)</div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno"> 740</span> {</div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno"> 741</span> testcase(<span class="stringliteral">&quot;Multisig&quot;</span>);</div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno"> 742</span> <span class="keyword">using namespace </span>jtx;</div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno"> 743</span> Oracle::setFee(100&#39;000);</div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno"> 744</span> </div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno"> 745</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Env.html">Env</a> env(*<span class="keyword">this</span>, features);</div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno"> 746</span> <span class="keyword">auto</span> <span class="keyword">const</span> baseFee =</div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno"> 747</span> <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(env.<a class="code hl_function" href="classripple_1_1test_1_1jtx_1_1Env.html#a65bedb2e0babbd55343f721de9008a37">current</a>()-&gt;fees().base.drops());</div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno"> 748</span> </div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno"> 749</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a> <span class="keyword">const</span> alice{<span class="stringliteral">&quot;alice&quot;</span>, <a class="code hl_enumvalue" href="namespaceripple.html#a9de744cfdefe1132969eb982e57e4ddea82c2b7829b8129e5a2d53665ba4b4757">KeyType::secp256k1</a>};</div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno"> 750</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a> <span class="keyword">const</span> bogie{<span class="stringliteral">&quot;bogie&quot;</span>, <a class="code hl_enumvalue" href="namespaceripple.html#a9de744cfdefe1132969eb982e57e4ddea82c2b7829b8129e5a2d53665ba4b4757">KeyType::secp256k1</a>};</div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno"> 751</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a> <span class="keyword">const</span> ed{<span class="stringliteral">&quot;ed&quot;</span>, <a class="code hl_enumvalue" href="namespaceripple.html#a9de744cfdefe1132969eb982e57e4ddea82c2b7829b8129e5a2d53665ba4b4757">KeyType::secp256k1</a>};</div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno"> 752</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a> <span class="keyword">const</span> becky{<span class="stringliteral">&quot;becky&quot;</span>, <a class="code hl_enumvalue" href="namespaceripple.html#a9de744cfdefe1132969eb982e57e4ddea8183aa2c95dc1385c8f58bf1917fcb0b">KeyType::ed25519</a>};</div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno"> 753</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a> <span class="keyword">const</span> zelda{<span class="stringliteral">&quot;zelda&quot;</span>, <a class="code hl_enumvalue" href="namespaceripple.html#a9de744cfdefe1132969eb982e57e4ddea82c2b7829b8129e5a2d53665ba4b4757">KeyType::secp256k1</a>};</div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno"> 754</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a> <span class="keyword">const</span> bob{<span class="stringliteral">&quot;bob&quot;</span>, <a class="code hl_enumvalue" href="namespaceripple.html#a9de744cfdefe1132969eb982e57e4ddea82c2b7829b8129e5a2d53665ba4b4757">KeyType::secp256k1</a>};</div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno"> 755</span> env.<a class="code hl_function" href="classripple_1_1test_1_1jtx_1_1Env.html#ae2349266cb09d1f1c3de06606ebdf9e2">fund</a>(<a class="code hl_variable" href="namespaceripple_1_1test_1_1jtx.html#aea9cd3d4e6b5df2e62d53b34b605957e">XRP</a>(10&#39;000), alice, becky, zelda, ed, bob);</div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno"> 756</span> </div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno"> 757</span> <span class="comment">// alice uses a regular key with the master disabled.</span></div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno"> 758</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a> <span class="keyword">const</span> alie{<span class="stringliteral">&quot;alie&quot;</span>, <a class="code hl_enumvalue" href="namespaceripple.html#a9de744cfdefe1132969eb982e57e4ddea82c2b7829b8129e5a2d53665ba4b4757">KeyType::secp256k1</a>};</div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno"> 759</span> env(<a class="code hl_function" href="namespaceripple_1_1test_1_1jtx.html#a25348362262144c3927b86f8d349fd86">regkey</a>(alice, alie));</div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno"> 760</span> env(<a class="code hl_function" href="namespaceripple_1_1test_1_1jtx.html#a50cacef3867fc01273aa9c29231f9a7c">fset</a>(alice, <a class="code hl_variable" href="namespaceripple.html#a67cb8f38f9c204304ea44fcff2953438">asfDisableMaster</a>), <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1sig.html">sig</a>(alice));</div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno"> 761</span> </div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno"> 762</span> <span class="comment">// Attach signers to alice.</span></div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno"> 763</span> env(signers(alice, 2, {{becky, 1}, {bogie, 1}, {ed, 2}}), <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1sig.html">sig</a>(alie));</div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno"> 764</span> env.<a class="code hl_function" href="classripple_1_1test_1_1jtx_1_1Env.html#a69095691c9bcfab1f3d69c645f2dbe33">close</a>();</div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno"> 765</span> <span class="comment">// if multiSignReserve disabled then its 2 + 1 per signer</span></div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno"> 766</span> <span class="keywordtype">int</span> <span class="keyword">const</span> signerListOwners{features[featureMultiSignReserve] ? 1 : 5};</div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno"> 767</span> env.<a class="code hl_function" href="classripple_1_1test_1_1jtx_1_1Env.html#a34c9d58eaca6b7238258eadaf94b4a46">require</a>(<a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1owners.html">owners</a>(alice, signerListOwners));</div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno"> 768</span> </div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno"> 769</span> <span class="comment">// Remove</span></div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno"> 770</span> <a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.remove(</div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno"> 771</span> {.msig = msig(bob), .fee = baseFee, .err = ter(tefBAD_QUORUM)});</div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno"> 772</span> <a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.remove(</div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno"> 773</span> {.msig = msig(becky),</div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno"> 774</span> .fee = baseFee,</div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno"> 775</span> .err = ter(tefBAD_SIGNATURE)});</div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno"> 776</span> <a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.remove({.msig = msig(ed), .fee = baseFee});</div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno"> 777</span> BEAST_EXPECT(!<a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.exists());</div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno"> 778</span> }</div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno"> 779</span> </div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno"> 780</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno"><a class="line" href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#a1d5d3700747ddec774c27db1b09ea297"> 781</a></span> <a class="code hl_function" href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#a1d5d3700747ddec774c27db1b09ea297">testAmendment</a>()</div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno"> 782</span> {</div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno"> 783</span> testcase(<span class="stringliteral">&quot;Amendment&quot;</span>);</div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno"> 784</span> <span class="keyword">using namespace </span>jtx;</div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno"> 785</span> </div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno"> 786</span> <span class="keyword">auto</span> <span class="keyword">const</span> features = <a class="code hl_function" href="namespaceripple_1_1test_1_1jtx.html#a8e5379a68ca5b5ae718e77312c2f1f94">testable_amendments</a>() - featurePriceOracle;</div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno"> 787</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a> <span class="keyword">const</span> owner(<span class="stringliteral">&quot;owner&quot;</span>);</div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno"> 788</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Env.html">Env</a> env(*<span class="keyword">this</span>, features);</div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno"> 789</span> <span class="keyword">auto</span> <span class="keyword">const</span> baseFee =</div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno"> 790</span> <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(env.<a class="code hl_function" href="classripple_1_1test_1_1jtx_1_1Env.html#a65bedb2e0babbd55343f721de9008a37">current</a>()-&gt;fees().base.drops());</div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno"> 791</span> </div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno"> 792</span> env.<a class="code hl_function" href="classripple_1_1test_1_1jtx_1_1Env.html#ae2349266cb09d1f1c3de06606ebdf9e2">fund</a>(<a class="code hl_variable" href="namespaceripple_1_1test_1_1jtx.html#aea9cd3d4e6b5df2e62d53b34b605957e">XRP</a>(1&#39;000), owner);</div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno"> 793</span> {</div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno"> 794</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1oracle_1_1Oracle.html">Oracle</a> oracle(</div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno"> 795</span> env, {.owner = owner, .fee = baseFee, .err = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1ter.html">ter</a>(<a class="code hl_enumvalue" href="namespaceripple.html#afe21c8454670d46fb93751a5edffed46ac3482079467d517ea82aa9c8fa693d21">temDISABLED</a>)});</div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno"> 796</span> }</div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno"> 797</span> </div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno"> 798</span> {</div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno"> 799</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1oracle_1_1Oracle.html">Oracle</a> oracle(env, {.owner = owner, .fee = baseFee}, <span class="keyword">false</span>);</div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno"> 800</span> oracle.remove({.fee = baseFee, .err = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1ter.html">ter</a>(<a class="code hl_enumvalue" href="namespaceripple.html#afe21c8454670d46fb93751a5edffed46ac3482079467d517ea82aa9c8fa693d21">temDISABLED</a>)});</div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno"> 801</span> }</div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno"> 802</span> }</div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno"> 803</span> </div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno"> 804</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno"> 805</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno"><a class="line" href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#a25d6505ca685bfcfeccfaafdb1054e4a"> 806</a></span> <a class="code hl_function" href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#a25d6505ca685bfcfeccfaafdb1054e4a">run</a>()<span class="keyword"> override</span></div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno"> 807</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno"> 808</span> <span class="keyword">using namespace </span>jtx;</div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno"> 809</span> <span class="keyword">auto</span> <span class="keyword">const</span> all = <a class="code hl_function" href="namespaceripple_1_1test_1_1jtx.html#a8e5379a68ca5b5ae718e77312c2f1f94">testable_amendments</a>();</div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno"> 810</span> testInvalidSet();</div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno"> 811</span> testInvalidDelete();</div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno"> 812</span> testCreate();</div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno"> 813</span> testDelete();</div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno"> 814</span> testUpdate();</div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno"> 815</span> testAmendment();</div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno"> 816</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; features :</div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno"> 817</span> {all,</div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno"> 818</span> all - featureMultiSignReserve - featureExpandedSignerList,</div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno"> 819</span> all - featureExpandedSignerList})</div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno"> 820</span> testMultisig(features);</div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno"> 821</span> }</div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno"> 822</span>};</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno"> 769</span> <span class="comment">// Create</span></div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno"> 770</span> <span class="comment">// Force close (true) and time advancement because the close time</span></div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno"> 771</span> <span class="comment">// is no longer 0.</span></div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno"> 772</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1oracle_1_1Oracle.html">Oracle</a> oracle(</div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno"> 773</span> env,</div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno"> 774</span> <a class="code hl_struct" href="structripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg.html">CreateArg</a>{.<a class="code hl_variable" href="structripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg.html#a92e584f6ad1e01c8943fa6732517c5a9">owner</a> = alice, .fee = baseFee, .close = <span class="keyword">true</span>},</div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno"> 775</span> <span class="keyword">false</span>);</div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno"> 776</span> oracle.set(<a class="code hl_struct" href="structripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg.html">CreateArg</a>{</div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno"> 777</span> .<a class="code hl_variable" href="structripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg.html#ae8dbfa217979a76d804bd875a758e917">msig</a> = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1msig.html">msig</a>(becky), .fee = baseFee, .err = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1ter.html">ter</a>(<a class="code hl_enumvalue" href="namespaceripple.html#a75cb21d7f1df42f2fdc8efddb79b63f4aafd3fcc27f093dd96e977fb0f07044f1">tefBAD_QUORUM</a>)});</div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno"> 778</span> oracle.set(<a class="code hl_struct" href="structripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg.html">CreateArg</a>{</div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno"> 779</span> .<a class="code hl_variable" href="structripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg.html#ae8dbfa217979a76d804bd875a758e917">msig</a> = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1msig.html">msig</a>(zelda), .fee = baseFee, .err = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1ter.html">ter</a>(<a class="code hl_enumvalue" href="namespaceripple.html#a75cb21d7f1df42f2fdc8efddb79b63f4ab2a35b856d8227d6717984f63aa5a445">tefBAD_SIGNATURE</a>)});</div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno"> 780</span> oracle.set(<a class="code hl_struct" href="structripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg.html">CreateArg</a>{.<a class="code hl_variable" href="structripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg.html#ae8dbfa217979a76d804bd875a758e917">msig</a> = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1msig.html">msig</a>(becky, bogie), .fee = baseFee});</div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno"> 781</span> BEAST_EXPECT(oracle.exists());</div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno"> 782</span> </div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno"> 783</span> <span class="comment">// Update</span></div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno"> 784</span> oracle.set(<a class="code hl_struct" href="structripple_1_1test_1_1jtx_1_1oracle_1_1UpdateArg.html">UpdateArg</a>{</div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno"> 785</span> .<a class="code hl_variable" href="structripple_1_1test_1_1jtx_1_1oracle_1_1UpdateArg.html#ab5f28bfb56ed9e15ab80e9a44c045696">series</a> = {{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 740, 1}},</div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno"> 786</span> .msig = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1msig.html">msig</a>(becky),</div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno"> 787</span> .fee = baseFee,</div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno"> 788</span> .err = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1ter.html">ter</a>(<a class="code hl_enumvalue" href="namespaceripple.html#a75cb21d7f1df42f2fdc8efddb79b63f4aafd3fcc27f093dd96e977fb0f07044f1">tefBAD_QUORUM</a>)});</div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno"> 789</span> oracle.set(<a class="code hl_struct" href="structripple_1_1test_1_1jtx_1_1oracle_1_1UpdateArg.html">UpdateArg</a>{</div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno"> 790</span> .<a class="code hl_variable" href="structripple_1_1test_1_1jtx_1_1oracle_1_1UpdateArg.html#ab5f28bfb56ed9e15ab80e9a44c045696">series</a> = {{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 740, 1}},</div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno"> 791</span> .msig = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1msig.html">msig</a>(zelda),</div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno"> 792</span> .fee = baseFee,</div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno"> 793</span> .err = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1ter.html">ter</a>(<a class="code hl_enumvalue" href="namespaceripple.html#a75cb21d7f1df42f2fdc8efddb79b63f4ab2a35b856d8227d6717984f63aa5a445">tefBAD_SIGNATURE</a>)});</div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno"> 794</span> oracle.set(<a class="code hl_struct" href="structripple_1_1test_1_1jtx_1_1oracle_1_1UpdateArg.html">UpdateArg</a>{</div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno"> 795</span> .<a class="code hl_variable" href="structripple_1_1test_1_1jtx_1_1oracle_1_1UpdateArg.html#ab5f28bfb56ed9e15ab80e9a44c045696">series</a> = {{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 741, 1}},</div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno"> 796</span> .msig = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1msig.html">msig</a>(becky, bogie),</div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno"> 797</span> .fee = baseFee});</div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno"> 798</span> BEAST_EXPECT(oracle.expectPrice({{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 741, 1}}));</div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno"> 799</span> <span class="comment">// remove the signer list</span></div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno"> 800</span> env(signers(alice, jtx::none), <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1sig.html">sig</a>(alie));</div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno"> 801</span> env.close();</div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno"> 802</span> env.require(<a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1owners.html">owners</a>(alice, 1));</div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno"> 803</span> <span class="comment">// create new signer list</span></div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno"> 804</span> env(signers(alice, 2, {{zelda, 1}, {bob, 1}, {ed, 2}}), sig(alie));</div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno"> 805</span> env.close();</div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno"> 806</span> <span class="comment">// old list fails</span></div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno"> 807</span> oracle.set(UpdateArg{</div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno"> 808</span> .series = {{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 740, 1}},</div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno"> 809</span> .msig = msig(becky, bogie),</div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno"> 810</span> .fee = baseFee,</div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno"> 811</span> .err = ter(<a class="code hl_enumvalue" href="namespaceripple.html#a75cb21d7f1df42f2fdc8efddb79b63f4ab2a35b856d8227d6717984f63aa5a445">tefBAD_SIGNATURE</a>)});</div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno"> 812</span> <span class="comment">// updated list succeeds</span></div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno"> 813</span> <a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.set(UpdateArg{</div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno"> 814</span> .series = {{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 7412, 2}},</div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno"> 815</span> .msig = msig(zelda, bob),</div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno"> 816</span> .fee = baseFee});</div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno"> 817</span> BEAST_EXPECT(<a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.expectPrice({{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 7412, 2}}));</div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno"> 818</span> <a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.set(UpdateArg{</div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno"> 819</span> .series = {{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 74245, 3}},</div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno"> 820</span> .msig = msig(ed),</div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno"> 821</span> .fee = baseFee});</div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno"> 822</span> BEAST_EXPECT(<a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.expectPrice({{<span class="stringliteral">&quot;XRP&quot;</span>, <span class="stringliteral">&quot;USD&quot;</span>, 74245, 3}}));</div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno"> 823</span> </div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno"><a class="line" href="namespaceripple_1_1test_1_1jtx_1_1oracle.html#a06f39c6015d46509eb6959ca65b0c53a"> 824</a></span>BEAST_DEFINE_TESTSUITE(<a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1oracle_1_1Oracle.html">Oracle</a>, app, <a class="code hl_namespace" href="namespaceripple.html">ripple</a>);</div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno"> 825</span> </div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno"> 826</span>} <span class="comment">// namespace oracle</span></div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno"> 827</span> </div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno"> 828</span>} <span class="comment">// namespace jtx</span></div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno"> 829</span> </div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno"> 830</span>} <span class="comment">// namespace test</span></div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno"> 831</span> </div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno"> 832</span>} <span class="comment">// namespace ripple</span></div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno"> 824</span> <span class="comment">// Remove</span></div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno"> 825</span> <a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.remove(</div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno"> 826</span> {.msig = msig(bob), .fee = baseFee, .err = ter(tefBAD_QUORUM)});</div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno"> 827</span> <a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.remove(</div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno"> 828</span> {.msig = msig(becky),</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno"> 829</span> .fee = baseFee,</div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno"> 830</span> .err = ter(tefBAD_SIGNATURE)});</div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno"> 831</span> <a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.remove({.msig = msig(ed), .fee = baseFee});</div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno"> 832</span> BEAST_EXPECT(!<a class="code hl_function" href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">oracle</a>.exists());</div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno"> 833</span> }</div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno"> 834</span> </div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno"> 835</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno"><a class="line" href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#a1d5d3700747ddec774c27db1b09ea297"> 836</a></span> <a class="code hl_function" href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#a1d5d3700747ddec774c27db1b09ea297">testAmendment</a>()</div>
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno"> 837</span> {</div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno"> 838</span> testcase(<span class="stringliteral">&quot;Amendment&quot;</span>);</div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno"> 839</span> <span class="keyword">using namespace </span>jtx;</div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno"> 840</span> </div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno"> 841</span> <span class="keyword">auto</span> <span class="keyword">const</span> features = <a class="code hl_function" href="namespaceripple_1_1test_1_1jtx.html#a8e5379a68ca5b5ae718e77312c2f1f94">testable_amendments</a>() - featurePriceOracle;</div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno"> 842</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Account.html">Account</a> <span class="keyword">const</span> owner(<span class="stringliteral">&quot;owner&quot;</span>);</div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno"> 843</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1Env.html">Env</a> env(*<span class="keyword">this</span>, features);</div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno"> 844</span> <span class="keyword">auto</span> <span class="keyword">const</span> baseFee =</div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno"> 845</span> <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(env.<a class="code hl_function" href="classripple_1_1test_1_1jtx_1_1Env.html#a65bedb2e0babbd55343f721de9008a37">current</a>()-&gt;fees().base.drops());</div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno"> 846</span> </div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno"> 847</span> env.<a class="code hl_function" href="classripple_1_1test_1_1jtx_1_1Env.html#ae2349266cb09d1f1c3de06606ebdf9e2">fund</a>(<a class="code hl_variable" href="namespaceripple_1_1test_1_1jtx.html#aea9cd3d4e6b5df2e62d53b34b605957e">XRP</a>(1&#39;000), owner);</div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno"> 848</span> {</div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno"> 849</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1oracle_1_1Oracle.html">Oracle</a> oracle(</div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno"> 850</span> env, {.owner = owner, .fee = baseFee, .err = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1ter.html">ter</a>(<a class="code hl_enumvalue" href="namespaceripple.html#afe21c8454670d46fb93751a5edffed46ac3482079467d517ea82aa9c8fa693d21">temDISABLED</a>)});</div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno"> 851</span> }</div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno"> 852</span> </div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno"> 853</span> {</div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno"> 854</span> <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1oracle_1_1Oracle.html">Oracle</a> oracle(env, {.owner = owner, .fee = baseFee}, <span class="keyword">false</span>);</div>
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno"> 855</span> oracle.remove({.fee = baseFee, .err = <a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1ter.html">ter</a>(<a class="code hl_enumvalue" href="namespaceripple.html#afe21c8454670d46fb93751a5edffed46ac3482079467d517ea82aa9c8fa693d21">temDISABLED</a>)});</div>
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno"> 856</span> }</div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno"> 857</span> }</div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno"> 858</span> </div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno"> 859</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno"> 860</span> <span class="keywordtype">void</span></div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno"><a class="line" href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#a25d6505ca685bfcfeccfaafdb1054e4a"> 861</a></span> <a class="code hl_function" href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#a25d6505ca685bfcfeccfaafdb1054e4a">run</a>()<span class="keyword"> override</span></div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno"> 862</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno"> 863</span> <span class="keyword">using namespace </span>jtx;</div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno"> 864</span> <span class="keyword">auto</span> <span class="keyword">const</span> all = <a class="code hl_function" href="namespaceripple_1_1test_1_1jtx.html#a8e5379a68ca5b5ae718e77312c2f1f94">testable_amendments</a>();</div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno"> 865</span> testInvalidSet();</div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno"> 866</span> testInvalidDelete();</div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno"> 867</span> testCreate();</div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno"> 868</span> testDelete();</div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno"> 869</span> testUpdate();</div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno"> 870</span> testAmendment();</div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno"> 871</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; features :</div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno"> 872</span> {all,</div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno"> 873</span> all - featureMultiSignReserve - featureExpandedSignerList,</div>
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno"> 874</span> all - featureExpandedSignerList})</div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno"> 875</span> testMultisig(features);</div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno"> 876</span> }</div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno"> 877</span>};</div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno"> 878</span> </div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno"><a class="line" href="namespaceripple_1_1test_1_1jtx_1_1oracle.html#a06f39c6015d46509eb6959ca65b0c53a"> 879</a></span>BEAST_DEFINE_TESTSUITE(<a class="code hl_class" href="classripple_1_1test_1_1jtx_1_1oracle_1_1Oracle.html">Oracle</a>, app, <a class="code hl_namespace" href="namespaceripple.html">ripple</a>);</div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno"> 880</span> </div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno"> 881</span>} <span class="comment">// namespace oracle</span></div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno"> 882</span> </div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno"> 883</span>} <span class="comment">// namespace jtx</span></div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno"> 884</span> </div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno"> 885</span>} <span class="comment">// namespace test</span></div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno"> 886</span> </div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno"> 887</span>} <span class="comment">// namespace ripple</span></div>
<div class="ttc" id="abasic_string_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a></div></div>
<div class="ttc" id="aclassJson_1_1Value_html"><div class="ttname"><a href="classJson_1_1Value.html">Json::Value</a></div><div class="ttdoc">Represents a JSON value.</div><div class="ttdef"><b>Definition:</b> <a href="json__value_8h_source.html#l00148">json_value.h:149</a></div></div>
<div class="ttc" id="aclassbeast_1_1unit__test_1_1suite_html"><div class="ttname"><a href="classbeast_1_1unit__test_1_1suite.html">beast::unit_test::suite</a></div><div class="ttdoc">A testsuite class.</div><div class="ttdef"><b>Definition:</b> <a href="suite_8h_source.html#l00054">suite.h:55</a></div></div>
@@ -934,6 +989,7 @@ $(function() {
<div class="ttc" id="ahash_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/utility/hash.html">std::hash</a></div></div>
<div class="ttc" id="ainteger_html"><div class="ttname"><a href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint32_t</a></div></div>
<div class="ttc" id="anamespaceripple_1_1keylet_html_a0c8501b7162b24e030168fb13b6d774a"><div class="ttname"><a href="namespaceripple_1_1keylet.html#a0c8501b7162b24e030168fb13b6d774a">ripple::keylet::oracle</a></div><div class="ttdeci">Keylet oracle(AccountID const &amp;account, std::uint32_t const &amp;documentID) noexcept</div><div class="ttdef"><b>Definition:</b> <a href="Indexes_8cpp_source.html#l00520">Indexes.cpp:520</a></div></div>
<div class="ttc" id="anamespaceripple_1_1test_1_1jtx_1_1oracle_html_a1780dbf4d66e7975435c7d7ee45a8a8f"><div class="ttname"><a href="namespaceripple_1_1test_1_1jtx_1_1oracle.html#a1780dbf4d66e7975435c7d7ee45a8a8f">ripple::test::jtx::oracle::DataSeries</a></div><div class="ttdeci">std::vector&lt; std::tuple&lt; std::string, std::string, std::optional&lt; std::uint32_t &gt;, std::optional&lt; std::uint8_t &gt; &gt; &gt; DataSeries</div><div class="ttdef"><b>Definition:</b> <a href="Oracle_8h_source.html#l00055">Oracle.h:59</a></div></div>
<div class="ttc" id="anamespaceripple_1_1test_1_1jtx_1_1oracle_html_a1c1c1ff86fdc94919051f6d5c68209ab"><div class="ttname"><a href="namespaceripple_1_1test_1_1jtx_1_1oracle.html#a1c1c1ff86fdc94919051f6d5c68209ab">ripple::test::jtx::oracle::testStartTime</a></div><div class="ttdeci">static constexpr std::chrono::seconds testStartTime</div><div class="ttdef"><b>Definition:</b> <a href="Oracle_8h_source.html#l00112">Oracle.h:112</a></div></div>
<div class="ttc" id="anamespaceripple_1_1test_1_1jtx_html_a12abe185058a3db015909ed92c421097"><div class="ttname"><a href="namespaceripple_1_1test_1_1jtx.html#a12abe185058a3db015909ed92c421097">ripple::test::jtx::ownerCount</a></div><div class="ttdeci">std::uint32_t ownerCount(Env const &amp;env, Account const &amp;account)</div><div class="ttdef"><b>Definition:</b> <a href="TestHelpers_8cpp_source.html#l00054">TestHelpers.cpp:54</a></div></div>
<div class="ttc" id="anamespaceripple_1_1test_1_1jtx_html_a25348362262144c3927b86f8d349fd86"><div class="ttname"><a href="namespaceripple_1_1test_1_1jtx.html#a25348362262144c3927b86f8d349fd86">ripple::test::jtx::regkey</a></div><div class="ttdeci">Json::Value regkey(Account const &amp;account, disabled_t)</div><div class="ttdoc">Disable the regular key.</div><div class="ttdef"><b>Definition:</b> <a href="regkey_8cpp_source.html#l00029">regkey.cpp:29</a></div></div>
@@ -978,10 +1034,10 @@ $(function() {
<div class="ttc" id="astructripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg_html_ae8dbfa217979a76d804bd875a758e917"><div class="ttname"><a href="structripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg.html#ae8dbfa217979a76d804bd875a758e917">ripple::test::jtx::oracle::CreateArg::msig</a></div><div class="ttdeci">std::optional&lt; jtx::msig &gt; msig</div><div class="ttdef"><b>Definition:</b> <a href="Oracle_8h_source.html#l00072">Oracle.h:72</a></div></div>
<div class="ttc" id="astructripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg_html_af0d98f8a6087615a78dec2aa88e62a7c"><div class="ttname"><a href="structripple_1_1test_1_1jtx_1_1oracle_1_1CreateArg.html#af0d98f8a6087615a78dec2aa88e62a7c">ripple::test::jtx::oracle::CreateArg::provider</a></div><div class="ttdeci">std::optional&lt; AnyValue &gt; provider</div><div class="ttdef"><b>Definition:</b> <a href="Oracle_8h_source.html#l00068">Oracle.h:68</a></div></div>
<div class="ttc" id="astructripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test_html"><div class="ttname"><a href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html">ripple::test::jtx::oracle::Oracle_test</a></div><div class="ttdef"><b>Definition:</b> <a href="Oracle__test_8cpp_source.html#l00029">Oracle_test.cpp:30</a></div></div>
<div class="ttc" id="astructripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test_html_a1d5d3700747ddec774c27db1b09ea297"><div class="ttname"><a href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#a1d5d3700747ddec774c27db1b09ea297">ripple::test::jtx::oracle::Oracle_test::testAmendment</a></div><div class="ttdeci">void testAmendment()</div><div class="ttdef"><b>Definition:</b> <a href="Oracle__test_8cpp_source.html#l00781">Oracle_test.cpp:781</a></div></div>
<div class="ttc" id="astructripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test_html_a25d6505ca685bfcfeccfaafdb1054e4a"><div class="ttname"><a href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#a25d6505ca685bfcfeccfaafdb1054e4a">ripple::test::jtx::oracle::Oracle_test::run</a></div><div class="ttdeci">void run() override</div><div class="ttdoc">Runs the suite.</div><div class="ttdef"><b>Definition:</b> <a href="Oracle__test_8cpp_source.html#l00806">Oracle_test.cpp:806</a></div></div>
<div class="ttc" id="astructripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test_html_a1d5d3700747ddec774c27db1b09ea297"><div class="ttname"><a href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#a1d5d3700747ddec774c27db1b09ea297">ripple::test::jtx::oracle::Oracle_test::testAmendment</a></div><div class="ttdeci">void testAmendment()</div><div class="ttdef"><b>Definition:</b> <a href="Oracle__test_8cpp_source.html#l00836">Oracle_test.cpp:836</a></div></div>
<div class="ttc" id="astructripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test_html_a25d6505ca685bfcfeccfaafdb1054e4a"><div class="ttname"><a href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#a25d6505ca685bfcfeccfaafdb1054e4a">ripple::test::jtx::oracle::Oracle_test::run</a></div><div class="ttdeci">void run() override</div><div class="ttdoc">Runs the suite.</div><div class="ttdef"><b>Definition:</b> <a href="Oracle__test_8cpp_source.html#l00861">Oracle_test.cpp:861</a></div></div>
<div class="ttc" id="astructripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test_html_a5ae397649e0ef16a9130ffb9d95e247d"><div class="ttname"><a href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#a5ae397649e0ef16a9130ffb9d95e247d">ripple::test::jtx::oracle::Oracle_test::testCreate</a></div><div class="ttdeci">void testCreate()</div><div class="ttdef"><b>Definition:</b> <a href="Oracle__test_8cpp_source.html#l00401">Oracle_test.cpp:401</a></div></div>
<div class="ttc" id="astructripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test_html_a97221c6e2f664356839503e104305367"><div class="ttname"><a href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#a97221c6e2f664356839503e104305367">ripple::test::jtx::oracle::Oracle_test::testMultisig</a></div><div class="ttdeci">void testMultisig(FeatureBitset features)</div><div class="ttdef"><b>Definition:</b> <a href="Oracle__test_8cpp_source.html#l00684">Oracle_test.cpp:684</a></div></div>
<div class="ttc" id="astructripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test_html_a97221c6e2f664356839503e104305367"><div class="ttname"><a href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#a97221c6e2f664356839503e104305367">ripple::test::jtx::oracle::Oracle_test::testMultisig</a></div><div class="ttdeci">void testMultisig(FeatureBitset features)</div><div class="ttdef"><b>Definition:</b> <a href="Oracle__test_8cpp_source.html#l00739">Oracle_test.cpp:739</a></div></div>
<div class="ttc" id="astructripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test_html_aa4b6ac9727dce6ff314a9ffe0de58bb5"><div class="ttname"><a href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#aa4b6ac9727dce6ff314a9ffe0de58bb5">ripple::test::jtx::oracle::Oracle_test::testDelete</a></div><div class="ttdeci">void testDelete()</div><div class="ttdef"><b>Definition:</b> <a href="Oracle__test_8cpp_source.html#l00503">Oracle_test.cpp:503</a></div></div>
<div class="ttc" id="astructripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test_html_ad44264ee872791a99c1050d71ec782a2"><div class="ttname"><a href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#ad44264ee872791a99c1050d71ec782a2">ripple::test::jtx::oracle::Oracle_test::testInvalidSet</a></div><div class="ttdeci">void testInvalidSet()</div><div class="ttdef"><b>Definition:</b> <a href="Oracle__test_8cpp_source.html#l00033">Oracle_test.cpp:33</a></div></div>
<div class="ttc" id="astructripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test_html_ae39b203a0c056b141007b93e15229771"><div class="ttname"><a href="structripple_1_1test_1_1jtx_1_1oracle_1_1Oracle__test.html#ae39b203a0c056b141007b93e15229771">ripple::test::jtx::oracle::Oracle_test::testInvalidDelete</a></div><div class="ttdeci">void testInvalidDelete()</div><div class="ttdef"><b>Definition:</b> <a href="Oracle__test_8cpp_source.html#l00458">Oracle_test.cpp:458</a></div></div>