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<std::pair<Issue, Issue>> tokens = std::nullopt) const;
109 
112  [[nodiscard]] bool
114  STAmount const& asset1,
115  STAmount const& asset2,
116  IOUAmount const& lpt,
117  std::optional<AccountID> const& account = std::nullopt) const;
118 
122  balances(
123  Issue const& issue1,
124  Issue const& issue2,
125  std::optional<AccountID> const& account = std::nullopt) const;
126 
127  [[nodiscard]] bool
128  expectLPTokens(AccountID const& account, IOUAmount const& tokens) const;
129 
135  [[nodiscard]] bool
139  IOUAmount expectedPrice) const;
140 
141  [[nodiscard]] bool
142  expectAuctionSlot(std::vector<AccountID> const& authAccount) const;
143 
144  [[nodiscard]] bool
146 
147  [[nodiscard]] bool
149  STAmount const& asset1,
150  STAmount const& asset2,
151  IOUAmount const& balance,
152  std::optional<AccountID> const& account = std::nullopt,
153  std::optional<std::string> const& ledger_index = std::nullopt) const;
154 
155  [[nodiscard]] bool
156  ammExists() const;
157 
158  IOUAmount
159  deposit(
160  std::optional<Account> const& account,
161  LPToken tokens,
162  std::optional<STAmount> const& asset1InDetails = std::nullopt,
163  std::optional<std::uint32_t> const& flags = std::nullopt,
164  std::optional<ter> const& ter = std::nullopt);
165 
166  IOUAmount
167  deposit(
168  std::optional<Account> const& account,
169  STAmount const& asset1InDetails,
170  std::optional<STAmount> const& asset2InAmount = std::nullopt,
171  std::optional<STAmount> const& maxEP = std::nullopt,
172  std::optional<std::uint32_t> const& flags = std::nullopt,
173  std::optional<ter> const& ter = std::nullopt);
174 
175  IOUAmount
176  deposit(
177  std::optional<Account> const& account,
179  std::optional<STAmount> const& asset1In,
180  std::optional<STAmount> const& asset2In,
181  std::optional<STAmount> const& maxEP,
183  std::optional<std::pair<Issue, Issue>> const& assets,
185  std::optional<std::uint16_t> const& tfee = std::nullopt,
186  std::optional<ter> const& ter = std::nullopt);
187 
188  IOUAmount
189  withdraw(
190  std::optional<Account> const& account,
192  std::optional<STAmount> const& asset1OutDetails = std::nullopt,
193  std::optional<std::uint32_t> const& flags = std::nullopt,
194  std::optional<ter> const& ter = std::nullopt);
195 
196  IOUAmount
198  std::optional<Account> const& account,
199  std::optional<STAmount> const& asset1OutDetails = std::nullopt)
200  {
201  return withdraw(
202  account,
203  std::nullopt,
204  asset1OutDetails,
205  asset1OutDetails ? tfOneAssetWithdrawAll : tfWithdrawAll,
206  std::nullopt);
207  }
208 
209  IOUAmount
210  withdraw(
211  std::optional<Account> const& account,
212  STAmount const& asset1Out,
213  std::optional<STAmount> const& asset2Out = std::nullopt,
214  std::optional<IOUAmount> const& maxEP = std::nullopt,
215  std::optional<ter> const& ter = std::nullopt);
216 
217  IOUAmount
218  withdraw(
219  std::optional<Account> const& account,
221  std::optional<STAmount> const& asset1Out,
222  std::optional<STAmount> const& asset2Out,
223  std::optional<IOUAmount> const& maxEP,
225  std::optional<std::pair<Issue, Issue>> const& assets,
227  std::optional<ter> const& ter = std::nullopt);
228 
229  void
230  vote(
231  std::optional<Account> const& account,
232  std::uint32_t feeVal,
233  std::optional<std::uint32_t> const& flags = std::nullopt,
234  std::optional<jtx::seq> const& seq = std::nullopt,
235  std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
236  std::optional<ter> const& ter = std::nullopt);
237 
238  void
239  bid(std::optional<Account> const& account,
241  std::nullopt,
243  std::nullopt,
244  std::vector<Account> const& authAccounts = {},
245  std::optional<std::uint32_t> const& flags = std::nullopt,
246  std::optional<jtx::seq> const& seq = std::nullopt,
247  std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
248  std::optional<ter> const& ter = std::nullopt);
249 
250  AccountID const&
251  ammAccount() const
252  {
253  return ammAccount_;
254  }
255 
256  Issue
257  lptIssue() const
258  {
259  return lptIssue_;
260  }
261 
262  IOUAmount
263  tokens() const
264  {
265  return initialLPTokens_;
266  }
267 
268  IOUAmount
270  std::optional<AccountID> const& account = std::nullopt) const;
271 
272  friend std::ostream&
273  operator<<(std::ostream& s, AMM const& amm)
274  {
275  if (auto const res = amm.ammRpcInfo())
276  s << res.toStyledString();
277  return s;
278  }
279 
282  {
283  return ammRpcInfo(lp).toStyledString();
284  }
285 
288  {
289  return ammRpcInfo(lp);
290  }
291 
292  void
293  ammDelete(
294  AccountID const& deleter,
295  std::optional<ter> const& ter = std::nullopt);
296 
297  void
298  setClose(bool close)
299  {
300  doClose_ = close;
301  }
302 
303  uint256
304  ammID() const
305  {
306  return ammID_;
307  }
308 
309 private:
310  void
311  setTokens(
312  Json::Value& jv,
313  std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt);
314 
315  AccountID
316  create(
317  std::uint32_t tfee = 0,
318  std::optional<std::uint32_t> const& flags = std::nullopt,
319  std::optional<jtx::seq> const& seq = std::nullopt,
320  std::optional<ter> const& ter = std::nullopt);
321 
322  IOUAmount
323  deposit(
324  std::optional<Account> const& account,
325  Json::Value& jv,
326  std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
327  std::optional<jtx::seq> const& seq = std::nullopt,
328  std::optional<ter> const& ter = std::nullopt);
329 
330  IOUAmount
331  withdraw(
332  std::optional<Account> const& account,
333  Json::Value& jv,
335  std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
336  std::optional<ter> const& ter = std::nullopt);
337 
338  void
339  log(bool log)
340  {
341  log_ = log;
342  }
343 
344  [[nodiscard]] bool
346  STAmount const& asset1,
347  STAmount const& asset2,
348  IOUAmount const& balance,
349  Json::Value const& jv) const;
350 
351  void
352  submit(
353  Json::Value const& jv,
355  std::optional<ter> const& ter);
356 
357  [[nodiscard]] bool
358  expectAuctionSlot(auto&& cb) const;
359 };
360 
361 namespace amm {
363 trust(
364  AccountID const& account,
365  STAmount const& amount,
366  std::uint32_t flags = 0);
368 pay(Account const& account, AccountID const& to, STAmount const& amount);
369 } // namespace amm
370 
371 } // namespace jtx
372 } // namespace test
373 } // namespace ripple
374 
375 #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:709
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:251
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:298
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:136
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:287
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:566
ripple::test::jtx::amm::pay
Json::Value pay(Account const &account, AccountID const &to, STAmount const &amount)
Definition: AMM.cpp:734
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:371
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:587
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:302
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:193
ripple::tfOneAssetWithdrawAll
constexpr std::uint32_t tfOneAssetWithdrawAll
Definition: TxFlags.h:169
ripple::base_uint< 256 >
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:224
ripple::test::jtx::AMM::initialLPTokens_
const IOUAmount initialLPTokens_
Definition: AMM.h:69
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:290
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:339
ripple::test::jtx::AMM::operator[]
std::string operator[](AccountID const &lp)
Definition: AMM.h:281
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:45
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:722
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:274
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:197
ripple::test::jtx::AMM::asset1_
const STAmount asset1_
Definition: AMM.h:66
ripple::test::jtx::AMM::ammID
uint256 ammID() const
Definition: AMM.h:304
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:481
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:282
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:331
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:263
ripple::test::jtx::AMM::expectAuctionSlot
bool expectAuctionSlot(std::uint32_t fee, std::optional< std::uint8_t > timeSlot, IOUAmount expectedPrice) const
Definition: AMM.cpp:237
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:655
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:273
ripple::test::jtx::LPToken::tokens_
const IOUAmount tokens_
Definition: AMM.h:39
ripple::test::jtx::AMM::lptIssue
Issue lptIssue() const
Definition: AMM.h:257
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:168
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:207