parent
d2b8e8dfe6
commit
4efaa48a98
|
@ -0,0 +1,57 @@
|
|||
class UpdateAddressOpReturnJob < ApplicationJob
|
||||
queue_as :default
|
||||
|
||||
OP_RETURN_RE = /\AOP_RETURN ([0-9a-fA-F]*)\z/.freeze
|
||||
MIN_CONFIRMATIONS = 1
|
||||
|
||||
def perform(address)
|
||||
return unless address.update_op_return?
|
||||
|
||||
all_tx_datas = JSON.parse %x[dash-cli listtransactions "*" 100]
|
||||
|
||||
tx_datas = all_tx_datas.select do |tx_data|
|
||||
tx_data['address'] == address.value &&
|
||||
tx_data['category'] == 'send' &&
|
||||
tx_data['confirmations'] >= MIN_CONFIRMATIONS
|
||||
end
|
||||
|
||||
tx_ids = tx_datas.map { |tx_data| tx_data['txid'] }.uniq
|
||||
|
||||
tx_full_datas = tx_ids.map do |tx_id|
|
||||
JSON.parse %x[dash-cli getrawtransaction #{tx_id} 1]
|
||||
end
|
||||
|
||||
all_tx_vouts = tx_full_datas.flat_map do |tx_full_data|
|
||||
tx_full_data['vout'].map do |vout|
|
||||
tx_full_data.merge 'vout' => vout
|
||||
end
|
||||
end
|
||||
|
||||
tx_vouts = all_tx_vouts.select do |tx_vout|
|
||||
tx_vout['vout']['scriptPubKey'] != nil &&
|
||||
tx_vout['vout']['scriptPubKey']['asm'] != nil &&
|
||||
tx_vout['vout']['scriptPubKey']['asm'].match?(OP_RETURN_RE)
|
||||
end
|
||||
|
||||
if tx_vouts.empty?
|
||||
address.update! op_return_value: nil,
|
||||
op_return_updated_at: Time.zone.now
|
||||
return
|
||||
end
|
||||
|
||||
actual_tx_vout = tx_vouts.sort_by do |tx_vout|
|
||||
[
|
||||
tx_vout['confirmations'],
|
||||
-tx_vout['vout']['n'],
|
||||
]
|
||||
end.first
|
||||
|
||||
asm = actual_tx_vout['vout']['scriptPubKey']['asm']
|
||||
match = OP_RETURN_RE.match asm
|
||||
hex = match[1]
|
||||
ascii = [hex].pack 'H*'
|
||||
|
||||
address.update! op_return_value: ascii,
|
||||
op_return_updated_at: Time.zone.now
|
||||
end
|
||||
end
|
|
@ -0,0 +1,7 @@
|
|||
require "test_helper"
|
||||
|
||||
class UpdateAddressOpReturnJobTest < ActiveJob::TestCase
|
||||
# test "the truth" do
|
||||
# assert true
|
||||
# end
|
||||
end
|
Reference in New Issue