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{
131 bool log_;
133 // Predict next purchase price
137 // Multi-signature
139 // 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
199 [[nodiscard]] bool
200 expectLPTokens(AccountID const& account, IOUAmount const& tokens) const;
201
207 [[nodiscard]] bool
211 IOUAmount expectedPrice) const;
212
213 [[nodiscard]] bool
214 expectAuctionSlot(std::vector<AccountID> const& authAccount) const;
215
216 [[nodiscard]] bool
218
219 [[nodiscard]] bool
221 STAmount const& asset1,
222 STAmount const& asset2,
223 IOUAmount const& balance,
224 std::optional<AccountID> const& account = std::nullopt,
225 std::optional<std::string> const& ledger_index = std::nullopt,
226 std::optional<AccountID> const& ammAccount = std::nullopt) const;
227
228 [[nodiscard]] bool
229 ammExists() const;
230
232 deposit(
233 std::optional<Account> const& account,
235 std::optional<STAmount> const& asset1InDetails = std::nullopt,
236 std::optional<std::uint32_t> const& flags = std::nullopt,
237 std::optional<ter> const& ter = std::nullopt);
238
240 deposit(
241 std::optional<Account> const& account,
242 STAmount const& asset1InDetails,
243 std::optional<STAmount> const& asset2InAmount = std::nullopt,
244 std::optional<STAmount> const& maxEP = std::nullopt,
245 std::optional<std::uint32_t> const& flags = std::nullopt,
246 std::optional<ter> const& ter = std::nullopt);
247
249 deposit(
250 std::optional<Account> const& account,
252 std::optional<STAmount> const& asset1In,
253 std::optional<STAmount> const& asset2In,
254 std::optional<STAmount> const& maxEP,
258 std::optional<std::uint16_t> const& tfee = std::nullopt,
259 std::optional<ter> const& ter = std::nullopt);
260
262 deposit(DepositArg const& arg);
263
265 withdraw(
266 std::optional<Account> const& account,
268 std::optional<STAmount> const& asset1OutDetails = std::nullopt,
269 std::optional<std::uint32_t> const& flags = std::nullopt,
270 std::optional<ter> const& ter = std::nullopt);
271
274 std::optional<Account> const& account,
275 std::optional<STAmount> const& asset1OutDetails = std::nullopt,
276 std::optional<ter> const& ter = std::nullopt)
277 {
278 return withdraw(
279 account,
280 std::nullopt,
281 asset1OutDetails,
282 asset1OutDetails ? tfOneAssetWithdrawAll : tfWithdrawAll,
283 ter);
284 }
285
287 withdraw(
288 std::optional<Account> const& account,
289 STAmount const& asset1Out,
290 std::optional<STAmount> const& asset2Out = std::nullopt,
291 std::optional<IOUAmount> const& maxEP = std::nullopt,
292 std::optional<ter> const& ter = std::nullopt);
293
295 withdraw(
296 std::optional<Account> const& account,
298 std::optional<STAmount> const& asset1Out,
299 std::optional<STAmount> const& asset2Out,
300 std::optional<IOUAmount> const& maxEP,
304 std::optional<ter> const& ter = std::nullopt);
305
307 withdraw(WithdrawArg const& arg);
308
309 void
310 vote(
311 std::optional<Account> const& account,
312 std::uint32_t feeVal,
313 std::optional<std::uint32_t> const& flags = std::nullopt,
314 std::optional<jtx::seq> const& seq = std::nullopt,
315 std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
316 std::optional<ter> const& ter = std::nullopt);
317
318 void
319 vote(VoteArg const& arg);
320
322 bid(BidArg const& arg);
323
324 AccountID const&
326 {
327 return ammAccount_;
328 }
329
330 Issue
331 lptIssue() const
332 {
333 return lptIssue_;
334 }
335
337 tokens() const
338 {
339 return initialLPTokens_;
340 }
341
344 std::optional<AccountID> const& account = std::nullopt) const;
345
347 operator<<(std::ostream& s, AMM const& amm)
348 {
349 if (auto const res = amm.ammRpcInfo())
350 s << res.toStyledString();
351 return s;
352 }
353
356 {
357 return ammRpcInfo(lp).toStyledString();
358 }
359
362 {
363 return ammRpcInfo(lp);
364 }
365
366 void
367 ammDelete(
368 AccountID const& deleter,
369 std::optional<ter> const& ter = std::nullopt);
370
371 void
372 setClose(bool close)
373 {
374 doClose_ = close;
375 }
376
377 uint256
378 ammID() const
379 {
380 return ammID_;
381 }
382
383 void
384 setTokens(
385 Json::Value& jv,
386 std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt);
387
388private:
390 create(
391 std::uint32_t tfee = 0,
392 std::optional<std::uint32_t> const& flags = std::nullopt,
393 std::optional<jtx::seq> const& seq = std::nullopt,
394 std::optional<ter> const& ter = std::nullopt);
395
397 deposit(
398 std::optional<Account> const& account,
399 Json::Value& jv,
400 std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
401 std::optional<jtx::seq> const& seq = std::nullopt,
402 std::optional<ter> const& ter = std::nullopt);
403
405 withdraw(
406 std::optional<Account> const& account,
407 Json::Value& jv,
409 std::optional<std::pair<Issue, Issue>> const& assets = std::nullopt,
410 std::optional<ter> const& ter = std::nullopt);
411
412 void
413 log(bool log)
414 {
415 log_ = log;
416 }
417
418 [[nodiscard]] bool
420 STAmount const& asset1,
421 STAmount const& asset2,
422 IOUAmount const& balance,
423 Json::Value const& jv) const;
424
425 void
426 submit(
427 Json::Value const& jv,
429 std::optional<ter> const& ter);
430
431 [[nodiscard]] bool
432 expectAuctionSlot(auto&& cb) const;
433};
434
435namespace amm {
437trust(
438 AccountID const& account,
439 STAmount const& amount,
440 std::uint32_t flags = 0);
442pay(Account const& account, AccountID const& to, STAmount const& amount);
443
446 Account const& issuer,
447 Account const& holder,
448 Issue const& asset,
449 Issue const& asset2,
450 std::optional<STAmount> const& amount);
451} // namespace amm
452
453} // namespace jtx
454} // namespace test
455} // namespace ripple
456
457#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:124
std::optional< IOUAmount > bidMin_
Definition: AMM.h:135
Issue const lptIssue_
Definition: AMM.h:142
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:161
void submit(Json::Value const &jv, std::optional< jtx::seq > const &seq, std::optional< ter > const &ter)
Definition: AMM.cpp:728
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:637
friend std::ostream & operator<<(std::ostream &s, AMM const &amm)
Definition: AMM.h:347
std::uint32_t const fee_
Definition: AMM.h:140
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:129
bool expectAuctionSlot(std::uint32_t fee, std::optional< std::uint8_t > timeSlot, IOUAmount expectedPrice) const
Definition: AMM.cpp:275
STAmount const asset2_
Definition: AMM.h:128
std::string operator[](AccountID const &lp)
Definition: AMM.h:355
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:207
STAmount const asset1_
Definition: AMM.h:127
void ammDelete(AccountID const &deleter, std::optional< ter > const &ter=std::nullopt)
Definition: AMM.cpp:792
void log(bool log)
Definition: AMM.h:413
IOUAmount tokens() const
Definition: AMM.h:337
bool expectAmmInfo(STAmount const &asset1, STAmount const &asset2, IOUAmount const &balance, Json::Value const &jv) const
Definition: AMM.cpp:342
void setClose(bool close)
Definition: AMM.h:372
IOUAmount lastPurchasePrice_
Definition: AMM.h:134
AccountID const & ammAccount() const
Definition: AMM.h:325
AccountID const ammAccount_
Definition: AMM.h:141
bool expectTradingFee(std::uint16_t fee) const
Definition: AMM.cpp:312
Json::Value operator()(AccountID const &lp)
Definition: AMM.h:361
std::optional< msig > const msig_
Definition: AMM.h:138
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:537
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:232
Issue lptIssue() const
Definition: AMM.h:331
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:411
Account const creatorAccount_
Definition: AMM.h:126
std::optional< IOUAmount > bidMax_
Definition: AMM.h:136
IOUAmount const initialLPTokens_
Definition: AMM.h:130
IOUAmount getLPTokensBalance(std::optional< AccountID > const &account=std::nullopt) const
Definition: AMM.cpp:245
Json::Value bid(BidArg const &arg)
Definition: AMM.cpp:664
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:328
void setTokens(Json::Value &jv, std::optional< std::pair< Issue, Issue > > const &assets=std::nullopt)
Definition: AMM.cpp:371
bool ammExists() const
Definition: AMM.cpp:320
IOUAmount withdrawAll(std::optional< Account > const &account, std::optional< STAmount > const &asset1OutDetails=std::nullopt, std::optional< ter > const &ter=std::nullopt)
Definition: AMM.h:273
uint256 ammID() const
Definition: AMM.h:378
bool expectLPTokens(AccountID const &account, IOUAmount const &tokens) const
Definition: AMM.cpp:262
Immutable cryptographic account descriptor.
Definition: Account.h:39
A transaction testing environment.
Definition: Env.h:120
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:805
Json::Value ammClawback(Account const &issuer, Account const &holder, Issue const &asset, Issue const &asset2, std::optional< STAmount > const &amount)
Definition: AMM.cpp:829
Json::Value pay(Account const &account, AccountID const &to, STAmount const &amount)
Definition: AMM.cpp:817
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:214
constexpr std::uint32_t tfWithdrawAll
Definition: TxFlags.h:213
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