From b361d88c90ba056ff7ea66b283846b949b0015a4 Mon Sep 17 00:00:00 2001 From: Marat <98183742+dungeon-master-666@users.noreply.github.com> Date: Tue, 24 Sep 2024 05:14:37 +0300 Subject: [PATCH] fix indexing nft items with addr_none owner (#83) --- .../src/InsertManagerPostgres.cpp | 6 +++++- tondb-scanner/src/IndexData.h | 2 +- tondb-scanner/src/smc-interfaces/Tokens.cpp | 18 ++++++++++++------ tondb-scanner/src/smc-interfaces/Tokens.h | 2 +- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/ton-index-postgres-v2/src/InsertManagerPostgres.cpp b/ton-index-postgres-v2/src/InsertManagerPostgres.cpp index 602bbb95..82369927 100644 --- a/ton-index-postgres-v2/src/InsertManagerPostgres.cpp +++ b/ton-index-postgres-v2/src/InsertManagerPostgres.cpp @@ -1327,12 +1327,16 @@ std::string InsertBatchPostgres::insert_nft_items(pqxx::work &txn) { if (nft_item.collection_address) { raw_collection_address = convert::to_raw_address(nft_item.collection_address.value()); } + std::optional raw_owner_address; + if (nft_item.owner_address) { + raw_owner_address = convert::to_raw_address(nft_item.owner_address.value()); + } query << "(" << txn.quote(convert::to_raw_address(nft_item.address)) << "," << TO_SQL_BOOL(nft_item.init) << "," << nft_item.index << "," << TO_SQL_OPTIONAL_STRING(raw_collection_address, txn) << "," - << txn.quote(convert::to_raw_address(nft_item.owner_address)) << "," + << TO_SQL_OPTIONAL_STRING(raw_owner_address, txn) << "," << (nft_item.content ? txn.quote(content_to_json_string(nft_item.content.value())) : "NULL") << "," << nft_item.last_transaction_lt << "," << txn.quote(td::base64_encode(nft_item.code_hash.as_slice())) << "," diff --git a/tondb-scanner/src/IndexData.h b/tondb-scanner/src/IndexData.h index 0867df0c..7eae3c81 100644 --- a/tondb-scanner/src/IndexData.h +++ b/tondb-scanner/src/IndexData.h @@ -478,7 +478,7 @@ struct NFTItemDataV2 { bool init; td::RefInt256 index; std::optional collection_address; - block::StdAddress owner_address; + std::optional owner_address; std::optional> content; uint64_t last_transaction_lt; uint32_t last_transaction_now; diff --git a/tondb-scanner/src/smc-interfaces/Tokens.cpp b/tondb-scanner/src/smc-interfaces/Tokens.cpp index f82de307..faf4181a 100644 --- a/tondb-scanner/src/smc-interfaces/Tokens.cpp +++ b/tondb-scanner/src/smc-interfaces/Tokens.cpp @@ -268,13 +268,19 @@ void NftItemDetectorR::start_up() { data.collection_address = collection_address.move_as_ok(); } - auto owner_address = convert::to_std_address(stack[3].as_slice()); - if (owner_address.is_error()) { - promise_.set_error(td::Status::Error("get_nft_data address parsing failed")); - stop(); - return; + auto owner_addr_cs = stack[3].as_slice(); + if (owner_addr_cs->size() == 2 && owner_addr_cs->prefetch_ulong(2) == 0) { + // addr_none case + data.owner_address = std::nullopt; + } else { + auto owner_address = convert::to_std_address(owner_addr_cs); + if (owner_address.is_error()) { + promise_.set_error(owner_address.move_as_error_prefix("nft owner address parsing failed: ")); + stop(); + return; + } + data.owner_address = owner_address.move_as_ok(); } - data.owner_address = owner_address.move_as_ok(); if (!data.collection_address) { auto content = parse_token_data(stack[4].as_cell()); diff --git a/tondb-scanner/src/smc-interfaces/Tokens.h b/tondb-scanner/src/smc-interfaces/Tokens.h index 29c68759..394d71bf 100644 --- a/tondb-scanner/src/smc-interfaces/Tokens.h +++ b/tondb-scanner/src/smc-interfaces/Tokens.h @@ -71,7 +71,7 @@ class NftItemDetectorR: public td::actor::Actor { bool init; td::RefInt256 index; std::optional collection_address; - block::StdAddress owner_address; + std::optional owner_address; std::optional> content; };