paid-services 6.1.4 → 6.1.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.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Versions
2
2
 
3
- ## Version 6.1.4
3
+ ## Version 6.1.5
4
4
 
5
5
  - `manageSwap`: Add support for Loop Out to external address
6
6
 
package/package.json CHANGED
@@ -13,12 +13,12 @@
13
13
  "asyncjs-util": "1.2.12",
14
14
  "bech32": "2.0.0",
15
15
  "bolt01": "2.0.0",
16
- "bolt07": "1.9.3",
16
+ "bolt07": "1.9.4",
17
17
  "ecpair": "2.1.0",
18
18
  "goldengate": "14.0.7",
19
19
  "invoices": "3.0.0",
20
- "ln-service": "57.14.2",
21
- "ln-sync": "6.0.4",
20
+ "ln-service": "57.17.0",
21
+ "ln-sync": "6.1.0",
22
22
  "psbt": "3.0.0",
23
23
  "p2tr": "2.0.0",
24
24
  "tiny-secp256k1": "2.2.3"
@@ -26,8 +26,8 @@
26
26
  "description": "Lightning Paid Services library",
27
27
  "devDependencies": {
28
28
  "@alexbosworth/tap": "15.0.12",
29
- "ln-docker-daemons": "6.0.19",
30
- "mock-lnd": "1.4.4",
29
+ "ln-docker-daemons": "6.0.21",
30
+ "mock-lnd": "2.0.0",
31
31
  "secp256k1": "5.0.0"
32
32
  },
33
33
  "engines": {
@@ -48,5 +48,5 @@
48
48
  "integration-tests": "tap -j 2 --branches=1 --functions=1 --lines=1 --statements=1 -t 2700 test/integration/*.js",
49
49
  "test": "tap --branches=1 --functions=1 --lines=1 --statements=1 -t 60 test/actions/*.js test/balanced/*.js test/capacity/*.js test/client/*.js test/config/*.js test/p2p/*.js test/records/*.js test/respond/*.js test/server/*.js test/swaps/*.js test/services/*.js test/trades/*.js"
50
50
  },
51
- "version": "6.1.4"
51
+ "version": "6.1.5"
52
52
  }
@@ -4,7 +4,6 @@ const {makeInvoiceSubscription} = require('mock-lnd');
4
4
  const {makeLnd} = require('mock-lnd');
5
5
  const {makePaySubscription} = require('mock-lnd');
6
6
  const {makePayViaRoutesResponse} = require('mock-lnd');
7
- const {makePaymentRequest} = require('mock-lnd');
8
7
  const {test} = require('@alexbosworth/tap');
9
8
 
10
9
  const messagesForResponse = require('./../../respond/messages_for_response');
@@ -14,7 +13,6 @@ const responseForSchema = require('./../../services/response_for_schema');
14
13
  const encode = records => encodeTlvStream({records: [records]}).encoded;
15
14
  const id1 = Buffer.alloc(32).toString('hex');
16
15
  const id2 = Buffer.alloc(32, 1).toString('hex');
17
- const {request} = makePaymentRequest({});
18
16
 
19
17
  const makeArgs = overrides => {
20
18
  let requests = 0;
@@ -2,87 +2,99 @@ const {makeLnd} = require('mock-lnd');
2
2
  const {makePayViaRoutesResponse} = require('mock-lnd');
3
3
  const {makePaymentRequest} = require('mock-lnd');
4
4
  const {test} = require('@alexbosworth/tap');
5
+ const tinysecp = require('tiny-secp256k1');
5
6
 
6
7
  const method = require('./../../respond/send_service_response');
7
8
 
8
- const makeArgs = overrides => {
9
- let requests = 0;
9
+ (async () => {
10
+ const ecp = (await import('ecpair')).ECPairFactory(tinysecp);
10
11
 
11
- const lnd = makeLnd({
12
- payViaRoutes: ({}, cbk) => {
13
- requests++;
12
+ const makeArgs = overrides => {
13
+ let requests = 0;
14
14
 
15
- if (requests === 2) {
16
- return cbk(null, makePayViaRoutesResponse({}));
17
- }
15
+ const lnd = makeLnd({
16
+ payViaRoutes: ({}, cbk) => {
17
+ requests++;
18
18
 
19
- return cbk(null, makePayViaRoutesResponse({is_unknown_failure: true}));
20
- },
21
- });
19
+ if (requests === 2) {
20
+ return cbk(null, makePayViaRoutesResponse({}));
21
+ }
22
22
 
23
- const args = {
24
- lnd,
25
- mtokens: '10000',
26
- request: 'lnbc1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpl2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6twvus8g6rfwvs8qun0dfjkxaq8rkx3yf5tcsyz3d73gafnh3cax9rn449d9p5uxz9ezhhypd0elx87sjle52x86fux2ypatgddc6k63n7erqz25le42c4u4ecky03ylcqca784w',
27
- text: 'text',
28
- };
23
+ return cbk(null, makePayViaRoutesResponse({is_unknown_failure: true}));
24
+ },
25
+ });
29
26
 
30
- Object.keys(overrides).forEach(k => args[k] = overrides[k]);
27
+ const args = {
28
+ lnd,
29
+ mtokens: '10000',
30
+ request: 'lnbc1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpl2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6twvus8g6rfwvs8qun0dfjkxaq8rkx3yf5tcsyz3d73gafnh3cax9rn449d9p5uxz9ezhhypd0elx87sjle52x86fux2ypatgddc6k63n7erqz25le42c4u4ecky03ylcqca784w',
31
+ text: 'text',
32
+ };
31
33
 
32
- return args;
33
- };
34
+ Object.keys(overrides).forEach(k => args[k] = overrides[k]);
34
35
 
35
- const tests = [
36
- {
37
- args: makeArgs({error: 'error'}),
38
- description: 'A request is expected to include valid response records',
39
- error: [400, 'ExpectedValidServiceResponseToSend'],
40
- },
41
- {
42
- args: makeArgs({mtokens: undefined}),
43
- description: 'The mtokens received are expected',
44
- error: [400, 'ExpectedMillitokensReceivedToSendResponse'],
45
- },
46
- {
47
- args: makeArgs({request: undefined}),
48
- description: 'A response request is expected',
49
- error: [400, 'ExpectedResponsePaymentRequestToSendResponse'],
50
- },
51
- {
52
- args: makeArgs({request: 'request'}),
53
- description: 'A valid response request is expected',
54
- error: [400, 'ExpectedValidPaymentRequestToPayResponse'],
55
- },
56
- {
57
- args: makeArgs({}),
58
- description: 'An unexpired invoice is required',
59
- error: [400, 'ExpectedUnexpiredInvoiceToSendServiceResponse'],
60
- },
61
- {
62
- args: makeArgs({mtokens: '1', request: makePaymentRequest({}).request}),
63
- description: 'Payment cannot be greater than the mtokens received',
64
- error: [400, 'ExpectedPaymentTokensNotGreaterThanReceived'],
65
- },
66
- {
67
- args: makeArgs({request: makePaymentRequest({mtokens: '0'}).request}),
68
- description: 'A zero mtokens response is paid',
69
- },
70
- {
71
- args: makeArgs({request: makePaymentRequest({mtokens: '1'}).request}),
72
- description: 'A service response is delivered',
73
- },
74
- ];
36
+ return args;
37
+ };
75
38
 
76
- tests.forEach(({args, description, error, expected}) => {
77
- return test(description, async ({end, strictSame, rejects}) => {
78
- if (!!error) {
79
- await rejects(method(args), error, 'Got error');
80
- } else {
81
- const res = await method(args);
39
+ const tests = [
40
+ {
41
+ args: makeArgs({error: 'error'}),
42
+ description: 'A request is expected to include valid response records',
43
+ error: [400, 'ExpectedValidServiceResponseToSend'],
44
+ },
45
+ {
46
+ args: makeArgs({mtokens: undefined}),
47
+ description: 'The mtokens received are expected',
48
+ error: [400, 'ExpectedMillitokensReceivedToSendResponse'],
49
+ },
50
+ {
51
+ args: makeArgs({request: undefined}),
52
+ description: 'A response request is expected',
53
+ error: [400, 'ExpectedResponsePaymentRequestToSendResponse'],
54
+ },
55
+ {
56
+ args: makeArgs({request: 'request'}),
57
+ description: 'A valid response request is expected',
58
+ error: [400, 'ExpectedValidPaymentRequestToPayResponse'],
59
+ },
60
+ {
61
+ args: makeArgs({}),
62
+ description: 'An unexpired invoice is required',
63
+ error: [400, 'ExpectedUnexpiredInvoiceToSendServiceResponse'],
64
+ },
65
+ {
66
+ args: makeArgs({
67
+ mtokens: '1',
68
+ request: makePaymentRequest({ecp}).request,
69
+ }),
70
+ description: 'Payment cannot be greater than the mtokens received',
71
+ error: [400, 'ExpectedPaymentTokensNotGreaterThanReceived'],
72
+ },
73
+ {
74
+ args: makeArgs({
75
+ request: makePaymentRequest({ecp, mtokens: '0'}).request,
76
+ }),
77
+ description: 'A zero mtokens response is paid',
78
+ },
79
+ {
80
+ args: makeArgs({
81
+ request: makePaymentRequest({ecp, mtokens: '1'}).request,
82
+ }),
83
+ description: 'A service response is delivered',
84
+ },
85
+ ];
86
+
87
+ tests.forEach(({args, description, error, expected}) => {
88
+ return test(description, async ({end, strictSame, rejects}) => {
89
+ if (!!error) {
90
+ await rejects(method(args), error, 'Got error');
91
+ } else {
92
+ const res = await method(args);
82
93
 
83
- strictSame(res, expected, 'Got expected result');
84
- }
94
+ strictSame(res, expected, 'Got expected result');
95
+ }
85
96
 
86
- return end();
97
+ return end();
98
+ });
87
99
  });
88
- });
100
+ })();
@@ -4,6 +4,7 @@ const {makeLnd} = require('mock-lnd');
4
4
  const {makePayViaRoutesResponse} = require('mock-lnd');
5
5
  const {makePaymentRequest} = require('mock-lnd');
6
6
  const {test} = require('@alexbosworth/tap');
7
+ const tinysecp = require('tiny-secp256k1');
7
8
 
8
9
  const messagesForRequest = require('./../../client/messages_for_request');
9
10
  const method = require('./../../server/paid_service_event');
@@ -11,187 +12,192 @@ const method = require('./../../server/paid_service_event');
11
12
  const encode = records => encodeTlvStream({records: [records]}).encoded;
12
13
  const id1 = Buffer.alloc(32).toString('hex');
13
14
  const id2 = Buffer.alloc(32, 1).toString('hex');
14
- const {request} = makePaymentRequest({});
15
15
 
16
- const {messages} = messagesForRequest({reply: request, service: '2'});
16
+ (async () => {
17
+ const ecp = (await import('ecpair')).ECPairFactory(tinysecp);
17
18
 
18
- const makeArgs = overrides => {
19
- let requests = 0;
19
+ const {request} = makePaymentRequest({ecp});
20
20
 
21
- const lnd = makeLnd({
22
- getInvoice: ({}, cbk) => {
23
- return cbk(null, makeInvoice({
24
- is_confirmed: true,
25
- is_push: true,
26
- payments: [{messages, is_confirmed: true}],
27
- }));
28
- },
29
- payViaRoutes: ({}, cbk) => {
30
- requests++;
21
+ const {messages} = messagesForRequest({reply: request, service: '2'});
31
22
 
32
- if (requests === 2) {
33
- return cbk(null, makePayViaRoutesResponse({}));
34
- }
23
+ const makeArgs = overrides => {
24
+ let requests = 0;
35
25
 
36
- return cbk(null, makePayViaRoutesResponse({is_unknown_failure: true}));
37
- },
38
- });
26
+ const lnd = makeLnd({
27
+ getInvoice: ({}, cbk) => {
28
+ return cbk(null, makeInvoice({
29
+ is_confirmed: true,
30
+ is_push: true,
31
+ payments: [{messages, is_confirmed: true}],
32
+ }));
33
+ },
34
+ payViaRoutes: ({}, cbk) => {
35
+ requests++;
36
+
37
+ if (requests === 2) {
38
+ return cbk(null, makePayViaRoutesResponse({}));
39
+ }
40
+
41
+ return cbk(null, makePayViaRoutesResponse({is_unknown_failure: true}));
42
+ },
43
+ });
44
+
45
+ const args = {
46
+ lnd,
47
+ env: {},
48
+ fetch: () => new Promise(resolve => resolve()),
49
+ id: id1,
50
+ network: 'btc',
51
+ payer: lnd,
52
+ };
53
+
54
+ Object.keys(overrides).forEach(k => args[k] = overrides[k]);
39
55
 
40
- const args = {
41
- lnd,
42
- env: {},
43
- fetch: () => new Promise(resolve => resolve()),
44
- id: id1,
45
- network: 'btc',
46
- payer: lnd,
56
+ return args;
47
57
  };
48
58
 
49
- Object.keys(overrides).forEach(k => args[k] = overrides[k]);
50
-
51
- return args;
52
- };
53
-
54
- const tests = [
55
- {
56
- args: makeArgs({env: undefined}),
57
- description: 'Processing a service request requires env vars',
58
- error: [400, 'ExpectedEnvironmentVariablesForPaidServiceEvent'],
59
- },
60
- {
61
- args: makeArgs({fetch: undefined}),
62
- description: 'Processing a service request requires a fetch function',
63
- error: [400, 'ExpectedFetchFunctionForPaidServiceEvent'],
64
- },
65
- {
66
- args: makeArgs({id: undefined}),
67
- description: 'Processing a service request requires an invoice id',
68
- error: [400, 'ExpectedInvoiceIdForPaidServiceEvent'],
69
- },
70
- {
71
- args: makeArgs({lnd: undefined}),
72
- description: 'Processing a service request requires lnd to lookup invoice',
73
- error: [400, 'ExpectedAuthenticatedLndForPaidServiceEvent'],
74
- },
75
- {
76
- args: makeArgs({network: undefined}),
77
- description: 'Processing a service request requires network name',
78
- error: [400, 'ExpectedNetworkNameStringToGetServiceRequest'],
79
- },
80
- {
81
- args: makeArgs({payer: undefined}),
82
- description: 'Processing a service request requires a payer to respond',
83
- error: [400, 'ExpectedPayerLndForPaidServiceEvent'],
84
- },
85
- {
86
- args: makeArgs({}),
87
- description: 'A paid service event happens',
88
- expected: {
89
- error: undefined,
90
- node: '03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad',
91
- service: 'ping',
59
+ const tests = [
60
+ {
61
+ args: makeArgs({env: undefined}),
62
+ description: 'Processing a service request requires env vars',
63
+ error: [400, 'ExpectedEnvironmentVariablesForPaidServiceEvent'],
92
64
  },
93
- },
94
- {
95
- args: makeArgs({
96
- lnd: makeLnd({
97
- getInvoice: ({}, cbk) => {
98
- return cbk(null, makeInvoice({
99
- is_confirmed: true,
100
- is_push: true,
101
- payments: [],
102
- }));
103
- },
104
- }),
105
- }),
106
- description: 'A random push happens',
107
- expected: {},
108
- },
109
- {
110
- args: makeArgs({
111
- env: {
112
- PAID_SERVICES_INBOX_EMAIL_FROM: 'from',
113
- PAID_SERVICES_INBOX_EMAIL_TO: 'to',
114
- PAID_SERVICES_INBOX_POSTMARK_API_KEY: 'key',
115
- PAID_SERVICES_INBOX_PRICE: '1',
65
+ {
66
+ args: makeArgs({fetch: undefined}),
67
+ description: 'Processing a service request requires a fetch function',
68
+ error: [400, 'ExpectedFetchFunctionForPaidServiceEvent'],
69
+ },
70
+ {
71
+ args: makeArgs({id: undefined}),
72
+ description: 'Processing a service request requires an invoice id',
73
+ error: [400, 'ExpectedInvoiceIdForPaidServiceEvent'],
74
+ },
75
+ {
76
+ args: makeArgs({lnd: undefined}),
77
+ description: 'Processing a service request requires lnd to lookup invoice',
78
+ error: [400, 'ExpectedAuthenticatedLndForPaidServiceEvent'],
79
+ },
80
+ {
81
+ args: makeArgs({network: undefined}),
82
+ description: 'Processing a service request requires network name',
83
+ error: [400, 'ExpectedNetworkNameStringToGetServiceRequest'],
84
+ },
85
+ {
86
+ args: makeArgs({payer: undefined}),
87
+ description: 'Processing a service request requires a payer to respond',
88
+ error: [400, 'ExpectedPayerLndForPaidServiceEvent'],
89
+ },
90
+ {
91
+ args: makeArgs({}),
92
+ description: 'A paid service event happens',
93
+ expected: {
94
+ error: undefined,
95
+ node: '03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad',
96
+ service: 'ping',
116
97
  },
117
- lnd: makeLnd({
118
- getInvoice: ({id}, cbk) => {
119
- switch (id) {
120
- // Return a paywall invoice
121
- case id1:
98
+ },
99
+ {
100
+ args: makeArgs({
101
+ lnd: makeLnd({
102
+ getInvoice: ({}, cbk) => {
122
103
  return cbk(null, makeInvoice({
123
- description_hash: id2,
124
104
  is_confirmed: true,
105
+ is_push: true,
106
+ payments: [],
125
107
  }));
108
+ },
109
+ }),
110
+ }),
111
+ description: 'A random push happens',
112
+ expected: {},
113
+ },
114
+ {
115
+ args: makeArgs({
116
+ env: {
117
+ PAID_SERVICES_INBOX_EMAIL_FROM: 'from',
118
+ PAID_SERVICES_INBOX_EMAIL_TO: 'to',
119
+ PAID_SERVICES_INBOX_POSTMARK_API_KEY: 'key',
120
+ PAID_SERVICES_INBOX_PRICE: '1',
121
+ },
122
+ lnd: makeLnd({
123
+ getInvoice: ({id}, cbk) => {
124
+ switch (id) {
125
+ // Return a paywall invoice
126
+ case id1:
127
+ return cbk(null, makeInvoice({
128
+ description_hash: id2,
129
+ is_confirmed: true,
130
+ }));
126
131
 
127
- // Return a keysend invoice
128
- case id2:
132
+ // Return a keysend invoice
133
+ case id2:
134
+ return cbk(null, makeInvoice({
135
+ is_confirmed: true,
136
+ is_push: true,
137
+ payments: [{
138
+ is_confirmed: true,
139
+ messages: messagesForRequest({
140
+ arguments: encode({
141
+ type: '0',
142
+ value: Buffer.from('message').toString('hex'),
143
+ }),
144
+ reply: request,
145
+ service: '4',
146
+ }).messages,
147
+ }],
148
+ }));
149
+
150
+ default:
151
+ return cbk([500, 'UnexpectedIdentifierForGetInvoice', {id}]);
152
+ }
153
+ },
154
+ }),
155
+ }),
156
+ description: 'A paywall request is processed',
157
+ expected: {
158
+ error: undefined,
159
+ node: '03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad',
160
+ service: 'inbox',
161
+ },
162
+ },
163
+ {
164
+ args: makeArgs({
165
+ lnd: makeLnd({
166
+ getInvoice: ({}, cbk) => {
129
167
  return cbk(null, makeInvoice({
130
168
  is_confirmed: true,
131
169
  is_push: true,
132
170
  payments: [{
133
- is_confirmed: true,
134
171
  messages: messagesForRequest({
135
- arguments: encode({
136
- type: '0',
137
- value: Buffer.from('message').toString('hex'),
138
- }),
139
172
  reply: request,
140
- service: '4',
173
+ service: '3',
141
174
  }).messages,
175
+ is_confirmed: true,
142
176
  }],
143
177
  }));
144
-
145
- default:
146
- return cbk([500, 'UnexpectedIdentifierForGetInvoice', {id}]);
147
- }
148
- },
178
+ },
179
+ }),
149
180
  }),
150
- }),
151
- description: 'A paywall request is processed',
152
- expected: {
153
- error: undefined,
154
- node: '03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad',
155
- service: 'inbox',
156
- },
157
- },
158
- {
159
- args: makeArgs({
160
- lnd: makeLnd({
161
- getInvoice: ({}, cbk) => {
162
- return cbk(null, makeInvoice({
163
- is_confirmed: true,
164
- is_push: true,
165
- payments: [{
166
- messages: messagesForRequest({
167
- reply: request,
168
- service: '3',
169
- }).messages,
170
- is_confirmed: true,
171
- }],
172
- }));
173
- },
174
- }),
175
- }),
176
- description: 'A request is processed',
177
- expected: {
178
- error: [404, 'ServiceCurrentlyUnsupported'],
179
- node: '03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad',
180
- service: 'profile',
181
+ description: 'A request is processed',
182
+ expected: {
183
+ error: [404, 'ServiceCurrentlyUnsupported'],
184
+ node: '03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad',
185
+ service: 'profile',
186
+ },
181
187
  },
182
- },
183
- ];
188
+ ];
184
189
 
185
- tests.forEach(({args, description, error, expected}) => {
186
- return test(description, async ({end, equal, rejects, strictSame}) => {
187
- if (!!error) {
188
- await rejects(method(args), error, 'Got expected error');
189
- } else {
190
- const res = await method(args);
190
+ tests.forEach(({args, description, error, expected}) => {
191
+ return test(description, async ({end, equal, rejects, strictSame}) => {
192
+ if (!!error) {
193
+ await rejects(method(args), error, 'Got expected error');
194
+ } else {
195
+ const res = await method(args);
191
196
 
192
- strictSame(res, expected, 'Got expected result');
193
- }
197
+ strictSame(res, expected, 'Got expected result');
198
+ }
194
199
 
195
- return end();
200
+ return end();
201
+ });
196
202
  });
197
- });
203
+ })();
@@ -3,6 +3,7 @@ const {makeInvoice} = require('mock-lnd');
3
3
  const {makeLnd} = require('mock-lnd');
4
4
  const {makePaymentRequest} = require('mock-lnd');
5
5
  const {test} = require('@alexbosworth/tap');
6
+ const tinysecp = require('tiny-secp256k1');
6
7
 
7
8
  const messagesForRequest = require('./../../client/messages_for_request');
8
9
  const method = require('./../../server/process_paywall');
@@ -10,104 +11,109 @@ const method = require('./../../server/process_paywall');
10
11
  const encode = records => encodeTlvStream({records: [records]}).encoded;
11
12
  const id1 = Buffer.alloc(32).toString('hex');
12
13
  const id2 = Buffer.alloc(32, 1).toString('hex');
13
- const {request} = makePaymentRequest({});
14
14
 
15
- const {messages} = messagesForRequest({reply: request, service: '2'});
15
+ (async () => {
16
+ const ecp = (await import('ecpair')).ECPairFactory(tinysecp);
16
17
 
17
- const makeArgs = overrides => {
18
- const args = {
19
- env: {
20
- PAID_SERVICES_INBOX_EMAIL_FROM: 'from',
21
- PAID_SERVICES_INBOX_EMAIL_TO: 'to',
22
- PAID_SERVICES_INBOX_POSTMARK_API_KEY: 'key',
23
- PAID_SERVICES_INBOX_PRICE: '1',
24
- },
25
- fetch: () => new Promise(resolve => resolve()),
26
- id: id1,
27
- lnd: makeLnd({
28
- getInvoice: ({id}, cbk) => {
29
- switch (id) {
30
- // Return a paywall invoice
31
- case id1:
32
- return cbk(null, makeInvoice({
33
- description_hash: id2,
34
- is_confirmed: true,
35
- }));
18
+ const {request} = makePaymentRequest({ecp});
36
19
 
37
- // Return a keysend invoice
38
- case id2:
39
- return cbk(null, makeInvoice({
40
- is_confirmed: true,
41
- is_push: true,
42
- payments: [{
43
- is_confirmed: true,
44
- messages: messagesForRequest({
45
- arguments: encode({
46
- type: '0',
47
- value: Buffer.from('message').toString('hex'),
48
- }),
49
- reply: request,
50
- service: '4',
51
- }).messages,
52
- }],
53
- }));
20
+ const {messages} = messagesForRequest({reply: request, service: '2'});
54
21
 
55
- default:
56
- return cbk([500, 'UnexpectedIdentifierForGetInvoice', {id}]);
57
- }
22
+ const makeArgs = overrides => {
23
+ const args = {
24
+ env: {
25
+ PAID_SERVICES_INBOX_EMAIL_FROM: 'from',
26
+ PAID_SERVICES_INBOX_EMAIL_TO: 'to',
27
+ PAID_SERVICES_INBOX_POSTMARK_API_KEY: 'key',
28
+ PAID_SERVICES_INBOX_PRICE: '1',
58
29
  },
59
- }),
60
- network: 'btc',
61
- payer: makeLnd({}),
62
- };
30
+ fetch: () => new Promise(resolve => resolve()),
31
+ id: id1,
32
+ lnd: makeLnd({
33
+ getInvoice: ({id}, cbk) => {
34
+ switch (id) {
35
+ // Return a paywall invoice
36
+ case id1:
37
+ return cbk(null, makeInvoice({
38
+ description_hash: id2,
39
+ is_confirmed: true,
40
+ }));
41
+
42
+ // Return a keysend invoice
43
+ case id2:
44
+ return cbk(null, makeInvoice({
45
+ is_confirmed: true,
46
+ is_push: true,
47
+ payments: [{
48
+ is_confirmed: true,
49
+ messages: messagesForRequest({
50
+ arguments: encode({
51
+ type: '0',
52
+ value: Buffer.from('message').toString('hex'),
53
+ }),
54
+ reply: request,
55
+ service: '4',
56
+ }).messages,
57
+ }],
58
+ }));
59
+
60
+ default:
61
+ return cbk([500, 'UnexpectedIdentifierForGetInvoice', {id}]);
62
+ }
63
+ },
64
+ }),
65
+ network: 'btc',
66
+ payer: makeLnd({}),
67
+ };
63
68
 
64
- Object.keys(overrides).forEach(k => args[k] = overrides[k]);
69
+ Object.keys(overrides).forEach(k => args[k] = overrides[k]);
65
70
 
66
- return args;
67
- };
71
+ return args;
72
+ };
68
73
 
69
- const tests = [
70
- {
71
- args: makeArgs({env: undefined}),
72
- description: 'Processing a paywall requires env vars',
73
- error: [400, 'ExpectedEnvironmentVariablesToProcessPaywall'],
74
- },
75
- {
76
- args: makeArgs({fetch: undefined}),
77
- description: 'Processing a paywall requires a fetch function',
78
- error: [400, 'ExpectedFetchFunctionToProcessPaywallPayment'],
79
- },
80
- {
81
- args: makeArgs({id: undefined}),
82
- description: 'Processing a paywall requires an invoice id',
83
- error: [400, 'ExpectedInvoiceIdToProcessPaywallRequest'],
84
- },
85
- {
86
- args: makeArgs({lnd: undefined}),
87
- description: 'Processing a paywall requires lnd',
88
- error: [400, 'ExpectedLndToProcessPaywallRequest'],
89
- },
90
- {
91
- args: makeArgs({network: undefined}),
92
- description: 'Processing a paywall requires a network name',
93
- error: [400, 'ExpectedNetworkNameToProcessPaywallRequest'],
94
- },
95
- {
96
- args: makeArgs({}),
97
- description: 'A paywall is processed',
98
- },
99
- ];
74
+ const tests = [
75
+ {
76
+ args: makeArgs({env: undefined}),
77
+ description: 'Processing a paywall requires env vars',
78
+ error: [400, 'ExpectedEnvironmentVariablesToProcessPaywall'],
79
+ },
80
+ {
81
+ args: makeArgs({fetch: undefined}),
82
+ description: 'Processing a paywall requires a fetch function',
83
+ error: [400, 'ExpectedFetchFunctionToProcessPaywallPayment'],
84
+ },
85
+ {
86
+ args: makeArgs({id: undefined}),
87
+ description: 'Processing a paywall requires an invoice id',
88
+ error: [400, 'ExpectedInvoiceIdToProcessPaywallRequest'],
89
+ },
90
+ {
91
+ args: makeArgs({lnd: undefined}),
92
+ description: 'Processing a paywall requires lnd',
93
+ error: [400, 'ExpectedLndToProcessPaywallRequest'],
94
+ },
95
+ {
96
+ args: makeArgs({network: undefined}),
97
+ description: 'Processing a paywall requires a network name',
98
+ error: [400, 'ExpectedNetworkNameToProcessPaywallRequest'],
99
+ },
100
+ {
101
+ args: makeArgs({}),
102
+ description: 'A paywall is processed',
103
+ },
104
+ ];
100
105
 
101
- tests.forEach(({args, description, error, expected}) => {
102
- return test(description, async ({end, equal, rejects, strictSame}) => {
103
- if (!!error) {
104
- await rejects(method(args), error, 'Got expected error');
105
- } else {
106
- const res = await method(args);
106
+ tests.forEach(({args, description, error, expected}) => {
107
+ return test(description, async ({end, equal, rejects, strictSame}) => {
108
+ if (!!error) {
109
+ await rejects(method(args), error, 'Got expected error');
110
+ } else {
111
+ const res = await method(args);
107
112
 
108
- strictSame(res, expected, 'Got expected result');
109
- }
113
+ strictSame(res, expected, 'Got expected result');
114
+ }
110
115
 
111
- return end();
116
+ return end();
117
+ });
112
118
  });
113
- });
119
+ })();
@@ -4,6 +4,7 @@ const {makeLnd} = require('mock-lnd');
4
4
  const {makePayViaRoutesResponse} = require('mock-lnd');
5
5
  const {makePaymentRequest} = require('mock-lnd');
6
6
  const {test} = require('@alexbosworth/tap');
7
+ const tinysecp = require('tiny-secp256k1');
7
8
 
8
9
  const messagesForRequest = require('./../../client/messages_for_request');
9
10
  const method = require('./../../server/process_request');
@@ -11,142 +12,149 @@ const method = require('./../../server/process_request');
11
12
  const encode = records => encodeTlvStream({records: [records]}).encoded;
12
13
  const id1 = Buffer.alloc(32).toString('hex');
13
14
  const id2 = Buffer.alloc(32, 1).toString('hex');
14
- const {request} = makePaymentRequest({});
15
15
 
16
- const {messages} = messagesForRequest({reply: request, service: '2'});
16
+ (async () => {
17
+ const ecp = (await import('ecpair')).ECPairFactory(tinysecp);
17
18
 
18
- const makeArgs = overrides => {
19
- let requests = 0;
19
+ const {request} = makePaymentRequest({ecp});
20
20
 
21
- const lnd = makeLnd({
22
- payViaRoutes: ({}, cbk) => {
23
- requests++;
21
+ const {messages} = messagesForRequest({reply: request, service: '2'});
24
22
 
25
- if (requests === 2) {
26
- return cbk(null, makePayViaRoutesResponse({}));
27
- }
23
+ const makeArgs = overrides => {
24
+ let requests = 0;
28
25
 
29
- return cbk(null, makePayViaRoutesResponse({is_unknown_failure: true}));
30
- },
31
- });
26
+ const lnd = makeLnd({
27
+ payViaRoutes: ({}, cbk) => {
28
+ requests++;
32
29
 
33
- const args = {
34
- env: {},
35
- fetch: () => {},
36
- id: id1,
37
- lnd: makeLnd({
38
- getInvoice: ({}, cbk) => {
39
- return cbk(null, makeInvoice({
40
- is_confirmed: true,
41
- is_push: true,
42
- payments: [{messages, is_confirmed: true}],
43
- }));
30
+ if (requests === 2) {
31
+ return cbk(null, makePayViaRoutesResponse({}));
32
+ }
33
+
34
+ return cbk(null, makePayViaRoutesResponse({is_unknown_failure: true}));
44
35
  },
45
- }),
46
- network: 'btc',
47
- payer: lnd,
48
- };
36
+ });
49
37
 
50
- Object.keys(overrides).forEach(k => args[k] = overrides[k]);
51
-
52
- return args;
53
- };
54
-
55
- const tests = [
56
- {
57
- args: makeArgs({env: undefined}),
58
- description: 'Processing a service request requires env vars',
59
- error: [400, 'ExpectedEnvironmentVarsToProcessPaidRequest'],
60
- },
61
- {
62
- args: makeArgs({fetch: undefined}),
63
- description: 'Processing a service request requires a fetch function',
64
- error: [400, 'ExpectedFetchFunctionToProcessPaidRequest'],
65
- },
66
- {
67
- args: makeArgs({id: undefined}),
68
- description: 'Processing a service request requires an invoice id',
69
- error: [400, 'ExpectedInvoiceIdToProcessPaidRequest'],
70
- },
71
- {
72
- args: makeArgs({lnd: undefined}),
73
- description: 'Processing a service request requires lnd to lookup invoice',
74
- error: [400, 'ExpectedAuthenticatedLndToProcessPaidRequest'],
75
- },
76
- {
77
- args: makeArgs({network: undefined}),
78
- description: 'Processing a service request requires network name',
79
- error: [400, 'ExpectedNetworkNameToProcessPaidRequest'],
80
- },
81
- {
82
- args: makeArgs({payer: undefined}),
83
- description: 'Processing a service request requires a payer to respond',
84
- error: [400, 'ExpectedPayerLndToProcessPaidRequest'],
85
- },
86
- {
87
- args: makeArgs({network: 'network'}),
88
- description: 'A request is processed',
89
- error: [500, 'UnexpectedErrMappingInvoiceToPaidRequest'],
90
- },
91
- {
92
- args: makeArgs({}),
93
- description: 'A request is processed',
94
- expected: {},
95
- },
96
- {
97
- args: makeArgs({
38
+ const args = {
39
+ env: {},
40
+ fetch: () => {},
41
+ id: id1,
98
42
  lnd: makeLnd({
99
43
  getInvoice: ({}, cbk) => {
100
44
  return cbk(null, makeInvoice({
101
45
  is_confirmed: true,
102
46
  is_push: true,
103
- payments: [{
104
- messages: messagesForRequest({
105
- reply: request,
106
- service: Number.MAX_SAFE_INTEGER.toString(),
107
- }).messages,
108
- is_confirmed: true,
109
- }],
47
+ payments: [{messages, is_confirmed: true}],
110
48
  }));
111
49
  },
112
50
  }),
113
- }),
114
- description: 'A request is processed',
115
- expected: {error: [404, 'UnknownServiceType']},
116
- },
117
- {
118
- args: makeArgs({
119
- lnd: makeLnd({
120
- getInvoice: ({}, cbk) => {
121
- return cbk(null, makeInvoice({
122
- is_confirmed: true,
123
- is_push: true,
124
- payments: [{
125
- messages: messagesForRequest({
126
- reply: request,
127
- service: '3',
128
- }).messages,
51
+ network: 'btc',
52
+ payer: lnd,
53
+ };
54
+
55
+ Object.keys(overrides).forEach(k => args[k] = overrides[k]);
56
+
57
+ return args;
58
+ };
59
+
60
+ const tests = [
61
+ {
62
+ args: makeArgs({env: undefined}),
63
+ description: 'Processing a service request requires env vars',
64
+ error: [400, 'ExpectedEnvironmentVarsToProcessPaidRequest'],
65
+ },
66
+ {
67
+ args: makeArgs({fetch: undefined}),
68
+ description: 'Processing a service request requires a fetch function',
69
+ error: [400, 'ExpectedFetchFunctionToProcessPaidRequest'],
70
+ },
71
+ {
72
+ args: makeArgs({id: undefined}),
73
+ description: 'Processing a service request requires an invoice id',
74
+ error: [400, 'ExpectedInvoiceIdToProcessPaidRequest'],
75
+ },
76
+ {
77
+ args: makeArgs({lnd: undefined}),
78
+ description: 'Processing a service request requires lnd to lookup invoice',
79
+ error: [400, 'ExpectedAuthenticatedLndToProcessPaidRequest'],
80
+ },
81
+ {
82
+ args: makeArgs({network: undefined}),
83
+ description: 'Processing a service request requires network name',
84
+ error: [400, 'ExpectedNetworkNameToProcessPaidRequest'],
85
+ },
86
+ {
87
+ args: makeArgs({payer: undefined}),
88
+ description: 'Processing a service request requires a payer to respond',
89
+ error: [400, 'ExpectedPayerLndToProcessPaidRequest'],
90
+ },
91
+ {
92
+ args: makeArgs({network: 'network'}),
93
+ description: 'A request is processed',
94
+ error: [500, 'UnexpectedErrMappingInvoiceToPaidRequest'],
95
+ },
96
+ {
97
+ args: makeArgs({}),
98
+ description: 'A request is processed',
99
+ expected: {},
100
+ },
101
+ {
102
+ args: makeArgs({
103
+ lnd: makeLnd({
104
+ getInvoice: ({}, cbk) => {
105
+ return cbk(null, makeInvoice({
129
106
  is_confirmed: true,
130
- }],
131
- }));
132
- },
107
+ is_push: true,
108
+ payments: [{
109
+ messages: messagesForRequest({
110
+ reply: request,
111
+ service: Number.MAX_SAFE_INTEGER.toString(),
112
+ }).messages,
113
+ is_confirmed: true,
114
+ }],
115
+ }));
116
+ },
117
+ }),
133
118
  }),
134
- }),
135
- description: 'A request is processed',
136
- expected: {error: [404, 'ServiceCurrentlyUnsupported']},
137
- },
138
- ];
139
-
140
- tests.forEach(({args, description, error, expected}) => {
141
- return test(description, async ({end, equal, rejects, strictSame}) => {
142
- if (!!error) {
143
- await rejects(method(args), error, 'Got expected error');
144
- } else {
145
- const res = await method(args);
146
-
147
- strictSame(res, expected, 'Got expected result');
148
- }
149
-
150
- return end();
119
+ description: 'A request is processed',
120
+ expected: {error: [404, 'UnknownServiceType']},
121
+ },
122
+ {
123
+ args: makeArgs({
124
+ lnd: makeLnd({
125
+ getInvoice: ({}, cbk) => {
126
+ return cbk(null, makeInvoice({
127
+ is_confirmed: true,
128
+ is_push: true,
129
+ payments: [{
130
+ messages: messagesForRequest({
131
+ reply: request,
132
+ service: '3',
133
+ }).messages,
134
+ is_confirmed: true,
135
+ }],
136
+ }));
137
+ },
138
+ }),
139
+ }),
140
+ description: 'A request is processed',
141
+ expected: {error: [404, 'ServiceCurrentlyUnsupported']},
142
+ },
143
+ ];
144
+
145
+ tests.forEach(({args, description, error, expected}) => {
146
+ return test(description, async ({end, equal, rejects, strictSame}) => {
147
+ args.ecp = (await import('ecpair')).ECPairFactory(tinysecp);
148
+
149
+ if (!!error) {
150
+ await rejects(method(args), error, 'Got expected error');
151
+ } else {
152
+ const res = await method(args);
153
+
154
+ strictSame(res, expected, 'Got expected result');
155
+ }
156
+
157
+ return end();
158
+ });
151
159
  });
152
- });
160
+ })();