@ledgerhq/live-common 34.55.0-nightly.20251220023811 → 34.55.0-nightly.20251224024018

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 (170) hide show
  1. package/lib/account/recentAddresses.d.ts +2 -1
  2. package/lib/account/recentAddresses.d.ts.map +1 -1
  3. package/lib/account/recentAddresses.js +27 -9
  4. package/lib/account/recentAddresses.js.map +1 -1
  5. package/lib/e2e/enum/Account.d.ts +15 -16
  6. package/lib/e2e/enum/Account.d.ts.map +1 -1
  7. package/lib/e2e/enum/Account.js +93 -100
  8. package/lib/e2e/enum/Account.js.map +1 -1
  9. package/lib/e2e/enum/Addresses.d.ts +12 -0
  10. package/lib/e2e/enum/Addresses.d.ts.map +1 -0
  11. package/lib/e2e/enum/Addresses.js +16 -0
  12. package/lib/e2e/enum/Addresses.js.map +1 -0
  13. package/lib/e2e/enum/AppInfos.d.ts +1 -0
  14. package/lib/e2e/enum/AppInfos.d.ts.map +1 -1
  15. package/lib/e2e/enum/AppInfos.js +1 -0
  16. package/lib/e2e/enum/AppInfos.js.map +1 -1
  17. package/lib/e2e/enum/Currency.d.ts +1 -0
  18. package/lib/e2e/enum/Currency.d.ts.map +1 -1
  19. package/lib/e2e/enum/Currency.js +1 -0
  20. package/lib/e2e/enum/Currency.js.map +1 -1
  21. package/lib/e2e/families/algorand.d.ts.map +1 -1
  22. package/lib/e2e/families/algorand.js +3 -0
  23. package/lib/e2e/families/algorand.js.map +1 -1
  24. package/lib/e2e/families/bitcoin.d.ts.map +1 -1
  25. package/lib/e2e/families/bitcoin.js +6 -0
  26. package/lib/e2e/families/bitcoin.js.map +1 -1
  27. package/lib/e2e/families/cardano.d.ts.map +1 -1
  28. package/lib/e2e/families/cardano.js +3 -0
  29. package/lib/e2e/families/cardano.js.map +1 -1
  30. package/lib/e2e/families/cosmos.d.ts.map +1 -1
  31. package/lib/e2e/families/cosmos.js +3 -0
  32. package/lib/e2e/families/cosmos.js.map +1 -1
  33. package/lib/e2e/families/evm.d.ts.map +1 -1
  34. package/lib/e2e/families/evm.js +3 -0
  35. package/lib/e2e/families/evm.js.map +1 -1
  36. package/lib/e2e/families/polkadot.d.ts.map +1 -1
  37. package/lib/e2e/families/polkadot.js +3 -0
  38. package/lib/e2e/families/polkadot.js.map +1 -1
  39. package/lib/e2e/families/solana.d.ts.map +1 -1
  40. package/lib/e2e/families/solana.js +3 -0
  41. package/lib/e2e/families/solana.js.map +1 -1
  42. package/lib/e2e/families/stellar.d.ts.map +1 -1
  43. package/lib/e2e/families/stellar.js +3 -0
  44. package/lib/e2e/families/stellar.js.map +1 -1
  45. package/lib/e2e/families/tron.d.ts.map +1 -1
  46. package/lib/e2e/families/tron.js +3 -0
  47. package/lib/e2e/families/tron.js.map +1 -1
  48. package/lib/e2e/families/xrp.d.ts.map +1 -1
  49. package/lib/e2e/families/xrp.js +3 -0
  50. package/lib/e2e/families/xrp.js.map +1 -1
  51. package/lib/e2e/index.d.ts +9 -0
  52. package/lib/e2e/index.d.ts.map +1 -1
  53. package/lib/e2e/models/Transaction.d.ts +1 -0
  54. package/lib/e2e/models/Transaction.d.ts.map +1 -1
  55. package/lib/e2e/models/Transaction.js +1 -0
  56. package/lib/e2e/models/Transaction.js.map +1 -1
  57. package/lib/e2e/speculos.d.ts.map +1 -1
  58. package/lib/e2e/speculos.js +10 -3
  59. package/lib/e2e/speculos.js.map +1 -1
  60. package/lib/e2e/swap.d.ts.map +1 -1
  61. package/lib/e2e/swap.js +5 -1
  62. package/lib/e2e/swap.js.map +1 -1
  63. package/lib/exchange/providers/swap.d.ts.map +1 -1
  64. package/lib/exchange/providers/swap.js +2 -0
  65. package/lib/exchange/providers/swap.js.map +1 -1
  66. package/lib/families/cosmos/datasets/cosmos.d.ts.map +1 -1
  67. package/lib/families/cosmos/datasets/cosmos.js +66 -18
  68. package/lib/families/cosmos/datasets/cosmos.js.map +1 -1
  69. package/lib/featureFlags/defaultFeatures.d.ts.map +1 -1
  70. package/lib/featureFlags/defaultFeatures.js +10 -0
  71. package/lib/featureFlags/defaultFeatures.js.map +1 -1
  72. package/lib/featureFlags/useFeature.d.ts +1 -1
  73. package/lib/featureFlags/useFeature.d.ts.map +1 -1
  74. package/lib-es/account/recentAddresses.d.ts +2 -1
  75. package/lib-es/account/recentAddresses.d.ts.map +1 -1
  76. package/lib-es/account/recentAddresses.js +27 -9
  77. package/lib-es/account/recentAddresses.js.map +1 -1
  78. package/lib-es/e2e/enum/Account.d.ts +15 -16
  79. package/lib-es/e2e/enum/Account.d.ts.map +1 -1
  80. package/lib-es/e2e/enum/Account.js +92 -98
  81. package/lib-es/e2e/enum/Account.js.map +1 -1
  82. package/lib-es/e2e/enum/Addresses.d.ts +12 -0
  83. package/lib-es/e2e/enum/Addresses.d.ts.map +1 -0
  84. package/lib-es/e2e/enum/Addresses.js +13 -0
  85. package/lib-es/e2e/enum/Addresses.js.map +1 -0
  86. package/lib-es/e2e/enum/AppInfos.d.ts +1 -0
  87. package/lib-es/e2e/enum/AppInfos.d.ts.map +1 -1
  88. package/lib-es/e2e/enum/AppInfos.js +1 -0
  89. package/lib-es/e2e/enum/AppInfos.js.map +1 -1
  90. package/lib-es/e2e/enum/Currency.d.ts +1 -0
  91. package/lib-es/e2e/enum/Currency.d.ts.map +1 -1
  92. package/lib-es/e2e/enum/Currency.js +1 -0
  93. package/lib-es/e2e/enum/Currency.js.map +1 -1
  94. package/lib-es/e2e/families/algorand.d.ts.map +1 -1
  95. package/lib-es/e2e/families/algorand.js +3 -0
  96. package/lib-es/e2e/families/algorand.js.map +1 -1
  97. package/lib-es/e2e/families/bitcoin.d.ts.map +1 -1
  98. package/lib-es/e2e/families/bitcoin.js +6 -0
  99. package/lib-es/e2e/families/bitcoin.js.map +1 -1
  100. package/lib-es/e2e/families/cardano.d.ts.map +1 -1
  101. package/lib-es/e2e/families/cardano.js +3 -0
  102. package/lib-es/e2e/families/cardano.js.map +1 -1
  103. package/lib-es/e2e/families/cosmos.d.ts.map +1 -1
  104. package/lib-es/e2e/families/cosmos.js +3 -0
  105. package/lib-es/e2e/families/cosmos.js.map +1 -1
  106. package/lib-es/e2e/families/evm.d.ts.map +1 -1
  107. package/lib-es/e2e/families/evm.js +3 -0
  108. package/lib-es/e2e/families/evm.js.map +1 -1
  109. package/lib-es/e2e/families/polkadot.d.ts.map +1 -1
  110. package/lib-es/e2e/families/polkadot.js +3 -0
  111. package/lib-es/e2e/families/polkadot.js.map +1 -1
  112. package/lib-es/e2e/families/solana.d.ts.map +1 -1
  113. package/lib-es/e2e/families/solana.js +3 -0
  114. package/lib-es/e2e/families/solana.js.map +1 -1
  115. package/lib-es/e2e/families/stellar.d.ts.map +1 -1
  116. package/lib-es/e2e/families/stellar.js +3 -0
  117. package/lib-es/e2e/families/stellar.js.map +1 -1
  118. package/lib-es/e2e/families/tron.d.ts.map +1 -1
  119. package/lib-es/e2e/families/tron.js +3 -0
  120. package/lib-es/e2e/families/tron.js.map +1 -1
  121. package/lib-es/e2e/families/xrp.d.ts.map +1 -1
  122. package/lib-es/e2e/families/xrp.js +3 -0
  123. package/lib-es/e2e/families/xrp.js.map +1 -1
  124. package/lib-es/e2e/index.d.ts +9 -0
  125. package/lib-es/e2e/index.d.ts.map +1 -1
  126. package/lib-es/e2e/models/Transaction.d.ts +1 -0
  127. package/lib-es/e2e/models/Transaction.d.ts.map +1 -1
  128. package/lib-es/e2e/models/Transaction.js +1 -0
  129. package/lib-es/e2e/models/Transaction.js.map +1 -1
  130. package/lib-es/e2e/speculos.d.ts.map +1 -1
  131. package/lib-es/e2e/speculos.js +10 -3
  132. package/lib-es/e2e/speculos.js.map +1 -1
  133. package/lib-es/e2e/swap.d.ts.map +1 -1
  134. package/lib-es/e2e/swap.js +5 -1
  135. package/lib-es/e2e/swap.js.map +1 -1
  136. package/lib-es/exchange/providers/swap.d.ts.map +1 -1
  137. package/lib-es/exchange/providers/swap.js +2 -0
  138. package/lib-es/exchange/providers/swap.js.map +1 -1
  139. package/lib-es/families/cosmos/datasets/cosmos.d.ts.map +1 -1
  140. package/lib-es/families/cosmos/datasets/cosmos.js +67 -19
  141. package/lib-es/families/cosmos/datasets/cosmos.js.map +1 -1
  142. package/lib-es/featureFlags/defaultFeatures.d.ts.map +1 -1
  143. package/lib-es/featureFlags/defaultFeatures.js +10 -0
  144. package/lib-es/featureFlags/defaultFeatures.js.map +1 -1
  145. package/lib-es/featureFlags/useFeature.d.ts +1 -1
  146. package/lib-es/featureFlags/useFeature.d.ts.map +1 -1
  147. package/package.json +74 -74
  148. package/src/account/recentAddresses.test.ts +115 -15
  149. package/src/account/recentAddresses.ts +37 -13
  150. package/src/e2e/enum/Account.ts +152 -396
  151. package/src/e2e/enum/Addresses.ts +11 -0
  152. package/src/e2e/enum/AppInfos.ts +2 -0
  153. package/src/e2e/enum/Currency.ts +2 -0
  154. package/src/e2e/families/algorand.ts +3 -0
  155. package/src/e2e/families/bitcoin.ts +6 -0
  156. package/src/e2e/families/cardano.ts +3 -0
  157. package/src/e2e/families/cosmos.ts +3 -0
  158. package/src/e2e/families/evm.ts +3 -0
  159. package/src/e2e/families/polkadot.ts +3 -0
  160. package/src/e2e/families/solana.ts +3 -0
  161. package/src/e2e/families/stellar.ts +3 -0
  162. package/src/e2e/families/tron.ts +3 -0
  163. package/src/e2e/families/xrp.ts +3 -1
  164. package/src/e2e/models/Transaction.ts +2 -0
  165. package/src/e2e/speculos.ts +10 -3
  166. package/src/e2e/swap.ts +7 -1
  167. package/src/exchange/providers/swap.ts +2 -0
  168. package/src/families/cosmos/datasets/cosmos.ts +71 -18
  169. package/src/families/hedera/__snapshots__/bridge.integration.test.ts.snap +7 -7
  170. package/src/featureFlags/defaultFeatures.ts +10 -1
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.55.0-nightly.20251220023811",
4
+ "version": "34.55.0-nightly.20251224024018",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/LedgerHQ/ledger-live.git"
@@ -178,79 +178,79 @@
178
178
  "xstate": "^5.19.2",
179
179
  "yargs": "^17.0.0",
180
180
  "zod": "^3.22.4",
181
- "@ledgerhq/coin-algorand": "^0.15.0-nightly.20251220023811",
182
- "@ledgerhq/coin-aptos": "^3.8.0-nightly.20251220023811",
183
- "@ledgerhq/coin-bitcoin": "^0.27.0-nightly.20251220023811",
184
- "@ledgerhq/coin-canton": "^0.12.0-nightly.20251220023811",
185
- "@ledgerhq/coin-cardano": "^0.16.0-nightly.20251220023811",
186
- "@ledgerhq/coin-casper": "^2.5.0-nightly.20251220023811",
187
- "@ledgerhq/coin-celo": "^1.8.0-nightly.20251220023811",
188
- "@ledgerhq/coin-cosmos": "^0.21.0-nightly.20251220023811",
189
- "@ledgerhq/coin-evm": "^2.37.0-nightly.20251220023811",
190
- "@ledgerhq/coin-filecoin": "^1.16.0-nightly.20251220023811",
191
- "@ledgerhq/coin-framework": "^6.11.0-nightly.20251220023811",
192
- "@ledgerhq/coin-hedera": "^1.16.0-nightly.20251220023811",
193
- "@ledgerhq/coin-icon": "^0.16.0-nightly.20251220023811",
194
- "@ledgerhq/coin-internet_computer": "^1.12.0-nightly.20251220023811",
195
- "@ledgerhq/coin-kaspa": "^1.6.0-nightly.20251220023811",
196
- "@ledgerhq/coin-mina": "^1.5.0-nightly.20251220023811",
197
- "@ledgerhq/coin-near": "^0.17.0-nightly.20251220023811",
198
- "@ledgerhq/coin-polkadot": "^6.14.0-nightly.20251220023811",
199
- "@ledgerhq/coin-multiversx": "^0.9.0-nightly.20251220023811",
200
- "@ledgerhq/coin-solana": "^0.39.0-nightly.20251220023811",
201
- "@ledgerhq/coin-stacks": "^0.13.0-nightly.20251220023811",
202
- "@ledgerhq/coin-stellar": "^6.9.0-nightly.20251220023811",
203
- "@ledgerhq/coin-sui": "^0.19.0-nightly.20251220023811",
204
- "@ledgerhq/coin-tezos": "^6.11.0-nightly.20251220023811",
205
- "@ledgerhq/coin-ton": "^0.18.0-nightly.20251220023811",
206
- "@ledgerhq/coin-tron": "^5.8.0-nightly.20251220023811",
207
- "@ledgerhq/coin-vechain": "^2.14.0-nightly.20251220023811",
208
- "@ledgerhq/coin-xrp": "^7.10.0-nightly.20251220023811",
209
- "@ledgerhq/cryptoassets": "^13.35.0-nightly.20251220023811",
210
- "@ledgerhq/device-core": "^0.6.11-nightly.20251220023811",
211
- "@ledgerhq/devices": "8.8.0-nightly.20251220023811",
212
- "@ledgerhq/hw-app-algorand": "^6.31.11-nightly.20251220023811",
213
- "@ledgerhq/errors": "^6.28.0-nightly.20251220023811",
214
- "@ledgerhq/hw-app-aptos": "^6.34.11-nightly.20251220023811",
215
- "@ledgerhq/hw-app-btc": "^10.14.0-nightly.20251220023811",
216
- "@ledgerhq/hw-app-cosmos": "^6.32.11-nightly.20251220023811",
217
- "@ledgerhq/hw-app-celo": "^6.35.6-nightly.20251220023811",
218
- "@ledgerhq/hw-app-exchange": "^0.18.2-nightly.20251220023811",
219
- "@ledgerhq/hw-app-hedera": "^1.2.11-nightly.20251220023811",
220
- "@ledgerhq/hw-app-eth": "^7.1.0-nightly.20251220023811",
221
- "@ledgerhq/hw-app-kaspa": "^1.3.4-nightly.20251220023811",
222
- "@ledgerhq/hw-app-icon": "^1.3.11-nightly.20251220023811",
223
- "@ledgerhq/hw-app-multiversx": "^6.26.2-nightly.20251220023811",
224
- "@ledgerhq/hw-app-near": "^6.31.11-nightly.20251220023811",
225
- "@ledgerhq/hw-app-polkadot": "^6.34.11-nightly.20251220023811",
226
- "@ledgerhq/hw-app-str": "^7.3.0-nightly.20251220023811",
181
+ "@ledgerhq/coin-algorand": "^0.15.0-nightly.20251224024018",
182
+ "@ledgerhq/coin-aptos": "^3.8.0-nightly.20251224024018",
183
+ "@ledgerhq/coin-bitcoin": "^0.27.0-nightly.20251224024018",
184
+ "@ledgerhq/coin-canton": "^0.12.0-nightly.20251224024018",
185
+ "@ledgerhq/coin-cardano": "^0.16.0-nightly.20251224024018",
186
+ "@ledgerhq/coin-casper": "^2.5.0-nightly.20251224024018",
187
+ "@ledgerhq/coin-celo": "^1.8.0-nightly.20251224024018",
188
+ "@ledgerhq/coin-cosmos": "^0.21.0-nightly.20251224024018",
189
+ "@ledgerhq/coin-evm": "^2.37.0-nightly.20251224024018",
190
+ "@ledgerhq/coin-filecoin": "^1.16.0-nightly.20251224024018",
191
+ "@ledgerhq/coin-framework": "^6.11.0-nightly.20251224024018",
192
+ "@ledgerhq/coin-hedera": "^1.16.0-nightly.20251224024018",
193
+ "@ledgerhq/coin-icon": "^0.16.0-nightly.20251224024018",
194
+ "@ledgerhq/coin-kaspa": "^1.6.0-nightly.20251224024018",
195
+ "@ledgerhq/coin-mina": "^1.5.0-nightly.20251224024018",
196
+ "@ledgerhq/coin-internet_computer": "^1.12.0-nightly.20251224024018",
197
+ "@ledgerhq/coin-multiversx": "^0.9.0-nightly.20251224024018",
198
+ "@ledgerhq/coin-polkadot": "^6.14.0-nightly.20251224024018",
199
+ "@ledgerhq/coin-near": "^0.17.0-nightly.20251224024018",
200
+ "@ledgerhq/coin-solana": "^0.39.0-nightly.20251224024018",
201
+ "@ledgerhq/coin-stellar": "^6.9.0-nightly.20251224024018",
202
+ "@ledgerhq/coin-stacks": "^0.13.0-nightly.20251224024018",
203
+ "@ledgerhq/coin-sui": "^0.19.0-nightly.20251224024018",
204
+ "@ledgerhq/coin-tezos": "^6.11.0-nightly.20251224024018",
205
+ "@ledgerhq/coin-ton": "^0.18.0-nightly.20251224024018",
206
+ "@ledgerhq/coin-tron": "^5.8.0-nightly.20251224024018",
207
+ "@ledgerhq/coin-vechain": "^2.14.0-nightly.20251224024018",
208
+ "@ledgerhq/coin-xrp": "^7.10.0-nightly.20251224024018",
209
+ "@ledgerhq/cryptoassets": "^13.35.0-nightly.20251224024018",
210
+ "@ledgerhq/device-core": "^0.6.11-nightly.20251224024018",
211
+ "@ledgerhq/devices": "8.8.0-nightly.20251224024018",
212
+ "@ledgerhq/errors": "^6.28.0-nightly.20251224024018",
213
+ "@ledgerhq/hw-app-algorand": "^6.31.11-nightly.20251224024018",
214
+ "@ledgerhq/hw-app-aptos": "^6.34.11-nightly.20251224024018",
215
+ "@ledgerhq/hw-app-btc": "^10.14.0-nightly.20251224024018",
216
+ "@ledgerhq/hw-app-cosmos": "^6.32.11-nightly.20251224024018",
217
+ "@ledgerhq/hw-app-celo": "^6.35.6-nightly.20251224024018",
218
+ "@ledgerhq/hw-app-eth": "^7.1.0-nightly.20251224024018",
219
+ "@ledgerhq/hw-app-hedera": "^1.2.11-nightly.20251224024018",
220
+ "@ledgerhq/hw-app-exchange": "^0.18.2-nightly.20251224024018",
221
+ "@ledgerhq/hw-app-icon": "^1.3.11-nightly.20251224024018",
222
+ "@ledgerhq/hw-app-kaspa": "^1.3.4-nightly.20251224024018",
223
+ "@ledgerhq/hw-app-multiversx": "^6.26.2-nightly.20251224024018",
224
+ "@ledgerhq/hw-app-near": "^6.31.11-nightly.20251224024018",
225
+ "@ledgerhq/hw-app-polkadot": "^6.34.11-nightly.20251224024018",
226
+ "@ledgerhq/hw-app-str": "^7.3.0-nightly.20251224024018",
227
227
  "@ledgerhq/hw-app-sui": "^1.4.0",
228
- "@ledgerhq/hw-app-tezos": "^6.31.11-nightly.20251220023811",
229
- "@ledgerhq/hw-app-trx": "^6.31.11-nightly.20251220023811",
230
- "@ledgerhq/hw-app-xrp": "^6.32.9-nightly.20251220023811",
231
- "@ledgerhq/hw-app-vet": "^0.8.2-nightly.20251220023811",
232
- "@ledgerhq/hw-transport": "6.31.15-nightly.20251220023811",
233
- "@ledgerhq/hw-bolos": "^6.32.11-nightly.20251220023811",
234
- "@ledgerhq/hw-transport-mocker": "^6.30.0-nightly.20251220023811",
235
- "@ledgerhq/client-ids": "^0.2.0-nightly.20251220023811",
236
- "@ledgerhq/ledger-cal-service": "^1.9.3-nightly.20251220023811",
237
- "@ledgerhq/ledger-trust-service": "^0.4.5-nightly.20251220023811",
238
- "@ledgerhq/live-config": "^3.3.0-nightly.20251220023811",
239
- "@ledgerhq/live-countervalues": "^0.10.3-nightly.20251220023811",
240
- "@ledgerhq/live-countervalues-react": "^0.7.5-nightly.20251220023811",
241
- "@ledgerhq/live-dmk-shared": "^0.16.0-nightly.20251220023811",
242
- "@ledgerhq/live-env": "^2.23.0-nightly.20251220023811",
243
- "@ledgerhq/live-hooks": "0.3.0-nightly.20251220023811",
244
- "@ledgerhq/live-network": "^2.1.4-nightly.20251220023811",
228
+ "@ledgerhq/hw-app-tezos": "^6.32.0-nightly.20251224024018",
229
+ "@ledgerhq/hw-app-trx": "^6.31.11-nightly.20251224024018",
230
+ "@ledgerhq/hw-app-vet": "^0.8.2-nightly.20251224024018",
231
+ "@ledgerhq/hw-app-xrp": "^6.32.9-nightly.20251224024018",
232
+ "@ledgerhq/hw-bolos": "^6.32.11-nightly.20251224024018",
233
+ "@ledgerhq/hw-transport": "6.31.15-nightly.20251224024018",
234
+ "@ledgerhq/hw-transport-mocker": "^6.30.0-nightly.20251224024018",
235
+ "@ledgerhq/client-ids": "^0.2.0-nightly.20251224024018",
236
+ "@ledgerhq/ledger-cal-service": "^1.10.0-nightly.20251224024018",
237
+ "@ledgerhq/live-config": "^3.3.0-nightly.20251224024018",
238
+ "@ledgerhq/ledger-trust-service": "^0.4.5-nightly.20251224024018",
239
+ "@ledgerhq/live-countervalues": "^0.10.3-nightly.20251224024018",
240
+ "@ledgerhq/live-countervalues-react": "^0.7.5-nightly.20251224024018",
241
+ "@ledgerhq/live-dmk-shared": "^0.16.0-nightly.20251224024018",
242
+ "@ledgerhq/live-hooks": "0.3.0-nightly.20251224024018",
243
+ "@ledgerhq/live-env": "^2.23.0-nightly.20251224024018",
244
+ "@ledgerhq/live-network": "^2.1.4-nightly.20251224024018",
245
+ "@ledgerhq/live-signer-evm": "^0.11.0-nightly.20251224024018",
245
246
  "@ledgerhq/live-promise": "^0.1.1",
246
- "@ledgerhq/live-signer-canton": "^0.5.4-nightly.20251220023811",
247
- "@ledgerhq/live-signer-evm": "^0.11.0-nightly.20251220023811",
248
- "@ledgerhq/live-signer-solana": "^0.8.0-nightly.20251220023811",
249
- "@ledgerhq/live-wallet": "^0.17.0-nightly.20251220023811",
247
+ "@ledgerhq/live-signer-canton": "^0.5.4-nightly.20251224024018",
248
+ "@ledgerhq/live-signer-solana": "^0.8.0-nightly.20251224024018",
249
+ "@ledgerhq/live-wallet": "^0.17.0-nightly.20251224024018",
250
250
  "@ledgerhq/logs": "^6.13.0",
251
- "@ledgerhq/speculos-transport": "^0.4.0-nightly.20251220023811",
252
- "@ledgerhq/wallet-api-acre-module": "^0.11.0-nightly.20251220023811",
253
- "@ledgerhq/wallet-api-exchange-module": "^0.20.0-nightly.20251220023811"
251
+ "@ledgerhq/wallet-api-acre-module": "^0.11.0-nightly.20251224024018",
252
+ "@ledgerhq/speculos-transport": "^0.4.0-nightly.20251224024018",
253
+ "@ledgerhq/wallet-api-exchange-module": "^0.20.0-nightly.20251224024018"
254
254
  },
255
255
  "devDependencies": {
256
256
  "@solana/web3.js": "1.95.4",
@@ -297,10 +297,10 @@
297
297
  "undici": "6.19.2",
298
298
  "uuid": "^8.3.2",
299
299
  "ws": "8.18.3",
300
- "@ledgerhq/device-react": "^0.3.5-nightly.20251220023811",
301
- "@ledgerhq/types-cryptoassets": "^7.31.0-nightly.20251220023811",
300
+ "@ledgerhq/types-cryptoassets": "^7.31.0-nightly.20251224024018",
301
+ "@ledgerhq/device-react": "^0.3.5-nightly.20251224024018",
302
302
  "@ledgerhq/types-devices": "^6.27.0",
303
- "@ledgerhq/types-live": "^6.91.0-nightly.20251220023811"
303
+ "@ledgerhq/types-live": "^6.91.0-nightly.20251224024018"
304
304
  },
305
305
  "scripts": {
306
306
  "build": "zx ./scripts/build-ts.mjs",
@@ -17,7 +17,13 @@ describe("RecentAddressesStore", () => {
17
17
  const addresses = store.getAddresses("ethereum");
18
18
  expect(addresses).toEqual([newAddress]);
19
19
  expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(1);
20
- expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: [newAddress] });
20
+ expect(onAddAddressCompleteMock).toHaveBeenCalledWith({
21
+ ethereum: [
22
+ expect.objectContaining({
23
+ address: newAddress,
24
+ }),
25
+ ],
26
+ });
21
27
  });
22
28
 
23
29
  it("should add a second address and return addresses sorted by insertion", async () => {
@@ -26,14 +32,21 @@ describe("RecentAddressesStore", () => {
26
32
  let addresses = store.getAddresses("ethereum");
27
33
  expect(addresses).toEqual([newAddress]);
28
34
  expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(1);
29
- expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: [newAddress] });
35
+ expect(onAddAddressCompleteMock).toHaveBeenCalledWith({
36
+ ethereum: [expect.objectContaining({ address: newAddress })],
37
+ });
30
38
 
31
39
  const newAddress2 = "0xB69B37A4Fb4A18b3258f974ff6e9f529AD2647b1";
32
40
  await store.addAddress("ethereum", newAddress2);
33
41
  addresses = store.getAddresses("ethereum");
34
42
  expect(addresses).toEqual([newAddress2, newAddress]);
35
43
  expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(2);
36
- expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: [newAddress2, newAddress] });
44
+ expect(onAddAddressCompleteMock).toHaveBeenCalledWith({
45
+ ethereum: [
46
+ expect.objectContaining({ address: newAddress2 }),
47
+ expect.objectContaining({ address: newAddress }),
48
+ ],
49
+ });
37
50
  });
38
51
 
39
52
  it("should replace at first place when an address is already saved", async () => {
@@ -42,43 +55,61 @@ describe("RecentAddressesStore", () => {
42
55
  let addresses = store.getAddresses("ethereum");
43
56
  expect(addresses).toEqual([newAddress]);
44
57
  expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(1);
45
- expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: [newAddress] });
58
+ expect(onAddAddressCompleteMock).toHaveBeenCalledWith({
59
+ ethereum: [expect.objectContaining({ address: newAddress })],
60
+ });
46
61
 
47
62
  const newAddress2 = "0xB69B37A4Fb4A18b3258f974ff6e9f529AD2647b1";
48
63
  await store.addAddress("ethereum", newAddress2);
49
64
  addresses = store.getAddresses("ethereum");
50
65
  expect(addresses).toEqual([newAddress2, newAddress]);
51
66
  expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(2);
52
- expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: [newAddress2, newAddress] });
67
+ expect(onAddAddressCompleteMock).toHaveBeenCalledWith({
68
+ ethereum: [
69
+ expect.objectContaining({ address: newAddress2 }),
70
+ expect.objectContaining({ address: newAddress }),
71
+ ],
72
+ });
53
73
 
54
74
  await store.addAddress("ethereum", newAddress);
55
75
  addresses = store.getAddresses("ethereum");
56
76
  expect(addresses).toEqual([newAddress, newAddress2]);
57
77
  expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(3);
58
- expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: [newAddress, newAddress2] });
78
+ expect(onAddAddressCompleteMock).toHaveBeenCalledWith({
79
+ ethereum: [
80
+ expect.objectContaining({ address: newAddress }),
81
+ expect.objectContaining({ address: newAddress2 }),
82
+ ],
83
+ });
59
84
  });
60
85
 
61
86
  it("should replace at first place and remove last element when addresses exceed count limit", async () => {
62
- let expectedAddresses: string[] = [];
87
+ const expectedAddresses: string[] = [];
88
+ const expectedObjects: any[] = [];
63
89
  for (let index = 0; index < RECENT_ADDRESSES_COUNT_LIMIT; index++) {
64
- await store.addAddress("ethereum", `0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3${index}`);
65
- expectedAddresses.unshift(`0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3${index}`);
90
+ const addr = `0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3${index}`;
91
+ await store.addAddress("ethereum", addr);
92
+ expectedAddresses.unshift(addr);
93
+ expectedObjects.unshift(expect.objectContaining({ address: addr }));
66
94
  }
67
95
 
68
96
  let addresses = store.getAddresses("ethereum");
69
97
  expect(addresses).toEqual(expectedAddresses);
70
98
  expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(RECENT_ADDRESSES_COUNT_LIMIT);
71
- expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: expectedAddresses });
99
+ expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: expectedObjects });
72
100
 
73
101
  const newAddress2 = "0xB69B37A4Fb4A18b3258f974ff6e9f529AD2647b1";
74
102
  expectedAddresses.splice(expectedAddresses.length - 1, 1);
75
- expectedAddresses = [newAddress2, ...expectedAddresses];
103
+ expectedAddresses.unshift(newAddress2);
104
+
105
+ expectedObjects.splice(expectedObjects.length - 1, 1);
106
+ expectedObjects.unshift(expect.objectContaining({ address: newAddress2 }));
76
107
 
77
108
  await store.addAddress("ethereum", newAddress2);
78
109
  addresses = store.getAddresses("ethereum");
79
110
  expect(addresses).toEqual(expectedAddresses);
80
111
  expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(RECENT_ADDRESSES_COUNT_LIMIT + 1);
81
- expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: expectedAddresses });
112
+ expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: expectedObjects });
82
113
  });
83
114
 
84
115
  it("should add an address of a different currency", async () => {
@@ -88,7 +119,9 @@ describe("RecentAddressesStore", () => {
88
119
  let addresses = store.getAddresses("ethereum");
89
120
  expect(addresses).toEqual([newAddress]);
90
121
  expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(1);
91
- expect(onAddAddressCompleteMock).toHaveBeenCalledWith({ ethereum: [newAddress] });
122
+ expect(onAddAddressCompleteMock).toHaveBeenCalledWith({
123
+ ethereum: [expect.objectContaining({ address: newAddress })],
124
+ });
92
125
 
93
126
  const newAddress2 = "bc1pxlmrudqyq8qd8pfsc4mpmlaw56x6vtcr9m8nvp8kj3gckefc4kmqhkg4l7";
94
127
  await store.addAddress("bitcoin", newAddress2);
@@ -97,8 +130,75 @@ describe("RecentAddressesStore", () => {
97
130
  expect(addresses).toEqual([newAddress2]);
98
131
  expect(onAddAddressCompleteMock).toHaveBeenCalledTimes(2);
99
132
  expect(onAddAddressCompleteMock).toHaveBeenCalledWith({
100
- ethereum: [newAddress],
101
- bitcoin: [newAddress2],
133
+ ethereum: [expect.objectContaining({ address: newAddress })],
134
+ bitcoin: [expect.objectContaining({ address: newAddress2 })],
135
+ });
136
+ });
137
+
138
+ it("should update timestamp and move to top when re-adding an existing address", async () => {
139
+ const address1 = "0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3";
140
+ const address2 = "0xB69B37A4Fb4A18b3258f974ff6e9f529AD2647b1";
141
+ const address3 = "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0";
142
+
143
+ const now = Date.now();
144
+ const oneYear = 365 * 24 * 60 * 60 * 1000;
145
+ const threeYearsAgo = now - 3 * oneYear;
146
+ const oneYearAgo = now - oneYear;
147
+
148
+ const dateNowSpy = jest.spyOn(Date, "now");
149
+
150
+ // Add address1 3 years ago
151
+ dateNowSpy.mockReturnValue(threeYearsAgo);
152
+ await store.addAddress("ethereum", address1);
153
+
154
+ // Add address2 1 year ago
155
+ dateNowSpy.mockReturnValue(oneYearAgo);
156
+ await store.addAddress("ethereum", address2);
157
+
158
+ // Add address3 now
159
+ dateNowSpy.mockReturnValue(now);
160
+ await store.addAddress("ethereum", address3);
161
+
162
+ let addresses = store.getAddresses("ethereum");
163
+ expect(addresses).toEqual([address3, address2, address1]);
164
+
165
+ // Re-add address1 (the oldest one) now
166
+ const reAddTime = now + 1000;
167
+ dateNowSpy.mockReturnValue(reAddTime);
168
+ await store.addAddress("ethereum", address1);
169
+
170
+ addresses = store.getAddresses("ethereum");
171
+ expect(addresses).toEqual([address1, address3, address2]);
172
+
173
+ expect(onAddAddressCompleteMock).toHaveBeenLastCalledWith({
174
+ ethereum: [
175
+ expect.objectContaining({ address: address1, lastUsed: reAddTime }),
176
+ expect.objectContaining({ address: address3, lastUsed: now }),
177
+ expect.objectContaining({ address: address2, lastUsed: oneYearAgo }),
178
+ ],
102
179
  });
103
180
  });
181
+
182
+ it("should migrate legacy string addresses to RecentAddress objects on setup", async () => {
183
+ const legacyAddress1 = "0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3";
184
+ const legacyAddress2 = "0xB69B37A4Fb4A18b3258f974ff6e9f529AD2647b1";
185
+ const modernAddress = "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0";
186
+ const modernTimestamp = 1234567890;
187
+
188
+ const legacyCache: any = {
189
+ ethereum: [
190
+ legacyAddress1,
191
+ { address: modernAddress, lastUsed: modernTimestamp },
192
+ legacyAddress2,
193
+ ],
194
+ };
195
+
196
+ setupRecentAddressesStore(legacyCache, onAddAddressCompleteMock);
197
+ store = getRecentAddressesStore();
198
+
199
+ const addresses = store.getAddresses("ethereum");
200
+
201
+ // Order should be preserved: legacy1, modern, legacy2
202
+ expect(addresses).toEqual([legacyAddress1, modernAddress, legacyAddress2]);
203
+ });
104
204
  });
@@ -1,6 +1,8 @@
1
+ import type { RecentAddressesState, RecentAddress } from "@ledgerhq/types-live";
2
+
1
3
  export const RECENT_ADDRESSES_COUNT_LIMIT = 12;
2
4
 
3
- export type RecentAddressesCache = Record<string, string[]>;
5
+ export type RecentAddressesCache = RecentAddressesState;
4
6
 
5
7
  export interface RecentAddressesStore {
6
8
  addAddress(currency: string, address: string): void;
@@ -8,8 +10,6 @@ export interface RecentAddressesStore {
8
10
  getAddresses(currency: string): string[];
9
11
  }
10
12
 
11
- type CallbackMode = "triggerCallback" | "skipCallback";
12
-
13
13
  let recentAddressesStore: RecentAddressesStore | null = null;
14
14
 
15
15
  export function getRecentAddressesStore(): RecentAddressesStore {
@@ -30,26 +30,43 @@ export function setupRecentAddressesStore(
30
30
 
31
31
  class RecentAddressesStoreImpl implements RecentAddressesStore {
32
32
  private addressesByCurrency: RecentAddressesCache = {};
33
- private readonly onAddAddressComplete: (addressesByCurrency: Record<string, string[]>) => void;
33
+ private readonly onAddAddressComplete: (addressesByCurrency: RecentAddressesCache) => void;
34
34
 
35
35
  constructor(
36
36
  addressesByCurrency: RecentAddressesCache,
37
37
  onAddAddressComplete: (addressesByCurrency: RecentAddressesCache) => void,
38
38
  ) {
39
- this.addressesByCurrency = { ...addressesByCurrency };
39
+ this.addressesByCurrency = this.sanitizeCache(addressesByCurrency);
40
40
  this.onAddAddressComplete = onAddAddressComplete;
41
41
  }
42
42
 
43
+ private sanitizeCache(cache: RecentAddressesCache): RecentAddressesCache {
44
+ const sanitized: RecentAddressesCache = {};
45
+ for (const currency in cache) {
46
+ const entries = cache[currency] as (RecentAddress | string)[];
47
+ sanitized[currency] = entries.map(entry => {
48
+ if (typeof entry === "string") {
49
+ return { address: entry, lastUsed: Date.now() };
50
+ }
51
+ return entry;
52
+ });
53
+ }
54
+ return sanitized;
55
+ }
56
+
43
57
  addAddress(currency: string, address: string): void {
44
- this.addAddressToCache(currency, address, "triggerCallback");
58
+ this.addAddressToCache(currency, address, Date.now(), true);
45
59
  }
46
60
 
47
61
  syncAddresses(cache: RecentAddressesCache): void {
48
62
  const previousAddresses = { ...this.addressesByCurrency };
49
63
  this.addressesByCurrency = { ...cache };
50
64
  for (const currency in previousAddresses) {
51
- for (const address of previousAddresses[currency]) {
52
- this.addAddressToCache(currency, address, "skipCallback");
65
+ const entries = previousAddresses[currency] as (RecentAddress | string)[];
66
+ for (const entry of entries) {
67
+ const address = typeof entry === "string" ? entry : entry.address;
68
+ const timestamp = typeof entry === "string" ? undefined : entry.lastUsed;
69
+ this.addAddressToCache(currency, address, timestamp ?? Date.now(), false);
53
70
  }
54
71
  }
55
72
 
@@ -58,26 +75,33 @@ class RecentAddressesStoreImpl implements RecentAddressesStore {
58
75
 
59
76
  getAddresses(currency: string): string[] {
60
77
  const addresses = this.addressesByCurrency[currency];
61
- return addresses ?? [];
78
+ if (!addresses) return [];
79
+ return addresses.map(entry => entry.address);
62
80
  }
63
81
 
64
- private addAddressToCache(currency: string, address: string, callbackMode: CallbackMode): void {
82
+ private addAddressToCache(
83
+ currency: string,
84
+ address: string,
85
+ timestamp: number,
86
+ shouldTriggerCallback: boolean,
87
+ ): void {
65
88
  if (!this.addressesByCurrency[currency]) {
66
89
  this.addressesByCurrency[currency] = [];
67
90
  }
68
91
 
69
92
  const addresses = this.addressesByCurrency[currency];
70
- const addressIndex = addresses.indexOf(address);
93
+ const addressIndex = addresses.findIndex(entry => entry.address === address);
94
+
71
95
  if (addressIndex !== -1) {
72
96
  addresses.splice(addressIndex, 1);
73
97
  } else if (addresses.length >= RECENT_ADDRESSES_COUNT_LIMIT) {
74
98
  addresses.pop();
75
99
  }
76
100
 
77
- addresses.unshift(address);
101
+ addresses.unshift({ address, lastUsed: timestamp });
78
102
  this.addressesByCurrency[currency] = [...addresses];
79
103
 
80
- if (callbackMode === "triggerCallback") {
104
+ if (shouldTriggerCallback) {
81
105
  this.onAddAddressComplete(this.addressesByCurrency);
82
106
  }
83
107
  }