Implement amm_info handler (#1060)

Fixes #283
This commit is contained in:
Alex Kremer
2024-01-11 15:57:53 +00:00
committed by GitHub
parent 93d5c12b14
commit f4df5c2185
16 changed files with 1878 additions and 40 deletions

View File

@@ -21,11 +21,13 @@
#include "data/DBHelpers.h"
#include "data/Types.h"
#include "util/Assert.h"
#include <ripple/basics/Blob.h>
#include <ripple/basics/Slice.h>
#include <ripple/basics/base_uint.h>
#include <ripple/basics/chrono.h>
#include <ripple/protocol/AMMCore.h>
#include <ripple/protocol/AccountID.h>
#include <ripple/protocol/Issue.h>
#include <ripple/protocol/LedgerFormats.h>
@@ -52,7 +54,6 @@
#include <vector>
constexpr static auto INDEX1 = "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC";
constexpr static auto CURRENCY = "03930D02208264E2E40EC1B0C09E4DB96EE197B1";
ripple::AccountID
GetAccountIDWithString(std::string_view id)
@@ -60,6 +61,18 @@ GetAccountIDWithString(std::string_view id)
return ripple::parseBase58<ripple::AccountID>(std::string(id)).value();
}
ripple::uint256
GetAccountKey(std::string_view id)
{
return ripple::keylet::account(GetAccountIDWithString(id)).key;
}
ripple::uint256
GetAccountKey(ripple::AccountID const& acc)
{
return ripple::keylet::account(acc).key;
}
ripple::LedgerInfo
CreateLedgerInfo(std::string_view ledgerHash, ripple::LedgerIndex seq, std::optional<uint32_t> age)
{
@@ -801,20 +814,81 @@ CreateAMMObject(
std::string_view assetCurrency,
std::string_view assetIssuer,
std::string_view asset2Currency,
std::string_view asset2Issuer
std::string_view asset2Issuer,
std::string_view lpTokenBalanceIssueCurrency,
uint32_t lpTokenBalanceIssueAmount,
uint16_t tradingFee,
uint64_t ownerNode
)
{
auto amm = ripple::STObject(ripple::sfLedgerEntry);
amm.setFieldU16(ripple::sfLedgerEntryType, ripple::ltAMM);
amm.setAccountID(ripple::sfAccount, GetAccountIDWithString(accountId));
amm.setFieldU16(ripple::sfTradingFee, 5);
amm.setFieldU64(ripple::sfOwnerNode, 0);
amm.setFieldU16(ripple::sfTradingFee, tradingFee);
amm.setFieldU64(ripple::sfOwnerNode, ownerNode);
amm.setFieldIssue(ripple::sfAsset, ripple::STIssue{ripple::sfAsset, GetIssue(assetCurrency, assetIssuer)});
amm.setFieldIssue(ripple::sfAsset2, ripple::STIssue{ripple::sfAsset2, GetIssue(asset2Currency, asset2Issuer)});
ripple::Issue const issue1(
ripple::Currency{CURRENCY}, ripple::parseBase58<ripple::AccountID>(std::string(accountId)).value()
ripple::Currency{lpTokenBalanceIssueCurrency},
ripple::parseBase58<ripple::AccountID>(std::string(accountId)).value()
);
amm.setFieldAmount(ripple::sfLPTokenBalance, ripple::STAmount(issue1, 100));
amm.setFieldAmount(ripple::sfLPTokenBalance, ripple::STAmount(issue1, lpTokenBalanceIssueAmount));
amm.setFieldU32(ripple::sfFlags, 0);
return amm;
}
void
AMMAddVoteSlot(ripple::STObject& amm, ripple::AccountID const& accountId, uint16_t tradingFee, uint32_t voteWeight)
{
if (!amm.isFieldPresent(ripple::sfVoteSlots))
amm.setFieldArray(ripple::sfVoteSlots, ripple::STArray{});
auto& arr = amm.peekFieldArray(ripple::sfVoteSlots);
auto slot = ripple::STObject(ripple::sfVoteEntry);
slot.setAccountID(ripple::sfAccount, accountId);
slot.setFieldU16(ripple::sfTradingFee, tradingFee);
slot.setFieldU32(ripple::sfVoteWeight, voteWeight);
arr.push_back(slot);
}
void
AMMSetAuctionSlot(
ripple::STObject& amm,
ripple::AccountID const& accountId,
ripple::STAmount price,
uint16_t discountedFee,
uint32_t expiration,
std::vector<ripple::AccountID> const& authAccounts
)
{
ASSERT(expiration >= 24 * 3600, "Expiration must be at least 24 hours");
if (!amm.isFieldPresent(ripple::sfAuctionSlot))
amm.makeFieldPresent(ripple::sfAuctionSlot);
auto& auctionSlot = amm.peekFieldObject(ripple::sfAuctionSlot);
auctionSlot.setAccountID(ripple::sfAccount, accountId);
auctionSlot.setFieldAmount(ripple::sfPrice, price);
auctionSlot.setFieldU16(ripple::sfDiscountedFee, discountedFee);
auctionSlot.setFieldU32(ripple::sfExpiration, expiration);
if (not authAccounts.empty()) {
ripple::STArray accounts;
for (auto const& acc : authAccounts) {
ripple::STObject authAcc(ripple::sfAuthAccount);
authAcc.setAccountID(ripple::sfAccount, acc);
accounts.push_back(authAcc);
}
auctionSlot.setFieldArray(ripple::sfAuthAccounts, accounts);
}
}
ripple::Currency
CreateLPTCurrency(std::string_view assetCurrency, std::string_view asset2Currency)
{
return ripple::ammLPTCurrency(
ripple::to_currency(std::string(assetCurrency)), ripple::to_currency(std::string(asset2Currency))
);
}