Compare commits

...

24 Commits

Author SHA1 Message Date
Mayukha Vadari
ec01e14e6c Merge branch 'develop' into copilot/fix-5adea215-d850-4ab8-a595-b04e63e948a6 2025-10-06 11:57:21 -04:00
Mayukha Vadari
3bb3f1b31d Merge branch 'develop' into copilot/fix-5adea215-d850-4ab8-a595-b04e63e948a6 2025-09-23 15:04:11 -04:00
copilot-swe-agent[bot]
4063ccaa09 refactor: replace individual synthetic field functions with insertAllSyntheticInJson helper in simulate RPC
Co-authored-by: mvadari <8029314+mvadari@users.noreply.github.com>
2025-09-11 14:27:29 +00:00
Mayukha Vadari
bb7042388a Merge branch 'develop' into copilot/fix-5adea215-d850-4ab8-a595-b04e63e948a6 2025-09-11 10:20:58 -04:00
Mayukha Vadari
ee3cba2fd9 pre-commit fixes 2025-09-10 11:48:35 -04:00
Mayukha Vadari
539074bdcf [Claude] fix tests 2025-09-10 11:48:35 -04:00
Mayukha Vadari
7e2dcbd221 remove folder structure file 2025-09-10 11:48:35 -04:00
Mayukha Vadari
e79416bc06 remove copilot-setup-steps 2025-09-10 11:48:35 -04:00
Mayukha Vadari
45fdb1b108 [Claude] replace with a helper function 2025-09-10 11:48:35 -04:00
Mayukha Vadari
de84c82d0e [Claude] simplify tests 2025-09-10 11:48:35 -04:00
Mayukha Vadari
376bca2866 [Claude] get tests working 2025-09-10 11:48:34 -04:00
Mayukha Vadari
649fd105f8 [Claude] add folder structure document 2025-09-10 11:48:34 -04:00
copilot-swe-agent[bot]
c491adc46b Fix NFT test failures by handling API version metadata field differences
Co-authored-by: mvadari <8029314+mvadari@users.noreply.github.com>
2025-09-10 11:48:34 -04:00
Mayukha Vadari
ac16c83a9f fix push so it doesn't run twice 2025-09-10 11:48:34 -04:00
Mayukha Vadari
f6d15f3d16 try again 2025-09-10 11:48:34 -04:00
Mayukha Vadari
a8d5d995e1 actual setup steps 2025-09-10 11:48:34 -04:00
Mayukha Vadari
3d8c1a3e58 oops 2025-09-10 11:48:34 -04:00
Mayukha Vadari
2f7cbc4f57 messed up the file 2025-09-10 11:48:34 -04:00
Mayukha Vadari
2e4b30dab5 try adding copilot-setup-steps 2025-09-10 11:48:34 -04:00
copilot-swe-agent[bot]
14ff58aaaa Fix NFT synthetic field insertion for different API versions
Co-authored-by: mvadari <8029314+mvadari@users.noreply.github.com>
2025-09-10 11:48:34 -04:00
copilot-swe-agent[bot]
72bb19c1a3 Fix clang-format violations
Co-authored-by: mvadari <8029314+mvadari@users.noreply.github.com>
2025-09-10 11:48:34 -04:00
copilot-swe-agent[bot]
e26065176b Update NFToken test helpers to include ledger and account_tx RPC checks
Co-authored-by: mvadari <8029314+mvadari@users.noreply.github.com>
2025-09-10 11:48:34 -04:00
copilot-swe-agent[bot]
ed7167c116 Fix missing nftoken_id in ledger RPC response
Co-authored-by: mvadari <8029314+mvadari@users.noreply.github.com>
2025-09-10 11:48:34 -04:00
copilot-swe-agent[bot]
2ccd1082f5 Initial plan 2025-09-10 11:48:34 -04:00
10 changed files with 355 additions and 92 deletions

View File

@@ -31,13 +31,13 @@ namespace ripple {
namespace RPC {
/**
Adds common synthetic fields to transaction-related JSON responses
Adds common synthetic fields to transaction metadata JSON
@{
*/
void
insertNFTSyntheticInJson(
Json::Value&,
Json::Value& metadata,
std::shared_ptr<STTx const> const&,
TxMeta const&);
/** @} */

View File

@@ -32,12 +32,12 @@ namespace RPC {
void
insertNFTSyntheticInJson(
Json::Value& response,
Json::Value& metadata,
std::shared_ptr<STTx const> const& transaction,
TxMeta const& transactionMeta)
{
insertNFTokenID(response[jss::meta], transaction, transactionMeta);
insertNFTokenOfferID(response[jss::meta], transaction, transactionMeta);
insertNFTokenID(metadata, transaction, transactionMeta);
insertNFTokenOfferID(metadata, transaction, transactionMeta);
}
} // namespace RPC

View File

@@ -6894,60 +6894,235 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite
env.tx()->getJson(JsonOptions::none)[jss::hash].asString()};
env.close();
Json::Value const meta =
env.rpc("tx", txHash)[jss::result][jss::meta];
// Expect nftokens_id field
if (!BEAST_EXPECT(meta.isMember(jss::nftoken_id)))
// Test 1: Check tx RPC response
Json::Value const txResult = env.rpc("tx", txHash)[jss::result];
Json::Value const& txMeta = txResult[jss::meta];
// Expect nftoken_id field
if (!BEAST_EXPECT(txMeta.isMember(jss::nftoken_id)))
return;
// Check the value of NFT ID in the meta with the
// actual value
// Check the value of NFT ID matches
uint256 nftID;
BEAST_EXPECT(nftID.parseHex(meta[jss::nftoken_id].asString()));
BEAST_EXPECT(nftID.parseHex(txMeta[jss::nftoken_id].asString()));
BEAST_EXPECT(nftID == actualNftID);
// Get ledger sequence from tx response
auto const ledgerSeq = txResult[jss::ledger_index].asUInt();
// Test 2: Check ledger RPC response with expanded transactions
Json::Value ledgerParams;
ledgerParams[jss::ledger_index] = ledgerSeq;
ledgerParams[jss::transactions] = true;
ledgerParams[jss::expand] = true;
auto const ledgerResult =
env.rpc("json", "ledger", to_string(ledgerParams));
auto const& tx =
ledgerResult[jss::result][jss::ledger][jss::transactions][0u];
// Verify transaction hash matches
BEAST_EXPECT(tx[jss::hash].asString() == txHash);
// Check synthetic fields in ledger response (this tests our
// LedgerToJson.cpp fix)
Json::Value const* meta = nullptr;
if (tx.isMember(jss::meta))
meta = &tx[jss::meta];
else if (tx.isMember(jss::metaData))
meta = &tx[jss::metaData];
if (BEAST_EXPECT(meta != nullptr))
{
BEAST_EXPECT(meta->isMember(jss::nftoken_id));
if (meta->isMember(jss::nftoken_id))
{
uint256 ledgerNftId;
BEAST_EXPECT(ledgerNftId.parseHex(
(*meta)[jss::nftoken_id].asString()));
BEAST_EXPECT(ledgerNftId == actualNftID);
}
}
// Test 3: Check account_tx RPC response
Json::Value accountTxParams;
accountTxParams[jss::account] = alice.human();
accountTxParams[jss::limit] = 1;
auto const accountTxResult =
env.rpc("json", "account_tx", to_string(accountTxParams));
auto const& accountTx =
accountTxResult[jss::result][jss::transactions][0u];
// Check if the latest transaction is ours (it should be, but
// account_tx can be ordering-dependent)
bool isOurTransaction = (accountTx[jss::hash].asString() == txHash);
// Only check synthetic fields if this is our transaction
if (isOurTransaction)
{
// Check synthetic fields in account_tx response
Json::Value const* accountMeta = nullptr;
if (accountTx.isMember(jss::meta))
accountMeta = &accountTx[jss::meta];
else if (accountTx.isMember(jss::metaData))
accountMeta = &accountTx[jss::metaData];
if (BEAST_EXPECT(accountMeta != nullptr))
{
BEAST_EXPECT(accountMeta->isMember(jss::nftoken_id));
if (accountMeta->isMember(jss::nftoken_id))
{
uint256 accountNftId;
BEAST_EXPECT(accountNftId.parseHex(
(*accountMeta)[jss::nftoken_id].asString()));
BEAST_EXPECT(accountNftId == actualNftID);
}
}
}
};
// Verify `nftoken_ids` value equals to the NFTokenIDs that were
// changed in the most recent NFTokenCancelOffer transaction
auto verifyNFTokenIDsInCancelOffer =
[&](std::vector<uint256> actualNftIDs) {
// Get the hash for the most recent transaction.
std::string const txHash{
env.tx()->getJson(JsonOptions::none)[jss::hash].asString()};
auto verifyNFTokenIDsInCancelOffer = [&](std::vector<uint256>
actualNftIDs) {
// Get the hash for the most recent transaction.
std::string const txHash{
env.tx()->getJson(JsonOptions::none)[jss::hash].asString()};
env.close();
Json::Value const meta =
env.rpc("tx", txHash)[jss::result][jss::meta];
env.close();
// Expect nftokens_ids field and verify the values
if (!BEAST_EXPECT(meta.isMember(jss::nftoken_ids)))
return;
// Test 1: Check tx RPC response
Json::Value const txResult = env.rpc("tx", txHash)[jss::result];
Json::Value const& txMeta = txResult[jss::meta];
// Convert NFT IDs from Json::Value to uint256
std::vector<uint256> metaIDs;
std::transform(
meta[jss::nftoken_ids].begin(),
meta[jss::nftoken_ids].end(),
std::back_inserter(metaIDs),
[this](Json::Value id) {
uint256 nftID;
BEAST_EXPECT(nftID.parseHex(id.asString()));
return nftID;
});
// Expect nftokens_ids field and verify the values
if (!BEAST_EXPECT(txMeta.isMember(jss::nftoken_ids)))
return;
// Sort both array to prepare for comparison
std::sort(metaIDs.begin(), metaIDs.end());
std::sort(actualNftIDs.begin(), actualNftIDs.end());
// Convert NFT IDs from Json::Value to uint256
std::vector<uint256> metaIDs;
std::transform(
txMeta[jss::nftoken_ids].begin(),
txMeta[jss::nftoken_ids].end(),
std::back_inserter(metaIDs),
[this](Json::Value id) {
uint256 nftID;
BEAST_EXPECT(nftID.parseHex(id.asString()));
return nftID;
});
// Make sure the expect number of NFTs is correct
BEAST_EXPECT(metaIDs.size() == actualNftIDs.size());
// Sort both array to prepare for comparison
std::sort(metaIDs.begin(), metaIDs.end());
std::sort(actualNftIDs.begin(), actualNftIDs.end());
// Check the value of NFT ID in the meta with the
// actual values
for (size_t i = 0; i < metaIDs.size(); ++i)
BEAST_EXPECT(metaIDs[i] == actualNftIDs[i]);
};
// Make sure the expect number of NFTs is correct
BEAST_EXPECT(metaIDs.size() == actualNftIDs.size());
// Check the value of NFT ID in the meta with the
// actual values
for (size_t i = 0; i < metaIDs.size(); ++i)
BEAST_EXPECT(metaIDs[i] == actualNftIDs[i]);
// Get ledger sequence from tx response
auto const ledgerSeq = txResult[jss::ledger_index].asUInt();
// Test 2: Check ledger RPC response with expanded transactions
Json::Value ledgerParams;
ledgerParams[jss::ledger_index] = ledgerSeq;
ledgerParams[jss::transactions] = true;
ledgerParams[jss::expand] = true;
auto const ledgerResult =
env.rpc("json", "ledger", to_string(ledgerParams));
auto const& tx =
ledgerResult[jss::result][jss::ledger][jss::transactions][0u];
// Verify transaction hash matches
BEAST_EXPECT(tx[jss::hash].asString() == txHash);
// Check synthetic fields in ledger response
Json::Value const* meta = nullptr;
if (tx.isMember(jss::meta))
meta = &tx[jss::meta];
else if (tx.isMember(jss::metaData))
meta = &tx[jss::metaData];
if (BEAST_EXPECT(meta != nullptr))
{
BEAST_EXPECT(meta->isMember(jss::nftoken_ids));
if (meta->isMember(jss::nftoken_ids))
{
// Convert and verify NFT IDs in ledger response
std::vector<uint256> ledgerMetaIDs;
std::transform(
(*meta)[jss::nftoken_ids].begin(),
(*meta)[jss::nftoken_ids].end(),
std::back_inserter(ledgerMetaIDs),
[this](Json::Value id) {
uint256 nftID;
BEAST_EXPECT(nftID.parseHex(id.asString()));
return nftID;
});
std::sort(ledgerMetaIDs.begin(), ledgerMetaIDs.end());
BEAST_EXPECT(ledgerMetaIDs.size() == actualNftIDs.size());
for (size_t i = 0; i < ledgerMetaIDs.size(); ++i)
BEAST_EXPECT(ledgerMetaIDs[i] == actualNftIDs[i]);
}
}
// Test 3: Check account_tx RPC response
Json::Value accountTxParams;
accountTxParams[jss::account] = alice.human();
accountTxParams[jss::limit] = 1;
auto const accountTxResult =
env.rpc("json", "account_tx", to_string(accountTxParams));
auto const& accountTx =
accountTxResult[jss::result][jss::transactions][0u];
// Check if the latest transaction is ours (it should be, but
// account_tx can be ordering-dependent)
bool isOurTransaction = (accountTx[jss::hash].asString() == txHash);
// Only check synthetic fields if this is our transaction
if (isOurTransaction)
{
// Check synthetic fields in account_tx response
Json::Value const* accountMeta = nullptr;
if (accountTx.isMember(jss::meta))
accountMeta = &accountTx[jss::meta];
else if (accountTx.isMember(jss::metaData))
accountMeta = &accountTx[jss::metaData];
if (BEAST_EXPECT(accountMeta != nullptr))
{
BEAST_EXPECT(accountMeta->isMember(jss::nftoken_ids));
if (accountMeta->isMember(jss::nftoken_ids))
{
// Convert and verify NFT IDs in account_tx response
std::vector<uint256> accountMetaIDs;
std::transform(
(*accountMeta)[jss::nftoken_ids].begin(),
(*accountMeta)[jss::nftoken_ids].end(),
std::back_inserter(accountMetaIDs),
[this](Json::Value id) {
uint256 nftID;
BEAST_EXPECT(nftID.parseHex(id.asString()));
return nftID;
});
std::sort(accountMetaIDs.begin(), accountMetaIDs.end());
BEAST_EXPECT(
accountMetaIDs.size() == actualNftIDs.size());
for (size_t i = 0; i < accountMetaIDs.size(); ++i)
BEAST_EXPECT(accountMetaIDs[i] == actualNftIDs[i]);
}
}
}
};
// Verify `offer_id` value equals to the offerID that was
// changed in the most recent NFTokenCreateOffer tx

View File

@@ -22,11 +22,11 @@
#include <xrpld/app/misc/DeliverMax.h>
#include <xrpld/app/misc/TxQ.h>
#include <xrpld/rpc/Context.h>
#include <xrpld/rpc/DeliveredAmount.h>
#include <xrpld/rpc/MPTokenIssuanceID.h>
#include <xrpld/rpc/detail/SyntheticFields.h>
#include <xrpl/basics/base_uint.h>
#include <xrpl/protocol/ApiVersion.h>
#include <xrpl/protocol/NFTSyntheticSerializer.h>
#include <xrpl/protocol/jss.h>
namespace ripple {
@@ -150,17 +150,10 @@ fillJsonTx(
{
txJson[jss::meta] = stMeta->getJson(JsonOptions::none);
// If applicable, insert delivered amount
if (txnType == ttPAYMENT || txnType == ttCHECK_CASH)
RPC::insertDeliveredAmount(
txJson[jss::meta],
fill.ledger,
txn,
{txn->getTransactionID(), fill.ledger.seq(), *stMeta});
// If applicable, insert mpt issuance id
RPC::insertMPTokenIssuanceID(
// Insert all synthetic fields
RPC::insertAllSyntheticInJson(
txJson[jss::meta],
fill.ledger,
txn,
{txn->getTransactionID(), fill.ledger.seq(), *stMeta});
}
@@ -187,17 +180,10 @@ fillJsonTx(
{
txJson[jss::metaData] = stMeta->getJson(JsonOptions::none);
// If applicable, insert delivered amount
if (txnType == ttPAYMENT || txnType == ttCHECK_CASH)
RPC::insertDeliveredAmount(
txJson[jss::metaData],
fill.ledger,
txn,
{txn->getTransactionID(), fill.ledger.seq(), *stMeta});
// If applicable, insert mpt issuance id
RPC::insertMPTokenIssuanceID(
// Insert all synthetic fields
RPC::insertAllSyntheticInJson(
txJson[jss::metaData],
fill.ledger,
txn,
{txn->getTransactionID(), fill.ledger.seq(), *stMeta});
}

View File

@@ -49,9 +49,8 @@
#include <xrpld/perflog/PerfLog.h>
#include <xrpld/rpc/BookChanges.h>
#include <xrpld/rpc/CTID.h>
#include <xrpld/rpc/DeliveredAmount.h>
#include <xrpld/rpc/MPTokenIssuanceID.h>
#include <xrpld/rpc/ServerHandler.h>
#include <xrpld/rpc/detail/SyntheticFields.h>
#include <xrpl/basics/UptimeClock.h>
#include <xrpl/basics/mulDiv.h>
@@ -3274,11 +3273,8 @@ NetworkOPsImp::transJson(
if (meta)
{
jvObj[jss::meta] = meta->get().getJson(JsonOptions::none);
RPC::insertDeliveredAmount(
RPC::insertAllSyntheticInJson(
jvObj[jss::meta], *ledger, transaction, meta->get());
RPC::insertNFTSyntheticInJson(jvObj, transaction, meta->get());
RPC::insertMPTokenIssuanceID(
jvObj[jss::meta], transaction, meta->get());
}
// add CTID where the needed data for it exists

View File

@@ -0,0 +1,56 @@
//------------------------------------------------------------------------------
/*
This file is part of rippled: https://github.com/ripple/rippled
Copyright (c) 2023 Ripple Labs Inc.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
//==============================================================================
#include <xrpld/rpc/DeliveredAmount.h>
#include <xrpld/rpc/MPTokenIssuanceID.h>
#include <xrpld/rpc/detail/SyntheticFields.h>
#include <xrpl/json/json_value.h>
#include <xrpl/protocol/NFTSyntheticSerializer.h>
#include <xrpl/protocol/jss.h>
namespace ripple {
namespace RPC {
void
insertAllSyntheticInJson(
Json::Value& metadata,
ReadView const& ledger,
std::shared_ptr<STTx const> const& transaction,
TxMeta const& transactionMeta)
{
insertDeliveredAmount(metadata, ledger, transaction, transactionMeta);
insertNFTSyntheticInJson(metadata, transaction, transactionMeta);
insertMPTokenIssuanceID(metadata, transaction, transactionMeta);
}
void
insertAllSyntheticInJson(
Json::Value& metadata,
JsonContext const& context,
std::shared_ptr<STTx const> const& transaction,
TxMeta const& transactionMeta)
{
insertDeliveredAmount(metadata, context, transaction, transactionMeta);
insertNFTSyntheticInJson(metadata, transaction, transactionMeta);
insertMPTokenIssuanceID(metadata, transaction, transactionMeta);
}
} // namespace RPC
} // namespace ripple

View File

@@ -0,0 +1,62 @@
//------------------------------------------------------------------------------
/*
This file is part of rippled: https://github.com/ripple/rippled
Copyright (c) 2023 Ripple Labs Inc.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
//==============================================================================
#ifndef RIPPLE_RPC_DETAIL_SYNTHETICFIELDS_H_INCLUDED
#define RIPPLE_RPC_DETAIL_SYNTHETICFIELDS_H_INCLUDED
#include <xrpl/json/json_forwards.h>
#include <xrpl/protocol/STTx.h>
#include <xrpl/protocol/TxMeta.h>
#include <memory>
namespace ripple {
class ReadView;
namespace RPC {
struct JsonContext;
/**
Adds all synthetic fields to transaction metadata JSON.
This includes delivered amount, NFT synthetic fields, and MPToken issuance
ID.
@{
*/
void
insertAllSyntheticInJson(
Json::Value& metadata,
ReadView const&,
std::shared_ptr<STTx const> const&,
TxMeta const&);
void
insertAllSyntheticInJson(
Json::Value& metadata,
JsonContext const&,
std::shared_ptr<STTx const> const&,
TxMeta const&);
/** @} */
} // namespace RPC
} // namespace ripple
#endif

View File

@@ -23,9 +23,8 @@
#include <xrpld/app/misc/Transaction.h>
#include <xrpld/app/rdb/backend/SQLiteDatabase.h>
#include <xrpld/rpc/Context.h>
#include <xrpld/rpc/DeliveredAmount.h>
#include <xrpld/rpc/MPTokenIssuanceID.h>
#include <xrpld/rpc/Role.h>
#include <xrpld/rpc/detail/SyntheticFields.h>
#include <xrpl/json/json_value.h>
#include <xrpl/ledger/ReadView.h>
@@ -346,11 +345,8 @@ populateJsonResponse(
{
jvObj[jss::meta] =
txnMeta->getJson(JsonOptions::include_date);
insertDeliveredAmount(
jvObj[jss::meta], context, txn, *txnMeta);
RPC::insertNFTSyntheticInJson(jvObj, sttx, *txnMeta);
RPC::insertMPTokenIssuanceID(
jvObj[jss::meta], sttx, *txnMeta);
RPC::insertAllSyntheticInJson(
jvObj[jss::meta], context, sttx, *txnMeta);
}
else
UNREACHABLE(

View File

@@ -27,6 +27,7 @@
#include <xrpld/rpc/DeliveredAmount.h>
#include <xrpld/rpc/GRPCHandlers.h>
#include <xrpld/rpc/MPTokenIssuanceID.h>
#include <xrpld/rpc/detail/SyntheticFields.h>
#include <xrpld/rpc/detail/TransactionSign.h>
#include <xrpl/protocol/ErrorCodes.h>
@@ -275,17 +276,11 @@ simulateTxn(RPC::JsonContext& context, std::shared_ptr<Transaction> transaction)
else
{
jvResult[jss::meta] = result.metadata->getJson(JsonOptions::none);
RPC::insertDeliveredAmount(
RPC::insertAllSyntheticInJson(
jvResult[jss::meta],
view,
transaction->getSTransaction(),
*result.metadata);
RPC::insertNFTSyntheticInJson(
jvResult, transaction->getSTransaction(), *result.metadata);
RPC::insertMPTokenIssuanceID(
jvResult[jss::meta],
transaction->getSTransaction(),
*result.metadata);
}
}

View File

@@ -25,10 +25,9 @@
#include <xrpld/app/rdb/RelationalDatabase.h>
#include <xrpld/rpc/CTID.h>
#include <xrpld/rpc/Context.h>
#include <xrpld/rpc/DeliveredAmount.h>
#include <xrpld/rpc/GRPCHandlers.h>
#include <xrpld/rpc/MPTokenIssuanceID.h>
#include <xrpld/rpc/detail/RPCHelpers.h>
#include <xrpld/rpc/detail/SyntheticFields.h>
#include <xrpl/basics/ToString.h>
#include <xrpl/protocol/ErrorCodes.h>
@@ -268,10 +267,8 @@ populateJsonResponse(
if (meta)
{
response[jss::meta] = meta->getJson(JsonOptions::none);
insertDeliveredAmount(
response[jss::meta], context, result.txn, *meta);
RPC::insertNFTSyntheticInJson(response, sttx, *meta);
RPC::insertMPTokenIssuanceID(response[jss::meta], sttx, *meta);
RPC::insertAllSyntheticInJson(
response[jss::meta], context, sttx, *meta);
}
}
response[jss::validated] = result.validated;