@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.
- package/.eslintrc.js +33 -0
- package/.turbo/turbo-build.log +4 -0
- package/.unimportedrc.json +4 -0
- package/CHANGELOG.md +1 -0
- package/LICENSE.txt +21 -0
- package/jest-global-setup.js +9 -0
- package/jest.config.js +14 -0
- package/lib/api/api.d.ts +4 -0
- package/lib/api/api.d.ts.map +1 -0
- package/lib/api/api.js +82 -0
- package/lib/api/api.js.map +1 -0
- package/lib/api/api.mock.d.ts +4 -0
- package/lib/api/api.mock.d.ts.map +1 -0
- package/lib/api/api.mock.js +103 -0
- package/lib/api/api.mock.js.map +1 -0
- package/lib/api/index.d.ts +4 -0
- package/lib/api/index.d.ts.map +1 -0
- package/lib/api/index.js +19 -0
- package/lib/api/index.js.map +1 -0
- package/lib/helpers.d.ts +31 -0
- package/lib/helpers.d.ts.map +1 -0
- package/lib/helpers.js +77 -0
- package/lib/helpers.js.map +1 -0
- package/lib/logic.d.ts +40 -0
- package/lib/logic.d.ts.map +1 -0
- package/lib/logic.integration.test.d.ts +2 -0
- package/lib/logic.integration.test.d.ts.map +1 -0
- package/lib/logic.integration.test.js +191 -0
- package/lib/logic.integration.test.js.map +1 -0
- package/lib/logic.js +422 -0
- package/lib/logic.js.map +1 -0
- package/lib/logic.test.d.ts +2 -0
- package/lib/logic.test.d.ts.map +1 -0
- package/lib/logic.test.js +29 -0
- package/lib/logic.test.js.map +1 -0
- package/lib/mock.d.ts +4 -0
- package/lib/mock.d.ts.map +1 -0
- package/lib/mock.js +10 -0
- package/lib/mock.js.map +1 -0
- package/lib/mock.test.d.ts +2 -0
- package/lib/mock.test.d.ts.map +1 -0
- package/lib/mock.test.js +210 -0
- package/lib/mock.test.js.map +1 -0
- package/lib/types.d.ts +47 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +4 -0
- package/lib/types.js.map +1 -0
- package/lib-es/api/api.d.ts +4 -0
- package/lib-es/api/api.d.ts.map +1 -0
- package/lib-es/api/api.js +77 -0
- package/lib-es/api/api.js.map +1 -0
- package/lib-es/api/api.mock.d.ts +4 -0
- package/lib-es/api/api.mock.d.ts.map +1 -0
- package/lib-es/api/api.mock.js +98 -0
- package/lib-es/api/api.mock.js.map +1 -0
- package/lib-es/api/index.d.ts +4 -0
- package/lib-es/api/index.d.ts.map +1 -0
- package/lib-es/api/index.js +14 -0
- package/lib-es/api/index.js.map +1 -0
- package/lib-es/helpers.d.ts +31 -0
- package/lib-es/helpers.d.ts.map +1 -0
- package/lib-es/helpers.js +67 -0
- package/lib-es/helpers.js.map +1 -0
- package/lib-es/logic.d.ts +40 -0
- package/lib-es/logic.d.ts.map +1 -0
- package/lib-es/logic.integration.test.d.ts +2 -0
- package/lib-es/logic.integration.test.d.ts.map +1 -0
- package/lib-es/logic.integration.test.js +186 -0
- package/lib-es/logic.integration.test.js.map +1 -0
- package/lib-es/logic.js +406 -0
- package/lib-es/logic.js.map +1 -0
- package/lib-es/logic.test.d.ts +2 -0
- package/lib-es/logic.test.d.ts.map +1 -0
- package/lib-es/logic.test.js +27 -0
- package/lib-es/logic.test.js.map +1 -0
- package/lib-es/mock.d.ts +4 -0
- package/lib-es/mock.d.ts.map +1 -0
- package/lib-es/mock.js +6 -0
- package/lib-es/mock.js.map +1 -0
- package/lib-es/mock.test.d.ts +2 -0
- package/lib-es/mock.test.d.ts.map +1 -0
- package/lib-es/mock.test.js +205 -0
- package/lib-es/mock.test.js.map +1 -0
- package/lib-es/types.d.ts +47 -0
- package/lib-es/types.d.ts.map +1 -0
- package/lib-es/types.js +3 -0
- package/lib-es/types.js.map +1 -0
- package/package.json +81 -0
- package/src/api/api.mock.ts +117 -0
- package/src/api/api.ts +79 -0
- package/src/api/index.ts +19 -0
- package/src/helpers.ts +82 -0
- package/src/logic.integration.test.ts +209 -0
- package/src/logic.test.ts +30 -0
- package/src/logic.ts +533 -0
- package/src/mock.test.ts +231 -0
- package/src/mock.ts +8 -0
- package/src/types.ts +70 -0
- package/tsconfig.json +15 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import network from "@ledgerhq/live-network/network";
|
|
11
|
+
import URL from "url";
|
|
12
|
+
import { getEnv } from "@ledgerhq/live-env";
|
|
13
|
+
import { promiseAllBatched } from "@ledgerhq/live-promise";
|
|
14
|
+
import { formatPerGranularity, inferCurrencyAPIID } from "../helpers";
|
|
15
|
+
const baseURL = () => getEnv("LEDGER_COUNTERVALUES_API");
|
|
16
|
+
const LATEST_CHUNK = 50;
|
|
17
|
+
const api = {
|
|
18
|
+
fetchHistorical: (granularity, { from, to, startDate }) => __awaiter(void 0, void 0, void 0, function* () {
|
|
19
|
+
const format = formatPerGranularity[granularity];
|
|
20
|
+
const url = URL.format({
|
|
21
|
+
pathname: `${baseURL()}/v3/historical/${granularity}/simple`,
|
|
22
|
+
query: {
|
|
23
|
+
from: inferCurrencyAPIID(from),
|
|
24
|
+
to: inferCurrencyAPIID(to),
|
|
25
|
+
start: format(startDate),
|
|
26
|
+
end: format(new Date()),
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
const { data } = yield network({ method: "GET", url });
|
|
30
|
+
return data;
|
|
31
|
+
}),
|
|
32
|
+
fetchLatest: (pairs) => __awaiter(void 0, void 0, void 0, function* () {
|
|
33
|
+
if (pairs.length === 0)
|
|
34
|
+
return [];
|
|
35
|
+
// we group the pairs into chunks (of max LATEST_CHUNK) of the same "to" currency
|
|
36
|
+
// the batches preserve the ordering of "pairs" so the output returns the result in same orders
|
|
37
|
+
// we essentially assume that pairs' to's field are not changing / are sorted
|
|
38
|
+
const batches = []; // array of [froms, to]
|
|
39
|
+
const first = pairs[0];
|
|
40
|
+
let batch = [[first.from], first.to];
|
|
41
|
+
for (let i = 1; i < pairs.length; i++) {
|
|
42
|
+
const pair = pairs[i];
|
|
43
|
+
if (pair.to !== batch[1] || batch[0].length >= LATEST_CHUNK) {
|
|
44
|
+
batches.push(batch);
|
|
45
|
+
batch = [[pair.from], pair.to];
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
batch[0].push(pair.from);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
batches.push(batch);
|
|
52
|
+
const all = yield promiseAllBatched(4, batches, ([froms, to]) => __awaiter(void 0, void 0, void 0, function* () {
|
|
53
|
+
const fromIds = froms.map(inferCurrencyAPIID);
|
|
54
|
+
const url = URL.format({
|
|
55
|
+
pathname: `${baseURL()}/v3/spot/simple`,
|
|
56
|
+
query: {
|
|
57
|
+
to: inferCurrencyAPIID(to),
|
|
58
|
+
froms: fromIds.join(","),
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
const { data } = yield network({ method: "GET", url });
|
|
62
|
+
// backend returns an object with keys being the froms
|
|
63
|
+
return fromIds.map(id => data[id] || 0);
|
|
64
|
+
}));
|
|
65
|
+
const data = all.flat();
|
|
66
|
+
return data;
|
|
67
|
+
}),
|
|
68
|
+
fetchIdsSortedByMarketcap: () => __awaiter(void 0, void 0, void 0, function* () {
|
|
69
|
+
const { data } = yield network({
|
|
70
|
+
method: "GET",
|
|
71
|
+
url: `${baseURL()}/v3/currencies/supported`,
|
|
72
|
+
});
|
|
73
|
+
return data;
|
|
74
|
+
}),
|
|
75
|
+
};
|
|
76
|
+
export default api;
|
|
77
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/api/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.mock.d.ts","sourceRoot":"","sources":["../../src/api/api.mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAmB,MAAM,UAAU,CAAC;AAqGlE,QAAA,MAAM,GAAG,EAAE,gBAcV,CAAC;AACF,eAAe,GAAG,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { getEnv } from "@ledgerhq/live-env";
|
|
2
|
+
import { getBTCValues, BTCtoUSD, referenceSnapshotDate } from "../mock";
|
|
3
|
+
import { formatPerGranularity } from "../helpers";
|
|
4
|
+
import Prando from "prando";
|
|
5
|
+
import { findCurrencyByTicker } from "@ledgerhq/coin-framework/currencies/index";
|
|
6
|
+
const DAY = 24 * 60 * 60 * 1000;
|
|
7
|
+
function btcTrend(t) {
|
|
8
|
+
const daysSinceGenesis = (t - 1230937200000) / DAY;
|
|
9
|
+
return Math.pow(daysSinceGenesis / 693, 5.526);
|
|
10
|
+
}
|
|
11
|
+
const randomCache = {};
|
|
12
|
+
function fromToRandom(id) {
|
|
13
|
+
if (randomCache[id])
|
|
14
|
+
return randomCache[id];
|
|
15
|
+
return (randomCache[id] = new Prando(getEnv("MOCK") + id).next());
|
|
16
|
+
}
|
|
17
|
+
function temporalFactor(from, to, maybeDate) {
|
|
18
|
+
const t = (maybeDate || new Date()).getTime();
|
|
19
|
+
const r = fromToRandom(from); // make it varies between rates...
|
|
20
|
+
const wave1 = Math.cos(r * 0.5 + t / (200 * DAY * (0.5 + 0.5 * r)));
|
|
21
|
+
// long term wave
|
|
22
|
+
const wave2 = Math.sin(r + t / (30 * DAY)); // short term wave
|
|
23
|
+
const wave3 = // random market perturbation
|
|
24
|
+
Math.max(0, Math.sin(t / (66 * DAY))) *
|
|
25
|
+
Math.cos(wave2 + Math.cos(r) + t / (3 * DAY * (1 - 0.1 * r)));
|
|
26
|
+
// This is essentially randomness!
|
|
27
|
+
if (maybeDate && Math.cos(7 * r + t * 0.1) > 0.9 + 0.1 * r) {
|
|
28
|
+
return 0; // intentionally set a GAP into the data
|
|
29
|
+
}
|
|
30
|
+
const res = (0.2 - 0.2 * r * r) * wave1 +
|
|
31
|
+
(0.1 + 0.05 * Math.sin(r)) * wave2 +
|
|
32
|
+
0.05 * wave3 +
|
|
33
|
+
btcTrend(t) / btcTrend(referenceSnapshotDate.getTime());
|
|
34
|
+
return Math.max(0, res);
|
|
35
|
+
}
|
|
36
|
+
function rate(from, to, date) {
|
|
37
|
+
const asBTC = getBTCValues()[from];
|
|
38
|
+
if (!asBTC)
|
|
39
|
+
return;
|
|
40
|
+
if (to === "BTC") {
|
|
41
|
+
return asBTC * temporalFactor(from, to, date);
|
|
42
|
+
}
|
|
43
|
+
if (to === "USD") {
|
|
44
|
+
return asBTC * BTCtoUSD * temporalFactor(from, to, date);
|
|
45
|
+
}
|
|
46
|
+
if (from === "BTC") {
|
|
47
|
+
const r = rate(to, from, date);
|
|
48
|
+
if (!r)
|
|
49
|
+
return;
|
|
50
|
+
return 1 / r;
|
|
51
|
+
}
|
|
52
|
+
const btcTO = rate("BTC", to, date);
|
|
53
|
+
if (btcTO) {
|
|
54
|
+
return asBTC * btcTO * temporalFactor(from, to, date);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const increment = {
|
|
58
|
+
daily: DAY,
|
|
59
|
+
hourly: 60 * 60 * 1000,
|
|
60
|
+
};
|
|
61
|
+
function getIds() {
|
|
62
|
+
const ids = [];
|
|
63
|
+
for (const k in getBTCValues()) {
|
|
64
|
+
const c = findCurrencyByTicker(k);
|
|
65
|
+
if (c && (c.type == "CryptoCurrency" || c.type == "TokenCurrency")) {
|
|
66
|
+
ids.push(c.id);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return ids;
|
|
70
|
+
}
|
|
71
|
+
function getDates(granularity, start) {
|
|
72
|
+
const array = [];
|
|
73
|
+
const f = formatPerGranularity[granularity];
|
|
74
|
+
const incr = increment[granularity];
|
|
75
|
+
const initial = new Date(f(start || new Date())).getTime();
|
|
76
|
+
const now = Date.now();
|
|
77
|
+
for (let t = initial; t < now; t += incr) {
|
|
78
|
+
array.push(new Date(t));
|
|
79
|
+
}
|
|
80
|
+
return array;
|
|
81
|
+
}
|
|
82
|
+
const api = {
|
|
83
|
+
fetchHistorical: (granularity, { from, to, startDate }) => {
|
|
84
|
+
const r = {};
|
|
85
|
+
const f = formatPerGranularity[granularity];
|
|
86
|
+
getDates(granularity, startDate).forEach(date => {
|
|
87
|
+
const v = rate(from.ticker, to.ticker, date);
|
|
88
|
+
if (v) {
|
|
89
|
+
r[f(date)] = v;
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
return Promise.resolve(r);
|
|
93
|
+
},
|
|
94
|
+
fetchLatest: pairs => Promise.resolve(pairs.map(({ from, to }) => rate(from.ticker, to.ticker))),
|
|
95
|
+
fetchIdsSortedByMarketcap: () => Promise.resolve(getIds()),
|
|
96
|
+
};
|
|
97
|
+
export default api;
|
|
98
|
+
//# sourceMappingURL=api.mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.mock.js","sourceRoot":"","sources":["../../src/api/api.mock.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEhC,SAAS,QAAQ,CAAC,CAAS;IACzB,MAAM,gBAAgB,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC;IACnD,OAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,WAAW,GAA2B,EAAE,CAAC;AAE/C,SAAS,YAAY,CAAC,EAAU;IAC9B,IAAI,WAAW,CAAC,EAAE,CAAC;QAAE,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,EAAU,EAAE,SAA2B;IAC3E,MAAM,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9C,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,kCAAkC;IAEhE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,iBAAiB;IACjB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB;IAE9D,MAAM,KAAK,GAAG,6BAA6B;KACzC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhE,kCAAkC;IAClC,IAAI,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE;QAC1D,OAAO,CAAC,CAAC,CAAC,wCAAwC;KACnD;IAED,MAAM,GAAG,GACP,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK;QAC3B,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK;QAClC,IAAI,GAAG,KAAK;QACZ,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,IAAI,CAAC,IAAY,EAAE,EAAU,EAAE,IAAW;IACjD,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnB,IAAI,EAAE,KAAK,KAAK,EAAE;QAChB,OAAO,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;KAC/C;IAED,IAAI,EAAE,KAAK,KAAK,EAAE;QAChB,OAAO,KAAK,GAAG,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;KAC1D;IAED,IAAI,IAAI,KAAK,KAAK,EAAE;QAClB,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,OAAO,CAAC,GAAG,CAAC,CAAC;KACd;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAEpC,IAAI,KAAK,EAAE;QACT,OAAO,KAAK,GAAG,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;KACvD;AACH,CAAC;AAED,MAAM,SAAS,GAAG;IAChB,KAAK,EAAE,GAAG;IACV,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;CACvB,CAAC;AAEF,SAAS,MAAM;IACb,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,EAAE;QAC9B,MAAM,CAAC,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,gBAAgB,IAAI,CAAC,CAAC,IAAI,IAAI,eAAe,CAAC,EAAE;YAClE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAChB;KACF;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,QAAQ,CAAC,WAA4B,EAAE,KAAW;IACzD,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,CAAC,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,KAAK,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE;QACxC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;KACzB;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,GAAG,GAAqB;IAC5B,eAAe,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACxD,MAAM,CAAC,GAA2B,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAC5C,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC7C,IAAI,CAAC,EAAE;gBACL,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;aAChB;QACH,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAChG,yBAAyB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;CAC3D,CAAC;AACF,eAAe,GAAG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAIjD,QAAA,MAAM,GAAG,EAAE,gBAWV,CAAC;AAEF,eAAe,GAAG,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { getEnv } from "@ledgerhq/live-env";
|
|
2
|
+
import prodAPI from "./api";
|
|
3
|
+
import mockAPI from "./api.mock";
|
|
4
|
+
const api = {
|
|
5
|
+
fetchHistorical: (granularity, pair) => getEnv("MOCK_COUNTERVALUES")
|
|
6
|
+
? mockAPI.fetchHistorical(granularity, pair)
|
|
7
|
+
: prodAPI.fetchHistorical(granularity, pair),
|
|
8
|
+
fetchLatest: pairs => getEnv("MOCK_COUNTERVALUES") ? mockAPI.fetchLatest(pairs) : prodAPI.fetchLatest(pairs),
|
|
9
|
+
fetchIdsSortedByMarketcap: () => getEnv("MOCK_COUNTERVALUES")
|
|
10
|
+
? mockAPI.fetchIdsSortedByMarketcap()
|
|
11
|
+
: prodAPI.fetchIdsSortedByMarketcap(),
|
|
12
|
+
};
|
|
13
|
+
export default api;
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,OAAO,MAAM,OAAO,CAAC;AAC5B,OAAO,OAAO,MAAM,YAAY,CAAC;AAEjC,MAAM,GAAG,GAAqB;IAC5B,eAAe,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CACrC,MAAM,CAAC,oBAAoB,CAAC;QAC1B,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC;QAC5C,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC;IAChD,WAAW,EAAE,KAAK,CAAC,EAAE,CACnB,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC;IACxF,yBAAyB,EAAE,GAAG,EAAE,CAC9B,MAAM,CAAC,oBAAoB,CAAC;QAC1B,CAAC,CAAC,OAAO,CAAC,yBAAyB,EAAE;QACrC,CAAC,CAAC,OAAO,CAAC,yBAAyB,EAAE;CAC1C,CAAC;AAEF,eAAe,GAAG,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Currency } from "@ledgerhq/types-cryptoassets";
|
|
2
|
+
import type { RateGranularity } from "./types";
|
|
3
|
+
export declare const inferCurrencyAPIID: (currency: Currency) => string;
|
|
4
|
+
export declare const incrementPerGranularity: Record<RateGranularity, number>;
|
|
5
|
+
export declare const datapointLimits: Record<RateGranularity, number>;
|
|
6
|
+
/**
|
|
7
|
+
* efficient implementation of YYYY-MM-DD formatter
|
|
8
|
+
* @memberof countervalue
|
|
9
|
+
*/
|
|
10
|
+
export declare const formatCounterValueDay: (d: Date) => string;
|
|
11
|
+
/**
|
|
12
|
+
* efficient implementation of YYYY-MM-DDTHH formatter
|
|
13
|
+
* @memberof countervalue
|
|
14
|
+
*/
|
|
15
|
+
export declare const formatCounterValueHour: (d: Date) => string;
|
|
16
|
+
/**
|
|
17
|
+
* full version of formatCounterValue*
|
|
18
|
+
*/
|
|
19
|
+
export declare const formatCounterValueHashes: (d: Date) => {
|
|
20
|
+
iso: string;
|
|
21
|
+
day: string;
|
|
22
|
+
hour: string;
|
|
23
|
+
};
|
|
24
|
+
export declare const parseFormattedDate: (str: string) => Date;
|
|
25
|
+
export declare const formatPerGranularity: Record<RateGranularity, (arg0: Date) => string>;
|
|
26
|
+
export declare function pairId({ from, to }: {
|
|
27
|
+
from: Currency;
|
|
28
|
+
to: Currency;
|
|
29
|
+
}): string;
|
|
30
|
+
export declare function magFromTo(from: Currency, to: Currency): number;
|
|
31
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,eAAO,MAAM,kBAAkB,aAAc,QAAQ,KAAG,MAUvD,CAAC;AAKF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAGnE,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAG3D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,MAAO,IAAI,KAAG,MAAsC,CAAC;AAEvF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,MAAO,IAAI,KAAG,MAAsC,CAAC;AAExF;;GAEG;AACH,eAAO,MAAM,wBAAwB,MAAO,IAAI;SAAU,MAAM;SAAO,MAAM;UAAQ,MAAM;CAO1F,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAS,MAAM,KAAG,IAehD,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAGhF,CAAC;AAGF,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,GAAG,MAAM,CAE7E;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,GAAG,MAAM,CAE9D"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export const inferCurrencyAPIID = (currency) => {
|
|
2
|
+
switch (currency.type) {
|
|
3
|
+
case "FiatCurrency": {
|
|
4
|
+
return currency.ticker;
|
|
5
|
+
}
|
|
6
|
+
case "CryptoCurrency":
|
|
7
|
+
case "TokenCurrency": {
|
|
8
|
+
return currency.id;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
const HOUR = 60 * 60 * 1000;
|
|
13
|
+
const DAY = 24 * HOUR;
|
|
14
|
+
export const incrementPerGranularity = {
|
|
15
|
+
daily: DAY,
|
|
16
|
+
hourly: HOUR,
|
|
17
|
+
};
|
|
18
|
+
export const datapointLimits = {
|
|
19
|
+
daily: 9999 * DAY,
|
|
20
|
+
hourly: 7 * DAY, // we fetch at MOST a week of hourly. after that there are too much data...
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* efficient implementation of YYYY-MM-DD formatter
|
|
24
|
+
* @memberof countervalue
|
|
25
|
+
*/
|
|
26
|
+
export const formatCounterValueDay = (d) => d.toISOString().slice(0, 10);
|
|
27
|
+
/**
|
|
28
|
+
* efficient implementation of YYYY-MM-DDTHH formatter
|
|
29
|
+
* @memberof countervalue
|
|
30
|
+
*/
|
|
31
|
+
export const formatCounterValueHour = (d) => d.toISOString().slice(0, 13);
|
|
32
|
+
/**
|
|
33
|
+
* full version of formatCounterValue*
|
|
34
|
+
*/
|
|
35
|
+
export const formatCounterValueHashes = (d) => {
|
|
36
|
+
const iso = d.toISOString();
|
|
37
|
+
return {
|
|
38
|
+
iso,
|
|
39
|
+
day: iso.slice(0, 10),
|
|
40
|
+
hour: iso.slice(0, 13),
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
export const parseFormattedDate = (str) => {
|
|
44
|
+
let full = str;
|
|
45
|
+
switch (str.length) {
|
|
46
|
+
case 10:
|
|
47
|
+
full += "T00:00";
|
|
48
|
+
break;
|
|
49
|
+
case 13:
|
|
50
|
+
full += ":00";
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
full += ":00.000Z";
|
|
54
|
+
return new Date(full);
|
|
55
|
+
};
|
|
56
|
+
export const formatPerGranularity = {
|
|
57
|
+
daily: formatCounterValueDay,
|
|
58
|
+
hourly: formatCounterValueHour,
|
|
59
|
+
};
|
|
60
|
+
// a hash function used to identify a pair of currencies, internal use only (not used for the API)
|
|
61
|
+
export function pairId({ from, to }) {
|
|
62
|
+
return `${inferCurrencyAPIID(to)} ${inferCurrencyAPIID(from)}`;
|
|
63
|
+
}
|
|
64
|
+
export function magFromTo(from, to) {
|
|
65
|
+
return Math.pow(10, (to.units[0].magnitude - from.units[0].magnitude));
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAkB,EAAU,EAAE;IAC/D,QAAQ,QAAQ,CAAC,IAAI,EAAE;QACrB,KAAK,cAAc,CAAC,CAAC;YACnB,OAAO,QAAQ,CAAC,MAAM,CAAC;SACxB;QACD,KAAK,gBAAgB,CAAC;QACtB,KAAK,eAAe,CAAC,CAAC;YACpB,OAAO,QAAQ,CAAC,EAAE,CAAC;SACpB;KACF;AACH,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5B,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;AAEtB,MAAM,CAAC,MAAM,uBAAuB,GAAoC;IACtE,KAAK,EAAE,GAAG;IACV,MAAM,EAAE,IAAI;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAoC;IAC9D,KAAK,EAAE,IAAI,GAAG,GAAG;IACjB,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,2EAA2E;CAC7F,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAO,EAAU,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAEvF;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAO,EAAU,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAExF;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAO,EAA8C,EAAE;IAC9F,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5B,OAAO;QACL,GAAG;QACH,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QACrB,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;KACvB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAQ,EAAE;IACtD,IAAI,IAAI,GAAG,GAAG,CAAC;IAEf,QAAQ,GAAG,CAAC,MAAM,EAAE;QAClB,KAAK,EAAE;YACL,IAAI,IAAI,QAAQ,CAAC;YACjB,MAAM;QAER,KAAK,EAAE;YACL,IAAI,IAAI,KAAK,CAAC;YACd,MAAM;KACT;IAED,IAAI,IAAI,UAAU,CAAC;IACnB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAoD;IACnF,KAAK,EAAE,qBAAqB;IAC5B,MAAM,EAAE,sBAAsB;CAC/B,CAAC;AAEF,kGAAkG;AAClG,MAAM,UAAU,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,EAAoC;IACnE,OAAO,GAAG,kBAAkB,CAAC,EAAE,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAc,EAAE,EAAY;IACpD,OAAO,SAAA,EAAE,EAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { CounterValuesState, CounterValuesStateRaw, CountervaluesSettings, TrackingPair, PairRateMapCache } from "./types";
|
|
2
|
+
import type { Account } from "@ledgerhq/types-live";
|
|
3
|
+
import type { Currency } from "@ledgerhq/types-cryptoassets";
|
|
4
|
+
export declare function exportCountervalues({ data, status }: CounterValuesState): CounterValuesStateRaw;
|
|
5
|
+
export declare function importCountervalues({ status, ...rest }: CounterValuesStateRaw, settings: CountervaluesSettings): CounterValuesState;
|
|
6
|
+
export declare function inferTrackingPairForAccounts(accounts: Account[], countervalue: Currency): TrackingPair[];
|
|
7
|
+
/**
|
|
8
|
+
* yield the ids of the tracking pairs as stored in the database
|
|
9
|
+
*/
|
|
10
|
+
export declare function trackingPairIds(trackingPairs: TrackingPair[]): string[];
|
|
11
|
+
export declare const initialState: CounterValuesState;
|
|
12
|
+
export declare function loadCountervalues(state: CounterValuesState, settings: CountervaluesSettings): Promise<CounterValuesState>;
|
|
13
|
+
export declare function lenseRateMap(state: CounterValuesState, pair: {
|
|
14
|
+
from: Currency;
|
|
15
|
+
to: Currency;
|
|
16
|
+
}): PairRateMapCache | null | undefined;
|
|
17
|
+
export declare function lenseRate({ stats, fallback, map }: PairRateMapCache, query: {
|
|
18
|
+
from: Currency;
|
|
19
|
+
to: Currency;
|
|
20
|
+
date?: Date | null | undefined;
|
|
21
|
+
}): number | null | undefined;
|
|
22
|
+
export declare function calculate(state: CounterValuesState, initialQuery: {
|
|
23
|
+
value: number;
|
|
24
|
+
from: Currency;
|
|
25
|
+
to: Currency;
|
|
26
|
+
disableRounding?: boolean;
|
|
27
|
+
date?: Date | null | undefined;
|
|
28
|
+
reverse?: boolean;
|
|
29
|
+
}): number | null | undefined;
|
|
30
|
+
export declare function calculateMany(state: CounterValuesState, dataPoints: Array<{
|
|
31
|
+
value: number;
|
|
32
|
+
date: Date | null | undefined;
|
|
33
|
+
}>, initialQuery: {
|
|
34
|
+
from: Currency;
|
|
35
|
+
to: Currency;
|
|
36
|
+
disableRounding?: boolean;
|
|
37
|
+
reverse?: boolean;
|
|
38
|
+
}): Array<number | null | undefined>;
|
|
39
|
+
export declare function resolveTrackingPairs(pairs: TrackingPair[]): TrackingPair[];
|
|
40
|
+
//# sourceMappingURL=logic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logic.d.ts","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,YAAY,EAGZ,gBAAgB,EAEjB,MAAM,SAAS,CAAC;AAWjB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAI7D,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,kBAAkB,GAAG,qBAAqB,CAc/F;AAGD,wBAAgB,mBAAmB,CACjC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,qBAAqB,EAC1C,QAAQ,EAAE,qBAAqB,GAC9B,kBAAkB,CA0BpB;AAGD,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,OAAO,EAAE,EACnB,YAAY,EAAE,QAAQ,GACrB,YAAY,EAAE,CAiBhB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,YAAY,EAAE,GAAG,MAAM,EAAE,CAEvE;AAED,eAAO,MAAM,YAAY,EAAE,kBAI1B,CAAC;AAIF,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,kBAAkB,EACzB,QAAQ,EAAE,qBAAqB,GAC9B,OAAO,CAAC,kBAAkB,CAAC,CA+M7B;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,kBAAkB,EACzB,IAAI,EAAE;IACJ,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,QAAQ,CAAC;CACd,GACA,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAGrC;AACD,wBAAgB,SAAS,CACvB,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,gBAAgB,EAC1C,KAAK,EAAE;IACL,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,QAAQ,CAAC;IACb,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;CAChC,GACA,MAAM,GAAG,IAAI,GAAG,SAAS,CAM3B;AACD,wBAAgB,SAAS,CACvB,KAAK,EAAE,kBAAkB,EACzB,YAAY,EAAE;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,QAAQ,CAAC;IACb,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GACA,MAAM,GAAG,IAAI,GAAG,SAAS,CAuB3B;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,kBAAkB,EACzB,UAAU,EAAE,KAAK,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;CAC/B,CAAC,EACF,YAAY,EAAE;IACZ,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,QAAQ,CAAC;IACb,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GACA,KAAK,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CA0BlC;AA0ED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CA+B1E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logic.integration.test.d.ts","sourceRoot":"","sources":["../src/logic.integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { initialState, loadCountervalues, calculate, exportCountervalues, importCountervalues, } from "./logic";
|
|
11
|
+
import { findCurrencyByTicker } from "@ledgerhq/coin-framework/currencies/index";
|
|
12
|
+
import { getFiatCurrencyByTicker, getCryptoCurrencyById, getTokenById, } from "@ledgerhq/cryptoassets";
|
|
13
|
+
import { getBTCValues } from "./mock";
|
|
14
|
+
import Prando from "prando";
|
|
15
|
+
import api from "./api";
|
|
16
|
+
import { setEnv } from "@ledgerhq/live-env";
|
|
17
|
+
const value = "ll-ci/0.0.0";
|
|
18
|
+
setEnv("LEDGER_CLIENT_VERSION", value);
|
|
19
|
+
const ethereum = getCryptoCurrencyById("ethereum");
|
|
20
|
+
const bitcoin = getCryptoCurrencyById("bitcoin");
|
|
21
|
+
const usd = getFiatCurrencyByTicker("USD");
|
|
22
|
+
const now = Date.now();
|
|
23
|
+
const DAY = 24 * 60 * 60 * 1000;
|
|
24
|
+
jest.setTimeout(60000);
|
|
25
|
+
describe("API sanity", () => {
|
|
26
|
+
test("recent days have rate for BTC USD", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
27
|
+
const state = yield loadCountervalues(initialState, {
|
|
28
|
+
trackingPairs: [
|
|
29
|
+
{
|
|
30
|
+
from: bitcoin,
|
|
31
|
+
to: usd,
|
|
32
|
+
startDate: new Date(now - 200 * DAY),
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
autofillGaps: false,
|
|
36
|
+
disableAutoRecoverErrors: true,
|
|
37
|
+
});
|
|
38
|
+
for (let i = 0; i < 7; i++) {
|
|
39
|
+
const value = calculate(state, {
|
|
40
|
+
date: new Date(now - i * DAY),
|
|
41
|
+
disableRounding: true,
|
|
42
|
+
from: bitcoin,
|
|
43
|
+
to: usd,
|
|
44
|
+
value: 1000000,
|
|
45
|
+
});
|
|
46
|
+
expect(value).toBeDefined();
|
|
47
|
+
}
|
|
48
|
+
}));
|
|
49
|
+
test("recent days have different rates for BTC USD", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
50
|
+
const state = yield loadCountervalues(initialState, {
|
|
51
|
+
trackingPairs: [
|
|
52
|
+
{
|
|
53
|
+
from: bitcoin,
|
|
54
|
+
to: usd,
|
|
55
|
+
startDate: new Date(now - 200 * DAY),
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
autofillGaps: true,
|
|
59
|
+
disableAutoRecoverErrors: true,
|
|
60
|
+
});
|
|
61
|
+
const currentValue = calculate(state, {
|
|
62
|
+
disableRounding: true,
|
|
63
|
+
from: bitcoin,
|
|
64
|
+
to: usd,
|
|
65
|
+
value: 1000000,
|
|
66
|
+
});
|
|
67
|
+
for (let i = 1; i < 7; i++) {
|
|
68
|
+
const value = calculate(state, {
|
|
69
|
+
date: new Date(now - i * DAY),
|
|
70
|
+
disableRounding: true,
|
|
71
|
+
from: bitcoin,
|
|
72
|
+
to: usd,
|
|
73
|
+
value: 1000000,
|
|
74
|
+
});
|
|
75
|
+
expect(value).not.toEqual(currentValue);
|
|
76
|
+
}
|
|
77
|
+
}));
|
|
78
|
+
});
|
|
79
|
+
describe("extreme cases", () => {
|
|
80
|
+
const universe = Object.keys(getBTCValues())
|
|
81
|
+
.filter(t => t !== "USD")
|
|
82
|
+
.map(findCurrencyByTicker)
|
|
83
|
+
.filter(Boolean);
|
|
84
|
+
universe.sort((a, b) => a.ticker.localeCompare(b.ticker));
|
|
85
|
+
const prando = new Prando("orderingrng");
|
|
86
|
+
const sampleCount = Math.min(120, universe.length);
|
|
87
|
+
const i = prando.nextInt(0, universe.length - sampleCount);
|
|
88
|
+
const currencies = universe.slice(i, i + sampleCount);
|
|
89
|
+
test("all tickers against USD", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
90
|
+
const state = yield loadCountervalues(initialState, {
|
|
91
|
+
trackingPairs: currencies.map(from => ({
|
|
92
|
+
from,
|
|
93
|
+
to: usd,
|
|
94
|
+
startDate: new Date(),
|
|
95
|
+
})),
|
|
96
|
+
autofillGaps: true,
|
|
97
|
+
disableAutoRecoverErrors: true,
|
|
98
|
+
});
|
|
99
|
+
const currenciesWithCVs = currencies
|
|
100
|
+
.map(from => calculate(state, {
|
|
101
|
+
date: new Date(),
|
|
102
|
+
from,
|
|
103
|
+
to: usd,
|
|
104
|
+
value: 1000000,
|
|
105
|
+
}))
|
|
106
|
+
.filter(v => v && v > 0);
|
|
107
|
+
expect(currenciesWithCVs.length).toBeGreaterThan(0);
|
|
108
|
+
}));
|
|
109
|
+
test("all tickers against BTC", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
110
|
+
const state = yield loadCountervalues(initialState, {
|
|
111
|
+
trackingPairs: currencies.map(from => ({
|
|
112
|
+
from,
|
|
113
|
+
to: bitcoin,
|
|
114
|
+
startDate: new Date(),
|
|
115
|
+
})),
|
|
116
|
+
autofillGaps: true,
|
|
117
|
+
disableAutoRecoverErrors: true,
|
|
118
|
+
});
|
|
119
|
+
const currenciesWithCVs = currencies
|
|
120
|
+
.map(from => calculate(state, {
|
|
121
|
+
date: new Date(),
|
|
122
|
+
from,
|
|
123
|
+
to: bitcoin,
|
|
124
|
+
value: 1000000,
|
|
125
|
+
}))
|
|
126
|
+
.filter(v => v && v > 0);
|
|
127
|
+
expect(currenciesWithCVs.length).toBeGreaterThan(0);
|
|
128
|
+
}));
|
|
129
|
+
});
|
|
130
|
+
describe("WETH rules", () => {
|
|
131
|
+
// this test is created to confirm the recent removal of weth/eth specific management is still functional in v3 context
|
|
132
|
+
test("ethereum WETH have countervalues", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
133
|
+
const weth = getTokenById("ethereum/erc20/weth");
|
|
134
|
+
const state = yield loadCountervalues(initialState, {
|
|
135
|
+
trackingPairs: [
|
|
136
|
+
{
|
|
137
|
+
from: weth,
|
|
138
|
+
to: usd,
|
|
139
|
+
startDate: new Date(now - 10 * DAY),
|
|
140
|
+
},
|
|
141
|
+
],
|
|
142
|
+
autofillGaps: true,
|
|
143
|
+
disableAutoRecoverErrors: true,
|
|
144
|
+
});
|
|
145
|
+
const value = calculate(state, {
|
|
146
|
+
disableRounding: true,
|
|
147
|
+
from: weth,
|
|
148
|
+
to: usd,
|
|
149
|
+
value: 1000000,
|
|
150
|
+
});
|
|
151
|
+
expect(value).toBeGreaterThan(0);
|
|
152
|
+
}));
|
|
153
|
+
});
|
|
154
|
+
test("fetchIdsSortedByMarketcap", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
155
|
+
const ids = yield api.fetchIdsSortedByMarketcap();
|
|
156
|
+
expect(ids).toContain("bitcoin");
|
|
157
|
+
}));
|
|
158
|
+
test("export and import it back", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
159
|
+
const settings = {
|
|
160
|
+
trackingPairs: [
|
|
161
|
+
{
|
|
162
|
+
from: bitcoin,
|
|
163
|
+
to: usd,
|
|
164
|
+
startDate: new Date(now - 10 * DAY),
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
from: ethereum,
|
|
168
|
+
to: usd,
|
|
169
|
+
startDate: new Date(now - 100 * DAY),
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
autofillGaps: true,
|
|
173
|
+
disableAutoRecoverErrors: true,
|
|
174
|
+
};
|
|
175
|
+
const state = yield loadCountervalues(initialState, settings);
|
|
176
|
+
const exported = exportCountervalues(state);
|
|
177
|
+
const imported = importCountervalues(exported, settings);
|
|
178
|
+
expect(imported).toEqual(state);
|
|
179
|
+
}));
|
|
180
|
+
describe("API specific unit tests", () => {
|
|
181
|
+
test("fetchLatest with empty pairs", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
182
|
+
const rates = yield api.fetchLatest([]);
|
|
183
|
+
expect(rates).toEqual([]);
|
|
184
|
+
}));
|
|
185
|
+
});
|
|
186
|
+
//# 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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"}
|