@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.
Files changed (24) hide show
  1. package/lib/bridge/crypto-assets/cal-store.d.ts.map +1 -1
  2. package/lib/bridge/crypto-assets/cal-store.js +21 -5
  3. package/lib/bridge/crypto-assets/cal-store.js.map +1 -1
  4. package/lib/bridge/generic-alpaca/alpaca/index.d.ts.map +1 -1
  5. package/lib/bridge/generic-alpaca/alpaca/index.js +6 -1
  6. package/lib/bridge/generic-alpaca/alpaca/index.js.map +1 -1
  7. package/lib/bridge/generic-alpaca/alpaca/index.unit.test.d.ts +2 -0
  8. package/lib/bridge/generic-alpaca/alpaca/index.unit.test.d.ts.map +1 -0
  9. package/lib/bridge/generic-alpaca/alpaca/index.unit.test.js +89 -0
  10. package/lib/bridge/generic-alpaca/alpaca/index.unit.test.js.map +1 -0
  11. package/lib-es/bridge/crypto-assets/cal-store.d.ts.map +1 -1
  12. package/lib-es/bridge/crypto-assets/cal-store.js +21 -5
  13. package/lib-es/bridge/crypto-assets/cal-store.js.map +1 -1
  14. package/lib-es/bridge/generic-alpaca/alpaca/index.d.ts.map +1 -1
  15. package/lib-es/bridge/generic-alpaca/alpaca/index.js +6 -1
  16. package/lib-es/bridge/generic-alpaca/alpaca/index.js.map +1 -1
  17. package/lib-es/bridge/generic-alpaca/alpaca/index.unit.test.d.ts +2 -0
  18. package/lib-es/bridge/generic-alpaca/alpaca/index.unit.test.d.ts.map +1 -0
  19. package/lib-es/bridge/generic-alpaca/alpaca/index.unit.test.js +64 -0
  20. package/lib-es/bridge/generic-alpaca/alpaca/index.unit.test.js.map +1 -0
  21. package/package.json +11 -11
  22. package/src/bridge/crypto-assets/cal-store.ts +22 -5
  23. package/src/bridge/generic-alpaca/alpaca/index.ts +14 -1
  24. 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;AAE7D,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;IAUjC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI9D,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;IAQ5F,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;CAG7D"}
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
- this.addressCache.set(token.contractAddress, token);
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
- return this.addressCache.get(address);
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 token = this.addressCache.get(address);
32
- if (token && token.parentCurrency.id === currencyId) {
33
- return token;
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,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;aACrD;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,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxC,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,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,KAAK,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,KAAK,UAAU,EAAE;YACnD,OAAO,KAAK,CAAC;SACd;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,iBAAiB,CAAC,MAAc;QAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;CACF;AA1CD,4BA0CC"}
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":"AAKA,OAAO,EAAE,GAAG,EAAE,MAAM,oCAAoC,CAAC;AAIzD,wBAAgB,YAAY,CAAC,OAAO,KAAA,EAAE,IAAI,KAAA,GAAG,GAAG,CAAC,GAAG,CAAC,CAepD"}
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;AAK/D,SAAgB,YAAY,CAAC,OAAO,EAAE,IAAI;IACxC,IAAI,IAAI,KAAK,OAAO,EAAE;QACpB,QAAQ,OAAO,EAAE;YACf,KAAK,QAAQ,CAAC;YACd,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;SACjB;KACF;IACD,OAAO,IAAA,oCAAmB,EAAC,OAAO,CAAyC,CAAC;AAC9E,CAAC;AAfD,oCAeC"}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.unit.test.d.ts.map
@@ -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;AAE7D,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;IAUjC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI9D,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;IAQ5F,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;CAG7D"}
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
- this.addressCache.set(token.contractAddress, token);
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
- return this.addressCache.get(address);
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 token = this.addressCache.get(address);
29
- if (token && token.parentCurrency.id === currencyId) {
30
- return token;
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,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;aACrD;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,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxC,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,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,KAAK,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,KAAK,UAAU,EAAE;YACnD,OAAO,KAAK,CAAC;SACd;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,iBAAiB,CAAC,MAAc;QAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;CACF"}
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":"AAKA,OAAO,EAAE,GAAG,EAAE,MAAM,oCAAoC,CAAC;AAIzD,wBAAgB,YAAY,CAAC,OAAO,KAAA,EAAE,IAAI,KAAA,GAAG,GAAG,CAAC,GAAG,CAAC,CAepD"}
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;AAK/D,MAAM,UAAU,YAAY,CAAC,OAAO,EAAE,IAAI;IACxC,IAAI,IAAI,KAAK,OAAO,EAAE;QACpB,QAAQ,OAAO,EAAE;YACf,KAAK,QAAQ,CAAC;YACd,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;SACjB;KACF;IACD,OAAO,mBAAmB,CAAC,OAAO,CAAyC,CAAC;AAC9E,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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.unit.test.d.ts.map
@@ -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":"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"}
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",
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.1",
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.1",
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.1",
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.2",
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.2",
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.2",
231
- "@ledgerhq/live-signer-evm": "^0.7.2-nightly.1",
232
- "@ledgerhq/live-signer-solana": "^0.5.4-nightly.2",
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
- this.addressCache.set(token.contractAddress, token);
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
- return this.addressCache.get(address);
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 token = this.addressCache.get(address);
37
- if (token && token.parentCurrency.id === currencyId) {
38
- return token;
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
+ });