diff --git a/src/db/data.h b/src/db/data.h index 9b96ee7..d637f98 100644 --- a/src/db/data.h +++ b/src/db/data.h @@ -75,6 +75,9 @@ namespace db }; WIRE_AS_INTEGER(block_id); + inline constexpr std::uint64_t to_uint(const block_id src) noexcept + { return std::uint64_t(src); } + //! References a global output number, as determined by the public chain struct output_id { diff --git a/src/rest_server.cpp b/src/rest_server.cpp index cef36c7..859a9cc 100644 --- a/src/rest_server.cpp +++ b/src/rest_server.cpp @@ -196,11 +196,13 @@ namespace lws }; using async_complete = void(expect); - bool is_locked(std::uint64_t unlock_time, db::block_id last) noexcept + bool is_locked(std::uint64_t unlock_time, db::block_id last, db::block_id tx_height) noexcept { if (unlock_time > CRYPTONOTE_MAX_BLOCK_NUMBER) - return std::chrono::seconds{unlock_time} > std::chrono::system_clock::now().time_since_epoch(); - return db::block_id(unlock_time) > last; + return std::chrono::seconds{unlock_time} > std::chrono::system_clock::now().time_since_epoch() + std::chrono::seconds{CRYPTONOTE_LOCKED_TX_ALLOWED_DELTA_SECONDS_V2}; + if (unlock_time > to_uint(last) - 1 + CRYPTONOTE_LOCKED_TX_ALLOWED_DELTA_BLOCKS) + return true; + return to_uint(tx_height) + CRYPTONOTE_DEFAULT_TX_SPENDABLE_AGE > to_uint(last); } std::vector::const_iterator @@ -534,7 +536,7 @@ namespace lws metas.insert(find_metadata(metas, meta.id), meta); resp.total_received = rpc::safe_uint64(std::uint64_t(resp.total_received) + meta.amount); - if (is_locked(output.get_value(), last->id)) + if (is_locked(output.get_value(), last->id, output.get_value().height)) resp.locked_funds = rpc::safe_uint64(std::uint64_t(resp.locked_funds) + meta.amount); }