lighstorm 0.0.15 → 0.0.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (156) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +7 -7
  4. data/adapters/bitcoin/address.rb +19 -0
  5. data/adapters/bitcoin/transaction.rb +34 -0
  6. data/adapters/lightning/connections/channel_node/fee.rb +28 -0
  7. data/adapters/lightning/connections/channel_node/policy.rb +63 -0
  8. data/adapters/lightning/connections/channel_node.rb +77 -0
  9. data/adapters/lightning/connections/payment_channel.rb +30 -0
  10. data/adapters/lightning/edges/channel.rb +98 -0
  11. data/adapters/lightning/edges/forward.rb +42 -0
  12. data/adapters/lightning/edges/payment/purpose.rb +45 -0
  13. data/adapters/lightning/edges/payment.rb +89 -0
  14. data/adapters/lightning/invoice.rb +186 -0
  15. data/adapters/lightning/nodes/node.rb +113 -0
  16. data/controllers/action.rb +1 -1
  17. data/controllers/bitcoin/address/actions/create.rb +91 -0
  18. data/controllers/bitcoin/address/actions/pay.rb +119 -0
  19. data/controllers/bitcoin/address.rb +24 -0
  20. data/controllers/bitcoin/transaction/all.rb +65 -0
  21. data/controllers/bitcoin/transaction.rb +25 -0
  22. data/controllers/concerns/impersonatable.rb +5 -3
  23. data/controllers/connection.rb +1 -1
  24. data/controllers/lightning/channel/actions/apply_gossip.rb +201 -0
  25. data/controllers/lightning/channel/actions/update_fee.rb +94 -0
  26. data/controllers/lightning/channel/all.rb +85 -0
  27. data/controllers/lightning/channel/find_by_id.rb +155 -0
  28. data/controllers/lightning/channel/mine.rb +116 -0
  29. data/controllers/lightning/channel.rb +43 -0
  30. data/controllers/lightning/forward/all.rb +250 -0
  31. data/controllers/lightning/forward/group_by_channel.rb +91 -0
  32. data/controllers/lightning/forward.rb +36 -0
  33. data/controllers/lightning/invoice/actions/create.rb +90 -0
  34. data/controllers/lightning/invoice/actions/pay.rb +97 -0
  35. data/controllers/lightning/invoice/actions/pay_through_route.rb +73 -0
  36. data/controllers/lightning/invoice/all.rb +82 -0
  37. data/controllers/lightning/invoice/decode.rb +50 -0
  38. data/controllers/lightning/invoice/find_by_code.rb +76 -0
  39. data/controllers/lightning/invoice/find_by_secret_hash.rb +56 -0
  40. data/controllers/lightning/invoice.rb +64 -0
  41. data/controllers/lightning/node/actions/apply_gossip.rb +114 -0
  42. data/controllers/lightning/node/actions/pay.rb +117 -0
  43. data/controllers/lightning/node/all.rb +69 -0
  44. data/controllers/lightning/node/find_by_public_key.rb +55 -0
  45. data/controllers/lightning/node/myself.rb +36 -0
  46. data/controllers/lightning/node.rb +35 -0
  47. data/controllers/lightning/payment/actions/pay.rb +110 -0
  48. data/controllers/lightning/payment/all.rb +439 -0
  49. data/controllers/lightning/payment.rb +37 -0
  50. data/controllers/lightning/secret/valid_proof.rb +60 -0
  51. data/controllers/lightning/secret.rb +16 -0
  52. data/controllers/wallet/activity/all.rb +196 -0
  53. data/controllers/wallet/activity.rb +28 -0
  54. data/controllers/wallet/balance.rb +3 -3
  55. data/controllers/wallet.rb +1 -1
  56. data/docs/README.md +229 -148
  57. data/docs/_coverpage.md +1 -1
  58. data/docs/index.html +1 -1
  59. data/models/bitcoin/address.rb +49 -0
  60. data/models/bitcoin/transaction.rb +41 -0
  61. data/models/concerns/protectable.rb +1 -1
  62. data/models/errors.rb +7 -8
  63. data/models/lightning/connections/channel_node/accounting.rb +27 -0
  64. data/models/lightning/connections/channel_node/fee.rb +82 -0
  65. data/models/lightning/connections/channel_node/htlc/blocks/delta.rb +41 -0
  66. data/models/lightning/connections/channel_node/htlc.rb +88 -0
  67. data/models/lightning/connections/channel_node/policy.rb +41 -0
  68. data/models/lightning/connections/channel_node.rb +86 -0
  69. data/models/lightning/connections/forward_channel.rb +31 -0
  70. data/models/lightning/connections/payment_channel.rb +58 -0
  71. data/models/lightning/edges/channel/accounting.rb +87 -0
  72. data/models/lightning/edges/channel/hop.rb +67 -0
  73. data/models/lightning/edges/channel.rb +197 -0
  74. data/models/lightning/edges/forward.rb +51 -0
  75. data/models/lightning/edges/groups/channel_forwards/analysis.rb +71 -0
  76. data/models/lightning/edges/groups/channel_forwards.rb +39 -0
  77. data/models/lightning/edges/payment.rb +104 -0
  78. data/models/lightning/invoice.rb +115 -0
  79. data/models/lightning/nodes/node/lightning.rb +33 -0
  80. data/models/lightning/nodes/node/platform.rb +50 -0
  81. data/models/lightning/nodes/node.rb +145 -0
  82. data/models/lightning/rate.rb +37 -0
  83. data/models/lightning/secret.rb +57 -0
  84. data/models/satoshis.rb +1 -1
  85. data/models/wallet/activity.rb +54 -0
  86. data/models/wallet/balance.rb +42 -0
  87. data/ports/dsl/lighstorm.rb +29 -16
  88. data/static/cache.rb +2 -0
  89. data/static/spec.rb +1 -1
  90. metadata +74 -68
  91. data/adapters/connections/channel_node/fee.rb +0 -26
  92. data/adapters/connections/channel_node/policy.rb +0 -61
  93. data/adapters/connections/channel_node.rb +0 -75
  94. data/adapters/connections/payment_channel.rb +0 -28
  95. data/adapters/edges/channel.rb +0 -96
  96. data/adapters/edges/forward.rb +0 -40
  97. data/adapters/edges/payment/purpose.rb +0 -43
  98. data/adapters/edges/payment.rb +0 -87
  99. data/adapters/invoice.rb +0 -184
  100. data/adapters/nodes/node.rb +0 -111
  101. data/adapters/transaction.rb +0 -23
  102. data/controllers/activity/all.rb +0 -194
  103. data/controllers/activity.rb +0 -26
  104. data/controllers/channel/actions/apply_gossip.rb +0 -193
  105. data/controllers/channel/actions/update_fee.rb +0 -91
  106. data/controllers/channel/all.rb +0 -83
  107. data/controllers/channel/find_by_id.rb +0 -153
  108. data/controllers/channel/mine.rb +0 -114
  109. data/controllers/channel.rb +0 -41
  110. data/controllers/forward/all.rb +0 -248
  111. data/controllers/forward/group_by_channel.rb +0 -89
  112. data/controllers/forward.rb +0 -34
  113. data/controllers/invoice/actions/create.rb +0 -88
  114. data/controllers/invoice/actions/pay.rb +0 -95
  115. data/controllers/invoice/actions/pay_through_route.rb +0 -71
  116. data/controllers/invoice/all.rb +0 -80
  117. data/controllers/invoice/decode.rb +0 -44
  118. data/controllers/invoice/find_by_code.rb +0 -70
  119. data/controllers/invoice/find_by_secret_hash.rb +0 -54
  120. data/controllers/invoice.rb +0 -62
  121. data/controllers/node/actions/apply_gossip.rb +0 -112
  122. data/controllers/node/actions/pay.rb +0 -115
  123. data/controllers/node/all.rb +0 -67
  124. data/controllers/node/find_by_public_key.rb +0 -53
  125. data/controllers/node/myself.rb +0 -34
  126. data/controllers/node.rb +0 -33
  127. data/controllers/payment/actions/pay.rb +0 -108
  128. data/controllers/payment/all.rb +0 -437
  129. data/controllers/payment.rb +0 -35
  130. data/controllers/secret/valid_proof.rb +0 -58
  131. data/controllers/transaction/all.rb +0 -61
  132. data/controllers/transaction.rb +0 -25
  133. data/models/activity.rb +0 -52
  134. data/models/connections/channel_node/accounting.rb +0 -25
  135. data/models/connections/channel_node/fee.rb +0 -80
  136. data/models/connections/channel_node/htlc/blocks/delta.rb +0 -39
  137. data/models/connections/channel_node/htlc.rb +0 -86
  138. data/models/connections/channel_node/policy.rb +0 -39
  139. data/models/connections/channel_node.rb +0 -84
  140. data/models/connections/forward_channel.rb +0 -29
  141. data/models/connections/payment_channel.rb +0 -56
  142. data/models/edges/channel/accounting.rb +0 -85
  143. data/models/edges/channel/hop.rb +0 -65
  144. data/models/edges/channel.rb +0 -195
  145. data/models/edges/forward.rb +0 -49
  146. data/models/edges/groups/channel_forwards/analysis.rb +0 -69
  147. data/models/edges/groups/channel_forwards.rb +0 -37
  148. data/models/edges/payment.rb +0 -102
  149. data/models/invoice.rb +0 -113
  150. data/models/nodes/node/lightning.rb +0 -31
  151. data/models/nodes/node/platform.rb +0 -48
  152. data/models/nodes/node.rb +0 -143
  153. data/models/rate.rb +0 -35
  154. data/models/secret.rb +0 -55
  155. data/models/transaction.rb +0 -39
  156. data/models/wallet.rb +0 -40
@@ -1,193 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'securerandom'
4
-
5
- require_relative '../../../models/errors'
6
- require_relative '../../../models/edges/channel'
7
- require_relative '../../../adapters/edges/channel'
8
-
9
- module Lighstorm
10
- module Controllers
11
- module Channel
12
- module ApplyGossip
13
- SKIPABLE = [
14
- '_key',
15
- '_source',
16
- 'partners/0/_source',
17
- 'partners/0/policy/_source',
18
- 'partners/1/_source',
19
- 'partners/1/policy/_source'
20
- ].freeze
21
-
22
- NOT_ALLOWED = [
23
- 'id'
24
- ].freeze
25
-
26
- APPLICABLE = [
27
- 'accounting/capacity/millisatoshis',
28
- 'partners/0/policy/fee/base/millisatoshis',
29
- 'partners/0/state',
30
- 'partners/1/policy/fee/base/millisatoshis',
31
- 'partners/1/state',
32
- 'partners/1/policy/fee/rate/parts_per_million',
33
- 'partners/0/policy/fee/rate/parts_per_million',
34
- 'partners/0/policy/htlc/minimum/millisatoshis',
35
- 'partners/1/policy/htlc/minimum/millisatoshis',
36
- 'partners/0/policy/htlc/maximum/millisatoshis',
37
- 'partners/1/policy/htlc/maximum/millisatoshis',
38
- 'partners/0/policy/htlc/blocks/delta/minimum',
39
- 'partners/1/policy/htlc/blocks/delta/minimum'
40
- ].freeze
41
-
42
- def self.perform(actual, gossip)
43
- updated = Models::Channel.new(Adapter::Channel.subscribe_channel_graph(gossip), nil)
44
-
45
- actual_dump = actual.dump
46
- updated_dump = updated.dump
47
-
48
- if actual.partners.first.node.public_key == updated.partners.last.node.public_key &&
49
- actual.partners.last.node.public_key == updated.partners.first.node.public_key
50
- a = updated_dump[:partners][0]
51
- b = updated_dump[:partners][1]
52
-
53
- updated_dump[:partners][0] = b
54
- updated_dump[:partners][1] = a
55
- end
56
-
57
- diff = generate_diff(actual_dump, updated_dump)
58
-
59
- diff.each do |change|
60
- key = change[:path].join('/')
61
- next unless NOT_ALLOWED.include?(key)
62
-
63
- raise IncoherentGossipError, "Gossip doesn't belong to this Channel"
64
- end
65
-
66
- diff.filter do |change|
67
- key = change[:path].join('/')
68
- if SKIPABLE.include?(key)
69
- false
70
- elsif APPLICABLE.include?(key)
71
- apply!(actual, key, change)
72
- true
73
- else
74
- raise Lighstorm::Errors::MissingGossipHandlerError, "don't know how to apply '#{key}'"
75
- end
76
- end
77
- end
78
-
79
- def self.apply!(actual, key, change)
80
- case key
81
- when 'accounting/capacity/millisatoshis'
82
- token = SecureRandom.hex
83
- actual.accounting.prepare_token!(token)
84
- actual.accounting.capacity = {
85
- value: Models::Satoshis.new(millisatoshis: change[:to]),
86
- token: token
87
- }
88
- when 'partners/0/policy/htlc/maximum/millisatoshis',
89
- 'partners/1/policy/htlc/maximum/millisatoshis' then
90
- policy = actual.partners[change[:path][1]].policy
91
-
92
- token = SecureRandom.hex
93
- policy.htlc.prepare_token!(token)
94
- policy.htlc.maximum = {
95
- value: Models::Satoshis.new(millisatoshis: change[:to]),
96
- token: token
97
- }
98
- when 'partners/0/policy/htlc/minimum/millisatoshis',
99
- 'partners/1/policy/htlc/minimum/millisatoshis' then
100
- if actual.partners[change[:path][1]].policy.nil?
101
- actual.partners[change[:path][1]].policy = Lighstorm::Models::Policy.new({}, nil)
102
- end
103
-
104
- policy = actual.partners[change[:path][1]].policy
105
-
106
- token = SecureRandom.hex
107
- policy.htlc.prepare_token!(token)
108
- policy.htlc.minimum = {
109
- value: Models::Satoshis.new(millisatoshis: change[:to]),
110
- token: token
111
- }
112
- when 'partners/0/policy/htlc/blocks/delta/minimum',
113
- 'partners/1/policy/htlc/blocks/delta/minimum' then
114
- if actual.partners[change[:path][1]].policy.nil?
115
- actual.partners[change[:path][1]].policy = Lighstorm::Models::Policy.new({}, nil)
116
- end
117
-
118
- policy = actual.partners[change[:path][1]].policy
119
-
120
- token = SecureRandom.hex
121
- policy.htlc.blocks.delta.prepare_token!(token)
122
- policy.htlc.blocks.delta.minimum = {
123
- value: change[:to],
124
- token: token
125
- }
126
- when 'partners/0/policy/fee/rate/parts_per_million',
127
- 'partners/1/policy/fee/rate/parts_per_million' then
128
- policy = actual.partners[change[:path][1]].policy
129
-
130
- token = SecureRandom.hex
131
- policy.fee.prepare_token!(token)
132
- policy.fee.rate = {
133
- value: Models::Rate.new(parts_per_million: change[:to]),
134
- token: token
135
- }
136
- when 'partners/0/policy/fee/base/millisatoshis',
137
- 'partners/1/policy/fee/base/millisatoshis' then
138
- policy = actual.partners[change[:path][1]].policy
139
-
140
- token = SecureRandom.hex
141
- policy.fee.prepare_token!(token)
142
- policy.fee.base = {
143
- value: Models::Satoshis.new(millisatoshis: change[:to]),
144
- token: token
145
- }
146
- when 'partners/0/state',
147
- 'partners/1/state' then
148
- partner = actual.partners[change[:path][1]]
149
-
150
- token = SecureRandom.hex
151
- partner.prepare_token!(token)
152
- partner.state = { value: change[:to], token: token }
153
- else
154
- raise Lighstorm::Errors::MissingGossipHandlerError, "don't know how to apply '#{key}'"
155
- end
156
- end
157
-
158
- def self.generate_diff(actual, node, path = [], diff = [])
159
- case node
160
- when Hash
161
- result = {}
162
- node.each_key do |key|
163
- result[key] = generate_diff(actual, node[key], path.dup.push(key), diff)
164
- end
165
- when Array
166
- result = []
167
- node.each_with_index do |value, i|
168
- result << generate_diff(actual, value, path.dup.push(i), diff)
169
- end
170
- else
171
- new_value = node
172
-
173
- unless new_value.nil?
174
- actual_value = actual
175
- path.each do |key|
176
- if actual_value[key]
177
- actual_value = actual_value[key]
178
- else
179
- actual_value = nil
180
- break
181
- end
182
- end
183
-
184
- diff << { path: path, from: actual_value, to: new_value } if actual_value != new_value
185
- end
186
- end
187
-
188
- diff
189
- end
190
- end
191
- end
192
- end
193
- end
@@ -1,91 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../../../ports/grpc'
4
- require_relative '../../../models/errors'
5
- require_relative '../../../models/satoshis'
6
- require_relative '../../../models/rate'
7
- require_relative '../../action'
8
-
9
- module Lighstorm
10
- module Controllers
11
- module Channel
12
- module UpdateFee
13
- def self.prepare(policy, transaction, params)
14
- grpc_request = {
15
- service: :lightning,
16
- method: :update_channel_policy,
17
- params: {
18
- chan_point: {
19
- funding_txid_str: transaction[:funding][:id],
20
- output_index: transaction[:funding][:index]
21
- },
22
- base_fee_msat: policy[:fee][:base][:millisatoshis],
23
- fee_rate_ppm: policy[:fee][:rate][:parts_per_million],
24
- time_lock_delta: policy[:htlc][:blocks][:delta][:minimum],
25
- max_htlc_msat: policy[:htlc][:maximum][:millisatoshis],
26
- min_htlc_msat: policy[:htlc][:minimum][:millisatoshis]
27
- }
28
- }
29
-
30
- if params[:rate] && params[:rate][:parts_per_million]
31
- if (params[:rate][:parts_per_million]).negative?
32
- raise Errors::NegativeNotAllowedError, "fee rate can't be negative: #{params[:rate][:parts_per_million]}"
33
- end
34
-
35
- grpc_request[:params][:fee_rate_ppm] = params[:rate][:parts_per_million]
36
- end
37
-
38
- if params[:base] && params[:base][:millisatoshis]
39
- if (params[:base][:millisatoshis]).negative?
40
- raise Errors::NegativeNotAllowedError, "fee base can't be negative: #{params[:base][:millisatoshis]}"
41
- end
42
-
43
- grpc_request[:params][:base_fee_msat] = params[:base][:millisatoshis]
44
- end
45
-
46
- grpc_request
47
- end
48
-
49
- def self.call(components, grpc_request)
50
- components[:grpc].send(grpc_request[:service]).send(
51
- grpc_request[:method], grpc_request[:params]
52
- ).to_h
53
- end
54
-
55
- def self.dispatch(components, grpc_request, &vcr)
56
- if vcr.nil?
57
- call(components, grpc_request)
58
- else
59
- vcr.call(-> { call(components, grpc_request) }, :dispatch)
60
- end
61
- end
62
-
63
- def self.perform(components, policy, transaction, params, preview: false, &vcr)
64
- grpc_request = prepare(policy.to_h, transaction.to_h, params)
65
-
66
- return grpc_request if preview
67
-
68
- response = dispatch(components, grpc_request, &vcr)
69
-
70
- raise UpdateChannelPolicyError.new(nil, response) unless response[:failed_updates].empty?
71
-
72
- token = SecureRandom.hex
73
- policy.fee.prepare_token!(token)
74
- policy.fee.base = {
75
- value: Models::Satoshis.new(millisatoshis: grpc_request[:params][:base_fee_msat]),
76
- token: token
77
- }
78
-
79
- token = SecureRandom.hex
80
- policy.fee.prepare_token!(token)
81
- policy.fee.rate = {
82
- value: Models::Rate.new(parts_per_million: grpc_request[:params][:fee_rate_ppm]),
83
- token: token
84
- }
85
-
86
- Action::Output.new({ request: grpc_request, response: response, result: policy })
87
- end
88
- end
89
- end
90
- end
91
- end
@@ -1,83 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'mine'
4
-
5
- require_relative '../../ports/grpc'
6
- require_relative '../../adapters/edges/channel'
7
- require_relative '../../adapters/nodes/node'
8
- require_relative '../../adapters/connections/channel_node/fee'
9
-
10
- module Lighstorm
11
- module Controllers
12
- module Channel
13
- module All
14
- def self.fetch(components, limit: nil)
15
- data = {
16
- at: Time.now,
17
- mine: Mine.fetch(components),
18
- describe_graph: components[:grpc].lightning.describe_graph.edges
19
- }
20
-
21
- data[:describe_graph] = data[:describe_graph][0..limit - 1] unless limit.nil?
22
-
23
- data
24
- end
25
-
26
- def self.adapt(raw)
27
- mine_adapted = Mine.adapt(raw[:mine])
28
-
29
- mine = mine_adapted[:list_channels].map do |data|
30
- Mine.transform(data, mine_adapted)
31
- end
32
-
33
- adapted = {
34
- mine: {},
35
- describe_graph: raw[:describe_graph].map do |raw_channel|
36
- Lighstorm::Adapter::Channel.describe_graph(raw_channel.to_h)
37
- end
38
- }
39
-
40
- mine.each do |channel|
41
- adapted[:mine][channel[:id]] = channel
42
- end
43
-
44
- adapted
45
- end
46
-
47
- def self.transform(data, adapted)
48
- return adapted[:mine][data[:id]] if adapted[:mine][data[:id]]
49
-
50
- data[:known] = true
51
- data[:mine] = false
52
-
53
- data[:partners].each do |partner|
54
- partner[:node][:platform] = {
55
- blockchain: adapted[:mine].first[1][:partners][0][:node][:platform][:blockchain],
56
- network: adapted[:mine].first[1][:partners][0][:node][:platform][:network]
57
- }
58
- end
59
-
60
- data
61
- end
62
-
63
- def self.data(components, limit: nil, &vcr)
64
- raw = if vcr.nil?
65
- fetch(components, limit: limit)
66
- else
67
- vcr.call(-> { fetch(components, limit: limit) })
68
- end
69
-
70
- adapted = adapt(raw)
71
-
72
- adapted[:describe_graph].map { |data| transform(data, adapted) }
73
- end
74
-
75
- def self.model(data, components)
76
- data.map do |node_data|
77
- Lighstorm::Models::Channel.new(node_data, components)
78
- end
79
- end
80
- end
81
- end
82
- end
83
- end
@@ -1,153 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../../ports/grpc'
4
- require_relative '../../adapters/edges/channel'
5
- require_relative '../../adapters/nodes/node'
6
- require_relative '../../adapters/connections/channel_node/fee'
7
-
8
- require_relative '../node/find_by_public_key'
9
-
10
- module Lighstorm
11
- module Controllers
12
- module Channel
13
- module FindById
14
- def self.fetch(components, id)
15
- data = {
16
- at: Time.now,
17
- get_info: components[:grpc].lightning.get_info.to_h,
18
- # Ensure that we are getting fresh up-date data about our own fees.
19
- fee_report: components[:grpc].lightning.fee_report.to_h,
20
- get_chan_info: components[:grpc].lightning.get_chan_info(chan_id: id.to_i).to_h,
21
- get_node_info: {},
22
- list_channels: []
23
- }
24
-
25
- data[:get_node_info][data[:get_chan_info][:node1_pub]] = components[:grpc].lightning.get_node_info(
26
- pub_key: data[:get_chan_info][:node1_pub]
27
- ).to_h
28
-
29
- data[:get_node_info][data[:get_chan_info][:node2_pub]] = components[:grpc].lightning.get_node_info(
30
- pub_key: data[:get_chan_info][:node2_pub]
31
- ).to_h
32
-
33
- partners = [
34
- data[:get_chan_info][:node1_pub],
35
- data[:get_chan_info][:node2_pub]
36
- ]
37
-
38
- is_mine = partners.include?(data[:get_info][:identity_pubkey])
39
-
40
- if is_mine
41
- partner = partners.find { |p| p != data[:get_info][:identity_pubkey] }
42
-
43
- data[:list_channels] = components[:grpc].lightning.list_channels(
44
- peer: [partner].pack('H*')
45
- ).channels.map(&:to_h)
46
- end
47
-
48
- data
49
- end
50
-
51
- def self.adapt(raw)
52
- adapted = {
53
- get_info: Lighstorm::Adapter::Node.get_info(raw[:get_info]),
54
- get_chan_info: Lighstorm::Adapter::Channel.get_chan_info(raw[:get_chan_info]),
55
- fee_report: raw[:fee_report][:channel_fees].map do |raw_fee|
56
- Lighstorm::Adapter::Fee.fee_report(raw_fee.to_h)
57
- end,
58
- list_channels: raw[:list_channels].map do |raw_channel|
59
- Lighstorm::Adapter::Channel.list_channels(raw_channel.to_h, raw[:at])
60
- end,
61
- get_node_info: {}
62
- }
63
-
64
- raw[:get_node_info].each_key do |public_key|
65
- adapted[:get_node_info][public_key] = Lighstorm::Adapter::Node.get_node_info(
66
- raw[:get_node_info][public_key]
67
- )
68
- end
69
-
70
- adapted
71
- end
72
-
73
- def self.transform(data, adapted)
74
- [0, 1].each do |i|
75
- adapted[:list_channels].each_index do |c|
76
- if adapted[:list_channels][c][:partners][i][:node].nil?
77
- adapted[:list_channels][c][:partners][i][:node] = adapted[:get_info]
78
- end
79
- end
80
- end
81
-
82
- data[:known] = true
83
- data[:mine] = false
84
- data[:exposure] = 'public'
85
-
86
- [0, 1].each do |i|
87
- data[:partners][i][:node] = adapted[:get_info] if data[:partners][i][:node][:public_key].nil?
88
-
89
- if data[:partners][i][:node][:public_key] == adapted[:get_info][:public_key]
90
- data[:partners][i][:node] = adapted[:get_info]
91
- data[:partners][i][:node][:myself] = true
92
- data[:mine] = true
93
- adapted[:fee_report].each do |channel|
94
- next unless data[:id] == channel[:id]
95
-
96
- data[:partners][i][:policy][:fee] = channel[:partner][:policy][:fee]
97
- break
98
- end
99
- else
100
- data[:partners][i][:node] = adapted[:get_node_info][data[:partners][i][:node][:public_key]]
101
- data[:partners][i][:node][:platform] = {
102
- blockchain: adapted[:get_info][:platform][:blockchain],
103
- network: adapted[:get_info][:platform][:network]
104
- }
105
-
106
- data[:partners][i][:node][:myself] = false
107
- end
108
- end
109
-
110
- adapted[:list_channels].each do |channel|
111
- next unless channel[:id] == data[:id]
112
-
113
- channel.each_key do |key|
114
- next if data.key?(key)
115
-
116
- data[key] = channel[key]
117
- end
118
-
119
- data[:accounting] = channel[:accounting]
120
-
121
- channel[:partners].each do |partner|
122
- data[:partners].each_index do |i|
123
- next unless data[:partners][i][:node][:public_key] == partner[:node][:public_key]
124
-
125
- partner.each_key do |key|
126
- next if data[:partners][i].key?(key)
127
-
128
- data[:partners][i][key] = partner[key]
129
- end
130
- end
131
- end
132
-
133
- break
134
- end
135
-
136
- data
137
- end
138
-
139
- def self.data(components, id, &vcr)
140
- raw = vcr.nil? ? fetch(components, id) : vcr.call(-> { fetch(components, id) })
141
-
142
- adapted = adapt(raw)
143
-
144
- transform(adapted[:get_chan_info], adapted)
145
- end
146
-
147
- def self.model(data, components)
148
- Lighstorm::Models::Channel.new(data, components)
149
- end
150
- end
151
- end
152
- end
153
- end
@@ -1,114 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../../ports/grpc'
4
- require_relative '../../adapters/edges/channel'
5
- require_relative '../../adapters/nodes/node'
6
- require_relative '../../adapters/connections/channel_node/fee'
7
-
8
- module Lighstorm
9
- module Controllers
10
- module Channel
11
- module Mine
12
- def self.fetch(components)
13
- data = {
14
- at: Time.now,
15
- get_info: components[:grpc].lightning.get_info.to_h,
16
- # Ensure that we are getting fresh up-date data about our own fees.
17
- fee_report: components[:grpc].lightning.fee_report.to_h,
18
- list_channels: components[:grpc].lightning.list_channels.channels.map(&:to_h),
19
- get_chan_info: {},
20
- get_node_info: {}
21
- }
22
-
23
- data[:list_channels].each do |channel|
24
- unless data[:get_chan_info][channel[:chan_id]]
25
- data[:get_chan_info][channel[:chan_id]] = components[:grpc].lightning.get_chan_info(
26
- chan_id: channel[:chan_id]
27
- ).to_h
28
- end
29
-
30
- next if data[:get_node_info][channel[:remote_pubkey]]
31
-
32
- data[:get_node_info][channel[:remote_pubkey]] = components[:grpc].lightning.get_node_info(
33
- pub_key: channel[:remote_pubkey]
34
- ).to_h
35
- end
36
-
37
- data
38
- end
39
-
40
- def self.adapt(raw)
41
- adapted = {
42
- get_info: Lighstorm::Adapter::Node.get_info(raw[:get_info]),
43
- fee_report: raw[:fee_report][:channel_fees].map do |raw_fee|
44
- Lighstorm::Adapter::Fee.fee_report(raw_fee.to_h)
45
- end,
46
- list_channels: raw[:list_channels].map do |raw_channel|
47
- Lighstorm::Adapter::Channel.list_channels(raw_channel.to_h, raw[:at])
48
- end,
49
- get_chan_info: {},
50
- get_node_info: {}
51
- }
52
-
53
- raw[:get_chan_info].each do |key, value|
54
- adapted[:get_chan_info][key] = Lighstorm::Adapter::Channel.get_chan_info(value.to_h)
55
- end
56
-
57
- raw[:get_node_info].each do |key, value|
58
- adapted[:get_node_info][key] = Lighstorm::Adapter::Node.get_node_info(value.to_h)
59
- end
60
-
61
- adapted
62
- end
63
-
64
- def self.transform(data, adapted)
65
- [0, 1].each do |i|
66
- data[:partners][i][:node] = adapted[:get_info] if data[:partners][i][:node].nil?
67
-
68
- adapted[:get_chan_info][data[:id].to_i][:partners].each do |partner|
69
- if data[:partners][i][:node][:public_key] == partner[:node][:public_key]
70
- data[:partners][i][:policy] = partner[:policy]
71
- end
72
- end
73
-
74
- if data[:partners][i][:node][:public_key] == adapted[:get_info][:public_key]
75
- data[:partners][i][:node][:platform] = adapted[:get_info][:platform]
76
- data[:partners][i][:node][:myself] = true
77
- data[:known] = true
78
- data[:mine] = true
79
- adapted[:fee_report].each do |channel|
80
- next unless data[:id] == channel[:id]
81
-
82
- data[:partners][i][:policy][:fee] = channel[:partner][:policy][:fee]
83
- break
84
- end
85
- else
86
- data[:partners][i][:node] = adapted[:get_node_info][data[:partners][i][:node][:public_key]]
87
- data[:partners][i][:node][:platform] = {
88
- blockchain: adapted[:get_info][:platform][:blockchain],
89
- network: adapted[:get_info][:platform][:network]
90
- }
91
-
92
- data[:partners][i][:node][:myself] = false
93
- end
94
- end
95
- data
96
- end
97
-
98
- def self.data(components, &vcr)
99
- raw = vcr.nil? ? fetch(components) : vcr.call(-> { fetch(components) })
100
-
101
- adapted = adapt(raw)
102
-
103
- adapted[:list_channels].map { |data| transform(data, adapted) }
104
- end
105
-
106
- def self.model(data, components)
107
- data.map do |node_data|
108
- Lighstorm::Models::Channel.new(node_data, components)
109
- end
110
- end
111
- end
112
- end
113
- end
114
- end
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative './concerns/impersonatable'
4
-
5
- require_relative './channel/mine'
6
- require_relative './channel/all'
7
- require_relative './channel/find_by_id'
8
-
9
- module Lighstorm
10
- module Controllers
11
- module Channel
12
- extend Impersonatable
13
-
14
- class DSL < Impersonatable::DSL
15
- def mine(injected_components = nil)
16
- if injected_components.nil?
17
- Mine.model(Mine.data(components), components)
18
- else
19
- Mine.model(Mine.data(injected_components), injected_components)
20
- end
21
- end
22
-
23
- def all(limit: nil)
24
- All.model(All.data(components, limit: limit), components)
25
- end
26
-
27
- def find_by_id(id, injected_components = nil)
28
- if injected_components.nil?
29
- FindById.model(FindById.data(components, id), components)
30
- else
31
- FindById.model(FindById.data(injected_components, id), injected_components)
32
- end
33
- end
34
-
35
- def adapt(dump: nil, gossip: nil)
36
- Models::Channel.adapt(dump: dump, gossip: gossip)
37
- end
38
- end
39
- end
40
- end
41
- end