rippled
Loading...
Searching...
No Matches
AMM.h
1#ifndef XRPL_TEST_JTX_AMM_H_INCLUDED
2#define XRPL_TEST_JTX_AMM_H_INCLUDED
3
4#include <test/jtx/Account.h>
5#include <test/jtx/Env.h>
6#include <test/jtx/multisign.h>
7#include <test/jtx/seq.h>
8#include <test/jtx/ter.h>
9
10#include <xrpld/rpc/GRPCHandlers.h>
11
12#include <xrpl/json/json_value.h>
13#include <xrpl/protocol/STAmount.h>
14#include <xrpl/protocol/TxFlags.h>
15
16namespace ripple {
17namespace test {
18namespace jtx {
19
21{
23
24public:
31 IOUAmount const&
32 tokens() const
33 {
34 return tokens_;
35 }
37 tokens(Issue const& ammIssue) const
38 {
39 return STAmount{tokens_, ammIssue};
40 }
41};
42
54
68
81
91
101
104class AMM
105{
111 bool log_;
113 // Predict next purchase price
117 // Multi-signature
119 // Transaction fee
124
125public:
126 AMM(Env& env,
127 Account const& account,
128 STAmount const& asset1,
129 STAmount const& asset2,
130 bool log = false,
131 std::uint16_t tfee = 0,
132 std::uint32_t fee = 0,
137 bool close = true);
138 AMM(Env& env,
139 Account const& account,
140 STAmount const& asset1,
141 STAmount const& asset2,
142 ter const& ter,
143 bool log = false,
144 bool close = true);
145 AMM(Env& env,
146 Account const& account,
147 STAmount const& asset1,
148 STAmount const& asset2,
149 CreateArg const& arg);
150
155 std::optional<AccountID> const& account = std::nullopt,
156 std::optional<std::string> const& ledgerIndex = std::nullopt,
160 bool ignoreParams = false,
161 unsigned apiVersion = RPC::apiInvalidVersion) const;
162
165 [[nodiscard]] bool
167 STAmount const& asset1,
168 STAmount const& asset2,
169 IOUAmount const& lpt,
170 std::optional<AccountID> const& account = std::nullopt) const;
171
175 balances(
176 Issue const& issue1,
177 Issue const& issue2,
178 std::optional<AccountID> const& account = std::nullopt) const;
179
182 {
183 return balances(asset1_.get<Issue>(), asset2_.get<Issue>(), account);
184 }
185
186 [[nodiscard]] bool
187 expectLPTokens(AccountID const& account, IOUAmount const& tokens) const;
188
194 [[nodiscard]] bool
198 IOUAmount expectedPrice) const;
199
200 [[nodiscard]] bool
201 expectAuctionSlot(std::vector<AccountID> const& authAccount) const;
202
203 [[nodiscard]] bool
205
206 [[nodiscard]] bool
208 STAmount const& asset1,
209 STAmount const& asset2,
210 IOUAmount const& balance,
211 std::optional<AccountID> const& account = std::nullopt,
212 std::optional<std::string> const& ledger_index = std::nullopt,
214
215 [[nodiscard]] bool
216 ammExists() const;
217
219 deposit(
220 std::optional<Account> const& account,
222 std::optional<STAmount> const& asset1InDetails = std::nullopt,
225
227 deposit(
228 std::optional<Account> const& account,
229 STAmount const& asset1InDetails,
230 std::optional<STAmount> const& asset2InAmount = std::nullopt,
234
236 deposit(
237 std::optional<Account> const& account,
239 std::optional<STAmount> const& asset1In,
240 std::optional<STAmount> const& asset2In,
241 std::optional<STAmount> const& maxEP,
247
249 deposit(DepositArg const& arg);
250
252 withdraw(
253 std::optional<Account> const& account,
255 std::optional<STAmount> const& asset1OutDetails = std::nullopt,
258
261 std::optional<Account> const& account,
262 std::optional<STAmount> const& asset1OutDetails = std::nullopt,
264 {
265 return withdraw(
266 account,
268 asset1OutDetails,
269 asset1OutDetails ? tfOneAssetWithdrawAll : tfWithdrawAll,
270 ter);
271 }
272
274 withdraw(
275 std::optional<Account> const& account,
276 STAmount const& asset1Out,
277 std::optional<STAmount> const& asset2Out = std::nullopt,
280
282 withdraw(
283 std::optional<Account> const& account,
285 std::optional<STAmount> const& asset1Out,
286 std::optional<STAmount> const& asset2Out,
287 std::optional<IOUAmount> const& maxEP,
292
294 withdraw(WithdrawArg const& arg);
295
296 void
297 vote(
298 std::optional<Account> const& account,
299 std::uint32_t feeVal,
304
305 void
306 vote(VoteArg const& arg);
307
309 bid(BidArg const& arg);
310
311 AccountID const&
313 {
314 return ammAccount_;
315 }
316
317 Issue
318 lptIssue() const
319 {
320 return lptIssue_;
321 }
322
324 tokens() const
325 {
326 return initialLPTokens_;
327 }
328
331 std::optional<AccountID> const& account = std::nullopt) const;
332
334 operator<<(std::ostream& s, AMM const& amm)
335 {
336 if (auto const res = amm.ammRpcInfo())
337 s << res.toStyledString();
338 return s;
339 }
340
343 {
344 return ammRpcInfo(lp).toStyledString();
345 }
346
349 {
350 return ammRpcInfo(lp);
351 }
352
353 void
354 ammDelete(
355 AccountID const& deleter,
357
358 void
359 setClose(bool close)
360 {
361 doClose_ = close;
362 }
363
364 uint256
365 ammID() const
366 {
367 return ammID_;
368 }
369
370 void
371 setTokens(
372 Json::Value& jv,
374
375private:
377 create(
378 std::uint32_t tfee = 0,
382
384 deposit(
385 std::optional<Account> const& account,
386 Json::Value& jv,
390
392 withdraw(
393 std::optional<Account> const& account,
394 Json::Value& jv,
398
399 void
400 log(bool log)
401 {
402 log_ = log;
403 }
404
405 [[nodiscard]] bool
407 STAmount const& asset1,
408 STAmount const& asset2,
409 IOUAmount const& balance,
410 Json::Value const& jv) const;
411
412 void
413 submit(
414 Json::Value const& jv,
416 std::optional<ter> const& ter);
417
418 [[nodiscard]] bool
419 expectAuctionSlot(auto&& cb) const;
420
423};
424
425namespace amm {
427trust(
428 AccountID const& account,
429 STAmount const& amount,
430 std::uint32_t flags = 0);
432pay(Account const& account, AccountID const& to, STAmount const& amount);
433
436 Account const& issuer,
437 Account const& holder,
438 Issue const& asset,
439 Issue const& asset2,
440 std::optional<STAmount> const& amount);
441} // namespace amm
442
443} // namespace jtx
444} // namespace test
445} // namespace ripple
446
447#endif // XRPL_TEST_JTX_AMM_H_INCLUDED
Represents a JSON value.
Definition json_value.h:130
std::string toStyledString() const
Floating point representation of amounts with high dynamic range.
Definition IOUAmount.h:27
A currency issued by an account.
Definition Issue.h:14
constexpr TIss const & get() const
Convenience class to test AMM functionality.
Definition AMM.h:105
std::optional< IOUAmount > bidMin_
Definition AMM.h:115
Issue const lptIssue_
Definition AMM.h:122
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:147
void submit(Json::Value const &jv, std::optional< jtx::seq > const &seq, std::optional< ter > const &ter)
Definition AMM.cpp:714
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:623
friend std::ostream & operator<<(std::ostream &s, AMM const &amm)
Definition AMM.h:334
std::uint32_t const fee_
Definition AMM.h:120
uint256 const ammID_
Definition AMM.h:110
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:115
bool expectAuctionSlot(std::uint32_t fee, std::optional< std::uint8_t > timeSlot, IOUAmount expectedPrice) const
Definition AMM.cpp:261
STAmount const asset2_
Definition AMM.h:109
std::string operator[](AccountID const &lp)
Definition AMM.h:342
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:193
STAmount const asset1_
Definition AMM.h:108
void ammDelete(AccountID const &deleter, std::optional< ter > const &ter=std::nullopt)
Definition AMM.cpp:778
void log(bool log)
Definition AMM.h:400
IOUAmount tokens() const
Definition AMM.h:324
bool expectAmmInfo(STAmount const &asset1, STAmount const &asset2, IOUAmount const &balance, Json::Value const &jv) const
Definition AMM.cpp:328
void setClose(bool close)
Definition AMM.h:359
IOUAmount lastPurchasePrice_
Definition AMM.h:114
AccountID const & ammAccount() const
Definition AMM.h:312
IOUAmount initialTokens()
Definition AMM.cpp:25
AccountID const ammAccount_
Definition AMM.h:121
bool expectTradingFee(std::uint16_t fee) const
Definition AMM.cpp:298
Json::Value operator()(AccountID const &lp)
Definition AMM.h:348
std::optional< msig > const msig_
Definition AMM.h:118
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:523
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:218
Issue lptIssue() const
Definition AMM.h:318
Account const creatorAccount_
Definition AMM.h:107
std::tuple< STAmount, STAmount, STAmount > balances(std::optional< AccountID > const &account=std::nullopt) const
Definition AMM.h:181
std::optional< IOUAmount > bidMax_
Definition AMM.h:116
IOUAmount const initialLPTokens_
Definition AMM.h:123
IOUAmount getLPTokensBalance(std::optional< AccountID > const &account=std::nullopt) const
Definition AMM.cpp:231
Json::Value bid(BidArg const &arg)
Definition AMM.cpp:650
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:314
void setTokens(Json::Value &jv, std::optional< std::pair< Issue, Issue > > const &assets=std::nullopt)
Definition AMM.cpp:357
bool ammExists() const
Definition AMM.cpp:306
IOUAmount withdrawAll(std::optional< Account > const &account, std::optional< STAmount > const &asset1OutDetails=std::nullopt, std::optional< ter > const &ter=std::nullopt)
Definition AMM.h:260
uint256 ammID() const
Definition AMM.h:365
bool expectLPTokens(AccountID const &account, IOUAmount const &tokens) const
Definition AMM.cpp:248
Immutable cryptographic account descriptor.
Definition Account.h:20
A transaction testing environment.
Definition Env.h:102
LPToken(std::uint64_t tokens)
Definition AMM.h:25
IOUAmount const tokens_
Definition AMM.h:22
STAmount tokens(Issue const &ammIssue) const
Definition AMM.h:37
IOUAmount const & tokens() const
Definition AMM.h:32
LPToken(IOUAmount tokens)
Definition AMM.h:28
A balance matches.
Definition balance.h:20
Set the fee on a JTx.
Definition fee.h:18
Match set account flags.
Definition flags.h:109
Set the expected result code for a JTx The test will fail if the code doesn't match.
Definition ter.h:16
T is_same_v
static constexpr auto apiInvalidVersion
Definition ApiVersion.h:41
Json::Value trust(AccountID const &account, STAmount const &amount, std::uint32_t flags=0)
Definition AMM.cpp:791
Json::Value ammClawback(Account const &issuer, Account const &holder, Issue const &asset, Issue const &asset2, std::optional< STAmount > const &amount)
Definition AMM.cpp:814
Json::Value pay(Account const &account, AccountID const &to, STAmount const &amount)
Definition AMM.cpp:803
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6
constexpr std::uint32_t tfOneAssetWithdrawAll
Definition TxFlags.h:227
constexpr std::uint32_t tfWithdrawAll
Definition TxFlags.h:226
std::vector< Account > authAccounts
Definition AMM.h:97
std::optional< std::variant< int, IOUAmount, STAmount > > bidMin
Definition AMM.h:95
std::optional< std::variant< int, IOUAmount, STAmount > > bidMax
Definition AMM.h:96
std::optional< Account > account
Definition AMM.h:94
std::optional< std::pair< Issue, Issue > > assets
Definition AMM.h:99
std::optional< ter > err
Definition AMM.h:51
std::uint16_t tfee
Definition AMM.h:46
std::optional< jtx::msig > ms
Definition AMM.h:50
std::optional< Account > account
Definition AMM.h:57
std::optional< STAmount > asset1In
Definition AMM.h:59
std::optional< std::pair< Issue, Issue > > assets
Definition AMM.h:63
std::optional< ter > err
Definition AMM.h:66
std::optional< STAmount > maxEP
Definition AMM.h:61
std::optional< STAmount > asset2In
Definition AMM.h:60
std::optional< std::uint16_t > tfee
Definition AMM.h:65
std::optional< LPToken > tokens
Definition AMM.h:58
std::optional< ter > err
Definition AMM.h:89
std::optional< Account > account
Definition AMM.h:84
std::uint32_t tfee
Definition AMM.h:85
std::optional< std::pair< Issue, Issue > > assets
Definition AMM.h:88
std::optional< STAmount > asset2Out
Definition AMM.h:74
std::optional< IOUAmount > maxEP
Definition AMM.h:75
std::optional< Account > account
Definition AMM.h:71
std::optional< STAmount > asset1Out
Definition AMM.h:73
std::optional< std::pair< Issue, Issue > > assets
Definition AMM.h:77
std::optional< LPToken > tokens
Definition AMM.h:72
std::optional< ter > err
Definition AMM.h:79
Set the sequence number on a JTx.
Definition seq.h:15