mirror of
https://github.com/XRPLF/clio.git
synced 2025-11-04 11:55:51 +00:00
fix: add nft_id and offer_id to txn stream (#2335)
fixes #1804 Co-authored-by: Alex Kremer <akremer@ripple.com> Co-authored-by: Ayaz Salikhov <mathbunnyru@users.noreply.github.com>
This commit is contained in:
@@ -33,10 +33,12 @@
|
|||||||
#include <boost/json/serialize.hpp>
|
#include <boost/json/serialize.hpp>
|
||||||
#include <xrpl/basics/chrono.h>
|
#include <xrpl/basics/chrono.h>
|
||||||
#include <xrpl/basics/strHex.h>
|
#include <xrpl/basics/strHex.h>
|
||||||
|
#include <xrpl/json/json_value.h>
|
||||||
#include <xrpl/protocol/AccountID.h>
|
#include <xrpl/protocol/AccountID.h>
|
||||||
#include <xrpl/protocol/Book.h>
|
#include <xrpl/protocol/Book.h>
|
||||||
#include <xrpl/protocol/LedgerFormats.h>
|
#include <xrpl/protocol/LedgerFormats.h>
|
||||||
#include <xrpl/protocol/LedgerHeader.h>
|
#include <xrpl/protocol/LedgerHeader.h>
|
||||||
|
#include <xrpl/protocol/NFTSyntheticSerializer.h>
|
||||||
#include <xrpl/protocol/SField.h>
|
#include <xrpl/protocol/SField.h>
|
||||||
#include <xrpl/protocol/STObject.h>
|
#include <xrpl/protocol/STObject.h>
|
||||||
#include <xrpl/protocol/TER.h>
|
#include <xrpl/protocol/TER.h>
|
||||||
@@ -207,6 +209,15 @@ TransactionFeed::pub(
|
|||||||
rpc::insertDeliverMaxAlias(pubObj[txKey].as_object(), version);
|
rpc::insertDeliverMaxAlias(pubObj[txKey].as_object(), version);
|
||||||
rpc::insertMPTIssuanceID(pubObj[JS(meta)].as_object(), tx, meta);
|
rpc::insertMPTIssuanceID(pubObj[JS(meta)].as_object(), tx, meta);
|
||||||
|
|
||||||
|
Json::Value nftJson;
|
||||||
|
ripple::insertNFTSyntheticInJson(nftJson, tx, *meta);
|
||||||
|
auto const nftBoostJson = rpc::toBoostJson(nftJson).as_object();
|
||||||
|
if (nftBoostJson.contains(JS(meta)) && nftBoostJson.at(JS(meta)).is_object()) {
|
||||||
|
auto& metaObjInPub = pubObj.at(JS(meta)).as_object();
|
||||||
|
for (auto const& [k, v] : nftBoostJson.at(JS(meta)).as_object())
|
||||||
|
metaObjInPub.insert_or_assign(k, v);
|
||||||
|
}
|
||||||
|
|
||||||
auto const& metaObj = pubObj[JS(meta)];
|
auto const& metaObj = pubObj[JS(meta)];
|
||||||
ASSERT(metaObj.is_object(), "meta must be an obj in rippled and clio");
|
ASSERT(metaObj.is_object(), "meta must be an obj in rippled and clio");
|
||||||
if (metaObj.as_object().contains("TransactionIndex") && metaObj.as_object().at("TransactionIndex").is_int64()) {
|
if (metaObj.as_object().contains("TransactionIndex") && metaObj.as_object().at("TransactionIndex").is_int64()) {
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
|
|
||||||
#include <gmock/gmock.h>
|
#include <gmock/gmock.h>
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
#include <xrpl/basics/Slice.h>
|
||||||
#include <xrpl/basics/base_uint.h>
|
#include <xrpl/basics/base_uint.h>
|
||||||
#include <xrpl/protocol/AccountID.h>
|
#include <xrpl/protocol/AccountID.h>
|
||||||
#include <xrpl/protocol/Book.h>
|
#include <xrpl/protocol/Book.h>
|
||||||
@@ -40,6 +41,7 @@
|
|||||||
#include <xrpl/protocol/STAmount.h>
|
#include <xrpl/protocol/STAmount.h>
|
||||||
#include <xrpl/protocol/STObject.h>
|
#include <xrpl/protocol/STObject.h>
|
||||||
#include <xrpl/protocol/TER.h>
|
#include <xrpl/protocol/TER.h>
|
||||||
|
#include <xrpl/protocol/TxFormats.h>
|
||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
@@ -52,13 +54,14 @@ namespace {
|
|||||||
|
|
||||||
constexpr auto kACCOUNT1 = "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn";
|
constexpr auto kACCOUNT1 = "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn";
|
||||||
constexpr auto kACCOUNT2 = "rLEsXccBGNR3UPuPu2hUXPjziKC3qKSBun";
|
constexpr auto kACCOUNT2 = "rLEsXccBGNR3UPuPu2hUXPjziKC3qKSBun";
|
||||||
constexpr auto kLEDGER_HASH = "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC";
|
constexpr auto kLEDGER_HASH = "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652";
|
||||||
constexpr auto kCURRENCY = "0158415500000000C1F76FF6ECB0BAC600000000";
|
constexpr auto kCURRENCY = "0158415500000000C1F76FF6ECB0BAC600000000";
|
||||||
constexpr auto kISSUER = "rK9DrarGKnVEo2nYp5MfVRXRYf5yRX3mwD";
|
constexpr auto kISSUER = "rK9DrarGKnVEo2nYp5MfVRXRYf5yRX3mwD";
|
||||||
constexpr auto kTXN_ID = "E6DBAFC99223B42257915A63DFC6B0C032D4070F9A574B255AD97466726FC321";
|
constexpr auto kTXN_ID = "E6DBAFC99223B42257915A63DFC6B0C032D4070F9A574B255AD97466726FC321";
|
||||||
constexpr auto kAMM_ACCOUNT = "rnW8FAPgpQgA6VoESnVrUVJHBdq9QAtRZs";
|
constexpr auto kAMM_ACCOUNT = "rnW8FAPgpQgA6VoESnVrUVJHBdq9QAtRZs";
|
||||||
constexpr auto kLPTOKEN_CURRENCY = "037C35306B24AAB7FF90848206E003279AA47090";
|
constexpr auto kLPTOKEN_CURRENCY = "037C35306B24AAB7FF90848206E003279AA47090";
|
||||||
constexpr auto kNETWORK_ID = 0u;
|
constexpr auto kNETWORK_ID = 0u;
|
||||||
|
constexpr auto kNFT_MINT_ID = "000B013A95F14B0044F78A264E41713C64B5F89242540EE208C3098E00000D65";
|
||||||
|
|
||||||
constexpr auto kTRAN_V1 =
|
constexpr auto kTRAN_V1 =
|
||||||
R"JSON({
|
R"JSON({
|
||||||
@@ -105,7 +108,7 @@ constexpr auto kTRAN_V1 =
|
|||||||
"status": "closed",
|
"status": "closed",
|
||||||
"ledger_index": 33,
|
"ledger_index": 33,
|
||||||
"close_time_iso": "2000-01-01T00:00:00Z",
|
"close_time_iso": "2000-01-01T00:00:00Z",
|
||||||
"ledger_hash": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC",
|
"ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652",
|
||||||
"engine_result_code": 0,
|
"engine_result_code": 0,
|
||||||
"engine_result": "tesSUCCESS",
|
"engine_result": "tesSUCCESS",
|
||||||
"engine_result_message": "The transaction was applied. Only final in a validated ledger."
|
"engine_result_message": "The transaction was applied. Only final in a validated ledger."
|
||||||
@@ -154,13 +157,76 @@ constexpr auto kTRAN_V2 =
|
|||||||
"status": "closed",
|
"status": "closed",
|
||||||
"ledger_index": 33,
|
"ledger_index": 33,
|
||||||
"close_time_iso": "2000-01-01T00:00:00Z",
|
"close_time_iso": "2000-01-01T00:00:00Z",
|
||||||
"ledger_hash": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC",
|
"ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652",
|
||||||
"hash": "51D2AAA6B8E4E16EF22F6424854283D8391B56875858A711B8CE4D5B9A422CC2",
|
"hash": "51D2AAA6B8E4E16EF22F6424854283D8391B56875858A711B8CE4D5B9A422CC2",
|
||||||
"engine_result_code": 0,
|
"engine_result_code": 0,
|
||||||
"engine_result": "tesSUCCESS",
|
"engine_result": "tesSUCCESS",
|
||||||
"engine_result_message": "The transaction was applied. Only final in a validated ledger."
|
"engine_result_message": "The transaction was applied. Only final in a validated ledger."
|
||||||
})JSON";
|
})JSON";
|
||||||
|
|
||||||
|
constexpr auto kNFT_MINT_TRAN_V1 =
|
||||||
|
R"JSON({
|
||||||
|
"transaction":
|
||||||
|
{
|
||||||
|
"Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
|
||||||
|
"Fee": "12",
|
||||||
|
"NFTokenTaxon": 123,
|
||||||
|
"Sequence": 1,
|
||||||
|
"SigningPubKey": "74657374",
|
||||||
|
"TransactionType": "NFTokenMint",
|
||||||
|
"hash": "D279CDCA424E5A62A67D98B7E15BCC7AE6E162F19BBAE26E1C7D957109452D0E",
|
||||||
|
"date": 0
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"AffectedNodes": [
|
||||||
|
{
|
||||||
|
"ModifiedNode": {
|
||||||
|
"FinalFields": {
|
||||||
|
"NFTokens": [
|
||||||
|
{
|
||||||
|
"NFToken": {
|
||||||
|
"NFTokenID": "000B013A95F14B0044F78A264E41713C64B5F89242540EE208C3098E00000D65",
|
||||||
|
"URI": "7465737475726C"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"NFToken": {
|
||||||
|
"NFTokenID": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC",
|
||||||
|
"URI": "7465737475726C"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"LedgerEntryType": "NFTokenPage",
|
||||||
|
"PreviousFields": {
|
||||||
|
"NFTokens": [
|
||||||
|
{
|
||||||
|
"NFToken": {
|
||||||
|
"NFTokenID": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC",
|
||||||
|
"URI": "7465737475726C"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"TransactionIndex": 0,
|
||||||
|
"TransactionResult": "tesSUCCESS",
|
||||||
|
"nftoken_id": "000B013A95F14B0044F78A264E41713C64B5F89242540EE208C3098E00000D65"
|
||||||
|
},
|
||||||
|
"ctid": "C000002100000000",
|
||||||
|
"type": "transaction",
|
||||||
|
"validated": true,
|
||||||
|
"status": "closed",
|
||||||
|
"ledger_index": 33,
|
||||||
|
"close_time_iso": "2000-01-01T00:00:00Z",
|
||||||
|
"ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652",
|
||||||
|
"engine_result_code": 0,
|
||||||
|
"engine_result": "tesSUCCESS",
|
||||||
|
"engine_result_message": "The transaction was applied. Only final in a validated ledger."
|
||||||
|
})JSON";
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
using namespace feed::impl;
|
using namespace feed::impl;
|
||||||
@@ -403,7 +469,7 @@ TEST_F(FeedTransactionTest, SubBookV1)
|
|||||||
"validated": true,
|
"validated": true,
|
||||||
"status": "closed",
|
"status": "closed",
|
||||||
"ledger_index": 33,
|
"ledger_index": 33,
|
||||||
"ledger_hash": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC",
|
"ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652",
|
||||||
"engine_result_code": 0,
|
"engine_result_code": 0,
|
||||||
"engine_result": "tesSUCCESS",
|
"engine_result": "tesSUCCESS",
|
||||||
"close_time_iso": "2000-01-01T00:00:00Z",
|
"close_time_iso": "2000-01-01T00:00:00Z",
|
||||||
@@ -457,7 +523,7 @@ TEST_F(FeedTransactionTest, SubBookV1)
|
|||||||
"validated": true,
|
"validated": true,
|
||||||
"status": "closed",
|
"status": "closed",
|
||||||
"ledger_index": 33,
|
"ledger_index": 33,
|
||||||
"ledger_hash": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC",
|
"ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652",
|
||||||
"engine_result_code": 0,
|
"engine_result_code": 0,
|
||||||
"engine_result": "tesSUCCESS",
|
"engine_result": "tesSUCCESS",
|
||||||
"close_time_iso": "2000-01-01T00:00:00Z",
|
"close_time_iso": "2000-01-01T00:00:00Z",
|
||||||
@@ -508,7 +574,7 @@ TEST_F(FeedTransactionTest, SubBookV1)
|
|||||||
"validated": true,
|
"validated": true,
|
||||||
"status": "closed",
|
"status": "closed",
|
||||||
"ledger_index": 33,
|
"ledger_index": 33,
|
||||||
"ledger_hash": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC",
|
"ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652",
|
||||||
"engine_result_code": 0,
|
"engine_result_code": 0,
|
||||||
"engine_result": "tesSUCCESS",
|
"engine_result": "tesSUCCESS",
|
||||||
"close_time_iso": "2000-01-01T00:00:00Z",
|
"close_time_iso": "2000-01-01T00:00:00Z",
|
||||||
@@ -590,7 +656,7 @@ TEST_F(FeedTransactionTest, SubBookV2)
|
|||||||
"validated": true,
|
"validated": true,
|
||||||
"status": "closed",
|
"status": "closed",
|
||||||
"ledger_index": 33,
|
"ledger_index": 33,
|
||||||
"ledger_hash": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC",
|
"ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652",
|
||||||
"engine_result_code": 0,
|
"engine_result_code": 0,
|
||||||
"engine_result": "tesSUCCESS",
|
"engine_result": "tesSUCCESS",
|
||||||
"close_time_iso": "2000-01-01T00:00:00Z",
|
"close_time_iso": "2000-01-01T00:00:00Z",
|
||||||
@@ -835,7 +901,7 @@ TEST_F(FeedTransactionTest, PubTransactionWithOwnerFund)
|
|||||||
"validated": true,
|
"validated": true,
|
||||||
"status": "closed",
|
"status": "closed",
|
||||||
"ledger_index": 33,
|
"ledger_index": 33,
|
||||||
"ledger_hash": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC",
|
"ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652",
|
||||||
"engine_result_code": 0,
|
"engine_result_code": 0,
|
||||||
"close_time_iso": "2000-01-01T00:00:00Z",
|
"close_time_iso": "2000-01-01T00:00:00Z",
|
||||||
"engine_result": "tesSUCCESS",
|
"engine_result": "tesSUCCESS",
|
||||||
@@ -850,6 +916,27 @@ TEST_F(FeedTransactionTest, PubTransactionWithOwnerFund)
|
|||||||
testFeedPtr->pub(trans1, ledgerHeader, backend_, mockAmendmentCenterPtr_, kNETWORK_ID);
|
testFeedPtr->pub(trans1, ledgerHeader, backend_, mockAmendmentCenterPtr_, kNETWORK_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(FeedTransactionTest, PublishesNFTokenMintTx)
|
||||||
|
{
|
||||||
|
EXPECT_CALL(*mockSessionPtr, onDisconnect);
|
||||||
|
testFeedPtr->sub(sessionPtr);
|
||||||
|
|
||||||
|
auto const ledgerHeader = createLedgerHeader(kLEDGER_HASH, 33);
|
||||||
|
|
||||||
|
// Creates an NFTokenMint transaction
|
||||||
|
auto const trans = createMintNftTxWithMetadata(kACCOUNT1, 1, 12, 123, kNFT_MINT_ID);
|
||||||
|
|
||||||
|
EXPECT_CALL(*mockSessionPtr, apiSubversion).WillOnce(testing::Return(1));
|
||||||
|
EXPECT_CALL(*mockSessionPtr, send(sharedStringJsonEq(kNFT_MINT_TRAN_V1)));
|
||||||
|
|
||||||
|
testFeedPtr->pub(trans, ledgerHeader, backend_, mockAmendmentCenterPtr_, kNETWORK_ID);
|
||||||
|
|
||||||
|
testFeedPtr->unsub(sessionPtr);
|
||||||
|
EXPECT_EQ(testFeedPtr->transactionSubCount(), 0);
|
||||||
|
|
||||||
|
testFeedPtr->pub(trans, ledgerHeader, backend_, mockAmendmentCenterPtr_, kNETWORK_ID);
|
||||||
|
}
|
||||||
|
|
||||||
static constexpr auto kTRAN_FROZEN =
|
static constexpr auto kTRAN_FROZEN =
|
||||||
R"JSON({
|
R"JSON({
|
||||||
"transaction": {
|
"transaction": {
|
||||||
@@ -879,7 +966,7 @@ static constexpr auto kTRAN_FROZEN =
|
|||||||
"status": "closed",
|
"status": "closed",
|
||||||
"ledger_index": 33,
|
"ledger_index": 33,
|
||||||
"close_time_iso": "2000-01-01T00:00:00Z",
|
"close_time_iso": "2000-01-01T00:00:00Z",
|
||||||
"ledger_hash": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC",
|
"ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652",
|
||||||
"engine_result_code": 0,
|
"engine_result_code": 0,
|
||||||
"engine_result": "tesSUCCESS",
|
"engine_result": "tesSUCCESS",
|
||||||
"engine_result_message": "The transaction was applied. Only final in a validated ledger."
|
"engine_result_message": "The transaction was applied. Only final in a validated ledger."
|
||||||
@@ -1136,7 +1223,7 @@ TEST_F(FeedTransactionTest, PubTransactionWithOwnerFundFrozenLPToken)
|
|||||||
"validated": true,
|
"validated": true,
|
||||||
"status": "closed",
|
"status": "closed",
|
||||||
"ledger_index": 33,
|
"ledger_index": 33,
|
||||||
"ledger_hash": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC",
|
"ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652",
|
||||||
"engine_result_code": 0,
|
"engine_result_code": 0,
|
||||||
"close_time_iso": "2000-01-01T00:00:00Z",
|
"close_time_iso": "2000-01-01T00:00:00Z",
|
||||||
"engine_result": "tesSUCCESS",
|
"engine_result": "tesSUCCESS",
|
||||||
|
|||||||
Reference in New Issue
Block a user