paid-services 3.1.0 → 3.3.0
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 +10 -1
- package/capacity/accept_capacity_change.js +284 -0
- package/capacity/ask_for_change_details.js +505 -0
- package/capacity/ask_for_decrease.js +185 -0
- package/capacity/assemble_replacement_tx.js +171 -0
- package/capacity/capacity_change_requests.js +76 -0
- package/capacity/change_channel_capacity.js +183 -0
- package/capacity/encode_change_request.js +55 -0
- package/capacity/encode_sign_capacity_response.js +32 -0
- package/capacity/fee_for_replacement.js +108 -0
- package/capacity/finalize_capacity_replacement.js +67 -0
- package/capacity/get_capacity_change_requests.js +98 -0
- package/capacity/get_capacity_replacement.js +371 -0
- package/capacity/get_replacement_signature.js +232 -0
- package/capacity/index.js +4 -0
- package/capacity/initiate_capacity_change.js +506 -0
- package/capacity/interim_replacement_psbt.js +57 -0
- package/capacity/is_open_witness_script.js +40 -0
- package/capacity/parse_accept_request.js +58 -0
- package/capacity/parse_accept_response.js +52 -0
- package/capacity/parse_capacity_change_request.js +101 -0
- package/capacity/parse_sign_capacity_request.js +59 -0
- package/capacity/propose_capacity_change.js +361 -0
- package/capacity/service_types.json +6 -0
- package/capacity/sign_capacity_replacement.js +119 -0
- package/capacity/witness_script_from_close_txs.js +50 -0
- package/index.js +6 -0
- package/p2p/encode_peer_request.js +59 -0
- package/p2p/encode_peer_response.js +44 -0
- package/p2p/encode_response_code.js +49 -0
- package/p2p/index.js +4 -0
- package/p2p/make_peer_request.js +151 -0
- package/p2p/parse_request_message.js +103 -0
- package/p2p/parse_response_code.js +60 -0
- package/p2p/return_failure_response.js +43 -0
- package/p2p/return_success_response.js +47 -0
- package/p2p/service_peer_requests.js +100 -0
- package/package.json +8 -5
- package/test/capacity/test_assemble_replacement_tx.js +46 -0
- package/test/capacity/test_capacity_change_requests.js +54 -0
- package/test/capacity/test_encode_change_request.js +49 -0
- package/test/capacity/test_encode_sign_capacity_response.js +47 -0
- package/test/capacity/test_fee_for_replacement.js +40 -0
- package/test/capacity/test_finalize_capacity_replacement.js +45 -0
- package/test/capacity/test_interim_replacement_psbt.js +44 -0
- package/test/capacity/test_is_open_witness_script.js +40 -0
- package/test/capacity/test_parse_accept_request.js +42 -0
- package/test/capacity/test_parse_capacity_change_request.js +51 -0
- package/test/capacity/test_parse_sign_capacity_request.js +49 -0
- package/test/capacity/test_witness_script_from_close_txs.js +53 -0
- package/test/integration/test_accept_capacity_change.js +152 -0
- package/test/integration/test_change_channel_capacity.js +196 -0
- package/test/integration/test_decrease_channel_capacity.js +206 -0
- package/test/integration/test_increase_channel_capacity.js +197 -0
- package/test/integration/test_service_peer_requests.js +59 -0
- package/test/integration/test_sign_capacity_replacement.js +142 -0
- package/test/p2p/test_encode_peer_request.js +53 -0
- package/test/p2p/test_encode_peer_response.js +38 -0
- package/test/p2p/test_encode_response_code.js +48 -0
- package/trades/buy_preimage.js +3 -1
- package/trades/network_from_network_record.js +6 -0
- package/trades/network_record_from_request.js +5 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
const {sendMessageToPeer} = require('ln-service');
|
|
2
|
+
const {subscribeToPeerMessages} = require('ln-service');
|
|
3
|
+
|
|
4
|
+
const defaultServerError = [500, 'InternalServiceError'];
|
|
5
|
+
const encodePeerResponse = require('./encode_peer_response');
|
|
6
|
+
const parseRequestFailure = (report, n) => { report([503, n]); return {}; };
|
|
7
|
+
const parseRequestMessage = require('./parse_request_message');
|
|
8
|
+
const returnFailureResponse = require('./return_failure_response');
|
|
9
|
+
const returnSuccessResponse = require('./return_success_response');
|
|
10
|
+
|
|
11
|
+
/** Get a p2p message listener
|
|
12
|
+
|
|
13
|
+
{
|
|
14
|
+
lnd: <Authenticated LND API Object>
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
@returns
|
|
18
|
+
{
|
|
19
|
+
error: <Add an Error Listener Function>
|
|
20
|
+
request: <Add A Request Listener For Type Function>
|
|
21
|
+
stop: <Stop Listening Function> ({}) => {};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
request:
|
|
25
|
+
{
|
|
26
|
+
type: <Type Number String>
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@returns via cbk
|
|
30
|
+
{
|
|
31
|
+
from: <Request From Node Id Hex Encoded Public Key String>
|
|
32
|
+
[records]: [{
|
|
33
|
+
type: <Type Number String>
|
|
34
|
+
value: <Value Hex String>
|
|
35
|
+
}]
|
|
36
|
+
}
|
|
37
|
+
{
|
|
38
|
+
failure: <Return Failure Function>
|
|
39
|
+
success: <Return Success Function>
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
failure:
|
|
43
|
+
[
|
|
44
|
+
<Return Error Code Number>
|
|
45
|
+
<Return Error Message String>
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
success:
|
|
49
|
+
{
|
|
50
|
+
[records]: [{
|
|
51
|
+
type: <Type Number String>
|
|
52
|
+
value: <Value Hex String>
|
|
53
|
+
}]
|
|
54
|
+
}
|
|
55
|
+
*/
|
|
56
|
+
module.exports = ({lnd}) => {
|
|
57
|
+
const listeners = {};
|
|
58
|
+
const service = {error: () => {}};
|
|
59
|
+
const sub = subscribeToPeerMessages({lnd});
|
|
60
|
+
|
|
61
|
+
sub.on('message_received', received => {
|
|
62
|
+
const from = received.public_key;
|
|
63
|
+
const {message} = received;
|
|
64
|
+
const {type} = received;
|
|
65
|
+
|
|
66
|
+
// Parse out the p2p request message details
|
|
67
|
+
const {request} = (() => {
|
|
68
|
+
try {
|
|
69
|
+
return parseRequestMessage({message, type});
|
|
70
|
+
} catch (err) {
|
|
71
|
+
return parseRequestFailure(service.error, err.message);
|
|
72
|
+
}
|
|
73
|
+
})();
|
|
74
|
+
|
|
75
|
+
// Exit early when the received message isn't actually a p2p request
|
|
76
|
+
if (!request) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Exit early when nothing is listening for this type
|
|
81
|
+
if (!listeners[request.type]) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const {id} = request;
|
|
86
|
+
const req = {from, records: request.records};
|
|
87
|
+
|
|
88
|
+
const failure = returnFailureResponse({from, id, lnd, service});
|
|
89
|
+
const success = returnSuccessResponse({from, id, lnd, service});
|
|
90
|
+
|
|
91
|
+
// Call the listener to tell it about the request
|
|
92
|
+
return listeners[request.type](req, {failure, success});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
error: cbk => service[error] = cbk,
|
|
97
|
+
request: ({type}, cbk) => listeners[type] = cbk,
|
|
98
|
+
stop: ({}) => sub.removeAllListeners(),
|
|
99
|
+
};
|
|
100
|
+
};
|
package/package.json
CHANGED
|
@@ -10,17 +10,19 @@
|
|
|
10
10
|
"async": "3.2.2",
|
|
11
11
|
"asyncjs-util": "1.2.7",
|
|
12
12
|
"bolt01": "1.2.3",
|
|
13
|
-
"invoices": "2.0.
|
|
14
|
-
"ln-service": "
|
|
13
|
+
"invoices": "2.0.2",
|
|
14
|
+
"ln-service": "53.2.0",
|
|
15
|
+
"ln-sync": "3.6.0"
|
|
15
16
|
},
|
|
16
17
|
"description": "Lightning Paid Services library",
|
|
17
18
|
"devDependencies": {
|
|
18
19
|
"@alexbosworth/tap": "15.0.10",
|
|
20
|
+
"ln-docker-daemons": "2.1.0",
|
|
19
21
|
"mock-lnd": "1.4.1",
|
|
20
22
|
"secp256k1": "4.0.2"
|
|
21
23
|
},
|
|
22
24
|
"engines": {
|
|
23
|
-
"node": ">=12"
|
|
25
|
+
"node": ">=12.20"
|
|
24
26
|
},
|
|
25
27
|
"keywords": [
|
|
26
28
|
"lightning",
|
|
@@ -34,7 +36,8 @@
|
|
|
34
36
|
"url": "https://github.com/alexbosworth/paid-services.git"
|
|
35
37
|
},
|
|
36
38
|
"scripts": {
|
|
37
|
-
"
|
|
39
|
+
"integration-tests": "tap --branches=1 --functions=1 --lines=1 --statements=1 -t 120 test/integration/*.js",
|
|
40
|
+
"test": "tap --branches=1 --functions=1 --lines=1 --statements=1 -t 60 test/actions/*.js test/capacity/*.js test/client/*.js test/config/*.js test/p2p/*.js test/records/*.js test/respond/*.js test/server/*.js test/server/*.js test/services/*.js"
|
|
38
41
|
},
|
|
39
|
-
"version": "3.
|
|
42
|
+
"version": "3.3.0"
|
|
40
43
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
const {test} = require('@alexbosworth/tap');
|
|
2
|
+
|
|
3
|
+
const method = require('./../../capacity/assemble_replacement_tx');
|
|
4
|
+
|
|
5
|
+
const makeArgs = overrides => {
|
|
6
|
+
const args = {
|
|
7
|
+
bitcoinjs_network: 'regtest',
|
|
8
|
+
close_transaction: '020000000001015c07d1d67044b91aa50c232d134a2212cd1594e47a0e0c1324e6606511b800f500000000001cc06980024a01000000000000220020b7993cda6e49931239a7c2f34a7ad8bf0b5bf7237674dfacb596418474441ecdb2340f000000000022002053107a1c940c2c9f2d7094de76dcfbcf78951328004cd6391ac20d468f912fb0040047304402201fd0bc7f064d2bd1583f47d9927b73ff56c33c54fb35fec08c0db02510dcf73f02206912c81373ca2827b8a7dd815c6d33db5d4fb327f3cba8518cd87e3a81c08380014830450221009f5683258870e7e755fd9d0826c50b02a4aeec470ace43c2e042dcaf139379fc0220358509d18e2c8c0f485a51e8ed02d479177fc06692b67cb5c025020c9d337fe40147522103a6064236258e646d216aace3afda9d972b052c5c29c2c1c0907d83177675e8b52103acafeb5309c6a437888ccfadb7d06312bf0fca1963fffdfcba9890c4a233e8a652aee14a4320',
|
|
9
|
+
decrease: [],
|
|
10
|
+
funding_address: 'bcrt1qq6xywqkd2z94gwlkcge4n07u3vmg5zn0t5p2ymarcll23rvrtv3q5w9j04',
|
|
11
|
+
funding_tokens: 987247,
|
|
12
|
+
transaction_id: 'f500b8116560e624130c0e7ae49415cd12224a132d230ca51ab94470d6d1075c',
|
|
13
|
+
transaction_vout: 0,
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
Object.keys(overrides).forEach(k => args[k] = overrides[k]);
|
|
17
|
+
|
|
18
|
+
return args;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const tests = [
|
|
22
|
+
{
|
|
23
|
+
args: makeArgs({}),
|
|
24
|
+
description: 'Assemble a replacement transaction',
|
|
25
|
+
expected: {
|
|
26
|
+
transaction: '01000000015c07d1d67044b91aa50c232d134a2212cd1594e47a0e0c1324e6606511b800f5000000000000000000016f100f0000000000220020068c4702cd508b543bf6c23359bfdc8b368a0a6f5d02a26fa3c7fea88d835b2200000000',
|
|
27
|
+
transaction_id: '17aba571699841d6ed8cd5d0eea97ea2d439295a2883f12daf36763df63131e3',
|
|
28
|
+
transaction_vin: 0,
|
|
29
|
+
transaction_vout: 0,
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
tests.forEach(({args, description, error, expected}) => {
|
|
35
|
+
return test(description, async ({end, strictSame, throws}) => {
|
|
36
|
+
if (!!error) {
|
|
37
|
+
throws(() => method(args), new Error(error), 'Got error');
|
|
38
|
+
} else {
|
|
39
|
+
const res = method(args);
|
|
40
|
+
|
|
41
|
+
strictSame(res, expected, 'Got expected result');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return end();
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
const {test} = require('@alexbosworth/tap');
|
|
2
|
+
|
|
3
|
+
const method = require('./../../capacity/capacity_change_requests');
|
|
4
|
+
|
|
5
|
+
const makeArgs = overrides => {
|
|
6
|
+
const args = {
|
|
7
|
+
channels: [{
|
|
8
|
+
capacity: 1,
|
|
9
|
+
id: '0x0x0',
|
|
10
|
+
partner_public_key: Buffer.alloc(33, 3).toString('hex'),
|
|
11
|
+
}],
|
|
12
|
+
requests: [{
|
|
13
|
+
channel: '0x0x0',
|
|
14
|
+
from: Buffer.alloc(33, 3).toString('hex'),
|
|
15
|
+
id: Buffer.alloc(32).toString('hex'),
|
|
16
|
+
}],
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
Object.keys(overrides).forEach(k => args[k] = overrides[k]);
|
|
20
|
+
|
|
21
|
+
return args;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const tests = [
|
|
25
|
+
{
|
|
26
|
+
args: makeArgs({}),
|
|
27
|
+
description: 'Map change requests to capacity change requests',
|
|
28
|
+
expected: {
|
|
29
|
+
requests: [{
|
|
30
|
+
address: undefined,
|
|
31
|
+
capacity: 1,
|
|
32
|
+
channel: '0x0x0',
|
|
33
|
+
decrease: undefined,
|
|
34
|
+
from: Buffer.alloc(33, 3).toString('hex'),
|
|
35
|
+
id: Buffer.alloc(32).toString('hex'),
|
|
36
|
+
increase: undefined,
|
|
37
|
+
}],
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
tests.forEach(({args, description, error, expected}) => {
|
|
43
|
+
return test(description, async ({end, strictSame, throws}) => {
|
|
44
|
+
if (!!error) {
|
|
45
|
+
throws(() => method(args), new Error(error), 'Got error');
|
|
46
|
+
} else {
|
|
47
|
+
const res = method(args);
|
|
48
|
+
|
|
49
|
+
strictSame(res, expected, 'Got expected result');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return end();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const {test} = require('@alexbosworth/tap');
|
|
2
|
+
|
|
3
|
+
const method = require('./../../capacity/encode_change_request');
|
|
4
|
+
|
|
5
|
+
const makeArgs = overrides => {
|
|
6
|
+
const args = {
|
|
7
|
+
channel: '0x0x0',
|
|
8
|
+
decrease: 0,
|
|
9
|
+
id: Buffer.alloc(32).toString('hex'),
|
|
10
|
+
increase: undefined,
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
Object.keys(overrides).forEach(k => args[k] = overrides[k]);
|
|
14
|
+
|
|
15
|
+
return args;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const tests = [
|
|
19
|
+
{
|
|
20
|
+
args: makeArgs({}),
|
|
21
|
+
description: 'Encode change request parameters',
|
|
22
|
+
expected: {
|
|
23
|
+
records: [
|
|
24
|
+
{
|
|
25
|
+
type: '1',
|
|
26
|
+
value: '0000000000000000000000000000000000000000000000000000000000000000',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
type: '2',
|
|
30
|
+
value: '0000000000000000',
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
tests.forEach(({args, description, error, expected}) => {
|
|
38
|
+
return test(description, async ({end, strictSame, throws}) => {
|
|
39
|
+
if (!!error) {
|
|
40
|
+
throws(() => method(args), new Error(error), 'Got error');
|
|
41
|
+
} else {
|
|
42
|
+
const res = method(args);
|
|
43
|
+
|
|
44
|
+
strictSame(res, expected, 'Got expected result');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return end();
|
|
48
|
+
});
|
|
49
|
+
});
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
const {test} = require('@alexbosworth/tap');
|
|
2
|
+
|
|
3
|
+
const method = require('./../../capacity/encode_sign_capacity_response');
|
|
4
|
+
|
|
5
|
+
const makeArgs = overrides => {
|
|
6
|
+
const args = {
|
|
7
|
+
id: Buffer.alloc(32).toString('hex'),
|
|
8
|
+
signature: Buffer.alloc(72).toString('hex'),
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
Object.keys(overrides).forEach(k => args[k] = overrides[k]);
|
|
12
|
+
|
|
13
|
+
return args;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const tests = [
|
|
17
|
+
{
|
|
18
|
+
args: makeArgs({}),
|
|
19
|
+
description: 'Encode sign capacity response',
|
|
20
|
+
expected: {
|
|
21
|
+
records: [
|
|
22
|
+
{
|
|
23
|
+
type: '0',
|
|
24
|
+
value: '0000000000000000000000000000000000000000000000000000000000000000',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
type: '1',
|
|
28
|
+
value: '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
tests.forEach(({args, description, error, expected}) => {
|
|
36
|
+
return test(description, async ({end, strictSame, throws}) => {
|
|
37
|
+
if (!!error) {
|
|
38
|
+
throws(() => method(args), new Error(error), 'Got error');
|
|
39
|
+
} else {
|
|
40
|
+
const res = method(args);
|
|
41
|
+
|
|
42
|
+
strictSame(res, expected, 'Got expected result');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return end();
|
|
46
|
+
});
|
|
47
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const {test} = require('@alexbosworth/tap');
|
|
2
|
+
|
|
3
|
+
const method = require('./../../capacity/fee_for_replacement');
|
|
4
|
+
|
|
5
|
+
const makeArgs = overrides => {
|
|
6
|
+
const args = {
|
|
7
|
+
capacity: 1e6,
|
|
8
|
+
commit_transaction_fee: 500,
|
|
9
|
+
commit_transaction_weight: 1000,
|
|
10
|
+
decrease: [{output: '00', tokens: 1}],
|
|
11
|
+
increase1: 1,
|
|
12
|
+
tokens_per_vbyte: 1,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
Object.keys(overrides).forEach(k => args[k] = overrides[k]);
|
|
16
|
+
|
|
17
|
+
return args;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const tests = [
|
|
21
|
+
{
|
|
22
|
+
args: makeArgs({}),
|
|
23
|
+
description: 'Calculate fee for replacement tx',
|
|
24
|
+
expected: {fee: 750},
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
tests.forEach(({args, description, error, expected}) => {
|
|
29
|
+
return test(description, async ({end, strictSame, throws}) => {
|
|
30
|
+
if (!!error) {
|
|
31
|
+
throws(() => method(args), new Error(error), 'Got error');
|
|
32
|
+
} else {
|
|
33
|
+
const res = method(args);
|
|
34
|
+
|
|
35
|
+
strictSame(res, expected, 'Got expected result');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return end();
|
|
39
|
+
});
|
|
40
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const {test} = require('@alexbosworth/tap');
|
|
2
|
+
|
|
3
|
+
const method = require('./../../capacity/finalize_capacity_replacement');
|
|
4
|
+
|
|
5
|
+
const makeArgs = overrides => {
|
|
6
|
+
const args = {
|
|
7
|
+
add_funds_vin: 1,
|
|
8
|
+
add_funds_public_key: '021461d967cd73a0daabfd3307612670a685f875505036fbffe6e8b6ad923b42b4',
|
|
9
|
+
add_funds_signature: '3045022100a2758040f91dafda44b4023f2d3c3c67e5f45cfc0124b3528ab17fe67efc8296022041dcf8fcb7ed7265a51c51bbf2f5256b6e6be99870ca01bd7272ddbdab0b0e58',
|
|
10
|
+
local_public_key: '02aff1b90d7db7d6efc4fce51ab8a862925f5bc1f36a3b481bc78f17c2d2eab6bd',
|
|
11
|
+
local_signature: '3045022100cb108c2828ee90e80aeadbe582fefafcfdecf051d90b64ffd4580c36d212519402200e3460309956f2b0f2104caf6c168d3d9ab8f35729083839bf7f535bb8976143',
|
|
12
|
+
funding_spend_vin: 0,
|
|
13
|
+
remote_signature: '3044022050e76c6cfe9de7cc5e370c26b40ff3538a71efeb8f872e3e1918c1d8efb3bec402207b60ae8486a499a5fb564613970aa9e5f443ad6da1608edff160b61169de91c3',
|
|
14
|
+
transaction: '01000000022f2b7182d7ecec0ff7f5657c6d99c03f7b04044d614e8e851cda7ef99a01b8c80000000000ffffffffc6e674e5f365bdf6b40c21823fee8a9d280f41b71e7b0d8865b0575617b67fb70000000000ffffffff01a31d1200000000002200208331f3c1e41346d1624934cade8330b106f34d7d7159e95cfcceaff1906aecf200000000',
|
|
15
|
+
witness_script: '522102aff1b90d7db7d6efc4fce51ab8a862925f5bc1f36a3b481bc78f17c2d2eab6bd2103f8a30f0d7c65ad71408006d79ee4da62adc9d47b3e752a3ef29c097f3a1e4afc52ae',
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
Object.keys(overrides).forEach(k => args[k] = overrides[k]);
|
|
19
|
+
|
|
20
|
+
return args;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const tests = [
|
|
24
|
+
{
|
|
25
|
+
args: makeArgs({}),
|
|
26
|
+
description: 'Finalize a capacity replacement',
|
|
27
|
+
expected: {
|
|
28
|
+
transaction: '010000000001022f2b7182d7ecec0ff7f5657c6d99c03f7b04044d614e8e851cda7ef99a01b8c80000000000ffffffffc6e674e5f365bdf6b40c21823fee8a9d280f41b71e7b0d8865b0575617b67fb70000000000ffffffff01a31d1200000000002200208331f3c1e41346d1624934cade8330b106f34d7d7159e95cfcceaff1906aecf20400483045022100cb108c2828ee90e80aeadbe582fefafcfdecf051d90b64ffd4580c36d212519402200e3460309956f2b0f2104caf6c168d3d9ab8f35729083839bf7f535bb897614301473044022050e76c6cfe9de7cc5e370c26b40ff3538a71efeb8f872e3e1918c1d8efb3bec402207b60ae8486a499a5fb564613970aa9e5f443ad6da1608edff160b61169de91c30147522102aff1b90d7db7d6efc4fce51ab8a862925f5bc1f36a3b481bc78f17c2d2eab6bd2103f8a30f0d7c65ad71408006d79ee4da62adc9d47b3e752a3ef29c097f3a1e4afc52ae02483045022100a2758040f91dafda44b4023f2d3c3c67e5f45cfc0124b3528ab17fe67efc8296022041dcf8fcb7ed7265a51c51bbf2f5256b6e6be99870ca01bd7272ddbdab0b0e580121021461d967cd73a0daabfd3307612670a685f875505036fbffe6e8b6ad923b42b400000000',
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
tests.forEach(({args, description, error, expected}) => {
|
|
34
|
+
return test(description, async ({end, strictSame, throws}) => {
|
|
35
|
+
if (!!error) {
|
|
36
|
+
throws(() => method(args), new Error(error), 'Got error');
|
|
37
|
+
} else {
|
|
38
|
+
const res = method(args);
|
|
39
|
+
|
|
40
|
+
strictSame(res, expected, 'Got expected result');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return end();
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const {test} = require('@alexbosworth/tap');
|
|
2
|
+
|
|
3
|
+
const method = require('./../../capacity/interim_replacement_psbt');
|
|
4
|
+
|
|
5
|
+
const makeArgs = overrides => {
|
|
6
|
+
const args = {
|
|
7
|
+
increase_public_key: '02f0de5929182b6300d1b3f4b3bd4e3455bb67ff171d9580679848aa140f52c7d0',
|
|
8
|
+
increase_signature: '304402207d3c92e6a512d5167edda7802bf41666196a5133cd299e86be10d84fbc7ca661022024f8f912adc955d3f79f344d52e566284d02161d6b76aa1b70f4ed4a9f25ab2b',
|
|
9
|
+
increase_transaction: '02000000000101003e82436e87b765489f9cb751d4fc274663de11d6ba3df262644b14af42dee60000000000ffffffff02400d03000000000016001421f75e4e4856f78428d064cb4727a5f69dbf2f2c36c9022a01000000160014f31af4302c0136489ece54214340aae4b33463e102483045022100bb39fb591305b4b160424cae3066ac3e73aa3c8b667ffdbfde1de13ed951fec00220196c02d47c051ae407e9072c4c76a0a06c18f4a7022f9a8c704a9aa2a4d34ae901210316acb9cd74b7836aceae5ffdb07cb2ef67ed65eaba2ea270869924036b7de45f00000000',
|
|
10
|
+
increase_transaction_vin: 1,
|
|
11
|
+
open_transaction: '02000000000101edad35ee0a8adb71c44e5d67164d5ccd7a56663645f0eed815d90c50a8c600e90000000000000000000240420f0000000000220020e75299243b0183e4590eb71df6f8aafba7de577ba7f3ff01ec42a82e5e5d97a7eb91f62901000000160014edd4f86b73acd6150895dcecd1aabebf8825db880247304402207a78ce93fbb062fec068b35c2c282e1dbc93d791eaff2ba177a86b8eca96128502207c5f53acf07a865228f776f7f5725c8e72204db9134fdb7b7ef6876bd3f30fe201210316acb9cd74b7836aceae5ffdb07cb2ef67ed65eaba2ea270869924036b7de45f00000000',
|
|
12
|
+
signature: '30450221009e2eeee8c0c9d14b95a4611e4fb83b931325e22dc5939ddc6cc81e1d84e5c51402200ae907b0b681442e327add8fadd3f46710b19880e143d41febdc3fe8decb1a12',
|
|
13
|
+
unsigned_transaction: '01000000026dbdcc66dc7ae49d0bbf7dd6b7c24989f8c510d2c8a8f72978b1eaf5a322d2090000000000ffffffff6f8ad13d8647cd2d00a0147841da0e7bb8439a9c48590ffa7347f86228db3cd70000000000ffffffff01af1d120000000000220020b994281c8afe338fff73a267398542f3f37136ee62db9fb1a8d6db40db1e5a4700000000',
|
|
14
|
+
witness_script: '5221021796f279ccded2657631746376c26c01e45837a8c58e81f9f186fc50581c5733210301117f54de2db419e379fe45e2eeaabd65482d871694be994a6c134ab6475c8a52ae',
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
Object.keys(overrides).forEach(k => args[k] = overrides[k]);
|
|
18
|
+
|
|
19
|
+
return args;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const tests = [
|
|
23
|
+
{
|
|
24
|
+
args: makeArgs({}),
|
|
25
|
+
description: 'Create interim replacement PSBT',
|
|
26
|
+
expected: {
|
|
27
|
+
psbt: '70736274ff01008701000000026dbdcc66dc7ae49d0bbf7dd6b7c24989f8c510d2c8a8f72978b1eaf5a322d2090000000000ffffffff6f8ad13d8647cd2d00a0147841da0e7bb8439a9c48590ffa7347f86228db3cd70000000000ffffffff01af1d120000000000220020b994281c8afe338fff73a267398542f3f37136ee62db9fb1a8d6db40db1e5a47000000000001012b40420f0000000000220020e75299243b0183e4590eb71df6f8aafba7de577ba7f3ff01ec42a82e5e5d97a72202021796f279ccded2657631746376c26c01e45837a8c58e81f9f186fc50581c57334830450221009e2eeee8c0c9d14b95a4611e4fb83b931325e22dc5939ddc6cc81e1d84e5c51402200ae907b0b681442e327add8fadd3f46710b19880e143d41febdc3fe8decb1a120122020301117f54de2db419e379fe45e2eeaabd65482d871694be994a6c134ab6475c8a4830450221009e2eeee8c0c9d14b95a4611e4fb83b931325e22dc5939ddc6cc81e1d84e5c51402200ae907b0b681442e327add8fadd3f46710b19880e143d41febdc3fe8decb1a1201010304010000000105475221021796f279ccded2657631746376c26c01e45837a8c58e81f9f186fc50581c5733210301117f54de2db419e379fe45e2eeaabd65482d871694be994a6c134ab6475c8a52ae0001011f400d03000000000016001421f75e4e4856f78428d064cb4727a5f69dbf2f2c220202f0de5929182b6300d1b3f4b3bd4e3455bb67ff171d9580679848aa140f52c7d047304402207d3c92e6a512d5167edda7802bf41666196a5133cd299e86be10d84fbc7ca661022024f8f912adc955d3f79f344d52e566284d02161d6b76aa1b70f4ed4a9f25ab2b01010304010000000000',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
tests.forEach(({args, description, error, expected}) => {
|
|
33
|
+
return test(description, async ({end, strictSame, throws}) => {
|
|
34
|
+
if (!!error) {
|
|
35
|
+
throws(() => method(args), new Error(error), 'Got error');
|
|
36
|
+
} else {
|
|
37
|
+
const res = method(args);
|
|
38
|
+
|
|
39
|
+
strictSame(res, expected, 'Got expected result');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return end();
|
|
43
|
+
});
|
|
44
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const {test} = require('@alexbosworth/tap');
|
|
2
|
+
|
|
3
|
+
const method = require('./../../capacity/is_open_witness_script');
|
|
4
|
+
|
|
5
|
+
const makeArgs = overrides => {
|
|
6
|
+
const args = {
|
|
7
|
+
script: '5221034523c886226ad5986c0f27883f1dafe87da27dc0b17ae902aa0c04fe87017cd42103cfbabf006b8be8e2f9782f8a3bacef0641780528e0f75a44b43e302362b27e1f52ae',
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
Object.keys(overrides).forEach(k => args[k] = overrides[k]);
|
|
11
|
+
|
|
12
|
+
return args;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const tests = [
|
|
16
|
+
{
|
|
17
|
+
args: makeArgs({}),
|
|
18
|
+
description: 'Test if a witness script is a witness script',
|
|
19
|
+
expected: true,
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
args: makeArgs({script: '00'}),
|
|
23
|
+
description: 'Test if a nothing script is a witness script',
|
|
24
|
+
expected: false,
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
tests.forEach(({args, description, error, expected}) => {
|
|
29
|
+
return test(description, async ({end, strictSame, throws}) => {
|
|
30
|
+
if (!!error) {
|
|
31
|
+
throws(() => method(args), new Error(error), 'Got error');
|
|
32
|
+
} else {
|
|
33
|
+
const res = method(args);
|
|
34
|
+
|
|
35
|
+
strictSame(res, expected, 'Got expected result');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return end();
|
|
39
|
+
});
|
|
40
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const {test} = require('@alexbosworth/tap');
|
|
2
|
+
|
|
3
|
+
const method = require('./../../capacity/parse_accept_request');
|
|
4
|
+
|
|
5
|
+
const makeArgs = overrides => {
|
|
6
|
+
const args = {
|
|
7
|
+
records: [{
|
|
8
|
+
type: '0',
|
|
9
|
+
value: '1cc3b75541a20987ff2308d3c9c92cb8ee9b9975d698f6f82769d2da2596b76f'
|
|
10
|
+
}],
|
|
11
|
+
open_transaction: '02000000000101ddfc0b95d447db6ccef44a4a22d4e38adf570c2e0983f42a01a6e8076e7bb5420000000000000000000240420f00000000002200202e5eae1260152c8b22c27b85b2cee0729754caa1755f614f4779ab8405d4615aeb91f62901000000160014f44f2cbc9cf0b30458402066460d49090a1cdff10247304402201175d52acbcd349f8ea939408bef630be9931d3c6109e9ae2d035af42e012f3502206b00a1d4e9eecff8d3029ba28fa09ccbff9b57280bc521755146d8dd4cb2e00201210364af1cc058d131eab68a08259371348c58a3b2c336d021e8fbe10e19ae8d280b00000000',
|
|
12
|
+
transaction_id: '6e060748f54776964b42f3144965ccf67dab1bf079301f2016684f15fd01846d',
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
Object.keys(overrides).forEach(k => args[k] = overrides[k]);
|
|
16
|
+
|
|
17
|
+
return args;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const tests = [
|
|
21
|
+
{
|
|
22
|
+
args: makeArgs({}),
|
|
23
|
+
description: 'Accept requests should be parsed',
|
|
24
|
+
expected: {
|
|
25
|
+
transaction: '02000000000101ddfc0b95d447db6ccef44a4a22d4e38adf570c2e0983f42a01a6e8076e7bb5420000000000000000000240420f00000000002200202e5eae1260152c8b22c27b85b2cee0729754caa1755f614f4779ab8405d4615aeb91f62901000000160014f44f2cbc9cf0b30458402066460d49090a1cdff10247304402201175d52acbcd349f8ea939408bef630be9931d3c6109e9ae2d035af42e012f3502206b00a1d4e9eecff8d3029ba28fa09ccbff9b57280bc521755146d8dd4cb2e00201210364af1cc058d131eab68a08259371348c58a3b2c336d021e8fbe10e19ae8d280b00000000',
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
tests.forEach(({args, description, error, expected}) => {
|
|
31
|
+
return test(description, async ({end, strictSame, throws}) => {
|
|
32
|
+
if (!!error) {
|
|
33
|
+
throws(() => method(args), new Error(error), 'Got error');
|
|
34
|
+
} else {
|
|
35
|
+
const res = method(args);
|
|
36
|
+
|
|
37
|
+
strictSame(res, expected, 'Got expected result');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return end();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
const {test} = require('@alexbosworth/tap');
|
|
2
|
+
|
|
3
|
+
const method = require('./../../capacity/parse_capacity_change_request');
|
|
4
|
+
|
|
5
|
+
const makeArgs = overrides => {
|
|
6
|
+
const args = {
|
|
7
|
+
from: '0218819f4e0dbab6c6bc434913bace0b69f20d832f68934acd72fc610a9b76fe30',
|
|
8
|
+
records: [
|
|
9
|
+
{
|
|
10
|
+
type: '1',
|
|
11
|
+
value: '2bf4a6bf1b97aff5bbb760f1aa7a5705c885194b4e29d42e5576498107f02361',
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
type: '2',
|
|
15
|
+
value: '0000660000010000',
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
Object.keys(overrides).forEach(k => args[k] = overrides[k]);
|
|
21
|
+
|
|
22
|
+
return args;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const tests = [
|
|
26
|
+
{
|
|
27
|
+
args: makeArgs({}),
|
|
28
|
+
description: 'A capacity change request should be parsed',
|
|
29
|
+
expected: {
|
|
30
|
+
request: {
|
|
31
|
+
channel: '102x1x0',
|
|
32
|
+
from: '0218819f4e0dbab6c6bc434913bace0b69f20d832f68934acd72fc610a9b76fe30',
|
|
33
|
+
id: '2bf4a6bf1b97aff5bbb760f1aa7a5705c885194b4e29d42e5576498107f02361',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
tests.forEach(({args, description, error, expected}) => {
|
|
40
|
+
return test(description, async ({end, strictSame, throws}) => {
|
|
41
|
+
if (!!error) {
|
|
42
|
+
throws(() => method(args), new Error(error), 'Got error');
|
|
43
|
+
} else {
|
|
44
|
+
const res = method(args);
|
|
45
|
+
|
|
46
|
+
strictSame(res, expected, 'Got expected result');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return end();
|
|
50
|
+
});
|
|
51
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const {test} = require('@alexbosworth/tap');
|
|
2
|
+
|
|
3
|
+
const method = require('./../../capacity/parse_sign_capacity_request');
|
|
4
|
+
|
|
5
|
+
const makeArgs = overrides => {
|
|
6
|
+
const args = {
|
|
7
|
+
id: 'b213832d9ab1d735c42bda931e5be603141f379d05142a40fc1af8e7536cdbaf',
|
|
8
|
+
increase: undefined,
|
|
9
|
+
records: [
|
|
10
|
+
{
|
|
11
|
+
type: '0',
|
|
12
|
+
value: '9e6e9f9ed56c38e0e01d896b6188a050cde7fa48314f533c85156b35abd0b0fd',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
type: '1',
|
|
16
|
+
value: '0100000001afdb6c53e7f81afc402a14059d371f1403e65b1e93da2bc435d7b19a2d8313b2000000000000000000016f100f00000000002200209c0b6154fc22ead29dc861cdbd135245c615a806b5268eb34f8e8d4f4225784200000000',
|
|
17
|
+
},
|
|
18
|
+
],
|
|
19
|
+
vout: 0,
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
Object.keys(overrides).forEach(k => args[k] = overrides[k]);
|
|
23
|
+
|
|
24
|
+
return args;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const tests = [
|
|
28
|
+
{
|
|
29
|
+
args: makeArgs({}),
|
|
30
|
+
description: 'Parse a sign capacity change request',
|
|
31
|
+
expected: {
|
|
32
|
+
unsigned: '0100000001afdb6c53e7f81afc402a14059d371f1403e65b1e93da2bc435d7b19a2d8313b2000000000000000000016f100f00000000002200209c0b6154fc22ead29dc861cdbd135245c615a806b5268eb34f8e8d4f4225784200000000',
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
tests.forEach(({args, description, error, expected}) => {
|
|
38
|
+
return test(description, async ({end, strictSame, throws}) => {
|
|
39
|
+
if (!!error) {
|
|
40
|
+
throws(() => method(args), new Error(error), 'Got error');
|
|
41
|
+
} else {
|
|
42
|
+
const res = method(args);
|
|
43
|
+
|
|
44
|
+
strictSame(res, expected, 'Got expected result');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return end();
|
|
48
|
+
});
|
|
49
|
+
});
|