mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
amm_info: fetch by amm account id; add AMM object entry (#4682)
- Update amm_info to fetch AMM by amm account id. - This is an additional way to retrieve an AMM object. - Alternatively, AMM can still be fetched by the asset pair as well. - Add owner directory entry for AMM object. Context: - Add back the AMM object directory entry, which was deleted by #4626. - This fixes `account_objects` for `amm` type.
This commit is contained in:
committed by
GitHub
parent
a61a88ea81
commit
b014b79d88
@@ -42,7 +42,7 @@ public:
|
||||
Account const gw("gw");
|
||||
auto const USD = gw["USD"];
|
||||
auto const jv =
|
||||
ammAlice.ammRpcInfo({}, {}, {{USD.issue(), USD.issue()}});
|
||||
ammAlice.ammRpcInfo({}, {}, USD.issue(), USD.issue());
|
||||
BEAST_EXPECT(jv[jss::error_message] == "Account not found.");
|
||||
});
|
||||
|
||||
@@ -52,6 +52,40 @@ public:
|
||||
auto const jv = ammAlice.ammRpcInfo(bogie.id());
|
||||
BEAST_EXPECT(jv[jss::error_message] == "Account malformed.");
|
||||
});
|
||||
|
||||
// Invalid parameters
|
||||
testAMM([&](AMM& ammAlice, Env&) {
|
||||
std::vector<std::tuple<
|
||||
std::optional<Issue>,
|
||||
std::optional<Issue>,
|
||||
std::optional<AccountID>,
|
||||
bool>>
|
||||
vals = {
|
||||
{xrpIssue(), std::nullopt, std::nullopt, false},
|
||||
{std::nullopt, USD.issue(), std::nullopt, false},
|
||||
{xrpIssue(), std::nullopt, ammAlice.ammAccount(), false},
|
||||
{std::nullopt, USD.issue(), ammAlice.ammAccount(), false},
|
||||
{xrpIssue(), USD.issue(), ammAlice.ammAccount(), false},
|
||||
{std::nullopt, std::nullopt, std::nullopt, true}};
|
||||
for (auto const& [iss1, iss2, acct, ignoreParams] : vals)
|
||||
{
|
||||
auto const jv = ammAlice.ammRpcInfo(
|
||||
std::nullopt, std::nullopt, iss1, iss2, acct, ignoreParams);
|
||||
BEAST_EXPECT(jv[jss::error_message] == "Invalid parameters.");
|
||||
}
|
||||
});
|
||||
|
||||
// Invalid AMM account id
|
||||
testAMM([&](AMM& ammAlice, Env&) {
|
||||
Account bogie("bogie");
|
||||
auto const jv = ammAlice.ammRpcInfo(
|
||||
std::nullopt,
|
||||
std::nullopt,
|
||||
std::nullopt,
|
||||
std::nullopt,
|
||||
bogie.id());
|
||||
BEAST_EXPECT(jv[jss::error_message] == "Account malformed.");
|
||||
});
|
||||
}
|
||||
|
||||
void
|
||||
@@ -63,6 +97,13 @@ public:
|
||||
testAMM([&](AMM& ammAlice, Env&) {
|
||||
BEAST_EXPECT(ammAlice.expectAmmRpcInfo(
|
||||
XRP(10000), USD(10000), IOUAmount{10000000, 0}));
|
||||
BEAST_EXPECT(ammAlice.expectAmmRpcInfo(
|
||||
XRP(10000),
|
||||
USD(10000),
|
||||
IOUAmount{10000000, 0},
|
||||
std::nullopt,
|
||||
std::nullopt,
|
||||
ammAlice.ammAccount()));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -91,53 +132,71 @@ public:
|
||||
env.fund(XRP(1000), bob, ed, bill);
|
||||
ammAlice.bid(alice, 100, std::nullopt, {carol, bob, ed, bill});
|
||||
BEAST_EXPECT(ammAlice.expectAmmRpcInfo(
|
||||
XRP(80000), USD(80000), IOUAmount{79994400}));
|
||||
std::unordered_set<std::string> authAccounts = {
|
||||
carol.human(), bob.human(), ed.human(), bill.human()};
|
||||
auto const ammInfo = ammAlice.ammRpcInfo();
|
||||
auto const& amm = ammInfo[jss::amm];
|
||||
try
|
||||
XRP(80000),
|
||||
USD(80000),
|
||||
IOUAmount{79994400},
|
||||
std::nullopt,
|
||||
std::nullopt,
|
||||
ammAlice.ammAccount()));
|
||||
for (auto i = 0; i < 2; ++i)
|
||||
{
|
||||
// votes
|
||||
auto const voteSlots = amm[jss::vote_slots];
|
||||
for (std::uint8_t i = 0; i < 8; ++i)
|
||||
std::unordered_set<std::string> authAccounts = {
|
||||
carol.human(), bob.human(), ed.human(), bill.human()};
|
||||
auto const ammInfo = i ? ammAlice.ammRpcInfo()
|
||||
: ammAlice.ammRpcInfo(
|
||||
std::nullopt,
|
||||
std::nullopt,
|
||||
std::nullopt,
|
||||
std::nullopt,
|
||||
ammAlice.ammAccount());
|
||||
auto const& amm = ammInfo[jss::amm];
|
||||
try
|
||||
{
|
||||
if (!BEAST_EXPECT(
|
||||
votes[voteSlots[i][jss::account].asString()] ==
|
||||
voteSlots[i][jss::trading_fee].asUInt() &&
|
||||
voteSlots[i][jss::vote_weight].asUInt() == 12500))
|
||||
// votes
|
||||
auto const voteSlots = amm[jss::vote_slots];
|
||||
auto votesCopy = votes;
|
||||
for (std::uint8_t i = 0; i < 8; ++i)
|
||||
{
|
||||
if (!BEAST_EXPECT(
|
||||
votes[voteSlots[i][jss::account].asString()] ==
|
||||
voteSlots[i][jss::trading_fee].asUInt() &&
|
||||
voteSlots[i][jss::vote_weight].asUInt() ==
|
||||
12500))
|
||||
return;
|
||||
votes.erase(voteSlots[i][jss::account].asString());
|
||||
}
|
||||
if (!BEAST_EXPECT(votes.empty()))
|
||||
return;
|
||||
votes.erase(voteSlots[i][jss::account].asString());
|
||||
}
|
||||
if (!BEAST_EXPECT(votes.empty()))
|
||||
return;
|
||||
votes = votesCopy;
|
||||
|
||||
// bid
|
||||
auto const auctionSlot = amm[jss::auction_slot];
|
||||
for (std::uint8_t i = 0; i < 4; ++i)
|
||||
{
|
||||
if (!BEAST_EXPECT(authAccounts.contains(
|
||||
// bid
|
||||
auto const auctionSlot = amm[jss::auction_slot];
|
||||
for (std::uint8_t i = 0; i < 4; ++i)
|
||||
{
|
||||
if (!BEAST_EXPECT(authAccounts.contains(
|
||||
auctionSlot[jss::auth_accounts][i][jss::account]
|
||||
.asString())))
|
||||
return;
|
||||
authAccounts.erase(
|
||||
auctionSlot[jss::auth_accounts][i][jss::account]
|
||||
.asString())))
|
||||
.asString());
|
||||
}
|
||||
if (!BEAST_EXPECT(authAccounts.empty()))
|
||||
return;
|
||||
authAccounts.erase(
|
||||
auctionSlot[jss::auth_accounts][i][jss::account]
|
||||
.asString());
|
||||
BEAST_EXPECT(
|
||||
auctionSlot[jss::account].asString() == alice.human() &&
|
||||
auctionSlot[jss::discounted_fee].asUInt() == 17 &&
|
||||
auctionSlot[jss::price][jss::value].asString() ==
|
||||
"5600" &&
|
||||
auctionSlot[jss::price][jss::currency].asString() ==
|
||||
to_string(ammAlice.lptIssue().currency) &&
|
||||
auctionSlot[jss::price][jss::issuer].asString() ==
|
||||
to_string(ammAlice.lptIssue().account));
|
||||
}
|
||||
catch (std::exception const& e)
|
||||
{
|
||||
fail(e.what(), __FILE__, __LINE__);
|
||||
}
|
||||
if (!BEAST_EXPECT(authAccounts.empty()))
|
||||
return;
|
||||
BEAST_EXPECT(
|
||||
auctionSlot[jss::account].asString() == alice.human() &&
|
||||
auctionSlot[jss::discounted_fee].asUInt() == 17 &&
|
||||
auctionSlot[jss::price][jss::value].asString() == "5600" &&
|
||||
auctionSlot[jss::price][jss::currency].asString() ==
|
||||
to_string(ammAlice.lptIssue().currency) &&
|
||||
auctionSlot[jss::price][jss::issuer].asString() ==
|
||||
to_string(ammAlice.lptIssue().account));
|
||||
}
|
||||
catch (std::exception const& e)
|
||||
{
|
||||
fail(e.what(), __FILE__, __LINE__);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user