rippled
Loading...
Searching...
No Matches
src/test/jtx/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,
145 Account const& account,
146 STAmount const& asset1,
147 STAmount const& asset2,
148 CreateArg const& arg);
149
154 std::optional<AccountID> const& account = std::nullopt,
155 std::optional<std::string> const& ledgerIndex = std::nullopt,
159 bool ignoreParams = false,
160 unsigned apiVersion = RPC::apiInvalidVersion) const;
161
164 [[nodiscard]] bool
166 STAmount const& asset1,
167 STAmount const& asset2,
168 IOUAmount const& lpt,
169 std::optional<AccountID> const& account = std::nullopt) const;
170
174 balances(
175 Issue const& issue1,
176 Issue const& issue2,
177 std::optional<AccountID> const& account = std::nullopt) const;
178
181 {
182 return balances(asset1_.get<Issue>(), asset2_.get<Issue>(), account);
183 }
184
185 [[nodiscard]] bool
186 expectLPTokens(AccountID const& account, IOUAmount const& tokens) const;
187
193 [[nodiscard]] bool
197 IOUAmount expectedPrice) const;
198
199 [[nodiscard]] bool
200 expectAuctionSlot(std::vector<AccountID> const& authAccount) const;
201
202 [[nodiscard]] bool
204
205 [[nodiscard]] bool
207 STAmount const& asset1,
208 STAmount const& asset2,
209 IOUAmount const& balance,
210 std::optional<AccountID> const& account = std::nullopt,
211 std::optional<std::string> const& ledger_index = std::nullopt,
213
214 [[nodiscard]] bool
215 ammExists() const;
216
218 deposit(
219 std::optional<Account> const& account,
221 std::optional<STAmount> const& asset1InDetails = std::nullopt,
224
226 deposit(
227 std::optional<Account> const& account,
228 STAmount const& asset1InDetails,
229 std::optional<STAmount> const& asset2InAmount = std::nullopt,
233
235 deposit(
236 std::optional<Account> const& account,
238 std::optional<STAmount> const& asset1In,
239 std::optional<STAmount> const& asset2In,
240 std::optional<STAmount> const& maxEP,
246
248 deposit(DepositArg const& arg);
249
251 withdraw(
252 std::optional<Account> const& account,
254 std::optional<STAmount> const& asset1OutDetails = std::nullopt,
257
260 std::optional<Account> const& account,
261 std::optional<STAmount> const& asset1OutDetails = std::nullopt,
263 {
264 return withdraw(
265 account,
267 asset1OutDetails,
268 asset1OutDetails ? tfOneAssetWithdrawAll : tfWithdrawAll,
269 ter);
270 }
271
273 withdraw(
274 std::optional<Account> const& account,
275 STAmount const& asset1Out,
276 std::optional<STAmount> const& asset2Out = std::nullopt,
279
281 withdraw(
282 std::optional<Account> const& account,
284 std::optional<STAmount> const& asset1Out,
285 std::optional<STAmount> const& asset2Out,
286 std::optional<IOUAmount> const& maxEP,
291
293 withdraw(WithdrawArg const& arg);
294
295 void
296 vote(
297 std::optional<Account> const& account,
298 std::uint32_t feeVal,
303
304 void
305 vote(VoteArg const& arg);
306
308 bid(BidArg const& arg);
309
310 AccountID const&
312 {
313 return ammAccount_;
314 }
315
316 Issue
317 lptIssue() const
318 {
319 return lptIssue_;
320 }
321
323 tokens() const
324 {
325 return initialLPTokens_;
326 }
327
330
332 operator<<(std::ostream& s, AMM const& amm)
333 {
334 if (auto const res = amm.ammRpcInfo())
335 s << res.toStyledString();
336 return s;
337 }
338
341 {
342 return ammRpcInfo(lp).toStyledString();
343 }
344
347 {
348 return ammRpcInfo(lp);
349 }
350
351 void
352 ammDelete(AccountID const& deleter, std::optional<ter> const& ter = std::nullopt);
353
354 void
355 setClose(bool close)
356 {
357 doClose_ = close;
358 }
359
360 uint256
361 ammID() const
362 {
363 return ammID_;
364 }
365
366 void
368
369private:
371 create(
372 std::uint32_t tfee = 0,
376
378 deposit(
379 std::optional<Account> const& account,
380 Json::Value& jv,
384
386 withdraw(
387 std::optional<Account> const& account,
388 Json::Value& jv,
392
393 void
394 log(bool log)
395 {
396 log_ = log;
397 }
398
399 [[nodiscard]] bool
401 STAmount const& asset1,
402 STAmount const& asset2,
403 IOUAmount const& balance,
404 Json::Value const& jv) const;
405
406 void
407 submit(
408 Json::Value const& jv,
410 std::optional<ter> const& ter);
411
412 [[nodiscard]] bool
413 expectAuctionSlot(auto&& cb) const;
414
417};
418
419namespace amm {
421trust(AccountID const& account, STAmount const& amount, std::uint32_t flags = 0);
423pay(Account const& account, AccountID const& to, STAmount const& amount);
424
427 Account const& issuer,
428 Account const& holder,
429 Issue const& asset,
430 Issue const& asset2,
432} // namespace amm
433
434} // namespace jtx
435} // namespace test
436} // 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.
bool expectTradingFee(std::uint16_t fee) const
Definition AMM.cpp:284
IOUAmount getLPTokensBalance(std::optional< AccountID > const &account=std::nullopt) const
Definition AMM.cpp:220
std::optional< IOUAmount > bidMax_
AccountID const ammAccount_
bool ammExists() const
Definition AMM.cpp:291
void setTokens(Json::Value &jv, std::optional< std::pair< Issue, Issue > > const &assets=std::nullopt)
Definition AMM.cpp:339
friend std::ostream & operator<<(std::ostream &s, AMM const &amm)
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:619
bool expectAuctionSlot(std::uint32_t fee, std::optional< std::uint8_t > timeSlot, IOUAmount expectedPrice) const
Definition AMM.cpp:249
void submit(Json::Value const &jv, std::optional< jtx::seq > const &seq, std::optional< ter > const &ter)
Definition AMM.cpp:712
void ammDelete(AccountID const &deleter, std::optional< ter > const &ter=std::nullopt)
Definition AMM.cpp:789
IOUAmount tokens() const
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:185
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:298
Account const creatorAccount_
std::uint32_t const fee_
std::optional< msig > const msig_
IOUAmount withdrawAll(std::optional< Account > const &account, std::optional< STAmount > const &asset1OutDetails=std::nullopt, std::optional< ter > const &ter=std::nullopt)
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:509
AccountID const & ammAccount() const
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:144
Json::Value bid(BidArg const &arg)
Definition AMM.cpp:646
std::tuple< STAmount, STAmount, STAmount > balances(std::optional< AccountID > const &account=std::nullopt) const
void setClose(bool close)
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:109
std::optional< IOUAmount > bidMin_
bool expectLPTokens(AccountID const &account, IOUAmount const &tokens) const
Definition AMM.cpp:238
bool expectAmmInfo(STAmount const &asset1, STAmount const &asset2, IOUAmount const &balance, Json::Value const &jv) const
Definition AMM.cpp:311
std::string operator[](AccountID const &lp)
IOUAmount initialTokens()
Definition AMM.cpp:25
Json::Value operator()(AccountID const &lp)
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:207
IOUAmount const initialLPTokens_
Immutable cryptographic account descriptor.
Definition Account.h:19
A transaction testing environment.
Definition Env.h:122
IOUAmount const & tokens() const
STAmount tokens(Issue const &ammIssue) const
LPToken(std::uint64_t tokens)
LPToken(IOUAmount tokens)
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:802
Json::Value pay(Account const &account, AccountID const &to, STAmount const &amount)
Definition AMM.cpp:814
Json::Value ammClawback(Account const &issuer, Account const &holder, Issue const &asset, Issue const &asset2, std::optional< STAmount > const &amount)
Definition AMM.cpp:825
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
std::optional< Account > account
std::optional< std::variant< int, IOUAmount, STAmount > > bidMin
std::vector< Account > authAccounts
std::optional< std::variant< int, IOUAmount, STAmount > > bidMax
std::optional< std::pair< Issue, Issue > > assets
std::optional< jtx::msig > ms
std::optional< ter > err
std::optional< std::uint16_t > tfee
std::optional< LPToken > tokens
std::optional< STAmount > maxEP
std::optional< std::pair< Issue, Issue > > assets
std::optional< Account > account
std::optional< STAmount > asset2In
std::optional< STAmount > asset1In
std::optional< ter > err
std::optional< std::pair< Issue, Issue > > assets
std::optional< Account > account
std::optional< STAmount > asset2Out
std::optional< std::pair< Issue, Issue > > assets
std::optional< IOUAmount > maxEP
std::optional< STAmount > asset1Out
std::optional< Account > account
std::optional< LPToken > tokens
Set the sequence number on a JTx.
Definition seq.h:14