Skip to content

Commit 9edc26a

Browse files
fix: Add MPT to txn JSON (#2392)
fixes #2332
1 parent 08bb619 commit 9edc26a

File tree

6 files changed

+183
-65
lines changed

6 files changed

+183
-65
lines changed

src/feed/impl/TransactionFeed.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,8 +206,10 @@ TransactionFeed::pub(
206206
pubObj[txKey] = rpc::toJson(*tx);
207207
pubObj[JS(meta)] = rpc::toJson(*meta);
208208
rpc::insertDeliveredAmount(pubObj[JS(meta)].as_object(), tx, meta, txMeta.date);
209-
rpc::insertDeliverMaxAlias(pubObj[txKey].as_object(), version);
210-
rpc::insertMPTIssuanceID(pubObj[JS(meta)].as_object(), tx, meta);
209+
210+
auto& txnPubobj = pubObj[txKey].as_object();
211+
rpc::insertDeliverMaxAlias(txnPubobj, version);
212+
rpc::insertMPTIssuanceID(txnPubobj, meta);
211213

212214
Json::Value nftJson;
213215
ripple::RPC::insertNFTSyntheticInJson(nftJson, tx, *meta);

src/rpc/RPCHelpers.cpp

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "web/Context.hpp"
3434

3535
#include <boost/algorithm/string/case_conv.hpp>
36+
#include <boost/algorithm/string/predicate.hpp>
3637
#include <boost/asio/spawn.hpp>
3738
#include <boost/format/format_fwd.hpp>
3839
#include <boost/format/free_funcs.hpp>
@@ -262,7 +263,7 @@ toExpandedJson(
262263
auto metaJson = toJson(*meta);
263264
insertDeliveredAmount(metaJson, txn, meta, blobs.date);
264265
insertDeliverMaxAlias(txnJson, apiVersion);
265-
insertMPTIssuanceID(metaJson, txn, meta);
266+
insertMPTIssuanceID(txnJson, meta);
266267

267268
if (nftEnabled == NFTokenjson::ENABLE) {
268269
Json::Value nftJson;
@@ -347,14 +348,15 @@ getMPTIssuanceID(std::shared_ptr<ripple::TxMeta const> const& meta)
347348
/**
348349
* @brief Check if transaction has a new MPToken created
349350
*
350-
* @param txn The transaction
351+
* @param txnJson The transaction Json
351352
* @param meta The metadata
352353
* @return true if the transaction can have a mpt_issuance_id
353354
*/
354355
static bool
355-
canHaveMPTIssuanceID(std::shared_ptr<ripple::STTx const> const& txn, std::shared_ptr<ripple::TxMeta const> const& meta)
356+
canHaveMPTIssuanceID(boost::json::object const& txnJson, std::shared_ptr<ripple::TxMeta const> const& meta)
356357
{
357-
if (txn->getTxnType() != ripple::ttMPTOKEN_ISSUANCE_CREATE)
358+
if (txnJson.at(JS(TransactionType)).is_string() and
359+
not boost::iequals(txnJson.at(JS(TransactionType)).as_string(), JS(MPTokenIssuanceCreate)))
358360
return false;
359361

360362
if (meta->getResultTER() != ripple::tesSUCCESS)
@@ -364,17 +366,13 @@ canHaveMPTIssuanceID(std::shared_ptr<ripple::STTx const> const& txn, std::shared
364366
}
365367

366368
bool
367-
insertMPTIssuanceID(
368-
boost::json::object& metaJson,
369-
std::shared_ptr<ripple::STTx const> const& txn,
370-
std::shared_ptr<ripple::TxMeta const> const& meta
371-
)
369+
insertMPTIssuanceID(boost::json::object& txnJson, std::shared_ptr<ripple::TxMeta const> const& meta)
372370
{
373-
if (!canHaveMPTIssuanceID(txn, meta))
371+
if (!canHaveMPTIssuanceID(txnJson, meta))
374372
return false;
375373

376374
if (auto const id = getMPTIssuanceID(meta)) {
377-
metaJson[JS(mpt_issuance_id)] = ripple::to_string(*id);
375+
txnJson[JS(mpt_issuance_id)] = ripple::to_string(*id);
378376
return true;
379377
}
380378

src/rpc/RPCHelpers.hpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -202,17 +202,12 @@ insertDeliveredAmount(
202202
/**
203203
* @brief Add "mpt_issuance_id" into MPTokenIssuanceCreate transaction json.
204204
*
205-
* @param metaJson The metadata json object to add "MPTokenIssuanceID"
206-
* @param txn The transaction object
205+
* @param txnJson The transaction Json object
207206
* @param meta The metadata object
208207
* @return true if the "mpt_issuance_id" is added to the metadata json object
209208
*/
210209
bool
211-
insertMPTIssuanceID(
212-
boost::json::object& metaJson,
213-
std::shared_ptr<ripple::STTx const> const& txn,
214-
std::shared_ptr<ripple::TxMeta const> const& meta
215-
);
210+
insertMPTIssuanceID(boost::json::object& txnJson, std::shared_ptr<ripple::TxMeta const> const& meta);
216211

217212
/**
218213
* @brief Convert STBase object to JSON

tests/common/util/TestObject.cpp

Lines changed: 62 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060

6161
namespace {
6262
constexpr auto kINDEX1 = "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC";
63+
ripple::Slice const kSLICE("test", 4);
6364
} // namespace
6465

6566
ripple::AccountID
@@ -183,9 +184,7 @@ createPaymentTransactionObject(
183184
auto account2 = util::parseBase58Wrapper<ripple::AccountID>(std::string(accountId2));
184185
obj.setAccountID(ripple::sfDestination, account2.value());
185186
obj.setFieldU32(ripple::sfSequence, seq);
186-
char const* key = "test";
187-
ripple::Slice const slice(key, 4);
188-
obj.setFieldVL(ripple::sfSigningPubKey, slice);
187+
obj.setFieldVL(ripple::sfSigningPubKey, kSLICE);
189188
return obj;
190189
}
191190

@@ -697,9 +696,7 @@ createMintNftTxWithMetadata(
697696
// required field for ttNFTOKEN_MINT
698697
tx.setFieldU32(ripple::sfNFTokenTaxon, nfTokenTaxon);
699698
tx.setFieldU32(ripple::sfSequence, seq);
700-
char const* key = "test";
701-
ripple::Slice const slice(key, 4);
702-
tx.setFieldVL(ripple::sfSigningPubKey, slice);
699+
tx.setFieldVL(ripple::sfSigningPubKey, kSLICE);
703700

704701
// meta
705702
ripple::STObject metaObj(ripple::sfTransactionMetaData);
@@ -762,9 +759,7 @@ createMintNftTxWithMetadataOfCreatedNode(
762759
// required field for ttNFTOKEN_MINT
763760
tx.setFieldU32(ripple::sfNFTokenTaxon, nfTokenTaxon);
764761
tx.setFieldU32(ripple::sfSequence, seq);
765-
char const* key = "test";
766-
ripple::Slice const slice(key, 4);
767-
tx.setFieldVL(ripple::sfSigningPubKey, slice);
762+
tx.setFieldVL(ripple::sfSigningPubKey, kSLICE);
768763
if (uri)
769764
tx.setFieldVL(ripple::sfURI, ripple::Slice(uri->data(), uri->size()));
770765

@@ -820,9 +815,7 @@ createNftModifyTxWithMetadata(std::string_view accountId, std::string_view nftID
820815
tx.setFieldAmount(ripple::sfFee, amount);
821816
tx.setFieldH256(ripple::sfNFTokenID, ripple::uint256{nftID});
822817
tx.setFieldU32(ripple::sfSequence, 100);
823-
char const* key = "test";
824-
ripple::Slice const slice(key, 4);
825-
tx.setFieldVL(ripple::sfSigningPubKey, slice);
818+
tx.setFieldVL(ripple::sfSigningPubKey, kSLICE);
826819

827820
if (!uri.empty()) // sfURI should be absent if empty
828821
tx.setFieldVL(ripple::sfURI, uri);
@@ -880,9 +873,7 @@ createNftBurnTxWithMetadataOfDeletedNode(std::string_view accountId, std::string
880873
tx.setFieldAmount(ripple::sfFee, amount);
881874
tx.setFieldH256(ripple::sfNFTokenID, ripple::uint256{nftID});
882875
tx.setFieldU32(ripple::sfSequence, 100);
883-
char const* key = "test";
884-
ripple::Slice const slice(key, 4);
885-
tx.setFieldVL(ripple::sfSigningPubKey, slice);
876+
tx.setFieldVL(ripple::sfSigningPubKey, kSLICE);
886877

887878
// meta
888879
ripple::STObject metaObj(ripple::sfTransactionMetaData);
@@ -927,9 +918,7 @@ createNftBurnTxWithMetadataOfModifiedNode(std::string_view accountId, std::strin
927918
tx.setFieldAmount(ripple::sfFee, amount);
928919
tx.setFieldH256(ripple::sfNFTokenID, ripple::uint256{nftID});
929920
tx.setFieldU32(ripple::sfSequence, 100);
930-
char const* key = "test";
931-
ripple::Slice const slice(key, 4);
932-
tx.setFieldVL(ripple::sfSigningPubKey, slice);
921+
tx.setFieldVL(ripple::sfSigningPubKey, kSLICE);
933922

934923
// meta
935924
ripple::STObject metaObj(ripple::sfTransactionMetaData);
@@ -976,9 +965,7 @@ createAcceptNftBuyerOfferTxWithMetadata(
976965
tx.setFieldAmount(ripple::sfFee, amount);
977966
tx.setFieldU32(ripple::sfSequence, seq);
978967
tx.setFieldH256(ripple::sfNFTokenBuyOffer, ripple::uint256{offerId});
979-
char const* key = "test";
980-
ripple::Slice const slice(key, 4);
981-
tx.setFieldVL(ripple::sfSigningPubKey, slice);
968+
tx.setFieldVL(ripple::sfSigningPubKey, kSLICE);
982969

983970
// meta
984971
// create deletedNode with ltNFTOKEN_OFFER
@@ -1025,9 +1012,7 @@ createAcceptNftSellerOfferTxWithMetadata(
10251012
tx.setFieldAmount(ripple::sfFee, amount);
10261013
tx.setFieldU32(ripple::sfSequence, seq);
10271014
tx.setFieldH256(ripple::sfNFTokenSellOffer, ripple::uint256{offerId});
1028-
char const* key = "test";
1029-
ripple::Slice const slice(key, 4);
1030-
tx.setFieldVL(ripple::sfSigningPubKey, slice);
1015+
tx.setFieldVL(ripple::sfSigningPubKey, kSLICE);
10311016

10321017
// meta
10331018
// create deletedNode with ltNFTOKEN_OFFER
@@ -1121,9 +1106,7 @@ createCancelNftOffersTxWithMetadata(
11211106
return ripple::uint256{nftId.c_str()};
11221107
});
11231108
tx.setFieldV256(ripple::sfNFTokenOffers, offers);
1124-
char const* key = "test";
1125-
ripple::Slice const slice(key, 4);
1126-
tx.setFieldVL(ripple::sfSigningPubKey, slice);
1109+
tx.setFieldVL(ripple::sfSigningPubKey, kSLICE);
11271110

11281111
// meta
11291112
// create deletedNode with ltNFTOKEN_OFFER
@@ -1172,9 +1155,7 @@ createCreateNftOfferTxWithMetadata(
11721155
tx.setFieldAmount(ripple::sfAmount, price);
11731156
tx.setFieldU32(ripple::sfSequence, seq);
11741157
tx.setFieldH256(ripple::sfNFTokenID, ripple::uint256{nftId});
1175-
char const* key = "test";
1176-
ripple::Slice const slice(key, 4);
1177-
tx.setFieldVL(ripple::sfSigningPubKey, slice);
1158+
tx.setFieldVL(ripple::sfSigningPubKey, kSLICE);
11781159

11791160
// meta
11801161
// create createdNode with LedgerIndex
@@ -1219,9 +1200,7 @@ createOracleSetTxWithMetadata(
12191200
tx.setFieldU32(ripple::sfLastUpdateTime, lastUpdateTime);
12201201
tx.setFieldU32(ripple::sfOracleDocumentID, docId);
12211202
tx.setFieldU32(ripple::sfSequence, seq);
1222-
char const* key = "test";
1223-
ripple::Slice const slice(key, 4);
1224-
tx.setFieldVL(ripple::sfSigningPubKey, slice);
1203+
tx.setFieldVL(ripple::sfSigningPubKey, kSLICE);
12251204
tx.setFieldArray(ripple::sfPriceDataSeries, priceDataSeries);
12261205

12271206
// meta
@@ -1499,6 +1478,56 @@ createMpTokenObject(std::string_view accountId, ripple::uint192 issuanceID, std:
14991478
return mptoken;
15001479
}
15011480

1481+
ripple::STObject
1482+
createMPTIssuanceCreateTx(std::string_view accountId, uint32_t fee, uint32_t seq)
1483+
{
1484+
ripple::STObject tx(ripple::sfTransaction);
1485+
tx.setFieldU16(ripple::sfTransactionType, ripple::ttMPTOKEN_ISSUANCE_CREATE);
1486+
tx.setAccountID(ripple::sfAccount, getAccountIdWithString(accountId));
1487+
tx.setFieldAmount(ripple::sfFee, ripple::STAmount(fee, false));
1488+
tx.setFieldU32(ripple::sfSequence, seq);
1489+
tx.setFieldVL(ripple::sfSigningPubKey, kSLICE);
1490+
return tx;
1491+
}
1492+
1493+
data::TransactionAndMetadata
1494+
createMPTIssuanceCreateTxWithMetadata(std::string_view accountId, uint32_t fee, uint32_t seq)
1495+
{
1496+
ripple::STObject tx = createMPTIssuanceCreateTx(accountId, fee, seq);
1497+
1498+
ripple::STObject metaObj(ripple::sfTransactionMetaData);
1499+
metaObj.setFieldU8(ripple::sfTransactionResult, ripple::tesSUCCESS);
1500+
metaObj.setFieldU32(ripple::sfTransactionIndex, 0);
1501+
1502+
ripple::STObject newFields(ripple::sfNewFields);
1503+
newFields.setAccountID(ripple::sfIssuer, getAccountIdWithString(accountId));
1504+
newFields.setFieldU16(ripple::sfLedgerEntryType, ripple::ltMPTOKEN_ISSUANCE);
1505+
newFields.setFieldU32(ripple::sfFlags, 0);
1506+
newFields.setFieldU32(ripple::sfSequence, seq);
1507+
newFields.setFieldU64(ripple::sfOwnerNode, 0);
1508+
newFields.setFieldU64(ripple::sfMaximumAmount, 0);
1509+
newFields.setFieldU64(ripple::sfOutstandingAmount, 0);
1510+
newFields.setFieldH256(ripple::sfPreviousTxnID, ripple::uint256{});
1511+
newFields.setFieldU32(ripple::sfPreviousTxnLgrSeq, 0);
1512+
std::string_view metadata = "test-meta";
1513+
ripple::Slice const sliceMetadata(metadata.data(), metadata.size());
1514+
newFields.setFieldVL(ripple::sfMPTokenMetadata, sliceMetadata);
1515+
1516+
ripple::STObject createdNode(ripple::sfCreatedNode);
1517+
createdNode.setFieldU16(ripple::sfLedgerEntryType, ripple::ltMPTOKEN_ISSUANCE);
1518+
createdNode.setFieldH256(ripple::sfLedgerIndex, ripple::uint256{});
1519+
createdNode.emplace_back(std::move(newFields));
1520+
1521+
ripple::STArray affectedNodes(ripple::sfAffectedNodes);
1522+
affectedNodes.push_back(std::move(createdNode));
1523+
metaObj.setFieldArray(ripple::sfAffectedNodes, affectedNodes);
1524+
1525+
data::TransactionAndMetadata ret;
1526+
ret.transaction = tx.getSerializer().peekData();
1527+
ret.metadata = metaObj.getSerializer().peekData();
1528+
return ret;
1529+
}
1530+
15021531
ripple::STObject
15031532
createPermissionedDomainObject(
15041533
std::string_view accountId,

tests/common/util/TestObject.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,12 @@ createMptIssuanceObject(std::string_view accountId, std::uint32_t seq, std::stri
456456
[[nodiscard]] ripple::STObject
457457
createMpTokenObject(std::string_view accountId, ripple::uint192 issuanceID, std::uint64_t mptAmount = 1);
458458

459+
[[nodiscard]] ripple::STObject
460+
createMPTIssuanceCreateTx(std::string_view accountId, uint32_t fee, uint32_t seq);
461+
462+
[[nodiscard]] data::TransactionAndMetadata
463+
createMPTIssuanceCreateTxWithMetadata(std::string_view accountId, uint32_t fee, uint32_t seq);
464+
459465
[[nodiscard]] ripple::STObject
460466
createPermissionedDomainObject(
461467
std::string_view accountId,

0 commit comments

Comments
 (0)