30 .fee =
static_cast<int>(env.
current()->fees().base.drops()),
37 env.
fund(env.
current()->fees().accountReserve(0), owner);
41 .fee =
static_cast<int>(env.
current()->fees().base.drops()),
47 env.
fund(env.
current()->fees().accountReserve(1) + env.
current()->fees().base * 2, owner);
48 Oracle oracle(env, {.owner = owner, .fee =
static_cast<int>(env.
current()->fees().base.drops())});
49 BEAST_EXPECT(oracle.exists());
53 {
"XRP",
"EUR", 740, 1},
54 {
"XRP",
"GBP", 740, 1},
55 {
"XRP",
"CNY", 740, 1},
56 {
"XRP",
"CAD", 740, 1},
57 {
"XRP",
"AUD", 740, 1},
59 .fee =
static_cast<int>(env.
current()->fees().base.drops()),
65 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
67 Oracle oracle(env, {.owner = owner, .fee = baseFee},
false);
74 .
series = {{
"XRP",
"USD", 740, 1}, {
"XRP",
"USD", 750, 1}}, .fee = baseFee, .err =
ter(
temMALFORMED)});
96 {{
"XRP",
"US1", 740, 1},
97 {
"XRP",
"US2", 750, 1},
98 {
"XRP",
"US3", 740, 1},
99 {
"XRP",
"US4", 750, 1},
100 {
"XRP",
"US5", 740, 1},
101 {
"XRP",
"US6", 750, 1},
102 {
"XRP",
"US7", 740, 1},
103 {
"XRP",
"US8", 750, 1},
104 {
"XRP",
"US9", 740, 1},
105 {
"XRP",
"U10", 750, 1},
106 {
"XRP",
"U11", 740, 1}},
115 auto const baseFee =
static_cast<int>(env.current()->fees().base.drops());
118 Oracle oracle(env,
CreateArg{.
owner = owner, .series = {{{
"XRP",
"USD", 740, 1}}}, .fee = baseFee});
122 {
"XRP",
"US1", 740, 1},
123 {
"XRP",
"US2", 750, 1},
124 {
"XRP",
"US3", 740, 1},
125 {
"XRP",
"US4", 750, 1},
126 {
"XRP",
"US5", 740, 1},
127 {
"XRP",
"US6", 750, 1},
128 {
"XRP",
"US7", 740, 1},
129 {
"XRP",
"US8", 750, 1},
130 {
"XRP",
"US9", 740, 1},
131 {
"XRP",
"U10", 750, 1},
139 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
141 Oracle oracle(env, {.owner = owner, .fee = baseFee},
false);
156 BEAST_EXPECT(oracle.exists());
158 .
series = {{
"XRP",
"USD", 740, 1}}, .provider =
"provider1", .fee = baseFee, .err =
ter(
temMALFORMED)});
160 .
series = {{
"XRP",
"USD", 740, 1}},
161 .assetClass =
"currency1",
168 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
170 Oracle oracle(env, {.owner = owner, .fee = baseFee},
false);
194 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
198 Oracle oracle(env, {.owner = owner, .fee = baseFee});
199 BEAST_EXPECT(oracle.exists());
208 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
209 auto closeTime = [&]() {
210 return duration_cast<seconds>(env.
current()->header().closeTime.time_since_epoch() - 10'000s).count();
213 Oracle oracle(env, {.owner = owner, .fee = baseFee});
214 BEAST_EXPECT(oracle.exists());
218 .
series = {{
"XRP",
"USD", 740, 1}},
219 .lastUpdateTime =
static_cast<std::uint32_t>(closeTime() - 301),
224 .
series = {{
"XRP",
"USD", 740, 1}},
225 .lastUpdateTime =
static_cast<std::uint32_t>(closeTime() + 311),
228 oracle.set(
UpdateArg{.
series = {{
"XRP",
"USD", 740, 1}}, .fee = baseFee});
232 .
series = {{
"XRP",
"USD", 740, 1}},
238 .
series = {{
"XRP",
"USD", 740, 1}},
247 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
249 Oracle oracle(env, {.owner = owner, .fee = baseFee});
250 BEAST_EXPECT(oracle.exists());
263 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
266 env, {.owner = owner, .series = {{
"USD",
"USD", 740, 1}}, .fee = baseFee, .err =
ter(
temMALFORMED)});
272 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
285 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
287 Oracle oracle(env, {.owner = owner, .fee = baseFee});
310 Oracle oracle1(env, {.owner = owner, .fee =
static_cast<int>(env.
current()->fees().base.drops())});
323 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
326 Oracle oracle(env, {.owner = owner, .series = series, .fee = baseFee});
327 BEAST_EXPECT(oracle.exists());
328 BEAST_EXPECT(
ownerCount(env, owner) == (count + adj));
329 auto const entry = oracle.ledgerEntry();
330 BEAST_EXPECT(entry[jss::node][jss::Owner] == owner.
human());
331 if (features[fixIncludeKeyletFields])
333 BEAST_EXPECT(entry[jss::node][jss::OracleDocumentID] == oracle.documentID());
337 BEAST_EXPECT(!entry[jss::node].isMember(jss::OracleDocumentID));
339 BEAST_EXPECT(oracle.expectLastUpdateTime(946694810));
344 Env env(*
this, features);
345 test(env, {{
"XRP",
"USD", 740, 1}}, 1);
350 Env env(*
this, features);
353 {{
"XRP",
"USD", 740, 1},
354 {
"BTC",
"USD", 740, 1},
355 {
"ETH",
"USD", 740, 1},
356 {
"CAN",
"USD", 740, 1},
357 {
"YAN",
"USD", 740, 1},
358 {
"GBP",
"USD", 740, 1}},
364 Env env(*
this, features);
365 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
369 Oracle oracle(env, {.owner = owner, .fee = baseFee});
370 BEAST_EXPECT(oracle.exists());
371 oracle.set(
CreateArg{.
owner =
some, .series = {{
"912810RR9",
"USD", 740, 1}}, .fee = baseFee});
419 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
421 Oracle oracle(env, {.owner = owner, .series = series, .fee = baseFee});
423 BEAST_EXPECT(oracle.exists());
424 oracle.remove({.fee = baseFee});
425 BEAST_EXPECT(!oracle.exists());
426 BEAST_EXPECT(
ownerCount(env, owner) == (count - adj));
432 test(env, {{
"XRP",
"USD", 740, 1}}, 1);
441 {
"XRP",
"USD", 740, 1},
442 {
"BTC",
"USD", 740, 1},
443 {
"ETH",
"USD", 740, 1},
444 {
"CAN",
"USD", 740, 1},
445 {
"YAN",
"USD", 740, 1},
446 {
"GBP",
"USD", 740, 1},
454 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
456 auto const alice =
Account(
"alice");
457 auto const acctDelFee{
drops(env.
current()->fees().increment)};
460 Oracle oracle(env, {.owner = owner, .series = {{
"XRP",
"USD", 740, 1}}, .fee = baseFee});
461 Oracle oracle1(env, {.owner = owner, .documentID = 2, .series = {{
"XRP",
"EUR", 740, 1}}, .fee = baseFee});
463 BEAST_EXPECT(oracle.exists());
464 BEAST_EXPECT(oracle1.exists());
465 auto const index = env.
closed()->seq();
466 auto const hash = env.
closed()->header().hash;
467 for (
int i = 0; i < 256; ++i)
471 BEAST_EXPECT(!oracle.exists());
472 BEAST_EXPECT(!oracle1.exists());
475 auto verifyLedgerData = [&](
auto const& field,
auto const& value) {
477 jvParams[field] = value;
478 jvParams[jss::binary] =
false;
479 jvParams[jss::type] = jss::oracle;
481 BEAST_EXPECT(jrr[jss::result][jss::state].size() == 2);
483 verifyLedgerData(jss::ledger_index, index);
497 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
500 Oracle oracle(env, {.owner = owner, .fee = baseFee});
501 BEAST_EXPECT(oracle.exists());
504 oracle.set(
UpdateArg{.
series = {{
"XRP",
"USD", 740, 2}}, .fee = baseFee});
505 BEAST_EXPECT(oracle.expectPrice({{
"XRP",
"USD", 740, 2}}));
509 BEAST_EXPECT(
ownerCount(env, owner) == count);
512 oracle.set(
UpdateArg{.
series = {{
"XRP",
"EUR", 700, 2}}, .fee = baseFee});
513 BEAST_EXPECT(oracle.expectPrice({{
"XRP",
"USD", 0, 0}, {
"XRP",
"EUR", 700, 2}}));
515 BEAST_EXPECT(
ownerCount(env, owner) == count);
518 oracle.set(
UpdateArg{.
series = {{
"XRP",
"USD", 741, 2}, {
"XRP",
"EUR", 710, 2}}, .fee = baseFee});
519 BEAST_EXPECT(oracle.expectPrice({{
"XRP",
"USD", 741, 2}, {
"XRP",
"EUR", 710, 2}}));
521 BEAST_EXPECT(
ownerCount(env, owner) == count);
527 {
"BTC",
"USD", 741, 2},
528 {
"ETH",
"EUR", 710, 2},
529 {
"YAN",
"EUR", 710, 2},
530 {
"CAN",
"EUR", 710, 2},
534 BEAST_EXPECT(
ownerCount(env, owner) == count);
540 {{
"XRP",
"USD", 742, 2},
541 {
"XRP",
"EUR", 711, 2},
546 BEAST_EXPECT(
oracle.expectPrice({{
"XRP",
"USD", 742, 2}, {
"XRP",
"EUR", 711, 2}}));
549 BEAST_EXPECT(
ownerCount(env, owner) == count);
555 auto const baseFee =
static_cast<int>(env.current()->fees().base.drops());
556 env.fund(env.current()->fees().accountReserve(1) + env.current()->fees().base * 2, owner);
557 Oracle
oracle(env, {.owner = owner, .fee = baseFee});
558 oracle.set(UpdateArg{.series = {{
"XRP",
"USD", 742, 2}}, .fee = baseFee});
561 for (
bool const withFixOrder : {
false,
true})
565 auto const baseFee =
static_cast<int>(env.current()->fees().base.drops());
567 auto test = [&](Env& env,
DataSeries const& series) {
568 env.fund(
XRP(1'000), owner);
569 Oracle
oracle(env, {.owner = owner, .series = series, .fee = baseFee});
570 BEAST_EXPECT(
oracle.exists());
572 BEAST_EXPECT(sle->getFieldArray(sfPriceDataSeries).size() == series.size());
574 auto const beforeQuoteAssetName1 =
575 sle->getFieldArray(sfPriceDataSeries)[0].getFieldCurrency(sfQuoteAsset).getText();
576 auto const beforeQuoteAssetName2 =
577 sle->getFieldArray(sfPriceDataSeries)[1].getFieldCurrency(sfQuoteAsset).getText();
579 oracle.set(UpdateArg{.series = series, .fee = baseFee});
582 auto const afterQuoteAssetName1 =
583 sle->getFieldArray(sfPriceDataSeries)[0].getFieldCurrency(sfQuoteAsset).getText();
584 auto const afterQuoteAssetName2 =
585 sle->getFieldArray(sfPriceDataSeries)[1].getFieldCurrency(sfQuoteAsset).getText();
587 if (env.current()->rules().enabled(fixPriceOracleOrder))
589 BEAST_EXPECT(afterQuoteAssetName1 == beforeQuoteAssetName1);
590 BEAST_EXPECT(afterQuoteAssetName2 == beforeQuoteAssetName2);
594 BEAST_EXPECT(afterQuoteAssetName1 != beforeQuoteAssetName1);
595 BEAST_EXPECT(afterQuoteAssetName2 != beforeQuoteAssetName2);
598 test(env, {{
"XRP",
"USD", 742, 2}, {
"XRP",
"EUR", 711, 2}});
605 testcase(
"Multisig");
607 Oracle::setFee(100'000);
610 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
618 env.
fund(
XRP(10'000), alice, becky, zelda, ed, bob);
626 env(signers(alice, 2, {{becky, 1}, {bogie, 1}, {ed, 2}}),
sig(alie));
638 BEAST_EXPECT(oracle.exists());
645 oracle.set(
UpdateArg{.
series = {{
"XRP",
"USD", 741, 1}}, .msig =
msig(becky, bogie), .fee = baseFee});
646 BEAST_EXPECT(oracle.expectPrice({{
"XRP",
"USD", 741, 1}}));
648 env(signers(alice, jtx::none),
sig(alie));
650 env.require(
owners(alice, 1));
652 env(signers(alice, 2, {{zelda, 1}, {bob, 1}, {ed, 2}}), sig(alie));
655 oracle.set(UpdateArg{
656 .series = {{
"XRP",
"USD", 740, 1}},
657 .msig = msig(becky, bogie),
661 oracle.set(UpdateArg{.series = {{
"XRP",
"USD", 7412, 2}}, .msig = msig(zelda, bob), .fee = baseFee});
662 BEAST_EXPECT(
oracle.expectPrice({{
"XRP",
"USD", 7412, 2}}));
663 oracle.set(UpdateArg{.series = {{
"XRP",
"USD", 74245, 3}}, .msig = msig(ed), .fee = baseFee});
664 BEAST_EXPECT(
oracle.expectPrice({{
"XRP",
"USD", 74245, 3}}));
667 oracle.remove({.msig = msig(bob), .fee = baseFee, .err = ter(tefBAD_QUORUM)});
668 oracle.remove({.msig = msig(becky), .fee = baseFee, .err = ter(tefBAD_SIGNATURE)});
669 oracle.remove({.msig = msig(ed), .fee = baseFee});
670 BEAST_EXPECT(!
oracle.exists());