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:
45 {
46 }
48 {
49 }
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
63{
64 bool log = false;
70 std::optional<ter> err = std::nullopt;
71 bool close = true;
72};
73
75{
85 std::optional<ter> err = std::nullopt;
86};
87
89{
98 std::optional<ter> err = std::nullopt;
99};
100
102{
108 std::optional<ter> err = std::nullopt;
109};
110
111struct BidArg
112{
119};
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,
152 std::optional<std::uint32_t> flags = std::nullopt,
153 std::optional<jtx::seq> seq = std::nullopt,
154 std::optional<jtx::msig> ms = std::nullopt,
155 std::optional<ter> const& ter = std::nullopt,
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,
176 std::optional<Issue> issue1 = std::nullopt,
177 std::optional<Issue> issue2 = std::nullopt,
178 std::optional<AccountID> const& ammAccount = 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
200 balances(std::optional<AccountID> const& account = std::nullopt) const
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,
232 std::optional<AccountID> const& ammAccount = std::nullopt) const;
233
234 [[nodiscard]] bool
235 ammExists() const;
236
238 deposit(
239 std::optional<Account> const& account,
241 std::optional<STAmount> const& asset1InDetails = std::nullopt,
242 std::optional<std::uint32_t> const& flags = std::nullopt,
243 std::optional<ter> const& ter = std::nullopt);
244
246 deposit(
247 std::optional<Account> const& account,
248 STAmount const& asset1InDetails,
249 std::optional<STAmount> const& asset2InAmount = std::nullopt,
250 std::optional<STAmount> const& maxEP = std::nullopt,
251 std::optional<std::uint32_t> const& flags = std::nullopt,
252 std::optional<ter> const& ter = 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,
264 std::optional<std::uint16_t> const& tfee = std::nullopt,
265 std::optional<ter> const& ter = std::nullopt);
266
268 deposit(DepositArg const& arg);
269
271 withdraw(
272 std::optional<Account> const& account,
274 std::optional<STAmount> const& asset1OutDetails = std::nullopt,
275 std::optional<std::uint32_t> const& flags = std::nullopt,
276 std::optional<ter> const& ter = std::nullopt);
277
280 std::optional<Account> const& account,
281 std::optional<STAmount> const& asset1OutDetails = std::nullopt,
282 std::optional<ter> const& ter = std::nullopt)
283 {
284 return withdraw(
285 account,
286 std::nullopt,
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,
297 std::optional<IOUAmount> const& maxEP = std::nullopt,
298 std::optional<ter> const& ter = 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,
310 std::optional<ter> const& ter = std::nullopt);
311
313 withdraw(WithdrawArg const& arg);
314
315 void
316 vote(
317 std::optional<Account> const& account,
318 std::uint32_t feeVal,
319 std::optional<std::uint32_t> const& flags = std::nullopt,
320 std::optional<jtx::seq> const& seq = std::nullopt,
321 std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
322 std::optional<ter> const& ter = std::nullopt);
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,
375 std::optional<ter> const& ter = std::nullopt);
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,
392 std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt);
393
394private:
396 create(
397 std::uint32_t tfee = 0,
398 std::optional<std::uint32_t> const& flags = std::nullopt,
399 std::optional<jtx::seq> const& seq = std::nullopt,
400 std::optional<ter> const& ter = std::nullopt);
401
403 deposit(
404 std::optional<Account> const& account,
405 Json::Value& jv,
406 std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
407 std::optional<jtx::seq> const& seq = std::nullopt,
408 std::optional<ter> const& ter = std::nullopt);
409
411 withdraw(
412 std::optional<Account> const& account,
413 Json::Value& jv,
415 std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
416 std::optional<ter> const& ter = std::nullopt);
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:150
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:36
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:125
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: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:26
constexpr std::uint32_t tfOneAssetWithdrawAll
Definition: TxFlags.h:216
constexpr std::uint32_t tfWithdrawAll
Definition: TxFlags.h:215
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