diff --git a/app/controllers/api/v2/bitcoin_vouts_controller.rb b/app/controllers/api/v2/bitcoin_vouts_controller.rb index 7e4566b63..5bf271efd 100644 --- a/app/controllers/api/v2/bitcoin_vouts_controller.rb +++ b/app/controllers/api/v2/bitcoin_vouts_controller.rb @@ -16,19 +16,18 @@ def verify bitcoin_vouts = BitcoinVout.includes(:bitcoin_transaction). where(bitcoin_transactions: { txid: previous_vout["txid"] }, bitcoin_vouts: { index: previous_vout["index"], op_return: false }) - bitcoin_vouts.each do |vout| - next if vout.unbound? || vout.normal? - next unless vout.cell_output - status = - if vout.cell_output.dead? - "normal" - elsif vout.cell_output == cell_output - "binding" - else - "unbound" - end - vout.update(consumed_by:, status:) + related_cell_outputs = bitcoin_vouts.map(&:cell_output).compact + if related_cell_outputs.all?(&:live?) + bitcoin_vouts.update_all(status: "binding") + else + bitcoin_vouts.each do |vout| + next unless vout.cell_output + next if vout.normal? || vout.unbound? + + status = vout.cell_output.dead? ? "normal" : "unbound" + vout.update(consumed_by:, status:) + end end head :no_content diff --git a/app/utils/ckb_utils.rb b/app/utils/ckb_utils.rb index 38c555b08..1bce9c67e 100644 --- a/app/utils/ckb_utils.rb +++ b/app/utils/ckb_utils.rb @@ -614,15 +614,27 @@ def self.hexes_to_bins_sql(hex_strings) end def self.parse_spore_cluster_data(hex_data) - data = hex_data.slice(2..-1) - name_offset = [data.slice(8, 8)].pack("H*").unpack1("l") * 2 - description_offset = [data.slice(16, 8)].pack("H*").unpack1("l") * 2 - name = [data.slice(name_offset + 8..description_offset - 1)].pack("H*") - description = [data.slice(description_offset + 8..-1)].pack("H*") - name = "#{name[0, 97]}..." if name.length > 100 - { name:, description: } - rescue StandardError => _e - { name: nil, description: nil } + safe_encode = Proc.new do |str| + str.force_encoding("UTF-8").encode("UTF-8", invalid: :replace, undef: :replace, replace: "") + rescue Encoding::UndefinedConversionError, Encoding::InvalidByteSequenceError + "" + end + + begin + data = hex_data.slice(2..-1) + name_offset = [data.slice(8, 8)].pack("H*").unpack1("l") * 2 + description_offset = [data.slice(16, 8)].pack("H*").unpack1("l") * 2 + name = [data.slice(name_offset + 8..description_offset - 1)].pack("H*") + description = [data.slice(description_offset + 8..-1)].pack("H*") + name = "#{name[0, 97]}..." if name.length > 100 + name = safe_encode.call(name) + description = safe_encode.call(description) + + { name:, description: } + rescue StandardError => e + puts "Error parsing spore cluster data: #{e.message}" + { name: nil, description: nil } + end end def self.parse_spore_cell_data(hex_data)