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 {
68  uint256 const ammID_;
70  bool log_;
71  bool doClose_;
72  // Predict next purchase price
76  // Multi-signature
78  // Transaction fee
82 
83 public:
84  AMM(Env& env,
85  Account const& account,
86  STAmount const& asset1,
87  STAmount const& asset2,
88  bool log = false,
89  std::uint16_t tfee = 0,
90  std::uint32_t fee = 0,
91  std::optional<std::uint32_t> flags = std::nullopt,
92  std::optional<jtx::seq> seq = std::nullopt,
93  std::optional<jtx::msig> ms = std::nullopt,
94  std::optional<ter> const& ter = std::nullopt);
95  AMM(Env& env,
96  Account const& account,
97  STAmount const& asset1,
98  STAmount const& asset2,
99  ter const& ter,
100  bool log = false);
101 
105  ammRpcInfo(
106  std::optional<AccountID> const& account = std::nullopt,
107  std::optional<std::string> const& ledgerIndex = std::nullopt,
108  std::optional<Issue> issue1 = std::nullopt,
109  std::optional<Issue> issue2 = std::nullopt,
110  std::optional<AccountID> const& ammAccount = std::nullopt,
111  bool ignoreParams = false) const;
112 
115  [[nodiscard]] bool
117  STAmount const& asset1,
118  STAmount const& asset2,
119  IOUAmount const& lpt,
120  std::optional<AccountID> const& account = std::nullopt) const;
121 
125  balances(
126  Issue const& issue1,
127  Issue const& issue2,
128  std::optional<AccountID> const& account = std::nullopt) const;
129 
130  [[nodiscard]] bool
131  expectLPTokens(AccountID const& account, IOUAmount const& tokens) const;
132 
138  [[nodiscard]] bool
142  IOUAmount expectedPrice) const;
143 
144  [[nodiscard]] bool
145  expectAuctionSlot(std::vector<AccountID> const& authAccount) const;
146 
147  [[nodiscard]] bool
149 
150  [[nodiscard]] bool
152  STAmount const& asset1,
153  STAmount const& asset2,
154  IOUAmount const& balance,
155  std::optional<AccountID> const& account = std::nullopt,
156  std::optional<std::string> const& ledger_index = std::nullopt,
157  std::optional<AccountID> const& ammAccount = std::nullopt) const;
158 
159  [[nodiscard]] bool
160  ammExists() const;
161 
162  IOUAmount
163  deposit(
164  std::optional<Account> const& account,
165  LPToken tokens,
166  std::optional<STAmount> const& asset1InDetails = std::nullopt,
167  std::optional<std::uint32_t> const& flags = std::nullopt,
168  std::optional<ter> const& ter = std::nullopt);
169 
170  IOUAmount
171  deposit(
172  std::optional<Account> const& account,
173  STAmount const& asset1InDetails,
174  std::optional<STAmount> const& asset2InAmount = std::nullopt,
175  std::optional<STAmount> const& maxEP = std::nullopt,
176  std::optional<std::uint32_t> const& flags = std::nullopt,
177  std::optional<ter> const& ter = std::nullopt);
178 
179  IOUAmount
180  deposit(
181  std::optional<Account> const& account,
183  std::optional<STAmount> const& asset1In,
184  std::optional<STAmount> const& asset2In,
185  std::optional<STAmount> const& maxEP,
187  std::optional<std::pair<Issue, Issue>> const& assets,
189  std::optional<std::uint16_t> const& tfee = std::nullopt,
190  std::optional<ter> const& ter = std::nullopt);
191 
192  IOUAmount
193  withdraw(
194  std::optional<Account> const& account,
196  std::optional<STAmount> const& asset1OutDetails = std::nullopt,
197  std::optional<std::uint32_t> const& flags = std::nullopt,
198  std::optional<ter> const& ter = std::nullopt);
199 
200  IOUAmount
202  std::optional<Account> const& account,
203  std::optional<STAmount> const& asset1OutDetails = std::nullopt)
204  {
205  return withdraw(
206  account,
207  std::nullopt,
208  asset1OutDetails,
209  asset1OutDetails ? tfOneAssetWithdrawAll : tfWithdrawAll,
210  std::nullopt);
211  }
212 
213  IOUAmount
214  withdraw(
215  std::optional<Account> const& account,
216  STAmount const& asset1Out,
217  std::optional<STAmount> const& asset2Out = std::nullopt,
218  std::optional<IOUAmount> const& maxEP = std::nullopt,
219  std::optional<ter> const& ter = std::nullopt);
220 
221  IOUAmount
222  withdraw(
223  std::optional<Account> const& account,
225  std::optional<STAmount> const& asset1Out,
226  std::optional<STAmount> const& asset2Out,
227  std::optional<IOUAmount> const& maxEP,
229  std::optional<std::pair<Issue, Issue>> const& assets,
231  std::optional<ter> const& ter = std::nullopt);
232 
233  void
234  vote(
235  std::optional<Account> const& account,
236  std::uint32_t feeVal,
237  std::optional<std::uint32_t> const& flags = std::nullopt,
238  std::optional<jtx::seq> const& seq = std::nullopt,
239  std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
240  std::optional<ter> const& ter = std::nullopt);
241 
242  void
243  bid(std::optional<Account> const& account,
245  std::nullopt,
247  std::nullopt,
248  std::vector<Account> const& authAccounts = {},
249  std::optional<std::uint32_t> const& flags = std::nullopt,
250  std::optional<jtx::seq> const& seq = std::nullopt,
251  std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
252  std::optional<ter> const& ter = std::nullopt);
253 
254  AccountID const&
255  ammAccount() const
256  {
257  return ammAccount_;
258  }
259 
260  Issue
261  lptIssue() const
262  {
263  return lptIssue_;
264  }
265 
266  IOUAmount
267  tokens() const
268  {
269  return initialLPTokens_;
270  }
271 
272  IOUAmount
274  std::optional<AccountID> const& account = std::nullopt) const;
275 
276  friend std::ostream&
277  operator<<(std::ostream& s, AMM const& amm)
278  {
279  if (auto const res = amm.ammRpcInfo())
280  s << res.toStyledString();
281  return s;
282  }
283 
286  {
287  return ammRpcInfo(lp).toStyledString();
288  }
289 
292  {
293  return ammRpcInfo(lp);
294  }
295 
296  void
297  ammDelete(
298  AccountID const& deleter,
299  std::optional<ter> const& ter = std::nullopt);
300 
301  void
302  setClose(bool close)
303  {
304  doClose_ = close;
305  }
306 
307  uint256
308  ammID() const
309  {
310  return ammID_;
311  }
312 
313 private:
314  void
315  setTokens(
316  Json::Value& jv,
317  std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt);
318 
319  AccountID
320  create(
321  std::uint32_t tfee = 0,
322  std::optional<std::uint32_t> const& flags = std::nullopt,
323  std::optional<jtx::seq> const& seq = std::nullopt,
324  std::optional<ter> const& ter = std::nullopt);
325 
326  IOUAmount
327  deposit(
328  std::optional<Account> const& account,
329  Json::Value& jv,
330  std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
331  std::optional<jtx::seq> const& seq = std::nullopt,
332  std::optional<ter> const& ter = std::nullopt);
333 
334  IOUAmount
335  withdraw(
336  std::optional<Account> const& account,
337  Json::Value& jv,
339  std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
340  std::optional<ter> const& ter = std::nullopt);
341 
342  void
343  log(bool log)
344  {
345  log_ = log;
346  }
347 
348  [[nodiscard]] bool
350  STAmount const& asset1,
351  STAmount const& asset2,
352  IOUAmount const& balance,
353  Json::Value const& jv) const;
354 
355  void
356  submit(
357  Json::Value const& jv,
359  std::optional<ter> const& ter);
360 
361  [[nodiscard]] bool
362  expectAuctionSlot(auto&& cb) const;
363 };
364 
365 namespace amm {
367 trust(
368  AccountID const& account,
369  STAmount const& amount,
370  std::uint32_t flags = 0);
372 pay(Account const& account, AccountID const& to, STAmount const& amount);
373 } // namespace amm
374 
375 } // namespace jtx
376 } // namespace test
377 } // namespace ripple
378 
379 #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::ammDelete
void ammDelete(AccountID const &deleter, std::optional< ter > const &ter=std::nullopt)
Definition: AMM.cpp:721
ripple::test::jtx::AMM::msig_
const std::optional< msig > msig_
Definition: AMM.h:77
ripple::test::jtx::AMM::ammAccount
AccountID const & ammAccount() const
Definition: AMM.h:255
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
ripple::test::jtx::AMM::setClose
void setClose(bool close)
Definition: AMM.h:302
std::pair
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:291
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:578
ripple::test::jtx::amm::pay
Json::Value pay(Account const &account, AccountID const &to, STAmount const &amount)
Definition: AMM.cpp:746
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:383
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:599
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:314
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:203
ripple::tfOneAssetWithdrawAll
constexpr std::uint32_t tfOneAssetWithdrawAll
Definition: TxFlags.h:169
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< Issue > issue1=std::nullopt, std::optional< Issue > issue2=std::nullopt, std::optional< AccountID > const &ammAccount=std::nullopt, bool ignoreParams=false) const
Send amm_info RPC command.
Definition: AMM.cpp:136
ripple::base_uint< 256 >
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, std::optional< AccountID > const &ammAccount=std::nullopt) const
Definition: AMM.cpp:300
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:234
ripple::test::jtx::AMM::initialLPTokens_
const IOUAmount initialLPTokens_
Definition: AMM.h:69
std::ostream
STL class.
ripple::test::jtx::AMM::lastPurchasePrice_
IOUAmount lastPurchasePrice_
Definition: AMM.h:73
ripple::test::jtx::AMM::log
void log(bool log)
Definition: AMM.h:343
ripple::test::jtx::AMM::operator[]
std::string operator[](AccountID const &lp)
Definition: AMM.h:285
ripple::test::jtx::AMM::log_
bool log_
Definition: AMM.h:70
ripple::test::jtx::AMM::env_
Env & env_
Definition: AMM.h:64
ripple::test::jtx::AMM::lptIssue_
const Issue lptIssue_
Definition: AMM.h:81
ripple::test::jtx::AMM::bidMax_
std::optional< IOUAmount > bidMax_
Definition: AMM.h:75
ripple::STAmount
Definition: STAmount.h:46
ripple::test::jtx::AMM::ammID_
const uint256 ammID_
Definition: AMM.h:68
ripple::test::jtx::amm::trust
Json::Value trust(AccountID const &account, STAmount const &amount, std::uint32_t flags=0)
Definition: AMM.cpp:734
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:284
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:201
ripple::test::jtx::AMM::asset1_
const STAmount asset1_
Definition: AMM.h:66
ripple::test::jtx::AMM::ammID
uint256 ammID() const
Definition: AMM.h:308
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:493
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:292
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:343
ripple::test::jtx::flags
Match set account flags.
Definition: flags.h:111
ripple::test::jtx::AMM::ammAccount_
const AccountID ammAccount_
Definition: AMM.h:80
ripple::test::jtx::AMM::tokens
IOUAmount tokens() const
Definition: AMM.h:267
ripple::test::jtx::AMM::expectAuctionSlot
bool expectAuctionSlot(std::uint32_t fee, std::optional< std::uint8_t > timeSlot, IOUAmount expectedPrice) const
Definition: AMM.cpp:247
ripple::test::jtx::AMM::doClose_
bool doClose_
Definition: AMM.h:71
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:104
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:667
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:79
ripple::test::jtx::AMM::operator<<
friend std::ostream & operator<<(std::ostream &s, AMM const &amm)
Definition: AMM.h:277
ripple::test::jtx::LPToken::tokens_
const IOUAmount tokens_
Definition: AMM.h:39
ripple::test::jtx::AMM::lptIssue
Issue lptIssue() const
Definition: AMM.h:261
ripple::test::jtx::AMM::bidMin_
std::optional< IOUAmount > bidMin_
Definition: AMM.h:74
ripple::test::jtx::Env
A transaction testing environment.
Definition: Env.h:117
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:178
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:217