@rango-dev/wallets-core 0.40.1-next.9 → 0.41.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/dist/hub/store/events.d.ts +54 -0
- package/dist/hub/store/events.d.ts.map +1 -0
- package/dist/hub/store/extend.d.ts +14 -0
- package/dist/hub/store/extend.d.ts.map +1 -0
- package/dist/hub/store/mod.d.ts +3 -1
- package/dist/hub/store/mod.d.ts.map +1 -1
- package/dist/hub/store/mod.js +2 -0
- package/dist/hub/store/mod.js.map +7 -0
- package/dist/hub/store/namespaces.d.ts +10 -7
- package/dist/hub/store/namespaces.d.ts.map +1 -1
- package/dist/hub/store/providers.d.ts +9 -5
- package/dist/hub/store/providers.d.ts.map +1 -1
- package/dist/hub/store/store.d.ts +2 -1
- package/dist/hub/store/store.d.ts.map +1 -1
- package/dist/legacy/mod.js +1 -1
- package/dist/legacy/mod.js.map +2 -2
- package/dist/legacy/types.d.ts +19 -15
- package/dist/legacy/types.d.ts.map +1 -1
- package/dist/legacy/wallet.d.ts +5 -3
- package/dist/legacy/wallet.d.ts.map +1 -1
- package/dist/mod.js +1 -1
- package/dist/mod.js.map +4 -4
- package/dist/namespaces/common/mod.js +1 -1
- package/dist/namespaces/common/mod.js.map +1 -1
- package/dist/namespaces/evm/builders.d.ts.map +1 -1
- package/dist/namespaces/evm/mod.js +1 -1
- package/dist/namespaces/evm/mod.js.map +3 -3
- package/dist/namespaces/solana/builders.d.ts.map +1 -1
- package/dist/namespaces/solana/mod.js +1 -1
- package/dist/namespaces/solana/mod.js.map +3 -3
- package/dist/wallets-core.build.json +1 -1
- package/package.json +8 -4
- package/src/hub/store/events.ts +89 -0
- package/src/hub/store/extend.ts +125 -0
- package/src/hub/store/mod.ts +14 -1
- package/src/hub/store/namespaces.ts +102 -19
- package/src/hub/store/providers.ts +33 -9
- package/src/hub/store/store.test.ts +1 -1
- package/src/hub/store/store.ts +6 -2
- package/src/legacy/types.ts +26 -17
- package/src/legacy/wallet.ts +12 -6
- package/src/namespaces/evm/builders.ts +6 -2
- package/src/namespaces/solana/builders.ts +6 -2
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
Event,
|
|
3
|
+
ProviderConnectedEvent,
|
|
4
|
+
ProviderConnectingEvent,
|
|
5
|
+
ProviderDisconnectedEvent,
|
|
6
|
+
} from './events.js';
|
|
7
|
+
import type { RawStore, State } from './store.js';
|
|
8
|
+
|
|
9
|
+
import { guessProviderStateSelector } from './selectors.js';
|
|
10
|
+
|
|
11
|
+
export interface Store extends Omit<RawStore, 'subscribe'> {
|
|
12
|
+
subscribe(listener: (event: Event, state: State, prevState: State) => void): {
|
|
13
|
+
flushEvents(): void;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Zustand's store provides a set of built-in functionalities,
|
|
19
|
+
* but it may not meet all our requirements.
|
|
20
|
+
* This function modifies the interface and adds or updates the available methods.
|
|
21
|
+
*/
|
|
22
|
+
export function extend(store: RawStore): Store {
|
|
23
|
+
const extendedSubscribe: (store: RawStore) => Store['subscribe'] =
|
|
24
|
+
(store) => (listener) => {
|
|
25
|
+
const executeListener = (
|
|
26
|
+
events: Event[],
|
|
27
|
+
state: State,
|
|
28
|
+
prevState: State
|
|
29
|
+
) => {
|
|
30
|
+
for (const ev of events) {
|
|
31
|
+
listener(ev, state, prevState);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/*
|
|
36
|
+
* only known changes will fire event for lib users
|
|
37
|
+
* so all the changes in store won't trigger a user-face event
|
|
38
|
+
*/
|
|
39
|
+
store.subscribe((state, prevState) => {
|
|
40
|
+
const eventsLike = getEventsLike(state, prevState);
|
|
41
|
+
const events = tryConsumeEvents(state);
|
|
42
|
+
const allQueuedEvents = [...events, ...eventsLike];
|
|
43
|
+
executeListener(allQueuedEvents, state, prevState);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
/**
|
|
48
|
+
* Manually run pending events.
|
|
49
|
+
* This useful when use `subscribe` method after sometime and when store initialized.
|
|
50
|
+
*
|
|
51
|
+
* Note: Please consider both current and previous state will be same and we don't have access to previous state in a such scenario.
|
|
52
|
+
*/
|
|
53
|
+
flushEvents: () => {
|
|
54
|
+
const state = store.getState();
|
|
55
|
+
const events = tryConsumeEvents(state);
|
|
56
|
+
executeListener(events, state, state);
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
return new Proxy(store, {
|
|
62
|
+
get: function (target, prop, receiver) {
|
|
63
|
+
if (prop === 'subscribe') {
|
|
64
|
+
return extendedSubscribe(target);
|
|
65
|
+
}
|
|
66
|
+
return Reflect.get(target, prop, receiver);
|
|
67
|
+
},
|
|
68
|
+
}) as unknown as Store;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Retrieves the ConsumableEvent from the store and returns its values.
|
|
73
|
+
* The values will be consumed by iterating over the field.
|
|
74
|
+
*/
|
|
75
|
+
function tryConsumeEvents(state: State): Event[] {
|
|
76
|
+
return [...state.providers.events, ...state.namespaces.events];
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* In certain cases, adding events to the store is not possible (e.g., namespace or provider layer).
|
|
81
|
+
* In these cases, we observe store changes and treat specific patterns as events when detected.
|
|
82
|
+
*
|
|
83
|
+
* Note: This approach should be avoided in most cases. It is used here to maintain backward compatibility
|
|
84
|
+
* with the provider's legacy interface.
|
|
85
|
+
*/
|
|
86
|
+
function getEventsLike(state: State, prevState: State): Event[] {
|
|
87
|
+
const events: Event[] = [];
|
|
88
|
+
|
|
89
|
+
for (const providerId of Object.keys(state.providers.list)) {
|
|
90
|
+
const currentProviderState = guessProviderStateSelector(state, providerId);
|
|
91
|
+
const previousProviderState = guessProviderStateSelector(
|
|
92
|
+
prevState,
|
|
93
|
+
providerId
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
if (previousProviderState.connecting !== currentProviderState.connecting) {
|
|
97
|
+
const ev: ProviderConnectingEvent = {
|
|
98
|
+
type: 'provider_connecting',
|
|
99
|
+
provider: providerId,
|
|
100
|
+
value: currentProviderState.connecting,
|
|
101
|
+
};
|
|
102
|
+
events.push(ev);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (!previousProviderState.connected && currentProviderState.connected) {
|
|
106
|
+
const ev: ProviderConnectedEvent = {
|
|
107
|
+
type: 'provider_connected',
|
|
108
|
+
provider: providerId,
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
events.push(ev);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (previousProviderState.connected && !currentProviderState.connected) {
|
|
115
|
+
const ev: ProviderDisconnectedEvent = {
|
|
116
|
+
type: 'provider_disconnected',
|
|
117
|
+
provider: providerId,
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
events.push(ev);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return events;
|
|
125
|
+
}
|
package/src/hub/store/mod.ts
CHANGED
|
@@ -2,7 +2,20 @@ export {
|
|
|
2
2
|
guessProviderStateSelector,
|
|
3
3
|
namespaceStateSelector,
|
|
4
4
|
} from './selectors.js';
|
|
5
|
-
export type { Store
|
|
5
|
+
export type { Store } from './extend.js';
|
|
6
|
+
export type { State } from './store.js';
|
|
7
|
+
export type {
|
|
8
|
+
Event,
|
|
9
|
+
// Providers
|
|
10
|
+
ProviderDetectedEvent,
|
|
11
|
+
ProviderConnectingEvent,
|
|
12
|
+
ProviderConnectedEvent,
|
|
13
|
+
ProviderDisconnectedEvent,
|
|
14
|
+
// Namespaces
|
|
15
|
+
NamespaceDisconnectedEvent,
|
|
16
|
+
NamespaceConnectedEvent,
|
|
17
|
+
NamespaceSwitchedAccountEvent,
|
|
18
|
+
} from './events.js';
|
|
6
19
|
export type { ProviderInfo, ProviderConfig } from './providers.js';
|
|
7
20
|
export type { NamespaceConfig, NamespaceData } from './namespaces.js';
|
|
8
21
|
export { createStore } from './store.js';
|
|
@@ -4,12 +4,17 @@ import type { StateCreator } from 'zustand';
|
|
|
4
4
|
|
|
5
5
|
import { produce } from 'immer';
|
|
6
6
|
|
|
7
|
+
import {
|
|
8
|
+
ConsumableEvents,
|
|
9
|
+
type NamespaceConnectedEvent,
|
|
10
|
+
type NamespaceDisconnectedEvent,
|
|
11
|
+
type NamespaceSwitchedAccountEvent,
|
|
12
|
+
type NamespaceSwitchedNetworkEvent,
|
|
13
|
+
} from './events.js';
|
|
7
14
|
import { namespaceStateSelector, type State } from './mod.js';
|
|
8
15
|
|
|
9
|
-
//
|
|
10
|
-
export
|
|
11
|
-
// Currently, namespace doesn't has any config.
|
|
12
|
-
}
|
|
16
|
+
// Currently, namespace doesn't has any config.
|
|
17
|
+
export type NamespaceConfig = object;
|
|
13
18
|
|
|
14
19
|
export interface NamespaceData {
|
|
15
20
|
accounts: null | string[];
|
|
@@ -23,15 +28,15 @@ interface NamespaceInfo {
|
|
|
23
28
|
namespaceId: string;
|
|
24
29
|
}
|
|
25
30
|
|
|
31
|
+
interface NamespaceItem {
|
|
32
|
+
info: NamespaceInfo;
|
|
33
|
+
data: NamespaceData;
|
|
34
|
+
error: unknown;
|
|
35
|
+
}
|
|
36
|
+
|
|
26
37
|
type NamespaceState = {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
{
|
|
30
|
-
info: NamespaceInfo;
|
|
31
|
-
data: NamespaceData;
|
|
32
|
-
error: unknown;
|
|
33
|
-
}
|
|
34
|
-
>;
|
|
38
|
+
events: InstanceType<typeof ConsumableEvents>;
|
|
39
|
+
list: Record<string, NamespaceItem>;
|
|
35
40
|
};
|
|
36
41
|
|
|
37
42
|
interface NamespaceActions {
|
|
@@ -41,6 +46,13 @@ interface NamespaceActions {
|
|
|
41
46
|
key: K,
|
|
42
47
|
value: NamespaceData[K]
|
|
43
48
|
) => void;
|
|
49
|
+
|
|
50
|
+
_produceEventsWhenUpdatingStatus: <K extends keyof NamespaceData>(
|
|
51
|
+
namespace: NamespaceItem,
|
|
52
|
+
id: string,
|
|
53
|
+
key: K,
|
|
54
|
+
value: NamespaceData[K]
|
|
55
|
+
) => void;
|
|
44
56
|
}
|
|
45
57
|
interface NamespaceSelectors {
|
|
46
58
|
getNamespaceData(storeId: string): NamespaceData;
|
|
@@ -52,15 +64,19 @@ export type NamespaceStore = NamespaceState &
|
|
|
52
64
|
type NamespaceStateCreator = StateCreator<State, [], [], NamespaceStore>;
|
|
53
65
|
|
|
54
66
|
const namespacesStore: NamespaceStateCreator = (set, get) => ({
|
|
67
|
+
events: new ConsumableEvents(),
|
|
68
|
+
|
|
55
69
|
list: {},
|
|
56
70
|
addNamespace: (id, info) => {
|
|
71
|
+
const data: NamespaceData = {
|
|
72
|
+
accounts: null,
|
|
73
|
+
network: null,
|
|
74
|
+
connected: false,
|
|
75
|
+
connecting: false,
|
|
76
|
+
};
|
|
77
|
+
|
|
57
78
|
const item = {
|
|
58
|
-
data
|
|
59
|
-
accounts: null,
|
|
60
|
-
network: null,
|
|
61
|
-
connected: false,
|
|
62
|
-
connecting: false,
|
|
63
|
-
},
|
|
79
|
+
data,
|
|
64
80
|
error: '',
|
|
65
81
|
info,
|
|
66
82
|
};
|
|
@@ -72,10 +88,14 @@ const namespacesStore: NamespaceStateCreator = (set, get) => ({
|
|
|
72
88
|
);
|
|
73
89
|
},
|
|
74
90
|
updateStatus: (id, key, value) => {
|
|
75
|
-
|
|
91
|
+
const ns = get().namespaces.list[id];
|
|
92
|
+
if (!ns) {
|
|
76
93
|
throw new Error(`No namespace with '${id}' found.`);
|
|
77
94
|
}
|
|
78
95
|
|
|
96
|
+
get().namespaces._produceEventsWhenUpdatingStatus(ns, id, key, value);
|
|
97
|
+
|
|
98
|
+
// Updating state
|
|
79
99
|
set(
|
|
80
100
|
produce((state: State) => {
|
|
81
101
|
state.namespaces.list[id].data[key] = value;
|
|
@@ -85,6 +105,69 @@ const namespacesStore: NamespaceStateCreator = (set, get) => ({
|
|
|
85
105
|
getNamespaceData(storeId) {
|
|
86
106
|
return namespaceStateSelector(get(), storeId);
|
|
87
107
|
},
|
|
108
|
+
|
|
109
|
+
_produceEventsWhenUpdatingStatus: (namespace, id, key, value) => {
|
|
110
|
+
if (key === 'accounts') {
|
|
111
|
+
// check for both null and empty array
|
|
112
|
+
const isAccountsEmpty =
|
|
113
|
+
Object.is(value, null) || (Array.isArray(value) && value.length === 0);
|
|
114
|
+
|
|
115
|
+
if (isAccountsEmpty) {
|
|
116
|
+
const currentConnectedStatus = get().namespaces.list[id].data.connected;
|
|
117
|
+
if (currentConnectedStatus) {
|
|
118
|
+
const event: NamespaceDisconnectedEvent = {
|
|
119
|
+
type: 'namespace_disconnected',
|
|
120
|
+
provider: namespace.info.providerId,
|
|
121
|
+
namespace: namespace.info.namespaceId,
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
get().namespaces.events.push(event);
|
|
125
|
+
}
|
|
126
|
+
// Skip emitting disconnect event, if the `connected` is false
|
|
127
|
+
} else {
|
|
128
|
+
const currentAccounts = get().namespaces.list[id].data.accounts;
|
|
129
|
+
|
|
130
|
+
if (!currentAccounts) {
|
|
131
|
+
const event: NamespaceConnectedEvent = {
|
|
132
|
+
type: 'namespace_connected',
|
|
133
|
+
provider: namespace.info.providerId,
|
|
134
|
+
namespace: namespace.info.namespaceId,
|
|
135
|
+
accounts: value as string[],
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
get().namespaces.events.push(event);
|
|
139
|
+
} else {
|
|
140
|
+
const areSameAccounts =
|
|
141
|
+
currentAccounts.sort().toString() ===
|
|
142
|
+
(value as string[]).sort().toString();
|
|
143
|
+
|
|
144
|
+
if (!areSameAccounts) {
|
|
145
|
+
const event: NamespaceSwitchedAccountEvent = {
|
|
146
|
+
type: 'namespace_account_switched',
|
|
147
|
+
provider: namespace.info.providerId,
|
|
148
|
+
namespace: namespace.info.namespaceId,
|
|
149
|
+
previousAccounts: currentAccounts,
|
|
150
|
+
accounts: value as string[],
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
get().namespaces.events.push(event);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
} else if (key === 'network') {
|
|
158
|
+
const currentNetwork = get().namespaces.list[id].data.network;
|
|
159
|
+
|
|
160
|
+
const event: NamespaceSwitchedNetworkEvent = {
|
|
161
|
+
type: 'namespace_network_switched',
|
|
162
|
+
provider: namespace.info.providerId,
|
|
163
|
+
namespace: namespace.info.namespaceId,
|
|
164
|
+
network: value as string,
|
|
165
|
+
previousNetwork: currentNetwork,
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
get().namespaces.events.push(event);
|
|
169
|
+
}
|
|
170
|
+
},
|
|
88
171
|
});
|
|
89
172
|
|
|
90
173
|
export { namespacesStore };
|
|
@@ -4,6 +4,7 @@ import type { StateCreator } from 'zustand';
|
|
|
4
4
|
|
|
5
5
|
import { produce } from 'immer';
|
|
6
6
|
|
|
7
|
+
import { ConsumableEvents, type ProviderDetectedEvent } from './events.js';
|
|
7
8
|
import { guessProviderStateSelector, type State } from './mod.js';
|
|
8
9
|
|
|
9
10
|
type Browsers = 'firefox' | 'chrome' | 'edge' | 'brave' | 'homepage';
|
|
@@ -25,15 +26,15 @@ interface ProviderData {
|
|
|
25
26
|
installed: boolean;
|
|
26
27
|
}
|
|
27
28
|
|
|
29
|
+
interface ProviderItem {
|
|
30
|
+
config: ProviderConfig;
|
|
31
|
+
data: ProviderData;
|
|
32
|
+
error: unknown;
|
|
33
|
+
}
|
|
34
|
+
|
|
28
35
|
type ProviderState = {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
{
|
|
32
|
-
config: ProviderConfig;
|
|
33
|
-
data: ProviderData;
|
|
34
|
-
error: unknown;
|
|
35
|
-
}
|
|
36
|
-
>;
|
|
36
|
+
events: ConsumableEvents;
|
|
37
|
+
list: Record<string, ProviderItem>;
|
|
37
38
|
};
|
|
38
39
|
interface ProviderActions {
|
|
39
40
|
addProvider: (id: string, config: ProviderConfig) => void;
|
|
@@ -42,6 +43,13 @@ interface ProviderActions {
|
|
|
42
43
|
key: K,
|
|
43
44
|
value: ProviderData[K]
|
|
44
45
|
) => void;
|
|
46
|
+
|
|
47
|
+
_produceEventsWhenUpdatingStatus: <K extends keyof ProviderData>(
|
|
48
|
+
provider: ProviderItem,
|
|
49
|
+
id: string,
|
|
50
|
+
key: K,
|
|
51
|
+
value: ProviderData[K]
|
|
52
|
+
) => void;
|
|
45
53
|
}
|
|
46
54
|
|
|
47
55
|
interface ProviderSelectors {
|
|
@@ -56,6 +64,8 @@ export type ProviderStore = ProviderState & ProviderActions & ProviderSelectors;
|
|
|
56
64
|
type ProvidersStateCreator = StateCreator<State, [], [], ProviderStore>;
|
|
57
65
|
|
|
58
66
|
const providersStore: ProvidersStateCreator = (set, get) => ({
|
|
67
|
+
events: new ConsumableEvents(),
|
|
68
|
+
|
|
59
69
|
list: {},
|
|
60
70
|
addProvider: (id, config) => {
|
|
61
71
|
const item = {
|
|
@@ -73,10 +83,13 @@ const providersStore: ProvidersStateCreator = (set, get) => ({
|
|
|
73
83
|
);
|
|
74
84
|
},
|
|
75
85
|
updateStatus: (id, key, value) => {
|
|
76
|
-
|
|
86
|
+
const provider = get().providers.list[id];
|
|
87
|
+
if (!provider) {
|
|
77
88
|
throw new Error(`No namespace namespace with '${id}' found.`);
|
|
78
89
|
}
|
|
79
90
|
|
|
91
|
+
get().providers._produceEventsWhenUpdatingStatus(provider, id, key, value);
|
|
92
|
+
|
|
80
93
|
set(
|
|
81
94
|
produce((state: State) => {
|
|
82
95
|
state.providers.list[id].data[key] = value;
|
|
@@ -86,6 +99,17 @@ const providersStore: ProvidersStateCreator = (set, get) => ({
|
|
|
86
99
|
guessNamespacesState: (providerId: string): InternalProviderState => {
|
|
87
100
|
return guessProviderStateSelector(get(), providerId);
|
|
88
101
|
},
|
|
102
|
+
|
|
103
|
+
_produceEventsWhenUpdatingStatus: (_provider, id, key, _value) => {
|
|
104
|
+
if (key === 'installed') {
|
|
105
|
+
const event: ProviderDetectedEvent = {
|
|
106
|
+
type: 'provider_detected',
|
|
107
|
+
provider: id,
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
get().providers.events.push(event);
|
|
111
|
+
}
|
|
112
|
+
},
|
|
89
113
|
});
|
|
90
114
|
|
|
91
115
|
export { providersStore };
|
package/src/hub/store/store.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { StoreApi } from 'zustand/vanilla';
|
|
|
2
2
|
|
|
3
3
|
import { createStore as createZustandStore } from 'zustand/vanilla';
|
|
4
4
|
|
|
5
|
+
import { extend, type Store } from './extend.js';
|
|
5
6
|
import { hubStore, type HubStore } from './hub.js';
|
|
6
7
|
import { namespacesStore, type NamespaceStore } from './namespaces.js';
|
|
7
8
|
import { providersStore, type ProviderStore } from './providers.js';
|
|
@@ -14,13 +15,16 @@ export interface State {
|
|
|
14
15
|
namespaces: NamespaceStore;
|
|
15
16
|
}
|
|
16
17
|
|
|
17
|
-
export type
|
|
18
|
+
export type RawStore = StoreApi<State>;
|
|
19
|
+
|
|
18
20
|
export const createStore = (): Store => {
|
|
19
|
-
|
|
21
|
+
const store = createZustandStore<State>((...api) => {
|
|
20
22
|
return {
|
|
21
23
|
hub: hubStore(...api),
|
|
22
24
|
providers: providersStore(...api),
|
|
23
25
|
namespaces: namespacesStore(...api),
|
|
24
26
|
};
|
|
25
27
|
});
|
|
28
|
+
|
|
29
|
+
return extend(store);
|
|
26
30
|
};
|
package/src/legacy/types.ts
CHANGED
|
@@ -60,11 +60,14 @@ export enum Networks {
|
|
|
60
60
|
UMEE = 'UMEE',
|
|
61
61
|
STARKNET = 'STARKNET',
|
|
62
62
|
TON = 'TON',
|
|
63
|
-
|
|
63
|
+
BASE = 'BASE',
|
|
64
64
|
// Using instead of null
|
|
65
65
|
Unknown = 'Unkown',
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
69
|
+
type InstanceType = any;
|
|
70
|
+
|
|
68
71
|
export type NamespaceData = {
|
|
69
72
|
namespace: Namespace;
|
|
70
73
|
derivationPath?: string;
|
|
@@ -127,10 +130,10 @@ export type State = {
|
|
|
127
130
|
export type ConnectResult = {
|
|
128
131
|
accounts: string[] | null;
|
|
129
132
|
network: Network | null;
|
|
130
|
-
provider:
|
|
133
|
+
provider: InstanceType;
|
|
131
134
|
};
|
|
132
135
|
|
|
133
|
-
export type Providers = { [type in WalletType]?:
|
|
136
|
+
export type Providers = { [type in WalletType]?: InstanceType };
|
|
134
137
|
|
|
135
138
|
export enum Events {
|
|
136
139
|
CONNECTED = 'connected',
|
|
@@ -139,6 +142,10 @@ export enum Events {
|
|
|
139
142
|
INSTALLED = 'installed',
|
|
140
143
|
ACCOUNTS = 'accounts',
|
|
141
144
|
NETWORK = 'network',
|
|
145
|
+
// Hub only events
|
|
146
|
+
NAMESPACE_DISCONNECTED = 'namespace_disconnected',
|
|
147
|
+
|
|
148
|
+
PROVIDER_DISCONNECTED = 'provider_disconnected',
|
|
142
149
|
}
|
|
143
150
|
|
|
144
151
|
export type ProviderConnectResult = {
|
|
@@ -148,7 +155,7 @@ export type ProviderConnectResult = {
|
|
|
148
155
|
|
|
149
156
|
export type GetInstanceOptions = {
|
|
150
157
|
network?: Network;
|
|
151
|
-
currentProvider:
|
|
158
|
+
currentProvider: InstanceType;
|
|
152
159
|
meta: BlockchainMeta[];
|
|
153
160
|
getState: () => WalletState;
|
|
154
161
|
/**
|
|
@@ -162,29 +169,31 @@ export type GetInstanceOptions = {
|
|
|
162
169
|
};
|
|
163
170
|
|
|
164
171
|
export type GetInstance =
|
|
165
|
-
| (() =>
|
|
166
|
-
| ((options: GetInstanceOptions) => Promise<
|
|
172
|
+
| (() => InstanceType)
|
|
173
|
+
| ((options: GetInstanceOptions) => Promise<InstanceType>);
|
|
167
174
|
|
|
168
175
|
export type TryGetInstance =
|
|
169
|
-
| (() =>
|
|
170
|
-
| ((
|
|
176
|
+
| (() => InstanceType)
|
|
177
|
+
| ((
|
|
178
|
+
options: Pick<GetInstanceOptions, 'force' | 'network'>
|
|
179
|
+
) => Promise<InstanceType>);
|
|
171
180
|
|
|
172
181
|
export type Connect = (options: {
|
|
173
|
-
instance:
|
|
182
|
+
instance: InstanceType;
|
|
174
183
|
network?: Network;
|
|
175
184
|
meta: BlockchainMeta[];
|
|
176
185
|
namespaces?: NamespaceData[];
|
|
177
186
|
}) => Promise<ProviderConnectResult | ProviderConnectResult[]>;
|
|
178
187
|
|
|
179
188
|
export type Disconnect = (options: {
|
|
180
|
-
instance:
|
|
189
|
+
instance: InstanceType;
|
|
181
190
|
destroyInstance: () => void;
|
|
182
191
|
}) => Promise<void>;
|
|
183
192
|
|
|
184
193
|
type CleanupSubscribe = () => void;
|
|
185
194
|
|
|
186
195
|
export type Subscribe = (options: {
|
|
187
|
-
instance:
|
|
196
|
+
instance: InstanceType;
|
|
188
197
|
state: WalletState;
|
|
189
198
|
meta: BlockchainMeta[];
|
|
190
199
|
updateChainId: (chainId: string) => void;
|
|
@@ -194,7 +203,7 @@ export type Subscribe = (options: {
|
|
|
194
203
|
}) => CleanupSubscribe | void;
|
|
195
204
|
|
|
196
205
|
export type SwitchNetwork = (options: {
|
|
197
|
-
instance:
|
|
206
|
+
instance: InstanceType;
|
|
198
207
|
network: Network;
|
|
199
208
|
meta: BlockchainMeta[];
|
|
200
209
|
newInstance?: TryGetInstance;
|
|
@@ -203,7 +212,7 @@ export type SwitchNetwork = (options: {
|
|
|
203
212
|
}) => Promise<void>;
|
|
204
213
|
|
|
205
214
|
export type Suggest = (options: {
|
|
206
|
-
instance:
|
|
215
|
+
instance: InstanceType;
|
|
207
216
|
network: Network;
|
|
208
217
|
meta: BlockchainMeta[];
|
|
209
218
|
}) => Promise<void>;
|
|
@@ -211,11 +220,11 @@ export type Suggest = (options: {
|
|
|
211
220
|
export type CanSwitchNetwork = (options: {
|
|
212
221
|
network: Network;
|
|
213
222
|
meta: BlockchainMeta[];
|
|
214
|
-
provider:
|
|
223
|
+
provider: InstanceType;
|
|
215
224
|
}) => boolean;
|
|
216
225
|
|
|
217
226
|
export type CanEagerConnect = (options: {
|
|
218
|
-
instance:
|
|
227
|
+
instance: InstanceType;
|
|
219
228
|
meta: BlockchainMeta[];
|
|
220
229
|
}) => Promise<boolean>;
|
|
221
230
|
|
|
@@ -227,7 +236,7 @@ export type EagerConnectResult<I = unknown> = {
|
|
|
227
236
|
|
|
228
237
|
export interface WalletActions {
|
|
229
238
|
connect: Connect;
|
|
230
|
-
getInstance:
|
|
239
|
+
getInstance: InstanceType;
|
|
231
240
|
disconnect?: Disconnect;
|
|
232
241
|
subscribe?: Subscribe;
|
|
233
242
|
// unsubscribe, // coupled to subscribe.
|
|
@@ -235,7 +244,7 @@ export interface WalletActions {
|
|
|
235
244
|
// Optional, but should be provided at the same time.
|
|
236
245
|
suggest?: Suggest;
|
|
237
246
|
switchNetwork?: SwitchNetwork;
|
|
238
|
-
getSigners: (provider:
|
|
247
|
+
getSigners: (provider: InstanceType) => Promise<SignerFactory>;
|
|
239
248
|
canSwitchNetworkTo?: CanSwitchNetwork;
|
|
240
249
|
canEagerConnect?: CanEagerConnect;
|
|
241
250
|
getWalletInfo(allBlockChains: BlockchainMeta[]): WalletInfo;
|
package/src/legacy/wallet.ts
CHANGED
|
@@ -7,6 +7,7 @@ import type {
|
|
|
7
7
|
WalletConfig,
|
|
8
8
|
WalletType,
|
|
9
9
|
} from './types.js';
|
|
10
|
+
import type { Namespace } from '../namespaces/common/types.js';
|
|
10
11
|
import type { BlockchainMeta } from 'rango-types';
|
|
11
12
|
|
|
12
13
|
import {
|
|
@@ -20,6 +21,7 @@ import { eagerConnectHandler } from './utils.js';
|
|
|
20
21
|
export type EventHandler = (
|
|
21
22
|
type: WalletType,
|
|
22
23
|
event: Events,
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
23
25
|
value: any,
|
|
24
26
|
coreState: State,
|
|
25
27
|
info: EventInfo
|
|
@@ -28,8 +30,11 @@ export type EventHandler = (
|
|
|
28
30
|
export type EventInfo = {
|
|
29
31
|
supportedBlockchains: BlockchainMeta[];
|
|
30
32
|
isContractWallet: boolean;
|
|
31
|
-
|
|
33
|
+
|
|
34
|
+
// Hub fields
|
|
32
35
|
isHub: boolean;
|
|
36
|
+
// will be set alongside ACCOUNT event
|
|
37
|
+
namespace?: Namespace;
|
|
33
38
|
};
|
|
34
39
|
|
|
35
40
|
export interface State {
|
|
@@ -49,6 +54,7 @@ export interface Options {
|
|
|
49
54
|
handler: EventHandler;
|
|
50
55
|
}
|
|
51
56
|
|
|
57
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
58
|
class Wallet<InstanceType = any> {
|
|
53
59
|
public provider: InstanceType | null;
|
|
54
60
|
private actions: WalletActions;
|
|
@@ -298,13 +304,13 @@ class Wallet<InstanceType = any> {
|
|
|
298
304
|
});
|
|
299
305
|
}
|
|
300
306
|
|
|
301
|
-
async getSigners(provider:
|
|
307
|
+
async getSigners(provider: InstanceType) {
|
|
302
308
|
return await this.actions.getSigners(provider);
|
|
303
309
|
}
|
|
304
310
|
getWalletInfo(allBlockChains: BlockchainMeta[]) {
|
|
305
311
|
return this.actions.getWalletInfo(allBlockChains);
|
|
306
312
|
}
|
|
307
|
-
canSwitchNetworkTo(network: Network, provider:
|
|
313
|
+
canSwitchNetworkTo(network: Network, provider: InstanceType) {
|
|
308
314
|
const switchTo = this.actions.canSwitchNetworkTo;
|
|
309
315
|
if (!switchTo) {
|
|
310
316
|
return false;
|
|
@@ -331,7 +337,7 @@ class Wallet<InstanceType = any> {
|
|
|
331
337
|
this.setInstalledAs(true);
|
|
332
338
|
}
|
|
333
339
|
} else if (needsCheckInstallation(this.options)) {
|
|
334
|
-
this.actions.getInstance().then((data:
|
|
340
|
+
this.actions.getInstance().then((data: unknown) => {
|
|
335
341
|
if (data) {
|
|
336
342
|
this.setInstalledAs(true);
|
|
337
343
|
}
|
|
@@ -339,7 +345,7 @@ class Wallet<InstanceType = any> {
|
|
|
339
345
|
}
|
|
340
346
|
}
|
|
341
347
|
|
|
342
|
-
setProvider(value:
|
|
348
|
+
setProvider(value: InstanceType | null) {
|
|
343
349
|
this.provider = value;
|
|
344
350
|
if (!!value && !!this.actions.subscribe) {
|
|
345
351
|
const cleanup = this.actions.subscribe({
|
|
@@ -395,7 +401,7 @@ class Wallet<InstanceType = any> {
|
|
|
395
401
|
* We will notify handler after updating all the states.
|
|
396
402
|
* Because when we call `handler` it will has latest states.
|
|
397
403
|
*/
|
|
398
|
-
const updates: [Events,
|
|
404
|
+
const updates: [Events, unknown][] = [];
|
|
399
405
|
|
|
400
406
|
if (typeof states.connected !== 'undefined') {
|
|
401
407
|
this.state.connected = states.connected;
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import type { EvmActions } from './types.js';
|
|
2
2
|
|
|
3
3
|
import { ActionBuilder } from '../../mod.js';
|
|
4
|
-
import {
|
|
5
|
-
|
|
4
|
+
import {
|
|
5
|
+
connectAndUpdateStateForMultiNetworks,
|
|
6
|
+
intoConnecting,
|
|
7
|
+
intoConnectionFinished,
|
|
8
|
+
} from '../common/mod.js';
|
|
6
9
|
|
|
7
10
|
export const connect = () =>
|
|
8
11
|
new ActionBuilder<EvmActions, 'connect'>('connect')
|
|
9
12
|
.and(connectAndUpdateStateForMultiNetworks)
|
|
13
|
+
.before(intoConnecting)
|
|
10
14
|
.after(intoConnectionFinished);
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import type { SolanaActions } from './types.js';
|
|
2
2
|
|
|
3
3
|
import { ActionBuilder } from '../../mod.js';
|
|
4
|
-
import {
|
|
5
|
-
|
|
4
|
+
import {
|
|
5
|
+
connectAndUpdateStateForSingleNetwork,
|
|
6
|
+
intoConnecting,
|
|
7
|
+
intoConnectionFinished,
|
|
8
|
+
} from '../common/mod.js';
|
|
6
9
|
|
|
7
10
|
export const connect = () =>
|
|
8
11
|
new ActionBuilder<SolanaActions, 'connect'>('connect')
|
|
9
12
|
.and(connectAndUpdateStateForSingleNetwork)
|
|
13
|
+
.before(intoConnecting)
|
|
10
14
|
.after(intoConnectionFinished);
|