@ledgerhq/live-countervalues 0.1.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 (99) hide show
  1. package/.eslintrc.js +33 -0
  2. package/.turbo/turbo-build.log +4 -0
  3. package/.unimportedrc.json +4 -0
  4. package/CHANGELOG.md +1 -0
  5. package/LICENSE.txt +21 -0
  6. package/jest-global-setup.js +9 -0
  7. package/jest.config.js +14 -0
  8. package/lib/api/api.d.ts +4 -0
  9. package/lib/api/api.d.ts.map +1 -0
  10. package/lib/api/api.js +82 -0
  11. package/lib/api/api.js.map +1 -0
  12. package/lib/api/api.mock.d.ts +4 -0
  13. package/lib/api/api.mock.d.ts.map +1 -0
  14. package/lib/api/api.mock.js +103 -0
  15. package/lib/api/api.mock.js.map +1 -0
  16. package/lib/api/index.d.ts +4 -0
  17. package/lib/api/index.d.ts.map +1 -0
  18. package/lib/api/index.js +19 -0
  19. package/lib/api/index.js.map +1 -0
  20. package/lib/helpers.d.ts +31 -0
  21. package/lib/helpers.d.ts.map +1 -0
  22. package/lib/helpers.js +77 -0
  23. package/lib/helpers.js.map +1 -0
  24. package/lib/logic.d.ts +40 -0
  25. package/lib/logic.d.ts.map +1 -0
  26. package/lib/logic.integration.test.d.ts +2 -0
  27. package/lib/logic.integration.test.d.ts.map +1 -0
  28. package/lib/logic.integration.test.js +191 -0
  29. package/lib/logic.integration.test.js.map +1 -0
  30. package/lib/logic.js +422 -0
  31. package/lib/logic.js.map +1 -0
  32. package/lib/logic.test.d.ts +2 -0
  33. package/lib/logic.test.d.ts.map +1 -0
  34. package/lib/logic.test.js +29 -0
  35. package/lib/logic.test.js.map +1 -0
  36. package/lib/mock.d.ts +4 -0
  37. package/lib/mock.d.ts.map +1 -0
  38. package/lib/mock.js +10 -0
  39. package/lib/mock.js.map +1 -0
  40. package/lib/mock.test.d.ts +2 -0
  41. package/lib/mock.test.d.ts.map +1 -0
  42. package/lib/mock.test.js +210 -0
  43. package/lib/mock.test.js.map +1 -0
  44. package/lib/types.d.ts +47 -0
  45. package/lib/types.d.ts.map +1 -0
  46. package/lib/types.js +4 -0
  47. package/lib/types.js.map +1 -0
  48. package/lib-es/api/api.d.ts +4 -0
  49. package/lib-es/api/api.d.ts.map +1 -0
  50. package/lib-es/api/api.js +77 -0
  51. package/lib-es/api/api.js.map +1 -0
  52. package/lib-es/api/api.mock.d.ts +4 -0
  53. package/lib-es/api/api.mock.d.ts.map +1 -0
  54. package/lib-es/api/api.mock.js +98 -0
  55. package/lib-es/api/api.mock.js.map +1 -0
  56. package/lib-es/api/index.d.ts +4 -0
  57. package/lib-es/api/index.d.ts.map +1 -0
  58. package/lib-es/api/index.js +14 -0
  59. package/lib-es/api/index.js.map +1 -0
  60. package/lib-es/helpers.d.ts +31 -0
  61. package/lib-es/helpers.d.ts.map +1 -0
  62. package/lib-es/helpers.js +67 -0
  63. package/lib-es/helpers.js.map +1 -0
  64. package/lib-es/logic.d.ts +40 -0
  65. package/lib-es/logic.d.ts.map +1 -0
  66. package/lib-es/logic.integration.test.d.ts +2 -0
  67. package/lib-es/logic.integration.test.d.ts.map +1 -0
  68. package/lib-es/logic.integration.test.js +186 -0
  69. package/lib-es/logic.integration.test.js.map +1 -0
  70. package/lib-es/logic.js +406 -0
  71. package/lib-es/logic.js.map +1 -0
  72. package/lib-es/logic.test.d.ts +2 -0
  73. package/lib-es/logic.test.d.ts.map +1 -0
  74. package/lib-es/logic.test.js +27 -0
  75. package/lib-es/logic.test.js.map +1 -0
  76. package/lib-es/mock.d.ts +4 -0
  77. package/lib-es/mock.d.ts.map +1 -0
  78. package/lib-es/mock.js +6 -0
  79. package/lib-es/mock.js.map +1 -0
  80. package/lib-es/mock.test.d.ts +2 -0
  81. package/lib-es/mock.test.d.ts.map +1 -0
  82. package/lib-es/mock.test.js +205 -0
  83. package/lib-es/mock.test.js.map +1 -0
  84. package/lib-es/types.d.ts +47 -0
  85. package/lib-es/types.d.ts.map +1 -0
  86. package/lib-es/types.js +3 -0
  87. package/lib-es/types.js.map +1 -0
  88. package/package.json +81 -0
  89. package/src/api/api.mock.ts +117 -0
  90. package/src/api/api.ts +79 -0
  91. package/src/api/index.ts +19 -0
  92. package/src/helpers.ts +82 -0
  93. package/src/logic.integration.test.ts +209 -0
  94. package/src/logic.test.ts +30 -0
  95. package/src/logic.ts +533 -0
  96. package/src/mock.test.ts +231 -0
  97. package/src/mock.ts +8 -0
  98. package/src/types.ts +70 -0
  99. package/tsconfig.json +15 -0
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const logic_1 = require("./logic");
16
+ const index_1 = require("@ledgerhq/coin-framework/currencies/index");
17
+ const cryptoassets_1 = require("@ledgerhq/cryptoassets");
18
+ const mock_1 = require("./mock");
19
+ const prando_1 = __importDefault(require("prando"));
20
+ const api_1 = __importDefault(require("./api"));
21
+ const live_env_1 = require("@ledgerhq/live-env");
22
+ const value = "ll-ci/0.0.0";
23
+ (0, live_env_1.setEnv)("LEDGER_CLIENT_VERSION", value);
24
+ const ethereum = (0, cryptoassets_1.getCryptoCurrencyById)("ethereum");
25
+ const bitcoin = (0, cryptoassets_1.getCryptoCurrencyById)("bitcoin");
26
+ const usd = (0, cryptoassets_1.getFiatCurrencyByTicker)("USD");
27
+ const now = Date.now();
28
+ const DAY = 24 * 60 * 60 * 1000;
29
+ jest.setTimeout(60000);
30
+ describe("API sanity", () => {
31
+ test("recent days have rate for BTC USD", () => __awaiter(void 0, void 0, void 0, function* () {
32
+ const state = yield (0, logic_1.loadCountervalues)(logic_1.initialState, {
33
+ trackingPairs: [
34
+ {
35
+ from: bitcoin,
36
+ to: usd,
37
+ startDate: new Date(now - 200 * DAY),
38
+ },
39
+ ],
40
+ autofillGaps: false,
41
+ disableAutoRecoverErrors: true,
42
+ });
43
+ for (let i = 0; i < 7; i++) {
44
+ const value = (0, logic_1.calculate)(state, {
45
+ date: new Date(now - i * DAY),
46
+ disableRounding: true,
47
+ from: bitcoin,
48
+ to: usd,
49
+ value: 1000000,
50
+ });
51
+ expect(value).toBeDefined();
52
+ }
53
+ }));
54
+ test("recent days have different rates for BTC USD", () => __awaiter(void 0, void 0, void 0, function* () {
55
+ const state = yield (0, logic_1.loadCountervalues)(logic_1.initialState, {
56
+ trackingPairs: [
57
+ {
58
+ from: bitcoin,
59
+ to: usd,
60
+ startDate: new Date(now - 200 * DAY),
61
+ },
62
+ ],
63
+ autofillGaps: true,
64
+ disableAutoRecoverErrors: true,
65
+ });
66
+ const currentValue = (0, logic_1.calculate)(state, {
67
+ disableRounding: true,
68
+ from: bitcoin,
69
+ to: usd,
70
+ value: 1000000,
71
+ });
72
+ for (let i = 1; i < 7; i++) {
73
+ const value = (0, logic_1.calculate)(state, {
74
+ date: new Date(now - i * DAY),
75
+ disableRounding: true,
76
+ from: bitcoin,
77
+ to: usd,
78
+ value: 1000000,
79
+ });
80
+ expect(value).not.toEqual(currentValue);
81
+ }
82
+ }));
83
+ });
84
+ describe("extreme cases", () => {
85
+ const universe = Object.keys((0, mock_1.getBTCValues)())
86
+ .filter(t => t !== "USD")
87
+ .map(index_1.findCurrencyByTicker)
88
+ .filter(Boolean);
89
+ universe.sort((a, b) => a.ticker.localeCompare(b.ticker));
90
+ const prando = new prando_1.default("orderingrng");
91
+ const sampleCount = Math.min(120, universe.length);
92
+ const i = prando.nextInt(0, universe.length - sampleCount);
93
+ const currencies = universe.slice(i, i + sampleCount);
94
+ test("all tickers against USD", () => __awaiter(void 0, void 0, void 0, function* () {
95
+ const state = yield (0, logic_1.loadCountervalues)(logic_1.initialState, {
96
+ trackingPairs: currencies.map(from => ({
97
+ from,
98
+ to: usd,
99
+ startDate: new Date(),
100
+ })),
101
+ autofillGaps: true,
102
+ disableAutoRecoverErrors: true,
103
+ });
104
+ const currenciesWithCVs = currencies
105
+ .map(from => (0, logic_1.calculate)(state, {
106
+ date: new Date(),
107
+ from,
108
+ to: usd,
109
+ value: 1000000,
110
+ }))
111
+ .filter(v => v && v > 0);
112
+ expect(currenciesWithCVs.length).toBeGreaterThan(0);
113
+ }));
114
+ test("all tickers against BTC", () => __awaiter(void 0, void 0, void 0, function* () {
115
+ const state = yield (0, logic_1.loadCountervalues)(logic_1.initialState, {
116
+ trackingPairs: currencies.map(from => ({
117
+ from,
118
+ to: bitcoin,
119
+ startDate: new Date(),
120
+ })),
121
+ autofillGaps: true,
122
+ disableAutoRecoverErrors: true,
123
+ });
124
+ const currenciesWithCVs = currencies
125
+ .map(from => (0, logic_1.calculate)(state, {
126
+ date: new Date(),
127
+ from,
128
+ to: bitcoin,
129
+ value: 1000000,
130
+ }))
131
+ .filter(v => v && v > 0);
132
+ expect(currenciesWithCVs.length).toBeGreaterThan(0);
133
+ }));
134
+ });
135
+ describe("WETH rules", () => {
136
+ // this test is created to confirm the recent removal of weth/eth specific management is still functional in v3 context
137
+ test("ethereum WETH have countervalues", () => __awaiter(void 0, void 0, void 0, function* () {
138
+ const weth = (0, cryptoassets_1.getTokenById)("ethereum/erc20/weth");
139
+ const state = yield (0, logic_1.loadCountervalues)(logic_1.initialState, {
140
+ trackingPairs: [
141
+ {
142
+ from: weth,
143
+ to: usd,
144
+ startDate: new Date(now - 10 * DAY),
145
+ },
146
+ ],
147
+ autofillGaps: true,
148
+ disableAutoRecoverErrors: true,
149
+ });
150
+ const value = (0, logic_1.calculate)(state, {
151
+ disableRounding: true,
152
+ from: weth,
153
+ to: usd,
154
+ value: 1000000,
155
+ });
156
+ expect(value).toBeGreaterThan(0);
157
+ }));
158
+ });
159
+ test("fetchIdsSortedByMarketcap", () => __awaiter(void 0, void 0, void 0, function* () {
160
+ const ids = yield api_1.default.fetchIdsSortedByMarketcap();
161
+ expect(ids).toContain("bitcoin");
162
+ }));
163
+ test("export and import it back", () => __awaiter(void 0, void 0, void 0, function* () {
164
+ const settings = {
165
+ trackingPairs: [
166
+ {
167
+ from: bitcoin,
168
+ to: usd,
169
+ startDate: new Date(now - 10 * DAY),
170
+ },
171
+ {
172
+ from: ethereum,
173
+ to: usd,
174
+ startDate: new Date(now - 100 * DAY),
175
+ },
176
+ ],
177
+ autofillGaps: true,
178
+ disableAutoRecoverErrors: true,
179
+ };
180
+ const state = yield (0, logic_1.loadCountervalues)(logic_1.initialState, settings);
181
+ const exported = (0, logic_1.exportCountervalues)(state);
182
+ const imported = (0, logic_1.importCountervalues)(exported, settings);
183
+ expect(imported).toEqual(state);
184
+ }));
185
+ describe("API specific unit tests", () => {
186
+ test("fetchLatest with empty pairs", () => __awaiter(void 0, void 0, void 0, function* () {
187
+ const rates = yield api_1.default.fetchLatest([]);
188
+ expect(rates).toEqual([]);
189
+ }));
190
+ });
191
+ //# sourceMappingURL=logic.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logic.integration.test.js","sourceRoot":"","sources":["../src/logic.integration.test.ts"],"names":[],"mappings":"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"}
package/lib/logic.js ADDED
@@ -0,0 +1,422 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __rest = (this && this.__rest) || function (s, e) {
12
+ var t = {};
13
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
14
+ t[p] = s[p];
15
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
16
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
17
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
18
+ t[p[i]] = s[p[i]];
19
+ }
20
+ return t;
21
+ };
22
+ var __importDefault = (this && this.__importDefault) || function (mod) {
23
+ return (mod && mod.__esModule) ? mod : { "default": mod };
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.resolveTrackingPairs = exports.calculateMany = exports.calculate = exports.lenseRate = exports.lenseRateMap = exports.loadCountervalues = exports.initialState = exports.trackingPairIds = exports.inferTrackingPairForAccounts = exports.importCountervalues = exports.exportCountervalues = void 0;
27
+ const logs_1 = require("@ledgerhq/logs");
28
+ const helpers_1 = require("@ledgerhq/coin-framework/account/helpers");
29
+ const live_promise_1 = require("@ledgerhq/live-promise");
30
+ const helpers_2 = require("./helpers");
31
+ const api_1 = __importDefault(require("./api"));
32
+ // yield raw version of the countervalues state to be saved in a db
33
+ function exportCountervalues({ data, status }) {
34
+ const out = { status };
35
+ for (const path in data) {
36
+ const obj = {};
37
+ for (const [k, v] of data[path]) {
38
+ obj[k] = v;
39
+ }
40
+ out[path] = obj;
41
+ }
42
+ return out;
43
+ }
44
+ exports.exportCountervalues = exportCountervalues;
45
+ // restore a countervalues state from the raw version
46
+ function importCountervalues(_a, settings) {
47
+ var { status } = _a, rest = __rest(_a, ["status"]);
48
+ const data = {};
49
+ for (const path in rest) {
50
+ const obj = rest[path];
51
+ const map = new Map();
52
+ for (const k in obj) {
53
+ map.set(k, obj[k]);
54
+ }
55
+ data[path] = map;
56
+ }
57
+ return {
58
+ data,
59
+ status,
60
+ cache: Object.entries(data).reduce((prev, [key, val]) => (Object.assign(Object.assign({}, prev), {
61
+ // $FlowFixMe
62
+ [key]: generateCache(key, val, settings) })), {}),
63
+ };
64
+ }
65
+ exports.importCountervalues = importCountervalues;
66
+ // infer the tracking pair from user accounts to know which pairs are concerned
67
+ function inferTrackingPairForAccounts(accounts, countervalue) {
68
+ const yearAgo = new Date();
69
+ yearAgo.setFullYear(yearAgo.getFullYear() - 1);
70
+ yearAgo.setHours(0, 0, 0, 0);
71
+ return resolveTrackingPairs((0, helpers_1.flattenAccounts)(accounts)
72
+ .filter(a => !(0, helpers_1.isAccountEmpty)(a))
73
+ .map(account => {
74
+ const currency = (0, helpers_1.getAccountCurrency)(account);
75
+ return {
76
+ from: currency,
77
+ to: countervalue,
78
+ startDate: account.creationDate < yearAgo ? account.creationDate : yearAgo,
79
+ };
80
+ }));
81
+ }
82
+ exports.inferTrackingPairForAccounts = inferTrackingPairForAccounts;
83
+ /**
84
+ * yield the ids of the tracking pairs as stored in the database
85
+ */
86
+ function trackingPairIds(trackingPairs) {
87
+ return trackingPairs.map(helpers_2.pairId);
88
+ }
89
+ exports.trackingPairIds = trackingPairIds;
90
+ exports.initialState = {
91
+ data: {},
92
+ status: {},
93
+ cache: {},
94
+ };
95
+ const MAX_RETRY_DELAY = 7 * helpers_2.incrementPerGranularity.daily;
96
+ // synchronize all countervalues incrementally (async update of the countervalues state)
97
+ function loadCountervalues(state, settings) {
98
+ return __awaiter(this, void 0, void 0, function* () {
99
+ const data = Object.assign({}, state.data);
100
+ const cache = Object.assign({}, state.cache);
101
+ const status = Object.assign({}, state.status);
102
+ const nowDate = new Date();
103
+ const latestToFetch = settings.trackingPairs;
104
+ // determines what historical data need to be fetched
105
+ const histoToFetch = [];
106
+ const rateGranularities = ["daily", "hourly"];
107
+ rateGranularities.forEach((granularity) => {
108
+ const format = helpers_2.formatPerGranularity[granularity];
109
+ const earliestHisto = format(nowDate);
110
+ (0, logs_1.log)("countervalues", "earliestHisto=" + earliestHisto);
111
+ const limit = helpers_2.datapointLimits[granularity];
112
+ settings.trackingPairs.forEach(({ from, to, startDate }) => {
113
+ const key = (0, helpers_2.pairId)({
114
+ from,
115
+ to,
116
+ });
117
+ const c = cache[key];
118
+ const stats = c === null || c === void 0 ? void 0 : c.stats;
119
+ const s = status[key];
120
+ // when there are too much http failures, slow down the rate to be actually re-fetched
121
+ if ((s === null || s === void 0 ? void 0 : s.failures) && s.timestamp) {
122
+ const { failures, timestamp } = s;
123
+ const secondsBetweenRetries = Math.min(Math.exp(failures * 0.5), MAX_RETRY_DELAY);
124
+ const nextTarget = timestamp + 1000 * secondsBetweenRetries;
125
+ if (nowDate.valueOf() < nextTarget) {
126
+ (0, logs_1.log)("countervalues", `${key}@${granularity} discarded: too much HTTP failures (${failures}) retry in ~${Math.round((nextTarget - nowDate.valueOf()) / 1000)}s`);
127
+ return;
128
+ }
129
+ }
130
+ let start = startDate;
131
+ const limitDate = Date.now() - limit;
132
+ if (limitDate && start.valueOf() < limitDate) {
133
+ start = new Date(limitDate);
134
+ }
135
+ const needOlderReload = s && s.oldestDateRequested && start < new Date(s.oldestDateRequested);
136
+ if (needOlderReload) {
137
+ (0, logs_1.log)("countervalues", `${key}@${granularity} need older reload (${start.toISOString()} < ${String(s && s.oldestDateRequested)})`);
138
+ }
139
+ if (!needOlderReload) {
140
+ // we do not miss datapoints in the past so we can ask the only remaining part
141
+ if (stats && stats.earliestStableDate && stats.earliestStableDate > start) {
142
+ start = stats.earliestStableDate;
143
+ }
144
+ }
145
+ // nothing to fetch for historical
146
+ if (format(start) === earliestHisto)
147
+ return;
148
+ histoToFetch.push([
149
+ granularity,
150
+ {
151
+ from,
152
+ to,
153
+ startDate: start,
154
+ },
155
+ key,
156
+ ]);
157
+ });
158
+ });
159
+ (0, logs_1.log)("countervalues", `${histoToFetch.length} historical value to fetch (${settings.trackingPairs.length} pairs)`);
160
+ // Fetch it all
161
+ const [histo, latest] = yield Promise.all([
162
+ (0, live_promise_1.promiseAllBatched)(10, histoToFetch, ([granularity, pair, key]) => api_1.default
163
+ .fetchHistorical(granularity, pair)
164
+ .then(rates => {
165
+ var _a;
166
+ // Update status infos
167
+ const id = (0, helpers_2.pairId)(pair);
168
+ let oldestDateRequested = (_a = status[id]) === null || _a === void 0 ? void 0 : _a.oldestDateRequested;
169
+ if (!oldestDateRequested || pair.startDate < new Date(oldestDateRequested)) {
170
+ oldestDateRequested = pair.startDate.toISOString();
171
+ }
172
+ status[id] = {
173
+ timestamp: Date.now(),
174
+ oldestDateRequested,
175
+ };
176
+ return {
177
+ [key]: rates,
178
+ };
179
+ })
180
+ .catch(e => {
181
+ if (settings.disableAutoRecoverErrors)
182
+ throw e;
183
+ // TODO work on the semantic of failure.
184
+ // do we want to opt-in for the 404 cases and make other fails it all?
185
+ // do we want to be resilient on individual pulling / keep error somewhere?
186
+ const id = (0, helpers_2.pairId)(pair);
187
+ // only on HTTP error, we count the failures (not network down case)
188
+ if (e && typeof e.status === "number" && e.status) {
189
+ const s = status[id];
190
+ status[id] = {
191
+ timestamp: Date.now(),
192
+ failures: ((s === null || s === void 0 ? void 0 : s.failures) || 0) + 1,
193
+ oldestDateRequested: s === null || s === void 0 ? void 0 : s.oldestDateRequested,
194
+ };
195
+ }
196
+ (0, logs_1.log)("countervalues-error", `Failed to fetch ${granularity} history for ${pair.from.ticker}-${pair.to.ticker} ${String(e)}`);
197
+ return null;
198
+ })),
199
+ api_1.default
200
+ .fetchLatest(latestToFetch)
201
+ .then(rates => {
202
+ const out = {};
203
+ let hasData = false;
204
+ latestToFetch.forEach((pair, i) => {
205
+ var _a;
206
+ const key = (0, helpers_2.pairId)(pair);
207
+ const latest = rates[i];
208
+ if (((_a = data[key]) === null || _a === void 0 ? void 0 : _a.get("latest")) === latest)
209
+ return;
210
+ out[key] = {
211
+ latest: rates[i],
212
+ };
213
+ hasData = true;
214
+ });
215
+ if (!hasData)
216
+ return null;
217
+ return out;
218
+ })
219
+ .catch(e => {
220
+ if (settings.disableAutoRecoverErrors)
221
+ throw e;
222
+ (0, logs_1.log)("countervalues-error", "Failed to fetch latest for " +
223
+ latestToFetch.map(p => `${p.from.ticker}-${p.to.ticker}`).join(",") +
224
+ " " +
225
+ String(e));
226
+ return null;
227
+ }),
228
+ ]);
229
+ const updates = [];
230
+ for (const patch of histo) {
231
+ if (patch) {
232
+ updates.push(patch);
233
+ }
234
+ }
235
+ if (latest) {
236
+ updates.push(latest);
237
+ }
238
+ (0, logs_1.log)("countervalues", updates.length + " updates to apply");
239
+ const changesKeys = {};
240
+ updates.forEach(patch => {
241
+ Object.keys(patch).forEach(key => {
242
+ changesKeys[key] = 1;
243
+ if (!data[key]) {
244
+ data[key] = new Map();
245
+ }
246
+ Object.entries(patch[key]).forEach(([k, v]) => {
247
+ if (typeof v === "number")
248
+ data[key].set(k, v);
249
+ });
250
+ });
251
+ });
252
+ // synchronize the cache
253
+ Object.keys(changesKeys).forEach(pair => {
254
+ cache[pair] = generateCache(pair, data[pair], settings);
255
+ });
256
+ return {
257
+ data,
258
+ cache,
259
+ status,
260
+ };
261
+ });
262
+ }
263
+ exports.loadCountervalues = loadCountervalues;
264
+ function lenseRateMap(state, pair) {
265
+ const rateId = (0, helpers_2.pairId)(pair);
266
+ return state.cache[rateId];
267
+ }
268
+ exports.lenseRateMap = lenseRateMap;
269
+ function lenseRate({ stats, fallback, map }, query) {
270
+ const { date } = query;
271
+ if (!date)
272
+ return map.get("latest");
273
+ const { iso, hour, day } = (0, helpers_2.formatCounterValueHashes)(date);
274
+ if (stats.earliest && iso > stats.earliest)
275
+ return map.get("latest");
276
+ return map.get(hour) || map.get(day) || fallback;
277
+ }
278
+ exports.lenseRate = lenseRate;
279
+ function calculate(state, initialQuery) {
280
+ const { from, to } = initialQuery;
281
+ if (from === to)
282
+ return initialQuery.value;
283
+ const { date, value, disableRounding, reverse } = initialQuery;
284
+ const query = {
285
+ date,
286
+ from,
287
+ to,
288
+ };
289
+ const map = lenseRateMap(state, query);
290
+ if (!map)
291
+ return;
292
+ let rate = lenseRate(map, query);
293
+ if (!rate)
294
+ return;
295
+ const mult = reverse
296
+ ? (0, helpers_2.magFromTo)(initialQuery.to, initialQuery.from)
297
+ : (0, helpers_2.magFromTo)(initialQuery.from, initialQuery.to);
298
+ if (reverse && rate) {
299
+ rate = 1 / rate;
300
+ }
301
+ const val = rate ? value * rate * mult : 0;
302
+ return disableRounding ? val : Math.round(val);
303
+ }
304
+ exports.calculate = calculate;
305
+ function calculateMany(state, dataPoints, initialQuery) {
306
+ const { reverse, disableRounding } = initialQuery;
307
+ const { from, to } = initialQuery;
308
+ if (from === to)
309
+ return dataPoints.map(d => d.value);
310
+ const map = lenseRateMap(state, initialQuery);
311
+ if (!map)
312
+ return Array(dataPoints.length).fill(undefined); // undefined array
313
+ const mult = reverse
314
+ ? (0, helpers_2.magFromTo)(initialQuery.to, initialQuery.from)
315
+ : (0, helpers_2.magFromTo)(initialQuery.from, initialQuery.to);
316
+ return dataPoints.map(({ value, date }) => {
317
+ if (from === to)
318
+ return value;
319
+ let rate = lenseRate(map, {
320
+ from,
321
+ to,
322
+ date,
323
+ });
324
+ if (!rate)
325
+ return;
326
+ if (reverse && rate) {
327
+ rate = 1 / rate;
328
+ }
329
+ const val = rate ? value * rate * mult : 0;
330
+ return disableRounding ? val : Math.round(val);
331
+ });
332
+ }
333
+ exports.calculateMany = calculateMany;
334
+ function generateCache(pair, rateMap, settings) {
335
+ const map = new Map(rateMap);
336
+ const sorted = Array.from(map.keys())
337
+ .sort()
338
+ .filter(k => k !== "latest");
339
+ const oldest = sorted[0];
340
+ const earliest = sorted[sorted.length - 1];
341
+ const oldestDate = oldest ? (0, helpers_2.parseFormattedDate)(oldest) : null;
342
+ const earliestDate = earliest ? (0, helpers_2.parseFormattedDate)(earliest) : null;
343
+ let earliestStableDate = earliestDate;
344
+ let fallback = 0;
345
+ let hasHole = false;
346
+ if (oldestDate && oldest) {
347
+ // we find the most recent stable day and we set it in earliestStableDate
348
+ // if autofillGaps is on, shifting daily gaps (hourly don't need to be shifted as it automatically fallback on a day rate)
349
+ const now = Date.now();
350
+ const oldestTime = oldestDate.getTime();
351
+ let shiftingValue = map.get(oldest) || 0;
352
+ if (settings.autofillGaps) {
353
+ fallback = shiftingValue;
354
+ }
355
+ for (let t = oldestTime; t < now; t += helpers_2.incrementPerGranularity.daily) {
356
+ const d = new Date(t);
357
+ const k = (0, helpers_2.formatCounterValueDay)(d);
358
+ if (!map.has(k)) {
359
+ if (!hasHole) {
360
+ hasHole = true;
361
+ earliestStableDate = d;
362
+ }
363
+ if (settings.autofillGaps) {
364
+ map.set(k, shiftingValue);
365
+ }
366
+ }
367
+ else {
368
+ if (settings.autofillGaps) {
369
+ shiftingValue = map.get(k) || 0;
370
+ }
371
+ }
372
+ }
373
+ if (!map.get("latest") && settings.autofillGaps) {
374
+ map.set("latest", shiftingValue);
375
+ }
376
+ }
377
+ else {
378
+ if (settings.autofillGaps) {
379
+ fallback = map.get("latest") || 0;
380
+ }
381
+ }
382
+ const stats = {
383
+ oldest,
384
+ earliest,
385
+ oldestDate,
386
+ earliestDate,
387
+ earliestStableDate,
388
+ };
389
+ return {
390
+ map,
391
+ stats,
392
+ fallback,
393
+ };
394
+ }
395
+ function resolveTrackingPairs(pairs) {
396
+ const trackingPairs = {};
397
+ for (const pair of pairs) {
398
+ const { from, to } = pair;
399
+ if (from === to)
400
+ continue;
401
+ // dedup and keep oldest date
402
+ let date = pair.startDate;
403
+ const id = (0, helpers_2.pairId)(pair);
404
+ if (trackingPairs[id]) {
405
+ const { startDate } = trackingPairs[id];
406
+ if (date) {
407
+ date = date < startDate ? date : startDate;
408
+ }
409
+ }
410
+ trackingPairs[id] = {
411
+ from,
412
+ to,
413
+ startDate: date,
414
+ };
415
+ }
416
+ // to reach more deterministic order, notably in API calls, we sort by from/to
417
+ return Object.keys(trackingPairs)
418
+ .sort()
419
+ .map(id => trackingPairs[id]);
420
+ }
421
+ exports.resolveTrackingPairs = resolveTrackingPairs;
422
+ //# sourceMappingURL=logic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logic.js","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=logic.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logic.test.d.ts","sourceRoot":"","sources":["../src/logic.test.ts"],"names":[],"mappings":""}