rippled
Loading...
Searching...
No Matches
AMM.h
1#pragma once
2
3#include <test/jtx/Account.h>
4#include <test/jtx/Env.h>
5#include <test/jtx/multisign.h>
6#include <test/jtx/seq.h>
7#include <test/jtx/ter.h>
8
9#include <xrpld/rpc/GRPCHandlers.h>
10
11#include <xrpl/json/json_value.h>
12#include <xrpl/protocol/STAmount.h>
13#include <xrpl/protocol/TxFlags.h>
14
15namespace xrpl {
16namespace test {
17namespace jtx {
18
20{
22
23public:
30 IOUAmount const&
31 tokens() const
32 {
33 return tokens_;
34 }
36 tokens(Issue const& ammIssue) const
37 {
38 return STAmount{tokens_, ammIssue};
39 }
40};
41
53
67
80
90
100
103class AMM
104{
110 bool log_;
112 // Predict next purchase price
116 // Multi-signature
118 // Transaction fee
123
124public:
125 AMM(Env& env,
126 Account const& account,
127 STAmount const& asset1,
128 STAmount const& asset2,
129 bool log = false,
130 std::uint16_t tfee = 0,
131 std::uint32_t fee = 0,
136 bool close = true);
137 AMM(Env& env,
138 Account const& account,
139 STAmount const& asset1,
140 STAmount const& asset2,
141 ter const& ter,
142 bool log = false,
143 bool close = true);
144 AMM(Env& env, Account const& account, STAmount const& asset1, STAmount const& asset2, CreateArg const& arg);
145
150 std::optional<AccountID> const& account = std::nullopt,
151 std::optional<std::string> const& ledgerIndex = std::nullopt,
155 bool ignoreParams = false,
156 unsigned apiVersion = RPC::apiInvalidVersion) const;
157
160 [[nodiscard]] bool
162 STAmount const& asset1,
163 STAmount const& asset2,
164 IOUAmount const& lpt,
165 std::optional<AccountID> const& account = std::nullopt) const;
166
170 balances(Issue const& issue1, Issue const& issue2, std::optional<AccountID> const& account = std::nullopt) const;
171
174 {
175 return balances(asset1_.get<Issue>(), asset2_.get<Issue>(), account);
176 }
177
178 [[nodiscard]] bool
179 expectLPTokens(AccountID const& account, IOUAmount const& tokens) const;
180
186 [[nodiscard]] bool
188
189 [[nodiscard]] bool
190 expectAuctionSlot(std::vector<AccountID> const& authAccount) const;
191
192 [[nodiscard]] bool
194
195 [[nodiscard]] bool
197 STAmount const& asset1,
198 STAmount const& asset2,
199 IOUAmount const& balance,
200 std::optional<AccountID> const& account = std::nullopt,
201 std::optional<std::string> const& ledger_index = std::nullopt,
203
204 [[nodiscard]] bool
205 ammExists() const;
206
208 deposit(
209 std::optional<Account> const& account,
211 std::optional<STAmount> const& asset1InDetails = std::nullopt,
214
216 deposit(
217 std::optional<Account> const& account,
218 STAmount const& asset1InDetails,
219 std::optional<STAmount> const& asset2InAmount = std::nullopt,
223
225 deposit(
226 std::optional<Account> const& account,
228 std::optional<STAmount> const& asset1In,
229 std::optional<STAmount> const& asset2In,
230 std::optional<STAmount> const& maxEP,
236
238 deposit(DepositArg const& arg);
239
241 withdraw(
242 std::optional<Account> const& account,
244 std::optional<STAmount> const& asset1OutDetails = std::nullopt,
247
250 std::optional<Account> const& account,
251 std::optional<STAmount> const& asset1OutDetails = std::nullopt,
253 {
254 return withdraw(
255 account, std::nullopt, asset1OutDetails, asset1OutDetails ? tfOneAssetWithdrawAll : tfWithdrawAll, ter);
256 }
257
259 withdraw(
260 std::optional<Account> const& account,
261 STAmount const& asset1Out,
262 std::optional<STAmount> const& asset2Out = std::nullopt,
265
267 withdraw(
268 std::optional<Account> const& account,
270 std::optional<STAmount> const& asset1Out,
271 std::optional<STAmount> const& asset2Out,
272 std::optional<IOUAmount> const& maxEP,
277
279 withdraw(WithdrawArg const& arg);
280
281 void
282 vote(
283 std::optional<Account> const& account,
284 std::uint32_t feeVal,
289
290 void
291 vote(VoteArg const& arg);
292
294 bid(BidArg const& arg);
295
296 AccountID const&
298 {
299 return ammAccount_;
300 }
301
302 Issue
303 lptIssue() const
304 {
305 return lptIssue_;
306 }
307
309 tokens() const
310 {
311 return initialLPTokens_;
312 }
313
316
318 operator<<(std::ostream& s, AMM const& amm)
319 {
320 if (auto const res = amm.ammRpcInfo())
321 s << res.toStyledString();
322 return s;
323 }
324
327 {
328 return ammRpcInfo(lp).toStyledString();
329 }
330
333 {
334 return ammRpcInfo(lp);
335 }
336
337 void
338 ammDelete(AccountID const& deleter, std::optional<ter> const& ter = std::nullopt);
339
340 void
341 setClose(bool close)
342 {
343 doClose_ = close;
344 }
345
346 uint256
347 ammID() const
348 {
349 return ammID_;
350 }
351
352 void
354
355private:
357 create(
358 std::uint32_t tfee = 0,
362
364 deposit(
365 std::optional<Account> const& account,
366 Json::Value& jv,
370
372 withdraw(
373 std::optional<Account> const& account,
374 Json::Value& jv,
378
379 void
380 log(bool log)
381 {
382 log_ = log;
383 }
384
385 [[nodiscard]] bool
386 expectAmmInfo(STAmount const& asset1, STAmount const& asset2, IOUAmount const& balance, Json::Value const& jv)
387 const;
388
389 void
391
392 [[nodiscard]] bool
393 expectAuctionSlot(auto&& cb) const;
394
397};
398
399namespace amm {
401trust(AccountID const& account, STAmount const& amount, std::uint32_t flags = 0);
403pay(Account const& account, AccountID const& to, STAmount const& amount);
404
407 Account const& issuer,
408 Account const& holder,
409 Issue const& asset,
410 Issue const& asset2,
412} // namespace amm
413
414} // namespace jtx
415} // namespace test
416} // namespace xrpl
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:25
A currency issued by an account.
Definition Issue.h:13
constexpr TIss const & get() const
Convenience class to test AMM functionality.
Definition AMM.h:104
bool expectTradingFee(std::uint16_t fee) const
Definition AMM.cpp:229
Issue const lptIssue_
Definition AMM.h:121
uint256 ammID() const
Definition AMM.h:347
IOUAmount getLPTokensBalance(std::optional< AccountID > const &account=std::nullopt) const
Definition AMM.cpp:181
std::optional< IOUAmount > bidMax_
Definition AMM.h:115
Issue lptIssue() const
Definition AMM.h:303
AccountID const ammAccount_
Definition AMM.h:120
bool ammExists() const
Definition AMM.cpp:236
void setTokens(Json::Value &jv, std::optional< std::pair< Issue, Issue > > const &assets=std::nullopt)
Definition AMM.cpp:280
IOUAmount lastPurchasePrice_
Definition AMM.h:113
friend std::ostream & operator<<(std::ostream &s, AMM const &amm)
Definition AMM.h:318
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:496
bool expectAuctionSlot(std::uint32_t fee, std::optional< std::uint8_t > timeSlot, IOUAmount expectedPrice) const
Definition AMM.cpp:202
void submit(Json::Value const &jv, std::optional< jtx::seq > const &seq, std::optional< ter > const &ter)
Definition AMM.cpp:582
void ammDelete(AccountID const &deleter, std::optional< ter > const &ter=std::nullopt)
Definition AMM.cpp:637
IOUAmount tokens() const
Definition AMM.h:309
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:155
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:243
Account const creatorAccount_
Definition AMM.h:106
std::uint32_t const fee_
Definition AMM.h:119
std::optional< msig > const msig_
Definition AMM.h:117
IOUAmount withdrawAll(std::optional< Account > const &account, std::optional< STAmount > const &asset1OutDetails=std::nullopt, std::optional< ter > const &ter=std::nullopt)
Definition AMM.h:249
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:422
STAmount const asset2_
Definition AMM.h:108
AccountID const & ammAccount() const
Definition AMM.h:297
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:115
uint256 const ammID_
Definition AMM.h:109
Json::Value bid(BidArg const &arg)
Definition AMM.cpp:523
std::tuple< STAmount, STAmount, STAmount > balances(std::optional< AccountID > const &account=std::nullopt) const
Definition AMM.h:173
void setClose(bool close)
Definition AMM.h:341
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:84
std::optional< IOUAmount > bidMin_
Definition AMM.h:114
void log(bool log)
Definition AMM.h:380
bool expectLPTokens(AccountID const &account, IOUAmount const &tokens) const
Definition AMM.cpp:191
bool expectAmmInfo(STAmount const &asset1, STAmount const &asset2, IOUAmount const &balance, Json::Value const &jv) const
Definition AMM.cpp:256
std::string operator[](AccountID const &lp)
Definition AMM.h:326
IOUAmount initialTokens()
Definition AMM.cpp:25
Json::Value operator()(AccountID const &lp)
Definition AMM.h:332
STAmount const asset1_
Definition AMM.h:107
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:170
IOUAmount const initialLPTokens_
Definition AMM.h:122
Immutable cryptographic account descriptor.
Definition Account.h:19
A transaction testing environment.
Definition Env.h:119
IOUAmount const & tokens() const
Definition AMM.h:31
STAmount tokens(Issue const &ammIssue) const
Definition AMM.h:36
LPToken(std::uint64_t tokens)
Definition AMM.h:24
IOUAmount const tokens_
Definition AMM.h:21
LPToken(IOUAmount tokens)
Definition AMM.h:27
A balance matches.
Definition balance.h:19
Set the fee on a JTx.
Definition fee.h:17
Match set account flags.
Definition flags.h:108
Set the expected result code for a JTx The test will fail if the code doesn't match.
Definition ter.h:15
T is_same_v
static constexpr auto apiInvalidVersion
Definition ApiVersion.h:40
Json::Value trust(AccountID const &account, STAmount const &amount, std::uint32_t flags=0)
Definition AMM.cpp:650
Json::Value pay(Account const &account, AccountID const &to, STAmount const &amount)
Definition AMM.cpp:662
Json::Value ammClawback(Account const &issuer, Account const &holder, Issue const &asset, Issue const &asset2, std::optional< STAmount > const &amount)
Definition AMM.cpp:673
auto const amount
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
constexpr std::uint32_t tfWithdrawAll
Definition TxFlags.h:225
constexpr std::uint32_t tfOneAssetWithdrawAll
Definition TxFlags.h:226
std::optional< Account > account
Definition AMM.h:93
std::optional< std::variant< int, IOUAmount, STAmount > > bidMin
Definition AMM.h:94
std::vector< Account > authAccounts
Definition AMM.h:96
std::optional< std::variant< int, IOUAmount, STAmount > > bidMax
Definition AMM.h:95
std::optional< std::pair< Issue, Issue > > assets
Definition AMM.h:98
std::optional< jtx::msig > ms
Definition AMM.h:49
std::optional< ter > err
Definition AMM.h:50
std::uint16_t tfee
Definition AMM.h:45
std::optional< std::uint16_t > tfee
Definition AMM.h:64
std::optional< LPToken > tokens
Definition AMM.h:57
std::optional< STAmount > maxEP
Definition AMM.h:60
std::optional< std::pair< Issue, Issue > > assets
Definition AMM.h:62
std::optional< ter > err
Definition AMM.h:65
std::optional< Account > account
Definition AMM.h:56
std::optional< STAmount > asset2In
Definition AMM.h:59
std::optional< STAmount > asset1In
Definition AMM.h:58
std::optional< ter > err
Definition AMM.h:88
std::uint32_t tfee
Definition AMM.h:84
std::optional< std::pair< Issue, Issue > > assets
Definition AMM.h:87
std::optional< Account > account
Definition AMM.h:83
std::optional< STAmount > asset2Out
Definition AMM.h:73
std::optional< std::pair< Issue, Issue > > assets
Definition AMM.h:76
std::optional< IOUAmount > maxEP
Definition AMM.h:74
std::optional< ter > err
Definition AMM.h:78
std::optional< STAmount > asset1Out
Definition AMM.h:72
std::optional< Account > account
Definition AMM.h:70
std::optional< LPToken > tokens
Definition AMM.h:71
Set the sequence number on a JTx.
Definition seq.h:14