66 auto const& params(context.
params);
74 struct ValuesFromContextParams
82 auto getValuesFromContextParams = [&]() -> std::expected<ValuesFromContextParams, ErrorCodeI> {
88 static constexpr auto kInvalid = [](
json::Value const& params) ->
bool {
89 return (params.isMember(jss::asset) != params.isMember(jss::asset2)) ||
90 (params.isMember(jss::asset) == params.isMember(jss::amm_account));
94 if (context.
apiVersion < 3 && kInvalid(params))
97 if (params.isMember(jss::asset))
99 if (
auto const i =
getAsset(params[jss::asset], context.
j))
109 if (params.isMember(jss::asset2))
111 if (
auto const i =
getAsset(params[jss::asset2], context.
j))
121 if (params.isMember(jss::amm_account))
123 auto const& ammAccount = params[jss::amm_account];
124 if (!ammAccount.isString())
132 ammID = sle->getFieldH256(sfAMMID);
137 if (params.isMember(jss::account))
139 auto const& localAccount = params[jss::account];
140 if (!localAccount.isString())
148 if (context.
apiVersion >= 3 && kInvalid(params))
153 "xrpl::doAMMInfo : asset1 and asset2 do match");
155 auto const ammKeylet = [&]() {
156 if (asset1 && asset2)
158 XRPL_ASSERT(ammID,
"xrpl::doAMMInfo::ammKeylet : ammID is set");
161 auto const amm = ledger->read(ammKeylet);
164 if (!asset1 && !asset2)
166 asset1 = (*amm)[sfAsset];
167 asset2 = (*amm)[sfAsset2];
170 return ValuesFromContextParams{
171 .accountID = accountID, .asset1 = *asset1, .asset2 = *asset2, .amm = amm};
174 auto const r = getValuesFromContextParams();
181 auto const& [accountID, asset1, asset2, amm] = *r;
183 auto const ammAccountID = amm->getAccountID(sfAccount);
186 auto const [asset1Balance, asset2Balance] =
ammPoolHolds(
194 auto const lptAMMBalance =
195 accountID ?
ammLPHolds(*ledger, *amm, *accountID, context.
j) : (*amm)[sfLPTokenBalance];
198 asset1Balance.setJson(ammResult[jss::amount]);
199 asset2Balance.setJson(ammResult[jss::amount2]);
200 lptAMMBalance.setJson(ammResult[jss::lp_token]);
201 ammResult[jss::trading_fee] = (*amm)[sfTradingFee];
202 ammResult[jss::account] =
to_string(ammAccountID);
204 if (amm->isFieldPresent(sfVoteSlots))
206 for (
auto const& voteEntry : amm->getFieldArray(sfVoteSlots))
209 vote[jss::account] =
to_string(voteEntry.getAccountID(sfAccount));
210 vote[jss::trading_fee] = voteEntry[sfTradingFee];
211 vote[jss::vote_weight] = voteEntry[sfVoteWeight];
212 voteSlots.
append(std::move(vote));
215 if (voteSlots.
size() > 0)
216 ammResult[jss::vote_slots] = std::move(voteSlots);
218 !ledger->rules().enabled(fixInnerObjTemplate) || amm->isFieldPresent(sfAuctionSlot),
219 "xrpl::doAMMInfo : auction slot is set");
220 if (amm->isFieldPresent(sfAuctionSlot))
223 if (auctionSlot.isFieldPresent(sfAccount))
227 ledger->header().parentCloseTime.time_since_epoch().count(), auctionSlot);
229 auctionSlot[sfPrice].setJson(auction[jss::price]);
230 auction[jss::discounted_fee] = auctionSlot[sfDiscountedFee];
231 auction[jss::account] =
to_string(auctionSlot.getAccountID(sfAccount));
232 auction[jss::expiration] =
234 if (auctionSlot.isFieldPresent(sfAuthAccounts))
237 for (
auto const& acct : auctionSlot.getFieldArray(sfAuthAccounts))
240 jv[jss::account] =
to_string(acct.getAccountID(sfAccount));
243 auction[jss::auth_accounts] = auth;
245 ammResult[jss::auction_slot] = std::move(auction);
249 if (!
isXRP(asset1Balance))
251 ammResult[jss::asset_frozen] =
isFrozen(*ledger, ammAccountID, asset1);
253 if (!
isXRP(asset2Balance))
255 ammResult[jss::asset2_frozen] =
isFrozen(*ledger, ammAccountID, asset2);
258 result[jss::amm] = std::move(ammResult);
259 if (!result.
isMember(jss::ledger_index) && !result.
isMember(jss::ledger_hash))
260 result[jss::ledger_current_index] = ledger->header().seq;
std::shared_ptr< STLedgerEntry const > const_pointer
LedgerMaster & ledgerMaster