rippled
AMM.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2023 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_AMM_H_INCLUDED
21 #define RIPPLE_TEST_JTX_AMM_H_INCLUDED
22 
23 #include <ripple/json/json_value.h>
24 #include <ripple/protocol/STAmount.h>
25 #include <ripple/protocol/TxFlags.h>
26 #include <ripple/rpc/GRPCHandlers.h>
27 #include <test/jtx/Account.h>
28 #include <test/jtx/Env.h>
29 #include <test/jtx/multisign.h>
30 #include <test/jtx/seq.h>
31 #include <test/jtx/ter.h>
32 
33 namespace ripple {
34 namespace test {
35 namespace jtx {
36 
37 class LPToken
38 {
40 
41 public:
43  {
44  }
46  {
47  }
48  IOUAmount const&
49  tokens() const
50  {
51  return tokens_;
52  }
53  STAmount
54  tokens(Issue const& ammIssue) const
55  {
56  return STAmount{tokens_, ammIssue};
57  }
58 };
59 
62 class AMM
63 {
69  bool log_;
70  // Predict next purchase price
74  // Multi-signature
76  // Transaction fee
80 
81 public:
82  AMM(Env& env,
83  Account const& account,
84  STAmount const& asset1,
85  STAmount const& asset2,
86  bool log = false,
87  std::uint16_t tfee = 0,
88  std::uint32_t fee = 0,
89  std::optional<std::uint32_t> flags = std::nullopt,
90  std::optional<jtx::seq> seq = std::nullopt,
91  std::optional<jtx::msig> ms = std::nullopt,
92  std::optional<ter> const& ter = std::nullopt);
93  AMM(Env& env,
94  Account const& account,
95  STAmount const& asset1,
96  STAmount const& asset2,
97  ter const& ter,
98  bool log = false);
99 
103  ammRpcInfo(
104  std::optional<AccountID> const& account = std::nullopt,
105  std::optional<std::string> const& ledgerIndex = std::nullopt,
106  std::optional<std::pair<Issue, Issue>> tokens = std::nullopt) const;
107 
110  [[nodiscard]] bool
112  STAmount const& asset1,
113  STAmount const& asset2,
114  IOUAmount const& lpt,
115  std::optional<AccountID> const& account = std::nullopt) const;
116 
120  balances(
121  Issue const& issue1,
122  Issue const& issue2,
123  std::optional<AccountID> const& account = std::nullopt) const;
124 
125  [[nodiscard]] bool
126  expectLPTokens(AccountID const& account, IOUAmount const& tokens) const;
127 
133  [[nodiscard]] bool
137  IOUAmount expectedPrice) const;
138 
139  [[nodiscard]] bool
140  expectAuctionSlot(std::vector<AccountID> const& authAccount) const;
141 
142  [[nodiscard]] bool
144 
145  [[nodiscard]] bool
147  STAmount const& asset1,
148  STAmount const& asset2,
149  IOUAmount const& balance,
150  std::optional<AccountID> const& account = std::nullopt,
151  std::optional<std::string> const& ledger_index = std::nullopt) const;
152 
153  [[nodiscard]] bool
154  ammExists() const;
155 
156  IOUAmount
157  deposit(
158  std::optional<Account> const& account,
159  LPToken tokens,
160  std::optional<STAmount> const& asset1InDetails = std::nullopt,
161  std::optional<std::uint32_t> const& flags = std::nullopt,
162  std::optional<ter> const& ter = std::nullopt);
163 
164  IOUAmount
165  deposit(
166  std::optional<Account> const& account,
167  STAmount const& asset1InDetails,
168  std::optional<STAmount> const& asset2InAmount = std::nullopt,
169  std::optional<STAmount> const& maxEP = std::nullopt,
170  std::optional<std::uint32_t> const& flags = std::nullopt,
171  std::optional<ter> const& ter = std::nullopt);
172 
173  IOUAmount
174  deposit(
175  std::optional<Account> const& account,
177  std::optional<STAmount> const& asset1In,
178  std::optional<STAmount> const& asset2In,
179  std::optional<STAmount> const& maxEP,
181  std::optional<std::pair<Issue, Issue>> const& assets,
183  std::optional<ter> const& ter = std::nullopt);
184 
185  IOUAmount
186  withdraw(
187  std::optional<Account> const& account,
189  std::optional<STAmount> const& asset1OutDetails = std::nullopt,
190  std::optional<std::uint32_t> const& flags = std::nullopt,
191  std::optional<ter> const& ter = std::nullopt);
192 
193  IOUAmount
195  std::optional<Account> const& account,
196  std::optional<STAmount> const& asset1OutDetails = std::nullopt)
197  {
198  return withdraw(
199  account,
200  std::nullopt,
201  asset1OutDetails,
202  asset1OutDetails ? tfOneAssetWithdrawAll : tfWithdrawAll,
203  std::nullopt);
204  }
205 
206  IOUAmount
207  withdraw(
208  std::optional<Account> const& account,
209  STAmount const& asset1Out,
210  std::optional<STAmount> const& asset2Out = std::nullopt,
211  std::optional<IOUAmount> const& maxEP = std::nullopt,
212  std::optional<ter> const& ter = std::nullopt);
213 
214  IOUAmount
215  withdraw(
216  std::optional<Account> const& account,
218  std::optional<STAmount> const& asset1Out,
219  std::optional<STAmount> const& asset2Out,
220  std::optional<IOUAmount> const& maxEP,
222  std::optional<std::pair<Issue, Issue>> const& assets,
224  std::optional<ter> const& ter = std::nullopt);
225 
226  void
227  vote(
228  std::optional<Account> const& account,
229  std::uint32_t feeVal,
230  std::optional<std::uint32_t> const& flags = std::nullopt,
231  std::optional<jtx::seq> const& seq = std::nullopt,
232  std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
233  std::optional<ter> const& ter = std::nullopt);
234 
235  void
236  bid(std::optional<Account> const& account,
238  std::nullopt,
240  std::nullopt,
241  std::vector<Account> const& authAccounts = {},
242  std::optional<std::uint32_t> const& flags = std::nullopt,
243  std::optional<jtx::seq> const& seq = std::nullopt,
244  std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
245  std::optional<ter> const& ter = std::nullopt);
246 
247  AccountID const&
248  ammAccount() const
249  {
250  return ammAccount_;
251  }
252 
253  Issue
254  lptIssue() const
255  {
256  return lptIssue_;
257  }
258 
259  IOUAmount
260  tokens() const
261  {
262  return initialLPTokens_;
263  }
264 
265  IOUAmount
267  std::optional<AccountID> const& account = std::nullopt) const;
268 
269  friend std::ostream&
270  operator<<(std::ostream& s, AMM const& amm)
271  {
272  if (auto const res = amm.ammRpcInfo())
273  s << res.toStyledString();
274  return s;
275  }
276 
279  {
280  return ammRpcInfo(lp).toStyledString();
281  }
282 
285  {
286  return ammRpcInfo(lp);
287  }
288 
289 private:
290  void
291  setTokens(
292  Json::Value& jv,
293  std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt);
294 
295  AccountID
296  create(
297  std::uint32_t tfee = 0,
298  std::optional<std::uint32_t> const& flags = std::nullopt,
299  std::optional<jtx::seq> const& seq = std::nullopt,
300  std::optional<ter> const& ter = std::nullopt);
301 
302  IOUAmount
303  deposit(
304  std::optional<Account> const& account,
305  Json::Value& jv,
306  std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
307  std::optional<jtx::seq> const& seq = std::nullopt,
308  std::optional<ter> const& ter = std::nullopt);
309 
310  IOUAmount
311  withdraw(
312  std::optional<Account> const& account,
313  Json::Value& jv,
315  std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
316  std::optional<ter> const& ter = std::nullopt);
317 
318  void
319  log(bool log)
320  {
321  log_ = log;
322  }
323 
324  [[nodiscard]] bool
326  STAmount const& asset1,
327  STAmount const& asset2,
328  IOUAmount const& balance,
329  Json::Value const& jv) const;
330 
331  void
332  submit(
333  Json::Value const& jv,
335  std::optional<ter> const& ter);
336 
337  [[nodiscard]] bool
338  expectAuctionSlot(auto&& cb) const;
339 };
340 
341 namespace amm {
343 trust(
344  AccountID const& account,
345  STAmount const& amount,
346  std::uint32_t flags = 0);
348 pay(Account const& account, AccountID const& to, STAmount const& amount);
349 } // namespace amm
350 
351 } // namespace jtx
352 } // namespace test
353 } // namespace ripple
354 
355 #endif // RIPPLE_TEST_JTX_AMM_H_INCLUDED
ripple::Issue
A currency issued by an account.
Definition: Issue.h:35
std::string
STL class.
ripple::test::jtx::AMM::msig_
const std::optional< msig > msig_
Definition: AMM.h:75
ripple::test::jtx::AMM::ammAccount
AccountID const & ammAccount() const
Definition: AMM.h:248
ripple::test::jtx::ter
Set the expected result code for a JTx The test will fail if the code doesn't match.
Definition: ter.h:33
std::pair
ripple::test::jtx::AMM::ammRpcInfo
Json::Value ammRpcInfo(std::optional< AccountID > const &account=std::nullopt, std::optional< std::string > const &ledgerIndex=std::nullopt, std::optional< std::pair< Issue, Issue >> tokens=std::nullopt) const
Send amm_info RPC command.
Definition: AMM.cpp:134
ripple::test::jtx::balance
A balance matches.
Definition: balance.h:38
std::vector
STL class.
ripple::test::jtx::LPToken::LPToken
LPToken(std::uint64_t tokens)
Definition: AMM.h:42
ripple::test::jtx::AMM::operator()
Json::Value operator()(AccountID const &lp)
Definition: AMM.h:284
ripple::test::jtx::AMM::vote
void vote(std::optional< Account > const &account, std::uint32_t feeVal, std::optional< std::uint32_t > const &flags=std::nullopt, std::optional< jtx::seq > const &seq=std::nullopt, std::optional< std::pair< Issue, Issue >> const &assets=std::nullopt, std::optional< ter > const &ter=std::nullopt)
Definition: AMM.cpp:559
ripple::test::jtx::amm::pay
Json::Value pay(Account const &account, AccountID const &to, STAmount const &amount)
Definition: AMM.cpp:714
ripple::test::jtx::AMM::deposit
IOUAmount deposit(std::optional< Account > const &account, LPToken tokens, std::optional< STAmount > const &asset1InDetails=std::nullopt, std::optional< std::uint32_t > const &flags=std::nullopt, std::optional< ter > const &ter=std::nullopt)
Definition: AMM.cpp:369
std::tuple
ripple::test::jtx::AMM::bid
void bid(std::optional< Account > const &account, std::optional< std::variant< int, IOUAmount, STAmount >> const &bidMin=std::nullopt, std::optional< std::variant< int, IOUAmount, STAmount >> const &bidMax=std::nullopt, std::vector< Account > const &authAccounts={}, std::optional< std::uint32_t > const &flags=std::nullopt, std::optional< jtx::seq > const &seq=std::nullopt, std::optional< std::pair< Issue, Issue >> const &assets=std::nullopt, std::optional< ter > const &ter=std::nullopt)
Definition: AMM.cpp:580
ripple::IOUAmount
Floating point representation of amounts with high dynamic range.
Definition: IOUAmount.h:43
ripple::test::jtx::AMM
Convenience class to test AMM functionality.
Definition: AMM.h:62
Json::Value::toStyledString
std::string toStyledString() const
Definition: json_value.cpp:1039
ripple::test::jtx::AMM::expectAmmInfo
bool expectAmmInfo(STAmount const &asset1, STAmount const &asset2, IOUAmount const &balance, Json::Value const &jv) const
Definition: AMM.cpp:300
ripple::test::jtx::AMM::creatorAccount_
const Account creatorAccount_
Definition: AMM.h:65
ripple::test::jtx::AMM::expectBalances
bool expectBalances(STAmount const &asset1, STAmount const &asset2, IOUAmount const &lpt, std::optional< AccountID > const &account=std::nullopt) const
Verify the AMM balances.
Definition: AMM.cpp:191
ripple::tfOneAssetWithdrawAll
constexpr std::uint32_t tfOneAssetWithdrawAll
Definition: TxFlags.h:169
ripple::base_uint< 160, detail::AccountIDTag >
ripple::tfWithdrawAll
constexpr std::uint32_t tfWithdrawAll
Definition: TxFlags.h:168
ripple::test::jtx::AMM::expectLPTokens
bool expectLPTokens(AccountID const &account, IOUAmount const &tokens) const
Definition: AMM.cpp:222
ripple::test::jtx::AMM::initialLPTokens_
const IOUAmount initialLPTokens_
Definition: AMM.h:68
ripple::test::jtx::AMM::expectAmmRpcInfo
bool expectAmmRpcInfo(STAmount const &asset1, STAmount const &asset2, IOUAmount const &balance, std::optional< AccountID > const &account=std::nullopt, std::optional< std::string > const &ledger_index=std::nullopt) const
Definition: AMM.cpp:288
std::ostream
STL class.
ripple::test::jtx::AMM::lastPurchasePrice_
IOUAmount lastPurchasePrice_
Definition: AMM.h:71
ripple::test::jtx::AMM::log
void log(bool log)
Definition: AMM.h:319
ripple::test::jtx::AMM::operator[]
std::string operator[](AccountID const &lp)
Definition: AMM.h:278
ripple::test::jtx::AMM::log_
bool log_
Definition: AMM.h:69
ripple::test::jtx::AMM::env_
Env & env_
Definition: AMM.h:64
ripple::test::jtx::AMM::lptIssue_
const Issue lptIssue_
Definition: AMM.h:79
ripple::test::jtx::AMM::bidMax_
std::optional< IOUAmount > bidMax_
Definition: AMM.h:73
ripple::STAmount
Definition: STAmount.h:45
ripple::test::jtx::amm::trust
Json::Value trust(AccountID const &account, STAmount const &amount, std::uint32_t flags=0)
Definition: AMM.cpp:702
ripple::test::jtx::AMM::AMM
AMM(Env &env, Account const &account, STAmount const &asset1, STAmount const &asset2, bool log=false, std::uint16_t tfee=0, std::uint32_t fee=0, std::optional< std::uint32_t > flags=std::nullopt, std::optional< jtx::seq > seq=std::nullopt, std::optional< jtx::msig > ms=std::nullopt, std::optional< ter > const &ter=std::nullopt)
Definition: AMM.cpp:49
std::uint64_t
ripple::test::jtx::AMM::expectTradingFee
bool expectTradingFee(std::uint16_t fee) const
Definition: AMM.cpp:272
ripple::test::jtx::fee
Set the fee on a JTx.
Definition: fee.h:35
ripple::test::jtx::AMM::withdrawAll
IOUAmount withdrawAll(std::optional< Account > const &account, std::optional< STAmount > const &asset1OutDetails=std::nullopt)
Definition: AMM.h:194
ripple::test::jtx::AMM::asset1_
const STAmount asset1_
Definition: AMM.h:66
ripple::test::jtx::AMM::withdraw
IOUAmount withdraw(std::optional< Account > const &account, std::optional< LPToken > const &tokens, std::optional< STAmount > const &asset1OutDetails=std::nullopt, std::optional< std::uint32_t > const &flags=std::nullopt, std::optional< ter > const &ter=std::nullopt)
Definition: AMM.cpp:474
ripple::test::jtx::seq
Set the sequence number on a JTx.
Definition: seq.h:33
ripple::test::jtx::AMM::ammExists
bool ammExists() const
Definition: AMM.cpp:280
ripple::test::jtx::LPToken::LPToken
LPToken(IOUAmount tokens)
Definition: AMM.h:45
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::test::jtx::AMM::asset2_
const STAmount asset2_
Definition: AMM.h:67
ripple::test::jtx::AMM::setTokens
void setTokens(Json::Value &jv, std::optional< std::pair< Issue, Issue >> const &assets=std::nullopt)
Definition: AMM.cpp:329
ripple::test::jtx::flags
Match set account flags.
Definition: flags.h:111
ripple::test::jtx::AMM::ammAccount_
const AccountID ammAccount_
Definition: AMM.h:78
ripple::test::jtx::AMM::tokens
IOUAmount tokens() const
Definition: AMM.h:260
ripple::test::jtx::AMM::expectAuctionSlot
bool expectAuctionSlot(std::uint32_t fee, std::optional< std::uint8_t > timeSlot, IOUAmount expectedPrice) const
Definition: AMM.cpp:235
std::optional
ripple::test::jtx::AMM::create
AccountID create(std::uint32_t tfee=0, std::optional< std::uint32_t > const &flags=std::nullopt, std::optional< jtx::seq > const &seq=std::nullopt, std::optional< ter > const &ter=std::nullopt)
Definition: AMM.cpp:102
ripple::test::jtx::Account
Immutable cryptographic account descriptor.
Definition: Account.h:37
ripple::test::jtx::AMM::submit
void submit(Json::Value const &jv, std::optional< jtx::seq > const &seq, std::optional< ter > const &ter)
Definition: AMM.cpp:648
ripple::test::jtx::LPToken::tokens
STAmount tokens(Issue const &ammIssue) const
Definition: AMM.h:54
ripple::test::jtx::LPToken
Definition: AMM.h:37
ripple::test::jtx::AMM::fee_
const std::uint32_t fee_
Definition: AMM.h:77
ripple::test::jtx::AMM::operator<<
friend std::ostream & operator<<(std::ostream &s, AMM const &amm)
Definition: AMM.h:270
ripple::test::jtx::LPToken::tokens_
const IOUAmount tokens_
Definition: AMM.h:39
ripple::test::jtx::AMM::lptIssue
Issue lptIssue() const
Definition: AMM.h:254
ripple::test::jtx::AMM::bidMin_
std::optional< IOUAmount > bidMin_
Definition: AMM.h:72
ripple::test::jtx::Env
A transaction testing environment.
Definition: Env.h:116
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::test::jtx::AMM::balances
std::tuple< STAmount, STAmount, STAmount > balances(Issue const &issue1, Issue const &issue2, std::optional< AccountID > const &account=std::nullopt) const
Get AMM balances for the token pair.
Definition: AMM.cpp:166
ripple::test::jtx::LPToken::tokens
IOUAmount const & tokens() const
Definition: AMM.h:49
std::variant
ripple::test::jtx::AMM::getLPTokensBalance
IOUAmount getLPTokensBalance(std::optional< AccountID > const &account=std::nullopt) const
Definition: AMM.cpp:205