@multiplatform.one/web3 7.33.0 → 7.34.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.
Files changed (76) hide show
  1. package/README.md +24 -6
  2. package/dist/cjs/connectkit/connectors/metaMaskConnectConnector.cjs +14 -3
  3. package/dist/cjs/connectkit/connectors/metaMaskConnectConnector.native.js +14 -3
  4. package/dist/cjs/connectkit/connectors/metaMaskConnectConnector.native.js.map +1 -1
  5. package/dist/cjs/phantom/crypto.cjs +108 -0
  6. package/dist/cjs/phantom/crypto.native.js +224 -0
  7. package/dist/cjs/phantom/crypto.native.js.map +1 -0
  8. package/dist/cjs/phantom/index.cjs +16 -1
  9. package/dist/cjs/phantom/index.native.js +16 -1
  10. package/dist/cjs/phantom/index.native.js.map +1 -1
  11. package/dist/cjs/phantom/solana.cjs +309 -0
  12. package/dist/cjs/phantom/solana.native.js +466 -0
  13. package/dist/cjs/phantom/solana.native.js.map +1 -0
  14. package/dist/cjs/phantom/urls.cjs +68 -3
  15. package/dist/cjs/phantom/urls.native.js +92 -4
  16. package/dist/cjs/phantom/urls.native.js.map +1 -1
  17. package/dist/esm/connectkit/connectors/metaMaskConnectConnector.mjs +14 -3
  18. package/dist/esm/connectkit/connectors/metaMaskConnectConnector.mjs.map +1 -1
  19. package/dist/esm/connectkit/connectors/metaMaskConnectConnector.native.js +14 -3
  20. package/dist/esm/connectkit/connectors/metaMaskConnectConnector.native.js.map +1 -1
  21. package/dist/esm/phantom/crypto.mjs +67 -0
  22. package/dist/esm/phantom/crypto.mjs.map +1 -0
  23. package/dist/esm/phantom/crypto.native.js +180 -0
  24. package/dist/esm/phantom/crypto.native.js.map +1 -0
  25. package/dist/esm/phantom/index.mjs +4 -2
  26. package/dist/esm/phantom/index.mjs.map +1 -1
  27. package/dist/esm/phantom/index.native.js +4 -2
  28. package/dist/esm/phantom/index.native.js.map +1 -1
  29. package/dist/esm/phantom/solana.mjs +271 -0
  30. package/dist/esm/phantom/solana.mjs.map +1 -0
  31. package/dist/esm/phantom/solana.native.js +425 -0
  32. package/dist/esm/phantom/solana.native.js.map +1 -0
  33. package/dist/esm/phantom/urls.mjs +53 -3
  34. package/dist/esm/phantom/urls.mjs.map +1 -1
  35. package/dist/esm/phantom/urls.native.js +77 -4
  36. package/dist/esm/phantom/urls.native.js.map +1 -1
  37. package/dist/jsx/connectkit/connectors/metaMaskConnectConnector.mjs +14 -3
  38. package/dist/jsx/connectkit/connectors/metaMaskConnectConnector.mjs.map +1 -1
  39. package/dist/jsx/connectkit/connectors/metaMaskConnectConnector.native.js +14 -3
  40. package/dist/jsx/connectkit/connectors/metaMaskConnectConnector.native.js.map +1 -1
  41. package/dist/jsx/phantom/crypto.mjs +67 -0
  42. package/dist/jsx/phantom/crypto.mjs.map +1 -0
  43. package/dist/jsx/phantom/crypto.native.js +224 -0
  44. package/dist/jsx/phantom/crypto.native.js.map +1 -0
  45. package/dist/jsx/phantom/index.mjs +4 -2
  46. package/dist/jsx/phantom/index.mjs.map +1 -1
  47. package/dist/jsx/phantom/index.native.js +16 -1
  48. package/dist/jsx/phantom/index.native.js.map +1 -1
  49. package/dist/jsx/phantom/solana.mjs +271 -0
  50. package/dist/jsx/phantom/solana.mjs.map +1 -0
  51. package/dist/jsx/phantom/solana.native.js +466 -0
  52. package/dist/jsx/phantom/solana.native.js.map +1 -0
  53. package/dist/jsx/phantom/urls.mjs +53 -3
  54. package/dist/jsx/phantom/urls.mjs.map +1 -1
  55. package/dist/jsx/phantom/urls.native.js +92 -4
  56. package/dist/jsx/phantom/urls.native.js.map +1 -1
  57. package/dist/keycloak/login.iife.js +63 -63
  58. package/package.json +7 -6
  59. package/src/connectkit/connectors/metaMaskConnectConnector.spec.ts +44 -0
  60. package/src/connectkit/connectors/metaMaskConnectConnector.ts +30 -2
  61. package/src/phantom/crypto.spec.ts +61 -0
  62. package/src/phantom/crypto.ts +88 -0
  63. package/src/phantom/index.ts +38 -5
  64. package/src/phantom/solana.spec.ts +262 -0
  65. package/src/phantom/solana.ts +374 -0
  66. package/src/phantom/urls.spec.ts +101 -10
  67. package/src/phantom/urls.ts +119 -4
  68. package/types/connectkit/connectors/metaMaskConnectConnector.d.ts.map +1 -1
  69. package/types/phantom/crypto.d.ts +27 -0
  70. package/types/phantom/crypto.d.ts.map +1 -0
  71. package/types/phantom/index.d.ts +3 -1
  72. package/types/phantom/index.d.ts.map +1 -1
  73. package/types/phantom/solana.d.ts +113 -0
  74. package/types/phantom/solana.d.ts.map +1 -0
  75. package/types/phantom/urls.d.ts +46 -2
  76. package/types/phantom/urls.d.ts.map +1 -1
@@ -0,0 +1,425 @@
1
+ import bs58 from "bs58";
2
+ import { boxKeyPairFromSecretKey, decryptPayload, generateBoxKeyPair, sharedSecret } from "./crypto.native.js";
3
+ import { parsePhantomRedirect, phantomConnectUrl, phantomMethodUrl, stripPhantomRedirect } from "./urls.native.js";
4
+ function _assert_this_initialized(self) {
5
+ if (self === void 0) {
6
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
7
+ }
8
+ return self;
9
+ }
10
+ function _call_super(_this, derived, args) {
11
+ derived = _get_prototype_of(derived);
12
+ return _possible_constructor_return(_this, _is_native_reflect_construct() ? Reflect.construct(derived, args || [], _get_prototype_of(_this).constructor) : derived.apply(_this, args));
13
+ }
14
+ function _class_call_check(instance, Constructor) {
15
+ if (!(instance instanceof Constructor)) {
16
+ throw new TypeError("Cannot call a class as a function");
17
+ }
18
+ }
19
+ function _construct(Parent, args, Class) {
20
+ if (_is_native_reflect_construct()) {
21
+ _construct = Reflect.construct;
22
+ } else {
23
+ _construct = function construct(Parent2, args2, Class2) {
24
+ var a = [null];
25
+ a.push.apply(a, args2);
26
+ var Constructor = Function.bind.apply(Parent2, a);
27
+ var instance = new Constructor();
28
+ if (Class2) _set_prototype_of(instance, Class2.prototype);
29
+ return instance;
30
+ };
31
+ }
32
+ return _construct.apply(null, arguments);
33
+ }
34
+ function _get_prototype_of(o) {
35
+ _get_prototype_of = Object.setPrototypeOf ? Object.getPrototypeOf : function getPrototypeOf(o2) {
36
+ return o2.__proto__ || Object.getPrototypeOf(o2);
37
+ };
38
+ return _get_prototype_of(o);
39
+ }
40
+ function _inherits(subClass, superClass) {
41
+ if (typeof superClass !== "function" && superClass !== null) {
42
+ throw new TypeError("Super expression must either be null or a function");
43
+ }
44
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
45
+ constructor: {
46
+ value: subClass,
47
+ writable: true,
48
+ configurable: true
49
+ }
50
+ });
51
+ if (superClass) _set_prototype_of(subClass, superClass);
52
+ }
53
+ function _is_native_function(fn) {
54
+ return Function.toString.call(fn).indexOf("[native code]") !== -1;
55
+ }
56
+ function _possible_constructor_return(self, call) {
57
+ if (call && (_type_of(call) === "object" || typeof call === "function")) {
58
+ return call;
59
+ }
60
+ return _assert_this_initialized(self);
61
+ }
62
+ function _set_prototype_of(o, p) {
63
+ _set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o2, p2) {
64
+ o2.__proto__ = p2;
65
+ return o2;
66
+ };
67
+ return _set_prototype_of(o, p);
68
+ }
69
+ function _type_of(obj) {
70
+ "@swc/helpers - typeof";
71
+
72
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
73
+ }
74
+ function _wrap_native_super(Class) {
75
+ var _cache = typeof Map === "function" ? /* @__PURE__ */new Map() : void 0;
76
+ _wrap_native_super = function wrapNativeSuper(Class2) {
77
+ if (Class2 === null || !_is_native_function(Class2)) return Class2;
78
+ if (typeof Class2 !== "function") {
79
+ throw new TypeError("Super expression must either be null or a function");
80
+ }
81
+ if (typeof _cache !== "undefined") {
82
+ if (_cache.has(Class2)) return _cache.get(Class2);
83
+ _cache.set(Class2, Wrapper);
84
+ }
85
+ function Wrapper() {
86
+ return _construct(Class2, arguments, _get_prototype_of(this).constructor);
87
+ }
88
+ Wrapper.prototype = Object.create(Class2.prototype, {
89
+ constructor: {
90
+ value: Wrapper,
91
+ enumerable: false,
92
+ writable: true,
93
+ configurable: true
94
+ }
95
+ });
96
+ return _set_prototype_of(Wrapper, Class2);
97
+ };
98
+ return _wrap_native_super(Class);
99
+ }
100
+ function _is_native_reflect_construct() {
101
+ try {
102
+ var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
103
+ } catch (_) {}
104
+ return (_is_native_reflect_construct = function () {
105
+ return !!result;
106
+ })();
107
+ }
108
+ var PhantomNotConnectedError = /* @__PURE__ */function (Error1) {
109
+ "use strict";
110
+
111
+ _inherits(PhantomNotConnectedError2, Error1);
112
+ function PhantomNotConnectedError2() {
113
+ _class_call_check(this, PhantomNotConnectedError2);
114
+ var _this;
115
+ _this = _call_super(this, PhantomNotConnectedError2, ["no Phantom deeplink session: call connect() first"]);
116
+ _this.name = "PhantomNotConnectedError";
117
+ return _this;
118
+ }
119
+ return PhantomNotConnectedError2;
120
+ }(_wrap_native_super(Error));
121
+ var defaultStorageKey = "mpo.web3.phantom.deeplink";
122
+ function defaultStorage() {
123
+ var storage = globalThis.localStorage;
124
+ if (!storage) throw new Error("phantomDeeplink: no localStorage here; pass `storage`");
125
+ return storage;
126
+ }
127
+ function currentHref() {
128
+ var _globalThis_location;
129
+ var href = (_globalThis_location = globalThis.location) === null || _globalThis_location === void 0 ? void 0 : _globalThis_location.href;
130
+ if (!href) throw new Error("phantomDeeplink: no location here; pass `redirectLink`");
131
+ return href;
132
+ }
133
+ function phantomDeeplink(config) {
134
+ var _config_storageKey, _config_now, _config_navigate;
135
+ var storageKey = (_config_storageKey = config.storageKey) !== null && _config_storageKey !== void 0 ? _config_storageKey : defaultStorageKey;
136
+ var storage = function storage2() {
137
+ var _config_storage;
138
+ return (_config_storage = config.storage) !== null && _config_storage !== void 0 ? _config_storage : defaultStorage();
139
+ };
140
+ var now = (_config_now = config.now) !== null && _config_now !== void 0 ? _config_now : Date.now;
141
+ var navigate = (_config_navigate = config.navigate) !== null && _config_navigate !== void 0 ? _config_navigate : function (url) {
142
+ return globalThis.location.assign(url);
143
+ };
144
+ var redirectLink = function redirectLink2() {
145
+ var _config_redirectLink;
146
+ return (_config_redirectLink = config.redirectLink) !== null && _config_redirectLink !== void 0 ? _config_redirectLink : stripPhantomRedirect(currentHref());
147
+ };
148
+ var load = function load2() {
149
+ var raw = storage().getItem(storageKey);
150
+ if (!raw) return void 0;
151
+ try {
152
+ return JSON.parse(raw);
153
+ } catch (unused) {
154
+ return void 0;
155
+ }
156
+ };
157
+ var save = function save2(record) {
158
+ return storage().setItem(storageKey, JSON.stringify(record));
159
+ };
160
+ var connected = function connected2() {
161
+ var record = load();
162
+ if (!(record === null || record === void 0 ? void 0 : record.session) || !record.phantomEncryptionPublicKey) throw new PhantomNotConnectedError();
163
+ return record;
164
+ };
165
+ var methodUrl = function methodUrl2(record, method, payload) {
166
+ var keyPair = boxKeyPairFromSecretKey(bs58.decode(record.dappSecretKey));
167
+ return phantomMethodUrl({
168
+ method,
169
+ payload,
170
+ session: record.session,
171
+ dappEncryptionPublicKey: keyPair.publicKey,
172
+ sharedSecret: sharedSecret(bs58.decode(record.phantomEncryptionPublicKey), keyPair.secretKey),
173
+ redirectLink: redirectLink(),
174
+ base: config.base
175
+ });
176
+ };
177
+ var request = function request2(method, payload) {
178
+ var record = connected();
179
+ var url = methodUrl(record, method, payload);
180
+ save({
181
+ ...record,
182
+ pending: {
183
+ method,
184
+ at: now()
185
+ }
186
+ });
187
+ navigate(url);
188
+ return url;
189
+ };
190
+ return {
191
+ get publicKey() {
192
+ var _load;
193
+ return (_load = load()) === null || _load === void 0 ? void 0 : _load.publicKey;
194
+ },
195
+ get connected() {
196
+ var record = load();
197
+ return !!((record === null || record === void 0 ? void 0 : record.session) && record.phantomEncryptionPublicKey);
198
+ },
199
+ get pending() {
200
+ var _load1;
201
+ return (_load1 = load()) === null || _load1 === void 0 ? void 0 : _load1.pending;
202
+ },
203
+ connect() {
204
+ var keyPair = generateBoxKeyPair();
205
+ var url = phantomConnectUrl({
206
+ appUrl: config.appUrl,
207
+ dappEncryptionPublicKey: keyPair.publicKey,
208
+ redirectLink: redirectLink(),
209
+ cluster: config.cluster,
210
+ base: config.base
211
+ });
212
+ save({
213
+ dappSecretKey: bs58.encode(keyPair.secretKey),
214
+ cluster: config.cluster,
215
+ pending: {
216
+ method: "connect",
217
+ at: now()
218
+ }
219
+ });
220
+ navigate(url);
221
+ return url;
222
+ },
223
+ signTransaction(serializedTransaction) {
224
+ return request("signTransaction", {
225
+ transaction: bs58.encode(serializedTransaction)
226
+ });
227
+ },
228
+ signAllTransactions(serializedTransactions) {
229
+ return request("signAllTransactions", {
230
+ transactions: serializedTransactions.map(function (tx) {
231
+ return bs58.encode(tx);
232
+ })
233
+ });
234
+ },
235
+ signAndSendTransaction(serializedTransaction, sendOptions) {
236
+ return request("signAndSendTransaction", {
237
+ transaction: bs58.encode(serializedTransaction),
238
+ ...(sendOptions ? {
239
+ sendOptions
240
+ } : {})
241
+ });
242
+ },
243
+ signMessage(message, display) {
244
+ var bytes = typeof message === "string" ? new TextEncoder().encode(message) : message;
245
+ return request("signMessage", {
246
+ message: bs58.encode(bytes),
247
+ ...(display ? {
248
+ display
249
+ } : {})
250
+ });
251
+ },
252
+ disconnect() {
253
+ var url = methodUrl(connected(), "disconnect", {});
254
+ storage().removeItem(storageKey);
255
+ navigate(url);
256
+ return url;
257
+ },
258
+ handleRedirect(href) {
259
+ var _record_pending;
260
+ var params = parsePhantomRedirect(href !== null && href !== void 0 ? href : currentHref());
261
+ if (!params) return void 0;
262
+ var record = load();
263
+ var method = record === null || record === void 0 ? void 0 : (_record_pending = record.pending) === null || _record_pending === void 0 ? void 0 : _record_pending.method;
264
+ if (params.errorCode) {
265
+ var _params_errorMessage;
266
+ if (record) save({
267
+ ...record,
268
+ pending: void 0
269
+ });
270
+ return {
271
+ ok: false,
272
+ method,
273
+ errorCode: params.errorCode,
274
+ errorMessage: (_params_errorMessage = params.errorMessage) !== null && _params_errorMessage !== void 0 ? _params_errorMessage : ""
275
+ };
276
+ }
277
+ if (!record || !params.data || !params.nonce) {
278
+ return {
279
+ ok: false,
280
+ method,
281
+ errorCode: "-32603",
282
+ errorMessage: "Phantom answered, but this browser holds no matching request"
283
+ };
284
+ }
285
+ var secretKey = bs58.decode(record.dappSecretKey);
286
+ var phantomKey = method === "connect" ? params.phantomEncryptionPublicKey : record.phantomEncryptionPublicKey;
287
+ if (!phantomKey) {
288
+ return {
289
+ ok: false,
290
+ method,
291
+ errorCode: "-32603",
292
+ errorMessage: "Phantom's answer carries no encryption key"
293
+ };
294
+ }
295
+ var data = decryptPayload(params.data, params.nonce, sharedSecret(bs58.decode(phantomKey), secretKey));
296
+ switch (method) {
297
+ case "connect":
298
+ {
299
+ var publicKey = String(data.public_key);
300
+ var session = String(data.session);
301
+ save({
302
+ ...record,
303
+ phantomEncryptionPublicKey: phantomKey,
304
+ publicKey,
305
+ session,
306
+ pending: void 0
307
+ });
308
+ return {
309
+ ok: true,
310
+ method,
311
+ publicKey,
312
+ session
313
+ };
314
+ }
315
+ case "signTransaction":
316
+ save({
317
+ ...record,
318
+ pending: void 0
319
+ });
320
+ return {
321
+ ok: true,
322
+ method,
323
+ transaction: bs58.decode(String(data.transaction))
324
+ };
325
+ case "signAllTransactions":
326
+ save({
327
+ ...record,
328
+ pending: void 0
329
+ });
330
+ return {
331
+ ok: true,
332
+ method,
333
+ transactions: data.transactions.map(function (tx) {
334
+ return bs58.decode(tx);
335
+ })
336
+ };
337
+ case "signAndSendTransaction":
338
+ save({
339
+ ...record,
340
+ pending: void 0
341
+ });
342
+ return {
343
+ ok: true,
344
+ method,
345
+ signature: String(data.signature)
346
+ };
347
+ case "signMessage":
348
+ save({
349
+ ...record,
350
+ pending: void 0
351
+ });
352
+ return {
353
+ ok: true,
354
+ method,
355
+ signature: bs58.decode(String(data.signature))
356
+ };
357
+ default:
358
+ return {
359
+ ok: false,
360
+ method,
361
+ errorCode: "-32603",
362
+ errorMessage: "Phantom answered a request this browser did not make"
363
+ };
364
+ }
365
+ },
366
+ forget() {
367
+ storage().removeItem(storageKey);
368
+ }
369
+ };
370
+ }
371
+ function toBase64(bytes) {
372
+ var binary = "";
373
+ var _iteratorNormalCompletion = true,
374
+ _didIteratorError = false,
375
+ _iteratorError = void 0;
376
+ try {
377
+ for (var _iterator = bytes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
378
+ var byte = _step.value;
379
+ binary += String.fromCharCode(byte);
380
+ }
381
+ } catch (err) {
382
+ _didIteratorError = true;
383
+ _iteratorError = err;
384
+ } finally {
385
+ try {
386
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
387
+ _iterator.return();
388
+ }
389
+ } finally {
390
+ if (_didIteratorError) {
391
+ throw _iteratorError;
392
+ }
393
+ }
394
+ }
395
+ return btoa(binary);
396
+ }
397
+ async function sendSolanaTransaction(rpcUrl, signedTransaction) {
398
+ var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
399
+ var _options_fetch, _options_skipPreflight;
400
+ var response = await ((_options_fetch = options.fetch) !== null && _options_fetch !== void 0 ? _options_fetch : fetch)(rpcUrl, {
401
+ method: "POST",
402
+ headers: {
403
+ "content-type": "application/json"
404
+ },
405
+ body: JSON.stringify({
406
+ jsonrpc: "2.0",
407
+ id: 1,
408
+ method: "sendTransaction",
409
+ params: [toBase64(signedTransaction), {
410
+ encoding: "base64",
411
+ skipPreflight: (_options_skipPreflight = options.skipPreflight) !== null && _options_skipPreflight !== void 0 ? _options_skipPreflight : false
412
+ }]
413
+ })
414
+ });
415
+ var body = await response.json();
416
+ if (body.error) {
417
+ throw Object.assign(new Error(`sendTransaction failed: ${body.error.message}`), {
418
+ code: body.error.code
419
+ });
420
+ }
421
+ if (typeof body.result !== "string") throw new Error("sendTransaction returned no signature");
422
+ return body.result;
423
+ }
424
+ export { PhantomNotConnectedError, phantomDeeplink, sendSolanaTransaction };
425
+ //# sourceMappingURL=solana.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["bs58","boxKeyPairFromSecretKey","decryptPayload","generateBoxKeyPair","sharedSecret","parsePhantomRedirect","phantomConnectUrl","phantomMethodUrl","stripPhantomRedirect","_assert_this_initialized","self","ReferenceError","_call_super","_this","derived","args","_get_prototype_of","_possible_constructor_return","_is_native_reflect_construct","Reflect","construct","constructor","apply","_class_call_check","instance","Constructor","TypeError","_construct","Parent","Class","Parent2","args2","Class2","a","push","Function","bind","_set_prototype_of","prototype","arguments","o","Object","setPrototypeOf","getPrototypeOf","o2","__proto__","_inherits","subClass","superClass","create","value","writable","configurable","_is_native_function","fn","toString","call","indexOf","_type_of","p","p2","obj","Symbol","_wrap_native_super","_cache","Map","wrapNativeSuper","has","get","set","Wrapper","enumerable","result","Boolean","valueOf","_","PhantomNotConnectedError","Error1","PhantomNotConnectedError2","name","Error","defaultStorageKey","defaultStorage","storage","globalThis","localStorage","currentHref","_globalThis_location","href","location","phantomDeeplink","config","_config_storageKey","_config_now","_config_navigate","storageKey","storage2","_config_storage","now","Date","navigate","url","assign","redirectLink","redirectLink2","_config_redirectLink","load","load2","raw","getItem","JSON","parse","unused","save","save2","record","setItem","stringify","connected","connected2","session","phantomEncryptionPublicKey","methodUrl","methodUrl2","method","payload","keyPair","decode","dappSecretKey","dappEncryptionPublicKey","publicKey","secretKey","base","request","request2","pending","at","_load","_load1","connect","appUrl","cluster","encode","signTransaction","serializedTransaction","transaction","signAllTransactions","serializedTransactions","transactions","map","tx"],"sources":["../../../src/phantom/solana.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -1,7 +1,57 @@
1
+ import bs58 from "bs58";
2
+ import { encryptPayload } from "./crypto.mjs";
1
3
  const phantomUniversalLinkBase = "https://phantom.com/ul";
4
+ const base = override => (override ?? phantomUniversalLinkBase).replace(/\/+$/, "");
2
5
  function phantomBrowseUrl(url, ref, options = {}) {
3
- const base = (options.base ?? phantomUniversalLinkBase).replace(/\/+$/, "");
4
- return `${base}/browse/${encodeURIComponent(url)}?ref=${encodeURIComponent(ref)}`;
6
+ return `${base(options.base)}/browse/${encodeURIComponent(url)}?ref=${encodeURIComponent(ref)}`;
5
7
  }
6
- export { phantomBrowseUrl, phantomUniversalLinkBase };
8
+ function phantomConnectUrl(params) {
9
+ const query = new URLSearchParams({
10
+ app_url: params.appUrl,
11
+ dapp_encryption_public_key: bs58.encode(params.dappEncryptionPublicKey),
12
+ redirect_link: params.redirectLink
13
+ });
14
+ if (params.cluster) query.set("cluster", params.cluster);
15
+ return `${base(params.base)}/v1/connect?${query}`;
16
+ }
17
+ function phantomMethodUrl(params) {
18
+ const sealed = encryptPayload({
19
+ ...params.payload,
20
+ session: params.session
21
+ }, params.sharedSecret, params.nonce);
22
+ const query = new URLSearchParams({
23
+ dapp_encryption_public_key: bs58.encode(params.dappEncryptionPublicKey),
24
+ nonce: sealed.nonce,
25
+ redirect_link: params.redirectLink,
26
+ payload: sealed.payload
27
+ });
28
+ return `${base(params.base)}/v1/${params.method}?${query}`;
29
+ }
30
+ const responseKeys = ["phantom_encryption_public_key", "nonce", "data", "errorCode", "errorMessage"];
31
+ function parsePhantomRedirect(href) {
32
+ const [beforeHash] = href.split("#");
33
+ const at = beforeHash.indexOf("?");
34
+ if (at < 0) return void 0;
35
+ const query = new URLSearchParams(beforeHash.slice(at + 1).replace(/\?/g, "&"));
36
+ if (!query.has("errorCode") && !(query.has("data") && query.has("nonce"))) return void 0;
37
+ return {
38
+ phantomEncryptionPublicKey: query.get("phantom_encryption_public_key") ?? void 0,
39
+ nonce: query.get("nonce") ?? void 0,
40
+ data: query.get("data") ?? void 0,
41
+ errorCode: query.get("errorCode") ?? void 0,
42
+ errorMessage: query.get("errorMessage") ?? void 0
43
+ };
44
+ }
45
+ function stripPhantomRedirect(href) {
46
+ const hashAt = href.indexOf("#");
47
+ const hash = hashAt >= 0 ? href.slice(hashAt) : "";
48
+ const beforeHash = hashAt >= 0 ? href.slice(0, hashAt) : href;
49
+ const at = beforeHash.indexOf("?");
50
+ if (at < 0) return href;
51
+ const query = new URLSearchParams(beforeHash.slice(at + 1).replace(/\?/g, "&"));
52
+ for (const key of responseKeys) query.delete(key);
53
+ const rest = query.toString();
54
+ return `${beforeHash.slice(0, at)}${rest ? `?${rest}` : ""}${hash}`;
55
+ }
56
+ export { parsePhantomRedirect, phantomBrowseUrl, phantomConnectUrl, phantomMethodUrl, phantomUniversalLinkBase, stripPhantomRedirect };
7
57
  //# sourceMappingURL=urls.mjs.map
@@ -1 +1 @@
1
- {"version":3,"names":["phantomUniversalLinkBase","phantomBrowseUrl","url","ref","options","base","replace","encodeURIComponent"],"sources":["../../../src/phantom/urls.ts"],"sourcesContent":[null],"mappings":"AACO,MAAMA,wBAAA,GAA2B;AAOjC,SAASC,iBACdC,GAAA,EACAC,GAAA,EACAC,OAAA,GAA6B,CAAC,GACtB;EACR,MAAMC,IAAA,IAAQD,OAAA,CAAQC,IAAA,IAAQL,wBAAA,EAA0BM,OAAA,CAAQ,QAAQ,EAAE;EAC1E,OAAO,GAAGD,IAAI,WAAWE,kBAAA,CAAmBL,GAAG,CAAC,QAAQK,kBAAA,CAAmBJ,GAAG,CAAC;AACjF","ignoreList":[]}
1
+ {"version":3,"names":["bs58","encryptPayload","phantomUniversalLinkBase","base","override","replace","phantomBrowseUrl","url","ref","options","encodeURIComponent","phantomConnectUrl","params","query","URLSearchParams","app_url","appUrl","dapp_encryption_public_key","encode","dappEncryptionPublicKey","redirect_link","redirectLink","cluster","set","phantomMethodUrl","sealed","payload","session","sharedSecret","nonce","method","responseKeys","parsePhantomRedirect","href","beforeHash","split","at","indexOf","slice","has","phantomEncryptionPublicKey","get","data","errorCode","errorMessage","stripPhantomRedirect","hashAt","hash","key","delete","rest","toString"],"sources":["../../../src/phantom/urls.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -1,9 +1,82 @@
1
+ import bs58 from "bs58";
2
+ import { encryptPayload } from "./crypto.native.js";
1
3
  var phantomUniversalLinkBase = "https://phantom.com/ul";
4
+ var base = function base2(override) {
5
+ return (override !== null && override !== void 0 ? override : phantomUniversalLinkBase).replace(/\/+$/, "");
6
+ };
2
7
  function phantomBrowseUrl(url, ref) {
3
8
  var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
4
- var _options_base;
5
- var base = ((_options_base = options.base) !== null && _options_base !== void 0 ? _options_base : phantomUniversalLinkBase).replace(/\/+$/, "");
6
- return `${base}/browse/${encodeURIComponent(url)}?ref=${encodeURIComponent(ref)}`;
9
+ return `${base(options.base)}/browse/${encodeURIComponent(url)}?ref=${encodeURIComponent(ref)}`;
7
10
  }
8
- export { phantomBrowseUrl, phantomUniversalLinkBase };
11
+ function phantomConnectUrl(params) {
12
+ var query = new URLSearchParams({
13
+ app_url: params.appUrl,
14
+ dapp_encryption_public_key: bs58.encode(params.dappEncryptionPublicKey),
15
+ redirect_link: params.redirectLink
16
+ });
17
+ if (params.cluster) query.set("cluster", params.cluster);
18
+ return `${base(params.base)}/v1/connect?${query}`;
19
+ }
20
+ function phantomMethodUrl(params) {
21
+ var sealed = encryptPayload({
22
+ ...params.payload,
23
+ session: params.session
24
+ }, params.sharedSecret, params.nonce);
25
+ var query = new URLSearchParams({
26
+ dapp_encryption_public_key: bs58.encode(params.dappEncryptionPublicKey),
27
+ nonce: sealed.nonce,
28
+ redirect_link: params.redirectLink,
29
+ payload: sealed.payload
30
+ });
31
+ return `${base(params.base)}/v1/${params.method}?${query}`;
32
+ }
33
+ var responseKeys = ["phantom_encryption_public_key", "nonce", "data", "errorCode", "errorMessage"];
34
+ function parsePhantomRedirect(href) {
35
+ var _query_get, _query_get1, _query_get2, _query_get3, _query_get4;
36
+ var [beforeHash] = href.split("#");
37
+ var at = beforeHash.indexOf("?");
38
+ if (at < 0) return void 0;
39
+ var query = new URLSearchParams(beforeHash.slice(at + 1).replace(/\?/g, "&"));
40
+ if (!query.has("errorCode") && !(query.has("data") && query.has("nonce"))) return void 0;
41
+ return {
42
+ phantomEncryptionPublicKey: (_query_get = query.get("phantom_encryption_public_key")) !== null && _query_get !== void 0 ? _query_get : void 0,
43
+ nonce: (_query_get1 = query.get("nonce")) !== null && _query_get1 !== void 0 ? _query_get1 : void 0,
44
+ data: (_query_get2 = query.get("data")) !== null && _query_get2 !== void 0 ? _query_get2 : void 0,
45
+ errorCode: (_query_get3 = query.get("errorCode")) !== null && _query_get3 !== void 0 ? _query_get3 : void 0,
46
+ errorMessage: (_query_get4 = query.get("errorMessage")) !== null && _query_get4 !== void 0 ? _query_get4 : void 0
47
+ };
48
+ }
49
+ function stripPhantomRedirect(href) {
50
+ var hashAt = href.indexOf("#");
51
+ var hash = hashAt >= 0 ? href.slice(hashAt) : "";
52
+ var beforeHash = hashAt >= 0 ? href.slice(0, hashAt) : href;
53
+ var at = beforeHash.indexOf("?");
54
+ if (at < 0) return href;
55
+ var query = new URLSearchParams(beforeHash.slice(at + 1).replace(/\?/g, "&"));
56
+ var _iteratorNormalCompletion = true,
57
+ _didIteratorError = false,
58
+ _iteratorError = void 0;
59
+ try {
60
+ for (var _iterator = responseKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
61
+ var key = _step.value;
62
+ query.delete(key);
63
+ }
64
+ } catch (err) {
65
+ _didIteratorError = true;
66
+ _iteratorError = err;
67
+ } finally {
68
+ try {
69
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
70
+ _iterator.return();
71
+ }
72
+ } finally {
73
+ if (_didIteratorError) {
74
+ throw _iteratorError;
75
+ }
76
+ }
77
+ }
78
+ var rest = query.toString();
79
+ return `${beforeHash.slice(0, at)}${rest ? `?${rest}` : ""}${hash}`;
80
+ }
81
+ export { parsePhantomRedirect, phantomBrowseUrl, phantomConnectUrl, phantomMethodUrl, phantomUniversalLinkBase, stripPhantomRedirect };
9
82
  //# sourceMappingURL=urls.native.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["phantomUniversalLinkBase","phantomBrowseUrl","url","ref","options","arguments","length","_options_base","base","replace"],"sources":["../../../src/phantom/urls.ts"],"sourcesContent":[null],"mappings":"AACO,IAAAA,wBAAM,2BAA2B;AAOjC,SAASC,iBACdC,GAAA,EACAC,GAAA,EACA;EAEA,IAAAC,OAAM,GAAQC,SAAQ,CAAAC,MAAQ,QAAAD,SAAA,aAA0B,IAAQA,SAAQ,CAAE;EAC1E,IAAAE,aAAc;EAChB,IAAAC,IAAA,KAAAD,aAAA,GAAAH,OAAA,CAAAI,IAAA,cAAAD,aAAA,cAAAA,aAAA,GAAAP,wBAAA,EAAAS,OAAA","ignoreList":[]}
1
+ {"version":3,"names":["bs58","encryptPayload","phantomUniversalLinkBase","base","base2","override","replace","phantomBrowseUrl","url","ref","options","arguments","length","encodeURIComponent","phantomConnectUrl","params","query","URLSearchParams","app_url","appUrl","dapp_encryption_public_key","encode","dappEncryptionPublicKey","redirect_link","redirectLink","cluster","set","phantomMethodUrl","sealed","payload","session","sharedSecret","nonce","method","responseKeys","parsePhantomRedirect","href","_query_get","_query_get1","_query_get2","_query_get3","_query_get4","beforeHash","split","at","indexOf","slice","has","phantomEncryptionPublicKey","get","data","errorCode","errorMessage","stripPhantomRedirect","hashAt","hash","_iteratorNormalCompletion","_didIteratorError","_iteratorError"],"sources":["../../../src/phantom/urls.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -21,12 +21,23 @@ function metaMaskSupportedNetworks(networks, transports) {
21
21
  };
22
22
  }
23
23
  const offListMethods = /* @__PURE__ */new Set(["personal_sign", "eth_accounts", "eth_coinbase", "eth_chainId", "eth_requestAccounts", "net_version", "wallet_getPermissions", "wallet_requestPermissions", "wallet_revokePermissions", "wallet_switchEthereumChain", "wallet_addEthereumChain", "metamask_getProviderState", "metamask_sendDomainMetadata", "metamask_logWeb3ShimUsage", "wallet_registerOnboarding"]);
24
- function listedChainsOnly(provider, mm, networks) {
24
+ function signUnderMainnet(provider, args) {
25
+ const selected = provider.selectedChainId;
26
+ provider.selectedChainId = numberToHex(mainnet.id);
27
+ try {
28
+ return provider.request(args);
29
+ } finally {
30
+ provider.selectedChainId = selected;
31
+ }
32
+ }
33
+ function listedChainsOnly(provider, mm, networks, supportedNetworks) {
25
34
  const request = async args => {
26
35
  const chainId = mm.getChainId();
27
- if (chainId && !networks[numberToHex(Number(chainId))] && !offListMethods.has(args.method)) throw Object.assign(new Error(`MetaMask is on chain ${Number(chainId)}, which this app does not list, so ${args.method} was not sent`), {
36
+ const current = chainId ? numberToHex(Number(chainId)) : void 0;
37
+ if (current && !networks[current] && !offListMethods.has(args.method)) throw Object.assign(new Error(`MetaMask is on chain ${Number(chainId)}, which this app does not list, so ${args.method} was not sent`), {
28
38
  code: 4901
29
39
  });
40
+ if (current && !supportedNetworks[current] && args.method === "personal_sign") return signUnderMainnet(provider, args);
30
41
  return provider.request(args);
31
42
  };
32
43
  return new Proxy(provider, {
@@ -253,7 +264,7 @@ function metaMaskConnect(parameters) {
253
264
  const provider = mm.getProvider();
254
265
  if (guarded?.provider !== provider) guarded = {
255
266
  provider,
256
- wrapped: listedChainsOnly(provider, mm, networks)
267
+ wrapped: listedChainsOnly(provider, mm, networks, supportedNetworks)
257
268
  };
258
269
  return guarded.wrapped;
259
270
  },