rippled
Oracle.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_TEST_JTX_ORACLE_H_INCLUDED
21 #define RIPPLE_TEST_JTX_ORACLE_H_INCLUDED
22 
23 #include <date/date.h>
24 #include <test/jtx.h>
25 
26 namespace ripple {
27 namespace test {
28 namespace jtx {
29 namespace oracle {
30 
31 // base asset, quote asset, price, scale
37 
38 // Typical defaults for Create
39 struct CreateArg
40 {
43  DataSeries series = {{"XRP", "USD", 740, 1}};
50  std::optional<jtx::seq> seq = std::nullopt;
52  std::optional<ter> err = std::nullopt;
53  bool close = false;
54 };
55 
56 // Typical defaults for Update
57 struct UpdateArg
58 {
68  std::optional<jtx::seq> seq = std::nullopt;
70  std::optional<ter> err = std::nullopt;
71 };
72 
73 struct RemoveArg
74 {
75  std::optional<AccountID> const& owner = std::nullopt;
77  std::optional<jtx::msig> const& msig = std::nullopt;
78  std::optional<jtx::seq> seq = std::nullopt;
80  std::optional<ter> const& err = std::nullopt;
81 };
82 
83 // Simulate testStartTime as 10'000s from Ripple epoch time to make
84 // LastUpdateTime validation to work and to make unit-test consistent.
85 // The value doesn't matter much, it has to be greater
86 // than maxLastUpdateTimeDelta in order to pass LastUpdateTime
87 // validation {close-maxLastUpdateTimeDelta,close+maxLastUpdateTimeDelta}.
90 
95 class Oracle
96 {
97 private:
98  // Global fee if not 0
99  static inline std::uint32_t fee = 0;
100  Env& env_;
101  AccountID owner_;
102  std::uint32_t documentID_;
103 
104 private:
105  void
106  submit(
107  Json::Value const& jv,
108  std::optional<jtx::msig> const& msig,
109  std::optional<jtx::seq> const& seq,
110  std::optional<ter> const& err);
111 
112 public:
113  Oracle(Env& env, CreateArg const& arg, bool submit = true);
114 
115  void
116  remove(RemoveArg const& arg);
117 
118  void
119  set(CreateArg const& arg);
120  void
121  set(UpdateArg const& arg);
122 
123  static Json::Value
124  aggregatePrice(
125  Env& env,
126  std::optional<std::string> const& baseAsset,
127  std::optional<std::string> const& quoteAsset,
128  std::optional<std::vector<std::pair<Account, std::uint32_t>>> const&
129  oracles = std::nullopt,
130  std::optional<std::uint8_t> const& trim = std::nullopt,
131  std::optional<std::uint8_t> const& timeTreshold = std::nullopt);
132 
133  std::uint32_t
134  documentID() const
135  {
136  return documentID_;
137  }
138 
139  [[nodiscard]] bool
140  exists() const
141  {
142  return exists(env_, owner_, documentID_);
143  }
144 
145  [[nodiscard]] static bool
146  exists(Env& env, AccountID const& account, std::uint32_t documentID);
147 
148  [[nodiscard]] bool
149  expectPrice(DataSeries const& pricess) const;
150 
151  [[nodiscard]] bool
152  expectLastUpdateTime(std::uint32_t lastUpdateTime) const;
153 
154  static Json::Value
155  ledgerEntry(
156  Env& env,
157  AccountID const& account,
158  std::variant<std::uint32_t, std::string> const& documentID,
159  std::optional<std::string> const& index = std::nullopt);
160 
161  Json::Value
162  ledgerEntry(std::optional<std::string> const& index = std::nullopt) const
163  {
164  return Oracle::ledgerEntry(env_, owner_, documentID_, index);
165  }
166 
167  static void
168  setFee(std::uint32_t f)
169  {
170  fee = f;
171  }
172 
173  friend std::ostream&
174  operator<<(std::ostream& strm, Oracle const& oracle)
175  {
176  strm << oracle.ledgerEntry().toStyledString();
177  return strm;
178  }
179 };
180 
181 } // namespace oracle
182 } // namespace jtx
183 } // namespace test
184 } // namespace ripple
185 
186 #endif // RIPPLE_TEST_JTX_ORACLE_H_INCLUDED
ripple::test::jtx::oracle::CreateArg::series
DataSeries series
Definition: Oracle.h:43
ripple::test::jtx::oracle::CreateArg::err
std::optional< ter > err
Definition: Oracle.h:52
ripple::test::jtx::oracle::DataSeries
std::vector< std::tuple< std::string, std::string, std::optional< std::uint32_t >, std::optional< std::uint8_t > >> DataSeries
Definition: Oracle.h:36
std::string
STL class.
ripple::test::jtx::oracle::UpdateArg::provider
std::optional< std::string > provider
Definition: Oracle.h:63
ripple::test::jtx::oracle::UpdateArg::lastUpdateTime
std::optional< std::uint32_t > lastUpdateTime
Definition: Oracle.h:65
ripple::test::jtx::oracle::UpdateArg::err
std::optional< ter > err
Definition: Oracle.h:70
ripple::keylet::oracle
Keylet oracle(AccountID const &account, std::uint32_t const &documentID) noexcept
Definition: Indexes.cpp:449
std::vector
STL class.
std::chrono::seconds
std::tuple
ripple::test::jtx::msig
Set a multisignature on a JTx.
Definition: multisign.h:63
ripple::test::jtx::oracle::CreateArg::owner
std::optional< AccountID > owner
Definition: Oracle.h:41
ripple::test::jtx::oracle::CreateArg::assetClass
std::optional< std::string > assetClass
Definition: Oracle.h:44
ripple::epoch_offset
constexpr static std::chrono::seconds epoch_offset
Clock for measuring the network time.
Definition: chrono.h:56
ripple::test::jtx::oracle::RemoveArg::owner
std::optional< AccountID > const & owner
Definition: Oracle.h:75
ripple::test::jtx::oracle::CreateArg::lastUpdateTime
std::optional< std::uint32_t > lastUpdateTime
Definition: Oracle.h:47
ripple::test::jtx::oracle::RemoveArg
Definition: Oracle.h:73
ripple::test::jtx::oracle::testStartTime
constexpr static std::chrono::seconds testStartTime
Definition: Oracle.h:88
ripple::test::jtx::oracle::UpdateArg
Definition: Oracle.h:57
ripple::test::jtx::oracle::CreateArg
Definition: Oracle.h:39
ripple::test::jtx::oracle::CreateArg::close
bool close
Definition: Oracle.h:53
ripple::test::jtx::oracle::UpdateArg::uri
std::optional< std::string > uri
Definition: Oracle.h:64
std::uint32_t
ripple::test::jtx::fee
Set the fee on a JTx.
Definition: fee.h:35
ripple::test::jtx::seq
Set the sequence number on a JTx.
Definition: seq.h:33
ripple::test::jtx::oracle::UpdateArg::series
DataSeries series
Definition: Oracle.h:61
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::test::jtx::oracle::RemoveArg::err
std::optional< ter > const & err
Definition: Oracle.h:80
ripple::test::jtx::oracle::CreateArg::documentID
std::optional< std::uint32_t > documentID
Definition: Oracle.h:42
ripple::test::jtx::flags
Match set account flags.
Definition: flags.h:111
ripple::test::jtx::oracle::UpdateArg::owner
std::optional< AccountID > owner
Definition: Oracle.h:59
ripple::test::jtx::oracle::UpdateArg::documentID
std::optional< std::uint32_t > documentID
Definition: Oracle.h:60
ripple::test::jtx::oracle::RemoveArg::documentID
std::optional< std::uint32_t > const & documentID
Definition: Oracle.h:76
std::optional< std::uint32_t >
ripple::test::jtx::oracle::CreateArg::uri
std::optional< std::string > uri
Definition: Oracle.h:46
ripple::test::jtx::oracle::CreateArg::provider
std::optional< std::string > provider
Definition: Oracle.h:45
ripple::test::jtx::oracle::UpdateArg::assetClass
std::optional< std::string > assetClass
Definition: Oracle.h:62