View in context in the libbitcoin Slack #general mirror.
error::error_t CLASS::unspent_duplicates(const tx_link& link,
const context& ctx) const NOEXCEPT
{
if (!ctx.is_enabled(system::chain::flags::bip30_rule))
return error::success;
const auto coinbases = to_strongs(get_tx_key(link));
if (coinbases.empty())
return error::integrity;
if (is_one(coinbases.size()))
return error::success;
// bip30: all (but self) must be confirmed spent or dup invalid (cb only).
size_t unspent{};
for (const auto& cb: coinbases)
for (index out{}; out < output_count(cb.tx); ++out)
if (!spent_prevout(cb.tx, out) && is_one(unspent++))
return error::unspent_coinbase_collision;
return is_zero(unspent) ? error::integrity : error::success;
} (edited)