Class: TxCatcher::Server

Inherits:
Goliath::API
  • Object
show all
Defined in:
lib/txcatcher/server.rb

Instance Method Summary collapse

Instance Method Details

#address(path) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/txcatcher/server.rb', line 36

def address(path)
  path = path.split("/").delete_if { |i| i.empty? }
  addr = path.last

  address = Address.where(address: addr).eager(deposits: :transactions).first
  if address
    transactions_ids = address.deposits.map { |d| d.transaction.txid }
    deposits = address.deposits.map do |d|
      t = d.transaction
      t.update(protected: true) unless t.protected
      t.update_block_height!
      {
        txid:          t.txid,
        amount:        d.amount_in_btc,
        satoshis:      d.amount,
        confirmations: t.confirmations,
        block_height:  t.block_height
      }
    end
    [200, {}, { address: address.address, received: address.received, deposits: deposits }.to_json]
  else
    [200, {}, { address: addr, received: 0, deposits: [] }.to_json]
  end
end

#broadcast_tx(txhex) ⇒ Object



84
85
86
87
88
# File 'lib/txcatcher/server.rb', line 84

def broadcast_tx(txhex)
  TxCatcher.rpc_node.sendrawtransaction(txhex)
  tx = TxCatcher.rpc_node.decoderawtransaction(txhex)
  [200, {}, tx.to_json]
end

#feerate(blocks_target) ⇒ Object



90
91
92
93
94
95
96
97
98
99
100
# File 'lib/txcatcher/server.rb', line 90

def feerate(blocks_target)
  result = TxCatcher.rpc_node.estimatesmartfee(blocks_target.to_i)

  # This is for older versions of bitcoind/litecoind clients
  if result.to_s.include?("error")
    result = TxCatcher.rpc_node.estimatefee(blocks_target.to_i)
    result = { "feerate" => result, "blocks" => blocks_target}
  end

  [200, {}, result["feerate"].to_s]
end

#response(env) ⇒ Object



7
8
9
10
11
12
13
14
15
16
# File 'lib/txcatcher/server.rb', line 7

def response(env)
  uri = env["REQUEST_URI"]
  begin
    return route_for(uri)
  rescue BitcoinRPC::JSONRPCError => e
    return [400, {}, { error: e.data }.to_json]
  rescue Exception => e
    return [500, {}, { error: e.to_s }.to_json]
  end
end

#route_for(path) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/txcatcher/server.rb', line 18

def route_for(path)
  puts "[REQUEST: #{path}]"
  if path =~ /\A\/addr\/[0-9a-zA-Z]+\/utxo/
    utxo(path)
  elsif path.start_with? "/addr/"
    address(path)
  elsif path.start_with? "/tx/send"
    broadcast_tx(params["rawtx"])
  elsif path.start_with? "/feerate"
    feerate(params["blocks_target"] || 2)
  elsif path == "/" || path.empty?
    version = File.read(File.expand_path(File.dirname(__FILE__) + "../../../VERSION"))
    [200, {}, "TxCatcher server v#{version.strip}, #{TxCatcher::Config.rpcnode["name"]}, current_block_height: #{TxCatcher.current_block_height}"]
  else
    [404, {}, { error: "404, not found" }.to_json]
  end
end

#utxo(path) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/txcatcher/server.rb', line 61

def utxo(path)
  path = path.split("/").delete_if { |i| i.empty? }
  path.pop
  addr = path.last

  model = Address.where(address: addr).eager(deposits: :transactions).first
  return [200, {}, "{}"] unless model

  transactions = model.deposits.map { |d| d.transaction }
  utxos = transactions.map do |t|
    outs = t.tx_hash["vout"].select { |out| out["scriptPubKey"]["addresses"] == [addr] }
    outs.map! do |out|
      t.update(protected: true) unless t.protected
      t.update_block_height!
      out["confirmations"] = t.confirmations || 0
      out["txid"]          = t.txid
      out
    end
    outs
  end.flatten
  [200, {}, utxos.to_json]
end