@ledgerhq/coin-tester-solana 1.6.2 → 1.7.0-nightly.20251126023856

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ledgerhq/coin-tester-solana",
3
- "version": "1.6.2",
3
+ "version": "1.7.0-nightly.20251126023856",
4
4
  "description": "Ledger Solana Coin Tester",
5
5
  "main": "src/scenarii.test.ts",
6
6
  "keywords": [
@@ -49,14 +49,14 @@
49
49
  "bignumber.js": "^9",
50
50
  "docker-compose": "^1",
51
51
  "msw": "^2",
52
- "@ledgerhq/coin-framework": "^6.9.0",
53
- "@ledgerhq/coin-tester": "^0.12.0",
54
- "@ledgerhq/coin-solana": "^0.37.0",
55
- "@ledgerhq/cryptoassets": "^13.33.0",
56
- "@ledgerhq/live-env": "^2.21.0",
57
- "@ledgerhq/live-signer-solana": "^0.6.1",
52
+ "@ledgerhq/coin-framework": "^6.10.0-nightly.20251126023856",
53
+ "@ledgerhq/coin-tester": "^0.13.0-nightly.20251126023856",
54
+ "@ledgerhq/coin-solana": "^0.38.0-nightly.20251126023856",
55
+ "@ledgerhq/cryptoassets": "^13.34.0-nightly.20251126023856",
56
+ "@ledgerhq/live-env": "^2.21.1-nightly.20251126023856",
57
+ "@ledgerhq/live-signer-solana": "^0.6.2-nightly.20251126023856",
58
58
  "@ledgerhq/types-cryptoassets": "^7.30.0",
59
- "@ledgerhq/types-live": "^6.89.0"
59
+ "@ledgerhq/types-live": "^6.90.0-nightly.20251126023856"
60
60
  },
61
61
  "devDependencies": {
62
62
  "@types/jest": "^29",
package/src/fixtures.ts CHANGED
@@ -1,26 +1,43 @@
1
- import { CryptoCurrency, TokenCurrency } from "@ledgerhq/types-cryptoassets";
1
+ import type { CryptoCurrency, TokenCurrency } from "@ledgerhq/types-cryptoassets";
2
2
  import { decodeAccountId } from "@ledgerhq/coin-framework/account";
3
3
  import { getDerivationScheme, runDerivationScheme } from "@ledgerhq/coin-framework/derivation";
4
4
  import { TokenAccount } from "@ledgerhq/types-live";
5
5
  import BigNumber from "bignumber.js";
6
6
  import { SolanaAccount } from "@ledgerhq/coin-solana/types";
7
7
  import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets/currencies";
8
- import { tokensById } from "@ledgerhq/cryptoassets/legacy/legacy-state";
9
- import { initializeLegacyTokens } from "@ledgerhq/cryptoassets/legacy/legacy-data";
10
- import { addTokens } from "@ledgerhq/cryptoassets/legacy/legacy-utils";
8
+ import { setupMockCryptoAssetsStore } from "@ledgerhq/cryptoassets/cal-client/test-helpers";
11
9
  import { HttpResponse, http } from "msw";
12
10
  import { setupServer } from "msw/node";
13
11
 
14
- initializeLegacyTokens(addTokens);
15
-
16
12
  export const RECIPIENT = "Hj69wRzkrFuf1Nby4yzPEFHdsmQdMoVYjvDKZSLjZFEp";
17
13
  export const SOLANA = getCryptoCurrencyById("solana");
18
- const solanaUsdc = tokensById["solana/spl/epjfwdd5aufqssqem2qn1xzybapc8g4weggkzwytdt1v"];
19
- if (!solanaUsdc) throw new Error("Solana USDC token not found");
20
- export const SOLANA_USDC = solanaUsdc;
21
- const solanaCwif = tokensById["solana/spl/7atgf8kqo4wjrd5atgx7t1v2zvvykpjbffnevf1icfv1"];
22
- if (!solanaCwif) throw new Error("Solana CWIF token not found");
23
- export const SOLANA_CWIF = solanaCwif;
14
+
15
+ export const SOLANA_USDC: TokenCurrency = {
16
+ type: "TokenCurrency",
17
+ id: "solana/spl/epjfwdd5aufqssqem2qn1xzybapc8g4weggkzwytdt1v",
18
+ contractAddress: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
19
+ parentCurrency: SOLANA,
20
+ tokenType: "spl",
21
+ name: "USD Coin",
22
+ ticker: "USDC",
23
+ delisted: false,
24
+ disableCountervalue: false,
25
+ units: [{ name: "USDC", code: "USDC", magnitude: 6 }],
26
+ } as TokenCurrency;
27
+
28
+ export const SOLANA_CWIF: TokenCurrency = {
29
+ type: "TokenCurrency",
30
+ id: "solana/spl/7atgf8kqo4wjrd5atgx7t1v2zvvykpjbffnevf1icfv1",
31
+ contractAddress: "7atgF8KQo4wJrD5ATGX7t1V2zVvykPJbFfNeVf1icFv1",
32
+ parentCurrency: SOLANA,
33
+ tokenType: "spl",
34
+ name: "Catwifhat",
35
+ ticker: "CWIF",
36
+ delisted: false,
37
+ disableCountervalue: false,
38
+ units: [{ name: "CWIF", code: "CWIF", magnitude: 2 }],
39
+ } as TokenCurrency;
40
+
24
41
  export const SOLANA_VIRTUAL: TokenCurrency = {
25
42
  type: "TokenCurrency",
26
43
  id: "solana/spl/3iql8bfs2ve7mww4ehaqqhasbmrncrpxizwat2zfyr9y",
@@ -30,7 +47,32 @@ export const SOLANA_VIRTUAL: TokenCurrency = {
30
47
  contractAddress: "3iQL8BFS2vE7mww4ehAqQHAsbmRNCrPxizWAT2Zfyr9y",
31
48
  parentCurrency: SOLANA,
32
49
  tokenType: "spl",
50
+ delisted: false,
51
+ disableCountervalue: false,
33
52
  };
53
+
54
+ setupMockCryptoAssetsStore({
55
+ findTokenByAddressInCurrency: async (address: string, currencyId: string) => {
56
+ if (currencyId !== "solana") return undefined;
57
+ const normalizedAddress = address.toLowerCase();
58
+ if (normalizedAddress === SOLANA_USDC.contractAddress.toLowerCase()) {
59
+ return SOLANA_USDC;
60
+ }
61
+ if (normalizedAddress === SOLANA_CWIF.contractAddress.toLowerCase()) {
62
+ return SOLANA_CWIF;
63
+ }
64
+ if (normalizedAddress === SOLANA_VIRTUAL.contractAddress.toLowerCase()) {
65
+ return SOLANA_VIRTUAL;
66
+ }
67
+ return undefined;
68
+ },
69
+ findTokenById: async (id: string) => {
70
+ if (id === SOLANA_USDC.id) return SOLANA_USDC;
71
+ if (id === SOLANA_CWIF.id) return SOLANA_CWIF;
72
+ if (id === SOLANA_VIRTUAL.id) return SOLANA_VIRTUAL;
73
+ return undefined;
74
+ },
75
+ });
34
76
  export const WITHDRAWABLE_AMOUNT = 2e9;
35
77
 
36
78
  export const makeAccount = (
@@ -31,7 +31,6 @@ import {
31
31
  } from "../connection";
32
32
  import { Config, getChainAPI } from "@ledgerhq/coin-solana/network/index";
33
33
  import { makeBridges } from "@ledgerhq/coin-solana/bridge/bridge";
34
- import { addTokens } from "@ledgerhq/cryptoassets/legacy/legacy-utils";
35
34
 
36
35
  global.console = require("console");
37
36
  jest.setTimeout(100_000);
@@ -435,17 +434,18 @@ export const scenarioSolana: Scenario<SolanaTransaction, SolanaAccount> = {
435
434
  type: "active",
436
435
  },
437
436
  token2022Enabled: true,
438
- queuedInterval: 100,
439
437
  legacyOCMSMaxVersion: "1.8.0",
440
438
  });
441
439
  solanaCoinConfig.setCoinConfig(coinConfig);
442
- // Make sure the cache is not used, otherwise data is not refreshed frequently
443
- // enough to work within the context of the coin tester
444
- const getAPI = (config: Config) => Promise.resolve(getChainAPI(config));
440
+ const chainAPICache = new Map<string, ReturnType<typeof getChainAPI>>();
445
441
  const { accountBridge, currencyBridge } = makeBridges({
446
- getAPI,
447
- getQueuedAPI: getAPI,
448
- getQueuedAndCachedAPI: getAPI,
442
+ getAPI: (config: Config) => {
443
+ const endpoint = config.endpoint;
444
+ if (!chainAPICache.has(endpoint)) {
445
+ chainAPICache.set(endpoint, getChainAPI(config));
446
+ }
447
+ return chainAPICache.get(endpoint)!;
448
+ },
449
449
  signerContext,
450
450
  });
451
451
 
@@ -454,7 +454,6 @@ export const scenarioSolana: Scenario<SolanaTransaction, SolanaAccount> = {
454
454
  await createSplAccount(account.freshAddress, SOLANA_USDC, 5, "spl-token");
455
455
  await createSplAccount(account.freshAddress, SOLANA_CWIF, 5, "spl-token-2022");
456
456
  // Token not supported on LL as of 09/06/2025
457
- addTokens([SOLANA_VIRTUAL]);
458
457
  await createSplAccount(account.freshAddress, SOLANA_VIRTUAL, 5, "spl-token");
459
458
  await initVoteAccount();
460
459
  await initStakeAccount(account.freshAddress, WITHDRAWABLE_AMOUNT);
@@ -2,10 +2,8 @@ import { executeScenario } from "@ledgerhq/coin-tester/main";
2
2
  import { killSpeculos } from "@ledgerhq/coin-tester/signers/speculos";
3
3
  import { scenarioSolana } from "./scenarii/solana";
4
4
  import { killAgave } from "./agave";
5
- import { legacyCryptoAssetsStore } from "@ledgerhq/cryptoassets/legacy/legacy-store";
6
- import { initializeLegacyTokens } from "@ledgerhq/cryptoassets/legacy/legacy-data";
7
- import { addTokens } from "@ledgerhq/cryptoassets/legacy/legacy-utils";
8
- import { setCryptoAssetsStoreGetter } from "@ledgerhq/coin-solana/cryptoAssetsStore";
5
+ // Import fixtures to setup mock store
6
+ import "./fixtures";
9
7
 
10
8
  ["exit", "SIGINT", "SIGQUIT", "SIGTERM", "SIGUSR1", "SIGUSR2", "uncaughtException"].map(e =>
11
9
  process.on(e, async () => {
@@ -13,9 +11,6 @@ import { setCryptoAssetsStoreGetter } from "@ledgerhq/coin-solana/cryptoAssetsSt
13
11
  }),
14
12
  );
15
13
 
16
- initializeLegacyTokens(addTokens);
17
- setCryptoAssetsStoreGetter(() => legacyCryptoAssetsStore);
18
-
19
14
  describe("Solana Deterministic Tester", () => {
20
15
  it("scenario Solana", async () => {
21
16
  try {