From 9ed433804981ab2f70499fab707e1ef11d9786df Mon Sep 17 00:00:00 2001 From: evoskuil Date: Tue, 21 Apr 2026 03:02:47 -0400 Subject: [PATCH 1/2] Add error::maximum_depth. --- include/bitcoin/server/error.hpp | 1 + src/error.cpp | 1 + test/error.cpp | 9 +++++++++ 3 files changed, 11 insertions(+) diff --git a/include/bitcoin/server/error.hpp b/include/bitcoin/server/error.hpp index 2ad3586c..52f74c3b 100644 --- a/include/bitcoin/server/error.hpp +++ b/include/bitcoin/server/error.hpp @@ -66,6 +66,7 @@ enum error_t : uint8_t unconfirmable_transaction, argument_overflow, target_overflow, + maximum_depth, wrong_version, server_error }; diff --git a/src/error.cpp b/src/error.cpp index 1eef4f26..0f7762e9 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -56,6 +56,7 @@ DEFINE_ERROR_T_MESSAGE_MAP(error) { unconfirmable_transaction, "unconfirmable_transaction" }, { argument_overflow, "argument_overflow" }, { target_overflow, "target_overflow" }, + { maximum_depth, "maximum_depth" }, { wrong_version, "wrong_version" }, { server_error, "server_error" } }; diff --git a/test/error.cpp b/test/error.cpp index 2c76bfbf..33d00a62 100644 --- a/test/error.cpp +++ b/test/error.cpp @@ -254,6 +254,15 @@ BOOST_AUTO_TEST_CASE(error_t__code__target_overflow__true_expected_message) BOOST_REQUIRE_EQUAL(ec.message(), "target_overflow"); } +BOOST_AUTO_TEST_CASE(error_t__code__maximum_depth__true_expected_message) +{ + constexpr auto value = error::maximum_depth; + const auto ec = code(value); + BOOST_REQUIRE(ec); + BOOST_REQUIRE(ec == value); + BOOST_REQUIRE_EQUAL(ec.message(), "maximum_depth"); +} + BOOST_AUTO_TEST_CASE(error_t__code__wrong_version__true_expected_message) { constexpr auto value = error::wrong_version; From aa6a66c279ee7e38965b0314b20c18ecfa9cf3d1 Mon Sep 17 00:00:00 2001 From: evoskuil Date: Tue, 21 Apr 2026 03:03:32 -0400 Subject: [PATCH 2/2] Map database::error::limited to error::maximum_depth. --- src/protocols/electrum/protocol_electrum_subscribe.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/protocols/electrum/protocol_electrum_subscribe.cpp b/src/protocols/electrum/protocol_electrum_subscribe.cpp index 0bcf684c..069b9ce4 100644 --- a/src/protocols/electrum/protocol_electrum_subscribe.cpp +++ b/src/protocols/electrum/protocol_electrum_subscribe.cpp @@ -96,6 +96,7 @@ void protocol_electrum::do_scripthash_subscribe(const hash_digest& hash, const auto limit = options().maximum_history; auto& at = *address_subscriptions_.try_emplace(hash, type, mid{}).first; ec = get_scripthash_history(status, at.second, at.first, limit); + if (ec == database::error::limited) ec = error::maximum_depth; subscribed_address_.store(true, relaxed); } @@ -111,7 +112,6 @@ void protocol_electrum::complete_scripthash_subscribe(const code& ec, if (stopped()) return; - // TODO: map database::error::maximum_depth to server code? if (ec) { send_code(ec); @@ -265,14 +265,15 @@ hash_digest protocol_electrum::to_status(const histories& histories) NOEXCEPT code protocol_electrum::get_scripthash_history(hash_digest& out, address_subscription& /* sub */, const hash_digest& hash, - size_t /* limit */) NOEXCEPT + size_t limit) NOEXCEPT { // TODO: use cursors and midstate to optimize succesive queries. // TODO: limit first pass query depth. histories histories{}; + database::address_link cursor{}; const auto& query = archive(); - const auto ec = query.get_history(stopping_, histories, hash, turbo_); + const auto ec = query.get_history(stopping_, cursor, histories, hash, limit, turbo_); if (!ec) out = to_status(histories); return ec; }