@ledgerhq/live-common 34.47.0-nightly.4 → 34.47.0-nightly.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/bridge/crypto-assets/cal-store.d.ts.map +1 -1
- package/lib/bridge/crypto-assets/cal-store.js +21 -5
- package/lib/bridge/crypto-assets/cal-store.js.map +1 -1
- package/lib/bridge/generic-alpaca/alpaca/index.d.ts.map +1 -1
- package/lib/bridge/generic-alpaca/alpaca/index.js +6 -1
- package/lib/bridge/generic-alpaca/alpaca/index.js.map +1 -1
- package/lib/bridge/generic-alpaca/alpaca/index.unit.test.d.ts +2 -0
- package/lib/bridge/generic-alpaca/alpaca/index.unit.test.d.ts.map +1 -0
- package/lib/bridge/generic-alpaca/alpaca/index.unit.test.js +89 -0
- package/lib/bridge/generic-alpaca/alpaca/index.unit.test.js.map +1 -0
- package/lib-es/bridge/crypto-assets/cal-store.d.ts.map +1 -1
- package/lib-es/bridge/crypto-assets/cal-store.js +21 -5
- package/lib-es/bridge/crypto-assets/cal-store.js.map +1 -1
- package/lib-es/bridge/generic-alpaca/alpaca/index.d.ts.map +1 -1
- package/lib-es/bridge/generic-alpaca/alpaca/index.js +6 -1
- package/lib-es/bridge/generic-alpaca/alpaca/index.js.map +1 -1
- package/lib-es/bridge/generic-alpaca/alpaca/index.unit.test.d.ts +2 -0
- package/lib-es/bridge/generic-alpaca/alpaca/index.unit.test.d.ts.map +1 -0
- package/lib-es/bridge/generic-alpaca/alpaca/index.unit.test.js +64 -0
- package/lib-es/bridge/generic-alpaca/alpaca/index.unit.test.js.map +1 -0
- package/package.json +11 -11
- package/src/bridge/crypto-assets/cal-store.ts +22 -5
- package/src/bridge/generic-alpaca/alpaca/index.ts +14 -1
- package/src/bridge/generic-alpaca/alpaca/index.unit.test.ts +78 -0
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"cal-store.d.ts","sourceRoot":"","sources":["../../../src/bridge/crypto-assets/cal-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;
|
1
|
+
{"version":3,"file":"cal-store.d.ts","sourceRoot":"","sources":["../../../src/bridge/crypto-assets/cal-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAK7D,qBAAa,QAAS,YAAW,iBAAiB;IAChD,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,WAAW,CAAoC;IAEvD,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE;IAcjC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAQ9D,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa;IAQvC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIpD,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAc5F,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;CAG7D"}
|
@@ -1,6 +1,8 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.CALStore = void 0;
|
4
|
+
// Coins with case-sensitive addresses (b58, ...)
|
5
|
+
const CASE_SENSITIVE_COINS = ["solana"];
|
4
6
|
class CALStore {
|
5
7
|
tokenCache = new Map();
|
6
8
|
addressCache = new Map();
|
@@ -9,13 +11,21 @@ class CALStore {
|
|
9
11
|
tokens.forEach(token => {
|
10
12
|
this.tokenCache.set(token.id, token);
|
11
13
|
if (token.contractAddress) {
|
12
|
-
|
14
|
+
const isCaseSensitive = CASE_SENSITIVE_COINS.includes(token.parentCurrency.id);
|
15
|
+
const normalizedAddress = isCaseSensitive
|
16
|
+
? token.contractAddress
|
17
|
+
: token.contractAddress.toLowerCase();
|
18
|
+
this.addressCache.set(normalizedAddress, token);
|
13
19
|
}
|
14
20
|
this.tickerCache.set(token.ticker, token);
|
15
21
|
});
|
16
22
|
}
|
17
23
|
findTokenByAddress(address) {
|
18
|
-
|
24
|
+
const exactMatch = this.addressCache.get(address);
|
25
|
+
if (exactMatch)
|
26
|
+
return exactMatch;
|
27
|
+
const lowercaseMatch = this.addressCache.get(address.toLowerCase());
|
28
|
+
return lowercaseMatch;
|
19
29
|
}
|
20
30
|
getTokenById(id) {
|
21
31
|
const token = this.tokenCache.get(id);
|
@@ -28,10 +38,16 @@ class CALStore {
|
|
28
38
|
return this.tokenCache.get(id);
|
29
39
|
}
|
30
40
|
findTokenByAddressInCurrency(address, currencyId) {
|
31
|
-
const
|
32
|
-
if (
|
33
|
-
|
41
|
+
const isCaseSensitive = CASE_SENSITIVE_COINS.includes(currencyId);
|
42
|
+
if (isCaseSensitive) {
|
43
|
+
const token = this.addressCache.get(address);
|
44
|
+
if (token && token.parentCurrency.id === currencyId)
|
45
|
+
return token;
|
46
|
+
return undefined;
|
34
47
|
}
|
48
|
+
const token = this.addressCache.get(address.toLowerCase());
|
49
|
+
if (token && token.parentCurrency.id === currencyId)
|
50
|
+
return token;
|
35
51
|
return undefined;
|
36
52
|
}
|
37
53
|
findTokenByTicker(ticker) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"cal-store.js","sourceRoot":"","sources":["../../../src/bridge/crypto-assets/cal-store.ts"],"names":[],"mappings":";;;AAGA,MAAa,QAAQ;IACX,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC9C,YAAY,GAAG,IAAI,GAAG,EAAyB,CAAC;IAChD,WAAW,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEvD,SAAS,CAAC,MAAuB;QAC/B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACrB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACrC,IAAI,KAAK,CAAC,eAAe,EAAE;gBACzB,
|
1
|
+
{"version":3,"file":"cal-store.js","sourceRoot":"","sources":["../../../src/bridge/crypto-assets/cal-store.ts"],"names":[],"mappings":";;;AAGA,iDAAiD;AACjD,MAAM,oBAAoB,GAAG,CAAC,QAAQ,CAAC,CAAC;AAExC,MAAa,QAAQ;IACX,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC9C,YAAY,GAAG,IAAI,GAAG,EAAyB,CAAC;IAChD,WAAW,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEvD,SAAS,CAAC,MAAuB;QAC/B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACrB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACrC,IAAI,KAAK,CAAC,eAAe,EAAE;gBACzB,MAAM,eAAe,GAAG,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;gBAC/E,MAAM,iBAAiB,GAAG,eAAe;oBACvC,CAAC,CAAC,KAAK,CAAC,eAAe;oBACvB,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;gBACxC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;aACjD;YACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB,CAAC,OAAe;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,UAAU;YAAE,OAAO,UAAU,CAAC;QAElC,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACpE,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,YAAY,CAAC,EAAU;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;SAC3C;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,aAAa,CAAC,EAAU;QACtB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,4BAA4B,CAAC,OAAe,EAAE,UAAkB;QAC9D,MAAM,eAAe,GAAG,oBAAoB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAElE,IAAI,eAAe,EAAE;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,KAAK,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,KAAK,UAAU;gBAAE,OAAO,KAAK,CAAC;YAClE,OAAO,SAAS,CAAC;SAClB;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3D,IAAI,KAAK,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,iBAAiB,CAAC,MAAc;QAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;CACF;AAxDD,4BAwDC"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/bridge/generic-alpaca/alpaca/index.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/bridge/generic-alpaca/alpaca/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,GAAG,EAAE,MAAM,oCAAoC,CAAC;AAMzD,wBAAgB,YAAY,CAAC,OAAO,KAAA,EAAE,IAAI,KAAA,GAAG,GAAG,CAAC,GAAG,CAAC,CAwBpD"}
|
@@ -3,17 +3,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getAlpacaApi = void 0;
|
4
4
|
const index_1 = require("@ledgerhq/coin-xrp/api/index");
|
5
5
|
const index_2 = require("@ledgerhq/coin-stellar/api/index");
|
6
|
+
const index_3 = require("@ledgerhq/coin-canton/api/index");
|
7
|
+
const index_4 = require("@ledgerhq/coin-tron/api/index");
|
6
8
|
const config_1 = require("../../../config");
|
7
9
|
const currencies_1 = require("@ledgerhq/cryptoassets/currencies");
|
8
10
|
const network_alpaca_1 = require("./network/network-alpaca");
|
9
11
|
function getAlpacaApi(network, kind) {
|
10
12
|
if (kind === "local") {
|
11
13
|
switch (network) {
|
12
|
-
case "ripple":
|
13
14
|
case "xrp":
|
14
15
|
return (0, index_1.createApi)((0, config_1.getCurrencyConfiguration)((0, currencies_1.getCryptoCurrencyById)("ripple"))); // FIXME: createXrpApi returns a strongly typed Api<XrpSender>, fix Api<any> to allow it
|
15
16
|
case "stellar":
|
16
17
|
return (0, index_2.createApi)((0, config_1.getCurrencyConfiguration)((0, currencies_1.getCryptoCurrencyById)("stellar")));
|
18
|
+
case "canton":
|
19
|
+
return (0, index_3.createApi)((0, config_1.getCurrencyConfiguration)((0, currencies_1.getCryptoCurrencyById)("canton_network_devnet")));
|
20
|
+
case "tron":
|
21
|
+
return (0, index_4.createApi)((0, config_1.getCurrencyConfiguration)((0, currencies_1.getCryptoCurrencyById)("tron")));
|
17
22
|
}
|
18
23
|
}
|
19
24
|
return (0, network_alpaca_1.getNetworkAlpacaApi)(network);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/bridge/generic-alpaca/alpaca/index.ts"],"names":[],"mappings":";;;AAAA,wDAAyE;AACzE,4DAAiF;AACjF,4CAA2D;AAC3D,kEAA0E;AAC1E,6DAA+D;
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/bridge/generic-alpaca/alpaca/index.ts"],"names":[],"mappings":";;;AAAA,wDAAyE;AACzE,4DAAiF;AACjF,2DAA+E;AAC/E,yDAA2E;AAC3E,4CAA2D;AAC3D,kEAA0E;AAC1E,6DAA+D;AAO/D,SAAgB,YAAY,CAAC,OAAO,EAAE,IAAI;IACxC,IAAI,IAAI,KAAK,OAAO,EAAE;QACpB,QAAQ,OAAO,EAAE;YACf,KAAK,KAAK;gBACR,OAAO,IAAA,iBAAY,EACjB,IAAA,iCAAwB,EAAgB,IAAA,kCAAqB,EAAC,QAAQ,CAAC,CAAC,CAC7D,CAAC,CAAC,wFAAwF;YACzG,KAAK,SAAS;gBACZ,OAAO,IAAA,iBAAgB,EACrB,IAAA,iCAAwB,EAAoB,IAAA,kCAAqB,EAAC,SAAS,CAAC,CAAC,CAClE,CAAC;YAChB,KAAK,QAAQ;gBACX,OAAO,IAAA,iBAAe,EACpB,IAAA,iCAAwB,EACtB,IAAA,kCAAqB,EAAC,uBAAuB,CAAC,CAC/C,CACU,CAAC;YAChB,KAAK,MAAM;gBACT,OAAO,IAAA,iBAAa,EAClB,IAAA,iCAAwB,EAAiB,IAAA,kCAAqB,EAAC,MAAM,CAAC,CAAC,CAC5D,CAAC;SACjB;KACF;IACD,OAAO,IAAA,oCAAmB,EAAC,OAAO,CAAyC,CAAC;AAC9E,CAAC;AAxBD,oCAwBC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.unit.test.d.ts","sourceRoot":"","sources":["../../../../src/bridge/generic-alpaca/alpaca/index.unit.test.ts"],"names":[],"mappings":""}
|
@@ -0,0 +1,89 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
+
}) : function(o, v) {
|
16
|
+
o["default"] = v;
|
17
|
+
});
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
19
|
+
if (mod && mod.__esModule) return mod;
|
20
|
+
var result = {};
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
+
__setModuleDefault(result, mod);
|
23
|
+
return result;
|
24
|
+
};
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
26
|
+
const index_1 = require("./index");
|
27
|
+
const xrpModule = __importStar(require("@ledgerhq/coin-xrp/api/index"));
|
28
|
+
const stellarModule = __importStar(require("@ledgerhq/coin-stellar/api/index"));
|
29
|
+
const cantonModule = __importStar(require("@ledgerhq/coin-canton/api/index"));
|
30
|
+
const tronModule = __importStar(require("@ledgerhq/coin-tron/api/index"));
|
31
|
+
const config = __importStar(require("../../../config"));
|
32
|
+
const networkApi = __importStar(require("./network/network-alpaca"));
|
33
|
+
const cryptoAssets = __importStar(require("@ledgerhq/cryptoassets/currencies"));
|
34
|
+
const mockApiInstance = { mock: "api" };
|
35
|
+
jest.mock("@ledgerhq/cryptoassets/currencies", () => ({
|
36
|
+
getCryptoCurrencyById: jest.fn(),
|
37
|
+
}));
|
38
|
+
jest.mock("../../../config", () => ({
|
39
|
+
getCurrencyConfiguration: jest.fn(),
|
40
|
+
}));
|
41
|
+
jest.mock("@ledgerhq/coin-xrp/api/index", () => ({
|
42
|
+
createApi: jest.fn(),
|
43
|
+
}));
|
44
|
+
jest.mock("@ledgerhq/coin-stellar/api/index", () => ({
|
45
|
+
createApi: jest.fn(),
|
46
|
+
}));
|
47
|
+
jest.mock("@ledgerhq/coin-canton/api/index", () => ({
|
48
|
+
createApi: jest.fn(),
|
49
|
+
}));
|
50
|
+
jest.mock("@ledgerhq/coin-tron/api/index", () => ({
|
51
|
+
createApi: jest.fn(),
|
52
|
+
}));
|
53
|
+
jest.mock("./network/network-alpaca", () => ({
|
54
|
+
getNetworkAlpacaApi: jest.fn(),
|
55
|
+
}));
|
56
|
+
describe("getAlpacaApi", () => {
|
57
|
+
const mockCurrency = { id: "mock-currency" };
|
58
|
+
beforeEach(() => {
|
59
|
+
jest.clearAllMocks();
|
60
|
+
// Common mocks
|
61
|
+
cryptoAssets.getCryptoCurrencyById.mockReturnValue(mockCurrency);
|
62
|
+
config.getCurrencyConfiguration.mockReturnValue({ config: true });
|
63
|
+
// API mocks
|
64
|
+
jest.spyOn(xrpModule, "createApi").mockReturnValue(mockApiInstance);
|
65
|
+
jest.spyOn(stellarModule, "createApi").mockReturnValue(mockApiInstance);
|
66
|
+
jest.spyOn(cantonModule, "createApi").mockReturnValue(mockApiInstance);
|
67
|
+
jest.spyOn(tronModule, "createApi").mockReturnValue(mockApiInstance);
|
68
|
+
jest.spyOn(networkApi, "getNetworkAlpacaApi").mockReturnValue(mockApiInstance);
|
69
|
+
});
|
70
|
+
const testCases = [
|
71
|
+
{ network: "xrp", module: xrpModule, label: "XRP" },
|
72
|
+
{ network: "stellar", module: stellarModule, label: "Stellar" },
|
73
|
+
{ network: "tron", module: tronModule, label: "Tron" },
|
74
|
+
{ network: "canton", module: cantonModule, label: "Canton" },
|
75
|
+
];
|
76
|
+
testCases.forEach(({ network, module, label }) => {
|
77
|
+
it(`should return ${label} API for network "${network}" and kind "local"`, () => {
|
78
|
+
const result = (0, index_1.getAlpacaApi)(network, "local");
|
79
|
+
expect(result).toEqual(mockApiInstance);
|
80
|
+
expect(module.createApi).toHaveBeenCalledWith({ config: true });
|
81
|
+
});
|
82
|
+
});
|
83
|
+
it("should return network API for kind !== 'local'", () => {
|
84
|
+
const result = (0, index_1.getAlpacaApi)("xrp", "remote");
|
85
|
+
expect(networkApi.getNetworkAlpacaApi).toHaveBeenCalledWith("xrp");
|
86
|
+
expect(result).toEqual(mockApiInstance);
|
87
|
+
});
|
88
|
+
});
|
89
|
+
//# sourceMappingURL=index.unit.test.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.unit.test.js","sourceRoot":"","sources":["../../../../src/bridge/generic-alpaca/alpaca/index.unit.test.ts"],"names":[],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"cal-store.d.ts","sourceRoot":"","sources":["../../../src/bridge/crypto-assets/cal-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;
|
1
|
+
{"version":3,"file":"cal-store.d.ts","sourceRoot":"","sources":["../../../src/bridge/crypto-assets/cal-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAK7D,qBAAa,QAAS,YAAW,iBAAiB;IAChD,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,WAAW,CAAoC;IAEvD,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE;IAcjC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAQ9D,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa;IAQvC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIpD,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAc5F,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;CAG7D"}
|
@@ -1,3 +1,5 @@
|
|
1
|
+
// Coins with case-sensitive addresses (b58, ...)
|
2
|
+
const CASE_SENSITIVE_COINS = ["solana"];
|
1
3
|
export class CALStore {
|
2
4
|
tokenCache = new Map();
|
3
5
|
addressCache = new Map();
|
@@ -6,13 +8,21 @@ export class CALStore {
|
|
6
8
|
tokens.forEach(token => {
|
7
9
|
this.tokenCache.set(token.id, token);
|
8
10
|
if (token.contractAddress) {
|
9
|
-
|
11
|
+
const isCaseSensitive = CASE_SENSITIVE_COINS.includes(token.parentCurrency.id);
|
12
|
+
const normalizedAddress = isCaseSensitive
|
13
|
+
? token.contractAddress
|
14
|
+
: token.contractAddress.toLowerCase();
|
15
|
+
this.addressCache.set(normalizedAddress, token);
|
10
16
|
}
|
11
17
|
this.tickerCache.set(token.ticker, token);
|
12
18
|
});
|
13
19
|
}
|
14
20
|
findTokenByAddress(address) {
|
15
|
-
|
21
|
+
const exactMatch = this.addressCache.get(address);
|
22
|
+
if (exactMatch)
|
23
|
+
return exactMatch;
|
24
|
+
const lowercaseMatch = this.addressCache.get(address.toLowerCase());
|
25
|
+
return lowercaseMatch;
|
16
26
|
}
|
17
27
|
getTokenById(id) {
|
18
28
|
const token = this.tokenCache.get(id);
|
@@ -25,10 +35,16 @@ export class CALStore {
|
|
25
35
|
return this.tokenCache.get(id);
|
26
36
|
}
|
27
37
|
findTokenByAddressInCurrency(address, currencyId) {
|
28
|
-
const
|
29
|
-
if (
|
30
|
-
|
38
|
+
const isCaseSensitive = CASE_SENSITIVE_COINS.includes(currencyId);
|
39
|
+
if (isCaseSensitive) {
|
40
|
+
const token = this.addressCache.get(address);
|
41
|
+
if (token && token.parentCurrency.id === currencyId)
|
42
|
+
return token;
|
43
|
+
return undefined;
|
31
44
|
}
|
45
|
+
const token = this.addressCache.get(address.toLowerCase());
|
46
|
+
if (token && token.parentCurrency.id === currencyId)
|
47
|
+
return token;
|
32
48
|
return undefined;
|
33
49
|
}
|
34
50
|
findTokenByTicker(ticker) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"cal-store.js","sourceRoot":"","sources":["../../../src/bridge/crypto-assets/cal-store.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,QAAQ;IACX,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC9C,YAAY,GAAG,IAAI,GAAG,EAAyB,CAAC;IAChD,WAAW,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEvD,SAAS,CAAC,MAAuB;QAC/B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACrB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACrC,IAAI,KAAK,CAAC,eAAe,EAAE;gBACzB,
|
1
|
+
{"version":3,"file":"cal-store.js","sourceRoot":"","sources":["../../../src/bridge/crypto-assets/cal-store.ts"],"names":[],"mappings":"AAGA,iDAAiD;AACjD,MAAM,oBAAoB,GAAG,CAAC,QAAQ,CAAC,CAAC;AAExC,MAAM,OAAO,QAAQ;IACX,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC9C,YAAY,GAAG,IAAI,GAAG,EAAyB,CAAC;IAChD,WAAW,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEvD,SAAS,CAAC,MAAuB;QAC/B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACrB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACrC,IAAI,KAAK,CAAC,eAAe,EAAE;gBACzB,MAAM,eAAe,GAAG,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;gBAC/E,MAAM,iBAAiB,GAAG,eAAe;oBACvC,CAAC,CAAC,KAAK,CAAC,eAAe;oBACvB,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;gBACxC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;aACjD;YACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB,CAAC,OAAe;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,UAAU;YAAE,OAAO,UAAU,CAAC;QAElC,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACpE,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,YAAY,CAAC,EAAU;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;SAC3C;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,aAAa,CAAC,EAAU;QACtB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,4BAA4B,CAAC,OAAe,EAAE,UAAkB;QAC9D,MAAM,eAAe,GAAG,oBAAoB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAElE,IAAI,eAAe,EAAE;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,KAAK,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,KAAK,UAAU;gBAAE,OAAO,KAAK,CAAC;YAClE,OAAO,SAAS,CAAC;SAClB;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3D,IAAI,KAAK,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,iBAAiB,CAAC,MAAc;QAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;CACF"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/bridge/generic-alpaca/alpaca/index.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/bridge/generic-alpaca/alpaca/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,GAAG,EAAE,MAAM,oCAAoC,CAAC;AAMzD,wBAAgB,YAAY,CAAC,OAAO,KAAA,EAAE,IAAI,KAAA,GAAG,GAAG,CAAC,GAAG,CAAC,CAwBpD"}
|
@@ -1,16 +1,21 @@
|
|
1
1
|
import { createApi as createXrpApi } from "@ledgerhq/coin-xrp/api/index";
|
2
2
|
import { createApi as createStellarApi } from "@ledgerhq/coin-stellar/api/index";
|
3
|
+
import { createApi as createCantonApi } from "@ledgerhq/coin-canton/api/index";
|
4
|
+
import { createApi as createTronApi } from "@ledgerhq/coin-tron/api/index";
|
3
5
|
import { getCurrencyConfiguration } from "../../../config";
|
4
6
|
import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets/currencies";
|
5
7
|
import { getNetworkAlpacaApi } from "./network/network-alpaca";
|
6
8
|
export function getAlpacaApi(network, kind) {
|
7
9
|
if (kind === "local") {
|
8
10
|
switch (network) {
|
9
|
-
case "ripple":
|
10
11
|
case "xrp":
|
11
12
|
return createXrpApi(getCurrencyConfiguration(getCryptoCurrencyById("ripple"))); // FIXME: createXrpApi returns a strongly typed Api<XrpSender>, fix Api<any> to allow it
|
12
13
|
case "stellar":
|
13
14
|
return createStellarApi(getCurrencyConfiguration(getCryptoCurrencyById("stellar")));
|
15
|
+
case "canton":
|
16
|
+
return createCantonApi(getCurrencyConfiguration(getCryptoCurrencyById("canton_network_devnet")));
|
17
|
+
case "tron":
|
18
|
+
return createTronApi(getCurrencyConfiguration(getCryptoCurrencyById("tron")));
|
14
19
|
}
|
15
20
|
}
|
16
21
|
return getNetworkAlpacaApi(network);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/bridge/generic-alpaca/alpaca/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/bridge/generic-alpaca/alpaca/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAO/D,MAAM,UAAU,YAAY,CAAC,OAAO,EAAE,IAAI;IACxC,IAAI,IAAI,KAAK,OAAO,EAAE;QACpB,QAAQ,OAAO,EAAE;YACf,KAAK,KAAK;gBACR,OAAO,YAAY,CACjB,wBAAwB,CAAgB,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAC7D,CAAC,CAAC,wFAAwF;YACzG,KAAK,SAAS;gBACZ,OAAO,gBAAgB,CACrB,wBAAwB,CAAoB,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAClE,CAAC;YAChB,KAAK,QAAQ;gBACX,OAAO,eAAe,CACpB,wBAAwB,CACtB,qBAAqB,CAAC,uBAAuB,CAAC,CAC/C,CACU,CAAC;YAChB,KAAK,MAAM;gBACT,OAAO,aAAa,CAClB,wBAAwB,CAAiB,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAC5D,CAAC;SACjB;KACF;IACD,OAAO,mBAAmB,CAAC,OAAO,CAAyC,CAAC;AAC9E,CAAC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.unit.test.d.ts","sourceRoot":"","sources":["../../../../src/bridge/generic-alpaca/alpaca/index.unit.test.ts"],"names":[],"mappings":""}
|
@@ -0,0 +1,64 @@
|
|
1
|
+
import { getAlpacaApi } from "./index";
|
2
|
+
import * as xrpModule from "@ledgerhq/coin-xrp/api/index";
|
3
|
+
import * as stellarModule from "@ledgerhq/coin-stellar/api/index";
|
4
|
+
import * as cantonModule from "@ledgerhq/coin-canton/api/index";
|
5
|
+
import * as tronModule from "@ledgerhq/coin-tron/api/index";
|
6
|
+
import * as config from "../../../config";
|
7
|
+
import * as networkApi from "./network/network-alpaca";
|
8
|
+
import * as cryptoAssets from "@ledgerhq/cryptoassets/currencies";
|
9
|
+
const mockApiInstance = { mock: "api" };
|
10
|
+
jest.mock("@ledgerhq/cryptoassets/currencies", () => ({
|
11
|
+
getCryptoCurrencyById: jest.fn(),
|
12
|
+
}));
|
13
|
+
jest.mock("../../../config", () => ({
|
14
|
+
getCurrencyConfiguration: jest.fn(),
|
15
|
+
}));
|
16
|
+
jest.mock("@ledgerhq/coin-xrp/api/index", () => ({
|
17
|
+
createApi: jest.fn(),
|
18
|
+
}));
|
19
|
+
jest.mock("@ledgerhq/coin-stellar/api/index", () => ({
|
20
|
+
createApi: jest.fn(),
|
21
|
+
}));
|
22
|
+
jest.mock("@ledgerhq/coin-canton/api/index", () => ({
|
23
|
+
createApi: jest.fn(),
|
24
|
+
}));
|
25
|
+
jest.mock("@ledgerhq/coin-tron/api/index", () => ({
|
26
|
+
createApi: jest.fn(),
|
27
|
+
}));
|
28
|
+
jest.mock("./network/network-alpaca", () => ({
|
29
|
+
getNetworkAlpacaApi: jest.fn(),
|
30
|
+
}));
|
31
|
+
describe("getAlpacaApi", () => {
|
32
|
+
const mockCurrency = { id: "mock-currency" };
|
33
|
+
beforeEach(() => {
|
34
|
+
jest.clearAllMocks();
|
35
|
+
// Common mocks
|
36
|
+
cryptoAssets.getCryptoCurrencyById.mockReturnValue(mockCurrency);
|
37
|
+
config.getCurrencyConfiguration.mockReturnValue({ config: true });
|
38
|
+
// API mocks
|
39
|
+
jest.spyOn(xrpModule, "createApi").mockReturnValue(mockApiInstance);
|
40
|
+
jest.spyOn(stellarModule, "createApi").mockReturnValue(mockApiInstance);
|
41
|
+
jest.spyOn(cantonModule, "createApi").mockReturnValue(mockApiInstance);
|
42
|
+
jest.spyOn(tronModule, "createApi").mockReturnValue(mockApiInstance);
|
43
|
+
jest.spyOn(networkApi, "getNetworkAlpacaApi").mockReturnValue(mockApiInstance);
|
44
|
+
});
|
45
|
+
const testCases = [
|
46
|
+
{ network: "xrp", module: xrpModule, label: "XRP" },
|
47
|
+
{ network: "stellar", module: stellarModule, label: "Stellar" },
|
48
|
+
{ network: "tron", module: tronModule, label: "Tron" },
|
49
|
+
{ network: "canton", module: cantonModule, label: "Canton" },
|
50
|
+
];
|
51
|
+
testCases.forEach(({ network, module, label }) => {
|
52
|
+
it(`should return ${label} API for network "${network}" and kind "local"`, () => {
|
53
|
+
const result = getAlpacaApi(network, "local");
|
54
|
+
expect(result).toEqual(mockApiInstance);
|
55
|
+
expect(module.createApi).toHaveBeenCalledWith({ config: true });
|
56
|
+
});
|
57
|
+
});
|
58
|
+
it("should return network API for kind !== 'local'", () => {
|
59
|
+
const result = getAlpacaApi("xrp", "remote");
|
60
|
+
expect(networkApi.getNetworkAlpacaApi).toHaveBeenCalledWith("xrp");
|
61
|
+
expect(result).toEqual(mockApiInstance);
|
62
|
+
});
|
63
|
+
});
|
64
|
+
//# sourceMappingURL=index.unit.test.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.unit.test.js","sourceRoot":"","sources":["../../../../src/bridge/generic-alpaca/alpaca/index.unit.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,SAAS,MAAM,8BAA8B,CAAC;AAC1D,OAAO,KAAK,aAAa,MAAM,kCAAkC,CAAC;AAClE,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,UAAU,MAAM,+BAA+B,CAAC;AAC5D,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,UAAU,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,YAAY,MAAM,mCAAmC,CAAC;AAElE,MAAM,eAAe,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAExC,IAAI,CAAC,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE,CAAC,CAAC;IACpD,qBAAqB,EAAE,IAAI,CAAC,EAAE,EAAE;CACjC,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IAClC,wBAAwB,EAAE,IAAI,CAAC,EAAE,EAAE;CACpC,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/C,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE;CACrB,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE,CAAC,CAAC;IACnD,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE;CACrB,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE,CAAC,CAAC;IAClD,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE;CACrB,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE,CAAC,CAAC;IAChD,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE;CACrB,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3C,mBAAmB,EAAE,IAAI,CAAC,EAAE,EAAE;CAC/B,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,MAAM,YAAY,GAAG,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC;IAE7C,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,eAAe;QACd,YAAY,CAAC,qBAAmC,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QAC/E,MAAM,CAAC,wBAAsC,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjF,YAAY;QACZ,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,eAAe,CAAC,eAAsB,CAAC,CAAC;QAC3E,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,eAAe,CAAC,eAAsB,CAAC,CAAC;QAC/E,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,eAAe,CAAC,eAAsB,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,eAAe,CAAC,eAAsB,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC,eAAe,CAAC,eAAsB,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG;QAChB,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE;QACnD,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE;QAC/D,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;QACtD,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE;KAC7D,CAAC;IAEF,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;QAC/C,EAAE,CAAC,iBAAiB,KAAK,qBAAqB,OAAO,oBAAoB,EAAE,GAAG,EAAE;YAC9E,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "@ledgerhq/live-common",
|
3
3
|
"description": "Common ground for the Ledger Live apps",
|
4
|
-
"version": "34.47.0-nightly.
|
4
|
+
"version": "34.47.0-nightly.5",
|
5
5
|
"repository": {
|
6
6
|
"type": "git",
|
7
7
|
"url": "https://github.com/LedgerHQ/ledger-live.git"
|
@@ -165,28 +165,28 @@
|
|
165
165
|
"xstate": "^5.19.2",
|
166
166
|
"yargs": "^17.0.0",
|
167
167
|
"zod": "^3.22.4",
|
168
|
-
"@ledgerhq/coin-aptos": "^3.2.0-nightly.1",
|
169
168
|
"@ledgerhq/coin-algorand": "^0.9.19-nightly.1",
|
169
|
+
"@ledgerhq/coin-aptos": "^3.2.0-nightly.1",
|
170
170
|
"@ledgerhq/coin-bitcoin": "^0.21.0-nightly.1",
|
171
|
-
"@ledgerhq/coin-canton": "^0.4.0-nightly.
|
171
|
+
"@ledgerhq/coin-canton": "^0.4.0-nightly.2",
|
172
172
|
"@ledgerhq/coin-cardano": "^0.11.3-nightly.1",
|
173
173
|
"@ledgerhq/coin-casper": "^2.0.10-nightly.1",
|
174
|
-
"@ledgerhq/coin-celo": "^1.2.2-nightly.
|
174
|
+
"@ledgerhq/coin-celo": "^1.2.2-nightly.2",
|
175
175
|
"@ledgerhq/coin-cosmos": "^0.16.8-nightly.1",
|
176
|
-
"@ledgerhq/coin-evm": "^2.29.0-nightly.
|
176
|
+
"@ledgerhq/coin-evm": "^2.29.0-nightly.2",
|
177
177
|
"@ledgerhq/coin-filecoin": "^1.10.2-nightly.1",
|
178
178
|
"@ledgerhq/coin-framework": "^6.3.0-nightly.1",
|
179
179
|
"@ledgerhq/coin-hedera": "^1.10.2-nightly.1",
|
180
180
|
"@ledgerhq/coin-icon": "^0.11.6-nightly.1",
|
181
181
|
"@ledgerhq/coin-internet_computer": "^1.7.19-nightly.1",
|
182
|
-
"@ledgerhq/coin-multiversx": "^0.4.19-nightly.1",
|
183
182
|
"@ledgerhq/coin-mina": "^1.1.18-nightly.1",
|
183
|
+
"@ledgerhq/coin-multiversx": "^0.4.19-nightly.1",
|
184
184
|
"@ledgerhq/coin-near": "^0.12.2-nightly.1",
|
185
185
|
"@ledgerhq/coin-polkadot": "^6.9.0-nightly.1",
|
186
|
-
"@ledgerhq/coin-solana": "^0.32.0-nightly.
|
186
|
+
"@ledgerhq/coin-solana": "^0.32.0-nightly.3",
|
187
187
|
"@ledgerhq/coin-stacks": "^0.8.19-nightly.1",
|
188
188
|
"@ledgerhq/coin-stellar": "^6.3.0-nightly.1",
|
189
|
-
"@ledgerhq/coin-sui": "^0.12.0-nightly.
|
189
|
+
"@ledgerhq/coin-sui": "^0.12.0-nightly.3",
|
190
190
|
"@ledgerhq/coin-tezos": "^6.3.0-nightly.1",
|
191
191
|
"@ledgerhq/coin-ton": "^0.13.8-nightly.2",
|
192
192
|
"@ledgerhq/coin-tron": "^5.3.0-nightly.2",
|
@@ -227,9 +227,9 @@
|
|
227
227
|
"@ledgerhq/live-network": "^2.0.16-nightly.1",
|
228
228
|
"@ledgerhq/live-nft": "^0.8.19-nightly.1",
|
229
229
|
"@ledgerhq/live-promise": "^0.1.1",
|
230
|
-
"@ledgerhq/live-signer-canton": "^0.2.3-nightly.
|
231
|
-
"@ledgerhq/live-signer-evm": "^0.7.2-nightly.
|
232
|
-
"@ledgerhq/live-signer-solana": "^0.5.4-nightly.
|
230
|
+
"@ledgerhq/live-signer-canton": "^0.2.3-nightly.3",
|
231
|
+
"@ledgerhq/live-signer-evm": "^0.7.2-nightly.2",
|
232
|
+
"@ledgerhq/live-signer-solana": "^0.5.4-nightly.3",
|
233
233
|
"@ledgerhq/live-wallet": "^0.12.3-nightly.1",
|
234
234
|
"@ledgerhq/logs": "^6.13.0",
|
235
235
|
"@ledgerhq/speculos-transport": "^0.2.9-nightly.2",
|
@@ -1,6 +1,9 @@
|
|
1
1
|
import type { CryptoAssetsStore } from "@ledgerhq/types-live";
|
2
2
|
import { TokenCurrency } from "@ledgerhq/types-cryptoassets";
|
3
3
|
|
4
|
+
// Coins with case-sensitive addresses (b58, ...)
|
5
|
+
const CASE_SENSITIVE_COINS = ["solana"];
|
6
|
+
|
4
7
|
export class CALStore implements CryptoAssetsStore {
|
5
8
|
private tokenCache = new Map<string, TokenCurrency>();
|
6
9
|
private addressCache = new Map<string, TokenCurrency>();
|
@@ -10,14 +13,22 @@ export class CALStore implements CryptoAssetsStore {
|
|
10
13
|
tokens.forEach(token => {
|
11
14
|
this.tokenCache.set(token.id, token);
|
12
15
|
if (token.contractAddress) {
|
13
|
-
|
16
|
+
const isCaseSensitive = CASE_SENSITIVE_COINS.includes(token.parentCurrency.id);
|
17
|
+
const normalizedAddress = isCaseSensitive
|
18
|
+
? token.contractAddress
|
19
|
+
: token.contractAddress.toLowerCase();
|
20
|
+
this.addressCache.set(normalizedAddress, token);
|
14
21
|
}
|
15
22
|
this.tickerCache.set(token.ticker, token);
|
16
23
|
});
|
17
24
|
}
|
18
25
|
|
19
26
|
findTokenByAddress(address: string): TokenCurrency | undefined {
|
20
|
-
|
27
|
+
const exactMatch = this.addressCache.get(address);
|
28
|
+
if (exactMatch) return exactMatch;
|
29
|
+
|
30
|
+
const lowercaseMatch = this.addressCache.get(address.toLowerCase());
|
31
|
+
return lowercaseMatch;
|
21
32
|
}
|
22
33
|
|
23
34
|
getTokenById(id: string): TokenCurrency {
|
@@ -33,10 +44,16 @@ export class CALStore implements CryptoAssetsStore {
|
|
33
44
|
}
|
34
45
|
|
35
46
|
findTokenByAddressInCurrency(address: string, currencyId: string): TokenCurrency | undefined {
|
36
|
-
const
|
37
|
-
|
38
|
-
|
47
|
+
const isCaseSensitive = CASE_SENSITIVE_COINS.includes(currencyId);
|
48
|
+
|
49
|
+
if (isCaseSensitive) {
|
50
|
+
const token = this.addressCache.get(address);
|
51
|
+
if (token && token.parentCurrency.id === currencyId) return token;
|
52
|
+
return undefined;
|
39
53
|
}
|
54
|
+
|
55
|
+
const token = this.addressCache.get(address.toLowerCase());
|
56
|
+
if (token && token.parentCurrency.id === currencyId) return token;
|
40
57
|
return undefined;
|
41
58
|
}
|
42
59
|
|
@@ -1,16 +1,19 @@
|
|
1
1
|
import { createApi as createXrpApi } from "@ledgerhq/coin-xrp/api/index";
|
2
2
|
import { createApi as createStellarApi } from "@ledgerhq/coin-stellar/api/index";
|
3
|
+
import { createApi as createCantonApi } from "@ledgerhq/coin-canton/api/index";
|
4
|
+
import { createApi as createTronApi } from "@ledgerhq/coin-tron/api/index";
|
3
5
|
import { getCurrencyConfiguration } from "../../../config";
|
4
6
|
import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets/currencies";
|
5
7
|
import { getNetworkAlpacaApi } from "./network/network-alpaca";
|
6
8
|
import { Api } from "@ledgerhq/coin-framework/api/types";
|
7
9
|
import { XrpCoinConfig } from "@ledgerhq/coin-xrp/config";
|
8
10
|
import { StellarCoinConfig } from "@ledgerhq/coin-stellar/config";
|
11
|
+
import { CantonCoinConfig } from "@ledgerhq/coin-canton/config";
|
12
|
+
import { TronCoinConfig } from "@ledgerhq/coin-tron/config";
|
9
13
|
|
10
14
|
export function getAlpacaApi(network, kind): Api<any> {
|
11
15
|
if (kind === "local") {
|
12
16
|
switch (network) {
|
13
|
-
case "ripple":
|
14
17
|
case "xrp":
|
15
18
|
return createXrpApi(
|
16
19
|
getCurrencyConfiguration<XrpCoinConfig>(getCryptoCurrencyById("ripple")),
|
@@ -19,6 +22,16 @@ export function getAlpacaApi(network, kind): Api<any> {
|
|
19
22
|
return createStellarApi(
|
20
23
|
getCurrencyConfiguration<StellarCoinConfig>(getCryptoCurrencyById("stellar")),
|
21
24
|
) as Api<any>;
|
25
|
+
case "canton":
|
26
|
+
return createCantonApi(
|
27
|
+
getCurrencyConfiguration<CantonCoinConfig>(
|
28
|
+
getCryptoCurrencyById("canton_network_devnet"),
|
29
|
+
),
|
30
|
+
) as Api<any>;
|
31
|
+
case "tron":
|
32
|
+
return createTronApi(
|
33
|
+
getCurrencyConfiguration<TronCoinConfig>(getCryptoCurrencyById("tron")),
|
34
|
+
) as Api<any>;
|
22
35
|
}
|
23
36
|
}
|
24
37
|
return getNetworkAlpacaApi(network) satisfies Partial<Api<any>> as Api<any>;
|
@@ -0,0 +1,78 @@
|
|
1
|
+
import { getAlpacaApi } from "./index";
|
2
|
+
import * as xrpModule from "@ledgerhq/coin-xrp/api/index";
|
3
|
+
import * as stellarModule from "@ledgerhq/coin-stellar/api/index";
|
4
|
+
import * as cantonModule from "@ledgerhq/coin-canton/api/index";
|
5
|
+
import * as tronModule from "@ledgerhq/coin-tron/api/index";
|
6
|
+
import * as config from "../../../config";
|
7
|
+
import * as networkApi from "./network/network-alpaca";
|
8
|
+
import * as cryptoAssets from "@ledgerhq/cryptoassets/currencies";
|
9
|
+
|
10
|
+
const mockApiInstance = { mock: "api" };
|
11
|
+
|
12
|
+
jest.mock("@ledgerhq/cryptoassets/currencies", () => ({
|
13
|
+
getCryptoCurrencyById: jest.fn(),
|
14
|
+
}));
|
15
|
+
|
16
|
+
jest.mock("../../../config", () => ({
|
17
|
+
getCurrencyConfiguration: jest.fn(),
|
18
|
+
}));
|
19
|
+
|
20
|
+
jest.mock("@ledgerhq/coin-xrp/api/index", () => ({
|
21
|
+
createApi: jest.fn(),
|
22
|
+
}));
|
23
|
+
|
24
|
+
jest.mock("@ledgerhq/coin-stellar/api/index", () => ({
|
25
|
+
createApi: jest.fn(),
|
26
|
+
}));
|
27
|
+
|
28
|
+
jest.mock("@ledgerhq/coin-canton/api/index", () => ({
|
29
|
+
createApi: jest.fn(),
|
30
|
+
}));
|
31
|
+
|
32
|
+
jest.mock("@ledgerhq/coin-tron/api/index", () => ({
|
33
|
+
createApi: jest.fn(),
|
34
|
+
}));
|
35
|
+
|
36
|
+
jest.mock("./network/network-alpaca", () => ({
|
37
|
+
getNetworkAlpacaApi: jest.fn(),
|
38
|
+
}));
|
39
|
+
|
40
|
+
describe("getAlpacaApi", () => {
|
41
|
+
const mockCurrency = { id: "mock-currency" };
|
42
|
+
|
43
|
+
beforeEach(() => {
|
44
|
+
jest.clearAllMocks();
|
45
|
+
|
46
|
+
// Common mocks
|
47
|
+
(cryptoAssets.getCryptoCurrencyById as jest.Mock).mockReturnValue(mockCurrency);
|
48
|
+
(config.getCurrencyConfiguration as jest.Mock).mockReturnValue({ config: true });
|
49
|
+
|
50
|
+
// API mocks
|
51
|
+
jest.spyOn(xrpModule, "createApi").mockReturnValue(mockApiInstance as any);
|
52
|
+
jest.spyOn(stellarModule, "createApi").mockReturnValue(mockApiInstance as any);
|
53
|
+
jest.spyOn(cantonModule, "createApi").mockReturnValue(mockApiInstance as any);
|
54
|
+
jest.spyOn(tronModule, "createApi").mockReturnValue(mockApiInstance as any);
|
55
|
+
jest.spyOn(networkApi, "getNetworkAlpacaApi").mockReturnValue(mockApiInstance as any);
|
56
|
+
});
|
57
|
+
|
58
|
+
const testCases = [
|
59
|
+
{ network: "xrp", module: xrpModule, label: "XRP" },
|
60
|
+
{ network: "stellar", module: stellarModule, label: "Stellar" },
|
61
|
+
{ network: "tron", module: tronModule, label: "Tron" },
|
62
|
+
{ network: "canton", module: cantonModule, label: "Canton" },
|
63
|
+
];
|
64
|
+
|
65
|
+
testCases.forEach(({ network, module, label }) => {
|
66
|
+
it(`should return ${label} API for network "${network}" and kind "local"`, () => {
|
67
|
+
const result = getAlpacaApi(network, "local");
|
68
|
+
expect(result).toEqual(mockApiInstance);
|
69
|
+
expect(module.createApi).toHaveBeenCalledWith({ config: true });
|
70
|
+
});
|
71
|
+
});
|
72
|
+
|
73
|
+
it("should return network API for kind !== 'local'", () => {
|
74
|
+
const result = getAlpacaApi("xrp", "remote");
|
75
|
+
expect(networkApi.getNetworkAlpacaApi).toHaveBeenCalledWith("xrp");
|
76
|
+
expect(result).toEqual(mockApiInstance);
|
77
|
+
});
|
78
|
+
});
|