diff --git a/src/i_logos_blockchain_module.h b/src/i_logos_blockchain_module.h index 76f078f..74b85e6 100644 --- a/src/i_logos_blockchain_module.h +++ b/src/i_logos_blockchain_module.h @@ -25,6 +25,12 @@ public: const QString& optionalTipHex ) = 0; virtual QStringList wallet_get_known_addresses() = 0; + virtual int blend_join_as_core_node( + const QString& providerIdHex, + const QString& zkIdHex, + const QString& lockedNoteIdHex, + const QStringList& locators + ) = 0; }; #define ILogosBlockchainModule_iid "org.logos.ilogosblockchainmodule" diff --git a/src/logos_blockchain_module.cpp b/src/logos_blockchain_module.cpp index 54a0fa8..3f4391a 100644 --- a/src/logos_blockchain_module.cpp +++ b/src/logos_blockchain_module.cpp @@ -261,6 +261,62 @@ QStringList LogosBlockchainModule::wallet_get_known_addresses() { return out; } +int LogosBlockchainModule::blend_join_as_core_node( + const QString& providerIdHex, + const QString& zkIdHex, + const QString& lockedNoteIdHex, + const QStringList& locators +) { + if (!node) { + qWarning() << "Could not execute the operation: The node is not running."; + return 1; + } + + QByteArray providerIdBytes = parseAddressHex(providerIdHex); + if (providerIdBytes.isEmpty() || providerIdBytes.size() != kAddressBytes) { + qCritical() << "blend_join_as_core_node: Invalid providerId (64 hex characters required)."; + return 2; + } + + QByteArray zkIdBytes = parseAddressHex(zkIdHex); + if (zkIdBytes.isEmpty() || zkIdBytes.size() != kAddressBytes) { + qCritical() << "blend_join_as_core_node: Invalid zkId (64 hex characters required)."; + return 3; + } + + QByteArray lockedNoteIdBytes = parseAddressHex(lockedNoteIdHex); + if (lockedNoteIdBytes.isEmpty() || lockedNoteIdBytes.size() != kAddressBytes) { + qCritical() << "blend_join_as_core_node: Invalid lockedNoteId (64 hex characters required)."; + return 4; + } + + std::vector locatorsData; + std::vector locatorsPtrs; + for (const QString& locator : locators) { + locatorsData.push_back(locator.toUtf8()); + } + for (const QByteArray& data : locatorsData) { + locatorsPtrs.push_back(data.constData()); + } + + auto [value, error] = ::blend_join_as_core_node( + node, + reinterpret_cast(providerIdBytes.constData()), + reinterpret_cast(zkIdBytes.constData()), + reinterpret_cast(lockedNoteIdBytes.constData()), + locatorsPtrs.data(), + locatorsPtrs.size() + ); + if (!is_ok(&error)) { + qCritical() << "Failed to join as core node. Error:" << error; + return 5; + } + + QByteArray declarationIdBytes(reinterpret_cast(&value), sizeof(value)); + qInfo() << "Successfully joined as core node. DeclarationId:" << declarationIdBytes.toHex(); + return 0; +} + namespace { // Wrapper that owns data and provides GenerateConfigArgs struct OwnedGenerateConfigArgs { diff --git a/src/logos_blockchain_module.h b/src/logos_blockchain_module.h index cea694e..f38de90 100644 --- a/src/logos_blockchain_module.h +++ b/src/logos_blockchain_module.h @@ -46,6 +46,12 @@ public: const QString& optionalTipHex ); Q_INVOKABLE QStringList wallet_get_known_addresses() override; + Q_INVOKABLE int blend_join_as_core_node( + const QString& providerIdHex, + const QString& zkIdHex, + const QString& lockedNoteIdHex, + const QStringList& locators + ) override; signals: void eventResponse(const QString& eventName, const QVariantList& data);