@exodus/assets-feature 9.0.0 → 9.1.0

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/CHANGELOG.md CHANGED
@@ -3,6 +3,22 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [9.1.0](https://github.com/ExodusMovement/exodus-hydra/compare/@exodus/assets-feature@9.0.1...@exodus/assets-feature@9.1.0) (2026-04-14)
7
+
8
+ ### Features
9
+
10
+ - feat(assets): add tags parameter to searchTokens (#15984)
11
+
12
+ ### Bug Fixes
13
+
14
+ - fix: add protection from malformed remote asset config during startup (#15650)
15
+
16
+ ## [9.0.1](https://github.com/ExodusMovement/exodus-hydra/compare/@exodus/assets-feature@9.0.0...@exodus/assets-feature@9.0.1) (2026-02-20)
17
+
18
+ ### Bug Fixes
19
+
20
+ - fix(assets-feature): skip gap limit scanning for freshly created wallets (#15311)
21
+
6
22
  ## [9.0.0](https://github.com/ExodusMovement/exodus-hydra/compare/@exodus/assets-feature@8.8.0...@exodus/assets-feature@9.0.0) (2026-02-16)
7
23
 
8
24
  ### Features
package/api/index.d.ts CHANGED
@@ -25,6 +25,7 @@ declare const assetsApiDefinition: {
25
25
  baseAssetName?: string | string[]
26
26
  lifecycleStatus?: TokenStatus[]
27
27
  query?: string
28
+ tags?: string[]
28
29
  excludeTags?: string[]
29
30
  pageNumber?: number
30
31
  pageSize?: number
@@ -19,6 +19,7 @@ class AssetClientInterface {
19
19
  #transactionSigner
20
20
  #walletAccountsAtom
21
21
  #multisigAtom
22
+ #freshlyCreated = false
22
23
 
23
24
  constructor({
24
25
  addressProvider,
@@ -50,6 +51,10 @@ class AssetClientInterface {
50
51
  this.#multisigAtom = multisigAtom
51
52
  }
52
53
 
54
+ setFreshlyCreated = (value) => {
55
+ this.#freshlyCreated = value
56
+ }
57
+
53
58
  createLogger = (namespace) => {
54
59
  return this.#createLogger(namespace)
55
60
  }
@@ -176,6 +181,10 @@ class AssetClientInterface {
176
181
  const confirmationsNumber = await this.getConfirmationsNumber({ assetName })
177
182
  const out = { confirmationsNumber }
178
183
 
184
+ if (this.#freshlyCreated) {
185
+ out.gapLimit = 0
186
+ }
187
+
179
188
  const gapLimit =
180
189
  this.#config?.compatibilityModeGapLimits?.[walletAccountInstance.compatibilityMode]
181
190
  if (typeof gapLimit === 'number') {
package/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type assetsApiDefinition from './api/index.js'
2
2
 
3
+ export type { AssetsModule } from './module/assets-module.js'
3
4
  export { TokenStatus } from './api/index.js'
4
5
 
5
6
  declare const assets: () => {
@@ -0,0 +1,37 @@
1
+ import type { BaseAsset, TokenAsset, CombinedAsset } from '@exodus/asset-types'
2
+
3
+ type Asset = BaseAsset | TokenAsset | CombinedAsset
4
+ type TokenDefinition = Record<string, unknown>
5
+
6
+ export declare class AssetsModule {
7
+ initialize(params: {
8
+ assetClientInterface: unknown
9
+ assetsConfig?: Record<string, { config?: Record<string, unknown> }>
10
+ }): void
11
+
12
+ getAssets(): Record<string, Asset>
13
+
14
+ getAsset(assetName: string): Asset | undefined
15
+
16
+ getTokenNames(baseAssetName: string): string[]
17
+
18
+ getBaseAssetNames(): string[]
19
+
20
+ load(): Promise<void>
21
+
22
+ fetchToken(assetId: string, baseAssetName: string): Promise<TokenDefinition>
23
+
24
+ fetchTokens(assetDescriptors: { assetId: string; baseAssetName: string }[]): Promise<Asset[]>
25
+
26
+ addToken(assetId: string, baseAssetName: string): Promise<Asset>
27
+
28
+ addTokens(params: {
29
+ assetIds: string[]
30
+ baseAssetName: string
31
+ allowedStatusList?: string[]
32
+ }): Promise<Asset[]>
33
+
34
+ addRemoteTokens(params: { tokenNames: string[]; allowedStatusList?: string[] }): Promise<string[]>
35
+ }
36
+
37
+ export default AssetsModule
@@ -140,8 +140,23 @@ export class AssetsModule {
140
140
  const { assetsConfig: defaultAssetsConfig = Object.create(null) } = this.#config
141
141
  const assetsList = Object.entries(this.#assetPlugins)
142
142
  .map(([name, assetPlugin]) => {
143
- const config = { ...defaultAssetsConfig[name], ...assetsConfig?.[name]?.config }
144
- const asset = assetPlugin.createAsset({ assetClientInterface, config })
143
+ let asset
144
+
145
+ try {
146
+ const config = { ...defaultAssetsConfig[name], ...assetsConfig?.[name]?.config }
147
+ asset = assetPlugin.createAsset({ assetClientInterface, config })
148
+ } catch (e) {
149
+ this.#logger.error(
150
+ `failed to createAsset ${name} using custom assetsConfig: ${e.message}, using default configuration`,
151
+ e
152
+ )
153
+
154
+ asset = assetPlugin.createAsset({
155
+ assetClientInterface,
156
+ config: defaultAssetsConfig[name],
157
+ })
158
+ }
159
+
145
160
  if (asset.name === name) return asset
146
161
  console.warn(`Incorrectly referenced supported asset ${name}. Expected ${asset.name}.`)
147
162
  })
@@ -460,6 +475,7 @@ export class AssetsModule {
460
475
  baseAssetName,
461
476
  lifecycleStatus,
462
477
  query,
478
+ tags,
463
479
  excludeTags = ['offensive'],
464
480
  pageNumber,
465
481
  pageSize,
@@ -482,7 +498,15 @@ export class AssetsModule {
482
498
 
483
499
  const tokens = await this.#fetch(
484
500
  'search',
485
- { baseAssetName: baseAssetNames, lifecycleStatus, query, excludeTags, pageNumber, pageSize },
501
+ {
502
+ baseAssetName: baseAssetNames,
503
+ lifecycleStatus,
504
+ query,
505
+ tags,
506
+ excludeTags,
507
+ pageNumber,
508
+ pageSize,
509
+ },
486
510
  'tokens'
487
511
  )
488
512
  const validTokens = tokens.filter(this.#isValidCustomToken)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exodus/assets-feature",
3
- "version": "9.0.0",
3
+ "version": "9.1.0",
4
4
  "license": "MIT",
5
5
  "description": "This Exodus SDK feature provides access to instances of all blockchain asset adapters supported by the wallet, and enables you to search for and add custom tokens at runtime.",
6
6
  "type": "module",
@@ -37,10 +37,11 @@
37
37
  "dependencies": {
38
38
  "@exodus/asset-legacy-token-name-mapping": "^1.4.0",
39
39
  "@exodus/asset-lib": "^5.3.0",
40
- "@exodus/asset-schema-validation": "^1.0.1",
40
+ "@exodus/asset-schema-validation": "^1.2.0",
41
+ "@exodus/asset-types": "^0.3.0",
41
42
  "@exodus/assets": "^11.3.0",
42
- "@exodus/atoms": "^9.0.0",
43
- "@exodus/basic-utils": "^3.6.0",
43
+ "@exodus/atoms": "^10.3.3",
44
+ "@exodus/basic-utils": "^5.0.0",
44
45
  "@exodus/fetch": "^1.3.0",
45
46
  "@exodus/fusion-atoms": "^1.4.0",
46
47
  "@exodus/timer": "^1.1.2",
@@ -55,12 +56,12 @@
55
56
  "@exodus/bip39": "^1.1.0",
56
57
  "@exodus/bip44-constants": "^195.0.0",
57
58
  "@exodus/bitcoin-meta": "^2.0.0",
58
- "@exodus/bitcoin-plugin": "^1.29.1",
59
- "@exodus/bitcoinregtest-plugin": "^1.11.0",
60
- "@exodus/bitcointestnet-plugin": "^1.13.1",
61
- "@exodus/blockchain-metadata": "^17.1.0",
59
+ "@exodus/bitcoin-plugin": "^2.0.0",
60
+ "@exodus/bitcoinregtest-plugin": "^2.0.0",
61
+ "@exodus/bitcointestnet-plugin": "^2.0.0",
62
+ "@exodus/blockchain-metadata": "^17.1.1",
62
63
  "@exodus/cardano-lib": "^4.0.0",
63
- "@exodus/combined-assets-meta": "^3.0.0",
64
+ "@exodus/combined-assets-meta": "^3.7.0",
64
65
  "@exodus/cosmos-plugin": "^1.3.3",
65
66
  "@exodus/ethereum-lib": "^5.0.0",
66
67
  "@exodus/ethereum-meta": "^2.0.0",
@@ -68,12 +69,12 @@
68
69
  "@exodus/fusion-local": "^2.1.0",
69
70
  "@exodus/keychain": "^9.0.3",
70
71
  "@exodus/logger": "^1.2.3",
71
- "@exodus/models": "^12.19.0",
72
+ "@exodus/models": "^13.2.0",
72
73
  "@exodus/osmosis-plugin": "^1.3.3",
73
74
  "@exodus/public-key-provider": "^4.2.1",
74
- "@exodus/redux-dependency-injection": "^4.1.2",
75
- "@exodus/storage-memory": "^2.3.0",
76
- "@exodus/wallet-accounts": "^20.2.1",
75
+ "@exodus/redux-dependency-injection": "^4.2.0",
76
+ "@exodus/storage-memory": "^2.4.0",
77
+ "@exodus/wallet-accounts": "^20.4.3",
77
78
  "@exodus/wild-emitter": "^1.0.0",
78
79
  "events": "^3.3.0",
79
80
  "msw": "^2.0.0",
@@ -83,5 +84,5 @@
83
84
  "access": "public",
84
85
  "provenance": false
85
86
  },
86
- "gitHead": "e4705df6624c1fe8793d11ecd99351bdb6bb3687"
87
+ "gitHead": "b58f4d5c33731861e8613ff3321f55a54463267b"
87
88
  }
package/plugin/index.js CHANGED
@@ -43,7 +43,12 @@ const createAssetsPlugin = ({
43
43
  return result?.config?.assets
44
44
  }
45
45
 
46
+ const onCreate = () => {
47
+ assetClientInterface.setFreshlyCreated(true)
48
+ }
49
+
46
50
  const onImport = async () => {
51
+ assetClientInterface.setFreshlyCreated(false)
47
52
  const assetsConfig = await getRemoteAssetsConfig()
48
53
  assetsModule.initialize({ assetClientInterface, assetsConfig })
49
54
  }
@@ -103,6 +108,7 @@ const createAssetsPlugin = ({
103
108
  }
104
109
 
105
110
  return {
111
+ onCreate,
106
112
  onImport: Object.defineProperty(onImport, 'priority', { value: 1, writable: false }),
107
113
  onStart: Object.defineProperty(onStart, 'priority', { value: 1, writable: false }),
108
114
  onLoad,