rippled
Loading...
Searching...
No Matches
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 <test/jtx/Account.h>
24#include <test/jtx/Env.h>
25#include <test/jtx/multisign.h>
26#include <test/jtx/seq.h>
27#include <test/jtx/ter.h>
28#include <xrpld/rpc/GRPCHandlers.h>
29#include <xrpl/json/json_value.h>
30#include <xrpl/protocol/STAmount.h>
31#include <xrpl/protocol/TxFlags.h>
32
33namespace ripple {
34namespace test {
35namespace jtx {
36
38{
40
41public:
43 {
44 }
46 {
47 }
48 IOUAmount const&
49 tokens() const
50 {
51 return tokens_;
52 }
54 tokens(Issue const& ammIssue) const
55 {
56 return STAmount{tokens_, ammIssue};
57 }
58};
59
61{
62 bool log = false;
68 std::optional<ter> err = std::nullopt;
69 bool close = true;
70};
71
73{
83 std::optional<ter> err = std::nullopt;
84};
85
87{
96 std::optional<ter> err = std::nullopt;
97};
98
99struct VoteArg
100{
106 std::optional<ter> err = std::nullopt;
107};
108
109struct BidArg
110{
117};
118
121class AMM
122{
129 bool log_;
131 // Predict next purchase price
135 // Multi-signature
137 // Transaction fee
141
142public:
143 AMM(Env& env,
144 Account const& account,
145 STAmount const& asset1,
146 STAmount const& asset2,
147 bool log = false,
148 std::uint16_t tfee = 0,
149 std::uint32_t fee = 0,
150 std::optional<std::uint32_t> flags = std::nullopt,
151 std::optional<jtx::seq> seq = std::nullopt,
152 std::optional<jtx::msig> ms = std::nullopt,
153 std::optional<ter> const& ter = std::nullopt,
154 bool close = true);
155 AMM(Env& env,
156 Account const& account,
157 STAmount const& asset1,
158 STAmount const& asset2,
159 ter const& ter,
160 bool log = false,
161 bool close = true);
162 AMM(Env& env,
163 Account const& account,
164 STAmount const& asset1,
165 STAmount const& asset2,
166 CreateArg const& arg);
167
172 std::optional<AccountID> const& account = std::nullopt,
173 std::optional<std::string> const& ledgerIndex = std::nullopt,
174 std::optional<Issue> issue1 = std::nullopt,
175 std::optional<Issue> issue2 = std::nullopt,
176 std::optional<AccountID> const& ammAccount = std::nullopt,
177 bool ignoreParams = false,
178 unsigned apiVersion = RPC::apiInvalidVersion) const;
179
182 [[nodiscard]] bool
184 STAmount const& asset1,
185 STAmount const& asset2,
186 IOUAmount const& lpt,
187 std::optional<AccountID> const& account = std::nullopt) const;
188
192 balances(
193 Issue const& issue1,
194 Issue const& issue2,
195 std::optional<AccountID> const& account = std::nullopt) const;
196
197 [[nodiscard]] bool
198 expectLPTokens(AccountID const& account, IOUAmount const& tokens) const;
199
205 [[nodiscard]] bool
209 IOUAmount expectedPrice) const;
210
211 [[nodiscard]] bool
212 expectAuctionSlot(std::vector<AccountID> const& authAccount) const;
213
214 [[nodiscard]] bool
216
217 [[nodiscard]] bool
219 STAmount const& asset1,
220 STAmount const& asset2,
221 IOUAmount const& balance,
222 std::optional<AccountID> const& account = std::nullopt,
223 std::optional<std::string> const& ledger_index = std::nullopt,
224 std::optional<AccountID> const& ammAccount = std::nullopt) const;
225
226 [[nodiscard]] bool
227 ammExists() const;
228
230 deposit(
231 std::optional<Account> const& account,
233 std::optional<STAmount> const& asset1InDetails = std::nullopt,
234 std::optional<std::uint32_t> const& flags = std::nullopt,
235 std::optional<ter> const& ter = std::nullopt);
236
238 deposit(
239 std::optional<Account> const& account,
240 STAmount const& asset1InDetails,
241 std::optional<STAmount> const& asset2InAmount = std::nullopt,
242 std::optional<STAmount> const& maxEP = std::nullopt,
243 std::optional<std::uint32_t> const& flags = std::nullopt,
244 std::optional<ter> const& ter = std::nullopt);
245
247 deposit(
248 std::optional<Account> const& account,
250 std::optional<STAmount> const& asset1In,
251 std::optional<STAmount> const& asset2In,
252 std::optional<STAmount> const& maxEP,
256 std::optional<std::uint16_t> const& tfee = std::nullopt,
257 std::optional<ter> const& ter = std::nullopt);
258
260 deposit(DepositArg const& arg);
261
263 withdraw(
264 std::optional<Account> const& account,
266 std::optional<STAmount> const& asset1OutDetails = std::nullopt,
267 std::optional<std::uint32_t> const& flags = std::nullopt,
268 std::optional<ter> const& ter = std::nullopt);
269
272 std::optional<Account> const& account,
273 std::optional<STAmount> const& asset1OutDetails = std::nullopt,
274 std::optional<ter> const& ter = std::nullopt)
275 {
276 return withdraw(
277 account,
278 std::nullopt,
279 asset1OutDetails,
280 asset1OutDetails ? tfOneAssetWithdrawAll : tfWithdrawAll,
281 ter);
282 }
283
285 withdraw(
286 std::optional<Account> const& account,
287 STAmount const& asset1Out,
288 std::optional<STAmount> const& asset2Out = std::nullopt,
289 std::optional<IOUAmount> const& maxEP = std::nullopt,
290 std::optional<ter> const& ter = std::nullopt);
291
293 withdraw(
294 std::optional<Account> const& account,
296 std::optional<STAmount> const& asset1Out,
297 std::optional<STAmount> const& asset2Out,
298 std::optional<IOUAmount> const& maxEP,
302 std::optional<ter> const& ter = std::nullopt);
303
305 withdraw(WithdrawArg const& arg);
306
307 void
308 vote(
309 std::optional<Account> const& account,
310 std::uint32_t feeVal,
311 std::optional<std::uint32_t> const& flags = std::nullopt,
312 std::optional<jtx::seq> const& seq = std::nullopt,
313 std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
314 std::optional<ter> const& ter = std::nullopt);
315
316 void
317 vote(VoteArg const& arg);
318
320 bid(BidArg const& arg);
321
322 AccountID const&
324 {
325 return ammAccount_;
326 }
327
328 Issue
329 lptIssue() const
330 {
331 return lptIssue_;
332 }
333
335 tokens() const
336 {
337 return initialLPTokens_;
338 }
339
342 std::optional<AccountID> const& account = std::nullopt) const;
343
345 operator<<(std::ostream& s, AMM const& amm)
346 {
347 if (auto const res = amm.ammRpcInfo())
348 s << res.toStyledString();
349 return s;
350 }
351
354 {
355 return ammRpcInfo(lp).toStyledString();
356 }
357
360 {
361 return ammRpcInfo(lp);
362 }
363
364 void
365 ammDelete(
366 AccountID const& deleter,
367 std::optional<ter> const& ter = std::nullopt);
368
369 void
370 setClose(bool close)
371 {
372 doClose_ = close;
373 }
374
375 uint256
376 ammID() const
377 {
378 return ammID_;
379 }
380
381 void
382 setTokens(
383 Json::Value& jv,
384 std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt);
385
386private:
388 create(
389 std::uint32_t tfee = 0,
390 std::optional<std::uint32_t> const& flags = std::nullopt,
391 std::optional<jtx::seq> const& seq = std::nullopt,
392 std::optional<ter> const& ter = std::nullopt);
393
395 deposit(
396 std::optional<Account> const& account,
397 Json::Value& jv,
398 std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
399 std::optional<jtx::seq> const& seq = std::nullopt,
400 std::optional<ter> const& ter = std::nullopt);
401
403 withdraw(
404 std::optional<Account> const& account,
405 Json::Value& jv,
407 std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
408 std::optional<ter> const& ter = std::nullopt);
409
410 void
411 log(bool log)
412 {
413 log_ = log;
414 }
415
416 [[nodiscard]] bool
418 STAmount const& asset1,
419 STAmount const& asset2,
420 IOUAmount const& balance,
421 Json::Value const& jv) const;
422
423 void
424 submit(
425 Json::Value const& jv,
427 std::optional<ter> const& ter);
428
429 [[nodiscard]] bool
430 expectAuctionSlot(auto&& cb) const;
431};
432
433namespace amm {
435trust(
436 AccountID const& account,
437 STAmount const& amount,
438 std::uint32_t flags = 0);
440pay(Account const& account, AccountID const& to, STAmount const& amount);
441
444 Account const& issuer,
445 Account const& holder,
446 Issue const& asset,
447 Issue const& asset2,
448 std::optional<STAmount> const& amount);
449} // namespace amm
450
451} // namespace jtx
452} // namespace test
453} // namespace ripple
454
455#endif // RIPPLE_TEST_JTX_AMM_H_INCLUDED
Represents a JSON value.
Definition: json_value.h:148
std::string toStyledString() const
Floating point representation of amounts with high dynamic range.
Definition: IOUAmount.h:47
A currency issued by an account.
Definition: Issue.h:36
Convenience class to test AMM functionality.
Definition: AMM.h:122
std::optional< IOUAmount > bidMin_
Definition: AMM.h:133
Issue const lptIssue_
Definition: AMM.h:140
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, unsigned apiVersion=RPC::apiInvalidVersion) const
Send amm_info RPC command.
Definition: AMM.cpp:159
void submit(Json::Value const &jv, std::optional< jtx::seq > const &seq, std::optional< ter > const &ter)
Definition: AMM.cpp:726
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:635
friend std::ostream & operator<<(std::ostream &s, AMM const &amm)
Definition: AMM.h:345
std::uint32_t const fee_
Definition: AMM.h:138
uint256 const ammID_
Definition: AMM.h:127
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:127
bool expectAuctionSlot(std::uint32_t fee, std::optional< std::uint8_t > timeSlot, IOUAmount expectedPrice) const
Definition: AMM.cpp:273
STAmount const asset2_
Definition: AMM.h:126
std::string operator[](AccountID const &lp)
Definition: AMM.h:353
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:205
STAmount const asset1_
Definition: AMM.h:125
void ammDelete(AccountID const &deleter, std::optional< ter > const &ter=std::nullopt)
Definition: AMM.cpp:790
void log(bool log)
Definition: AMM.h:411
IOUAmount tokens() const
Definition: AMM.h:335
bool expectAmmInfo(STAmount const &asset1, STAmount const &asset2, IOUAmount const &balance, Json::Value const &jv) const
Definition: AMM.cpp:340
void setClose(bool close)
Definition: AMM.h:370
IOUAmount lastPurchasePrice_
Definition: AMM.h:132
AccountID const & ammAccount() const
Definition: AMM.h:323
AccountID const ammAccount_
Definition: AMM.h:139
bool expectTradingFee(std::uint16_t fee) const
Definition: AMM.cpp:310
Json::Value operator()(AccountID const &lp)
Definition: AMM.h:359
std::optional< msig > const msig_
Definition: AMM.h:136
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:535
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:230
Issue lptIssue() const
Definition: AMM.h:329
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:409
Account const creatorAccount_
Definition: AMM.h:124
std::optional< IOUAmount > bidMax_
Definition: AMM.h:134
IOUAmount const initialLPTokens_
Definition: AMM.h:128
IOUAmount getLPTokensBalance(std::optional< AccountID > const &account=std::nullopt) const
Definition: AMM.cpp:243
Json::Value bid(BidArg const &arg)
Definition: AMM.cpp:662
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:326
void setTokens(Json::Value &jv, std::optional< std::pair< Issue, Issue > > const &assets=std::nullopt)
Definition: AMM.cpp:369
bool ammExists() const
Definition: AMM.cpp:318
IOUAmount withdrawAll(std::optional< Account > const &account, std::optional< STAmount > const &asset1OutDetails=std::nullopt, std::optional< ter > const &ter=std::nullopt)
Definition: AMM.h:271
uint256 ammID() const
Definition: AMM.h:376
bool expectLPTokens(AccountID const &account, IOUAmount const &tokens) const
Definition: AMM.cpp:260
Immutable cryptographic account descriptor.
Definition: Account.h:39
A transaction testing environment.
Definition: Env.h:118
LPToken(std::uint64_t tokens)
Definition: AMM.h:42
IOUAmount const tokens_
Definition: AMM.h:39
STAmount tokens(Issue const &ammIssue) const
Definition: AMM.h:54
IOUAmount const & tokens() const
Definition: AMM.h:49
LPToken(IOUAmount tokens)
Definition: AMM.h:45
A balance matches.
Definition: balance.h:39
Set the fee on a JTx.
Definition: fee.h:36
Match set account flags.
Definition: flags.h:112
Set the expected result code for a JTx The test will fail if the code doesn't match.
Definition: ter.h:35
static constexpr auto apiInvalidVersion
Definition: ApiVersion.h:56
Json::Value trust(AccountID const &account, STAmount const &amount, std::uint32_t flags=0)
Definition: AMM.cpp:803
Json::Value ammClawback(Account const &issuer, Account const &holder, Issue const &asset, Issue const &asset2, std::optional< STAmount > const &amount)
Definition: AMM.cpp:827
Json::Value pay(Account const &account, AccountID const &to, STAmount const &amount)
Definition: AMM.cpp:815
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
constexpr std::uint32_t tfOneAssetWithdrawAll
Definition: TxFlags.h:205
constexpr std::uint32_t tfWithdrawAll
Definition: TxFlags.h:204
std::vector< Account > authAccounts
Definition: AMM.h:114
std::optional< std::variant< int, IOUAmount, STAmount > > bidMin
Definition: AMM.h:112
std::optional< std::variant< int, IOUAmount, STAmount > > bidMax
Definition: AMM.h:113
std::optional< Account > account
Definition: AMM.h:111
std::optional< std::pair< Issue, Issue > > assets
Definition: AMM.h:116
std::optional< ter > err
Definition: AMM.h:68
std::uint16_t tfee
Definition: AMM.h:63
std::optional< jtx::msig > ms
Definition: AMM.h:67
std::optional< Account > account
Definition: AMM.h:74
std::optional< STAmount > asset1In
Definition: AMM.h:76
std::optional< std::pair< Issue, Issue > > assets
Definition: AMM.h:80
std::optional< ter > err
Definition: AMM.h:83
std::optional< STAmount > maxEP
Definition: AMM.h:78
std::optional< STAmount > asset2In
Definition: AMM.h:77
std::optional< std::uint16_t > tfee
Definition: AMM.h:82
std::optional< LPToken > tokens
Definition: AMM.h:75
std::optional< ter > err
Definition: AMM.h:106
std::optional< Account > account
Definition: AMM.h:101
std::uint32_t tfee
Definition: AMM.h:102
std::optional< std::pair< Issue, Issue > > assets
Definition: AMM.h:105
std::optional< STAmount > asset2Out
Definition: AMM.h:91
std::optional< IOUAmount > maxEP
Definition: AMM.h:92
std::optional< Account > account
Definition: AMM.h:88
std::optional< STAmount > asset1Out
Definition: AMM.h:90
std::optional< std::pair< Issue, Issue > > assets
Definition: AMM.h:94
std::optional< LPToken > tokens
Definition: AMM.h:89
std::optional< ter > err
Definition: AMM.h:96
Set the sequence number on a JTx.
Definition: seq.h:34