lighstorm 0.0.12 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 026ad34b202b5f4367e287568b22126ba4850145b9d3e9398cdfd2f70d9e25d7
4
- data.tar.gz: 63b0809d04e688ceab5c7a3ff5e9ee05588c8fece0a7b6323f96b8f0a871f9eb
3
+ metadata.gz: 26ecb1df57331f4013bed69eabf7722b49b5fdfa40fdca48a38e0b3f07d032c5
4
+ data.tar.gz: ca0632d8d04671db004ce82acb73d35b92f3527f9cb4b4f5171031bf19dfe56b
5
5
  SHA512:
6
- metadata.gz: 00ba8bf8fa6f5930abb796bdb00434401a31d30db6d26397ea1cebeb587ce404b942777dd0df6eed38d8e24fec5f6574afaf3d343108379f1d359f7def4a80ba
7
- data.tar.gz: 39ebcc45331f332c5aa85e824245aec7e707bed958625d123cdb655f250610a361ae56a6dc0a8657ec34dcda977bd7e0630b47e82f0edb511b5cbf3a16b584bd
6
+ metadata.gz: 2c8b91eaa213a149be5da9af101dc0fc5bfa4add56b709f74d776cb20a96dd1020f2f33f6cb113ec24b257e55b2a2ded19ffa97776f4bf45dc4932760a990585
7
+ data.tar.gz: b3437b6dfa13b39eb761acd8cc6685d4c62ec9f388615de66d55e2e9afb7eb194ef6705a85cb401a0daa7af7c258329a51d50ed5d41aa423dd807325c0bb7bfc
data/.env.example CHANGED
@@ -1,6 +1,21 @@
1
- LIGHSTORM_LND_ADDRESS=127.0.0.1:10009
2
- LIGHSTORM_CERTIFICATE_PATH=/lnd/tls.cert
3
- LIGHSTORM_MACAROON_PATH=/lnd/data/chain/bitcoin/mainnet/admin.macaroon
4
1
  LIGHSTORM_RUN_INTEGRATION_TESTS=false
5
2
  LIGHSTORM_RUN_INTEGRATION_TESTS_SLOW=false
6
3
  LIGHSTORM_DELETE_UNUSED_TEST_DATA=false
4
+
5
+ # Option A: lndconnect
6
+ # LIGHSTORM_LND_CONNECT=lndconnect://127.0.0.1:10009?cert=MIICJz...JBEERQ&macaroon=AgEDbG...45ukJ4
7
+
8
+ # Option B: File Path
9
+ # LIGHSTORM_LND_ADDRESS=127.0.0.1:10009
10
+ # LIGHSTORM_LND_CERTIFICATE_PATH=/lnd/tls.cert
11
+ # LIGHSTORM_LND_MACAROON_PATH=/lnd/data/chain/bitcoin/mainnet/admin.macaroon
12
+
13
+ # Option C: Base64
14
+ # LIGHSTORM_LND_ADDRESS=127.0.0.1:10009
15
+ # LIGHSTORM_LND_CERTIFICATE=LS0tLS1CRU...UtLS0tLQo=
16
+ # LIGHSTORM_LND_MACAROON=AgEDbG5kAv...inv45ukJ4=
17
+
18
+ # Option D: Hex
19
+ # LIGHSTORM_LND_ADDRESS=127.0.0.1:10009
20
+ # LIGHSTORM_LND_CERTIFICATE=2d2d2d2d2d...2d2d2d2d0a
21
+ # LIGHSTORM_LND_MACAROON=0201036c6e...bf8e6e909e
data/Gemfile.lock CHANGED
@@ -1,9 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- lighstorm (0.0.12)
4
+ lighstorm (0.0.13)
5
5
  dotenv (~> 2.8, >= 2.8.1)
6
- lnd-client (~> 0.0.5)
6
+ lnd-client (~> 0.0.6)
7
7
  zache (~> 0.12.0)
8
8
 
9
9
  GEM
@@ -22,7 +22,7 @@ GEM
22
22
  google-protobuf (~> 3.21)
23
23
  googleapis-common-protos-types (~> 1.0)
24
24
  json (2.6.3)
25
- lnd-client (0.0.5)
25
+ lnd-client (0.0.6)
26
26
  grpc (~> 1.52)
27
27
  method_source (1.0.0)
28
28
  parallel (1.22.1)
@@ -51,7 +51,7 @@ GEM
51
51
  diff-lcs (>= 1.2.0, < 2.0)
52
52
  rspec-support (~> 3.12.0)
53
53
  rspec-support (3.12.0)
54
- rubocop (1.48.0)
54
+ rubocop (1.48.1)
55
55
  json (~> 2.3)
56
56
  parallel (~> 1.10)
57
57
  parser (>= 3.2.0.0)
data/README.md CHANGED
@@ -35,19 +35,25 @@ Although it tries to stay close to [Lightning's terminologies](https://docs.ligh
35
35
  Add to your `Gemfile`:
36
36
 
37
37
  ```ruby
38
- gem 'lighstorm', '~> 0.0.12'
38
+ gem 'lighstorm', '~> 0.0.13'
39
39
  ```
40
40
 
41
41
  ```ruby
42
42
  require 'lighstorm'
43
43
 
44
- Lighstorm.config!(
45
- lnd_address: '127.0.0.1:10009',
44
+ # lndconnect
45
+ Lighstorm.connect!(
46
+ 'lndconnect://127.0.0.1:10009?cert=MIICJz...JBEERQ&macaroon=AgEDbG...45ukJ4'
47
+ )
48
+
49
+ # File Path
50
+ Lighstorm.connect!(
51
+ address: '127.0.0.1:10009',
46
52
  certificate_path: '/lnd/tls.cert',
47
- macaroon_path: '/lnd/data/chain/bitcoin/mainnet/admin.macaroon',
53
+ macaroon_path: '/lnd/data/chain/bitcoin/mainnet/admin.macaroon'
48
54
  )
49
55
 
50
- puts Lighstorm.version # => 0.0.12
56
+ puts Lighstorm.version # => 0.0.13
51
57
 
52
58
  Lighstorm::Node.myself.alias # => icebaker/old-stone
53
59
 
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'digest'
4
+
5
+ module Lighstorm
6
+ module Adapter
7
+ class Transaction
8
+ def self.get_transactions(grpc)
9
+ {
10
+ _source: :get_transactions,
11
+ _key: Digest::SHA256.hexdigest(
12
+ [grpc[:time_stamp], grpc[:tx_hash], grpc[:amount], grpc[:total_fees]].join('/')
13
+ ),
14
+ at: Time.at(grpc[:time_stamp]),
15
+ amount: { millisatoshis: grpc[:amount] * 1000 },
16
+ fee: { millisatoshis: grpc[:total_fees] * 1000 },
17
+ hash: grpc[:tx_hash],
18
+ label: grpc[:label]
19
+ }
20
+ end
21
+ end
22
+ end
23
+ end
data/components/lnd.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'singleton'
4
-
4
+ require 'securerandom'
5
5
  require 'lnd-client'
6
6
 
7
7
  require_relative '../ports/dsl/lighstorm/errors'
@@ -10,34 +10,36 @@ module Lighstorm
10
10
  class LND
11
11
  include Singleton
12
12
 
13
- attr_writer :config, :middleware
13
+ attr_writer :middleware
14
14
 
15
15
  def initialize
16
- @config = nil
17
- @client = nil
16
+ @default_key = SecureRandom.hex
18
17
  @middleware = ->(_key, &block) { block.call }
19
18
  end
20
19
 
20
+ def connect!(*params)
21
+ if params.last.is_a?(Hash)
22
+ unless params.last.key?(:lightning)
23
+ params.last[:lightning] = {
24
+ channel_args: { 'grpc.max_receive_message_length' => 1024 * 1024 * 50 }
25
+ }
26
+ end
27
+ else
28
+ params << {
29
+ lightning: { channel_args: { 'grpc.max_receive_message_length' => 1024 * 1024 * 50 } }
30
+ }
31
+ end
32
+
33
+ LNDClient.add_connection!(@default_key, *params)
34
+ end
35
+
21
36
  def middleware(key, &block)
22
37
  @middleware.call(key, &block)
23
38
  end
24
39
 
25
40
  def client
26
- return @client if @client
27
-
28
- raise MissingCredentialsError, 'missing credentials' if @config.nil? && ENV.fetch(
29
- 'LIGHSTORM_CERTIFICATE_PATH', nil
30
- ).nil?
31
-
32
- @client = if @config
33
- create_client_from_config
34
- else
35
- create_client_from_environment_variables
36
- end
37
-
38
- @client.lightning(channel_args: { 'grpc.max_receive_message_length' => 1024 * 1024 * 50 })
39
-
40
- @client
41
+ try_to_connect_from_environment_variables! unless LNDClient.connections.include?(@default_key)
42
+ LNDClient.as(@default_key)
41
43
  end
42
44
 
43
45
  def create_client_from_config
@@ -48,12 +50,32 @@ module Lighstorm
48
50
  )
49
51
  end
50
52
 
51
- def create_client_from_environment_variables
52
- LNDClient.new(
53
- socket_address: ENV.fetch('LIGHSTORM_LND_ADDRESS', nil),
54
- certificate_path: ENV.fetch('LIGHSTORM_CERTIFICATE_PATH', nil),
55
- macaroon_path: ENV.fetch('LIGHSTORM_MACAROON_PATH', nil)
56
- )
53
+ def try_to_connect_from_environment_variables!
54
+ return connect!(ENV.fetch('LIGHSTORM_LND_CONNECT')) if ENV.fetch('LIGHSTORM_LND_CONNECT', nil)
55
+
56
+ params = {}
57
+
58
+ raise MissingCredentialsError, 'missing credentials [address]' unless ENV.fetch('LIGHSTORM_LND_ADDRESS', nil)
59
+
60
+ params[:address] = ENV.fetch('LIGHSTORM_LND_ADDRESS')
61
+
62
+ if ENV.fetch('LIGHSTORM_LND_CERTIFICATE', nil)
63
+ params[:certificate] = ENV.fetch('LIGHSTORM_LND_CERTIFICATE')
64
+ elsif ENV.fetch('LIGHSTORM_LND_CERTIFICATE_PATH', nil)
65
+ params[:certificate_path] = ENV.fetch('LIGHSTORM_LND_CERTIFICATE_PATH')
66
+ else
67
+ raise MissingCredentialsError, 'missing credentials [certificate]'
68
+ end
69
+
70
+ if ENV.fetch('LIGHSTORM_LND_MACAROON', nil)
71
+ params[:macaroon] = ENV.fetch('LIGHSTORM_LND_MACAROON')
72
+ elsif ENV.fetch('LIGHSTORM_LND_MACAROON_PATH', nil)
73
+ params[:macaroon_path] = ENV.fetch('LIGHSTORM_LND_MACAROON_PATH')
74
+ else
75
+ raise MissingCredentialsError, 'missing credentials [macaroon]'
76
+ end
77
+
78
+ connect!(params)
57
79
  end
58
80
  end
59
81
  end
@@ -0,0 +1,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../invoice/all'
4
+ require_relative '../payment/all'
5
+ require_relative '../forward/all'
6
+ require_relative '../transaction/all'
7
+ require_relative '../../models/activity'
8
+
9
+ module Lighstorm
10
+ module Controllers
11
+ module Activity
12
+ module All
13
+ def self.fetch(direction: nil, how: nil, limit: nil)
14
+ activities = []
15
+
16
+ Transaction::All.data.each do |transaction|
17
+ next if !how.nil? && how != 'on-chain'
18
+
19
+ activities << {
20
+ direction: (transaction[:amount][:millisatoshis]).positive? ? 'in' : 'out',
21
+ layer: 'on-chain',
22
+ at: transaction[:at],
23
+ amount: {
24
+ millisatoshis: if (transaction[:amount][:millisatoshis]).positive?
25
+ transaction[:amount][:millisatoshis]
26
+ else
27
+ -transaction[:amount][:millisatoshis]
28
+ end
29
+ },
30
+ how: 'on-chain',
31
+ message: nil,
32
+ data: { transaction: transaction }
33
+ }
34
+ end
35
+
36
+ if direction.nil? || direction == 'in'
37
+ Invoice::All.data(spontaneous: true).filter do |invoice|
38
+ !invoice[:payments].nil? && invoice[:payments].size.positive?
39
+ end.each do |invoice|
40
+ activity_how = invoice[:code].nil? ? 'spontaneously' : 'with-invoice'
41
+
42
+ next if !how.nil? && how != activity_how
43
+
44
+ # TODO: Improve performance by reducing invoice fields and removing payments?
45
+ invoice[:payments].each do |payment|
46
+ activities << {
47
+ direction: 'in',
48
+ layer: 'off-chain',
49
+ at: payment[:at],
50
+ amount: payment[:amount],
51
+ how: activity_how,
52
+ message: payment[:message],
53
+ data: { invoice: invoice }
54
+ }
55
+ end
56
+ end
57
+
58
+ Forward::All.data.each do |forward|
59
+ next if !how.nil? && how != 'forwarding'
60
+
61
+ activities << {
62
+ direction: 'in',
63
+ layer: 'off-chain',
64
+ at: forward[:at],
65
+ amount: forward[:fee],
66
+ how: 'forwarding',
67
+ message: nil,
68
+ data: {}
69
+ }
70
+ end
71
+ end
72
+
73
+ if direction.nil? || direction == 'out'
74
+ Payment::All.data(
75
+ fetch: {
76
+ get_node_info: false,
77
+ lookup_invoice: false,
78
+ decode_pay_req: true,
79
+ get_chan_info: false
80
+ }
81
+ )[:data].each do |payment|
82
+ activity_how = payment[:invoice][:code].nil? ? 'spontaneously' : 'with-invoice'
83
+
84
+ next if !how.nil? && how != activity_how
85
+
86
+ # TODO: Improve performance by reducing invoice fields?
87
+ activities << {
88
+ direction: 'out',
89
+ layer: 'off-chain',
90
+ at: payment[:at],
91
+ amount: payment[:amount],
92
+ how: activity_how,
93
+ message: payment[:message],
94
+ data: { invoice: payment[:invoice] }
95
+ }
96
+ end
97
+ end
98
+
99
+ activities = activities.sort_by { |activity| -activity[:at].to_i }
100
+
101
+ activities = activities[0..limit - 1] unless limit.nil?
102
+
103
+ { activities: activities }
104
+ end
105
+
106
+ def self.transform(raw)
107
+ raw[:activities].map do |activity|
108
+ activity[:_key] = SecureRandom.hex
109
+ activity
110
+ end
111
+ end
112
+
113
+ def self.data(direction: nil, how: nil, limit: nil, &vcr)
114
+ raw = if vcr.nil?
115
+ fetch(direction: direction, how: how, limit: limit)
116
+ else
117
+ vcr.call(-> { fetch(direction: direction, how: how, limit: limit) })
118
+ end
119
+
120
+ transform(raw)
121
+ end
122
+
123
+ def self.model(data)
124
+ data.map { |data| Models::Activity.new(data) }
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './activity/all'
4
+
5
+ module Lighstorm
6
+ module Controllers
7
+ module Activity
8
+ def self.all(direction: nil, how: nil, limit: nil)
9
+ All.model(All.data(
10
+ direction: direction,
11
+ how: how,
12
+ limit: limit
13
+ ))
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,103 +1,58 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../invoice/all'
4
- require_relative '../payment/all'
5
- require_relative '../forward/all'
3
+ require_relative '../../ports/grpc'
4
+ require_relative '../../adapters/transaction'
6
5
  require_relative '../../models/transaction'
7
6
 
8
7
  module Lighstorm
9
8
  module Controllers
10
9
  module Transaction
11
10
  module All
12
- def self.fetch(direction: nil, how: nil, limit: nil)
13
- transactions = []
14
-
15
- if direction.nil? || direction == 'in'
16
- Invoice::All.data(spontaneous: true).filter do |invoice|
17
- !invoice[:payments].nil? && invoice[:payments].size.positive?
18
- end.each do |invoice|
19
- transaction_how = invoice[:code].nil? ? 'spontaneously' : 'with-invoice'
20
-
21
- next if !how.nil? && how != transaction_how
22
-
23
- # TODO: Improve performance by reducing invoice fields and removing payments?
24
- invoice[:payments].each do |payment|
25
- transactions << {
26
- direction: 'in',
27
- at: payment[:at],
28
- amount: payment[:amount],
29
- how: transaction_how,
30
- message: payment[:message],
31
- data: { invoice: invoice }
32
- }
33
- end
34
- end
35
-
36
- Forward::All.data.each do |forward|
37
- next if !how.nil? && how != 'forwarding'
38
-
39
- transactions << {
40
- direction: 'in',
41
- at: forward[:at],
42
- amount: forward[:fee],
43
- how: 'forwarding',
44
- message: nil,
45
- data: {}
46
- }
47
- end
48
- end
11
+ def self.fetch(limit: nil)
12
+ at = Time.now
49
13
 
50
- if direction.nil? || direction == 'out'
51
- Payment::All.data(
52
- fetch: {
53
- get_node_info: false,
54
- lookup_invoice: false,
55
- decode_pay_req: true,
56
- get_chan_info: false
57
- }
58
- )[:data].each do |payment|
59
- transaction_how = payment[:invoice][:code].nil? ? 'spontaneously' : 'with-invoice'
14
+ transactions = []
60
15
 
61
- next if !how.nil? && how != transaction_how
16
+ response = Ports::GRPC.lightning.get_transactions
62
17
 
63
- # TODO: Improve performance by reducing invoice fields?
64
- transactions << {
65
- direction: 'out',
66
- at: payment[:at],
67
- amount: payment[:amount],
68
- how: transaction_how,
69
- message: payment[:message],
70
- data: { invoice: payment[:invoice] }
71
- }
72
- end
18
+ response.transactions.each do |transaction|
19
+ transactions << transaction.to_h
73
20
  end
74
21
 
75
- transactions = transactions.sort_by { |transaction| -transaction[:at].to_i }
22
+ transactions = transactions.sort_by { |raw_transaction| -raw_transaction[:time_stamp] }
76
23
 
77
24
  transactions = transactions[0..limit - 1] unless limit.nil?
78
25
 
79
- { transactions: transactions }
26
+ { at: at, get_transactions: transactions }
80
27
  end
81
28
 
82
- def self.transform(raw)
83
- raw[:transactions].map do |transaction|
84
- transaction[:_key] = SecureRandom.hex
85
- transaction
86
- end
29
+ def self.adapt(raw)
30
+ {
31
+ get_transactions: raw[:get_transactions].map do |raw_transaction|
32
+ Lighstorm::Adapter::Transaction.get_transactions(raw_transaction)
33
+ end
34
+ }
35
+ end
36
+
37
+ def self.transform(adapted)
38
+ adapted[:get_transactions]
87
39
  end
88
40
 
89
- def self.data(direction: nil, how: nil, limit: nil, &vcr)
41
+ def self.data(limit: nil, &vcr)
90
42
  raw = if vcr.nil?
91
- fetch(direction: direction, how: how, limit: limit)
43
+ fetch(limit: limit)
92
44
  else
93
- vcr.call(-> { fetch(direction: direction, how: how, limit: limit) })
45
+ vcr.call(-> { fetch(limit: limit) })
94
46
  end
47
+ adapted = adapt(raw)
95
48
 
96
- transform(raw)
49
+ transform(adapted)
97
50
  end
98
51
 
99
52
  def self.model(data)
100
- data.map { |data| Models::Transaction.new(data) }
53
+ data.map do |transaction_data|
54
+ Lighstorm::Models::Transaction.new(transaction_data)
55
+ end
101
56
  end
102
57
  end
103
58
  end
data/docs/README.md CHANGED
@@ -27,40 +27,16 @@ Lighstorm::Channel.mine.first.myself.node.alias
27
27
  Add to your `Gemfile`:
28
28
 
29
29
  ```ruby
30
- gem 'lighstorm', '~> 0.0.12'
30
+ gem 'lighstorm', '~> 0.0.13'
31
31
  ```
32
32
 
33
33
  Run `bundle install`.
34
34
 
35
- ## Credentials
36
-
37
- Set the following _Environment Variables_ or create a `.env` file:
38
- ```bash
39
- LIGHSTORM_LND_ADDRESS=127.0.0.1:10009
40
- LIGHSTORM_CERTIFICATE_PATH=/lnd/tls.cert
41
- LIGHSTORM_MACAROON_PATH=/lnd/data/chain/bitcoin/mainnet/admin.macaroon
42
- ```
43
-
44
- It will automatically load your credentials.
45
-
46
- Alternatively, you can set the credentials at runtime:
47
-
48
- ```ruby
49
- require 'lighstorm'
50
-
51
- Lighstorm.config!(
52
- lnd_address: '127.0.0.1:10009',
53
- certificate_path: '/lnd/tls.cert',
54
- macaroon_path: '/lnd/data/chain/bitcoin/mainnet/admin.macaroon',
55
- )
56
-
57
- ```
58
-
59
35
  ## Examples
60
36
  ```ruby
61
37
  require 'lighstorm'
62
38
 
63
- puts Lighstorm.version # => 0.0.12
39
+ puts Lighstorm.version # => 0.0.13
64
40
 
65
41
  Lighstorm::Invoice.create(
66
42
  description: 'Coffee', amount: { millisatoshis: 1000 }, payable: 'once'
@@ -116,6 +92,140 @@ Lighstorm::Satoshis.new(
116
92
 
117
93
  - [Getting Started with Lightning Payments in Ruby](https://mirror.xyz/icebaker.eth/4RUF8umW_KRfVWHHvC2jz0c7YJqzv3RUUvLN-Mln5IU)
118
94
 
95
+ # Connecting
96
+
97
+ ## Environment Variables
98
+
99
+ Choose a method and set the following _Environment Variables_, or create a `.env` file. This will automatically load your credentials.
100
+
101
+ ### lndconnect
102
+
103
+ Read more about [lnd connect URL](https://github.com/LN-Zap/lndconnect/blob/master/lnd_connect_uri.md).
104
+
105
+ ```bash
106
+ LIGHSTORM_LND_CONNECT=lndconnect://127.0.0.1:10009?cert=MIICJz...JBEERQ&macaroon=AgEDbG...45ukJ4
107
+ ```
108
+
109
+ ### File Path
110
+
111
+ ```bash
112
+ LIGHSTORM_LND_ADDRESS=127.0.0.1:10009
113
+ LIGHSTORM_LND_CERTIFICATE_PATH=/lnd/tls.cert
114
+ LIGHSTORM_LND_MACAROON_PATH=/lnd/data/chain/bitcoin/mainnet/admin.macaroon
115
+ ```
116
+
117
+ ### Base64
118
+
119
+ ```bash
120
+ LIGHSTORM_LND_ADDRESS=127.0.0.1:10009
121
+ LIGHSTORM_LND_CERTIFICATE=LS0tLS1CRU...UtLS0tLQo=
122
+ LIGHSTORM_LND_MACAROON=AgEDbG5kAv...inv45ukJ4=
123
+ ```
124
+
125
+ ### Hex
126
+
127
+ ```bash
128
+ LIGHSTORM_LND_ADDRESS=127.0.0.1:10009
129
+ LIGHSTORM_LND_CERTIFICATE=2d2d2d2d2d...2d2d2d2d0a
130
+ LIGHSTORM_LND_MACAROON=0201036c6e...bf8e6e909e
131
+ ```
132
+
133
+ ## Runtime
134
+ Alternatively, you can set the credentials at runtime:
135
+
136
+ ### lndconnect
137
+
138
+ Read more about [lnd connect URL](https://github.com/LN-Zap/lndconnect/blob/master/lnd_connect_uri.md).
139
+
140
+ ```ruby
141
+ require 'lighstorm'
142
+
143
+ Lighstorm.connect!(
144
+ 'lndconnect://127.0.0.1:10009?cert=MIICJz...JBEERQ&macaroon=AgEDbG...45ukJ4'
145
+ )
146
+ ```
147
+
148
+ ### File Path
149
+
150
+ ```ruby
151
+ require 'lighstorm'
152
+
153
+ Lighstorm.connect!(
154
+ address: '127.0.0.1:10009',
155
+ certificate_path: '/lnd/tls.cert',
156
+ macaroon_path: '/lnd/data/chain/bitcoin/mainnet/admin.macaroon'
157
+ )
158
+ ```
159
+
160
+ ### Base64
161
+
162
+ ```ruby
163
+ require 'lighstorm'
164
+
165
+ Lighstorm.connect!(
166
+ address: '127.0.0.1:10009',
167
+ certificate: 'LS0tLS1CRU...UtLS0tLQo=',
168
+ macaroon: 'AgEDbG5kAv...inv45ukJ4='
169
+ )
170
+ ```
171
+
172
+ ### Hex
173
+
174
+ ```ruby
175
+ require 'lighstorm'
176
+
177
+ Lighstorm.connect!(
178
+ address: '127.0.0.1:10009',
179
+ certificate: '2d2d2d2d2d...2d2d2d2d0a',
180
+ macaroon: '0201036c6e...bf8e6e909e'
181
+ )
182
+ ```
183
+
184
+ ### Raw
185
+
186
+ ```ruby
187
+ require 'lighstorm'
188
+
189
+ Lighstorm.connect!(
190
+ address: '127.0.0.1:10009',
191
+ certificate: File.read('/lnd/tls.cert'),
192
+ macaroon: File.read('/lnd/data/chain/bitcoin/mainnet/admin.macaroon')
193
+ )
194
+ ```
195
+
196
+ ## Docker and Remote Access
197
+
198
+ To connect to an LND node through a Docker container or remote host, you may need to adjust your certificate settings. Follow these steps:
199
+
200
+ 1. Stop your LND node.
201
+
202
+ 2. Remove or backup existing certificate files (`tls.cert` and `tls.key`) in the LND directory.
203
+
204
+ 3. Modify `lnd.conf` to include the relevant `tlsextraip` and/or `tlsextradomain` settings:
205
+
206
+ Option A: Accept any IP or domain (Warning: high security risk):
207
+
208
+ ```conf
209
+ tlsextraip=0.0.0.0
210
+ ```
211
+
212
+ Option B: Accept only your Docker host (172.17.0.1):
213
+ ```conf
214
+ tlsextraip=172.17.0.1
215
+ ```
216
+
217
+ Option C: Accept a specific remote domain and host:
218
+ ```config
219
+ tlsextraip=<your_remote_host_ip>
220
+ tlsextradomain=<your_domain_name>
221
+ ```
222
+
223
+ 4. Save and restart your LND node. New tls.cert and tls.key files will be generated.
224
+
225
+ 5. Update your LND client configuration with the new certificate.
226
+
227
+ Choose the option that best suits your needs and environment while considering security implications.
228
+
119
229
  # Data Modeling
120
230
 
121
231
  ## Graph Theory
@@ -1048,7 +1158,7 @@ gem 'lighstorm', path: '/home/user/lighstorm'
1048
1158
  # demo.rb
1049
1159
  require 'lighstorm'
1050
1160
 
1051
- puts Lighstorm.version # => 0.0.12
1161
+ puts Lighstorm.version # => 0.0.13
1052
1162
  ```
1053
1163
 
1054
1164
  ```sh
@@ -1285,13 +1395,13 @@ gem build lighstorm.gemspec
1285
1395
 
1286
1396
  gem signin
1287
1397
 
1288
- gem push lighstorm-0.0.12.gem
1398
+ gem push lighstorm-0.0.13.gem
1289
1399
  ```
1290
1400
 
1291
1401
  _________________
1292
1402
 
1293
1403
  <center>
1294
- lighstorm 0.0.12
1404
+ lighstorm 0.0.13
1295
1405
  |
1296
1406
  <a href="https://github.com/icebaker/lighstorm" rel="noopener noreferrer" target="_blank">GitHub</a>
1297
1407
  |
data/docs/_coverpage.md CHANGED
@@ -8,7 +8,7 @@
8
8
  - Built for maximum **reliability**.
9
9
  - Optimized for programmer **happiness**.
10
10
 
11
- 0.0.12
11
+ 0.0.13
12
12
 
13
13
  ⚠️ _Warning: Early-stage, breaking changes are expected._
14
14
 
data/docs/index.html CHANGED
@@ -18,7 +18,7 @@
18
18
  <script>
19
19
  window.$docsify = {
20
20
  coverpage: true,
21
- name: 'Lighstorm 0.0.12',
21
+ name: 'Lighstorm 0.0.13',
22
22
  repo: 'https://github.com/icebaker/lighstorm'
23
23
  }
24
24
  </script>
data/lighstorm.gemspec CHANGED
@@ -32,7 +32,7 @@ Gem::Specification.new do |spec|
32
32
  spec.require_paths = ['ports/dsl']
33
33
 
34
34
  spec.add_dependency 'dotenv', '~> 2.8', '>= 2.8.1'
35
- spec.add_dependency 'lnd-client', '~> 0.0.5'
35
+ spec.add_dependency 'lnd-client', '~> 0.0.6'
36
36
  spec.add_dependency 'zache', '~> 0.12.0'
37
37
 
38
38
  spec.metadata['rubygems_mfa_required'] = 'true'
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'invoice'
4
+ require_relative 'transaction'
5
+
6
+ module Lighstorm
7
+ module Models
8
+ class Activity
9
+ attr_reader :direction, :at, :message, :layer, :how, :_key
10
+
11
+ def initialize(data)
12
+ @data = data
13
+
14
+ @_key = @data[:_key]
15
+ @at = @data[:at]
16
+ @direction = @data[:direction]
17
+ @layer = @data[:layer]
18
+ @how = @data[:how]
19
+ @message = @data[:message]
20
+ end
21
+
22
+ def amount
23
+ @amount ||= Satoshis.new(millisatoshis: @data[:amount][:millisatoshis])
24
+ end
25
+
26
+ def invoice
27
+ @invoice ||= @data[:data][:invoice].nil? ? nil : Invoice.new(@data[:data][:invoice])
28
+ end
29
+
30
+ def transaction
31
+ @transaction ||= @data[:data][:transaction].nil? ? nil : Transaction.new(@data[:data][:transaction])
32
+ end
33
+
34
+ def to_h
35
+ output = {
36
+ _key: _key,
37
+ at: at,
38
+ direction: direction,
39
+ amount: amount.to_h,
40
+ how: how,
41
+ message: message
42
+ }
43
+
44
+ output[:invoice] = invoice.to_h unless invoice.nil?
45
+ output[:transaction] = transaction.to_h unless transaction.nil?
46
+
47
+ output
48
+ end
49
+ end
50
+ end
51
+ end
@@ -1,43 +1,38 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'invoice'
3
+ require_relative './satoshis'
4
4
 
5
5
  module Lighstorm
6
6
  module Models
7
7
  class Transaction
8
- attr_reader :direction, :at, :message, :how, :_key
8
+ attr_reader :_key, :at, :hash, :label
9
9
 
10
10
  def initialize(data)
11
11
  @data = data
12
12
 
13
13
  @_key = @data[:_key]
14
14
  @at = @data[:at]
15
- @direction = @data[:direction]
16
- @how = @data[:how]
17
- @message = @data[:message]
15
+ @hash = @data[:hash]
16
+ @label = @data[:label]
18
17
  end
19
18
 
20
19
  def amount
21
20
  @amount ||= Satoshis.new(millisatoshis: @data[:amount][:millisatoshis])
22
21
  end
23
22
 
24
- def invoice
25
- @invoice ||= @data[:data][:invoice].nil? ? nil : Invoice.new(@data[:data][:invoice])
23
+ def fee
24
+ @fee ||= Satoshis.new(millisatoshis: @data[:fee][:millisatoshis])
26
25
  end
27
26
 
28
27
  def to_h
29
- output = {
28
+ {
30
29
  _key: _key,
31
30
  at: at,
32
- direction: direction,
31
+ hash: hash,
33
32
  amount: amount.to_h,
34
- how: how,
35
- message: message
33
+ fee: fee.to_h,
34
+ label: label
36
35
  }
37
-
38
- output[:invoice] = invoice.to_h unless invoice.nil?
39
-
40
- output
41
36
  end
42
37
  end
43
38
  end
@@ -11,7 +11,7 @@ require_relative '../../controllers/channel'
11
11
  require_relative '../../controllers/payment'
12
12
  require_relative '../../controllers/forward'
13
13
  require_relative '../../controllers/invoice'
14
- require_relative '../../controllers/transaction'
14
+ require_relative '../../controllers/activity'
15
15
 
16
16
  module Lighstorm
17
17
  Node = Controllers::Node
@@ -19,12 +19,12 @@ module Lighstorm
19
19
  Payment = Controllers::Payment
20
20
  Forward = Controllers::Forward
21
21
  Invoice = Controllers::Invoice
22
- Transaction = Controllers::Transaction
22
+ Activity = Controllers::Activity
23
23
 
24
24
  Satoshis = Models::Satoshis
25
25
 
26
- def self.config!(config)
27
- LND.instance.config = config
26
+ def self.connect!(config)
27
+ LND.instance.connect!(config)
28
28
  end
29
29
 
30
30
  def self.inject_middleware!(middleware_lambda)
data/static/cache.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  module Lighstorm
4
4
  module Static
5
5
  CACHE = {
6
+ lightning_get_transactions: false,
6
7
  lightning_update_channel_policy: false,
7
8
  lightning_add_invoice: false,
8
9
  router_send_payment_v2: false,
data/static/spec.rb CHANGED
@@ -4,7 +4,7 @@ module Lighstorm
4
4
  module Static
5
5
  SPEC = {
6
6
  name: 'lighstorm',
7
- version: '0.0.12',
7
+ version: '0.0.13',
8
8
  author: 'icebaker',
9
9
  summary: 'API for interacting with a Lightning Node.',
10
10
  description: 'Lighstorm is an opinionated abstraction layer on top of the lnd-client for interacting with a Lightning Node.',
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lighstorm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - icebaker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-03-13 00:00:00.000000000 Z
11
+ date: 2023-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dotenv
@@ -36,14 +36,14 @@ dependencies:
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 0.0.5
39
+ version: 0.0.6
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: 0.0.5
46
+ version: 0.0.6
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: zache
49
49
  requirement: !ruby/object:Gem::Requirement
@@ -85,9 +85,12 @@ files:
85
85
  - adapters/edges/payment/purpose.rb
86
86
  - adapters/invoice.rb
87
87
  - adapters/nodes/node.rb
88
+ - adapters/transaction.rb
88
89
  - components/cache.rb
89
90
  - components/lnd.rb
90
91
  - controllers/action.rb
92
+ - controllers/activity.rb
93
+ - controllers/activity/all.rb
91
94
  - controllers/channel.rb
92
95
  - controllers/channel/actions/apply_gossip.rb
93
96
  - controllers/channel/actions/update_fee.rb
@@ -130,6 +133,7 @@ files:
130
133
  - docs/vendor/prismjs/prism-tomorrow.min.css
131
134
  - helpers/time_expression.rb
132
135
  - lighstorm.gemspec
136
+ - models/activity.rb
133
137
  - models/concerns/protectable.rb
134
138
  - models/connections/channel_node.rb
135
139
  - models/connections/channel_node/accounting.rb