@exodus/assets-feature 5.11.3 → 5.13.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,19 @@
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
+ ## [5.13.0](https://github.com/ExodusMovement/exodus-hydra/compare/@exodus/assets-feature@5.12.0...@exodus/assets-feature@5.13.0) (2024-10-02)
7
+
8
+ ### Features
9
+
10
+ - **asset-preferences:** add syncable bitcoin preferences ([#9652](https://github.com/ExodusMovement/exodus-hydra/issues/9652)) ([14dad30](https://github.com/ExodusMovement/exodus-hydra/commit/14dad306e1fdbbec0095737aafe37bd9573d426a))
11
+ - use atoms v9 ([#9651](https://github.com/ExodusMovement/exodus-hydra/issues/9651)) ([524aa61](https://github.com/ExodusMovement/exodus-hydra/commit/524aa61f69c81e6ac00b2f94ea830688a105b3e4))
12
+
13
+ ## [5.12.0](https://github.com/ExodusMovement/exodus-hydra/compare/@exodus/assets-feature@5.11.3...@exodus/assets-feature@5.12.0) (2024-09-24)
14
+
15
+ ### Features
16
+
17
+ - allow returning highest unused indexes ([#9498](https://github.com/ExodusMovement/exodus-hydra/issues/9498)) ([df90160](https://github.com/ExodusMovement/exodus-hydra/commit/df90160623e62d1118ed11b887173966d8924350))
18
+
6
19
  ## [5.11.3](https://github.com/ExodusMovement/exodus-hydra/compare/@exodus/assets-feature@5.11.2...@exodus/assets-feature@5.11.3) (2024-09-09)
7
20
 
8
21
  **Note:** Version bump only for package @exodus/assets-feature
package/api/index.js CHANGED
@@ -3,6 +3,10 @@ const createAssetsApi = ({ assetPreferences, assetsModule }) => {
3
3
  assetPreferences: {
4
4
  enableMultiAddressMode: assetPreferences.enableMultiAddressMode,
5
5
  disableMultiAddressMode: assetPreferences.disableMultiAddressMode,
6
+ enableLegacyAddressMode: assetPreferences.enableLegacyAddressMode,
7
+ disableLegacyAddressMode: assetPreferences.disableLegacyAddressMode,
8
+ enableTaprootAddressMode: assetPreferences.enableTaprootAddressMode,
9
+ disableTaprootAddressMode: assetPreferences.disableTaprootAddressMode,
6
10
  disablePurpose: assetPreferences.disablePurpose,
7
11
  enablePurpose: assetPreferences.enablePurpose,
8
12
  },
@@ -0,0 +1,34 @@
1
+ import { compute } from '@exodus/atoms'
2
+ import { createFusionAtom } from '@exodus/fusion-atoms'
3
+
4
+ const createLegacyAddressModeAtom = ({ fusion }) => {
5
+ const bitcoinFusionAtom = createFusionAtom({
6
+ fusion,
7
+ path: `bitcoinLegacyAddressEnabled`,
8
+ })
9
+
10
+ const computedAtom = compute({
11
+ atom: bitcoinFusionAtom,
12
+ selector: (bitcoin) => (bitcoin === undefined ? {} : { bitcoin }),
13
+ })
14
+
15
+ const set = async (value) => {
16
+ const { bitcoin } = typeof value === 'function' ? value(await computedAtom.get()) : value
17
+
18
+ if (bitcoin !== undefined) {
19
+ await bitcoinFusionAtom.set(bitcoin)
20
+ }
21
+ }
22
+
23
+ return { ...computedAtom, set }
24
+ }
25
+
26
+ const legacyAddressModeAtomDefinition = {
27
+ id: 'legacyAddressModeAtom',
28
+ type: 'atom',
29
+ factory: createLegacyAddressModeAtom,
30
+ dependencies: ['fusion'],
31
+ public: true,
32
+ }
33
+
34
+ export default legacyAddressModeAtomDefinition
@@ -1,18 +1,51 @@
1
- import { createStorageAtomFactory } from '@exodus/atoms'
1
+ import { combine, compute, createStorageAtomFactory } from '@exodus/atoms'
2
+ import { omitBy } from '@exodus/basic-utils'
3
+ import { createFusionAtom } from '@exodus/fusion-atoms'
4
+ import lodash from 'lodash'
2
5
 
3
- const createMultiAddressModeAtom = ({ storage, logger, config }) => {
4
- return createStorageAtomFactory({ storage, logger })({
6
+ const { isUndefined } = lodash
7
+
8
+ const createMultiAddressModeAtom = ({ storage, fusion, logger, config }) => {
9
+ const storageAtom = createStorageAtomFactory({ storage, logger })({
5
10
  key: 'multiAddressMode',
6
11
  defaultValue: config.defaults ?? {},
7
12
  isSoleWriter: true,
8
13
  })
14
+
15
+ const bitcoinFusionAtom = createFusionAtom({
16
+ fusion,
17
+ path: `enableMultipleAddresses`,
18
+ })
19
+
20
+ const combinedAtom = combine({
21
+ storage: storageAtom,
22
+ bitcoin: bitcoinFusionAtom,
23
+ })
24
+
25
+ const computedAtom = compute({
26
+ atom: combinedAtom,
27
+ selector: ({ storage, bitcoin }) => omitBy({ ...storage, bitcoin }, isUndefined),
28
+ })
29
+
30
+ const set = async (value) => {
31
+ const { bitcoin, ...rest } =
32
+ typeof value === 'function' ? value(await computedAtom.get()) : value
33
+
34
+ await Promise.all([bitcoinFusionAtom.set(bitcoin), storageAtom.set(rest)])
35
+ }
36
+
37
+ const reset = async () => {
38
+ await storageAtom.reset()
39
+ }
40
+
41
+ return { ...computedAtom, set, reset }
9
42
  }
10
43
 
11
44
  const multiAddressModeAtomDefinition = {
12
45
  id: 'multiAddressModeAtom',
13
46
  type: 'atom',
14
47
  factory: createMultiAddressModeAtom,
15
- dependencies: ['storage', 'logger', 'config'],
48
+ dependencies: ['storage', 'fusion', 'logger', 'config'],
16
49
  public: true,
17
50
  }
18
51
 
@@ -0,0 +1,34 @@
1
+ import { compute } from '@exodus/atoms'
2
+ import { createFusionAtom } from '@exodus/fusion-atoms'
3
+
4
+ const createTaprootAddressModeAtom = ({ fusion }) => {
5
+ const bitcoinFusionAtom = createFusionAtom({
6
+ fusion,
7
+ path: `bitcoinTaprootAddressEnabled`,
8
+ })
9
+
10
+ const computedAtom = compute({
11
+ atom: bitcoinFusionAtom,
12
+ selector: (bitcoin) => (bitcoin === undefined ? {} : { bitcoin }),
13
+ })
14
+
15
+ const set = async (value) => {
16
+ const { bitcoin } = typeof value === 'function' ? value(await computedAtom.get()) : value
17
+
18
+ if (bitcoin !== undefined) {
19
+ await bitcoinFusionAtom.set(bitcoin)
20
+ }
21
+ }
22
+
23
+ return { ...computedAtom, set }
24
+ }
25
+
26
+ const taprootAddressModeAtomDefinition = {
27
+ id: 'taprootAddressModeAtom',
28
+ type: 'atom',
29
+ factory: createTaprootAddressModeAtom,
30
+ dependencies: ['fusion'],
31
+ public: true,
32
+ }
33
+
34
+ export default taprootAddressModeAtomDefinition
@@ -1,5 +1,5 @@
1
1
  import { pickBy, filterAsync } from '@exodus/basic-utils'
2
- import lodash from 'lodash' // eslint-disable-line @exodus/restricted-imports/prefer-basic-utils
2
+ import lodash from 'lodash'
3
3
  import assert from 'minimalistic-assert'
4
4
 
5
5
  const { isEmpty } = lodash
@@ -313,10 +313,11 @@ class AssetClientInterface {
313
313
  })
314
314
  }
315
315
 
316
- getUnusedAddressIndexes = async ({ assetName, walletAccount }) => {
316
+ getUnusedAddressIndexes = async ({ assetName, walletAccount, highestUnusedIndexes }) => {
317
317
  return this.addressProvider.getUnusedAddressIndexes({
318
318
  assetName,
319
319
  walletAccount: await this.#getWalletAccount(walletAccount),
320
+ highestUnusedIndexes,
320
321
  })
321
322
  }
322
323
 
package/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import assetsApiDefinition from './api/index.js'
1
+ import type assetsApiDefinition from './api/index.js'
2
2
 
3
3
  declare const assets: () => {
4
4
  id: 'assets'
package/index.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import assetsClientInterfaceDefinition from './client/index.js'
2
2
  import assetsPluginDefinition from './plugin/index.js'
3
3
  import multiAddressModeAtomDefinition from './atoms/multi-address-mode.js'
4
+ import legacyAddressModeAtomDefinition from './atoms/legacy-address-mode.js'
5
+ import taprootAddressModeAtomDefinition from './atoms/taproot-address-mode.js'
4
6
  import disabledPurposesAtomDefinition from './atoms/disabled-purposes.js'
5
7
  import assetsApiDefinition from './api/index.js'
6
8
  import assetModuleDefinition from './module/index.js'
@@ -19,6 +21,8 @@ const assets = ({ config = {} } = {}) => {
19
21
  storage: { namespace: 'assetPreferences' },
20
22
  config: config.multiAddressMode || {},
21
23
  },
24
+ { definition: legacyAddressModeAtomDefinition },
25
+ { definition: taprootAddressModeAtomDefinition },
22
26
  { definition: assetsAtomDefinition },
23
27
  {
24
28
  definition: disabledPurposesAtomDefinition,
@@ -1,17 +1,22 @@
1
- import ExodusModule from '@exodus/module' // eslint-disable-line import/no-deprecated
2
1
  import { omit } from '@exodus/basic-utils'
2
+ import assert from 'minimalistic-assert'
3
3
 
4
- const MODULE_ID = 'assetPreferences'
5
-
6
- class AssetPreferences extends ExodusModule {
4
+ class AssetPreferences {
7
5
  #disabledPurposesAtom
8
6
  #multiAddressModeAtom
7
+ #legacyAddressModeAtom
8
+ #taprootAddressModeAtom
9
9
 
10
- constructor({ disabledPurposesAtom, multiAddressModeAtom, logger }) {
11
- super({ name: MODULE_ID, logger })
12
-
10
+ constructor({
11
+ disabledPurposesAtom,
12
+ multiAddressModeAtom,
13
+ legacyAddressModeAtom,
14
+ taprootAddressModeAtom,
15
+ }) {
13
16
  this.#disabledPurposesAtom = disabledPurposesAtom
14
17
  this.#multiAddressModeAtom = multiAddressModeAtom
18
+ this.#legacyAddressModeAtom = legacyAddressModeAtom
19
+ this.#taprootAddressModeAtom = taprootAddressModeAtom
15
20
  }
16
21
 
17
22
  enableMultiAddressMode = ({ assetNames }) =>
@@ -26,6 +31,54 @@ class AssetPreferences extends ExodusModule {
26
31
  disableMultiAddressMode = ({ assetNames }) =>
27
32
  this.#multiAddressModeAtom.set((value) => omit(value, assetNames))
28
33
 
34
+ enableLegacyAddressMode = async ({ assetNames }) => {
35
+ assert(
36
+ assetNames.length === 1 && assetNames[0] === 'bitcoin',
37
+ 'enableLegacyAddressMode only supports bitcoin'
38
+ )
39
+
40
+ await this.#legacyAddressModeAtom.set((value) => ({
41
+ ...value,
42
+ ...assetNames.reduce((acc, assetName) => {
43
+ acc[assetName] = true
44
+ return acc
45
+ }, {}),
46
+ }))
47
+ }
48
+
49
+ disableLegacyAddressMode = async ({ assetNames }) => {
50
+ assert(
51
+ assetNames.length === 1 && assetNames[0] === 'bitcoin',
52
+ 'disableLegacyAddressMode only supports bitcoin'
53
+ )
54
+
55
+ await this.#legacyAddressModeAtom.set((value) => omit(value, assetNames))
56
+ }
57
+
58
+ enableTaprootAddressMode = async ({ assetNames }) => {
59
+ assert(
60
+ assetNames.length === 1 && assetNames[0] === 'bitcoin',
61
+ 'enableTaprootAddressMode only supports bitcoin'
62
+ )
63
+
64
+ await this.#taprootAddressModeAtom.set((value) => ({
65
+ ...value,
66
+ ...assetNames.reduce((acc, assetName) => {
67
+ acc[assetName] = true
68
+ return acc
69
+ }, {}),
70
+ }))
71
+ }
72
+
73
+ disableTaprootAddressMode = async ({ assetNames }) => {
74
+ assert(
75
+ assetNames.length === 1 && assetNames[0] === 'bitcoin',
76
+ 'disableTaprootAddressMode only supports bitcoin'
77
+ )
78
+
79
+ await this.#taprootAddressModeAtom.set((value) => omit(value, assetNames))
80
+ }
81
+
29
82
  disablePurpose = ({ assetName, purpose }) =>
30
83
  this.#disabledPurposesAtom.set((value) => {
31
84
  const assetValue = value[assetName] || []
@@ -52,10 +105,15 @@ class AssetPreferences extends ExodusModule {
52
105
  }
53
106
 
54
107
  const assetPreferencesDefinition = {
55
- id: MODULE_ID,
108
+ id: 'assetPreferences',
56
109
  type: 'module',
57
110
  factory: (opts) => new AssetPreferences(opts),
58
- dependencies: ['disabledPurposesAtom', 'multiAddressModeAtom', 'logger'],
111
+ dependencies: [
112
+ 'disabledPurposesAtom',
113
+ 'multiAddressModeAtom',
114
+ 'legacyAddressModeAtom',
115
+ 'taprootAddressModeAtom',
116
+ ],
59
117
  public: true,
60
118
  }
61
119
 
@@ -5,7 +5,7 @@ import {
5
5
  CT_UPDATEABLE_PROPERTIES,
6
6
  } from '@exodus/assets'
7
7
  import { keyBy, mapValues, partition, pick, pickBy } from '@exodus/basic-utils'
8
- import lodash from 'lodash' // eslint-disable-line @exodus/restricted-imports/prefer-basic-utils
8
+ import lodash from 'lodash'
9
9
  import assert from 'minimalistic-assert'
10
10
 
11
11
  import {
package/module/utils.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { CT_STATUS as STATUS } from '@exodus/assets'
2
- import lodash from 'lodash' // eslint-disable-line @exodus/restricted-imports/prefer-basic-utils
2
+ import lodash from 'lodash'
3
3
  import assert from 'minimalistic-assert'
4
4
 
5
5
  const { get } = lodash
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exodus/assets-feature",
3
- "version": "5.11.3",
3
+ "version": "5.13.0",
4
4
  "license": "UNLICENSED",
5
5
  "description": "Assets module, clients and apis",
6
6
  "type": "module",
@@ -34,10 +34,10 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "@exodus/assets": "^11.0.0",
37
- "@exodus/atoms": "^8.1.1",
37
+ "@exodus/atoms": "^9.0.0",
38
38
  "@exodus/basic-utils": "^3.0.1",
39
39
  "@exodus/fetch": "^1.3.0",
40
- "@exodus/module": "^1.2.2",
40
+ "@exodus/fusion-atoms": "^1.2.0",
41
41
  "@exodus/timer": "^1.1.2",
42
42
  "lodash": "^4.17.21",
43
43
  "minimalistic-assert": "^1.0.1",
@@ -45,7 +45,7 @@
45
45
  "reselect": "^3.0.1"
46
46
  },
47
47
  "devDependencies": {
48
- "@exodus/available-assets": "^8.5.0",
48
+ "@exodus/available-assets": "^8.6.0",
49
49
  "@exodus/bip44-constants": "^195.0.0",
50
50
  "@exodus/bitcoin-meta": "^2.0.0",
51
51
  "@exodus/bitcoin-plugin": "^1.0.3",
@@ -57,19 +57,19 @@
57
57
  "@exodus/cosmos-plugin": "^1.0.0",
58
58
  "@exodus/ethereum-lib": "^5.0.0",
59
59
  "@exodus/ethereum-meta": "^2.0.0",
60
+ "@exodus/fusion-local": "^2.0.6",
60
61
  "@exodus/keychain": "^6.9.1",
61
62
  "@exodus/models": "^12.0.1",
62
63
  "@exodus/osmosis-plugin": "^1.0.0",
63
64
  "@exodus/public-key-provider": "^2.5.0",
64
- "@exodus/public-key-store": "^1.2.2",
65
65
  "@exodus/redux-dependency-injection": "^4.0.3",
66
- "@exodus/storage-memory": "^2.2.0",
67
- "@exodus/wallet-accounts": "^16.10.2",
66
+ "@exodus/storage-memory": "^2.2.1",
67
+ "@exodus/wallet-accounts": "^16.12.0",
68
68
  "@exodus/wild-emitter": "^1.0.0",
69
69
  "bip39": "^3.1.0",
70
70
  "events": "^3.3.0",
71
71
  "msw": "^2.0.0",
72
72
  "redux": "^4.0.0"
73
73
  },
74
- "gitHead": "d64de7579b06afe91fbded3d1f7eb29950f82e5a"
74
+ "gitHead": "bad902c3b2bf0c642f82378bb183fb687caab356"
75
75
  }
package/plugin/index.js CHANGED
@@ -8,6 +8,8 @@ const createAssetsPlugin = ({
8
8
  customTokensMonitor,
9
9
  disabledPurposesAtom,
10
10
  multiAddressModeAtom,
11
+ legacyAddressModeAtom,
12
+ taprootAddressModeAtom,
11
13
  }) => {
12
14
  const emitAssets = async () => {
13
15
  const { value: assets } = await assetsAtom.get()
@@ -25,6 +27,8 @@ const createAssetsPlugin = ({
25
27
  const observers = [
26
28
  createAtomObserver({ atom: disabledPurposesAtom, port, event: 'disabledPurposes' }),
27
29
  createAtomObserver({ atom: multiAddressModeAtom, port, event: 'multiAddressMode' }),
30
+ createAtomObserver({ atom: legacyAddressModeAtom, port, event: 'legacyAddressMode' }),
31
+ createAtomObserver({ atom: taprootAddressModeAtom, port, event: 'taprootAddressMode' }),
28
32
  ]
29
33
 
30
34
  const subscribers = []
@@ -90,6 +94,8 @@ const assetsPluginDefinition = {
90
94
  'customTokensMonitor?',
91
95
  'disabledPurposesAtom',
92
96
  'multiAddressModeAtom',
97
+ 'legacyAddressModeAtom',
98
+ 'taprootAddressModeAtom',
93
99
  ],
94
100
  public: true,
95
101
  }
package/redux/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import initialState from './initial-state.js'
2
- import selectorDefinitions from './selectors/index.js'
1
+ import type initialState from './initial-state.js'
2
+ import type selectorDefinitions from './selectors/index.js'
3
3
 
4
4
  declare const assetsReduxDefinition: {
5
5
  id: 'assets'
package/redux/index.js CHANGED
@@ -25,6 +25,14 @@ const assetsReduxDefinition = {
25
25
  ...state,
26
26
  multiAddressMode: payload,
27
27
  }),
28
+ legacyAddressMode: (state, payload) => ({
29
+ ...state,
30
+ legacyAddressMode: payload,
31
+ }),
32
+ taprootAddressMode: (state, payload) => ({
33
+ ...state,
34
+ taprootAddressMode: payload,
35
+ }),
28
36
  disabledPurposes: (state, payload) => ({
29
37
  ...state,
30
38
  disabledPurposes: payload,
@@ -4,6 +4,8 @@ const initialState = {
4
4
  error: null,
5
5
  // asset preferences
6
6
  multiAddressMode: {},
7
+ legacyAddressMode: {},
8
+ taprootAddressMode: {},
7
9
  disabledPurposes: {},
8
10
  }
9
11
 
@@ -1,9 +1,9 @@
1
1
  import { keyBy } from '@exodus/basic-utils'
2
2
  import { createSelector } from 'reselect'
3
3
 
4
- import lodash from 'lodash' // eslint-disable-line @exodus/restricted-imports/prefer-basic-utils
4
+ import lodash from 'lodash'
5
5
 
6
- const { memoize } = lodash
6
+ const { memoize } = lodash // eslint-disable-line @exodus/basic-utils/prefer-basic-utils
7
7
 
8
8
  // just a semantic alias for `data`
9
9
  const allAssetsSelectorDefinition = {
@@ -67,6 +67,30 @@ const createMultiAddressModeSelectorDefinition = {
67
67
  dependencies: [{ selector: 'multiAddressMode' }],
68
68
  }
69
69
 
70
+ const createLegacyAddressModeSelectorDefinition = {
71
+ id: 'createLegacyAddressMode',
72
+ selectorFactory: (legacyAddressModeDataSelector) =>
73
+ memoize((assetName) =>
74
+ createSelector(
75
+ legacyAddressModeDataSelector,
76
+ (legacyAddressModeData) => legacyAddressModeData[assetName] || false
77
+ )
78
+ ),
79
+ dependencies: [{ selector: 'legacyAddressMode' }],
80
+ }
81
+
82
+ const createTaprootAddressModeSelectorDefinition = {
83
+ id: 'createTaprootAddressMode',
84
+ selectorFactory: (taprootAddressModeDataSelector) =>
85
+ memoize((assetName) =>
86
+ createSelector(
87
+ taprootAddressModeDataSelector,
88
+ (taprootAddressModeData) => taprootAddressModeData[assetName] || false
89
+ )
90
+ ),
91
+ dependencies: [{ selector: 'taprootAddressMode' }],
92
+ }
93
+
70
94
  const createDisabledPurposesSelectorDefinition = {
71
95
  id: 'createDisabledPurposes',
72
96
  selectorFactory: (disabledPurposesDataSelector) => {
@@ -91,6 +115,8 @@ const assetSelectors = [
91
115
  getAssetFromTickerSelectorDefinition,
92
116
  createMultiAddressModeSelectorDefinition,
93
117
  createDisabledPurposesSelectorDefinition,
118
+ createLegacyAddressModeSelectorDefinition,
119
+ createTaprootAddressModeSelectorDefinition,
94
120
  ]
95
121
 
96
122
  export default assetSelectors