lighstorm 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/.env.example +5 -0
  3. data/.github/workflows/ruby-rspec-tests.yml +39 -0
  4. data/.gitignore +1 -0
  5. data/.rspec +1 -0
  6. data/.rubocop.yml +10 -0
  7. data/Gemfile +4 -0
  8. data/Gemfile.lock +26 -2
  9. data/README.md +30 -371
  10. data/adapters/connections/channel_node/fee.rb +26 -0
  11. data/adapters/connections/channel_node/policy.rb +61 -0
  12. data/adapters/connections/channel_node.rb +74 -0
  13. data/adapters/connections/payment_channel.rb +28 -0
  14. data/adapters/edges/channel.rb +96 -0
  15. data/adapters/edges/forward.rb +40 -0
  16. data/adapters/edges/payment/purpose.rb +32 -0
  17. data/adapters/edges/payment.rb +50 -0
  18. data/adapters/invoice.rb +49 -0
  19. data/adapters/nodes/node.rb +111 -0
  20. data/adapters/payment_request.rb +76 -0
  21. data/components/cache.rb +3 -2
  22. data/components/lnd.rb +5 -1
  23. data/controllers/channel/actions/apply_gossip.rb +194 -0
  24. data/controllers/channel/actions/update_fee.rb +76 -0
  25. data/controllers/channel/all.rb +79 -0
  26. data/controllers/channel/find_by_id.rb +153 -0
  27. data/controllers/channel/mine.rb +114 -0
  28. data/controllers/channel.rb +27 -0
  29. data/controllers/forward/all.rb +244 -0
  30. data/controllers/forward/group_by_channel.rb +89 -0
  31. data/controllers/forward.rb +28 -0
  32. data/controllers/invoice/actions/create.rb +36 -0
  33. data/controllers/invoice/actions/pay.rb +28 -0
  34. data/controllers/invoice/actions/pay_through_route.rb +71 -0
  35. data/controllers/invoice/all.rb +70 -0
  36. data/controllers/invoice/find_by_secret_hash.rb +42 -0
  37. data/controllers/invoice.rb +36 -0
  38. data/controllers/node/actions/apply_gossip.rb +112 -0
  39. data/controllers/node/all.rb +63 -0
  40. data/controllers/node/find_by_public_key.rb +49 -0
  41. data/controllers/node/myself.rb +34 -0
  42. data/controllers/node.rb +27 -0
  43. data/controllers/payment/all.rb +368 -0
  44. data/controllers/payment.rb +21 -0
  45. data/docs/.nojekyll +0 -0
  46. data/docs/README.md +731 -0
  47. data/docs/_coverpage.md +12 -0
  48. data/docs/index.html +26 -0
  49. data/docs/vendor/docsify/docsify@4.js +1 -0
  50. data/docs/vendor/docsify-themeable/theme-simple-dark.css +3 -0
  51. data/docs/vendor/docsify-themeable/theme-simple-dark.css.map +1 -0
  52. data/docs/vendor/prismjs/prism-bash.min.js +1 -0
  53. data/docs/vendor/prismjs/prism-ruby.min.js +1 -0
  54. data/docs/vendor/prismjs/prism-tomorrow.min.css +1 -0
  55. data/lighstorm.gemspec +3 -1
  56. data/models/concerns/protectable.rb +23 -0
  57. data/models/connections/channel_node/accounting.rb +7 -14
  58. data/models/connections/channel_node/fee.rb +55 -84
  59. data/models/connections/channel_node/htlc/blocks/delta.rb +39 -0
  60. data/models/connections/channel_node/htlc.rb +65 -11
  61. data/models/connections/channel_node/policy.rb +15 -18
  62. data/models/connections/channel_node.rb +48 -22
  63. data/models/connections/forward_channel.rb +8 -43
  64. data/models/connections/payment_channel.rb +18 -39
  65. data/models/edges/channel/accounting.rb +45 -20
  66. data/models/edges/channel/hop.rb +65 -0
  67. data/models/edges/channel.rb +111 -169
  68. data/models/edges/forward.rb +9 -119
  69. data/models/edges/groups/{analysis.rb → channel_forwards/analysis.rb} +9 -9
  70. data/models/edges/groups/channel_forwards.rb +10 -40
  71. data/models/edges/payment.rb +29 -215
  72. data/models/errors.rb +32 -0
  73. data/models/invoice.rb +49 -0
  74. data/models/nodes/node/lightning.rb +11 -16
  75. data/models/nodes/node/platform.rb +13 -13
  76. data/models/nodes/node.rb +59 -103
  77. data/models/payment_request.rb +72 -0
  78. data/models/rate.rb +11 -1
  79. data/models/satoshis.rb +5 -6
  80. data/ports/dsl/lighstorm/errors.rb +5 -0
  81. data/ports/dsl/lighstorm.rb +11 -9
  82. data/ports/grpc/session.rb +26 -0
  83. data/ports/grpc.rb +80 -0
  84. data/static/cache.rb +12 -0
  85. data/static/spec.rb +3 -1
  86. metadata +62 -6
  87. data/models/connections/channel_node/constraints.rb +0 -24
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'digest'
4
+ require_relative 'satoshis'
5
+
6
+ module Lighstorm
7
+ module Models
8
+ class PaymentRequest
9
+ attr_reader :_key, :code, :address
10
+
11
+ def initialize(data)
12
+ @data = data
13
+
14
+ @_key = data[:_key] || Digest::SHA256.hexdigest(
15
+ data[:code] || "#{data[:code][:amount][:milisatoshis]}#{Time.now}"
16
+ )
17
+
18
+ @code = data[:code]
19
+
20
+ @address = data[:address]
21
+ end
22
+
23
+ def amount
24
+ @amount ||= Satoshis.new(milisatoshis: @data[:amount][:milisatoshis])
25
+ end
26
+
27
+ def description
28
+ @description ||= Struct.new(:data) do
29
+ def memo
30
+ data[:memo]
31
+ end
32
+
33
+ def hash
34
+ data[:hash]
35
+ end
36
+
37
+ def to_h
38
+ { memo: memo, hash: hash }
39
+ end
40
+ end.new(@data[:description] || {})
41
+ end
42
+
43
+ def secret
44
+ @secret ||= Struct.new(:data) do
45
+ def preimage
46
+ data[:preimage]
47
+ end
48
+
49
+ def hash
50
+ data[:hash]
51
+ end
52
+
53
+ def to_h
54
+ # Don't expose 'secret' by default: Security
55
+ { hash: hash }
56
+ end
57
+ end.new(@data[:secret] || {})
58
+ end
59
+
60
+ def to_h
61
+ # Don't expose 'address' by default: Privacy
62
+ {
63
+ _key: _key,
64
+ code: code,
65
+ amount: amount.to_h,
66
+ description: description.to_h,
67
+ secret: secret.to_h
68
+ }
69
+ end
70
+ end
71
+ end
72
+ end
data/models/rate.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../ports/dsl/lighstorm/errors'
4
+
3
5
  module Lighstorm
4
6
  module Models
5
7
  class Rate
@@ -7,12 +9,20 @@ module Lighstorm
7
9
 
8
10
  # https://en.wikipedia.org/wiki/Parts-per_notation
9
11
  def initialize(parts_per_million: nil)
10
- raise 'missing parts_per_million' if parts_per_million.nil?
12
+ raise MissingPartsPerMillionError, 'missing parts_per_million' if parts_per_million.nil?
11
13
 
12
14
  # TODO
13
15
  @parts_per_million = parts_per_million
14
16
  end
15
17
 
18
+ def ppm
19
+ @parts_per_million
20
+ end
21
+
22
+ def percentage
23
+ @percentage ||= @parts_per_million.to_f / 10_000
24
+ end
25
+
16
26
  def to_h
17
27
  {
18
28
  parts_per_million: @parts_per_million
data/models/satoshis.rb CHANGED
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../ports/dsl/lighstorm/errors'
4
+
3
5
  module Lighstorm
4
6
  module Models
5
7
  class Satoshis
6
8
  def initialize(milisatoshis: nil)
7
- raise 'missing milisatoshis' if milisatoshis.nil?
9
+ raise MissingMilisatoshisError, 'missing milisatoshis' if milisatoshis.nil?
8
10
 
9
11
  @amount_in_milisatoshis = milisatoshis
10
12
  end
@@ -15,8 +17,7 @@ module Lighstorm
15
17
  if reference_milisatoshis.zero?
16
18
  0
17
19
  else
18
- @amount_in_milisatoshis.to_f /
19
- reference_milisatoshis
20
+ @amount_in_milisatoshis.to_f / reference_milisatoshis
20
21
  end
21
22
  ) * 1_000_000.0
22
23
  )
@@ -27,7 +28,7 @@ module Lighstorm
27
28
  end
28
29
 
29
30
  def satoshis
30
- (@amount_in_milisatoshis.to_f / 1000.0).to_i
31
+ @amount_in_milisatoshis.to_f / 1000.0
31
32
  end
32
33
 
33
34
  def bitcoins
@@ -49,8 +50,6 @@ module Lighstorm
49
50
  def to_h
50
51
  {
51
52
  milisatoshis: milisatoshis
52
- # satoshis: satoshis,
53
- # bitcoins: bitcoins
54
53
  }
55
54
  end
56
55
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../models/errors'
4
+
5
+ include Lighstorm::Errors
@@ -6,17 +6,19 @@ require_relative '../../static/spec'
6
6
 
7
7
  require_relative '../../models/satoshis'
8
8
 
9
- require_relative '../../models/nodes/node'
10
-
11
- require_relative '../../models/edges/channel'
12
- require_relative '../../models/edges/forward'
13
- require_relative '../../models/edges/payment'
9
+ require_relative '../../controllers/node'
10
+ require_relative '../../controllers/channel'
11
+ require_relative '../../controllers/payment'
12
+ require_relative '../../controllers/forward'
13
+ require_relative '../../controllers/invoice'
14
14
 
15
15
  module Lighstorm
16
- Node = Models::Node
17
- Channel = Models::Channel
18
- Forward = Models::Forward
19
- Payment = Models::Payment
16
+ Node = Controllers::Node
17
+ Channel = Controllers::Channel
18
+ Payment = Controllers::Payment
19
+ Forward = Controllers::Forward
20
+ Invoice = Controllers::Invoice
21
+
20
22
  Satoshis = Models::Satoshis
21
23
 
22
24
  def self.config!(config)
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lighstorm
4
+ module Ports
5
+ class GRPCSession
6
+ attr_reader :calls
7
+
8
+ def initialize(grpc)
9
+ @grpc = grpc
10
+ @calls = {}
11
+ end
12
+
13
+ def handler(key, &block)
14
+ @calls[key] = 0 unless @calls.key?(key)
15
+ @calls[key] += 1
16
+ block.call
17
+ end
18
+
19
+ def method_missing(method_name, *args)
20
+ @grpc.send(method_name, *args) do |key, &block|
21
+ handler(key, &block)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
data/ports/grpc.rb ADDED
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../components/cache'
4
+ require_relative '../components/lnd'
5
+ require_relative 'grpc/session'
6
+
7
+ module Lighstorm
8
+ module Ports
9
+ class GRPC
10
+ def initialize(service, service_key, &handler)
11
+ @service = service
12
+ @service_key = service_key
13
+ @handler = handler
14
+ end
15
+
16
+ def call!(call_key, *args, &block)
17
+ key = "#{@service_key}.#{call_key}"
18
+
19
+ if block.nil?
20
+ response = Cache.for(key, params: args&.first) do
21
+ LND.instance.middleware(key) do
22
+ if @handler
23
+ @handler.call(call_key) do
24
+ @service.send(call_key, *args, &block)
25
+ end
26
+ else
27
+ @service.send(call_key, *args, &block)
28
+ end
29
+ end
30
+ end
31
+ else
32
+ LND.instance.middleware(key) do
33
+ if @handler
34
+ @handler.call(call_key) do
35
+ @service.send(call_key, *args, &block)
36
+ end
37
+ else
38
+ @service.send(call_key, *args, &block)
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ def method_missing(method_name, *args, &block)
45
+ call_key = method_name.to_sym
46
+
47
+ raise ArgumentError, "Method `#{method_name}` doesn't exist." unless @service.respond_to?(call_key)
48
+
49
+ call!(call_key, *args, &block)
50
+ end
51
+
52
+ def respond_to_missing?(method_name, include_private = false)
53
+ call_key = method_name.to_sym
54
+
55
+ @service.respond_to?(call_key) || super
56
+ end
57
+
58
+ def self.session
59
+ GRPCSession.new(self)
60
+ end
61
+
62
+ def self.method_missing(method_name, *_args, &block)
63
+ service_key = method_name.to_sym
64
+
65
+ unless LND.instance.client.respond_to?(service_key)
66
+ raise ArgumentError,
67
+ "Method `#{method_name}` doesn't exist."
68
+ end
69
+
70
+ new(LND.instance.client.send(service_key), service_key, &block)
71
+ end
72
+
73
+ def self.respond_to_missing?(method_name, include_private = false)
74
+ service_key = method_name.to_sym
75
+
76
+ LND.instance.client.respond_to?(service_key) || super
77
+ end
78
+ end
79
+ end
80
+ end
data/static/cache.rb CHANGED
@@ -9,6 +9,18 @@ module Lighstorm
9
9
  base_fee_msat fee_per_mil
10
10
  ]
11
11
  },
12
+ decode_pay_req: {
13
+ ttl: 5 * 60
14
+ },
15
+ describe_graph: {
16
+ ttl: 0
17
+ },
18
+ lookup_invoice: {
19
+ ttl: 1
20
+ },
21
+ list_invoices: {
22
+ ttl: 1
23
+ },
12
24
  forwarding_history: {
13
25
  ttl: 1,
14
26
  properties: %i[
data/static/spec.rb CHANGED
@@ -4,11 +4,13 @@ module Lighstorm
4
4
  module Static
5
5
  SPEC = {
6
6
  name: 'lighstorm',
7
- version: '0.0.3',
7
+ version: '0.0.5',
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.',
11
11
  github: 'https://github.com/icebaker/lighstorm',
12
+ documentation: 'https://icebaker.github.io/lighstorm',
13
+ issues: 'https://github.com/icebaker/lighstorm/issues',
12
14
  license: 'MIT'
13
15
  }.freeze
14
16
  end
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.3
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - icebaker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-12 00:00:00.000000000 Z
11
+ date: 2023-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dotenv
@@ -65,44 +65,100 @@ executables: []
65
65
  extensions: []
66
66
  extra_rdoc_files: []
67
67
  files:
68
+ - ".env.example"
69
+ - ".github/workflows/ruby-rspec-tests.yml"
68
70
  - ".gitignore"
71
+ - ".rspec"
69
72
  - ".rubocop.yml"
70
73
  - Gemfile
71
74
  - Gemfile.lock
72
75
  - LICENSE
73
76
  - README.md
77
+ - adapters/connections/channel_node.rb
78
+ - adapters/connections/channel_node/fee.rb
79
+ - adapters/connections/channel_node/policy.rb
80
+ - adapters/connections/payment_channel.rb
81
+ - adapters/edges/channel.rb
82
+ - adapters/edges/forward.rb
83
+ - adapters/edges/payment.rb
84
+ - adapters/edges/payment/purpose.rb
85
+ - adapters/invoice.rb
86
+ - adapters/nodes/node.rb
87
+ - adapters/payment_request.rb
74
88
  - components/cache.rb
75
89
  - components/lnd.rb
90
+ - controllers/channel.rb
91
+ - controllers/channel/actions/apply_gossip.rb
92
+ - controllers/channel/actions/update_fee.rb
93
+ - controllers/channel/all.rb
94
+ - controllers/channel/find_by_id.rb
95
+ - controllers/channel/mine.rb
96
+ - controllers/forward.rb
97
+ - controllers/forward/all.rb
98
+ - controllers/forward/group_by_channel.rb
99
+ - controllers/invoice.rb
100
+ - controllers/invoice/actions/create.rb
101
+ - controllers/invoice/actions/pay.rb
102
+ - controllers/invoice/actions/pay_through_route.rb
103
+ - controllers/invoice/all.rb
104
+ - controllers/invoice/find_by_secret_hash.rb
105
+ - controllers/node.rb
106
+ - controllers/node/actions/apply_gossip.rb
107
+ - controllers/node/all.rb
108
+ - controllers/node/find_by_public_key.rb
109
+ - controllers/node/myself.rb
110
+ - controllers/payment.rb
111
+ - controllers/payment/all.rb
112
+ - docs/.nojekyll
113
+ - docs/README.md
114
+ - docs/_coverpage.md
115
+ - docs/index.html
116
+ - docs/vendor/docsify-themeable/theme-simple-dark.css
117
+ - docs/vendor/docsify-themeable/theme-simple-dark.css.map
118
+ - docs/vendor/docsify/docsify@4.js
119
+ - docs/vendor/prismjs/prism-bash.min.js
120
+ - docs/vendor/prismjs/prism-ruby.min.js
121
+ - docs/vendor/prismjs/prism-tomorrow.min.css
76
122
  - lighstorm.gemspec
123
+ - models/concerns/protectable.rb
77
124
  - models/connections/channel_node.rb
78
125
  - models/connections/channel_node/accounting.rb
79
- - models/connections/channel_node/constraints.rb
80
126
  - models/connections/channel_node/fee.rb
81
127
  - models/connections/channel_node/htlc.rb
128
+ - models/connections/channel_node/htlc/blocks/delta.rb
82
129
  - models/connections/channel_node/policy.rb
83
130
  - models/connections/forward_channel.rb
84
131
  - models/connections/payment_channel.rb
85
132
  - models/edges/channel.rb
86
133
  - models/edges/channel/accounting.rb
134
+ - models/edges/channel/hop.rb
87
135
  - models/edges/forward.rb
88
- - models/edges/groups/analysis.rb
89
136
  - models/edges/groups/channel_forwards.rb
137
+ - models/edges/groups/channel_forwards/analysis.rb
90
138
  - models/edges/payment.rb
139
+ - models/errors.rb
140
+ - models/invoice.rb
91
141
  - models/nodes/node.rb
92
142
  - models/nodes/node/lightning.rb
93
143
  - models/nodes/node/platform.rb
144
+ - models/payment_request.rb
94
145
  - models/rate.rb
95
146
  - models/satoshis.rb
96
147
  - ports/dsl/lighstorm.rb
148
+ - ports/dsl/lighstorm/errors.rb
149
+ - ports/grpc.rb
150
+ - ports/grpc/session.rb
97
151
  - static/cache.rb
98
152
  - static/spec.rb
99
- homepage: https://github.com/icebaker/lighstorm
153
+ homepage: https://icebaker.github.io/lighstorm
100
154
  licenses:
101
155
  - MIT
102
156
  metadata:
103
157
  allowed_push_host: https://rubygems.org
104
- homepage_uri: https://github.com/icebaker/lighstorm
158
+ homepage_uri: https://icebaker.github.io/lighstorm
105
159
  source_code_uri: https://github.com/icebaker/lighstorm
160
+ documentation_uri: https://icebaker.github.io/lighstorm
161
+ bug_tracker_uri: https://github.com/icebaker/lighstorm/issues
106
162
  rubygems_mfa_required: 'true'
107
163
  post_install_message:
108
164
  rdoc_options: []
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Lighstorm
4
- module Models
5
- class Constraints
6
- def initialize(channel, node)
7
- @channel = channel
8
- @node = node
9
- end
10
-
11
- def data
12
- @data ||= if @node.myself?
13
- @channel.data[:list_channels][:channels].first.local_constraints
14
- else
15
- @channel.data[:list_channels][:channels].first.remote_constraints
16
- end
17
- end
18
-
19
- def to_h
20
- data.to_h
21
- end
22
- end
23
- end
24
- end