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



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/txcatcher/server.rb', line 25

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

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

#broadcast_tx(txhex) ⇒ Object



66
67
68
69
70
# File 'lib/txcatcher/server.rb', line 66

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

#response(env) ⇒ Object



7
8
9
10
# File 'lib/txcatcher/server.rb', line 7

def response(env)
  uri = env["REQUEST_URI"]
  return route_for(uri)
end

#route_for(path) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/txcatcher/server.rb', line 12

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"])
  else
    [404, {}, { error: "404, not found" }.to_json]
  end
end

#utxo(path) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/txcatcher/server.rb', line 47

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
  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|
      out["confirmations"] = t.confirmations || 0
      out["txid"]          = t.txid
      out
    end
    outs
  end.flatten
  [200, {}, utxos.to_json]
end