@exodus/assets-feature 5.12.0 → 5.13.1
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 +13 -0
- package/api/index.js +4 -0
- package/atoms/legacy-address-mode.js +32 -0
- package/atoms/multi-address-mode.js +37 -4
- package/atoms/taproot-address-mode.js +32 -0
- package/index.js +4 -0
- package/module/asset-preferences.js +65 -2
- package/package.json +7 -5
- package/plugin/index.js +6 -0
- package/redux/index.js +8 -0
- package/redux/initial-state.js +2 -0
- package/redux/selectors/index.js +26 -0
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.1](https://github.com/ExodusMovement/exodus-hydra/compare/@exodus/assets-feature@5.13.0...@exodus/assets-feature@5.13.1) (2024-10-02)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
- **asset-preferences:** fusion atom write ([#9692](https://github.com/ExodusMovement/exodus-hydra/issues/9692)) ([304dc06](https://github.com/ExodusMovement/exodus-hydra/commit/304dc063e34f0cccd60a2a66455a841a1e5b6c57))
|
|
11
|
+
|
|
12
|
+
## [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)
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
- **asset-preferences:** add syncable bitcoin preferences ([#9652](https://github.com/ExodusMovement/exodus-hydra/issues/9652)) ([14dad30](https://github.com/ExodusMovement/exodus-hydra/commit/14dad306e1fdbbec0095737aafe37bd9573d426a))
|
|
17
|
+
- use atoms v9 ([#9651](https://github.com/ExodusMovement/exodus-hydra/issues/9651)) ([524aa61](https://github.com/ExodusMovement/exodus-hydra/commit/524aa61f69c81e6ac00b2f94ea830688a105b3e4))
|
|
18
|
+
|
|
6
19
|
## [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
20
|
|
|
8
21
|
### 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,32 @@
|
|
|
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
|
+
await bitcoinFusionAtom.set(bitcoin || false)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return { ...computedAtom, set }
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const legacyAddressModeAtomDefinition = {
|
|
25
|
+
id: 'legacyAddressModeAtom',
|
|
26
|
+
type: 'atom',
|
|
27
|
+
factory: createLegacyAddressModeAtom,
|
|
28
|
+
dependencies: ['fusion'],
|
|
29
|
+
public: true,
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
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
|
|
4
|
-
|
|
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 || false), 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,32 @@
|
|
|
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
|
+
await bitcoinFusionAtom.set(bitcoin || false)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return { ...computedAtom, set }
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const taprootAddressModeAtomDefinition = {
|
|
25
|
+
id: 'taprootAddressModeAtom',
|
|
26
|
+
type: 'atom',
|
|
27
|
+
factory: createTaprootAddressModeAtom,
|
|
28
|
+
dependencies: ['fusion'],
|
|
29
|
+
public: true,
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
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({
|
|
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: [
|
|
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.
|
|
3
|
+
"version": "5.13.1",
|
|
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": "^
|
|
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.
|
|
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.
|
|
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": "
|
|
74
|
+
"gitHead": "4d9adbf1ee447a7c2cf629104a7f5fea06791b90"
|
|
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,
|
package/redux/initial-state.js
CHANGED
package/redux/selectors/index.js
CHANGED
|
@@ -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
|