@rango-dev/provider-safepal 0.0.0-experimental-936229e8-20251208
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 +242 -0
- package/dist/constants.d.ts +4 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/legacy/index.d.ts +19 -0
- package/dist/legacy/index.d.ts.map +1 -0
- package/dist/mod.d.ts +3 -0
- package/dist/mod.d.ts.map +1 -0
- package/dist/mod.js +2 -0
- package/dist/mod.js.map +7 -0
- package/dist/namespaces/evm.d.ts +4 -0
- package/dist/namespaces/evm.d.ts.map +1 -0
- package/dist/provider-safepal.build.json +1 -0
- package/dist/provider.d.ts +3 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/signer.d.ts +4 -0
- package/dist/signer.d.ts.map +1 -0
- package/dist/utils.d.ts +13 -0
- package/dist/utils.d.ts.map +1 -0
- package/package.json +33 -0
- package/readme.md +35 -0
- package/src/constants.ts +41 -0
- package/src/legacy/index.ts +127 -0
- package/src/mod.ts +12 -0
- package/src/namespaces/evm.ts +66 -0
- package/src/provider.ts +24 -0
- package/src/signer.ts +21 -0
- package/src/utils.ts +51 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
# [0.56.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.55.1...provider-safepal@0.56.0) (2025-12-02)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
## [0.55.1](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.55.0...provider-safepal@0.55.1) (2025-11-22)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# [0.53.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.52.0...provider-safepal@0.53.0) (2025-10-29)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# [0.52.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.51.0...provider-safepal@0.52.0) (2025-09-29)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
### Features
|
|
17
|
+
|
|
18
|
+
* migrate safepal to hub ([9abf9c9](https://github.com/rango-exchange/rango-client/commit/9abf9c9be4c009e55570b15b0c048b8554f681bc))
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# [0.51.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.50.0...provider-safepal@0.51.0) (2025-09-06)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
# [0.50.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.49.0...provider-safepal@0.50.0) (2025-08-19)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
### Bug Fixes
|
|
30
|
+
|
|
31
|
+
* add rango-dev/wallets-core to dependencies of providers ([84b4b2b](https://github.com/rango-exchange/rango-client/commit/84b4b2b7c3a7f5631228fb6ebf04617c3c4428e9))
|
|
32
|
+
* remove retry dynamic import and throw refined error on dynamic import failure ([a2944ac](https://github.com/rango-exchange/rango-client/commit/a2944ac3c05a0e945f6e5621fa5693ab89625485))
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
### Features
|
|
36
|
+
|
|
37
|
+
* implement retry mechanism for lazy imports ([9a8e191](https://github.com/rango-exchange/rango-client/commit/9a8e191711d2319990ca4d0613e8188a5f86842f))
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# [0.49.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.48.0...provider-safepal@0.49.0) (2025-08-05)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# [0.48.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.47.0...provider-safepal@0.48.0) (2025-07-22)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
### Reverts
|
|
49
|
+
|
|
50
|
+
* Revert "chore(release): publish" ([064ce15](https://github.com/rango-exchange/rango-client/commit/064ce157a2f819856f647f83aeb1c0410542e8d7))
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# [0.46.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.45.1...provider-safepal@0.46.0) (2025-06-09)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
## [0.45.1](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.45.0...provider-safepal@0.45.1) (2025-05-04)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
# [0.45.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.44.0...provider-safepal@0.45.0) (2025-04-30)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
### Bug Fixes
|
|
66
|
+
|
|
67
|
+
* rename pbt to ptb for sui ([3d6d89f](https://github.com/rango-exchange/rango-client/commit/3d6d89f2265766607a15d61e0df92643fb33072b))
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
### Features
|
|
71
|
+
|
|
72
|
+
* update sui to consider recent api changes ([d764b25](https://github.com/rango-exchange/rango-client/commit/d764b2501df9bb295f63cdbc0b05acd4a3abb4b9))
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
# [0.44.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.43.0...provider-safepal@0.44.0) (2025-03-11)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
# [0.43.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.42.0...provider-safepal@0.43.0) (2025-02-23)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
# [0.42.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.41.0...provider-safepal@0.42.0) (2025-01-20)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
# [0.41.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.40.0...provider-safepal@0.41.0) (2024-12-30)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
# [0.40.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.39.0...provider-safepal@0.40.0) (2024-11-27)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
### Features
|
|
96
|
+
|
|
97
|
+
* add ton connect provider ([2a2dbb7](https://github.com/rango-exchange/rango-client/commit/2a2dbb79022263f19446ced49d298e04d63f927f))
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
# [0.39.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.38.0...provider-safepal@0.39.0) (2024-11-12)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
# [0.38.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.37.0...provider-safepal@0.38.0) (2024-10-12)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
### Bug Fixes
|
|
109
|
+
|
|
110
|
+
* bump sdk and fix type issues ([d442208](https://github.com/rango-exchange/rango-client/commit/d4422083bf5dd27d5f509ce1db7f9560d05428c8))
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
### Performance Improvements
|
|
114
|
+
|
|
115
|
+
* lazy load signer packages ([7b88f18](https://github.com/rango-exchange/rango-client/commit/7b88f1834f7b29b4b81ab6c81a07bb88e8ccf55c))
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
# [0.37.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.36.0...provider-safepal@0.37.0) (2024-09-10)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
# [0.36.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.35.1...provider-safepal@0.36.0) (2024-08-11)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
## [0.35.1](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.35.0...provider-safepal@0.35.1) (2024-07-14)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
# [0.35.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.33.2...provider-safepal@0.35.0) (2024-07-09)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
# [0.34.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.33.2...provider-safepal@0.34.0) (2024-06-01)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
## [0.33.2](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.33.1...provider-safepal@0.33.2) (2024-05-26)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
## [0.33.1](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.33.0...provider-safepal@0.33.1) (2024-05-25)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
# [0.33.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.32.0...provider-safepal@0.33.0) (2024-05-14)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
# [0.32.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.31.0...provider-safepal@0.32.0) (2024-04-24)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
# [0.31.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.30.0...provider-safepal@0.31.0) (2024-04-23)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
# [0.30.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.29.0...provider-safepal@0.30.0) (2024-04-09)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
# [0.29.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.28.0...provider-safepal@0.29.0) (2024-03-12)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
# [0.28.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.27.0...provider-safepal@0.28.0) (2024-02-20)
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
# [0.27.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.26.0...provider-safepal@0.27.0) (2024-02-07)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
# [0.26.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.25.0...provider-safepal@0.26.0) (2024-01-22)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
### Bug Fixes
|
|
179
|
+
|
|
180
|
+
* cleanup wallets' subscriber when setProvider get null ([88d6a42](https://github.com/rango-exchange/rango-client/commit/88d6a423c49b34b3d9ff567e22df36c3b009bb76))
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
# [0.25.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.23.0...provider-safepal@0.25.0) (2023-12-24)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
### Bug Fixes
|
|
188
|
+
|
|
189
|
+
* fix HMR for widget and playground ([8524820](https://github.com/rango-exchange/rango-client/commit/8524820f10cf0b8921f3db0c4f620ff98daa4103))
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
# [0.14.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.13.0...provider-safepal@0.14.0) (2023-08-03)
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
# [0.13.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.12.0...provider-safepal@0.13.0) (2023-08-01)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
# [0.9.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.8.0...provider-safepal@0.9.0) (2023-07-31)
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
# [0.7.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.6.0...provider-safepal@0.7.0) (2023-07-11)
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
# [0.6.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.5.0...provider-safepal@0.6.0) (2023-07-11)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
### Reverts
|
|
213
|
+
|
|
214
|
+
* Revert "support for rango-types cjs format" ([ed4e050](https://github.com/rango-exchange/rango-client/commit/ed4e050bfc0dcde7aeffa6b0d73b02080a5721eb))
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
# [0.5.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.4.0...provider-safepal@0.5.0) (2023-05-31)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
# [0.4.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.3.0...provider-safepal@0.4.0) (2023-05-31)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
# [0.3.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.2.0...provider-safepal@0.3.0) (2023-05-30)
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
# [0.2.0](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.1.15...provider-safepal@0.2.0) (2023-05-30)
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
## [0.1.14](https://github.com/rango-exchange/rango-client/compare/provider-safepal@0.1.13...provider-safepal@0.1.14) (2023-05-15)
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
### Bug Fixes
|
|
238
|
+
|
|
239
|
+
* update rango-types and fix notification bugs ([993f185](https://github.com/rango-exchange/rango-client/commit/993f185e0b8c5e5e15a2c65ba2d85d1f9c8daa90))
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAMhE,eAAO,MAAM,SAAS,YAAY,CAAC;AACnC,eAAO,MAAM,QAAQ,EAAE,gBAiCtB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { CanSwitchNetwork, Connect, Subscribe, SwitchNetwork, WalletInfo } from '@rango-dev/wallets-shared';
|
|
2
|
+
import type { BlockchainMeta, SignerFactory } from 'rango-types';
|
|
3
|
+
import { type LegacyProviderInterface, LegacyNetworks as Networks } from '@rango-dev/wallets-core/legacy';
|
|
4
|
+
import { WalletTypes } from '@rango-dev/wallets-shared';
|
|
5
|
+
import { type Provider, safepal as safepal_instance } from '../utils.js';
|
|
6
|
+
export declare const config: {
|
|
7
|
+
type: WalletTypes;
|
|
8
|
+
defaultNetwork: Networks;
|
|
9
|
+
};
|
|
10
|
+
export declare const getInstance: typeof safepal_instance;
|
|
11
|
+
export declare const connect: Connect;
|
|
12
|
+
export declare const subscribe: Subscribe;
|
|
13
|
+
export declare const switchNetwork: SwitchNetwork;
|
|
14
|
+
export declare const canSwitchNetworkTo: CanSwitchNetwork;
|
|
15
|
+
export declare const getSigners: (provider: Provider) => Promise<SignerFactory>;
|
|
16
|
+
export declare const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo;
|
|
17
|
+
declare const buildLegacyProvider: () => LegacyProviderInterface;
|
|
18
|
+
export { buildLegacyProvider };
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/legacy/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,OAAO,EAEP,SAAS,EACT,aAAa,EACb,UAAU,EACX,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EACL,KAAK,uBAAuB,EAC5B,cAAc,IAAI,QAAQ,EAC3B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAML,WAAW,EACZ,MAAM,2BAA2B,CAAC;AAInC,OAAO,EAAE,KAAK,QAAQ,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIzE,eAAO,MAAM,MAAM;;;CAGlB,CAAC;AAEF,eAAO,MAAM,WAAW,yBAAmB,CAAC;AAC5C,eAAO,MAAM,OAAO,EAAE,OAWrB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,SAiBvB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,aAAmC,CAAC;AAEhE,eAAO,MAAM,kBAAkB,EAAE,gBAAwC,CAAC;AAE1E,eAAO,MAAM,UAAU,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,aAAa,CAC9D,CAAC;AAET,eAAO,MAAM,aAAa,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,KAAK,UAuCjE,CAAC;AAEF,QAAA,MAAM,mBAAmB,EAAE,MAAM,uBAS/B,CAAC;AAEH,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
|
package/dist/mod.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,QAAQ,kEAIF,CAAC;AAEb,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
package/dist/mod.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var P=Object.defineProperty;var o=(e,t)=>P(e,"name",{value:t,configurable:!0});import{defineVersions as ie}from"@rango-dev/wallets-core/utils";import{LegacyNetworks as l}from"@rango-dev/wallets-core/legacy";import{canSwitchNetworkToEvm as L,chooseInstance as h,getEvmAccounts as C,subscribeToEvm as R,switchNetworkForEvm as B,WalletTypes as F}from"@rango-dev/wallets-shared";import{evmBlockchains as u,solanaBlockchain as w}from"rango-types";import{dynamicImportWithRefinedError as x,getNetworkInstance as k,Networks as T}from"@rango-dev/wallets-shared";import{DefaultSignerFactory as I,TransactionType as M}from"rango-types";async function i(e){let t=k(e,T.ETHEREUM),r=new I,{DefaultEvmSigner:n}=await x(async()=>await import("@rango-dev/signer-evm"));return r.registerSigner(M.EVM,new n(t)),r}o(i,"getSigners");import{LegacyNetworks as d}from"@rango-dev/wallets-core/legacy";import{isEvmAddress as N}from"@rango-dev/wallets-shared";function a(){let{safepalProvider:e}=window;if(!e)return null;let t=new Map;return e&&t.set(d.ETHEREUM,e),t}o(a,"safepal");function s(){let t=a()?.get(d.ETHEREUM);if(!t)throw new Error("Safepal not injected or EVM not enabled. Please check your wallet.");return t}o(s,"evmSafepal");function f(){let e=a();if(!e)throw new Error("Trust Wallet is not injected. Please check your wallet.");return e}o(f,"getInstanceOrThrow");function g(e){let t=e.split(":")[2];return N(t)}o(g,"isValidEvmAddress");var V=F.SAFEPAL,W={type:V,defaultNetwork:l.ETHEREUM},U=a,H=o(async({instance:e,meta:t})=>{let r=h(e,t,l.ETHEREUM),n=[];if(r){let A=await C(r);n.push(A)}return n},"connect"),_=o(e=>{let t,r=h(e.instance,e.meta,l.ETHEREUM);return r&&(t=R({...e,instance:r})),()=>{t&&t()}},"subscribe"),D=B,j=L,O=i,z=o(e=>{let t=u(e),r=w(e);return{name:"SafePal",img:"https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/safepal/icon.svg",installLink:{CHROME:"https://chrome.google.com/webstore/detail/safepal-extension-wallet/lgmpcpglpngdoalbgeoldeajfclnhafa",BRAVE:"https://chrome.google.com/webstore/detail/safepal-extension-wallet/lgmpcpglpngdoalbgeoldeajfclnhafa",FIREFOX:"https://addons.mozilla.org/en-US/firefox/addon/safepal-extension-wallet",DEFAULT:"https://www.safepal.com/download"},color:"#4A21EF",supportedChains:[...t,...r],needsNamespace:{selection:"multiple",data:[{label:"EVM",value:"EVM",id:"ETH",getSupportedChains:n=>u(n)},{label:"Solana",value:"Solana",id:"SOLANA",getSupportedChains:n=>w(n)}]}}},"getWalletInfo"),v=o(()=>({config:W,getInstance:U,connect:H,subscribe:_,switchNetwork:D,canSwitchNetworkTo:j,getSigners:O,getWalletInfo:z}),"buildLegacyProvider");import{ProviderBuilder as ne}from"@rango-dev/wallets-core";import"@rango-dev/wallets-core";import{evmBlockchains as X}from"rango-types";var c="safepal",E={name:"SafePal",icon:"https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/safepal/icon.svg",extensions:{chrome:"https://chrome.google.com/webstore/detail/safepal-extension-wallet/lgmpcpglpngdoalbgeoldeajfclnhafa",brave:"https://chrome.google.com/webstore/detail/safepal-extension-wallet/lgmpcpglpngdoalbgeoldeajfclnhafa",firefox:"https://addons.mozilla.org/en-US/firefox/addon/safepal-extension-wallet",homepage:"https://www.safepal.com/download"},properties:[{name:"namespaces",value:{selection:"multiple",data:[{label:"EVM",value:"EVM",id:"ETH",getSupportedChains:e=>X(e)}]}},{name:"signers",value:{getSigners:async()=>i(f())}}]};import{ActionBuilder as Y,NamespaceBuilder as q}from"@rango-dev/wallets-core";import{builders as G,connectAndUpdateStateForMultiNetworks as J,intoConnecting as K,intoConnectionFinished as Q,standardizeAndThrowError as Z}from"@rango-dev/wallets-core/namespaces/common";import{actions as p,builders as m}from"@rango-dev/wallets-core/namespaces/evm";var[$,b]=m.changeAccountSubscriber(s).build(),ee=new Y("connect").action(p.connect(s)).before($).before(K).and((e,t)=>{if(t.accounts.some(r=>!g(r)))throw new Error("Non valid EVM address returned from wallet");return t}).and(J).after(Q).or(b).or(Z).build(),te=G.disconnect().after(b).build(),oe=m.canSwitchNetwork().action(p.canSwitchNetwork()).build(),re=m.getChainId().action(p.getChainId(s)).build(),S=new q("EVM",c).action(ee).action(te).action(oe).action(re).build();var ae=1e3,y=o(()=>new ne(c).init(function(e){setTimeout(()=>{if(a()){let[,t]=e.state();t("installed",!0),console.debug("[safepal] instance detected.",e)}},ae)}).config("metadata",E).add("evm",S).build(),"buildProvider");var Oe=o(()=>ie().version("0.0.0",v()).version("1.0.0",y()).build(),"versions");export{Oe as versions};
|
|
2
|
+
//# sourceMappingURL=mod.js.map
|
package/dist/mod.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/mod.ts", "../src/legacy/index.ts", "../src/signer.ts", "../src/utils.ts", "../src/provider.ts", "../src/constants.ts", "../src/namespaces/evm.ts"],
|
|
4
|
+
"sourcesContent": ["import { defineVersions } from '@rango-dev/wallets-core/utils';\n\nimport { buildLegacyProvider } from './legacy/index.js';\nimport { buildProvider } from './provider.js';\n\nconst versions = () =>\n defineVersions()\n .version('0.0.0', buildLegacyProvider())\n .version('1.0.0', buildProvider())\n .build();\n\nexport { versions };\n", "import type {\n CanSwitchNetwork,\n Connect,\n ProviderConnectResult,\n Subscribe,\n SwitchNetwork,\n WalletInfo,\n} from '@rango-dev/wallets-shared';\nimport type { BlockchainMeta, SignerFactory } from 'rango-types';\n\nimport {\n type LegacyProviderInterface,\n LegacyNetworks as Networks,\n} from '@rango-dev/wallets-core/legacy';\nimport {\n canSwitchNetworkToEvm,\n chooseInstance,\n getEvmAccounts,\n subscribeToEvm,\n switchNetworkForEvm,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport { evmBlockchains, solanaBlockchain } from 'rango-types';\n\nimport signer from '../signer.js';\nimport { type Provider, safepal as safepal_instance } from '../utils.js';\n\nconst WALLET = WalletTypes.SAFEPAL;\n\nexport const config = {\n type: WALLET,\n defaultNetwork: Networks.ETHEREUM,\n};\n\nexport const getInstance = safepal_instance;\nexport const connect: Connect = async ({ instance, meta }) => {\n const ethInstance = chooseInstance(instance, meta, Networks.ETHEREUM);\n\n const results: ProviderConnectResult[] = [];\n\n if (ethInstance) {\n const evmResult = await getEvmAccounts(ethInstance);\n results.push(evmResult);\n }\n\n return results;\n};\n\nexport const subscribe: Subscribe = (options) => {\n let cleanup: ReturnType<Subscribe>;\n const ethInstance = chooseInstance(\n options.instance,\n options.meta,\n Networks.ETHEREUM\n );\n\n if (ethInstance) {\n cleanup = subscribeToEvm({ ...options, instance: ethInstance });\n }\n\n return () => {\n if (cleanup) {\n cleanup();\n }\n };\n};\n\nexport const switchNetwork: SwitchNetwork = switchNetworkForEvm;\n\nexport const canSwitchNetworkTo: CanSwitchNetwork = canSwitchNetworkToEvm;\n\nexport const getSigners: (provider: Provider) => Promise<SignerFactory> =\n signer;\n\nexport const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo = (\n allBlockChains\n) => {\n const evms = evmBlockchains(allBlockChains);\n const solana = solanaBlockchain(allBlockChains);\n return {\n name: 'SafePal',\n img: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/safepal/icon.svg',\n installLink: {\n CHROME:\n 'https://chrome.google.com/webstore/detail/safepal-extension-wallet/lgmpcpglpngdoalbgeoldeajfclnhafa',\n BRAVE:\n 'https://chrome.google.com/webstore/detail/safepal-extension-wallet/lgmpcpglpngdoalbgeoldeajfclnhafa',\n FIREFOX:\n 'https://addons.mozilla.org/en-US/firefox/addon/safepal-extension-wallet',\n DEFAULT: 'https://www.safepal.com/download',\n },\n color: '#4A21EF',\n supportedChains: [...evms, ...solana],\n needsNamespace: {\n selection: 'multiple',\n data: [\n {\n label: 'EVM',\n value: 'EVM',\n id: 'ETH',\n getSupportedChains: (allBlockchains: BlockchainMeta[]) =>\n evmBlockchains(allBlockchains),\n },\n {\n label: 'Solana',\n value: 'Solana',\n id: 'SOLANA',\n getSupportedChains: (allBlockchains: BlockchainMeta[]) =>\n solanaBlockchain(allBlockchains),\n },\n ],\n },\n };\n};\n\nconst buildLegacyProvider: () => LegacyProviderInterface = () => ({\n config,\n getInstance,\n connect,\n subscribe,\n switchNetwork,\n canSwitchNetworkTo,\n getSigners,\n getWalletInfo,\n});\n\nexport { buildLegacyProvider };\n", "import type { Provider } from './utils.js';\nimport type { SignerFactory } from 'rango-types';\n\nimport {\n dynamicImportWithRefinedError,\n getNetworkInstance,\n Networks,\n} from '@rango-dev/wallets-shared';\nimport { DefaultSignerFactory, TransactionType as TxType } from 'rango-types';\n\nexport default async function getSigners(\n provider: Provider\n): Promise<SignerFactory> {\n const ethProvider = getNetworkInstance(provider, Networks.ETHEREUM);\n const signers = new DefaultSignerFactory();\n const { DefaultEvmSigner } = await dynamicImportWithRefinedError(\n async () => await import('@rango-dev/signer-evm')\n );\n signers.registerSigner(TxType.EVM, new DefaultEvmSigner(ethProvider));\n return signers;\n}\n", "import type { ProviderAPI as EvmProviderApi } from '@rango-dev/wallets-core/namespaces/evm';\n\nimport { LegacyNetworks } from '@rango-dev/wallets-core/legacy';\nimport { isEvmAddress } from '@rango-dev/wallets-shared';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Provider = Record<string, any>;\nexport function safepal(): Provider | null {\n const { safepalProvider: safePalEvm } = window;\n if (!safePalEvm) {\n return null;\n }\n const instances = new Map();\n if (safePalEvm) {\n instances.set(LegacyNetworks.ETHEREUM, safePalEvm);\n }\n\n return instances;\n}\n\nexport function evmSafepal(): EvmProviderApi {\n const instances = safepal();\n const evmInstance = instances?.get(LegacyNetworks.ETHEREUM);\n if (!evmInstance) {\n throw new Error(\n 'Safepal not injected or EVM not enabled. Please check your wallet.'\n );\n }\n return evmInstance as EvmProviderApi;\n}\nexport function getInstanceOrThrow(): Provider {\n const instances = safepal();\n\n if (!instances) {\n throw new Error('Trust Wallet is not injected. Please check your wallet.');\n }\n\n return instances;\n}\n/**\n * Return true if address is a valid EVM address.\n * Accepts:\n * - all-lowercase or all-uppercase 0x-prefixed hex (non-checksummed - allowed)\n * - checksummed (mixed-case according to EIP-55)\n */\nexport function isValidEvmAddress(address: string): boolean {\n // Pick wallet address.\n const walletAddress = address.split(':')[2];\n\n return isEvmAddress(walletAddress);\n}\n", "import { ProviderBuilder } from '@rango-dev/wallets-core';\n\nimport { metadata, WALLET_ID } from './constants.js';\nimport { evm } from './namespaces/evm.js';\nimport { safepal as safepalInstance } from './utils.js';\n\nconst WAIT_TO_LOAD_INSTANCE_DELAY = 1000;\nconst buildProvider = () =>\n new ProviderBuilder(WALLET_ID)\n .init(function (context) {\n setTimeout(() => {\n if (safepalInstance()) {\n const [, setState] = context.state();\n setState('installed', true);\n console.debug('[safepal] instance detected.', context);\n }\n }, WAIT_TO_LOAD_INSTANCE_DELAY);\n })\n\n .config('metadata', metadata)\n .add('evm', evm)\n .build();\n\nexport { buildProvider };\n", "import { type ProviderMetadata } from '@rango-dev/wallets-core';\nimport { type BlockchainMeta, evmBlockchains } from 'rango-types';\n\nimport getSigners from './signer.js';\nimport { getInstanceOrThrow } from './utils.js';\n\nexport const WALLET_ID = 'safepal';\nexport const metadata: ProviderMetadata = {\n name: 'SafePal',\n icon: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/safepal/icon.svg',\n extensions: {\n chrome:\n 'https://chrome.google.com/webstore/detail/safepal-extension-wallet/lgmpcpglpngdoalbgeoldeajfclnhafa',\n brave:\n 'https://chrome.google.com/webstore/detail/safepal-extension-wallet/lgmpcpglpngdoalbgeoldeajfclnhafa',\n firefox:\n 'https://addons.mozilla.org/en-US/firefox/addon/safepal-extension-wallet',\n homepage: 'https://www.safepal.com/download',\n },\n properties: [\n {\n name: 'namespaces',\n value: {\n selection: 'multiple',\n data: [\n {\n label: 'EVM',\n value: 'EVM',\n id: 'ETH',\n getSupportedChains: (allBlockchains: BlockchainMeta[]) =>\n evmBlockchains(allBlockchains),\n },\n ],\n },\n },\n {\n name: 'signers',\n value: { getSigners: async () => getSigners(getInstanceOrThrow()) },\n },\n ],\n};\n", "import type { EvmActions } from '@rango-dev/wallets-core/namespaces/evm';\n\nimport { ActionBuilder, NamespaceBuilder } from '@rango-dev/wallets-core';\nimport {\n builders as commonBuilders,\n connectAndUpdateStateForMultiNetworks,\n intoConnecting,\n intoConnectionFinished,\n standardizeAndThrowError,\n} from '@rango-dev/wallets-core/namespaces/common';\nimport { actions, builders } from '@rango-dev/wallets-core/namespaces/evm';\n\nimport { WALLET_ID } from '../constants.js';\nimport { evmSafepal, isValidEvmAddress } from '../utils.js';\n\nconst [changeAccountSubscriber, changeAccountCleanup] = builders\n .changeAccountSubscriber(evmSafepal)\n .build();\n\n/**\n * Important: Keep this implementation in sync with wallets/core/src/namespaces/evm/builders\n */\nconst connect = new ActionBuilder<EvmActions, 'connect'>('connect')\n .action(actions.connect(evmSafepal))\n .before(changeAccountSubscriber)\n .before(intoConnecting)\n /*\n * Validate all accounts are valid EVM addresses\n * Sometimes wallets may return non-EVM addresses - this check prevents that\n */\n .and((_, args) => {\n if (args.accounts.some((account: string) => !isValidEvmAddress(account))) {\n throw new Error('Non valid EVM address returned from wallet');\n }\n\n return args;\n })\n .and(connectAndUpdateStateForMultiNetworks)\n .after(intoConnectionFinished)\n .or(changeAccountCleanup)\n .or(standardizeAndThrowError)\n .build();\n\nconst disconnect = commonBuilders\n .disconnect<EvmActions>()\n .after(changeAccountCleanup)\n .build();\n\nconst canSwitchNetwork = builders\n .canSwitchNetwork()\n .action(actions.canSwitchNetwork())\n .build();\n\nconst getChainId = builders\n .getChainId()\n .action(actions.getChainId(evmSafepal))\n .build();\n\nconst evm = new NamespaceBuilder<EvmActions>('EVM', WALLET_ID)\n .action(connect)\n .action(disconnect)\n .action(canSwitchNetwork)\n .action(getChainId)\n .build();\n\nexport { evm };\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["defineVersions", "Networks", "canSwitchNetworkToEvm", "chooseInstance", "getEvmAccounts", "subscribeToEvm", "switchNetworkForEvm", "WalletTypes", "evmBlockchains", "solanaBlockchain", "dynamicImportWithRefinedError", "getNetworkInstance", "Networks", "DefaultSignerFactory", "TxType", "getSigners", "provider", "ethProvider", "getNetworkInstance", "Networks", "signers", "DefaultSignerFactory", "DefaultEvmSigner", "dynamicImportWithRefinedError", "TxType", "__name", "LegacyNetworks", "isEvmAddress", "safepal", "safePalEvm", "instances", "LegacyNetworks", "__name", "evmSafepal", "evmInstance", "getInstanceOrThrow", "isValidEvmAddress", "address", "walletAddress", "isEvmAddress", "WALLET", "WalletTypes", "config", "Networks", "getInstance", "safepal", "connect", "__name", "instance", "meta", "ethInstance", "chooseInstance", "results", "evmResult", "getEvmAccounts", "subscribe", "options", "cleanup", "subscribeToEvm", "switchNetwork", "switchNetworkForEvm", "canSwitchNetworkTo", "canSwitchNetworkToEvm", "getSigners", "getWalletInfo", "allBlockChains", "evms", "evmBlockchains", "solana", "solanaBlockchain", "allBlockchains", "buildLegacyProvider", "ProviderBuilder", "evmBlockchains", "WALLET_ID", "metadata", "allBlockchains", "evmBlockchains", "getSigners", "getInstanceOrThrow", "ActionBuilder", "NamespaceBuilder", "commonBuilders", "connectAndUpdateStateForMultiNetworks", "intoConnecting", "intoConnectionFinished", "standardizeAndThrowError", "actions", "builders", "changeAccountSubscriber", "changeAccountCleanup", "builders", "evmSafepal", "connect", "ActionBuilder", "actions", "intoConnecting", "_", "args", "account", "isValidEvmAddress", "connectAndUpdateStateForMultiNetworks", "intoConnectionFinished", "standardizeAndThrowError", "disconnect", "commonBuilders", "canSwitchNetwork", "getChainId", "evm", "NamespaceBuilder", "WALLET_ID", "WAIT_TO_LOAD_INSTANCE_DELAY", "buildProvider", "__name", "ProviderBuilder", "WALLET_ID", "context", "safepal", "setState", "metadata", "evm", "versions", "__name", "defineVersions", "buildLegacyProvider", "buildProvider"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evm.d.ts","sourceRoot":"","sources":["../../src/namespaces/evm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AA0DzE,QAAA,MAAM,GAAG,gEAKC,CAAC;AAEX,OAAO,EAAE,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"inputs":{"src/signer.ts":{"bytes":715,"imports":[{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"@rango-dev/signer-evm","kind":"dynamic-import","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/utils.ts":{"bytes":1495,"imports":[{"path":"@rango-dev/wallets-core/legacy","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/legacy/index.ts":{"bytes":3285,"imports":[{"path":"@rango-dev/wallets-core/legacy","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"src/signer.ts","kind":"import-statement","original":"../signer.js"},{"path":"src/utils.ts","kind":"import-statement","original":"../utils.js"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/constants.ts":{"bytes":1295,"imports":[{"path":"@rango-dev/wallets-core","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"src/signer.ts","kind":"import-statement","original":"./signer.js"},{"path":"src/utils.ts","kind":"import-statement","original":"./utils.js"}],"format":"esm"},"src/namespaces/evm.ts":{"bytes":1912,"imports":[{"path":"@rango-dev/wallets-core","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/namespaces/common","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/namespaces/evm","kind":"import-statement","external":true},{"path":"src/constants.ts","kind":"import-statement","original":"../constants.js"},{"path":"src/utils.ts","kind":"import-statement","original":"../utils.js"}],"format":"esm"},"src/provider.ts":{"bytes":713,"imports":[{"path":"@rango-dev/wallets-core","kind":"import-statement","external":true},{"path":"src/constants.ts","kind":"import-statement","original":"./constants.js"},{"path":"src/namespaces/evm.ts","kind":"import-statement","original":"./namespaces/evm.js"},{"path":"src/utils.ts","kind":"import-statement","original":"./utils.js"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"src/mod.ts":{"bytes":332,"imports":[{"path":"@rango-dev/wallets-core/utils","kind":"import-statement","external":true},{"path":"src/legacy/index.ts","kind":"import-statement","original":"./legacy/index.js"},{"path":"src/provider.ts","kind":"import-statement","original":"./provider.js"},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"dist/mod.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":16253},"dist/mod.js":{"imports":[{"path":"@rango-dev/wallets-core/utils","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/legacy","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"@rango-dev/signer-evm","kind":"dynamic-import","external":true},{"path":"@rango-dev/wallets-core/legacy","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-shared","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core","kind":"import-statement","external":true},{"path":"rango-types","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/namespaces/common","kind":"import-statement","external":true},{"path":"@rango-dev/wallets-core/namespaces/evm","kind":"import-statement","external":true}],"exports":["versions"],"entryPoint":"src/mod.ts","inputs":{"src/mod.ts":{"bytesInOutput":144},"src/legacy/index.ts":{"bytesInOutput":1477},"src/signer.ts":{"bytesInOutput":371},"src/utils.ts":{"bytesInOutput":614},"src/provider.ts":{"bytesInOutput":280},"src/constants.ts":{"bytesInOutput":744},"src/namespaces/evm.ts":{"bytesInOutput":819}},"bytes":4584}}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAOA,QAAA,MAAM,aAAa,kDAcP,CAAC;AAEb,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
package/dist/signer.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../src/signer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AASjD,wBAA8B,UAAU,CACtC,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,aAAa,CAAC,CAQxB"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ProviderAPI as EvmProviderApi } from '@rango-dev/wallets-core/namespaces/evm';
|
|
2
|
+
export type Provider = Record<string, any>;
|
|
3
|
+
export declare function safepal(): Provider | null;
|
|
4
|
+
export declare function evmSafepal(): EvmProviderApi;
|
|
5
|
+
export declare function getInstanceOrThrow(): Provider;
|
|
6
|
+
/**
|
|
7
|
+
* Return true if address is a valid EVM address.
|
|
8
|
+
* Accepts:
|
|
9
|
+
* - all-lowercase or all-uppercase 0x-prefixed hex (non-checksummed - allowed)
|
|
10
|
+
* - checksummed (mixed-case according to EIP-55)
|
|
11
|
+
*/
|
|
12
|
+
export declare function isValidEvmAddress(address: string): boolean;
|
|
13
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,IAAI,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAM5F,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC3C,wBAAgB,OAAO,IAAI,QAAQ,GAAG,IAAI,CAWzC;AAED,wBAAgB,UAAU,IAAI,cAAc,CAS3C;AACD,wBAAgB,kBAAkB,IAAI,QAAQ,CAQ7C;AACD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAK1D"}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rango-dev/provider-safepal",
|
|
3
|
+
"version": "0.0.0-experimental-936229e8-20251208",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"source": "./src/mod.ts",
|
|
7
|
+
"main": "./dist/mod.js",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./dist/mod.js"
|
|
10
|
+
},
|
|
11
|
+
"typings": "dist/mod.d.ts",
|
|
12
|
+
"files": [
|
|
13
|
+
"dist",
|
|
14
|
+
"src"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "node ../../scripts/build/command.mjs --path wallets/provider-safepal --inputs src/mod.ts",
|
|
18
|
+
"ts-check": "tsc --declaration --emitDeclarationOnly -p ./tsconfig.json",
|
|
19
|
+
"clean": "rimraf dist",
|
|
20
|
+
"format": "prettier --write '{.,src}/**/*.{ts,tsx}'",
|
|
21
|
+
"lint": "eslint \"**/*.{ts,tsx}\""
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@rango-dev/signer-evm": "^0.40.0",
|
|
25
|
+
"@rango-dev/signer-solana": "^0.46.1",
|
|
26
|
+
"@rango-dev/wallets-core": "^0.0.0-experimental-936229e8-20251208",
|
|
27
|
+
"@rango-dev/wallets-shared": "^0.0.0-experimental-936229e8-20251208",
|
|
28
|
+
"rango-types": "^0.1.89"
|
|
29
|
+
},
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public"
|
|
32
|
+
}
|
|
33
|
+
}
|
package/readme.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# SafePal
|
|
2
|
+
SafePal Wallet integration for hub.
|
|
3
|
+
[Homepage](https://www.safepal.com/) | [Docs](http://devdocs.safepal.com/Connect-wallet/Web/introduction.html)
|
|
4
|
+
|
|
5
|
+
More about implementation status can be found [here](../readme.md).
|
|
6
|
+
|
|
7
|
+
## Implementation notes/limitations
|
|
8
|
+
|
|
9
|
+
### Group
|
|
10
|
+
|
|
11
|
+
#### EVM
|
|
12
|
+
SafePal supports both EVM and Solana, but we only support EVM currently.
|
|
13
|
+
The wallet also supports **TON, Sui, Tron, and Aptos**, but these namespaces are **not yet supported**.
|
|
14
|
+
|
|
15
|
+
### Feature
|
|
16
|
+
|
|
17
|
+
#### ⚠️ Connect
|
|
18
|
+
- SafePal Wallet sometimes returns **non-EVM addresses** (e.g., **Solana addresses**) during connect, which can incorrectly set invalid addresses for the EVM network.
|
|
19
|
+
- In such cases, the integration will **display an error** to prevent incorrect address usage.
|
|
20
|
+
|
|
21
|
+
#### ⚠️ Switch Account
|
|
22
|
+
- On **Solana**, switching accounts triggers a **full page reload**.
|
|
23
|
+
- Since **auto-connect is not supported**, the wallet **does not reconnect automatically** after reload.
|
|
24
|
+
- This results in both EVM and Solana **becoming disconnected** after switching accounts.
|
|
25
|
+
|
|
26
|
+
#### ❌ Auto Connect
|
|
27
|
+
- **Auto-connect is not supported**, as the wallet does **not support silent eager connection** on either EVM or Solana.
|
|
28
|
+
- A **popup is always triggered** when attempting to connect.
|
|
29
|
+
- Due to this limitation, **eager connect has been removed** from this integration.
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
More wallet information can be found in [readme.md](../readme.md).
|
package/src/constants.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type ProviderMetadata } from '@rango-dev/wallets-core';
|
|
2
|
+
import { type BlockchainMeta, evmBlockchains } from 'rango-types';
|
|
3
|
+
|
|
4
|
+
import getSigners from './signer.js';
|
|
5
|
+
import { getInstanceOrThrow } from './utils.js';
|
|
6
|
+
|
|
7
|
+
export const WALLET_ID = 'safepal';
|
|
8
|
+
export const metadata: ProviderMetadata = {
|
|
9
|
+
name: 'SafePal',
|
|
10
|
+
icon: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/safepal/icon.svg',
|
|
11
|
+
extensions: {
|
|
12
|
+
chrome:
|
|
13
|
+
'https://chrome.google.com/webstore/detail/safepal-extension-wallet/lgmpcpglpngdoalbgeoldeajfclnhafa',
|
|
14
|
+
brave:
|
|
15
|
+
'https://chrome.google.com/webstore/detail/safepal-extension-wallet/lgmpcpglpngdoalbgeoldeajfclnhafa',
|
|
16
|
+
firefox:
|
|
17
|
+
'https://addons.mozilla.org/en-US/firefox/addon/safepal-extension-wallet',
|
|
18
|
+
homepage: 'https://www.safepal.com/download',
|
|
19
|
+
},
|
|
20
|
+
properties: [
|
|
21
|
+
{
|
|
22
|
+
name: 'namespaces',
|
|
23
|
+
value: {
|
|
24
|
+
selection: 'multiple',
|
|
25
|
+
data: [
|
|
26
|
+
{
|
|
27
|
+
label: 'EVM',
|
|
28
|
+
value: 'EVM',
|
|
29
|
+
id: 'ETH',
|
|
30
|
+
getSupportedChains: (allBlockchains: BlockchainMeta[]) =>
|
|
31
|
+
evmBlockchains(allBlockchains),
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'signers',
|
|
38
|
+
value: { getSigners: async () => getSigners(getInstanceOrThrow()) },
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
};
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
CanSwitchNetwork,
|
|
3
|
+
Connect,
|
|
4
|
+
ProviderConnectResult,
|
|
5
|
+
Subscribe,
|
|
6
|
+
SwitchNetwork,
|
|
7
|
+
WalletInfo,
|
|
8
|
+
} from '@rango-dev/wallets-shared';
|
|
9
|
+
import type { BlockchainMeta, SignerFactory } from 'rango-types';
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
type LegacyProviderInterface,
|
|
13
|
+
LegacyNetworks as Networks,
|
|
14
|
+
} from '@rango-dev/wallets-core/legacy';
|
|
15
|
+
import {
|
|
16
|
+
canSwitchNetworkToEvm,
|
|
17
|
+
chooseInstance,
|
|
18
|
+
getEvmAccounts,
|
|
19
|
+
subscribeToEvm,
|
|
20
|
+
switchNetworkForEvm,
|
|
21
|
+
WalletTypes,
|
|
22
|
+
} from '@rango-dev/wallets-shared';
|
|
23
|
+
import { evmBlockchains, solanaBlockchain } from 'rango-types';
|
|
24
|
+
|
|
25
|
+
import signer from '../signer.js';
|
|
26
|
+
import { type Provider, safepal as safepal_instance } from '../utils.js';
|
|
27
|
+
|
|
28
|
+
const WALLET = WalletTypes.SAFEPAL;
|
|
29
|
+
|
|
30
|
+
export const config = {
|
|
31
|
+
type: WALLET,
|
|
32
|
+
defaultNetwork: Networks.ETHEREUM,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export const getInstance = safepal_instance;
|
|
36
|
+
export const connect: Connect = async ({ instance, meta }) => {
|
|
37
|
+
const ethInstance = chooseInstance(instance, meta, Networks.ETHEREUM);
|
|
38
|
+
|
|
39
|
+
const results: ProviderConnectResult[] = [];
|
|
40
|
+
|
|
41
|
+
if (ethInstance) {
|
|
42
|
+
const evmResult = await getEvmAccounts(ethInstance);
|
|
43
|
+
results.push(evmResult);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return results;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export const subscribe: Subscribe = (options) => {
|
|
50
|
+
let cleanup: ReturnType<Subscribe>;
|
|
51
|
+
const ethInstance = chooseInstance(
|
|
52
|
+
options.instance,
|
|
53
|
+
options.meta,
|
|
54
|
+
Networks.ETHEREUM
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
if (ethInstance) {
|
|
58
|
+
cleanup = subscribeToEvm({ ...options, instance: ethInstance });
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return () => {
|
|
62
|
+
if (cleanup) {
|
|
63
|
+
cleanup();
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export const switchNetwork: SwitchNetwork = switchNetworkForEvm;
|
|
69
|
+
|
|
70
|
+
export const canSwitchNetworkTo: CanSwitchNetwork = canSwitchNetworkToEvm;
|
|
71
|
+
|
|
72
|
+
export const getSigners: (provider: Provider) => Promise<SignerFactory> =
|
|
73
|
+
signer;
|
|
74
|
+
|
|
75
|
+
export const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo = (
|
|
76
|
+
allBlockChains
|
|
77
|
+
) => {
|
|
78
|
+
const evms = evmBlockchains(allBlockChains);
|
|
79
|
+
const solana = solanaBlockchain(allBlockChains);
|
|
80
|
+
return {
|
|
81
|
+
name: 'SafePal',
|
|
82
|
+
img: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/safepal/icon.svg',
|
|
83
|
+
installLink: {
|
|
84
|
+
CHROME:
|
|
85
|
+
'https://chrome.google.com/webstore/detail/safepal-extension-wallet/lgmpcpglpngdoalbgeoldeajfclnhafa',
|
|
86
|
+
BRAVE:
|
|
87
|
+
'https://chrome.google.com/webstore/detail/safepal-extension-wallet/lgmpcpglpngdoalbgeoldeajfclnhafa',
|
|
88
|
+
FIREFOX:
|
|
89
|
+
'https://addons.mozilla.org/en-US/firefox/addon/safepal-extension-wallet',
|
|
90
|
+
DEFAULT: 'https://www.safepal.com/download',
|
|
91
|
+
},
|
|
92
|
+
color: '#4A21EF',
|
|
93
|
+
supportedChains: [...evms, ...solana],
|
|
94
|
+
needsNamespace: {
|
|
95
|
+
selection: 'multiple',
|
|
96
|
+
data: [
|
|
97
|
+
{
|
|
98
|
+
label: 'EVM',
|
|
99
|
+
value: 'EVM',
|
|
100
|
+
id: 'ETH',
|
|
101
|
+
getSupportedChains: (allBlockchains: BlockchainMeta[]) =>
|
|
102
|
+
evmBlockchains(allBlockchains),
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
label: 'Solana',
|
|
106
|
+
value: 'Solana',
|
|
107
|
+
id: 'SOLANA',
|
|
108
|
+
getSupportedChains: (allBlockchains: BlockchainMeta[]) =>
|
|
109
|
+
solanaBlockchain(allBlockchains),
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
const buildLegacyProvider: () => LegacyProviderInterface = () => ({
|
|
117
|
+
config,
|
|
118
|
+
getInstance,
|
|
119
|
+
connect,
|
|
120
|
+
subscribe,
|
|
121
|
+
switchNetwork,
|
|
122
|
+
canSwitchNetworkTo,
|
|
123
|
+
getSigners,
|
|
124
|
+
getWalletInfo,
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
export { buildLegacyProvider };
|
package/src/mod.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { defineVersions } from '@rango-dev/wallets-core/utils';
|
|
2
|
+
|
|
3
|
+
import { buildLegacyProvider } from './legacy/index.js';
|
|
4
|
+
import { buildProvider } from './provider.js';
|
|
5
|
+
|
|
6
|
+
const versions = () =>
|
|
7
|
+
defineVersions()
|
|
8
|
+
.version('0.0.0', buildLegacyProvider())
|
|
9
|
+
.version('1.0.0', buildProvider())
|
|
10
|
+
.build();
|
|
11
|
+
|
|
12
|
+
export { versions };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { EvmActions } from '@rango-dev/wallets-core/namespaces/evm';
|
|
2
|
+
|
|
3
|
+
import { ActionBuilder, NamespaceBuilder } from '@rango-dev/wallets-core';
|
|
4
|
+
import {
|
|
5
|
+
builders as commonBuilders,
|
|
6
|
+
connectAndUpdateStateForMultiNetworks,
|
|
7
|
+
intoConnecting,
|
|
8
|
+
intoConnectionFinished,
|
|
9
|
+
standardizeAndThrowError,
|
|
10
|
+
} from '@rango-dev/wallets-core/namespaces/common';
|
|
11
|
+
import { actions, builders } from '@rango-dev/wallets-core/namespaces/evm';
|
|
12
|
+
|
|
13
|
+
import { WALLET_ID } from '../constants.js';
|
|
14
|
+
import { evmSafepal, isValidEvmAddress } from '../utils.js';
|
|
15
|
+
|
|
16
|
+
const [changeAccountSubscriber, changeAccountCleanup] = builders
|
|
17
|
+
.changeAccountSubscriber(evmSafepal)
|
|
18
|
+
.build();
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Important: Keep this implementation in sync with wallets/core/src/namespaces/evm/builders
|
|
22
|
+
*/
|
|
23
|
+
const connect = new ActionBuilder<EvmActions, 'connect'>('connect')
|
|
24
|
+
.action(actions.connect(evmSafepal))
|
|
25
|
+
.before(changeAccountSubscriber)
|
|
26
|
+
.before(intoConnecting)
|
|
27
|
+
/*
|
|
28
|
+
* Validate all accounts are valid EVM addresses
|
|
29
|
+
* Sometimes wallets may return non-EVM addresses - this check prevents that
|
|
30
|
+
*/
|
|
31
|
+
.and((_, args) => {
|
|
32
|
+
if (args.accounts.some((account: string) => !isValidEvmAddress(account))) {
|
|
33
|
+
throw new Error('Non valid EVM address returned from wallet');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return args;
|
|
37
|
+
})
|
|
38
|
+
.and(connectAndUpdateStateForMultiNetworks)
|
|
39
|
+
.after(intoConnectionFinished)
|
|
40
|
+
.or(changeAccountCleanup)
|
|
41
|
+
.or(standardizeAndThrowError)
|
|
42
|
+
.build();
|
|
43
|
+
|
|
44
|
+
const disconnect = commonBuilders
|
|
45
|
+
.disconnect<EvmActions>()
|
|
46
|
+
.after(changeAccountCleanup)
|
|
47
|
+
.build();
|
|
48
|
+
|
|
49
|
+
const canSwitchNetwork = builders
|
|
50
|
+
.canSwitchNetwork()
|
|
51
|
+
.action(actions.canSwitchNetwork())
|
|
52
|
+
.build();
|
|
53
|
+
|
|
54
|
+
const getChainId = builders
|
|
55
|
+
.getChainId()
|
|
56
|
+
.action(actions.getChainId(evmSafepal))
|
|
57
|
+
.build();
|
|
58
|
+
|
|
59
|
+
const evm = new NamespaceBuilder<EvmActions>('EVM', WALLET_ID)
|
|
60
|
+
.action(connect)
|
|
61
|
+
.action(disconnect)
|
|
62
|
+
.action(canSwitchNetwork)
|
|
63
|
+
.action(getChainId)
|
|
64
|
+
.build();
|
|
65
|
+
|
|
66
|
+
export { evm };
|
package/src/provider.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ProviderBuilder } from '@rango-dev/wallets-core';
|
|
2
|
+
|
|
3
|
+
import { metadata, WALLET_ID } from './constants.js';
|
|
4
|
+
import { evm } from './namespaces/evm.js';
|
|
5
|
+
import { safepal as safepalInstance } from './utils.js';
|
|
6
|
+
|
|
7
|
+
const WAIT_TO_LOAD_INSTANCE_DELAY = 1000;
|
|
8
|
+
const buildProvider = () =>
|
|
9
|
+
new ProviderBuilder(WALLET_ID)
|
|
10
|
+
.init(function (context) {
|
|
11
|
+
setTimeout(() => {
|
|
12
|
+
if (safepalInstance()) {
|
|
13
|
+
const [, setState] = context.state();
|
|
14
|
+
setState('installed', true);
|
|
15
|
+
console.debug('[safepal] instance detected.', context);
|
|
16
|
+
}
|
|
17
|
+
}, WAIT_TO_LOAD_INSTANCE_DELAY);
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
.config('metadata', metadata)
|
|
21
|
+
.add('evm', evm)
|
|
22
|
+
.build();
|
|
23
|
+
|
|
24
|
+
export { buildProvider };
|
package/src/signer.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Provider } from './utils.js';
|
|
2
|
+
import type { SignerFactory } from 'rango-types';
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
dynamicImportWithRefinedError,
|
|
6
|
+
getNetworkInstance,
|
|
7
|
+
Networks,
|
|
8
|
+
} from '@rango-dev/wallets-shared';
|
|
9
|
+
import { DefaultSignerFactory, TransactionType as TxType } from 'rango-types';
|
|
10
|
+
|
|
11
|
+
export default async function getSigners(
|
|
12
|
+
provider: Provider
|
|
13
|
+
): Promise<SignerFactory> {
|
|
14
|
+
const ethProvider = getNetworkInstance(provider, Networks.ETHEREUM);
|
|
15
|
+
const signers = new DefaultSignerFactory();
|
|
16
|
+
const { DefaultEvmSigner } = await dynamicImportWithRefinedError(
|
|
17
|
+
async () => await import('@rango-dev/signer-evm')
|
|
18
|
+
);
|
|
19
|
+
signers.registerSigner(TxType.EVM, new DefaultEvmSigner(ethProvider));
|
|
20
|
+
return signers;
|
|
21
|
+
}
|
package/src/utils.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { ProviderAPI as EvmProviderApi } from '@rango-dev/wallets-core/namespaces/evm';
|
|
2
|
+
|
|
3
|
+
import { LegacyNetworks } from '@rango-dev/wallets-core/legacy';
|
|
4
|
+
import { isEvmAddress } from '@rango-dev/wallets-shared';
|
|
5
|
+
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
7
|
+
export type Provider = Record<string, any>;
|
|
8
|
+
export function safepal(): Provider | null {
|
|
9
|
+
const { safepalProvider: safePalEvm } = window;
|
|
10
|
+
if (!safePalEvm) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const instances = new Map();
|
|
14
|
+
if (safePalEvm) {
|
|
15
|
+
instances.set(LegacyNetworks.ETHEREUM, safePalEvm);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return instances;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function evmSafepal(): EvmProviderApi {
|
|
22
|
+
const instances = safepal();
|
|
23
|
+
const evmInstance = instances?.get(LegacyNetworks.ETHEREUM);
|
|
24
|
+
if (!evmInstance) {
|
|
25
|
+
throw new Error(
|
|
26
|
+
'Safepal not injected or EVM not enabled. Please check your wallet.'
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
return evmInstance as EvmProviderApi;
|
|
30
|
+
}
|
|
31
|
+
export function getInstanceOrThrow(): Provider {
|
|
32
|
+
const instances = safepal();
|
|
33
|
+
|
|
34
|
+
if (!instances) {
|
|
35
|
+
throw new Error('Trust Wallet is not injected. Please check your wallet.');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return instances;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Return true if address is a valid EVM address.
|
|
42
|
+
* Accepts:
|
|
43
|
+
* - all-lowercase or all-uppercase 0x-prefixed hex (non-checksummed - allowed)
|
|
44
|
+
* - checksummed (mixed-case according to EIP-55)
|
|
45
|
+
*/
|
|
46
|
+
export function isValidEvmAddress(address: string): boolean {
|
|
47
|
+
// Pick wallet address.
|
|
48
|
+
const walletAddress = address.split(':')[2];
|
|
49
|
+
|
|
50
|
+
return isEvmAddress(walletAddress);
|
|
51
|
+
}
|