@ledgerhq/cryptoassets 13.32.0-nightly.2 → 13.32.0-nightly.3
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +11 -0
- package/lib/api-token-converter.d.ts +29 -0
- package/lib/api-token-converter.d.ts.map +1 -1
- package/lib/api-token-converter.js +101 -110
- package/lib/api-token-converter.js.map +1 -1
- package/lib/cal-client/entities/index.d.ts +12 -12
- package/lib/cal-client/entities/index.js +2 -2
- package/lib/cal-client/entities/index.js.map +1 -1
- package/lib/cal-client/state-manager/api.js +16 -17
- package/lib/cal-client/state-manager/api.js.map +1 -1
- package/lib-es/api-token-converter.d.ts +29 -0
- package/lib-es/api-token-converter.d.ts.map +1 -1
- package/lib-es/api-token-converter.js +99 -109
- package/lib-es/api-token-converter.js.map +1 -1
- package/lib-es/cal-client/entities/index.d.ts +12 -12
- package/lib-es/cal-client/entities/index.js +2 -2
- package/lib-es/cal-client/entities/index.js.map +1 -1
- package/lib-es/cal-client/state-manager/api.js +16 -17
- package/lib-es/cal-client/state-manager/api.js.map +1 -1
- package/package.json +2 -2
- package/src/api-token-converter.test.ts +217 -221
- package/src/api-token-converter.ts +124 -140
- package/src/cal-client/entities/index.ts +2 -2
- package/src/cal-client/state-manager/api.ts +18 -18
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
|
|
2
|
-
> @ledgerhq/cryptoassets@13.32.0-nightly.
|
|
2
|
+
> @ledgerhq/cryptoassets@13.32.0-nightly.2 build /home/runner/work/ledger-live/ledger-live/libs/ledgerjs/packages/cryptoassets
|
|
3
3
|
> tsc && tsc -m esnext --moduleResolution bundler --outDir lib-es
|
|
4
4
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# @ledgerhq/cryptoassets
|
|
2
2
|
|
|
3
|
+
## 13.32.0-nightly.3
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#12442](https://github.com/LedgerHQ/ledger-live/pull/12442) [`6ccabef`](https://github.com/LedgerHQ/ledger-live/commit/6ccabef8f3c4e8cc042299d531684595ebadcc55) Thanks [@gre-ledger](https://github.com/gre-ledger)! - Refactor api-token-converter to fix bad tokens data
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [[`77566c5`](https://github.com/LedgerHQ/ledger-live/commit/77566c5a3b5795f5938bd5daaa5f8d65934c56b8)]:
|
|
12
|
+
- @ledgerhq/types-live@6.88.0-nightly.3
|
|
13
|
+
|
|
3
14
|
## 13.32.0-nightly.2
|
|
4
15
|
|
|
5
16
|
### Minor Changes
|
|
@@ -13,6 +13,35 @@ export interface ApiTokenData {
|
|
|
13
13
|
delisted?: boolean;
|
|
14
14
|
disableCountervalue?: boolean;
|
|
15
15
|
tokenIdentifier?: string;
|
|
16
|
+
ledgerSignature?: string;
|
|
16
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Transforms Ledger Live token ID to backend API format for querying
|
|
20
|
+
*
|
|
21
|
+
* This handles cases where LL uses different ID conventions than backend APIs.
|
|
22
|
+
* Applied BEFORE querying the API to ensure the request uses the correct format:
|
|
23
|
+
*
|
|
24
|
+
* - MultiversX: multiversx/esdt/* → elrond/esdt/* (API uses old name) [LIVE-22557]
|
|
25
|
+
* - Stellar: UPPERCASE → lowercase (API uses lowercase) [LIVE-22558]
|
|
26
|
+
*
|
|
27
|
+
* @param legacyId - Token ID in Ledger Live format
|
|
28
|
+
* @returns Token ID in backend API format
|
|
29
|
+
*/
|
|
30
|
+
export declare function legacyIdToApiId(legacyId: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Converts API token data to Ledger Live TokenCurrency format
|
|
33
|
+
*
|
|
34
|
+
* This function applies client-side transformations to reconcile differences between
|
|
35
|
+
* backend APIs (CAL/DaDa) and Ledger Live's expected token format:
|
|
36
|
+
*
|
|
37
|
+
* - MultiversX: elrond/esdt/* → multiversx/esdt/* [LIVE-22557]
|
|
38
|
+
* - Stellar: Normalizes casing to stellar/asset/UPPERCASE_ADDRESS and tokenType asset → stellar [LIVE-22558]
|
|
39
|
+
* - Cardano: Reconstructs contractAddress from policyId + tokenIdentifier [LIVE-22559]
|
|
40
|
+
* - Sui: Transforms tokenType from "coin" to "sui" [LIVE-22560]
|
|
41
|
+
* - TON Jetton: Removes name prefix from ID (ton/jetton/name_address → ton/jetton/address) [LIVE-22561]
|
|
42
|
+
*
|
|
43
|
+
* @param apiToken - Token data from backend API
|
|
44
|
+
* @returns TokenCurrency object in Ledger Live format, or undefined if parent currency not found
|
|
45
|
+
*/
|
|
17
46
|
export declare function convertApiToken(apiToken: ApiTokenData): TokenCurrency | undefined;
|
|
18
47
|
//# sourceMappingURL=api-token-converter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-token-converter.d.ts","sourceRoot":"","sources":["../src/api-token-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"api-token-converter.d.ts","sourceRoot":"","sources":["../src/api-token-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAGlE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAcxD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,aAAa,GAAG,SAAS,CAmFjF"}
|
|
@@ -1,118 +1,109 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.convertApiToken = void 0;
|
|
4
|
-
const
|
|
3
|
+
exports.convertApiToken = exports.legacyIdToApiId = void 0;
|
|
4
|
+
const currencies_1 = require("./currencies");
|
|
5
|
+
/**
|
|
6
|
+
* Transforms Ledger Live token ID to backend API format for querying
|
|
7
|
+
*
|
|
8
|
+
* This handles cases where LL uses different ID conventions than backend APIs.
|
|
9
|
+
* Applied BEFORE querying the API to ensure the request uses the correct format:
|
|
10
|
+
*
|
|
11
|
+
* - MultiversX: multiversx/esdt/* → elrond/esdt/* (API uses old name) [LIVE-22557]
|
|
12
|
+
* - Stellar: UPPERCASE → lowercase (API uses lowercase) [LIVE-22558]
|
|
13
|
+
*
|
|
14
|
+
* @param legacyId - Token ID in Ledger Live format
|
|
15
|
+
* @returns Token ID in backend API format
|
|
16
|
+
*/
|
|
17
|
+
function legacyIdToApiId(legacyId) {
|
|
18
|
+
let apiId = legacyId;
|
|
19
|
+
// LIVE-22557: MultiversX - API uses old "elrond" name
|
|
20
|
+
if (apiId.startsWith("multiversx/esdt/")) {
|
|
21
|
+
apiId = apiId.replace("multiversx/esdt/", "elrond/esdt/");
|
|
22
|
+
}
|
|
23
|
+
// LIVE-22558: Stellar - API uses all lowercase (including the address part)
|
|
24
|
+
if (apiId.startsWith("stellar/asset/")) {
|
|
25
|
+
apiId = apiId.toLowerCase();
|
|
26
|
+
}
|
|
27
|
+
return apiId;
|
|
28
|
+
}
|
|
29
|
+
exports.legacyIdToApiId = legacyIdToApiId;
|
|
30
|
+
/**
|
|
31
|
+
* Converts API token data to Ledger Live TokenCurrency format
|
|
32
|
+
*
|
|
33
|
+
* This function applies client-side transformations to reconcile differences between
|
|
34
|
+
* backend APIs (CAL/DaDa) and Ledger Live's expected token format:
|
|
35
|
+
*
|
|
36
|
+
* - MultiversX: elrond/esdt/* → multiversx/esdt/* [LIVE-22557]
|
|
37
|
+
* - Stellar: Normalizes casing to stellar/asset/UPPERCASE_ADDRESS and tokenType asset → stellar [LIVE-22558]
|
|
38
|
+
* - Cardano: Reconstructs contractAddress from policyId + tokenIdentifier [LIVE-22559]
|
|
39
|
+
* - Sui: Transforms tokenType from "coin" to "sui" [LIVE-22560]
|
|
40
|
+
* - TON Jetton: Removes name prefix from ID (ton/jetton/name_address → ton/jetton/address) [LIVE-22561]
|
|
41
|
+
*
|
|
42
|
+
* @param apiToken - Token data from backend API
|
|
43
|
+
* @returns TokenCurrency object in Ledger Live format, or undefined if parent currency not found
|
|
44
|
+
*/
|
|
5
45
|
function convertApiToken(apiToken) {
|
|
6
|
-
const { standard, id, contractAddress, name, ticker, units, delisted = false } = apiToken;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return (0, legacy_utils_1.convertMultiversXESDTTokens)(esdtData);
|
|
44
|
-
}
|
|
45
|
-
case "trc10": {
|
|
46
|
-
const tokenId = parseInt(id.split("/")[2] || contractAddress);
|
|
47
|
-
const trc10Data = [
|
|
48
|
-
tokenId,
|
|
49
|
-
ticker,
|
|
50
|
-
name,
|
|
51
|
-
contractAddress,
|
|
52
|
-
magnitude,
|
|
53
|
-
delisted,
|
|
54
|
-
"",
|
|
55
|
-
];
|
|
56
|
-
return (0, legacy_utils_1.convertTRONTokens)("trc10")(trc10Data);
|
|
57
|
-
}
|
|
58
|
-
case "trc20": {
|
|
59
|
-
const tokenId = id.split("/")[2] || contractAddress;
|
|
60
|
-
const trc20Data = [
|
|
61
|
-
tokenId,
|
|
62
|
-
ticker,
|
|
63
|
-
name,
|
|
64
|
-
contractAddress,
|
|
65
|
-
magnitude,
|
|
66
|
-
delisted,
|
|
67
|
-
"",
|
|
68
|
-
];
|
|
69
|
-
return (0, legacy_utils_1.convertTRONTokens)("trc20")(trc20Data);
|
|
70
|
-
}
|
|
71
|
-
case "vip180": {
|
|
72
|
-
const tokenIdentifier = id.split("/")[2] || contractAddress;
|
|
73
|
-
const vip180Data = [tokenIdentifier, ticker, name, contractAddress, magnitude];
|
|
74
|
-
return (0, legacy_utils_1.convertVechainToken)(vip180Data);
|
|
75
|
-
}
|
|
76
|
-
case "native": {
|
|
77
|
-
const parentCurrencyId = id.split("/")[0];
|
|
78
|
-
if (parentCurrencyId !== "cardano")
|
|
79
|
-
return undefined;
|
|
80
|
-
const tokenIdentifier = id.split("/")[2] || contractAddress;
|
|
81
|
-
const parts = tokenIdentifier.split(".");
|
|
82
|
-
const [policyId, assetName = ""] = parts;
|
|
83
|
-
const cardanoData = [
|
|
84
|
-
"cardano",
|
|
85
|
-
policyId,
|
|
86
|
-
assetName,
|
|
87
|
-
name,
|
|
88
|
-
ticker,
|
|
89
|
-
magnitude,
|
|
90
|
-
delisted,
|
|
91
|
-
];
|
|
92
|
-
return (0, legacy_utils_1.convertCardanoNativeTokens)(cardanoData);
|
|
93
|
-
}
|
|
94
|
-
case "stellar": {
|
|
95
|
-
const parts = contractAddress.split(":");
|
|
96
|
-
const assetCode = parts[0] || ticker;
|
|
97
|
-
const assetIssuer = parts[1] || contractAddress;
|
|
98
|
-
const stellarData = [assetCode, assetIssuer, "stellar", name, magnitude];
|
|
99
|
-
return (0, legacy_utils_1.convertStellarTokens)(stellarData);
|
|
100
|
-
}
|
|
101
|
-
case "coin": {
|
|
102
|
-
const aptCoinData = [id, ticker, name, contractAddress, magnitude, delisted];
|
|
103
|
-
return (0, legacy_utils_1.convertAptCoinTokens)(aptCoinData);
|
|
104
|
-
}
|
|
105
|
-
case "fungible_asset": {
|
|
106
|
-
const aptFaData = [id, ticker, name, contractAddress, magnitude, delisted];
|
|
107
|
-
return (0, legacy_utils_1.convertAptFaTokens)(aptFaData);
|
|
108
|
-
}
|
|
109
|
-
case "sui": {
|
|
110
|
-
const suiData = [id, name, ticker, contractAddress, magnitude, ""];
|
|
111
|
-
return (0, legacy_utils_1.convertSuiTokens)(suiData);
|
|
46
|
+
const { standard, id, contractAddress, name, ticker, units, delisted = false, tokenIdentifier, ledgerSignature, } = apiToken;
|
|
47
|
+
// Apply client-side patches to reconcile CAL format with LL format
|
|
48
|
+
let patchedId = id;
|
|
49
|
+
let patchedContractAddress = contractAddress;
|
|
50
|
+
let patchedStandard = standard;
|
|
51
|
+
// Get parent currency from the ORIGINAL ID (before transformation)
|
|
52
|
+
// This is important for currencies that changed names (elrond -> multiversx)
|
|
53
|
+
const parentCurrencyId = id.split("/")[0];
|
|
54
|
+
const parentCurrency = (0, currencies_1.findCryptoCurrencyById)(parentCurrencyId);
|
|
55
|
+
if (!parentCurrency) {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
// LIVE-22557: MultiversX - Transform elrond/* to multiversx/*
|
|
59
|
+
if (patchedId.startsWith("elrond/esdt/")) {
|
|
60
|
+
patchedId = patchedId.replace("elrond/esdt/", "multiversx/esdt/");
|
|
61
|
+
}
|
|
62
|
+
// LIVE-22558: Stellar - Transform to LL mixed-case format: stellar/asset/ + UPPERCASE_REST
|
|
63
|
+
// Also fix tokenType: API returns "asset", LL expects "stellar"
|
|
64
|
+
const stellarPrefix = "stellar/asset/";
|
|
65
|
+
if (patchedId.toLowerCase().startsWith(stellarPrefix)) {
|
|
66
|
+
const rest = patchedId.substring(stellarPrefix.length);
|
|
67
|
+
patchedId = stellarPrefix + rest.toUpperCase();
|
|
68
|
+
patchedStandard = patchedStandard === "asset" ? "stellar" : patchedStandard;
|
|
69
|
+
}
|
|
70
|
+
// LIVE-22559: Cardano - Reconstruct full assetId (policyId + assetName)
|
|
71
|
+
if (standard === "native" && tokenIdentifier) {
|
|
72
|
+
patchedContractAddress = contractAddress + tokenIdentifier;
|
|
73
|
+
}
|
|
74
|
+
// LIVE-22560: Sui - Transform "coin" standard to "sui" tokenType (LL format)
|
|
75
|
+
if (standard === "coin" && patchedId.startsWith("sui/")) {
|
|
76
|
+
patchedStandard = "sui";
|
|
77
|
+
}
|
|
78
|
+
// LIVE-22561: TON Jetton - Remove name prefix from ID (API: ton/jetton/name_address -> LL: ton/jetton/address)
|
|
79
|
+
if (patchedId.startsWith("ton/jetton/") && patchedId.indexOf("_") > 0) {
|
|
80
|
+
const parts = patchedId.split("_");
|
|
81
|
+
if (parts.length === 2) {
|
|
82
|
+
patchedId = "ton/jetton/" + parts[1];
|
|
112
83
|
}
|
|
113
|
-
default:
|
|
114
|
-
return undefined;
|
|
115
84
|
}
|
|
85
|
+
// Construct TokenCurrency directly from API data
|
|
86
|
+
const tokenCurrency = {
|
|
87
|
+
type: "TokenCurrency",
|
|
88
|
+
id: patchedId,
|
|
89
|
+
contractAddress: patchedContractAddress,
|
|
90
|
+
parentCurrency,
|
|
91
|
+
tokenType: patchedStandard,
|
|
92
|
+
name,
|
|
93
|
+
ticker,
|
|
94
|
+
delisted,
|
|
95
|
+
disableCountervalue: !!parentCurrency.isTestnetFor || !!apiToken.disableCountervalue,
|
|
96
|
+
units: units.map(unit => ({
|
|
97
|
+
name: unit.name,
|
|
98
|
+
code: unit.code,
|
|
99
|
+
magnitude: unit.magnitude,
|
|
100
|
+
})),
|
|
101
|
+
};
|
|
102
|
+
// Add ledgerSignature if present
|
|
103
|
+
if (ledgerSignature) {
|
|
104
|
+
tokenCurrency.ledgerSignature = ledgerSignature;
|
|
105
|
+
}
|
|
106
|
+
return tokenCurrency;
|
|
116
107
|
}
|
|
117
108
|
exports.convertApiToken = convertApiToken;
|
|
118
109
|
//# sourceMappingURL=api-token-converter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-token-converter.js","sourceRoot":"","sources":["../src/api-token-converter.ts"],"names":[],"mappings":";;;AACA,
|
|
1
|
+
{"version":3,"file":"api-token-converter.js","sourceRoot":"","sources":["../src/api-token-converter.ts"],"names":[],"mappings":"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"}
|
|
@@ -65,7 +65,7 @@ export declare const ApiTokenResponseSchema: z.ZodObject<{
|
|
|
65
65
|
/** Chain ID */
|
|
66
66
|
chain_id: z.ZodString;
|
|
67
67
|
/** Token identifier */
|
|
68
|
-
token_identifier: z.ZodString
|
|
68
|
+
token_identifier: z.ZodOptional<z.ZodString>;
|
|
69
69
|
/** Network type */
|
|
70
70
|
network_type: z.ZodString;
|
|
71
71
|
/** Meta currency ID */
|
|
@@ -73,53 +73,53 @@ export declare const ApiTokenResponseSchema: z.ZodObject<{
|
|
|
73
73
|
/** Blockchain name */
|
|
74
74
|
blockchain_name: z.ZodString;
|
|
75
75
|
/** Live signature */
|
|
76
|
-
live_signature: z.ZodString
|
|
76
|
+
live_signature: z.ZodOptional<z.ZodString>;
|
|
77
77
|
}, "strip", z.ZodTypeAny, {
|
|
78
78
|
symbol: string;
|
|
79
79
|
id: string;
|
|
80
80
|
type: string;
|
|
81
81
|
name: string;
|
|
82
82
|
ticker: string;
|
|
83
|
-
delisted: boolean;
|
|
84
|
-
decimals: number;
|
|
85
|
-
network: string;
|
|
86
83
|
standard: string;
|
|
87
84
|
units: {
|
|
88
85
|
name: string;
|
|
89
86
|
magnitude: number;
|
|
90
87
|
code: string;
|
|
91
88
|
}[];
|
|
89
|
+
delisted: boolean;
|
|
90
|
+
decimals: number;
|
|
91
|
+
network: string;
|
|
92
92
|
contract_address: string;
|
|
93
93
|
network_family: string;
|
|
94
94
|
chain_id: string;
|
|
95
|
-
token_identifier: string;
|
|
96
95
|
network_type: string;
|
|
97
96
|
meta_currency_id: string;
|
|
98
97
|
blockchain_name: string;
|
|
99
|
-
|
|
98
|
+
token_identifier?: string | undefined;
|
|
99
|
+
live_signature?: string | undefined;
|
|
100
100
|
}, {
|
|
101
101
|
symbol: string;
|
|
102
102
|
id: string;
|
|
103
103
|
type: string;
|
|
104
104
|
name: string;
|
|
105
105
|
ticker: string;
|
|
106
|
-
delisted: boolean;
|
|
107
|
-
decimals: number;
|
|
108
|
-
network: string;
|
|
109
106
|
standard: string;
|
|
110
107
|
units: {
|
|
111
108
|
name: string;
|
|
112
109
|
magnitude: number;
|
|
113
110
|
code: string;
|
|
114
111
|
}[];
|
|
112
|
+
delisted: boolean;
|
|
113
|
+
decimals: number;
|
|
114
|
+
network: string;
|
|
115
115
|
contract_address: string;
|
|
116
116
|
network_family: string;
|
|
117
117
|
chain_id: string;
|
|
118
|
-
token_identifier: string;
|
|
119
118
|
network_type: string;
|
|
120
119
|
meta_currency_id: string;
|
|
121
120
|
blockchain_name: string;
|
|
122
|
-
|
|
121
|
+
token_identifier?: string | undefined;
|
|
122
|
+
live_signature?: string | undefined;
|
|
123
123
|
}>;
|
|
124
124
|
export type ApiTokenResponse = z.infer<typeof ApiTokenResponseSchema>;
|
|
125
125
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -44,7 +44,7 @@ exports.ApiTokenResponseSchema = zod_1.z.object({
|
|
|
44
44
|
/** Chain ID */
|
|
45
45
|
chain_id: zod_1.z.string(),
|
|
46
46
|
/** Token identifier */
|
|
47
|
-
token_identifier: zod_1.z.string(),
|
|
47
|
+
token_identifier: zod_1.z.string().optional(),
|
|
48
48
|
/** Network type */
|
|
49
49
|
network_type: zod_1.z.string(),
|
|
50
50
|
/** Meta currency ID */
|
|
@@ -52,6 +52,6 @@ exports.ApiTokenResponseSchema = zod_1.z.object({
|
|
|
52
52
|
/** Blockchain name */
|
|
53
53
|
blockchain_name: zod_1.z.string(),
|
|
54
54
|
/** Live signature */
|
|
55
|
-
live_signature: zod_1.z.string(),
|
|
55
|
+
live_signature: zod_1.z.string().optional(),
|
|
56
56
|
});
|
|
57
57
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cal-client/entities/index.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAExB;;GAEG;AACU,QAAA,eAAe,GAAG,OAAC,CAAC,MAAM,CAAC;IACtC,mCAAmC;IACnC,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,+BAA+B;IAC/B,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,qCAAqC;IACrC,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAIH;;GAEG;AACU,QAAA,sBAAsB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC7C,wCAAwC;IACxC,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,sCAAsC;IACtC,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;IACd,6BAA6B;IAC7B,gBAAgB,EAAE,OAAC,CAAC,MAAM,EAAE;IAC5B,+CAA+C;IAC/C,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;IACpB,yBAAyB;IACzB,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;IACpB,oDAAoD;IACpD,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;IACnB,8CAA8C;IAC9C,cAAc,EAAE,OAAC,CAAC,MAAM,EAAE;IAC1B,oCAAoC;IACpC,QAAQ,EAAE,OAAC,CAAC,OAAO,EAAE;IACrB,6BAA6B;IAC7B,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,oBAAoB;IACpB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE;IAClB,oCAAoC;IACpC,KAAK,EAAE,OAAC,CAAC,KAAK,CAAC,uBAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,aAAa;IACb,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE;IAClB,eAAe;IACf,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;IACpB,uBAAuB;IACvB,gBAAgB,EAAE,OAAC,CAAC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cal-client/entities/index.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAExB;;GAEG;AACU,QAAA,eAAe,GAAG,OAAC,CAAC,MAAM,CAAC;IACtC,mCAAmC;IACnC,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,+BAA+B;IAC/B,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,qCAAqC;IACrC,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAIH;;GAEG;AACU,QAAA,sBAAsB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC7C,wCAAwC;IACxC,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,sCAAsC;IACtC,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;IACd,6BAA6B;IAC7B,gBAAgB,EAAE,OAAC,CAAC,MAAM,EAAE;IAC5B,+CAA+C;IAC/C,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;IACpB,yBAAyB;IACzB,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;IACpB,oDAAoD;IACpD,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;IACnB,8CAA8C;IAC9C,cAAc,EAAE,OAAC,CAAC,MAAM,EAAE;IAC1B,oCAAoC;IACpC,QAAQ,EAAE,OAAC,CAAC,OAAO,EAAE;IACrB,6BAA6B;IAC7B,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,oBAAoB;IACpB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE;IAClB,oCAAoC;IACpC,KAAK,EAAE,OAAC,CAAC,KAAK,CAAC,uBAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,aAAa;IACb,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE;IAClB,eAAe;IACf,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;IACpB,uBAAuB;IACvB,gBAAgB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACvC,mBAAmB;IACnB,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE;IACxB,uBAAuB;IACvB,gBAAgB,EAAE,OAAC,CAAC,MAAM,EAAE;IAC5B,sBAAsB;IACtB,eAAe,EAAE,OAAC,CAAC,MAAM,EAAE;IAC3B,qBAAqB;IACrB,cAAc,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC"}
|
|
@@ -5,7 +5,7 @@ const react_1 = require("@reduxjs/toolkit/query/react");
|
|
|
5
5
|
const live_env_1 = require("@ledgerhq/live-env");
|
|
6
6
|
const types_1 = require("./types");
|
|
7
7
|
const fields_1 = require("./fields");
|
|
8
|
-
const
|
|
8
|
+
const api_token_converter_1 = require("../../api-token-converter");
|
|
9
9
|
function transformTokensResponse(response, meta) {
|
|
10
10
|
const nextCursor = meta?.response?.headers.get("x-ledger-next") || undefined;
|
|
11
11
|
return {
|
|
@@ -19,27 +19,26 @@ function transformTokensResponse(response, meta) {
|
|
|
19
19
|
};
|
|
20
20
|
}
|
|
21
21
|
function transformApiTokenToTokenCurrency(token) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
return undefined;
|
|
25
|
-
}
|
|
26
|
-
return {
|
|
27
|
-
type: "TokenCurrency",
|
|
22
|
+
// convertApiToken handles all format reconciliation internally
|
|
23
|
+
const result = (0, api_token_converter_1.convertApiToken)({
|
|
28
24
|
id: token.id,
|
|
29
|
-
ledgerSignature: token.live_signature,
|
|
30
25
|
contractAddress: token.contract_address,
|
|
31
|
-
parentCurrency,
|
|
32
|
-
tokenType: token.standard,
|
|
33
26
|
name: token.name,
|
|
34
27
|
ticker: token.ticker,
|
|
35
|
-
units: token.units
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
magnitude: unit.magnitude,
|
|
39
|
-
})),
|
|
28
|
+
units: token.units,
|
|
29
|
+
standard: token.standard,
|
|
30
|
+
tokenIdentifier: token.token_identifier,
|
|
40
31
|
delisted: token.delisted,
|
|
41
|
-
|
|
42
|
-
};
|
|
32
|
+
ledgerSignature: token.live_signature,
|
|
33
|
+
});
|
|
34
|
+
// Add symbol if result exists
|
|
35
|
+
if (result && token.symbol) {
|
|
36
|
+
return {
|
|
37
|
+
...result,
|
|
38
|
+
symbol: token.symbol,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
43
42
|
}
|
|
44
43
|
exports.cryptoAssetsApi = (0, react_1.createApi)({
|
|
45
44
|
reducerPath: "cryptoAssetsApi",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/cal-client/state-manager/api.ts"],"names":[],"mappings":";;;AAAA,wDAA6F;AAE7F,iDAA4C;AAC5C,mCAAmG;AACnG,qCAA+C;AAE/C,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/cal-client/state-manager/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,35 @@ export interface ApiTokenData {
|
|
|
13
13
|
delisted?: boolean;
|
|
14
14
|
disableCountervalue?: boolean;
|
|
15
15
|
tokenIdentifier?: string;
|
|
16
|
+
ledgerSignature?: string;
|
|
16
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Transforms Ledger Live token ID to backend API format for querying
|
|
20
|
+
*
|
|
21
|
+
* This handles cases where LL uses different ID conventions than backend APIs.
|
|
22
|
+
* Applied BEFORE querying the API to ensure the request uses the correct format:
|
|
23
|
+
*
|
|
24
|
+
* - MultiversX: multiversx/esdt/* → elrond/esdt/* (API uses old name) [LIVE-22557]
|
|
25
|
+
* - Stellar: UPPERCASE → lowercase (API uses lowercase) [LIVE-22558]
|
|
26
|
+
*
|
|
27
|
+
* @param legacyId - Token ID in Ledger Live format
|
|
28
|
+
* @returns Token ID in backend API format
|
|
29
|
+
*/
|
|
30
|
+
export declare function legacyIdToApiId(legacyId: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Converts API token data to Ledger Live TokenCurrency format
|
|
33
|
+
*
|
|
34
|
+
* This function applies client-side transformations to reconcile differences between
|
|
35
|
+
* backend APIs (CAL/DaDa) and Ledger Live's expected token format:
|
|
36
|
+
*
|
|
37
|
+
* - MultiversX: elrond/esdt/* → multiversx/esdt/* [LIVE-22557]
|
|
38
|
+
* - Stellar: Normalizes casing to stellar/asset/UPPERCASE_ADDRESS and tokenType asset → stellar [LIVE-22558]
|
|
39
|
+
* - Cardano: Reconstructs contractAddress from policyId + tokenIdentifier [LIVE-22559]
|
|
40
|
+
* - Sui: Transforms tokenType from "coin" to "sui" [LIVE-22560]
|
|
41
|
+
* - TON Jetton: Removes name prefix from ID (ton/jetton/name_address → ton/jetton/address) [LIVE-22561]
|
|
42
|
+
*
|
|
43
|
+
* @param apiToken - Token data from backend API
|
|
44
|
+
* @returns TokenCurrency object in Ledger Live format, or undefined if parent currency not found
|
|
45
|
+
*/
|
|
17
46
|
export declare function convertApiToken(apiToken: ApiTokenData): TokenCurrency | undefined;
|
|
18
47
|
//# sourceMappingURL=api-token-converter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-token-converter.d.ts","sourceRoot":"","sources":["../src/api-token-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"api-token-converter.d.ts","sourceRoot":"","sources":["../src/api-token-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAGlE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAcxD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,aAAa,GAAG,SAAS,CAmFjF"}
|