@bit-buccaneers/wallet-abstraction 0.0.4 → 0.0.6
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/dev.js +302 -70
- package/dist/dev.jsx +310 -73
- package/dist/index.js +302 -70
- package/dist/index.jsx +310 -73
- package/dist/lib/connectors/binance.d.ts +1 -0
- package/dist/lib/connectors/bitget.d.ts +2 -0
- package/dist/lib/connectors/coinbase.d.ts +2 -0
- package/dist/lib/connectors/exodus.d.ts +1 -0
- package/dist/lib/connectors/index.d.ts +10 -6
- package/dist/lib/connectors/metamask.d.ts +1 -0
- package/dist/lib/connectors/okx.d.ts +2 -0
- package/dist/lib/connectors/phantom.d.ts +1 -0
- package/dist/lib/connectors/shared/dapp-browser.d.ts +14 -0
- package/dist/lib/connectors/shared/index.d.ts +1 -0
- package/dist/lib/connectors/solflare.d.ts +1 -0
- package/dist/lib/connectors/trust.d.ts +1 -0
- package/dist/lib/connectors/walletconnect.d.ts +4 -0
- package/dist/lib/core/types.d.ts +1 -1
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/wallets/config.d.ts +2 -2
- package/package.json +1 -1
package/dist/index.jsx
CHANGED
|
@@ -149,6 +149,11 @@ var WALLETS = [
|
|
|
149
149
|
name: "Exodus",
|
|
150
150
|
icon: "https://iconic.dynamic-static-assets.com/icons/sprite.svg#exodus",
|
|
151
151
|
chromeExtensionUrl: "https://chromewebstore.google.com/detail/aholpfdialjgjfhomihkjbmgjidlcdno"
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
id: "walletconnect",
|
|
155
|
+
name: "WalletConnect",
|
|
156
|
+
icon: "https://iconic.dynamic-static-assets.com/icons/sprite.svg#walletconnect"
|
|
152
157
|
}
|
|
153
158
|
];
|
|
154
159
|
|
|
@@ -200,8 +205,94 @@ var SOLANA_WC_CONFIG = {
|
|
|
200
205
|
events: WC_EVENTS.SOLANA
|
|
201
206
|
};
|
|
202
207
|
|
|
203
|
-
// src/lib/connectors/shared/
|
|
208
|
+
// src/lib/connectors/shared/injected.ts
|
|
204
209
|
import bs58 from "bs58";
|
|
210
|
+
var connectEvmInjected = async () => {
|
|
211
|
+
if (!window.ethereum) throw new Error("No injected EVM provider");
|
|
212
|
+
const accounts = await window.ethereum.request({
|
|
213
|
+
method: "eth_requestAccounts"
|
|
214
|
+
});
|
|
215
|
+
if (!accounts[0]) throw new Error("No accounts returned");
|
|
216
|
+
const chainId = await window.ethereum.request({ method: "eth_chainId" });
|
|
217
|
+
return connectedResult(accounts[0], { chainId: parseInt(chainId, 16) });
|
|
218
|
+
};
|
|
219
|
+
var connectSolanaInjected = async () => {
|
|
220
|
+
if (!window.solana) throw new Error("No injected Solana provider");
|
|
221
|
+
const response = await window.solana.connect();
|
|
222
|
+
const publicKey = response.publicKey;
|
|
223
|
+
return connectedResult(publicKey.toBase58(), { publicKey: publicKey.toBytes() });
|
|
224
|
+
};
|
|
225
|
+
var signSolanaInjected = async (message) => {
|
|
226
|
+
if (!window.solana?.signMessage) {
|
|
227
|
+
throw new Error("No injected Solana provider or signMessage not supported");
|
|
228
|
+
}
|
|
229
|
+
const encodedMessage = new TextEncoder().encode(message);
|
|
230
|
+
const result = await window.solana.signMessage(encodedMessage, "utf8");
|
|
231
|
+
return bs58.encode(new Uint8Array(result.signature));
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
// src/lib/connectors/shared/utils.ts
|
|
235
|
+
var isMobile = () => {
|
|
236
|
+
return typeof window !== "undefined" && /iPhone|iPad|iPod|Android/i.test(window.navigator.userAgent);
|
|
237
|
+
};
|
|
238
|
+
var isInWalletBrowser = (key) => {
|
|
239
|
+
return typeof window !== "undefined" && !!window.ethereum?.[key];
|
|
240
|
+
};
|
|
241
|
+
var openDeeplink = (url) => {
|
|
242
|
+
const link = document.createElement("a");
|
|
243
|
+
link.href = url;
|
|
244
|
+
link.click();
|
|
245
|
+
};
|
|
246
|
+
var waitForValue = (getValue) => {
|
|
247
|
+
return new Promise((resolve) => {
|
|
248
|
+
const check = () => {
|
|
249
|
+
const value = getValue();
|
|
250
|
+
if (value != null) resolve(value);
|
|
251
|
+
else window.setTimeout(check, 50);
|
|
252
|
+
};
|
|
253
|
+
check();
|
|
254
|
+
});
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
// src/lib/connectors/shared/dapp-browser.ts
|
|
258
|
+
var buildBrowseUrl = (baseUrl, stripProtocol) => {
|
|
259
|
+
if (stripProtocol) {
|
|
260
|
+
return `${baseUrl}/${window.location.host}${window.location.pathname}${window.location.search}`;
|
|
261
|
+
}
|
|
262
|
+
return `${baseUrl}/${encodeURIComponent(window.location.href)}`;
|
|
263
|
+
};
|
|
264
|
+
var createDappBrowserSolanaConnector = (config2) => {
|
|
265
|
+
const walletConfig2 = WALLETS.find((w) => w.id === config2.walletId);
|
|
266
|
+
const isInWallet = () => isInWalletBrowser(config2.injectedKey);
|
|
267
|
+
return {
|
|
268
|
+
...walletConfig2,
|
|
269
|
+
type: "solana",
|
|
270
|
+
wallet: {
|
|
271
|
+
_provider: null,
|
|
272
|
+
connect: async () => {
|
|
273
|
+
if (isInWallet() && window.solana) {
|
|
274
|
+
return connectSolanaInjected();
|
|
275
|
+
}
|
|
276
|
+
window.location.href = buildBrowseUrl(config2.browseUrl, config2.stripProtocol);
|
|
277
|
+
return pendingResult();
|
|
278
|
+
},
|
|
279
|
+
disconnect: async () => {
|
|
280
|
+
if (window.solana?.disconnect) {
|
|
281
|
+
await window.solana.disconnect();
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
signMessage: async (message) => {
|
|
285
|
+
if (isInWallet() && window.solana) {
|
|
286
|
+
return signSolanaInjected(message);
|
|
287
|
+
}
|
|
288
|
+
throw new Error("signMessage requires dApp browser");
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
// src/lib/connectors/shared/deeplink.ts
|
|
295
|
+
import bs582 from "bs58";
|
|
205
296
|
import nacl from "tweetnacl";
|
|
206
297
|
var getDappKeyPair = (storageKey) => {
|
|
207
298
|
const stored = storage.get(storageKey);
|
|
@@ -222,7 +313,7 @@ var buildConnectUrl = (config2, params) => {
|
|
|
222
313
|
const keyPair = getDappKeyPair(`${config2.storageKeyPrefix}_keypair`);
|
|
223
314
|
const url = new URL(config2.connectUrl);
|
|
224
315
|
url.searchParams.set("app_url", params.appUrl);
|
|
225
|
-
url.searchParams.set("dapp_encryption_public_key",
|
|
316
|
+
url.searchParams.set("dapp_encryption_public_key", bs582.encode(keyPair.publicKey));
|
|
226
317
|
url.searchParams.set("redirect_link", params.redirectUrl);
|
|
227
318
|
if (params.cluster) {
|
|
228
319
|
url.searchParams.set("cluster", params.cluster);
|
|
@@ -241,8 +332,8 @@ var parseConnectResponse = (urlParams, config2) => {
|
|
|
241
332
|
}
|
|
242
333
|
try {
|
|
243
334
|
const keyPair = getDappKeyPair(`${config2.storageKeyPrefix}_keypair`);
|
|
244
|
-
const sharedSecret = nacl.box.before(
|
|
245
|
-
const decrypted = nacl.box.open.after(
|
|
335
|
+
const sharedSecret = nacl.box.before(bs582.decode(walletPublicKey), keyPair.secretKey);
|
|
336
|
+
const decrypted = nacl.box.open.after(bs582.decode(data), bs582.decode(nonce), sharedSecret);
|
|
246
337
|
if (!decrypted) {
|
|
247
338
|
return null;
|
|
248
339
|
}
|
|
@@ -292,7 +383,7 @@ var buildSignMessageUrl = (signUrl, config2, sessionKey, message, redirectUrl) =
|
|
|
292
383
|
const keyPair = getDappKeyPair(`${config2.storageKeyPrefix}_keypair`);
|
|
293
384
|
const sharedSecret = new Uint8Array(session.sharedSecret);
|
|
294
385
|
const payload = {
|
|
295
|
-
message:
|
|
386
|
+
message: bs582.encode(new TextEncoder().encode(message)),
|
|
296
387
|
session: session.session,
|
|
297
388
|
display: "utf8"
|
|
298
389
|
};
|
|
@@ -303,10 +394,10 @@ var buildSignMessageUrl = (signUrl, config2, sessionKey, message, redirectUrl) =
|
|
|
303
394
|
sharedSecret
|
|
304
395
|
);
|
|
305
396
|
const url = new URL(signUrl);
|
|
306
|
-
url.searchParams.set("dapp_encryption_public_key",
|
|
307
|
-
url.searchParams.set("nonce",
|
|
397
|
+
url.searchParams.set("dapp_encryption_public_key", bs582.encode(keyPair.publicKey));
|
|
398
|
+
url.searchParams.set("nonce", bs582.encode(nonce));
|
|
308
399
|
url.searchParams.set("redirect_link", redirectUrl);
|
|
309
|
-
url.searchParams.set("payload",
|
|
400
|
+
url.searchParams.set("payload", bs582.encode(encrypted));
|
|
310
401
|
return url.toString();
|
|
311
402
|
};
|
|
312
403
|
var parseSignMessageResponse = (config2, sessionKey) => {
|
|
@@ -318,7 +409,7 @@ var parseSignMessageResponse = (config2, sessionKey) => {
|
|
|
318
409
|
if (!session) return null;
|
|
319
410
|
try {
|
|
320
411
|
const sharedSecret = new Uint8Array(session.sharedSecret);
|
|
321
|
-
const decrypted = nacl.box.open.after(
|
|
412
|
+
const decrypted = nacl.box.open.after(bs582.decode(data), bs582.decode(nonce), sharedSecret);
|
|
322
413
|
if (!decrypted) return null;
|
|
323
414
|
const response = JSON.parse(new TextDecoder().decode(decrypted));
|
|
324
415
|
return response.signature;
|
|
@@ -327,32 +418,6 @@ var parseSignMessageResponse = (config2, sessionKey) => {
|
|
|
327
418
|
}
|
|
328
419
|
};
|
|
329
420
|
|
|
330
|
-
// src/lib/connectors/shared/injected.ts
|
|
331
|
-
import bs582 from "bs58";
|
|
332
|
-
var connectEvmInjected = async () => {
|
|
333
|
-
if (!window.ethereum) throw new Error("No injected EVM provider");
|
|
334
|
-
const accounts = await window.ethereum.request({
|
|
335
|
-
method: "eth_requestAccounts"
|
|
336
|
-
});
|
|
337
|
-
if (!accounts[0]) throw new Error("No accounts returned");
|
|
338
|
-
const chainId = await window.ethereum.request({ method: "eth_chainId" });
|
|
339
|
-
return connectedResult(accounts[0], { chainId: parseInt(chainId, 16) });
|
|
340
|
-
};
|
|
341
|
-
var connectSolanaInjected = async () => {
|
|
342
|
-
if (!window.solana) throw new Error("No injected Solana provider");
|
|
343
|
-
const response = await window.solana.connect();
|
|
344
|
-
const publicKey = response.publicKey;
|
|
345
|
-
return connectedResult(publicKey.toBase58(), { publicKey: publicKey.toBytes() });
|
|
346
|
-
};
|
|
347
|
-
var signSolanaInjected = async (message) => {
|
|
348
|
-
if (!window.solana?.signMessage) {
|
|
349
|
-
throw new Error("No injected Solana provider or signMessage not supported");
|
|
350
|
-
}
|
|
351
|
-
const encodedMessage = new TextEncoder().encode(message);
|
|
352
|
-
const result = await window.solana.signMessage(encodedMessage, "utf8");
|
|
353
|
-
return bs582.encode(new Uint8Array(result.signature));
|
|
354
|
-
};
|
|
355
|
-
|
|
356
421
|
// src/lib/connectors/shared/parsers.ts
|
|
357
422
|
var parseEvmAccount = (account) => {
|
|
358
423
|
const [, chainIdStr, address] = account.split(":");
|
|
@@ -362,8 +427,8 @@ var parseEvmAccount = (account) => {
|
|
|
362
427
|
var parseSolanaAccount = async (account) => {
|
|
363
428
|
const address = account.split(":")[2];
|
|
364
429
|
if (!address) throw new Error("Invalid Solana account format");
|
|
365
|
-
const { default:
|
|
366
|
-
return connectedResult(address, { publicKey:
|
|
430
|
+
const { default: bs587 } = await import("bs58");
|
|
431
|
+
return connectedResult(address, { publicKey: bs587.decode(address) });
|
|
367
432
|
};
|
|
368
433
|
var getEvmAccountFromSession = (namespaces) => {
|
|
369
434
|
const account = namespaces.eip155?.accounts?.[0];
|
|
@@ -376,29 +441,6 @@ var getSolanaAccountFromSession = async (namespaces) => {
|
|
|
376
441
|
return parseSolanaAccount(account);
|
|
377
442
|
};
|
|
378
443
|
|
|
379
|
-
// src/lib/connectors/shared/utils.ts
|
|
380
|
-
var isMobile = () => {
|
|
381
|
-
return typeof window !== "undefined" && /iPhone|iPad|iPod|Android/i.test(window.navigator.userAgent);
|
|
382
|
-
};
|
|
383
|
-
var isInWalletBrowser = (key) => {
|
|
384
|
-
return typeof window !== "undefined" && !!window.ethereum?.[key];
|
|
385
|
-
};
|
|
386
|
-
var openDeeplink = (url) => {
|
|
387
|
-
const link = document.createElement("a");
|
|
388
|
-
link.href = url;
|
|
389
|
-
link.click();
|
|
390
|
-
};
|
|
391
|
-
var waitForValue = (getValue) => {
|
|
392
|
-
return new Promise((resolve) => {
|
|
393
|
-
const check = () => {
|
|
394
|
-
const value = getValue();
|
|
395
|
-
if (value != null) resolve(value);
|
|
396
|
-
else window.setTimeout(check, 50);
|
|
397
|
-
};
|
|
398
|
-
check();
|
|
399
|
-
});
|
|
400
|
-
};
|
|
401
|
-
|
|
402
444
|
// src/lib/walletconnect/client.ts
|
|
403
445
|
import { SignClient } from "@walletconnect/sign-client";
|
|
404
446
|
var signClient = null;
|
|
@@ -568,11 +610,11 @@ var disconnectWcOrSolana = async () => {
|
|
|
568
610
|
}
|
|
569
611
|
};
|
|
570
612
|
var createWcEvmConnector = (config2) => {
|
|
571
|
-
const
|
|
613
|
+
const walletConfig2 = WALLETS.find((w) => w.id === config2.walletId);
|
|
572
614
|
const getDeeplink = createDeeplink(config2.wcDeeplink);
|
|
573
615
|
const isInWallet = () => isInWalletBrowser(config2.injectedKey);
|
|
574
616
|
return {
|
|
575
|
-
...
|
|
617
|
+
...walletConfig2,
|
|
576
618
|
type: "evm",
|
|
577
619
|
wallet: {
|
|
578
620
|
_connector: null,
|
|
@@ -613,11 +655,11 @@ var createWcEvmConnector = (config2) => {
|
|
|
613
655
|
};
|
|
614
656
|
};
|
|
615
657
|
var createWcSolanaConnector = (config2) => {
|
|
616
|
-
const
|
|
658
|
+
const walletConfig2 = WALLETS.find((w) => w.id === config2.walletId);
|
|
617
659
|
const getDeeplink = createDeeplink(config2.wcDeeplink);
|
|
618
660
|
const isInWallet = () => isInWalletBrowser(config2.injectedKey);
|
|
619
661
|
return {
|
|
620
|
-
...
|
|
662
|
+
...walletConfig2,
|
|
621
663
|
type: "solana",
|
|
622
664
|
wallet: {
|
|
623
665
|
_provider: null,
|
|
@@ -657,6 +699,11 @@ var createWcSolanaConnector = (config2) => {
|
|
|
657
699
|
var PHANTOM_CONNECT_URL = "https://phantom.app/ul/v1/connect";
|
|
658
700
|
var PHANTOM_SIGN_MESSAGE_URL = "https://phantom.app/ul/v1/signMessage";
|
|
659
701
|
var PHANTOM_BROWSE_URL = "https://phantom.app/ul/browse";
|
|
702
|
+
var createPhantomSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector({
|
|
703
|
+
walletId: "phantom",
|
|
704
|
+
browseUrl: PHANTOM_BROWSE_URL,
|
|
705
|
+
injectedKey: "isPhantom"
|
|
706
|
+
});
|
|
660
707
|
var PHANTOM_CONFIG = {
|
|
661
708
|
connectUrl: PHANTOM_CONNECT_URL,
|
|
662
709
|
storageKeyPrefix: "phantom_mobile",
|
|
@@ -753,11 +800,24 @@ var METAMASK_CONFIG = {
|
|
|
753
800
|
wcDeeplink: "https://metamask.app.link/wc",
|
|
754
801
|
injectedKey: "isMetaMask"
|
|
755
802
|
};
|
|
803
|
+
var METAMASK_BROWSE_URL = "https://metamask.app.link/dapp";
|
|
756
804
|
var createMetaMaskEvmConnector = () => createWcEvmConnector(METAMASK_CONFIG);
|
|
805
|
+
var createMetaMaskSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector({
|
|
806
|
+
walletId: "metamask",
|
|
807
|
+
browseUrl: METAMASK_BROWSE_URL,
|
|
808
|
+
injectedKey: "isMetaMask",
|
|
809
|
+
stripProtocol: true
|
|
810
|
+
});
|
|
757
811
|
|
|
758
812
|
// src/lib/connectors/solflare.ts
|
|
759
813
|
var SOLFLARE_CONNECT_URL = "https://solflare.com/ul/v1/connect";
|
|
760
814
|
var SOLFLARE_SIGN_MESSAGE_URL = "https://solflare.com/ul/v1/signMessage";
|
|
815
|
+
var SOLFLARE_BROWSE_URL = "https://solflare.com/ul/v1/browse";
|
|
816
|
+
var createSolflareSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector({
|
|
817
|
+
walletId: "solflare",
|
|
818
|
+
browseUrl: SOLFLARE_BROWSE_URL,
|
|
819
|
+
injectedKey: "isSolflare"
|
|
820
|
+
});
|
|
761
821
|
var SOLFLARE_CONFIG = {
|
|
762
822
|
connectUrl: SOLFLARE_CONNECT_URL,
|
|
763
823
|
storageKeyPrefix: "solflare_mobile",
|
|
@@ -827,8 +887,14 @@ var TRUST_CONFIG = {
|
|
|
827
887
|
wcDeeplink: "https://link.trustwallet.com/wc",
|
|
828
888
|
injectedKey: "isTrust"
|
|
829
889
|
};
|
|
890
|
+
var TRUST_BROWSE_URL = "https://link.trustwallet.com/open_url";
|
|
830
891
|
var createTrustEvmMobileConnector = () => createWcEvmConnector(TRUST_CONFIG);
|
|
831
892
|
var createTrustSolanaMobileConnector = () => createWcSolanaConnector(TRUST_CONFIG);
|
|
893
|
+
var createTrustSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector({
|
|
894
|
+
walletId: "trust",
|
|
895
|
+
browseUrl: TRUST_BROWSE_URL,
|
|
896
|
+
injectedKey: "isTrust"
|
|
897
|
+
});
|
|
832
898
|
|
|
833
899
|
// src/lib/connectors/rainbow.ts
|
|
834
900
|
var RAINBOW_CONFIG = {
|
|
@@ -844,8 +910,14 @@ var EXODUS_CONFIG = {
|
|
|
844
910
|
wcDeeplink: "https://exodus.com/wc",
|
|
845
911
|
injectedKey: "isExodus"
|
|
846
912
|
};
|
|
913
|
+
var EXODUS_BROWSE_URL = "https://exodus.com/m/browser";
|
|
847
914
|
var createExodusEvmMobileConnector = () => createWcEvmConnector(EXODUS_CONFIG);
|
|
848
915
|
var createExodusSolanaMobileConnector = () => createWcSolanaConnector(EXODUS_CONFIG);
|
|
916
|
+
var createExodusSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector({
|
|
917
|
+
walletId: "exodus",
|
|
918
|
+
browseUrl: EXODUS_BROWSE_URL,
|
|
919
|
+
injectedKey: "isExodus"
|
|
920
|
+
});
|
|
849
921
|
|
|
850
922
|
// src/lib/connectors/binance.ts
|
|
851
923
|
var BINANCE_CONFIG = {
|
|
@@ -853,8 +925,118 @@ var BINANCE_CONFIG = {
|
|
|
853
925
|
wcDeeplink: "bnc://app.binance.com/cedefi/wc",
|
|
854
926
|
injectedKey: "isBinance"
|
|
855
927
|
};
|
|
928
|
+
var BINANCE_BROWSE_URL = "bnc://app.binance.com/cedefi/dapp/browser";
|
|
856
929
|
var createBinanceEvmConnector = () => createWcEvmConnector(BINANCE_CONFIG);
|
|
857
930
|
var createBinanceSolanaConnector = () => createWcSolanaConnector(BINANCE_CONFIG);
|
|
931
|
+
var createBinanceSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector({
|
|
932
|
+
walletId: "binance",
|
|
933
|
+
browseUrl: BINANCE_BROWSE_URL,
|
|
934
|
+
injectedKey: "isBinance"
|
|
935
|
+
});
|
|
936
|
+
|
|
937
|
+
// src/lib/connectors/okx.ts
|
|
938
|
+
var OKX_BROWSE_URL = "https://www.okx.com/download?deeplink=";
|
|
939
|
+
var createOkxSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector({
|
|
940
|
+
walletId: "okx",
|
|
941
|
+
browseUrl: OKX_BROWSE_URL,
|
|
942
|
+
injectedKey: "isOkxWallet"
|
|
943
|
+
});
|
|
944
|
+
|
|
945
|
+
// src/lib/connectors/coinbase.ts
|
|
946
|
+
var COINBASE_BROWSE_URL = "https://go.cb-w.com/dapp";
|
|
947
|
+
var createCoinbaseSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector({
|
|
948
|
+
walletId: "coinbase",
|
|
949
|
+
browseUrl: COINBASE_BROWSE_URL,
|
|
950
|
+
injectedKey: "isCoinbaseWallet",
|
|
951
|
+
stripProtocol: true
|
|
952
|
+
});
|
|
953
|
+
|
|
954
|
+
// src/lib/connectors/bitget.ts
|
|
955
|
+
var BITGET_BROWSE_URL = "https://bkcode.vip/dapp";
|
|
956
|
+
var createBitgetSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector({
|
|
957
|
+
walletId: "bitget",
|
|
958
|
+
browseUrl: BITGET_BROWSE_URL,
|
|
959
|
+
injectedKey: "isBitKeep",
|
|
960
|
+
stripProtocol: true
|
|
961
|
+
});
|
|
962
|
+
|
|
963
|
+
// src/lib/connectors/walletconnect.ts
|
|
964
|
+
import bs584 from "bs58";
|
|
965
|
+
var walletConfig = WALLETS.find((w) => w.id === "walletconnect");
|
|
966
|
+
var disconnectWc2 = async () => {
|
|
967
|
+
if (getCurrentSession()) {
|
|
968
|
+
await disconnectWalletConnect();
|
|
969
|
+
}
|
|
970
|
+
};
|
|
971
|
+
var createWalletConnectEvmConnector = () => {
|
|
972
|
+
if (isMobile()) return null;
|
|
973
|
+
return {
|
|
974
|
+
id: walletConfig.id,
|
|
975
|
+
name: walletConfig.name,
|
|
976
|
+
icon: walletConfig.icon,
|
|
977
|
+
type: "evm",
|
|
978
|
+
installed: true,
|
|
979
|
+
wallet: {
|
|
980
|
+
_connector: null,
|
|
981
|
+
connect: async () => {
|
|
982
|
+
return connectViaWalletConnect(EVM_WC_CONFIG, getEvmAccountFromSession);
|
|
983
|
+
},
|
|
984
|
+
disconnect: disconnectWc2,
|
|
985
|
+
signMessage: async (message) => {
|
|
986
|
+
const session = getCurrentSession();
|
|
987
|
+
if (!session) {
|
|
988
|
+
throw new Error("No WalletConnect session");
|
|
989
|
+
}
|
|
990
|
+
const account = session.namespaces.eip155?.accounts?.[0];
|
|
991
|
+
if (!account) {
|
|
992
|
+
throw new Error("No EVM account in session");
|
|
993
|
+
}
|
|
994
|
+
const address = account.split(":")[2];
|
|
995
|
+
const result = await requestWalletConnect(
|
|
996
|
+
"personal_sign",
|
|
997
|
+
[message, address],
|
|
998
|
+
WC_CHAINS.EVM_MAINNET
|
|
999
|
+
);
|
|
1000
|
+
return result;
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
};
|
|
1004
|
+
};
|
|
1005
|
+
var createWalletConnectSolanaConnector = () => {
|
|
1006
|
+
if (isMobile()) return null;
|
|
1007
|
+
return {
|
|
1008
|
+
id: walletConfig.id,
|
|
1009
|
+
name: walletConfig.name,
|
|
1010
|
+
icon: walletConfig.icon,
|
|
1011
|
+
type: "solana",
|
|
1012
|
+
installed: true,
|
|
1013
|
+
wallet: {
|
|
1014
|
+
_provider: null,
|
|
1015
|
+
connect: async () => {
|
|
1016
|
+
return connectViaWalletConnect(SOLANA_WC_CONFIG, getSolanaAccountFromSession);
|
|
1017
|
+
},
|
|
1018
|
+
disconnect: disconnectWc2,
|
|
1019
|
+
signMessage: async (message) => {
|
|
1020
|
+
const session = getCurrentSession();
|
|
1021
|
+
if (!session) {
|
|
1022
|
+
throw new Error("No WalletConnect session");
|
|
1023
|
+
}
|
|
1024
|
+
const account = session.namespaces.solana?.accounts?.[0];
|
|
1025
|
+
if (!account) {
|
|
1026
|
+
throw new Error("No Solana account in session");
|
|
1027
|
+
}
|
|
1028
|
+
const pubkey = account.split(":")[2];
|
|
1029
|
+
const messageBytes = new TextEncoder().encode(message);
|
|
1030
|
+
const result = await requestWalletConnect(
|
|
1031
|
+
"solana_signMessage",
|
|
1032
|
+
{ message: bs584.encode(messageBytes), pubkey },
|
|
1033
|
+
WC_CHAINS.SOLANA_MAINNET
|
|
1034
|
+
);
|
|
1035
|
+
return result.signature;
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
};
|
|
1039
|
+
};
|
|
858
1040
|
|
|
859
1041
|
// src/lib/evm/connectors.ts
|
|
860
1042
|
var EVM_FALLBACK_CONNECTORS = [
|
|
@@ -924,7 +1106,7 @@ import {
|
|
|
924
1106
|
isWalletAdapterCompatibleStandardWallet
|
|
925
1107
|
} from "@solana/wallet-adapter-base";
|
|
926
1108
|
import { getWallets } from "@wallet-standard/app";
|
|
927
|
-
import
|
|
1109
|
+
import bs585 from "bs58";
|
|
928
1110
|
var createSolanaConnector = (provider) => {
|
|
929
1111
|
const id = normalizeSolanaWalletId(provider.name.toLowerCase().replace(/\s+/g, "-"));
|
|
930
1112
|
const connector = {
|
|
@@ -968,7 +1150,7 @@ var createSolanaConnector = (provider) => {
|
|
|
968
1150
|
const result = await signFeature.signMessage({ message: encodedMessage, account });
|
|
969
1151
|
const signature = result[0]?.signature;
|
|
970
1152
|
if (!signature) throw new Error("No signature returned");
|
|
971
|
-
return
|
|
1153
|
+
return bs585.encode(signature);
|
|
972
1154
|
}
|
|
973
1155
|
}
|
|
974
1156
|
};
|
|
@@ -985,16 +1167,59 @@ var createSolanaMobileConnector = (connector) => ({
|
|
|
985
1167
|
}
|
|
986
1168
|
}
|
|
987
1169
|
});
|
|
988
|
-
var SOLANA_FALLBACK_CONNECTORS = [
|
|
1170
|
+
var SOLANA_FALLBACK_CONNECTORS = isMobile() ? [
|
|
1171
|
+
{
|
|
1172
|
+
id: "phantom",
|
|
1173
|
+
create: () => createSolanaMobileConnector(createPhantomSolanaDappBrowserConnector())
|
|
1174
|
+
},
|
|
1175
|
+
{
|
|
1176
|
+
id: "solflare",
|
|
1177
|
+
create: () => createSolanaMobileConnector(createSolflareSolanaDappBrowserConnector())
|
|
1178
|
+
},
|
|
1179
|
+
{
|
|
1180
|
+
id: "metamask",
|
|
1181
|
+
create: () => createSolanaMobileConnector(createMetaMaskSolanaDappBrowserConnector())
|
|
1182
|
+
},
|
|
1183
|
+
{
|
|
1184
|
+
id: "okx",
|
|
1185
|
+
create: () => createSolanaMobileConnector(createOkxSolanaDappBrowserConnector())
|
|
1186
|
+
},
|
|
1187
|
+
{
|
|
1188
|
+
id: "coinbase",
|
|
1189
|
+
create: () => createSolanaMobileConnector(createCoinbaseSolanaDappBrowserConnector())
|
|
1190
|
+
},
|
|
1191
|
+
{
|
|
1192
|
+
id: "bitget",
|
|
1193
|
+
create: () => createSolanaMobileConnector(createBitgetSolanaDappBrowserConnector())
|
|
1194
|
+
},
|
|
1195
|
+
{
|
|
1196
|
+
id: "trust",
|
|
1197
|
+
create: () => createSolanaMobileConnector(createTrustSolanaDappBrowserConnector())
|
|
1198
|
+
},
|
|
1199
|
+
{
|
|
1200
|
+
id: "binance",
|
|
1201
|
+
create: () => createSolanaMobileConnector(createBinanceSolanaDappBrowserConnector())
|
|
1202
|
+
},
|
|
1203
|
+
{
|
|
1204
|
+
id: "exodus",
|
|
1205
|
+
create: () => createSolanaMobileConnector(createExodusSolanaDappBrowserConnector())
|
|
1206
|
+
}
|
|
1207
|
+
] : [
|
|
989
1208
|
{ id: "phantom", create: () => createSolanaMobileConnector(createPhantomSolanaConnector()) },
|
|
990
1209
|
// { id: 'metamask', create: () => createSolanaMobileConnector(createMetaMaskSolanaConnector()) },
|
|
991
1210
|
{
|
|
992
1211
|
id: "solflare",
|
|
993
1212
|
create: () => createSolanaMobileConnector(createSolflareSolanaMobileConnector())
|
|
994
1213
|
},
|
|
995
|
-
{
|
|
1214
|
+
{
|
|
1215
|
+
id: "trust",
|
|
1216
|
+
create: () => createSolanaMobileConnector(createTrustSolanaMobileConnector())
|
|
1217
|
+
},
|
|
996
1218
|
{ id: "binance", create: () => createSolanaMobileConnector(createBinanceSolanaConnector()) },
|
|
997
|
-
{
|
|
1219
|
+
{
|
|
1220
|
+
id: "exodus",
|
|
1221
|
+
create: () => createSolanaMobileConnector(createExodusSolanaMobileConnector())
|
|
1222
|
+
}
|
|
998
1223
|
];
|
|
999
1224
|
var getSolanaWallets = () => {
|
|
1000
1225
|
const { get } = getWallets();
|
|
@@ -1104,7 +1329,12 @@ var useEvmWallet = (options) => {
|
|
|
1104
1329
|
const [connectedConnector, setConnectedConnector] = createSignal(null);
|
|
1105
1330
|
onMount(() => {
|
|
1106
1331
|
createEvmConfig(options.chains);
|
|
1107
|
-
|
|
1332
|
+
const connectors = getEvmConnectors();
|
|
1333
|
+
const wcConnector = createWalletConnectEvmConnector();
|
|
1334
|
+
if (wcConnector) {
|
|
1335
|
+
connectors.unshift(wcConnector);
|
|
1336
|
+
}
|
|
1337
|
+
setEvmConnectors(connectors);
|
|
1108
1338
|
const unsubscribe = watchEvmConnections((connections) => {
|
|
1109
1339
|
const connection = connections[0];
|
|
1110
1340
|
if (connection && connection.accounts[0]) {
|
|
@@ -1153,7 +1383,12 @@ var useSolanaWallet = () => {
|
|
|
1153
1383
|
null
|
|
1154
1384
|
);
|
|
1155
1385
|
onMount2(() => {
|
|
1156
|
-
|
|
1386
|
+
const connectors = getSolanaWallets();
|
|
1387
|
+
const wcConnector = createWalletConnectSolanaConnector();
|
|
1388
|
+
if (wcConnector) {
|
|
1389
|
+
connectors.unshift(wcConnector);
|
|
1390
|
+
}
|
|
1391
|
+
setSolanaConnectors(connectors);
|
|
1157
1392
|
const unsubscribeWallets = onSolanaWalletsChange(setSolanaConnectors);
|
|
1158
1393
|
const unsubscribeConnection = watchSolanaConnection((state) => {
|
|
1159
1394
|
setSolanaConnection(state.connection);
|
|
@@ -1206,7 +1441,7 @@ var useSolanaWallet = () => {
|
|
|
1206
1441
|
};
|
|
1207
1442
|
|
|
1208
1443
|
// src/lib/context/hooks/useWalletConnect.ts
|
|
1209
|
-
import
|
|
1444
|
+
import bs586 from "bs58";
|
|
1210
1445
|
import { onCleanup as onCleanup3, onMount as onMount3 } from "solid-js";
|
|
1211
1446
|
var useWalletConnect = (options) => {
|
|
1212
1447
|
onMount3(async () => {
|
|
@@ -1261,7 +1496,7 @@ var useWalletConnect = (options) => {
|
|
|
1261
1496
|
const messageBytes = new TextEncoder().encode(message);
|
|
1262
1497
|
const result = await requestWalletConnect(
|
|
1263
1498
|
"solana_signMessage",
|
|
1264
|
-
{ message:
|
|
1499
|
+
{ message: bs586.encode(messageBytes), pubkey },
|
|
1265
1500
|
WC_CHAINS.SOLANA_MAINNET
|
|
1266
1501
|
);
|
|
1267
1502
|
return result.signature;
|
|
@@ -1368,11 +1603,13 @@ export {
|
|
|
1368
1603
|
checkPhantomSignCallback,
|
|
1369
1604
|
checkSolflareSignCallback,
|
|
1370
1605
|
createEvmConfig,
|
|
1606
|
+
getCurrentSession,
|
|
1371
1607
|
getEvmConfig,
|
|
1372
1608
|
getEvmConnectors,
|
|
1373
1609
|
getSolanaWallets,
|
|
1374
1610
|
initWalletConnect,
|
|
1375
1611
|
onSolanaWalletsChange,
|
|
1612
|
+
onWalletConnectSessionChange,
|
|
1376
1613
|
reconnectSolana,
|
|
1377
1614
|
useWallet,
|
|
1378
1615
|
watchEvmConnections,
|
|
@@ -2,3 +2,4 @@ import type { EvmWalletConnector } from '../evm';
|
|
|
2
2
|
import type { SolanaWalletConnector } from '../solana';
|
|
3
3
|
export declare const createBinanceEvmConnector: () => EvmWalletConnector;
|
|
4
4
|
export declare const createBinanceSolanaConnector: () => SolanaWalletConnector;
|
|
5
|
+
export declare const createBinanceSolanaDappBrowserConnector: () => SolanaWalletConnector;
|
|
@@ -2,3 +2,4 @@ import type { EvmWalletConnector } from '../evm';
|
|
|
2
2
|
import type { SolanaWalletConnector } from '../solana';
|
|
3
3
|
export declare const createExodusEvmMobileConnector: () => EvmWalletConnector;
|
|
4
4
|
export declare const createExodusSolanaMobileConnector: () => SolanaWalletConnector;
|
|
5
|
+
export declare const createExodusSolanaDappBrowserConnector: () => SolanaWalletConnector;
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
export { createPhantomEvmConnector, createPhantomSolanaConnector, isPhantomMobilePending, handlePhantomMobileCallback, restorePhantomMobileSession, isPhantomSignPending, handlePhantomSignCallback, } from './phantom';
|
|
2
|
-
export { createMetaMaskEvmConnector, createMetaMaskSolanaConnector } from './metamask';
|
|
3
|
-
export { createSolflareSolanaMobileConnector, isSolflareMobilePending, handleSolflareMobileCallback, restoreSolflareMobileSession, isSolflareSignPending, handleSolflareSignCallback, } from './solflare';
|
|
4
|
-
export { createTrustEvmMobileConnector, createTrustSolanaMobileConnector } from './trust';
|
|
1
|
+
export { createPhantomEvmConnector, createPhantomSolanaConnector, createPhantomSolanaDappBrowserConnector, isPhantomMobilePending, handlePhantomMobileCallback, restorePhantomMobileSession, isPhantomSignPending, handlePhantomSignCallback, } from './phantom';
|
|
2
|
+
export { createMetaMaskEvmConnector, createMetaMaskSolanaConnector, createMetaMaskSolanaDappBrowserConnector, } from './metamask';
|
|
3
|
+
export { createSolflareSolanaMobileConnector, createSolflareSolanaDappBrowserConnector, isSolflareMobilePending, handleSolflareMobileCallback, restoreSolflareMobileSession, isSolflareSignPending, handleSolflareSignCallback, } from './solflare';
|
|
4
|
+
export { createTrustEvmMobileConnector, createTrustSolanaMobileConnector, createTrustSolanaDappBrowserConnector, } from './trust';
|
|
5
5
|
export { createRainbowEvmMobileConnector } from './rainbow';
|
|
6
|
-
export { createExodusEvmMobileConnector, createExodusSolanaMobileConnector } from './exodus';
|
|
7
|
-
export { createBinanceEvmConnector, createBinanceSolanaConnector } from './binance';
|
|
6
|
+
export { createExodusEvmMobileConnector, createExodusSolanaMobileConnector, createExodusSolanaDappBrowserConnector, } from './exodus';
|
|
7
|
+
export { createBinanceEvmConnector, createBinanceSolanaConnector, createBinanceSolanaDappBrowserConnector, } from './binance';
|
|
8
|
+
export { createOkxSolanaDappBrowserConnector } from './okx';
|
|
9
|
+
export { createCoinbaseSolanaDappBrowserConnector } from './coinbase';
|
|
10
|
+
export { createBitgetSolanaDappBrowserConnector } from './bitget';
|
|
11
|
+
export { createWalletConnectEvmConnector, createWalletConnectSolanaConnector, } from './walletconnect';
|
|
@@ -2,3 +2,4 @@ import type { EvmWalletConnector } from '../evm';
|
|
|
2
2
|
import type { SolanaWalletConnector } from '../solana';
|
|
3
3
|
export declare const createMetaMaskEvmConnector: () => EvmWalletConnector;
|
|
4
4
|
export declare const createMetaMaskSolanaConnector: () => SolanaWalletConnector;
|
|
5
|
+
export declare const createMetaMaskSolanaDappBrowserConnector: () => SolanaWalletConnector;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type ConnectedResult } from '../core';
|
|
2
2
|
import type { EvmWalletConnector } from '../evm';
|
|
3
3
|
import type { SolanaWalletConnector } from '../solana';
|
|
4
|
+
export declare const createPhantomSolanaDappBrowserConnector: () => SolanaWalletConnector;
|
|
4
5
|
export declare const createPhantomEvmConnector: () => EvmWalletConnector;
|
|
5
6
|
export declare const createPhantomSolanaConnector: () => SolanaWalletConnector;
|
|
6
7
|
export declare const isPhantomMobilePending: () => boolean;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SolanaWalletConnector } from '../../solana';
|
|
2
|
+
import { type WalletId } from '../../wallets';
|
|
3
|
+
export interface DappBrowserConfig {
|
|
4
|
+
walletId: WalletId;
|
|
5
|
+
browseUrl: string;
|
|
6
|
+
injectedKey: string;
|
|
7
|
+
/** If true, URL is passed without protocol (e.g. MetaMask: host:port/path) */
|
|
8
|
+
stripProtocol?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Create a Solana connector that opens the site in wallet's dApp browser.
|
|
12
|
+
* Inside the dApp browser, uses injected window.solana for connect/sign.
|
|
13
|
+
*/
|
|
14
|
+
export declare const createDappBrowserSolanaConnector: (config: DappBrowserConfig) => SolanaWalletConnector;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type ConnectedResult } from '../core';
|
|
2
2
|
import type { SolanaWalletConnector } from '../solana';
|
|
3
3
|
import { type StoredSession } from './shared';
|
|
4
|
+
export declare const createSolflareSolanaDappBrowserConnector: () => SolanaWalletConnector;
|
|
4
5
|
export declare const createSolflareSolanaMobileConnector: () => SolanaWalletConnector;
|
|
5
6
|
export declare const isSolflareMobilePending: () => boolean;
|
|
6
7
|
export declare const handleSolflareMobileCallback: () => ConnectedResult | null;
|
|
@@ -2,3 +2,4 @@ import type { EvmWalletConnector } from '../evm';
|
|
|
2
2
|
import type { SolanaWalletConnector } from '../solana';
|
|
3
3
|
export declare const createTrustEvmMobileConnector: () => EvmWalletConnector;
|
|
4
4
|
export declare const createTrustSolanaMobileConnector: () => SolanaWalletConnector;
|
|
5
|
+
export declare const createTrustSolanaDappBrowserConnector: () => SolanaWalletConnector;
|