lighstorm 0.0.10 → 0.0.11

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ed188ef291ac08a9cc6f91dca92931be2c88257ee184416fd0f40a3224740b20
4
- data.tar.gz: 1be060a12d9e755354764cc8151da8a26e114fcc9a0ecac470e9fe9b685a60a4
3
+ metadata.gz: 6072337300f3fd850fbca3ba5c7c804842c275d5f35fa288dfb83747fa0b1a56
4
+ data.tar.gz: 8a16d83cb96f0ed911ebd55e12707b20f0aac00a0acac8d176e544a68abad647
5
5
  SHA512:
6
- metadata.gz: b37802f04bae65416f4e80590506518025d62f1ca9b502b97db3cc108792b13a077f2ebb89c3e0be4cf311fb10a53f916a3c37e2f6c729b9bf01f187b0ab4892
7
- data.tar.gz: ac5f5a1f5f4ff271ab2ddef517763f380f1868b71339bcf1758975e35c7e520ddd65fddb9d210539fedde2dc3830912db8b0bbdbfed1aa454e781c8a6e43e948
6
+ metadata.gz: 3ccb6cef3322fcd1c0efb1439ddaf756e631113fbc7544218d10d6f71d08ca2ad80cf08b029ae4145e6916dcefc9ee3683124567bb952b02bf70793cc794616b
7
+ data.tar.gz: 2755ec9d8c2bf041459be7292983103c880f032e5e1e315ce2da2cc97ff945bbfb9f4083259a0c88ec22df8cd0301282c8ea376d63371a438ad58677b7f3d9e6
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- lighstorm (0.0.10)
4
+ lighstorm (0.0.11)
5
5
  dotenv (~> 2.8, >= 2.8.1)
6
6
  lnd-client (~> 0.0.5)
7
7
  zache (~> 0.12.0)
@@ -47,7 +47,7 @@ GEM
47
47
  rspec-expectations (3.12.2)
48
48
  diff-lcs (>= 1.2.0, < 2.0)
49
49
  rspec-support (~> 3.12.0)
50
- rspec-mocks (3.12.3)
50
+ rspec-mocks (3.12.4)
51
51
  diff-lcs (>= 1.2.0, < 2.0)
52
52
  rspec-support (~> 3.12.0)
53
53
  rspec-support (3.12.0)
data/README.md CHANGED
@@ -34,7 +34,7 @@ Although it tries to stay close to [Lightning's terminologies](https://docs.ligh
34
34
  Add to your `Gemfile`:
35
35
 
36
36
  ```ruby
37
- gem 'lighstorm', '~> 0.0.10'
37
+ gem 'lighstorm', '~> 0.0.11'
38
38
  ```
39
39
 
40
40
  ```ruby
@@ -46,7 +46,7 @@ Lighstorm.config!(
46
46
  macaroon_path: '/lnd/data/chain/bitcoin/mainnet/admin.macaroon',
47
47
  )
48
48
 
49
- puts Lighstorm.version # => 0.0.10
49
+ puts Lighstorm.version # => 0.0.11
50
50
 
51
51
  Lighstorm::Node.myself.alias # => icebaker/old-stone
52
52
 
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../ports/grpc'
4
+ require_relative '../../adapters/invoice'
5
+ require_relative '../../models/invoice'
6
+
7
+ module Lighstorm
8
+ module Controllers
9
+ module Invoice
10
+ module FindByCode
11
+ def self.fetch(code)
12
+ at = Time.now
13
+
14
+ decoded = Ports::GRPC.lightning.decode_pay_req(pay_req: code).to_h
15
+
16
+ { response: {
17
+ at: at,
18
+ decode_pay_req: decoded,
19
+ lookup_invoice: Ports::GRPC.lightning.lookup_invoice(r_hash_str: decoded[:payment_hash]).to_h
20
+ }, exception: nil }
21
+ rescue StandardError => e
22
+ { exception: e }
23
+ end
24
+
25
+ def self.adapt(raw)
26
+ raise 'missing at' if raw[:at].nil?
27
+
28
+ {
29
+ lookup_invoice: Lighstorm::Adapter::Invoice.lookup_invoice(
30
+ raw[:lookup_invoice],
31
+ raw[:at]
32
+ )
33
+ }
34
+ end
35
+
36
+ def self.transform(adapted)
37
+ adapted[:lookup_invoice][:known] = true
38
+ adapted[:lookup_invoice]
39
+ end
40
+
41
+ def self.data(code, &vcr)
42
+ raw = vcr.nil? ? fetch(code) : vcr.call(-> { fetch(code) })
43
+
44
+ raise_error_if_exists!(raw)
45
+
46
+ adapted = adapt(raw[:response])
47
+
48
+ transform(adapted)
49
+ end
50
+
51
+ def self.model(data)
52
+ Lighstorm::Models::Invoice.new(data)
53
+ end
54
+
55
+ def self.raise_error_if_exists!(response)
56
+ return if response[:exception].nil?
57
+
58
+ if response[:exception].is_a?(GRPC::NotFound)
59
+ raise NoInvoiceFoundError.new(
60
+ "Invoice not found. Try using Invoice.decode if you don't own the invoice.",
61
+ grpc: response[:exception]
62
+ )
63
+ end
64
+
65
+ raise LighstormError.new(grpc: response[:exception])
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -9,10 +9,12 @@ module Lighstorm
9
9
  module Invoice
10
10
  module FindBySecretHash
11
11
  def self.fetch(secret_hash)
12
- {
12
+ { response: {
13
13
  at: Time.now,
14
14
  lookup_invoice: Ports::GRPC.lightning.lookup_invoice(r_hash_str: secret_hash).to_h
15
- }
15
+ }, exception: nil }
16
+ rescue StandardError => e
17
+ { exception: e }
16
18
  end
17
19
 
18
20
  def self.adapt(raw)
@@ -34,7 +36,7 @@ module Lighstorm
34
36
  def self.data(secret_hash, &vcr)
35
37
  raw = vcr.nil? ? fetch(secret_hash) : vcr.call(-> { fetch(secret_hash) })
36
38
 
37
- adapted = adapt(raw)
39
+ adapted = adapt(raw[:response])
38
40
 
39
41
  transform(adapted)
40
42
  end
@@ -3,6 +3,7 @@
3
3
  require_relative './invoice/all'
4
4
  require_relative './invoice/decode'
5
5
  require_relative './invoice/find_by_secret_hash'
6
+ require_relative './invoice/find_by_code'
6
7
  require_relative './invoice/actions/create'
7
8
 
8
9
  module Lighstorm
@@ -20,8 +21,12 @@ module Lighstorm
20
21
  All.model(All.data).last
21
22
  end
22
23
 
23
- def self.find_by_secret_hash(secret_hash)
24
- FindBySecretHash.model(FindBySecretHash.data(secret_hash))
24
+ def self.find_by_secret_hash(secret_hash, &vcr)
25
+ FindBySecretHash.model(FindBySecretHash.data(secret_hash, &vcr))
26
+ end
27
+
28
+ def self.find_by_code(code, &vcr)
29
+ FindByCode.model(FindByCode.data(code, &vcr))
25
30
  end
26
31
 
27
32
  def self.decode(code, &vcr)
@@ -12,7 +12,7 @@ module Lighstorm
12
12
  module Controllers
13
13
  module Payment
14
14
  module All
15
- def self.fetch(purpose: nil, limit: nil, fetch: {})
15
+ def self.fetch(purpose: nil, invoice_code: nil, secret_hash: nil, limit: nil, fetch: {})
16
16
  at = Time.now
17
17
 
18
18
  grpc = Ports::GRPC.session
@@ -31,6 +31,10 @@ module Lighstorm
31
31
  response.payments.each do |payment|
32
32
  payment = payment.to_h
33
33
 
34
+ next unless invoice_code.nil? || payment[:payment_request] == invoice_code
35
+
36
+ next unless secret_hash.nil? || payment[:payment_hash] == secret_hash
37
+
34
38
  payment_purpose = Adapter::Purpose.list_payments(payment, get_info)
35
39
 
36
40
  case purpose
@@ -391,11 +395,22 @@ module Lighstorm
391
395
  list_payments
392
396
  end
393
397
 
394
- def self.data(purpose: nil, limit: nil, fetch: {}, &vcr)
398
+ def self.data(
399
+ purpose: nil, invoice_code: nil, secret_hash: nil, limit: nil,
400
+ fetch: {}, &vcr
401
+ )
395
402
  raw = if vcr.nil?
396
- self.fetch(purpose: purpose, limit: limit, fetch: fetch)
403
+ self.fetch(
404
+ purpose: purpose, invoice_code: invoice_code, secret_hash: secret_hash,
405
+ limit: limit, fetch: fetch
406
+ )
397
407
  else
398
- vcr.call(-> { self.fetch(purpose: purpose, limit: limit, fetch: fetch) })
408
+ vcr.call(lambda {
409
+ self.fetch(
410
+ purpose: purpose, invoice_code: invoice_code, secret_hash: secret_hash,
411
+ limit: limit, fetch: fetch
412
+ )
413
+ })
399
414
  end
400
415
 
401
416
  adapted = adapt(raw)
@@ -16,6 +16,14 @@ module Lighstorm
16
16
  def self.last(purpose: nil, fetch: {})
17
17
  All.model(All.data(purpose: purpose, fetch: fetch)).last
18
18
  end
19
+
20
+ def self.find_by_secret_hash(secret_hash, &vcr)
21
+ All.model(All.data(secret_hash: secret_hash, &vcr)).first
22
+ end
23
+
24
+ def self.find_by_invoice_code(invoice_code, &vcr)
25
+ All.model(All.data(invoice_code: invoice_code, &vcr)).first
26
+ end
19
27
  end
20
28
  end
21
29
  end
data/docs/README.md CHANGED
@@ -27,7 +27,7 @@ Lighstorm::Channel.mine.first.myself.node.alias
27
27
  Add to your `Gemfile`:
28
28
 
29
29
  ```ruby
30
- gem 'lighstorm', '~> 0.0.10'
30
+ gem 'lighstorm', '~> 0.0.11'
31
31
  ```
32
32
 
33
33
  Run `bundle install`.
@@ -60,7 +60,7 @@ Lighstorm.config!(
60
60
  ```ruby
61
61
  require 'lighstorm'
62
62
 
63
- puts Lighstorm.version # => 0.0.10
63
+ puts Lighstorm.version # => 0.0.11
64
64
 
65
65
  Lighstorm::Invoice.create(
66
66
  description: 'Coffee', amount: { millisatoshis: 1000 }, payable: 'once'
@@ -462,6 +462,12 @@ Lighstorm::Invoice.find_by_secret_hash(
462
462
  '1d438b8100518c9fba0a607e3317d6b36f74ceef3a6591836eb2f679c6853501'
463
463
  )
464
464
 
465
+ invoice = Lighstorm::Invoice.find_by_code('lnbc20n1pj...0eqps7h0k9')
466
+
467
+ invoice.secret.valid_proof?(
468
+ 'c504f73f83e3772b802844b54021e44e071c03011eeda476b198f7a093bcb09e'
469
+ ) # => true
470
+
465
471
  # _key is helpful for reactive javascript frameworks.
466
472
  # Please don't consider it as a unique identifier
467
473
  # for the item. Instead, use it as a volatile key for
@@ -526,6 +532,19 @@ action.response
526
532
  invoice = action.result
527
533
  ```
528
534
 
535
+ ### Proof of Payment
536
+
537
+ [Making Payments](https://docs.lightning.engineering/the-lightning-network/multihop-payments)
538
+
539
+
540
+ ```ruby
541
+ invoice = Lighstorm::Invoice.find_by_code('lnbc20n1pj...0eqps7h0k9')
542
+
543
+ invoice.secret.valid_proof?(
544
+ 'c504f73f83e3772b802844b54021e44e071c03011eeda476b198f7a093bcb09e'
545
+ ) # => true
546
+ ```
547
+
529
548
  ### Pay
530
549
 
531
550
  [Understanding Lightning Invoices](https://docs.lightning.engineering/the-lightning-network/payment-lifecycle/understanding-lightning-invoices)
@@ -547,6 +566,8 @@ payment = action.result
547
566
  payment.at
548
567
  payment.state
549
568
 
569
+ payment.secret.proof
570
+
550
571
  payment.amount.millisatoshis
551
572
  payment.fee.millisatoshis
552
573
  payment.fee.parts_per_million(
@@ -622,6 +643,7 @@ rescue PaymentError => error
622
643
  error.result
623
644
  end
624
645
  ```
646
+
625
647
  ## Payment
626
648
 
627
649
  [![This is an image representing Payment as a graph.](https://raw.githubusercontent.com/icebaker/assets/main/lighstorm/graph-payment.png)](https://raw.githubusercontent.com/icebaker/assets/main/lighstorm/graph-payment.png)
@@ -642,6 +664,12 @@ Lighstorm::Payment.all(limit: 10, purpose: 'rebalance')
642
664
  # 'self-payment', 'peer-to-peer',
643
665
  # 'rebalance', 'payment'
644
666
 
667
+ Lighstorm::Payment.find_by_invoice_code('lnbc20n1pj...0eqps7h0k9')
668
+
669
+ Lighstorm::Payment.find_by_secret_hash(
670
+ '1d438b8100518c9fba0a607e3317d6b36f74ceef3a6591836eb2f679c6853501'
671
+ )
672
+
645
673
  # _key is helpful for reactive javascript frameworks.
646
674
  # Please don't consider it as a unique identifier
647
675
  # for the item. Instead, use it as a volatile key for
@@ -671,6 +699,7 @@ payment.purpose
671
699
  # https://docs.lightning.engineering/the-lightning-network/multihop-payments
672
700
  payment.secret.preimage
673
701
  payment.secret.hash
702
+ payment.secret.proof
674
703
 
675
704
  payment.invoice.created_at
676
705
  payment.invoice.expires_at
@@ -747,6 +776,18 @@ payment.hops[0].channel.entry.public_key
747
776
  payment.hops[0].channel.entry.alias
748
777
  payment.hops[0].channel.entry.color
749
778
  ```
779
+
780
+ ### Proof of Payment
781
+
782
+ [Making Payments](https://docs.lightning.engineering/the-lightning-network/multihop-payments)
783
+
784
+ ```ruby
785
+ payment = Lighstorm::Invoice.decode('lnbc20m1pv...qqdhhwkj').pay.result
786
+
787
+ payment.secret.proof
788
+ # => 'c504f73f83e3772b802844b54021e44e071c03011eeda476b198f7a093bcb09e'
789
+ ```
790
+
750
791
  ### Performance
751
792
  Avoid fetching data that you don't need:
752
793
  ```ruby
@@ -1003,7 +1044,7 @@ gem 'lighstorm', path: '/home/user/lighstorm'
1003
1044
  # demo.rb
1004
1045
  require 'lighstorm'
1005
1046
 
1006
- puts Lighstorm.version # => 0.0.10
1047
+ puts Lighstorm.version # => 0.0.11
1007
1048
  ```
1008
1049
 
1009
1050
  ```sh
@@ -1240,13 +1281,13 @@ gem build lighstorm.gemspec
1240
1281
 
1241
1282
  gem signin
1242
1283
 
1243
- gem push lighstorm-0.0.10.gem
1284
+ gem push lighstorm-0.0.11.gem
1244
1285
  ```
1245
1286
 
1246
1287
  _________________
1247
1288
 
1248
1289
  <center>
1249
- lighstorm 0.0.10
1290
+ lighstorm 0.0.11
1250
1291
  |
1251
1292
  <a href="https://github.com/icebaker/lighstorm" rel="noopener noreferrer" target="_blank">GitHub</a>
1252
1293
  |
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.10
11
+ 0.0.11
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.10',
21
+ name: 'Lighstorm 0.0.11',
22
22
  repo: 'https://github.com/icebaker/lighstorm'
23
23
  }
24
24
  </script>
data/models/errors.rb CHANGED
@@ -2,7 +2,21 @@
2
2
 
3
3
  module Lighstorm
4
4
  module Errors
5
- class LighstormError < StandardError; end
5
+ class LighstormError < StandardError
6
+ attr_reader :grpc
7
+
8
+ def initialize(message = nil, grpc: nil)
9
+ super(message)
10
+ @grpc = grpc
11
+ end
12
+
13
+ def to_h
14
+ output = { class: self.class, message: message }
15
+ output[:grpc] = grpc.message unless grpc.nil?
16
+
17
+ output
18
+ end
19
+ end
6
20
 
7
21
  class ToDoError < LighstormError; end
8
22
 
@@ -19,6 +33,7 @@ module Lighstorm
19
33
  class OperationNotAllowedError < LighstormError; end
20
34
  class UnexpectedNumberOfHTLCsError < LighstormError; end
21
35
  class UnknownChannelError < LighstormError; end
36
+ class NoInvoiceFoundError < LighstormError; end
22
37
 
23
38
  class InvoiceMayHaveMultiplePaymentsError < LighstormError; end
24
39
 
data/models/secret.rb CHANGED
@@ -26,6 +26,14 @@ module Lighstorm
26
26
  @hash = data[:hash]
27
27
  end
28
28
 
29
+ def proof
30
+ @preimage
31
+ end
32
+
33
+ def valid_proof?(candidate_preimage)
34
+ candidate_preimage == preimage
35
+ end
36
+
29
37
  def to_h
30
38
  {
31
39
  preimage: preimage,
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.10',
7
+ version: '0.0.11',
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,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lighstorm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - icebaker
@@ -103,6 +103,7 @@ files:
103
103
  - controllers/invoice/actions/pay_through_route.rb
104
104
  - controllers/invoice/all.rb
105
105
  - controllers/invoice/decode.rb
106
+ - controllers/invoice/find_by_code.rb
106
107
  - controllers/invoice/find_by_secret_hash.rb
107
108
  - controllers/node.rb
108
109
  - controllers/node/actions/apply_gossip.rb