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
29#include <xrpld/rpc/GRPCHandlers.h>
30
31#include <xrpl/json/json_value.h>
32#include <xrpl/protocol/STAmount.h>
33#include <xrpl/protocol/TxFlags.h>
34
35namespace ripple {
36namespace test {
37namespace jtx {
38
40{
42
43public:
50 IOUAmount const&
51 tokens() const
52 {
53 return tokens_;
54 }
56 tokens(Issue const& ammIssue) const
57 {
58 return STAmount{tokens_, ammIssue};
59 }
60};
61
73
87
100
110
120
123class AMM
124{
130 bool log_;
132 // Predict next purchase price
136 // Multi-signature
138 // Transaction fee
143
144public:
145 AMM(Env& env,
146 Account const& account,
147 STAmount const& asset1,
148 STAmount const& asset2,
149 bool log = false,
150 std::uint16_t tfee = 0,
151 std::uint32_t fee = 0,
156 bool close = true);
157 AMM(Env& env,
158 Account const& account,
159 STAmount const& asset1,
160 STAmount const& asset2,
161 ter const& ter,
162 bool log = false,
163 bool close = true);
164 AMM(Env& env,
165 Account const& account,
166 STAmount const& asset1,
167 STAmount const& asset2,
168 CreateArg const& arg);
169
174 std::optional<AccountID> const& account = std::nullopt,
175 std::optional<std::string> const& ledgerIndex = std::nullopt,
179 bool ignoreParams = false,
180 unsigned apiVersion = RPC::apiInvalidVersion) const;
181
184 [[nodiscard]] bool
186 STAmount const& asset1,
187 STAmount const& asset2,
188 IOUAmount const& lpt,
189 std::optional<AccountID> const& account = std::nullopt) const;
190
194 balances(
195 Issue const& issue1,
196 Issue const& issue2,
197 std::optional<AccountID> const& account = std::nullopt) const;
198
201 {
202 return balances(asset1_.get<Issue>(), asset2_.get<Issue>(), account);
203 }
204
205 [[nodiscard]] bool
206 expectLPTokens(AccountID const& account, IOUAmount const& tokens) const;
207
213 [[nodiscard]] bool
217 IOUAmount expectedPrice) const;
218
219 [[nodiscard]] bool
220 expectAuctionSlot(std::vector<AccountID> const& authAccount) const;
221
222 [[nodiscard]] bool
224
225 [[nodiscard]] bool
227 STAmount const& asset1,
228 STAmount const& asset2,
229 IOUAmount const& balance,
230 std::optional<AccountID> const& account = std::nullopt,
231 std::optional<std::string> const& ledger_index = std::nullopt,
233
234 [[nodiscard]] bool
235 ammExists() const;
236
238 deposit(
239 std::optional<Account> const& account,
241 std::optional<STAmount> const& asset1InDetails = std::nullopt,
244
246 deposit(
247 std::optional<Account> const& account,
248 STAmount const& asset1InDetails,
249 std::optional<STAmount> const& asset2InAmount = std::nullopt,
253
255 deposit(
256 std::optional<Account> const& account,
258 std::optional<STAmount> const& asset1In,
259 std::optional<STAmount> const& asset2In,
260 std::optional<STAmount> const& maxEP,
266
268 deposit(DepositArg const& arg);
269
271 withdraw(
272 std::optional<Account> const& account,
274 std::optional<STAmount> const& asset1OutDetails = std::nullopt,
277
280 std::optional<Account> const& account,
281 std::optional<STAmount> const& asset1OutDetails = std::nullopt,
283 {
284 return withdraw(
285 account,
287 asset1OutDetails,
288 asset1OutDetails ? tfOneAssetWithdrawAll : tfWithdrawAll,
289 ter);
290 }
291
293 withdraw(
294 std::optional<Account> const& account,
295 STAmount const& asset1Out,
296 std::optional<STAmount> const& asset2Out = std::nullopt,
299
301 withdraw(
302 std::optional<Account> const& account,
304 std::optional<STAmount> const& asset1Out,
305 std::optional<STAmount> const& asset2Out,
306 std::optional<IOUAmount> const& maxEP,
311
313 withdraw(WithdrawArg const& arg);
314
315 void
316 vote(
317 std::optional<Account> const& account,
318 std::uint32_t feeVal,
323
324 void
325 vote(VoteArg const& arg);
326
328 bid(BidArg const& arg);
329
330 AccountID const&
332 {
333 return ammAccount_;
334 }
335
336 Issue
337 lptIssue() const
338 {
339 return lptIssue_;
340 }
341
343 tokens() const
344 {
345 return initialLPTokens_;
346 }
347
350 std::optional<AccountID> const& account = std::nullopt) const;
351
353 operator<<(std::ostream& s, AMM const& amm)
354 {
355 if (auto const res = amm.ammRpcInfo())
356 s << res.toStyledString();
357 return s;
358 }
359
362 {
363 return ammRpcInfo(lp).toStyledString();
364 }
365
368 {
369 return ammRpcInfo(lp);
370 }
371
372 void
373 ammDelete(
374 AccountID const& deleter,
376
377 void
378 setClose(bool close)
379 {
380 doClose_ = close;
381 }
382
383 uint256
384 ammID() const
385 {
386 return ammID_;
387 }
388
389 void
390 setTokens(
391 Json::Value& jv,
393
394private:
396 create(
397 std::uint32_t tfee = 0,
401
403 deposit(
404 std::optional<Account> const& account,
405 Json::Value& jv,
409
411 withdraw(
412 std::optional<Account> const& account,
413 Json::Value& jv,
417
418 void
419 log(bool log)
420 {
421 log_ = log;
422 }
423
424 [[nodiscard]] bool
426 STAmount const& asset1,
427 STAmount const& asset2,
428 IOUAmount const& balance,
429 Json::Value const& jv) const;
430
431 void
432 submit(
433 Json::Value const& jv,
435 std::optional<ter> const& ter);
436
437 [[nodiscard]] bool
438 expectAuctionSlot(auto&& cb) const;
439
442};
443
444namespace amm {
446trust(
447 AccountID const& account,
448 STAmount const& amount,
449 std::uint32_t flags = 0);
451pay(Account const& account, AccountID const& to, STAmount const& amount);
452
455 Account const& issuer,
456 Account const& holder,
457 Issue const& asset,
458 Issue const& asset2,
459 std::optional<STAmount> const& amount);
460} // namespace amm
461
462} // namespace jtx
463} // namespace test
464} // namespace ripple
465
466#endif // RIPPLE_TEST_JTX_AMM_H_INCLUDED
Represents a JSON value.
Definition json_value.h:149
std::string toStyledString() const
Floating point representation of amounts with high dynamic range.
Definition IOUAmount.h:46
A currency issued by an account.
Definition Issue.h:33
constexpr TIss const & get() const
Convenience class to test AMM functionality.
Definition AMM.h:124
std::optional< IOUAmount > bidMin_
Definition AMM.h:134
Issue const lptIssue_
Definition AMM.h:141
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:166
void submit(Json::Value const &jv, std::optional< jtx::seq > const &seq, std::optional< ter > const &ter)
Definition AMM.cpp:733
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:642
friend std::ostream & operator<<(std::ostream &s, AMM const &amm)
Definition AMM.h:353
std::uint32_t const fee_
Definition AMM.h:139
uint256 const ammID_
Definition AMM.h:129
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:134
bool expectAuctionSlot(std::uint32_t fee, std::optional< std::uint8_t > timeSlot, IOUAmount expectedPrice) const
Definition AMM.cpp:280
STAmount const asset2_
Definition AMM.h:128
std::string operator[](AccountID const &lp)
Definition AMM.h:361
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:212
STAmount const asset1_
Definition AMM.h:127
void ammDelete(AccountID const &deleter, std::optional< ter > const &ter=std::nullopt)
Definition AMM.cpp:797
void log(bool log)
Definition AMM.h:419
IOUAmount tokens() const
Definition AMM.h:343
bool expectAmmInfo(STAmount const &asset1, STAmount const &asset2, IOUAmount const &balance, Json::Value const &jv) const
Definition AMM.cpp:347
void setClose(bool close)
Definition AMM.h:378
IOUAmount lastPurchasePrice_
Definition AMM.h:133
AccountID const & ammAccount() const
Definition AMM.h:331
IOUAmount initialTokens()
Definition AMM.cpp:44
AccountID const ammAccount_
Definition AMM.h:140
bool expectTradingFee(std::uint16_t fee) const
Definition AMM.cpp:317
Json::Value operator()(AccountID const &lp)
Definition AMM.h:367
std::optional< msig > const msig_
Definition AMM.h:137
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:542
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:237
Issue lptIssue() const
Definition AMM.h:337
Account const creatorAccount_
Definition AMM.h:126
std::tuple< STAmount, STAmount, STAmount > balances(std::optional< AccountID > const &account=std::nullopt) const
Definition AMM.h:200
std::optional< IOUAmount > bidMax_
Definition AMM.h:135
IOUAmount const initialLPTokens_
Definition AMM.h:142
IOUAmount getLPTokensBalance(std::optional< AccountID > const &account=std::nullopt) const
Definition AMM.cpp:250
Json::Value bid(BidArg const &arg)
Definition AMM.cpp:669
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:333
void setTokens(Json::Value &jv, std::optional< std::pair< Issue, Issue > > const &assets=std::nullopt)
Definition AMM.cpp:376
bool ammExists() const
Definition AMM.cpp:325
IOUAmount withdrawAll(std::optional< Account > const &account, std::optional< STAmount > const &asset1OutDetails=std::nullopt, std::optional< ter > const &ter=std::nullopt)
Definition AMM.h:279
uint256 ammID() const
Definition AMM.h:384
bool expectLPTokens(AccountID const &account, IOUAmount const &tokens) const
Definition AMM.cpp:267
Immutable cryptographic account descriptor.
Definition Account.h:39
A transaction testing environment.
Definition Env.h:121
LPToken(std::uint64_t tokens)
Definition AMM.h:44
IOUAmount const tokens_
Definition AMM.h:41
STAmount tokens(Issue const &ammIssue) const
Definition AMM.h:56
IOUAmount const & tokens() const
Definition AMM.h:51
LPToken(IOUAmount tokens)
Definition AMM.h:47
A balance matches.
Definition balance.h:39
Set the fee on a JTx.
Definition fee.h:37
Match set account flags.
Definition flags.h:128
Set the expected result code for a JTx The test will fail if the code doesn't match.
Definition ter.h:35
T is_same_v
static constexpr auto apiInvalidVersion
Definition ApiVersion.h:55
Json::Value trust(AccountID const &account, STAmount const &amount, std::uint32_t flags=0)
Definition AMM.cpp:810
Json::Value ammClawback(Account const &issuer, Account const &holder, Issue const &asset, Issue const &asset2, std::optional< STAmount > const &amount)
Definition AMM.cpp:833
Json::Value pay(Account const &account, AccountID const &to, STAmount const &amount)
Definition AMM.cpp:822
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:25
constexpr std::uint32_t tfOneAssetWithdrawAll
Definition TxFlags.h:246
constexpr std::uint32_t tfWithdrawAll
Definition TxFlags.h:245
std::vector< Account > authAccounts
Definition AMM.h:116
std::optional< std::variant< int, IOUAmount, STAmount > > bidMin
Definition AMM.h:114
std::optional< std::variant< int, IOUAmount, STAmount > > bidMax
Definition AMM.h:115
std::optional< Account > account
Definition AMM.h:113
std::optional< std::pair< Issue, Issue > > assets
Definition AMM.h:118
std::optional< ter > err
Definition AMM.h:70
std::uint16_t tfee
Definition AMM.h:65
std::optional< jtx::msig > ms
Definition AMM.h:69
std::optional< Account > account
Definition AMM.h:76
std::optional< STAmount > asset1In
Definition AMM.h:78
std::optional< std::pair< Issue, Issue > > assets
Definition AMM.h:82
std::optional< ter > err
Definition AMM.h:85
std::optional< STAmount > maxEP
Definition AMM.h:80
std::optional< STAmount > asset2In
Definition AMM.h:79
std::optional< std::uint16_t > tfee
Definition AMM.h:84
std::optional< LPToken > tokens
Definition AMM.h:77
std::optional< ter > err
Definition AMM.h:108
std::optional< Account > account
Definition AMM.h:103
std::uint32_t tfee
Definition AMM.h:104
std::optional< std::pair< Issue, Issue > > assets
Definition AMM.h:107
std::optional< STAmount > asset2Out
Definition AMM.h:93
std::optional< IOUAmount > maxEP
Definition AMM.h:94
std::optional< Account > account
Definition AMM.h:90
std::optional< STAmount > asset1Out
Definition AMM.h:92
std::optional< std::pair< Issue, Issue > > assets
Definition AMM.h:96
std::optional< LPToken > tokens
Definition AMM.h:91
std::optional< ter > err
Definition AMM.h:98
Set the sequence number on a JTx.
Definition seq.h:34