@ledgerhq/live-common 34.54.0-nightly.20251129023709 → 34.54.0-nightly.20251203101856

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 (153) hide show
  1. package/lib/__tests__/test-helpers/bridge.js +1 -1
  2. package/lib/__tests__/test-helpers/bridge.js.map +1 -1
  3. package/lib/__tests__/test-helpers/environment.js +1 -0
  4. package/lib/__tests__/test-helpers/environment.js.map +1 -1
  5. package/lib/account/index.d.ts +1 -0
  6. package/lib/account/index.d.ts.map +1 -1
  7. package/lib/account/index.js +4 -1
  8. package/lib/account/index.js.map +1 -1
  9. package/lib/account/recentAddresses.d.ts +10 -0
  10. package/lib/account/recentAddresses.d.ts.map +1 -0
  11. package/lib/account/recentAddresses.js +60 -0
  12. package/lib/account/recentAddresses.js.map +1 -0
  13. package/lib/e2e/index.d.ts +9 -3
  14. package/lib/e2e/index.d.ts.map +1 -1
  15. package/lib/exchange/swap/postSwapState.d.ts.map +1 -1
  16. package/lib/exchange/swap/postSwapState.js +10 -6
  17. package/lib/exchange/swap/postSwapState.js.map +1 -1
  18. package/lib/exchange/swap/types.d.ts +3 -1
  19. package/lib/exchange/swap/types.d.ts.map +1 -1
  20. package/lib/families/bitcoin/walletApiAdapter.d.ts.map +1 -1
  21. package/lib/families/bitcoin/walletApiAdapter.js +3 -0
  22. package/lib/families/bitcoin/walletApiAdapter.js.map +1 -1
  23. package/lib/families/polkadot/config.js +1 -1
  24. package/lib/families/polkadot/config.js.map +1 -1
  25. package/lib/featureFlags/defaultFeatures.d.ts.map +1 -1
  26. package/lib/featureFlags/defaultFeatures.js +3 -1
  27. package/lib/featureFlags/defaultFeatures.js.map +1 -1
  28. package/lib/featureFlags/useFeature.d.ts +1 -1
  29. package/lib/featureFlags/useFeature.d.ts.map +1 -1
  30. package/lib/helpers/cryptoIconSize.d.ts +3 -0
  31. package/lib/helpers/cryptoIconSize.d.ts.map +1 -0
  32. package/lib/helpers/cryptoIconSize.js +40 -0
  33. package/lib/helpers/cryptoIconSize.js.map +1 -0
  34. package/lib/helpers.d.ts +1 -0
  35. package/lib/helpers.d.ts.map +1 -1
  36. package/lib/helpers.js +15 -0
  37. package/lib/helpers.js.map +1 -1
  38. package/lib/hooks/useHtmlLinkSegments.d.ts +19 -0
  39. package/lib/hooks/useHtmlLinkSegments.d.ts.map +1 -0
  40. package/lib/hooks/useHtmlLinkSegments.js +128 -0
  41. package/lib/hooks/useHtmlLinkSegments.js.map +1 -0
  42. package/lib/hw/getAppAndVersion.d.ts +3 -1
  43. package/lib/hw/getAppAndVersion.d.ts.map +1 -1
  44. package/lib/hw/getAppAndVersion.js +2 -2
  45. package/lib/hw/getAppAndVersion.js.map +1 -1
  46. package/lib/wallet-api/Exchange/server.d.ts.map +1 -1
  47. package/lib/wallet-api/Exchange/server.js +4 -0
  48. package/lib/wallet-api/Exchange/server.js.map +1 -1
  49. package/lib-es/__tests__/test-helpers/bridge.js +1 -1
  50. package/lib-es/__tests__/test-helpers/bridge.js.map +1 -1
  51. package/lib-es/__tests__/test-helpers/environment.js +1 -0
  52. package/lib-es/__tests__/test-helpers/environment.js.map +1 -1
  53. package/lib-es/account/index.d.ts +1 -0
  54. package/lib-es/account/index.d.ts.map +1 -1
  55. package/lib-es/account/index.js +1 -0
  56. package/lib-es/account/index.js.map +1 -1
  57. package/lib-es/account/recentAddresses.d.ts +10 -0
  58. package/lib-es/account/recentAddresses.d.ts.map +1 -0
  59. package/lib-es/account/recentAddresses.js +55 -0
  60. package/lib-es/account/recentAddresses.js.map +1 -0
  61. package/lib-es/e2e/index.d.ts +9 -3
  62. package/lib-es/e2e/index.d.ts.map +1 -1
  63. package/lib-es/exchange/swap/postSwapState.d.ts.map +1 -1
  64. package/lib-es/exchange/swap/postSwapState.js +10 -6
  65. package/lib-es/exchange/swap/postSwapState.js.map +1 -1
  66. package/lib-es/exchange/swap/types.d.ts +3 -1
  67. package/lib-es/exchange/swap/types.d.ts.map +1 -1
  68. package/lib-es/families/bitcoin/walletApiAdapter.d.ts.map +1 -1
  69. package/lib-es/families/bitcoin/walletApiAdapter.js +3 -0
  70. package/lib-es/families/bitcoin/walletApiAdapter.js.map +1 -1
  71. package/lib-es/families/polkadot/config.js +1 -1
  72. package/lib-es/families/polkadot/config.js.map +1 -1
  73. package/lib-es/featureFlags/defaultFeatures.d.ts.map +1 -1
  74. package/lib-es/featureFlags/defaultFeatures.js +3 -1
  75. package/lib-es/featureFlags/defaultFeatures.js.map +1 -1
  76. package/lib-es/featureFlags/useFeature.d.ts +1 -1
  77. package/lib-es/featureFlags/useFeature.d.ts.map +1 -1
  78. package/lib-es/helpers/cryptoIconSize.d.ts +3 -0
  79. package/lib-es/helpers/cryptoIconSize.d.ts.map +1 -0
  80. package/lib-es/helpers/cryptoIconSize.js +35 -0
  81. package/lib-es/helpers/cryptoIconSize.js.map +1 -0
  82. package/lib-es/helpers.d.ts +1 -0
  83. package/lib-es/helpers.d.ts.map +1 -1
  84. package/lib-es/helpers.js +1 -0
  85. package/lib-es/helpers.js.map +1 -1
  86. package/lib-es/hooks/useHtmlLinkSegments.d.ts +19 -0
  87. package/lib-es/hooks/useHtmlLinkSegments.d.ts.map +1 -0
  88. package/lib-es/hooks/useHtmlLinkSegments.js +121 -0
  89. package/lib-es/hooks/useHtmlLinkSegments.js.map +1 -0
  90. package/lib-es/hw/getAppAndVersion.d.ts +3 -1
  91. package/lib-es/hw/getAppAndVersion.d.ts.map +1 -1
  92. package/lib-es/hw/getAppAndVersion.js +2 -2
  93. package/lib-es/hw/getAppAndVersion.js.map +1 -1
  94. package/lib-es/wallet-api/Exchange/server.d.ts.map +1 -1
  95. package/lib-es/wallet-api/Exchange/server.js +4 -0
  96. package/lib-es/wallet-api/Exchange/server.js.map +1 -1
  97. package/package.json +56 -64
  98. package/src/__tests__/test-helpers/bridge.ts +1 -1
  99. package/src/__tests__/test-helpers/environment.ts +1 -0
  100. package/src/account/index.ts +6 -0
  101. package/src/account/recentAddresses.test.ts +104 -0
  102. package/src/account/recentAddresses.ts +84 -0
  103. package/src/exchange/swap/postSwapState.ts +10 -5
  104. package/src/exchange/swap/types.ts +3 -1
  105. package/src/families/bitcoin/walletApiAdapter.test.ts +36 -0
  106. package/src/families/bitcoin/walletApiAdapter.ts +4 -0
  107. package/src/families/cosmos/datasets/__snapshots__/cosmos.integration.test.ts.snap +73 -4
  108. package/src/families/cosmos/datasets/__snapshots__/cryptoOrg.integration.test.ts.snap +2 -2
  109. package/src/families/cosmos/datasets/__snapshots__/injective.integration.test.ts.snap +2 -2
  110. package/src/families/cosmos/datasets/__snapshots__/mantra.integration.test.ts.snap +2 -2
  111. package/src/families/cosmos/datasets/__snapshots__/osmosis.integration.test.ts.snap +2 -2
  112. package/src/families/cosmos/datasets/__snapshots__/persistence.integration.test.ts.snap +4 -4
  113. package/src/families/cosmos/datasets/__snapshots__/stargaze.integration.test.ts.snap +2 -2
  114. package/src/families/polkadot/__snapshots__/bridge.integration.test.ts.snap +6 -3653
  115. package/src/families/polkadot/config.ts +1 -1
  116. package/src/featureFlags/defaultFeatures.ts +3 -1
  117. package/src/helpers/cryptoIconSize.ts +25 -0
  118. package/src/helpers.ts +2 -0
  119. package/src/hooks/__tests__/useHtmlLinkSegments.test.ts +105 -0
  120. package/src/hooks/useHtmlLinkSegments.ts +158 -0
  121. package/src/hw/getAppAndVersion.ts +2 -1
  122. package/src/wallet-api/Exchange/server.ts +5 -0
  123. package/lib/currencies/cryptoIcons.d.ts +0 -3
  124. package/lib/currencies/cryptoIcons.d.ts.map +0 -1
  125. package/lib/currencies/cryptoIcons.js +0 -24
  126. package/lib/currencies/cryptoIcons.js.map +0 -1
  127. package/lib/react.d.ts +0 -16
  128. package/lib/react.d.ts.map +0 -1
  129. package/lib/react.js +0 -64
  130. package/lib/react.js.map +0 -1
  131. package/lib/reactNative.d.ts +0 -16
  132. package/lib/reactNative.d.ts.map +0 -1
  133. package/lib/reactNative.js +0 -43
  134. package/lib/reactNative.js.map +0 -1
  135. package/lib-es/currencies/cryptoIcons.d.ts +0 -3
  136. package/lib-es/currencies/cryptoIcons.d.ts.map +0 -1
  137. package/lib-es/currencies/cryptoIcons.js +0 -20
  138. package/lib-es/currencies/cryptoIcons.js.map +0 -1
  139. package/lib-es/react.d.ts +0 -16
  140. package/lib-es/react.d.ts.map +0 -1
  141. package/lib-es/react.js +0 -33
  142. package/lib-es/react.js.map +0 -1
  143. package/lib-es/reactNative.d.ts +0 -16
  144. package/lib-es/reactNative.d.ts.map +0 -1
  145. package/lib-es/reactNative.js +0 -15
  146. package/lib-es/reactNative.js.map +0 -1
  147. package/react.js +0 -1
  148. package/reactNative.js +0 -1
  149. package/src/currencies/cryptoIcons.test.ts +0 -54
  150. package/src/currencies/cryptoIcons.ts +0 -21
  151. package/src/react.tsx +0 -43
  152. package/src/reactNative.ts +0 -23
  153. package/src/reactNativeSvg.d.ts +0 -19
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.54.0-nightly.20251129023709",
4
+ "version": "34.54.0-nightly.20251203101856",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/LedgerHQ/ledger-live.git"
@@ -81,16 +81,13 @@
81
81
  "files": [
82
82
  "lib",
83
83
  "lib-es",
84
- "src",
85
- "react.js",
86
- "reactNative.js"
84
+ "src"
87
85
  ],
88
86
  "peerDependencies": {
89
87
  "@tanstack/react-query": ">=5",
90
88
  "react": ">=16",
91
89
  "react-dom": ">=16",
92
90
  "react-native": ">=0.65.1",
93
- "react-native-svg": ">=12.1.1",
94
91
  "react-redux": "7.2.9",
95
92
  "redux-actions": "2.6.5"
96
93
  },
@@ -109,9 +106,6 @@
109
106
  },
110
107
  "redux-actions": {
111
108
  "optional": true
112
- },
113
- "react-native-svg": {
114
- "optional": true
115
109
  }
116
110
  },
117
111
  "react-native": {
@@ -120,12 +114,12 @@
120
114
  "dependencies": {
121
115
  "@blooo/hw-app-acre": "^1.1.1",
122
116
  "@cardano-foundation/ledgerjs-hw-app-cardano": "^7.1.2",
123
- "@ledgerhq/device-management-kit": "0.11.1",
117
+ "@ledgerhq/device-management-kit": "0.11.2",
124
118
  "@ledgerhq/speculos-device-controller": "0.1.0",
125
119
  "@ledgerhq/live-app-sdk": "^0.8.1",
126
- "@ledgerhq/wallet-api-client": "^1.12.5",
127
- "@ledgerhq/wallet-api-core": "^1.26.1",
128
- "@ledgerhq/wallet-api-server": "^2.0.0",
120
+ "@ledgerhq/wallet-api-client": "^1.12.6",
121
+ "@ledgerhq/wallet-api-core": "^1.27.0",
122
+ "@ledgerhq/wallet-api-server": "^2.0.1",
129
123
  "@noble/curves": "^1.9.7",
130
124
  "@noble/hashes": "1.8.0",
131
125
  "@reduxjs/toolkit": "2.8.2",
@@ -182,46 +176,45 @@
182
176
  "xstate": "^5.19.2",
183
177
  "yargs": "^17.0.0",
184
178
  "zod": "^3.22.4",
185
- "@ledgerhq/coin-algorand": "^0.14.0-nightly.20251129023709",
186
- "@ledgerhq/coin-aptos": "^3.6.1-nightly.20251129023709",
187
- "@ledgerhq/coin-bitcoin": "^0.25.1-nightly.20251129023709",
188
- "@ledgerhq/coin-canton": "^0.11.0-nightly.20251129023709",
189
- "@ledgerhq/coin-cardano": "^0.15.1-nightly.20251129023709",
190
- "@ledgerhq/coin-casper": "^2.4.1-nightly.20251129023709",
191
- "@ledgerhq/coin-celo": "^1.7.2-nightly.20251129023709",
192
- "@ledgerhq/coin-cosmos": "^0.20.1-nightly.20251129023709",
193
- "@ledgerhq/coin-evm": "^2.36.0-nightly.20251129023709",
194
- "@ledgerhq/coin-filecoin": "^1.15.0-nightly.20251129023709",
195
- "@ledgerhq/coin-framework": "^6.10.0-nightly.20251129023709",
196
- "@ledgerhq/coin-hedera": "^1.15.0-nightly.20251129023709",
197
- "@ledgerhq/coin-icon": "^0.15.1-nightly.20251129023709",
198
- "@ledgerhq/coin-internet_computer": "^1.11.1-nightly.20251129023709",
199
- "@ledgerhq/coin-kaspa": "^1.4.2-nightly.20251129023709",
200
- "@ledgerhq/coin-mina": "^1.4.2-nightly.20251129023709",
201
- "@ledgerhq/coin-multiversx": "^0.8.1-nightly.20251129023709",
202
- "@ledgerhq/coin-near": "^0.16.1-nightly.20251129023709",
203
- "@ledgerhq/coin-polkadot": "^6.13.1-nightly.20251129023709",
204
- "@ledgerhq/coin-solana": "^0.38.0-nightly.20251129023709",
205
- "@ledgerhq/coin-stacks": "^0.12.1-nightly.20251129023709",
206
- "@ledgerhq/coin-stellar": "^6.8.0-nightly.20251129023709",
207
- "@ledgerhq/coin-sui": "^0.18.1-nightly.20251129023709",
208
- "@ledgerhq/coin-tezos": "^6.10.0-nightly.20251129023709",
209
- "@ledgerhq/coin-ton": "^0.17.1-nightly.20251129023709",
210
- "@ledgerhq/coin-tron": "^5.7.1-nightly.20251129023709",
211
- "@ledgerhq/coin-vechain": "^2.12.2-nightly.20251129023709",
212
- "@ledgerhq/coin-xrp": "^7.9.0-nightly.20251129023709",
213
- "@ledgerhq/crypto-icons-ui": "^1.24.0-nightly.20251129023709",
214
- "@ledgerhq/cryptoassets": "^13.34.0-nightly.20251129023709",
215
- "@ledgerhq/device-core": "^0.6.9-nightly.20251129023709",
179
+ "@ledgerhq/coin-algorand": "^0.14.0-nightly.20251203101856",
180
+ "@ledgerhq/coin-aptos": "^3.6.1-nightly.20251203101856",
181
+ "@ledgerhq/coin-bitcoin": "^0.26.0-nightly.20251203101856",
182
+ "@ledgerhq/coin-canton": "^0.11.0-nightly.20251203101856",
183
+ "@ledgerhq/coin-cardano": "^0.15.1-nightly.20251203101856",
184
+ "@ledgerhq/coin-casper": "^2.4.1-nightly.20251203101856",
185
+ "@ledgerhq/coin-celo": "^1.7.2-nightly.20251203101856",
186
+ "@ledgerhq/coin-cosmos": "^0.21.0-nightly.20251203101856",
187
+ "@ledgerhq/coin-evm": "^2.36.0-nightly.20251203101856",
188
+ "@ledgerhq/coin-filecoin": "^1.15.0-nightly.20251203101856",
189
+ "@ledgerhq/coin-framework": "^6.10.0-nightly.20251203101856",
190
+ "@ledgerhq/coin-hedera": "^1.15.0-nightly.20251203101856",
191
+ "@ledgerhq/coin-icon": "^0.15.1-nightly.20251203101856",
192
+ "@ledgerhq/coin-internet_computer": "^1.11.1-nightly.20251203101856",
193
+ "@ledgerhq/coin-kaspa": "^1.4.2-nightly.20251203101856",
194
+ "@ledgerhq/coin-mina": "^1.4.2-nightly.20251203101856",
195
+ "@ledgerhq/coin-multiversx": "^0.8.1-nightly.20251203101856",
196
+ "@ledgerhq/coin-near": "^0.16.1-nightly.20251203101856",
197
+ "@ledgerhq/coin-polkadot": "^6.14.0-nightly.20251203101856",
198
+ "@ledgerhq/coin-solana": "^0.38.0-nightly.20251203101856",
199
+ "@ledgerhq/coin-stacks": "^0.12.1-nightly.20251203101856",
200
+ "@ledgerhq/coin-stellar": "^6.8.0-nightly.20251203101856",
201
+ "@ledgerhq/coin-sui": "^0.18.1-nightly.20251203101856",
202
+ "@ledgerhq/coin-tezos": "^6.10.0-nightly.20251203101856",
203
+ "@ledgerhq/coin-ton": "^0.17.1-nightly.20251203101856",
204
+ "@ledgerhq/coin-tron": "^5.7.1-nightly.20251203101856",
205
+ "@ledgerhq/coin-vechain": "^2.12.2-nightly.20251203101856",
206
+ "@ledgerhq/coin-xrp": "^7.9.0-nightly.20251203101856",
207
+ "@ledgerhq/cryptoassets": "^13.34.0-nightly.20251203101856",
208
+ "@ledgerhq/device-core": "^0.6.9-nightly.20251203101856",
216
209
  "@ledgerhq/devices": "8.7.0",
217
210
  "@ledgerhq/errors": "^6.27.0",
218
211
  "@ledgerhq/hw-app-algorand": "^6.31.9",
219
212
  "@ledgerhq/hw-app-aptos": "^6.34.9",
220
- "@ledgerhq/hw-app-btc": "^10.12.1-nightly.20251129023709",
221
- "@ledgerhq/hw-app-celo": "^6.35.4-nightly.20251129023709",
213
+ "@ledgerhq/hw-app-btc": "^10.12.1-nightly.20251203101856",
214
+ "@ledgerhq/hw-app-celo": "^6.35.4-nightly.20251203101856",
222
215
  "@ledgerhq/hw-app-cosmos": "^6.32.9",
223
- "@ledgerhq/hw-app-eth": "^7.0.0-nightly.20251129023709",
224
- "@ledgerhq/hw-app-exchange": "^0.18.0-nightly.20251129023709",
216
+ "@ledgerhq/hw-app-eth": "^7.0.0-nightly.20251203101856",
217
+ "@ledgerhq/hw-app-exchange": "^0.18.0-nightly.20251203101856",
225
218
  "@ledgerhq/hw-app-hedera": "^1.2.9",
226
219
  "@ledgerhq/hw-app-icon": "^1.3.9",
227
220
  "@ledgerhq/hw-app-kaspa": "^1.3.2",
@@ -232,29 +225,29 @@
232
225
  "@ledgerhq/hw-app-sui": "^1.4.0",
233
226
  "@ledgerhq/hw-app-tezos": "^6.31.9",
234
227
  "@ledgerhq/hw-app-trx": "^6.31.9",
235
- "@ledgerhq/hw-app-vet": "^0.8.0-nightly.20251129023709",
228
+ "@ledgerhq/hw-app-vet": "^0.8.0-nightly.20251203101856",
236
229
  "@ledgerhq/hw-app-xrp": "^6.32.7",
237
230
  "@ledgerhq/hw-bolos": "^6.32.9",
238
231
  "@ledgerhq/hw-transport": "6.31.13",
239
232
  "@ledgerhq/hw-transport-mocker": "^6.29.13",
240
- "@ledgerhq/ledger-cal-service": "^1.9.1-nightly.20251129023709",
241
- "@ledgerhq/ledger-trust-service": "^0.4.3-nightly.20251129023709",
233
+ "@ledgerhq/ledger-cal-service": "^1.9.1-nightly.20251203101856",
234
+ "@ledgerhq/ledger-trust-service": "^0.4.3-nightly.20251203101856",
242
235
  "@ledgerhq/live-config": "^3.2.0",
243
- "@ledgerhq/live-countervalues": "^0.10.1-nightly.20251129023709",
244
- "@ledgerhq/live-countervalues-react": "^0.7.3-nightly.20251129023709",
236
+ "@ledgerhq/live-countervalues": "^0.10.1-nightly.20251203101856",
237
+ "@ledgerhq/live-countervalues-react": "^0.7.3-nightly.20251203101856",
245
238
  "@ledgerhq/live-dmk-shared": "^0.15.0",
246
- "@ledgerhq/live-env": "^2.22.0-nightly.20251129023709",
239
+ "@ledgerhq/live-env": "^2.22.0-nightly.20251203101856",
247
240
  "@ledgerhq/live-hooks": "0.2.0",
248
- "@ledgerhq/live-network": "^2.1.2-nightly.20251129023709",
241
+ "@ledgerhq/live-network": "^2.1.2-nightly.20251203101856",
249
242
  "@ledgerhq/live-promise": "^0.1.1",
250
- "@ledgerhq/live-signer-canton": "^0.5.2-nightly.20251129023709",
251
- "@ledgerhq/live-signer-evm": "^0.10.2-nightly.20251129023709",
252
- "@ledgerhq/live-signer-solana": "^0.6.2-nightly.20251129023709",
253
- "@ledgerhq/live-wallet": "^0.16.1-nightly.20251129023709",
243
+ "@ledgerhq/live-signer-canton": "^0.5.2-nightly.20251203101856",
244
+ "@ledgerhq/live-signer-evm": "^0.10.2-nightly.20251203101856",
245
+ "@ledgerhq/live-signer-solana": "^0.6.2-nightly.20251203101856",
246
+ "@ledgerhq/live-wallet": "^0.16.1-nightly.20251203101856",
254
247
  "@ledgerhq/logs": "^6.13.0",
255
- "@ledgerhq/speculos-transport": "^0.3.0-nightly.20251129023709",
256
- "@ledgerhq/wallet-api-acre-module": "^0.10.0-nightly.20251129023709",
257
- "@ledgerhq/wallet-api-exchange-module": "^0.19.0-nightly.20251129023709"
248
+ "@ledgerhq/speculos-transport": "^0.3.0-nightly.20251203101856",
249
+ "@ledgerhq/wallet-api-acre-module": "^0.10.0-nightly.20251203101856",
250
+ "@ledgerhq/wallet-api-exchange-module": "^0.19.0-nightly.20251203101856"
258
251
  },
259
252
  "devDependencies": {
260
253
  "@solana/web3.js": "1.95.4",
@@ -292,7 +285,6 @@
292
285
  "react": "18.3.1",
293
286
  "react-dom": "18.3.1",
294
287
  "react-native": "0.77.3",
295
- "react-native-svg": "15.12.1",
296
288
  "react-test-renderer": "18.3.1",
297
289
  "redux-actions": "2.6.5",
298
290
  "timemachine": "^0.3.2",
@@ -302,10 +294,10 @@
302
294
  "undici": "6.19.2",
303
295
  "uuid": "^8.3.2",
304
296
  "ws": "7",
305
- "@ledgerhq/device-react": "^0.3.3-nightly.20251129023709",
297
+ "@ledgerhq/device-react": "^0.3.3-nightly.20251203101856",
306
298
  "@ledgerhq/types-cryptoassets": "^7.30.0",
307
299
  "@ledgerhq/types-devices": "^6.27.0",
308
- "@ledgerhq/types-live": "^6.90.0-nightly.20251129023709"
300
+ "@ledgerhq/types-live": "^6.90.0-nightly.20251203101856"
309
301
  },
310
302
  "scripts": {
311
303
  "build": "zx ./scripts/build-ts.mjs",
@@ -35,7 +35,7 @@ import { firstValueFrom } from "rxjs";
35
35
  const warnDev = process.env.CI ? (..._args) => {} : (...msg) => console.warn(...msg);
36
36
  // FIXME move out into DatasetTest to be defined in
37
37
  const blacklistOpsSumEq = {
38
- currencies: ["ripple", "ethereum", "tezos"],
38
+ currencies: ["ripple", "ethereum", "tezos", "assethub_polkadot"],
39
39
  impls: ["mock"],
40
40
  };
41
41
 
@@ -45,6 +45,7 @@ setSupportedCurrencies([
45
45
  "cosmos",
46
46
  "algorand",
47
47
  "polkadot",
48
+ "assethub_polkadot",
48
49
  "bitcoin_testnet",
49
50
  "bitcoin_regtest",
50
51
  "ethereum_sepolia",
@@ -16,3 +16,9 @@ export * from "./formatters";
16
16
  export * from "./helpers";
17
17
  export * from "./serialization";
18
18
  export * from "./support";
19
+ export {
20
+ RecentAddressesStore,
21
+ getRecentAddressesStore,
22
+ setupRecentAddressesStore,
23
+ RecentAddressesCache,
24
+ } from "./recentAddresses";
@@ -0,0 +1,104 @@
1
+ import { RecentAddressesStore, setupRecentAddressesStore, getRecentAddressesStore } from ".";
2
+ import { RECENT_ADDRESSES_COUNT_LIMIT } from "./recentAddresses";
3
+
4
+ describe("RecentAddressesStore", () => {
5
+ const onAddAddressCompleteMock = jest.fn();
6
+ let store: RecentAddressesStore;
7
+
8
+ beforeEach(() => {
9
+ onAddAddressCompleteMock.mockClear();
10
+ setupRecentAddressesStore({}, onAddAddressCompleteMock);
11
+ store = getRecentAddressesStore();
12
+ });
13
+
14
+ it("should add one address and return this only address", async () => {
15
+ const newAddress = "0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3";
16
+ await store.addAddress("ethereum", newAddress);
17
+ const addresses = store.getAddresses("ethereum");
18
+ expect(addresses).toEqual([newAddress]);
19
+ expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(1);
20
+ expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: [newAddress] });
21
+ });
22
+
23
+ it("should add a second address and return addresses sorted by insertion", async () => {
24
+ const newAddress = "0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3";
25
+ await store.addAddress("ethereum", newAddress);
26
+ let addresses = store.getAddresses("ethereum");
27
+ expect(addresses).toEqual([newAddress]);
28
+ expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(1);
29
+ expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: [newAddress] });
30
+
31
+ const newAddress2 = "0xB69B37A4Fb4A18b3258f974ff6e9f529AD2647b1";
32
+ await store.addAddress("ethereum", newAddress2);
33
+ addresses = store.getAddresses("ethereum");
34
+ expect(addresses).toEqual([newAddress2, newAddress]);
35
+ expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(2);
36
+ expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: [newAddress2, newAddress] });
37
+ });
38
+
39
+ it("should replace at first place when an address is already saved", async () => {
40
+ const newAddress = "0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3";
41
+ await store.addAddress("ethereum", newAddress);
42
+ let addresses = store.getAddresses("ethereum");
43
+ expect(addresses).toEqual([newAddress]);
44
+ expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(1);
45
+ expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: [newAddress] });
46
+
47
+ const newAddress2 = "0xB69B37A4Fb4A18b3258f974ff6e9f529AD2647b1";
48
+ await store.addAddress("ethereum", newAddress2);
49
+ addresses = store.getAddresses("ethereum");
50
+ expect(addresses).toEqual([newAddress2, newAddress]);
51
+ expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(2);
52
+ expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: [newAddress2, newAddress] });
53
+
54
+ await store.addAddress("ethereum", newAddress);
55
+ addresses = store.getAddresses("ethereum");
56
+ expect(addresses).toEqual([newAddress, newAddress2]);
57
+ expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(3);
58
+ expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: [newAddress, newAddress2] });
59
+ });
60
+
61
+ it("should replace at first place and remove last element when addresses exceed count limit", async () => {
62
+ let expectedAddresses: string[] = [];
63
+ for (let index = 0; index < RECENT_ADDRESSES_COUNT_LIMIT; index++) {
64
+ await store.addAddress("ethereum", `0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3${index}`);
65
+ expectedAddresses.unshift(`0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3${index}`);
66
+ }
67
+
68
+ let addresses = store.getAddresses("ethereum");
69
+ expect(addresses).toEqual(expectedAddresses);
70
+ expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(RECENT_ADDRESSES_COUNT_LIMIT);
71
+ expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: expectedAddresses });
72
+
73
+ const newAddress2 = "0xB69B37A4Fb4A18b3258f974ff6e9f529AD2647b1";
74
+ expectedAddresses.splice(expectedAddresses.length - 1, 1);
75
+ expectedAddresses = [newAddress2, ...expectedAddresses];
76
+
77
+ await store.addAddress("ethereum", newAddress2);
78
+ addresses = store.getAddresses("ethereum");
79
+ expect(addresses).toEqual(expectedAddresses);
80
+ expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(RECENT_ADDRESSES_COUNT_LIMIT + 1);
81
+ expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: expectedAddresses });
82
+ });
83
+
84
+ it("should add an address of a different currency", async () => {
85
+ const newAddress = "0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3";
86
+ await store.addAddress("ethereum", newAddress);
87
+
88
+ let addresses = store.getAddresses("ethereum");
89
+ expect(addresses).toEqual([newAddress]);
90
+ expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(1);
91
+ expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: [newAddress] });
92
+
93
+ const newAddress2 = "bc1pxlmrudqyq8qd8pfsc4mpmlaw56x6vtcr9m8nvp8kj3gckefc4kmqhkg4l7";
94
+ await store.addAddress("bitcoin", newAddress2);
95
+
96
+ addresses = store.getAddresses("bitcoin");
97
+ expect(addresses).toEqual([newAddress2]);
98
+ expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(2);
99
+ expect(onAddAddressCompleteMock).toHaveBeenCalledWith({
100
+ ethereum: [newAddress],
101
+ bitcoin: [newAddress2],
102
+ });
103
+ });
104
+ });
@@ -0,0 +1,84 @@
1
+ export const RECENT_ADDRESSES_COUNT_LIMIT = 12;
2
+
3
+ export type RecentAddressesCache = Record<string, string[]>;
4
+
5
+ export interface RecentAddressesStore {
6
+ addAddress(currency: string, address: string): void;
7
+ syncAddresses(cache: RecentAddressesCache): void;
8
+ getAddresses(currency: string): string[];
9
+ }
10
+
11
+ type CallbackMode = "triggerCallback" | "skipCallback";
12
+
13
+ let recentAddressesStore: RecentAddressesStore | null = null;
14
+
15
+ export function getRecentAddressesStore(): RecentAddressesStore {
16
+ if (recentAddressesStore === null) {
17
+ throw new Error(
18
+ "Recent addresses store instance is null, please call function setupRecentAddressesStore in application initialization",
19
+ );
20
+ }
21
+ return recentAddressesStore;
22
+ }
23
+
24
+ export function setupRecentAddressesStore(
25
+ addressesByCurrency: RecentAddressesCache,
26
+ onAddAddressComplete: (addressesByCurrency: RecentAddressesCache) => void,
27
+ ): void {
28
+ recentAddressesStore = new RecentAddressesStoreImpl(addressesByCurrency, onAddAddressComplete);
29
+ }
30
+
31
+ class RecentAddressesStoreImpl implements RecentAddressesStore {
32
+ private addressesByCurrency: RecentAddressesCache = {};
33
+ private readonly onAddAddressComplete: (addressesByCurrency: Record<string, string[]>) => void;
34
+
35
+ constructor(
36
+ addressesByCurrency: RecentAddressesCache,
37
+ onAddAddressComplete: (addressesByCurrency: RecentAddressesCache) => void,
38
+ ) {
39
+ this.addressesByCurrency = { ...addressesByCurrency };
40
+ this.onAddAddressComplete = onAddAddressComplete;
41
+ }
42
+
43
+ addAddress(currency: string, address: string): void {
44
+ this.addAddressToCache(currency, address, "triggerCallback");
45
+ }
46
+
47
+ syncAddresses(cache: RecentAddressesCache): void {
48
+ const previousAddresses = { ...this.addressesByCurrency };
49
+ this.addressesByCurrency = { ...cache };
50
+ for (const currency in previousAddresses) {
51
+ for (const address of previousAddresses[currency]) {
52
+ this.addAddressToCache(currency, address, "skipCallback");
53
+ }
54
+ }
55
+
56
+ this.onAddAddressComplete(this.addressesByCurrency);
57
+ }
58
+
59
+ getAddresses(currency: string): string[] {
60
+ const addresses = this.addressesByCurrency[currency];
61
+ return addresses ?? [];
62
+ }
63
+
64
+ private addAddressToCache(currency: string, address: string, callbackMode: CallbackMode): void {
65
+ if (!this.addressesByCurrency[currency]) {
66
+ this.addressesByCurrency[currency] = [];
67
+ }
68
+
69
+ const addresses = this.addressesByCurrency[currency];
70
+ const addressIndex = addresses.indexOf(address);
71
+ if (addressIndex !== -1) {
72
+ addresses.splice(addressIndex, 1);
73
+ } else if (addresses.length >= RECENT_ADDRESSES_COUNT_LIMIT) {
74
+ addresses.pop();
75
+ }
76
+
77
+ addresses.unshift(address);
78
+ this.addressesByCurrency[currency] = [...addresses];
79
+
80
+ if (callbackMode === "triggerCallback") {
81
+ this.onAddAddressComplete(this.addressesByCurrency);
82
+ }
83
+ }
84
+ }
@@ -106,6 +106,7 @@ export const postSwapCancelled: PostSwapCancelled = async ({
106
106
  seedIdTo,
107
107
  refundAddress,
108
108
  payoutAddress,
109
+ data,
109
110
  ...rest
110
111
  }) => {
111
112
  if (isIntegrationTestEnv()) return mockPostSwapCancelled({ provider, swapId, ...rest });
@@ -138,7 +139,8 @@ export const postSwapCancelled: PostSwapCancelled = async ({
138
139
 
139
140
  const shouldIncludeAddresses =
140
141
  rest.statusCode === "WrongDeviceForAccountPayout" ||
141
- rest.statusCode === "WrongDeviceForAccountRefund";
142
+ rest.statusCode === "WrongDeviceForAccountRefund" ||
143
+ rest.statusCode === "FeeNotLoaded";
142
144
 
143
145
  const requestData = {
144
146
  provider,
@@ -147,11 +149,14 @@ export const postSwapCancelled: PostSwapCancelled = async ({
147
149
  swapIntentWithoutProvider,
148
150
  payloadAddressMatchAccountAddress,
149
151
  fromAmount,
150
- fromAccountAddress: shouldIncludeAddresses ? fromAccountAddress : undefined,
151
- toAccountAddress: shouldIncludeAddresses ? toAccountAddress : undefined,
152
- payloadRefundAddress: shouldIncludeAddresses ? refundAddress : undefined,
153
- payloadPayoutAddress: shouldIncludeAddresses ? payoutAddress : undefined,
152
+ ...(shouldIncludeAddresses && {
153
+ fromAccountAddress,
154
+ toAccountAddress,
155
+ payloadRefundAddress: refundAddress,
156
+ payloadPayoutAddress: payoutAddress,
157
+ }),
154
158
  maybeSeedMatch: seedIdFrom === seedIdTo, // Only true if both accounts are from the same seed and from the same chain type
159
+ data,
155
160
  ...rest,
156
161
  };
157
162
 
@@ -214,7 +214,9 @@ export type SwapStateAcceptedRequest = SwapStateRequest & {
214
214
  transactionId: string;
215
215
  };
216
216
 
217
- export type SwapStateCancelledRequest = SwapStateRequest;
217
+ export type SwapStateCancelledRequest = SwapStateRequest & {
218
+ data?: string;
219
+ };
218
220
 
219
221
  export type PostSwapAccepted = (arg0: SwapStateAcceptedRequest) => Promise<null>;
220
222
 
@@ -122,6 +122,42 @@ describe("getPlatformTransactionSignFlowInfos", () => {
122
122
  "strategy": 0,
123
123
  },
124
124
  }
125
+ `);
126
+ });
127
+
128
+ test("with changeAddress provided", () => {
129
+ const btcPlatformTx: WalletAPITransaction = {
130
+ family: "bitcoin",
131
+ amount: new BigNumber(100000),
132
+ recipient: "0xABCDEF",
133
+ changeAddress: "1ChangeAddressExample",
134
+ };
135
+
136
+ const { canEditFees, hasFeesProvided, liveTx } = btc.getWalletAPITransactionSignFlowInfos({
137
+ walletApiTransaction: btcPlatformTx,
138
+ account: {} as Account,
139
+ });
140
+
141
+ expect(canEditFees).toBe(true);
142
+
143
+ expect(hasFeesProvided).toBe(false);
144
+
145
+ expect(liveTx).toMatchInlineSnapshot(`
146
+ {
147
+ "amount": "100000",
148
+ "changeAddress": "1ChangeAddressExample",
149
+ "family": "bitcoin",
150
+ "feePerByte": null,
151
+ "feesStrategy": "medium",
152
+ "networkInfo": null,
153
+ "rbf": false,
154
+ "recipient": "0xABCDEF",
155
+ "useAllAmount": false,
156
+ "utxoStrategy": {
157
+ "excludeUTXOs": [],
158
+ "strategy": 0,
159
+ },
160
+ }
125
161
  `);
126
162
  });
127
163
  });
@@ -35,6 +35,10 @@ const convertToLiveTransaction: ConvertToLiveTransaction<
35
35
  liveTx.opReturnData = walletApiTransaction.opReturnData;
36
36
  }
37
37
 
38
+ if (walletApiTransaction.changeAddress) {
39
+ liveTx.changeAddress = walletApiTransaction.changeAddress;
40
+ }
41
+
38
42
  if (hasFeesProvided) {
39
43
  liveTx.feesStrategy = null;
40
44
  }
@@ -3,7 +3,7 @@
3
3
  exports[`cosmos currency bridge scanAccounts cosmos seed 1 1`] = `
4
4
  [
5
5
  {
6
- "balance": "7291071",
6
+ "balance": "7289352",
7
7
  "currencyId": "cosmos",
8
8
  "derivationMode": "",
9
9
  "freshAddress": "cosmos1g84934jpu3v5de5yqukkkhxmcvsw3u2ajxvpdl",
@@ -12,14 +12,14 @@ exports[`cosmos currency bridge scanAccounts cosmos seed 1 1`] = `
12
12
  "index": 0,
13
13
  "pendingOperations": [],
14
14
  "seedIdentifier": "0388459b2653519948b12492f1a0b464720110c147a8155d23d423a5cc3c21d89a",
15
- "spendableBalance": "4656860",
15
+ "spendableBalance": "2655141",
16
16
  "swapHistory": [],
17
17
  "syncHash": undefined,
18
18
  "used": true,
19
19
  "xpub": "cosmos1g84934jpu3v5de5yqukkkhxmcvsw3u2ajxvpdl",
20
20
  },
21
21
  {
22
- "balance": "1095084",
22
+ "balance": "1095085",
23
23
  "currencyId": "cosmos",
24
24
  "derivationMode": "",
25
25
  "freshAddress": "cosmos108uy5q9jt59gwugq5yrdhkzcd9jryslmpcstk5",
@@ -28,7 +28,7 @@ exports[`cosmos currency bridge scanAccounts cosmos seed 1 1`] = `
28
28
  "index": 1,
29
29
  "pendingOperations": [],
30
30
  "seedIdentifier": "0388459b2653519948b12492f1a0b464720110c147a8155d23d423a5cc3c21d89a",
31
- "spendableBalance": "887584",
31
+ "spendableBalance": "887585",
32
32
  "swapHistory": [],
33
33
  "syncHash": undefined,
34
34
  "used": true,
@@ -783,6 +783,29 @@ exports[`cosmos currency bridge scanAccounts cosmos seed 1 2`] = `
783
783
  "type": "DELEGATE",
784
784
  "value": "9267",
785
785
  },
786
+ {
787
+ "accountId": "js:2:cosmos:cosmos1g84934jpu3v5de5yqukkkhxmcvsw3u2ajxvpdl:",
788
+ "blockHash": null,
789
+ "blockHeight": 28615251,
790
+ "extra": {
791
+ "memo": "Ledger Live",
792
+ "validators": [
793
+ {
794
+ "address": "cosmosvaloper10wljxpl03053h9690apmyeakly3ylhejrucvtm",
795
+ "amount": "1000000",
796
+ },
797
+ ],
798
+ },
799
+ "fee": "15217",
800
+ "hasFailed": false,
801
+ "hash": "37D1A48254F3C1DED61C1C6E093595A750CBF5C79BBACD10A34DE6B70C3E1D0F",
802
+ "id": "js:2:cosmos:cosmos1g84934jpu3v5de5yqukkkhxmcvsw3u2ajxvpdl:-37D1A48254F3C1DED61C1C6E093595A750CBF5C79BBACD10A34DE6B70C3E1D0F-DELEGATE",
803
+ "recipients": [],
804
+ "senders": [],
805
+ "transactionSequenceNumber": "185",
806
+ "type": "DELEGATE",
807
+ "value": "15217",
808
+ },
786
809
  {
787
810
  "accountId": "js:2:cosmos:cosmos1g84934jpu3v5de5yqukkkhxmcvsw3u2ajxvpdl:",
788
811
  "blockHash": null,
@@ -1232,6 +1255,29 @@ exports[`cosmos currency bridge scanAccounts cosmos seed 1 2`] = `
1232
1255
  "type": "OUT",
1233
1256
  "value": "3729",
1234
1257
  },
1258
+ {
1259
+ "accountId": "js:2:cosmos:cosmos1g84934jpu3v5de5yqukkkhxmcvsw3u2ajxvpdl:",
1260
+ "blockHash": null,
1261
+ "blockHeight": 28615228,
1262
+ "extra": {
1263
+ "memo": "Ledger Live",
1264
+ "validators": [
1265
+ {
1266
+ "address": "cosmosvaloper10wljxpl03053h9690apmyeakly3ylhejrucvtm",
1267
+ "amount": "1000000",
1268
+ },
1269
+ ],
1270
+ },
1271
+ "fee": "19524",
1272
+ "hasFailed": false,
1273
+ "hash": "6FE3C64E57224720FAE82136656CE087CD84EA18E55F54F6BB180881EAA56004",
1274
+ "id": "js:2:cosmos:cosmos1g84934jpu3v5de5yqukkkhxmcvsw3u2ajxvpdl:-6FE3C64E57224720FAE82136656CE087CD84EA18E55F54F6BB180881EAA56004-DELEGATE",
1275
+ "recipients": [],
1276
+ "senders": [],
1277
+ "transactionSequenceNumber": "184",
1278
+ "type": "DELEGATE",
1279
+ "value": "19524",
1280
+ },
1235
1281
  {
1236
1282
  "accountId": "js:2:cosmos:cosmos1g84934jpu3v5de5yqukkkhxmcvsw3u2ajxvpdl:",
1237
1283
  "blockHash": null,
@@ -1794,6 +1840,29 @@ exports[`cosmos currency bridge scanAccounts cosmos seed 1 2`] = `
1794
1840
  "type": "REDELEGATE",
1795
1841
  "value": "24612",
1796
1842
  },
1843
+ {
1844
+ "accountId": "js:2:cosmos:cosmos1g84934jpu3v5de5yqukkkhxmcvsw3u2ajxvpdl:",
1845
+ "blockHash": null,
1846
+ "blockHeight": 28513219,
1847
+ "extra": {
1848
+ "memo": "Ledger Live",
1849
+ "validators": [
1850
+ {
1851
+ "address": "cosmosvaloper1clpqr4nrk4khgkxj78fcwwh6dl3uw4epsluffn",
1852
+ "amount": "17874",
1853
+ },
1854
+ ],
1855
+ },
1856
+ "fee": "17705",
1857
+ "hasFailed": false,
1858
+ "hash": "9A71C2ADCECCC8837EA95C20CF19758CB3ABBB72FA96230ED0517D0C2C3CC372",
1859
+ "id": "js:2:cosmos:cosmos1g84934jpu3v5de5yqukkkhxmcvsw3u2ajxvpdl:-9A71C2ADCECCC8837EA95C20CF19758CB3ABBB72FA96230ED0517D0C2C3CC372-REWARD",
1860
+ "recipients": [],
1861
+ "senders": [],
1862
+ "transactionSequenceNumber": "183",
1863
+ "type": "REWARD",
1864
+ "value": "17874",
1865
+ },
1797
1866
  {
1798
1867
  "accountId": "js:2:cosmos:cosmos1g84934jpu3v5de5yqukkkhxmcvsw3u2ajxvpdl:",
1799
1868
  "blockHash": null,