diff --git a/src/feed/impl/TransactionFeed.cpp b/src/feed/impl/TransactionFeed.cpp index 6082c0ce..d8eec083 100644 --- a/src/feed/impl/TransactionFeed.cpp +++ b/src/feed/impl/TransactionFeed.cpp @@ -33,10 +33,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include @@ -207,6 +209,15 @@ TransactionFeed::pub( rpc::insertDeliverMaxAlias(pubObj[txKey].as_object(), version); 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)]; 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()) { diff --git a/tests/unit/feed/TransactionFeedTests.cpp b/tests/unit/feed/TransactionFeedTests.cpp index 60aa1237..447b165f 100644 --- a/tests/unit/feed/TransactionFeedTests.cpp +++ b/tests/unit/feed/TransactionFeedTests.cpp @@ -30,6 +30,7 @@ #include #include +#include #include #include #include @@ -40,6 +41,7 @@ #include #include #include +#include #include #include @@ -52,13 +54,14 @@ namespace { constexpr auto kACCOUNT1 = "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn"; constexpr auto kACCOUNT2 = "rLEsXccBGNR3UPuPu2hUXPjziKC3qKSBun"; -constexpr auto kLEDGER_HASH = "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC"; +constexpr auto kLEDGER_HASH = "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652"; constexpr auto kCURRENCY = "0158415500000000C1F76FF6ECB0BAC600000000"; constexpr auto kISSUER = "rK9DrarGKnVEo2nYp5MfVRXRYf5yRX3mwD"; constexpr auto kTXN_ID = "E6DBAFC99223B42257915A63DFC6B0C032D4070F9A574B255AD97466726FC321"; constexpr auto kAMM_ACCOUNT = "rnW8FAPgpQgA6VoESnVrUVJHBdq9QAtRZs"; constexpr auto kLPTOKEN_CURRENCY = "037C35306B24AAB7FF90848206E003279AA47090"; constexpr auto kNETWORK_ID = 0u; +constexpr auto kNFT_MINT_ID = "000B013A95F14B0044F78A264E41713C64B5F89242540EE208C3098E00000D65"; constexpr auto kTRAN_V1 = R"JSON({ @@ -105,7 +108,7 @@ constexpr auto kTRAN_V1 = "status": "closed", "ledger_index": 33, "close_time_iso": "2000-01-01T00:00:00Z", - "ledger_hash": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC", + "ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652", "engine_result_code": 0, "engine_result": "tesSUCCESS", "engine_result_message": "The transaction was applied. Only final in a validated ledger." @@ -154,13 +157,76 @@ constexpr auto kTRAN_V2 = "status": "closed", "ledger_index": 33, "close_time_iso": "2000-01-01T00:00:00Z", - "ledger_hash": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC", + "ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652", "hash": "51D2AAA6B8E4E16EF22F6424854283D8391B56875858A711B8CE4D5B9A422CC2", "engine_result_code": 0, "engine_result": "tesSUCCESS", "engine_result_message": "The transaction was applied. Only final in a validated ledger." })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 using namespace feed::impl; @@ -403,7 +469,7 @@ TEST_F(FeedTransactionTest, SubBookV1) "validated": true, "status": "closed", "ledger_index": 33, - "ledger_hash": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC", + "ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652", "engine_result_code": 0, "engine_result": "tesSUCCESS", "close_time_iso": "2000-01-01T00:00:00Z", @@ -457,7 +523,7 @@ TEST_F(FeedTransactionTest, SubBookV1) "validated": true, "status": "closed", "ledger_index": 33, - "ledger_hash": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC", + "ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652", "engine_result_code": 0, "engine_result": "tesSUCCESS", "close_time_iso": "2000-01-01T00:00:00Z", @@ -508,7 +574,7 @@ TEST_F(FeedTransactionTest, SubBookV1) "validated": true, "status": "closed", "ledger_index": 33, - "ledger_hash": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC", + "ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652", "engine_result_code": 0, "engine_result": "tesSUCCESS", "close_time_iso": "2000-01-01T00:00:00Z", @@ -590,7 +656,7 @@ TEST_F(FeedTransactionTest, SubBookV2) "validated": true, "status": "closed", "ledger_index": 33, - "ledger_hash": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC", + "ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652", "engine_result_code": 0, "engine_result": "tesSUCCESS", "close_time_iso": "2000-01-01T00:00:00Z", @@ -835,7 +901,7 @@ TEST_F(FeedTransactionTest, PubTransactionWithOwnerFund) "validated": true, "status": "closed", "ledger_index": 33, - "ledger_hash": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC", + "ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652", "engine_result_code": 0, "close_time_iso": "2000-01-01T00:00:00Z", "engine_result": "tesSUCCESS", @@ -850,6 +916,27 @@ TEST_F(FeedTransactionTest, PubTransactionWithOwnerFund) 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 = R"JSON({ "transaction": { @@ -879,7 +966,7 @@ static constexpr auto kTRAN_FROZEN = "status": "closed", "ledger_index": 33, "close_time_iso": "2000-01-01T00:00:00Z", - "ledger_hash": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC", + "ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652", "engine_result_code": 0, "engine_result": "tesSUCCESS", "engine_result_message": "The transaction was applied. Only final in a validated ledger." @@ -1136,7 +1223,7 @@ TEST_F(FeedTransactionTest, PubTransactionWithOwnerFundFrozenLPToken) "validated": true, "status": "closed", "ledger_index": 33, - "ledger_hash": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC", + "ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652", "engine_result_code": 0, "close_time_iso": "2000-01-01T00:00:00Z", "engine_result": "tesSUCCESS",