@exodus/assets-feature 5.12.0 → 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,13 @@
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
+
6
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)
7
14
 
8
15
  ### Features
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
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,12 +1,22 @@
1
1
  import { omit } from '@exodus/basic-utils'
2
+ import assert from 'minimalistic-assert'
2
3
 
3
4
  class AssetPreferences {
4
5
  #disabledPurposesAtom
5
6
  #multiAddressModeAtom
7
+ #legacyAddressModeAtom
8
+ #taprootAddressModeAtom
6
9
 
7
- constructor({ disabledPurposesAtom, multiAddressModeAtom }) {
10
+ constructor({
11
+ disabledPurposesAtom,
12
+ multiAddressModeAtom,
13
+ legacyAddressModeAtom,
14
+ taprootAddressModeAtom,
15
+ }) {
8
16
  this.#disabledPurposesAtom = disabledPurposesAtom
9
17
  this.#multiAddressModeAtom = multiAddressModeAtom
18
+ this.#legacyAddressModeAtom = legacyAddressModeAtom
19
+ this.#taprootAddressModeAtom = taprootAddressModeAtom
10
20
  }
11
21
 
12
22
  enableMultiAddressMode = ({ assetNames }) =>
@@ -21,6 +31,54 @@ class AssetPreferences {
21
31
  disableMultiAddressMode = ({ assetNames }) =>
22
32
  this.#multiAddressModeAtom.set((value) => omit(value, assetNames))
23
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
+
24
82
  disablePurpose = ({ assetName, purpose }) =>
25
83
  this.#disabledPurposesAtom.set((value) => {
26
84
  const assetValue = value[assetName] || []
@@ -50,7 +108,12 @@ const assetPreferencesDefinition = {
50
108
  id: 'assetPreferences',
51
109
  type: 'module',
52
110
  factory: (opts) => new AssetPreferences(opts),
53
- dependencies: ['disabledPurposesAtom', 'multiAddressModeAtom'],
111
+ dependencies: [
112
+ 'disabledPurposesAtom',
113
+ 'multiAddressModeAtom',
114
+ 'legacyAddressModeAtom',
115
+ 'taprootAddressModeAtom',
116
+ ],
54
117
  public: true,
55
118
  }
56
119
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exodus/assets-feature",
3
- "version": "5.12.0",
3
+ "version": "5.13.0",
4
4
  "license": "UNLICENSED",
5
5
  "description": "Assets module, clients and apis",
6
6
  "type": "module",
@@ -34,9 +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/fusion-atoms": "^1.2.0",
40
41
  "@exodus/timer": "^1.1.2",
41
42
  "lodash": "^4.17.21",
42
43
  "minimalistic-assert": "^1.0.1",
@@ -44,7 +45,7 @@
44
45
  "reselect": "^3.0.1"
45
46
  },
46
47
  "devDependencies": {
47
- "@exodus/available-assets": "^8.5.0",
48
+ "@exodus/available-assets": "^8.6.0",
48
49
  "@exodus/bip44-constants": "^195.0.0",
49
50
  "@exodus/bitcoin-meta": "^2.0.0",
50
51
  "@exodus/bitcoin-plugin": "^1.0.3",
@@ -56,12 +57,13 @@
56
57
  "@exodus/cosmos-plugin": "^1.0.0",
57
58
  "@exodus/ethereum-lib": "^5.0.0",
58
59
  "@exodus/ethereum-meta": "^2.0.0",
60
+ "@exodus/fusion-local": "^2.0.6",
59
61
  "@exodus/keychain": "^6.9.1",
60
62
  "@exodus/models": "^12.0.1",
61
63
  "@exodus/osmosis-plugin": "^1.0.0",
62
64
  "@exodus/public-key-provider": "^2.5.0",
63
65
  "@exodus/redux-dependency-injection": "^4.0.3",
64
- "@exodus/storage-memory": "^2.2.0",
66
+ "@exodus/storage-memory": "^2.2.1",
65
67
  "@exodus/wallet-accounts": "^16.12.0",
66
68
  "@exodus/wild-emitter": "^1.0.0",
67
69
  "bip39": "^3.1.0",
@@ -69,5 +71,5 @@
69
71
  "msw": "^2.0.0",
70
72
  "redux": "^4.0.0"
71
73
  },
72
- "gitHead": "ffece5dfcf5af37baf7382c8413a4c1639fba228"
74
+ "gitHead": "bad902c3b2bf0c642f82378bb183fb687caab356"
73
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.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
 
@@ -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