41 auto const baseFee = env.
current()->fees().base;
44 BEAST_EXPECT(ret[jss::error_message].asString() ==
"Missing field 'base_asset'.");
48 BEAST_EXPECT(ret[jss::error_message].asString() ==
"Missing field 'quote_asset'.");
64 "012345678901234567890123456789012345678",
65 "012345678901234567890123456789012345678G"};
66 for (
auto const& v : invalidAsset)
69 BEAST_EXPECT(ret[jss::error].asString() ==
"invalidParams");
71 BEAST_EXPECT(ret[jss::error].asString() ==
"invalidParams");
73 BEAST_EXPECT(ret[jss::error].asString() ==
"invalidParams");
78 BEAST_EXPECT(ret[jss::error_message].asString() ==
"Missing field 'oracles'.");
82 BEAST_EXPECT(ret[jss::error].asString() ==
"oracleMalformed");
86 BEAST_EXPECT(ret[jss::error].asString() ==
"objectNotFound");
91 BEAST_EXPECT(ret[jss::error].asString() ==
"objectNotFound");
94 for (
auto const& v : invalidDocument)
99 BEAST_EXPECT(ret[jss::error].asString() ==
"invalidParams");
103 BEAST_EXPECT(ret[jss::error].asString() ==
"oracleMalformed");
107 BEAST_EXPECT(ret[jss::error].asString() ==
"objectNotFound");
110 BEAST_EXPECT(ret[jss::error].asString() ==
"oracleMalformed");
117 .series = {{
"XRP",
"EUR", 740, 1}},
118 .fee =
static_cast<int>(baseFee.drops())});
120 BEAST_EXPECT(ret[jss::error].asString() ==
"objectNotFound");
124 for (
auto const& v : invalidTrim)
128 BEAST_EXPECT(ret[jss::error].asString() ==
"invalidParams");
133 for (
auto const& v : invalidTime)
136 env,
"XRP",
"USD", {{{owner,
oracle.documentID()}}}, std::nullopt, v);
137 BEAST_EXPECT(ret[jss::error].asString() ==
"invalidParams");
144 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
147 for (
int i = 0; i < 201; ++i)
151 Oracle const oracle(env, {.owner = owner, .documentID = i, .fee = baseFee});
155 BEAST_EXPECT(ret[jss::error].asString() ==
"oracleMalformed");
165 auto prep = [&](
Env& env,
auto& oracles) {
167 for (
int i = 0; i < 10; ++i)
169 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
176 .documentID = rand(),
177 .series = {{
"XRP",
"USD", 740 + i, 1}, {
"XRP",
"EUR", 740, 1}},
179 oracles.emplace_back(owner,
oracle.documentID());
187 for (
auto const& feats : {all - featureSingleAssetVault - featureLendingProtocol, all})
197 Env env(*
this, feats);
202 BEAST_EXPECT(ret[jss::entire_set][jss::mean] ==
"74.45");
203 BEAST_EXPECT(ret[jss::entire_set][jss::size].
asUInt() == 10);
206 ret[jss::entire_set][jss::standard_deviation] ==
"0.3027650354097491666",
207 ret[jss::entire_set][jss::standard_deviation].asString());
208 BEAST_EXPECT(ret[jss::median] ==
"74.45");
209 BEAST_EXPECT(ret[jss::time] == 946694900);
221 BEAST_EXPECT(ret[jss::entire_set][jss::mean] ==
"74.45");
222 BEAST_EXPECT(ret[jss::entire_set][jss::size].
asUInt() == 10);
225 ret[jss::entire_set][jss::standard_deviation] ==
"0.3027650354097491666",
226 ret[jss::entire_set][jss::standard_deviation].asString());
227 BEAST_EXPECT(ret[jss::median] ==
"74.45");
228 BEAST_EXPECT(ret[jss::trimmed_set][jss::mean] ==
"74.45");
229 BEAST_EXPECT(ret[jss::trimmed_set][jss::size].
asUInt() == 6);
232 ret[jss::trimmed_set][jss::standard_deviation] ==
"0.1870828693386970693",
233 ret[jss::trimmed_set][jss::standard_deviation].asString());
234 BEAST_EXPECT(ret[jss::time] == 946694900);
241 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
245 for (
int i = 0; i < 3; ++i)
249 {.owner = oracles[i].first,
251 .documentID =
asUInt(*oracles[i].second),
256 oracle.set(
UpdateArg{.series = {{
"XRP",
"EUR", 740, 1}}, .fee = baseFee});
257 oracle.set(
UpdateArg{.series = {{
"XRP",
"EUR", 740, 1}}, .fee = baseFee});
258 oracle.set(
UpdateArg{.series = {{
"XRP",
"EUR", 740, 1}}, .fee = baseFee});
260 for (
int i = 3; i < 6; ++i)
264 {.owner = oracles[i].first,
266 .documentID =
asUInt(*oracles[i].second),
271 oracle.set(
UpdateArg{.series = {{
"XRP",
"EUR", 740, 1}}, .fee = baseFee});
272 oracle.set(
UpdateArg{.series = {{
"XRP",
"EUR", 740, 1}}, .fee = baseFee});
277 BEAST_EXPECT(ret[jss::entire_set][jss::mean] ==
"74.6");
278 BEAST_EXPECT(ret[jss::entire_set][jss::size].
asUInt() == 7);
281 ret[jss::entire_set][jss::standard_deviation] ==
"0.2160246899469286744",
282 ret[jss::entire_set][jss::standard_deviation].asString());
283 BEAST_EXPECT(ret[jss::median] ==
"74.6");
284 BEAST_EXPECT(ret[jss::trimmed_set][jss::mean] ==
"74.6");
285 BEAST_EXPECT(ret[jss::trimmed_set][jss::size].
asUInt() == 5);
288 ret[jss::trimmed_set][jss::standard_deviation] ==
"0.1581138830084189666",
289 ret[jss::trimmed_set][jss::standard_deviation].asString());
290 BEAST_EXPECT(ret[jss::time] == 946694900);
296 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
300 for (
int i = 0; i < oracles.
size(); ++i)
304 {.owner = oracles[i].first,
306 .documentID =
asUInt(*oracles[i].second),
311 oracle.set(
UpdateArg{.series = {{
"XRP",
"USD", 740, 1}}, .fee = baseFee});
316 BEAST_EXPECT(ret[jss::entire_set][jss::mean] ==
"74");
317 BEAST_EXPECT(ret[jss::entire_set][jss::size].
asUInt() == 8);
318 BEAST_EXPECT(ret[jss::entire_set][jss::standard_deviation] ==
"0");
319 BEAST_EXPECT(ret[jss::median] ==
"74");
320 BEAST_EXPECT(ret[jss::time] == 946695000);
336 auto const baseFee =
static_cast<int>(env.
current()->fees().base.drops());
345 .series = {{
"XRP",
"USD", 740, 1}, {
"XRP",
"EUR", 840, 1}},
351 oracle.set(
UpdateArg{.series = {{
"XRP",
"EUR", 850, 1}}, .fee = baseFee});
364 BEAST_EXPECT(!ret.isMember(jss::error));
365 BEAST_EXPECT(ret.isMember(jss::median));
373 uint256 const bogusTxnID{0xABCABCAB};
376 auto const sle = view.
read(oracleKeylet);
380 replacement->setFieldH256(sfPreviousTxnID, bogusTxnID);
389 BEAST_EXPECT(modified);
390 if (
auto const sle = env.
current()->read(oracleKeylet); BEAST_EXPECT(sle))
391 BEAST_EXPECT(sle->getFieldH256(sfPreviousTxnID) == bogusTxnID);
400 BEAST_EXPECT(ret[jss::error].asString() ==
"objectNotFound");