@alexbosworth/fiat 2.0.0 → 3.0.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.
Files changed (105) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +93 -1
  3. package/arrays/index.js +3 -0
  4. package/arrays/sort_by.js +44 -0
  5. package/chain/add_days.js +22 -0
  6. package/chain/blocks/block_header_hash.js +29 -0
  7. package/chain/blocks/block_header_time.js +25 -0
  8. package/chain/blocks/find_complete_day.js +90 -0
  9. package/chain/blocks/find_height_for_time.js +93 -0
  10. package/chain/blocks/get_block_hash.js +60 -0
  11. package/chain/blocks/get_block_header.js +45 -0
  12. package/chain/blocks/get_block_payments.js +100 -0
  13. package/chain/blocks/get_blocks_for_date.js +110 -0
  14. package/chain/blocks/get_median_time.js +92 -0
  15. package/chain/blocks/index.js +19 -0
  16. package/chain/blocks/payment_outputs_from_block.js +178 -0
  17. package/chain/blocks/sample_heights.js +33 -0
  18. package/chain/blocks/window_heights.js +34 -0
  19. package/chain/chain_rates.js +129 -0
  20. package/chain/constants.json +26 -0
  21. package/chain/estimates/check_known_estimates.js +119 -0
  22. package/chain/estimates/current_estimates.js +66 -0
  23. package/chain/estimates/estimate_and_remember.js +199 -0
  24. package/chain/estimates/estimate_day_price.js +361 -0
  25. package/chain/estimates/estimate_record.js +107 -0
  26. package/chain/estimates/estimate_windows.js +246 -0
  27. package/chain/estimates/find_starting_day.js +86 -0
  28. package/chain/estimates/forget_estimates.js +113 -0
  29. package/chain/estimates/get_chain_price.js +167 -0
  30. package/chain/estimates/get_price_for_date.js +607 -0
  31. package/chain/estimates/get_price_from_blocks.js +281 -0
  32. package/chain/estimates/get_provisional_price.js +163 -0
  33. package/chain/estimates/index.js +25 -0
  34. package/chain/estimates/is_alias_ratio.js +38 -0
  35. package/chain/estimates/is_supported_estimate.js +81 -0
  36. package/chain/estimates/nearest_estimate.js +49 -0
  37. package/chain/estimates/price_window.js +25 -0
  38. package/chain/estimates/remember_estimate.js +83 -0
  39. package/chain/estimates/store_estimate.js +198 -0
  40. package/chain/histogram/best_position.js +63 -0
  41. package/chain/histogram/histogram_excess.js +50 -0
  42. package/chain/histogram/histogram_peak.js +87 -0
  43. package/chain/histogram/implied_prices_histogram.js +53 -0
  44. package/chain/histogram/index.js +33 -0
  45. package/chain/histogram/is_round_tokens.js +26 -0
  46. package/chain/histogram/kernel_width.js +25 -0
  47. package/chain/histogram/lower_bound.js +28 -0
  48. package/chain/histogram/noise_of_neighbors.js +28 -0
  49. package/chain/histogram/noise_strength.js +35 -0
  50. package/chain/histogram/noise_strengths.js +29 -0
  51. package/chain/histogram/outputs_histogram.js +80 -0
  52. package/chain/histogram/parabola_peak.js +28 -0
  53. package/chain/histogram/payments_near_position.js +31 -0
  54. package/chain/histogram/peak_width.js +37 -0
  55. package/chain/histogram/position_score.js +38 -0
  56. package/chain/histogram/score_position.js +94 -0
  57. package/chain/histogram/smooth_bins.js +29 -0
  58. package/chain/histogram/sorted_neighbors.js +89 -0
  59. package/chain/histogram/spike_strengths.js +33 -0
  60. package/chain/histogram/template_agreement.js +27 -0
  61. package/chain/index.js +3 -0
  62. package/chain/known/earliest_supported_day.js +12 -0
  63. package/chain/known/index.js +11 -0
  64. package/chain/known/known_prices.js +43 -0
  65. package/chain/known/known_prices.json +1836 -0
  66. package/chain/known/method_version.js +26 -0
  67. package/chain/known/parse_known_prices.js +67 -0
  68. package/chain/outputs/alias_shifts.js +31 -0
  69. package/chain/outputs/cap_near_round_values.js +83 -0
  70. package/chain/outputs/cap_repeated_values.js +33 -0
  71. package/chain/outputs/dollar_bin_for_price.js +19 -0
  72. package/chain/outputs/estimate_from_outputs.js +321 -0
  73. package/chain/outputs/index.js +11 -0
  74. package/chain/outputs/peak_around_price.js +86 -0
  75. package/chain/outputs/price_for_dollar_bin.js +21 -0
  76. package/chain/outputs/price_from_outputs.js +98 -0
  77. package/chain/outputs/refine_price.js +73 -0
  78. package/chain/outputs/round_amounts.js +49 -0
  79. package/chain/outputs/template.json +22 -0
  80. package/coinbase/constants.json +5 -0
  81. package/coinbase/get_coinbase_day_candles.js +155 -0
  82. package/coinbase/get_coinbase_historic_price.js +135 -0
  83. package/coinbase/index.js +7 -1
  84. package/dates/constants.json +3 -0
  85. package/dates/day_of_date.js +26 -0
  86. package/dates/index.js +5 -0
  87. package/dates/is_calendar_day.js +16 -0
  88. package/dates/time_of_date.js +61 -0
  89. package/docs/METHODOLOGY.md +984 -0
  90. package/index.js +2 -1
  91. package/package.json +29 -8
  92. package/rates/get_prices.js +51 -8
  93. package/storage/constants.json +4 -0
  94. package/storage/get_prices_file.js +169 -0
  95. package/storage/index.js +4 -0
  96. package/storage/is_prices.js +31 -0
  97. package/storage/put_prices_file.js +252 -0
  98. package/storage/temp_path.js +22 -0
  99. package/.gitattributes +0 -1
  100. package/.tm_properties +0 -1
  101. package/test/coinbase/test_get_coinbase_current_price.js +0 -77
  102. package/test/coindesk/test_get_coindesk_current_price.js +0 -95
  103. package/test/coingecko/test_get_coingecko_rates.js +0 -93
  104. package/test/rates/test_get_current_price.js +0 -74
  105. package/test/rates/test_get_prices.js +0 -78
@@ -1,77 +0,0 @@
1
- const {deepStrictEqual} = require('node:assert').strict;
2
- const {rejects} = require('node:assert').strict;
3
- const test = require('node:test');
4
-
5
- const {getCoinbaseCurrentPrice} = require('./../../coinbase');
6
-
7
- const makeRequest = (err, r, body) => ({}, cbk) => cbk(err, r, body);
8
-
9
- const makeArgs = override => {
10
- const args = {
11
- currency: 'BTC',
12
- fiat: 'USD',
13
- request: makeRequest(null, {statusCode: 200}, {data: {amount: 1}}),
14
- };
15
-
16
- Object.keys(override).forEach(key => args[key] = override[key]);
17
-
18
- return args;
19
- };
20
-
21
- const tests = [
22
- {
23
- args: makeArgs({currency: undefined}),
24
- description: 'Currency is required',
25
- error: [400, 'ExpectedCurrencyCodeToGetCoinbaseCurrentPrice'],
26
- },
27
- {
28
- args: makeArgs({fiat: undefined}),
29
- description: 'Fiat is required',
30
- error: [400, 'ExpectedKnownCurrencyToGetCoinbaseCurrentPrice'],
31
- },
32
- {
33
- args: makeArgs({request: undefined}),
34
- description: 'Request is required',
35
- error: [400, 'ExpectedRequestMethodToGetCoinbaseCurrentPrice'],
36
- },
37
- {
38
- args: makeArgs({request: makeRequest('err')}),
39
- description: 'Request errors are passed back',
40
- error: [503, 'UnexpectedErrorGettingCoinbasePrice', {err: 'err'}],
41
- },
42
- {
43
- args: makeArgs({request: makeRequest()}),
44
- description: 'Request response is expected',
45
- error: [503, 'ExpectedCurrencyRateDataFromCoinbase'],
46
- },
47
- {
48
- args: makeArgs({request: makeRequest(null, null, {})}),
49
- description: 'Request response data is expected',
50
- error: [503, 'ExpectedCurrencyRateDataFromCoinbase'],
51
- },
52
- {
53
- args: makeArgs({request: makeRequest(null, null, {data: {}})}),
54
- description: 'Request response amount is expected',
55
- error: [503, 'ExpectedCurrencyRateDataFromCoinbase'],
56
- },
57
- {
58
- args: makeArgs({}),
59
- description: 'Rate is returned',
60
- expected: {cents: 100},
61
- },
62
- ];
63
-
64
- tests.forEach(({args, description, error, expected}) => {
65
- return test(description, async () => {
66
- if (!!error) {
67
- await rejects(getCoinbaseCurrentPrice(args), error, 'Got error');
68
- } else {
69
- const {cents, date} = await getCoinbaseCurrentPrice(args);
70
-
71
- deepStrictEqual(cents, expected.cents, 'Got expected exchange rate');
72
- deepStrictEqual(!!date, true, 'Got a date value');
73
- }
74
-
75
- return;
76
- });
77
- });
@@ -1,95 +0,0 @@
1
- const {deepStrictEqual} = require('node:assert').strict;
2
- const {rejects} = require('node:assert').strict;
3
- const test = require('node:test');
4
-
5
- const {getCoindeskCurrentPrice} = require('./../../coindesk');
6
-
7
- const makeRequest = (err, r, body) => ({}, cbk) => cbk(err, r, body);
8
- const updatedISO = '2020-01-13T20:13:00+00:00';
9
-
10
- const makeArgs = override => {
11
- const args = {
12
- currency: 'BTC',
13
- fiat: 'USD',
14
- request: makeRequest(
15
- null,
16
- {statusCode: 200},
17
- {bpi: {USD: {rate_float: 1}}, time: {updatedISO: updatedISO}},
18
- )
19
- };
20
-
21
- Object.keys(override).forEach(key => args[key] = override[key]);
22
-
23
- return args;
24
- };
25
-
26
- const tests = [
27
- {
28
- args: makeArgs({currency: undefined}),
29
- description: 'Currency is required',
30
- error: [400, 'UnsupportedCurrencyForCoindeskFiatRateLookup'],
31
- },
32
- {
33
- args: makeArgs({fiat: undefined}),
34
- description: 'Fiat is required',
35
- error: [400, 'UnsupportedFiatTypeForCoindeskFiatRateLookup'],
36
- },
37
- {
38
- args: makeArgs({request: undefined}),
39
- description: 'Request is required',
40
- error: [400, 'ExpectedRequestMethodForCoindeskFiatRateLookup'],
41
- },
42
- {
43
- args: makeArgs({request: makeRequest('err')}),
44
- description: 'Request errors are passed back',
45
- error: [503, 'UnexpectedErrorGettingCoindeskPrice', {err: 'err'}],
46
- },
47
- {
48
- args: makeArgs({request: makeRequest()}),
49
- description: 'Request response is expected',
50
- error: [503, 'UnexpectedResponseInCoindeskRateResponse'],
51
- },
52
- {
53
- args: makeArgs({request: makeRequest(null, null, {})}),
54
- description: 'Request response bpi is expected',
55
- error: [503, 'UnexpectedResponseInCoindeskRateResponse'],
56
- },
57
- {
58
- args: makeArgs({request: makeRequest(null, null, {bpi: {}})}),
59
- description: 'Request response bpi is expected',
60
- error: [503, 'UnexpectedResponseInCoindeskRateResponse'],
61
- },
62
- {
63
- args: makeArgs({request: makeRequest(null, null, {bpi: {USD: {}}})}),
64
- description: 'Request response bpi rate float is expected',
65
- error: [503, 'ExpectedRateForFiatInCoindeskRateResponse'],
66
- },
67
- {
68
- args: makeArgs({
69
- request: makeRequest(null, null, {bpi: {USD: {rate_float: 1}}}),
70
- }),
71
- description: 'Reqeust response bpi rate float is expected',
72
- error: [503, 'ExpectedUpdatedTimeInCoindeskRateResponse'],
73
- },
74
- {
75
- args: makeArgs({}),
76
- description: 'Rate is returned',
77
- expected: {cents: 100},
78
- },
79
- ];
80
-
81
- tests.forEach(({args, description, error, expected}) => {
82
- return test(description, async () => {
83
- if (!!error) {
84
- await rejects(getCoindeskCurrentPrice(args), error, 'Got error');
85
-
86
- return;
87
- }
88
-
89
- const {cents} = await getCoindeskCurrentPrice(args);
90
-
91
- deepStrictEqual(cents, expected.cents, 'Got expected exchange rate');
92
-
93
- return;
94
- });
95
- });
@@ -1,93 +0,0 @@
1
- const {deepStrictEqual} = require('node:assert').strict;
2
- const {rejects} = require('node:assert').strict;
3
- const test = require('node:test');
4
-
5
- const {getCoingeckoRates} = require('./../../coingecko');
6
-
7
- const updatedISO = '2020-01-13T20:13:00+00:00';
8
-
9
- const body = {rates: {eur: {value: 1}, usd: {value: 2}}};
10
-
11
- const makeRequest = (err, res) => ({}, cbk) => cbk(err, null, res);
12
-
13
- const makeArgs = override => {
14
- const args = {request: makeRequest(null, body), symbols: ['EUR']};
15
-
16
- Object.keys(override).forEach(key => args[key] = override[key]);
17
-
18
- return args;
19
- };
20
-
21
- const tests = [
22
- {
23
- args: makeArgs({symbols: undefined}),
24
- description: 'Symbols are required',
25
- error: [400, 'ExpectedSymbolsToGetCoingeckoExchangeRates'],
26
- },
27
- {
28
- args: makeArgs({request: undefined}),
29
- description: 'A request function is required',
30
- error: [400, 'ExpectedRequestFunctionToGetExchangeRates'],
31
- },
32
- {
33
- args: makeArgs({request: makeRequest('err')}),
34
- description: 'Request cannot return error',
35
- error: [503, 'UnexpectedErrorGettingCoingeckoRates', {err: 'err'}],
36
- },
37
- {
38
- args: makeArgs({request: makeRequest(null, null)}),
39
- description: 'Response must return a body',
40
- error: [503, 'ExpectedRatesInCoingeckoResponse'],
41
- },
42
- {
43
- args: makeArgs({request: makeRequest(null, {})}),
44
- description: 'Response must return rates',
45
- error: [503, 'ExpectedRatesInCoingeckoResponse'],
46
- },
47
- {
48
- args: makeArgs({request: makeRequest(null, {rates: {}})}),
49
- description: 'Response is expected to have a result',
50
- error: [404, 'CoingeckoRateLookupSymbolNotFound'],
51
- },
52
- {
53
- args: makeArgs({symbols: []}),
54
- description: 'Got default exchange rate',
55
- expected: {
56
- tickers: [{
57
- date: '2020-01-13T20:13:00.000Z',
58
- rate: 200,
59
- ticker: 'USD',
60
- }],
61
- },
62
- },
63
- {
64
- args: makeArgs({}),
65
- description: 'Got exchange rates',
66
- expected: {
67
- tickers: [{
68
- date: '2020-01-13T20:13:00.000Z',
69
- rate: 100,
70
- ticker: 'EUR',
71
- }],
72
- },
73
- },
74
- ];
75
-
76
- tests.forEach(({args, description, error, expected}) => {
77
- return test(description, async () => {
78
- if (!!error) {
79
- await rejects(getCoingeckoRates(args), error, 'Got expected error');
80
-
81
- return;
82
- }
83
-
84
- const [expectedTicker] = expected.tickers;
85
- const [ticker] = (await getCoingeckoRates(args)).tickers;
86
-
87
- deepStrictEqual(!!ticker.date, true, 'Got ticker date');
88
- deepStrictEqual(ticker.rate, expectedTicker.rate, 'Got expected rate');
89
- deepStrictEqual(ticker.ticker, expectedTicker.ticker, 'Got symbol');
90
-
91
- return;
92
- });
93
- });
@@ -1,74 +0,0 @@
1
- const {deepStrictEqual} = require('node:assert').strict;
2
- const {rejects} = require('node:assert').strict;
3
- const test = require('node:test');
4
-
5
- const method = require('./../../rates/get_current_price');
6
-
7
- const makeRequest = (err, r, body) => ({}, cbk) => cbk(err, r, body);
8
- const updatedISO = '2020-01-13T20:13:00+00:00';
9
-
10
- const makeArgs = override => {
11
- const args = {
12
- currency: 'BTC',
13
- fiat: 'USD',
14
- from: 'coindesk',
15
- request: makeRequest(
16
- null,
17
- {statusCode: 200},
18
- {bpi: {USD: {rate_float: 1}}, time: {updatedISO: updatedISO}},
19
- )
20
- };
21
-
22
- Object.keys(override).forEach(key => args[key] = override[key]);
23
-
24
- return args;
25
- };
26
-
27
- const tests = [
28
- {
29
- args: makeArgs({currency: undefined}),
30
- description: 'Currency is required',
31
- error: [400, 'ExpectedCurrencyToGetCurrentPriceFor'],
32
- },
33
- {
34
- args: makeArgs({fiat: undefined}),
35
- description: 'Fiat is required',
36
- error: [400, 'ExpectedFiatSymbolToGetCurrentPriceIn'],
37
- },
38
- {
39
- args: makeArgs({from: undefined}),
40
- description: 'From is required',
41
- error: [400, 'ExpectedRateProviderToGetCurrentPrice'],
42
- },
43
- {
44
- args: makeArgs({from: 'unknown'}),
45
- description: 'A known provider is required',
46
- error: [400, 'UnknownRateProviderToGetCurrentFiatPrice'],
47
- },
48
- {
49
- args: makeArgs({request: undefined}),
50
- description: 'Request is required',
51
- error: [400, 'ExpectedRequestFunctionToGetCurrentPrice'],
52
- },
53
- {
54
- args: makeArgs({}),
55
- description: 'Rate is returned',
56
- expected: {cents: 100},
57
- },
58
- ];
59
-
60
- tests.forEach(({args, description, error, expected}) => {
61
- return test(description, async () => {
62
- if (!!error) {
63
- await rejects(method(args), error, 'Got expected error');
64
-
65
- return;
66
- }
67
-
68
- const {cents} = await method(args);
69
-
70
- deepStrictEqual(cents, expected.cents, 'Got expected exchange rate');
71
-
72
- return;
73
- });
74
- });
@@ -1,78 +0,0 @@
1
- const {deepStrictEqual} = require('node:assert').strict;
2
- const {rejects} = require('node:assert').strict;
3
- const test = require('node:test');
4
-
5
- const method = require('./../../rates/get_prices');
6
-
7
- const makeRequest = (err, r, body) => ({}, cbk) => cbk(err, r, body);
8
- const updatedISO = '2020-01-13T20:13:00+00:00';
9
-
10
- const makeArgs = override => {
11
- const args = {
12
- from: 'coindesk',
13
- request: makeRequest(
14
- null,
15
- {statusCode: 200},
16
- {bpi: {USD: {rate_float: 1}}, time: {updatedISO: updatedISO}},
17
- ),
18
- symbols: [],
19
- };
20
-
21
- Object.keys(override).forEach(key => args[key] = override[key]);
22
-
23
- return args;
24
- };
25
-
26
- const tests = [
27
- {
28
- args: makeArgs({from: undefined}),
29
- description: 'From is required',
30
- error: [400, 'ExpectedFromRateProviderToGetPriceRates'],
31
- },
32
- {
33
- args: makeArgs({request: undefined}),
34
- description: 'Request is required',
35
- error: [400, 'ExpectedRequestFunctionToGetExchangeRates'],
36
- },
37
- {
38
- args: makeArgs({symbols: undefined}),
39
- description: 'Symbols are required',
40
- error: [400, 'ExpectedSymbolsToGetFiatExchangeRates'],
41
- },
42
- {
43
- args: makeArgs({symbols: ['UNKNOWN']}),
44
- description: 'Known symbols are required',
45
- error: [400, 'UnsupportedFiatTypeForCoindeskFiatRateLookup'],
46
- },
47
- {
48
- args: makeArgs({}),
49
- description: 'Rate is returned',
50
- expected: {rate: 100},
51
- },
52
- {
53
- args: makeArgs({
54
- from: 'coingecko',
55
- request: ({}, cbk) => cbk(
56
- null,
57
- {statusCode: 200},
58
- {rates: {eur: {value: 2}, usd: {value: 1}}},
59
- ),
60
- }),
61
- description: 'Batch rates are returned',
62
- expected: {rate: 100},
63
- },
64
- ];
65
-
66
- tests.forEach(({args, description, error, expected}) => {
67
- return test(description, async () => {
68
- if (!!error) {
69
- await rejects(method(args), error, 'Got expected error');
70
- } else {
71
- const [{rate}] = (await method(args)).tickers;
72
-
73
- deepStrictEqual(rate, expected.rate, 'Got expected exchange rate');
74
- }
75
-
76
- return;
77
- });
78
- });