@bit-buccaneers/wallet-abstraction 0.0.9 → 0.0.11

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.jsx CHANGED
@@ -25,7 +25,12 @@ var getEvmConfig = () => {
25
25
  };
26
26
 
27
27
  // src/lib/evm/connectors.ts
28
- import { connect, disconnect, getConnectors, signMessage as wagmiSignMessage } from "@wagmi/core";
28
+ import {
29
+ connect,
30
+ disconnect,
31
+ getConnectors,
32
+ signMessage as wagmiSignMessage
33
+ } from "@wagmi/core";
29
34
 
30
35
  // src/lib/core/constants.ts
31
36
  var STORAGE_KEYS = {
@@ -160,7 +165,6 @@ var WALLETS = [
160
165
  // src/lib/wallets/mappers.ts
161
166
  var EVM_WALLET_ID_MAP = {
162
167
  "app.phantom": "phantom",
163
- "app.backpack": "backpack",
164
168
  "com.trustwallet.app": "trust",
165
169
  "com.binance.wallet": "binance",
166
170
  "com.bitget.web3": "bitget",
@@ -187,7 +191,7 @@ var WC_CHAINS = {
187
191
  SOLANA_MAINNET: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"
188
192
  };
189
193
  var WC_METHODS = {
190
- EVM: ["eth_sendTransaction", "personal_sign", "eth_signTypedData"],
194
+ EVM: ["eth_sendTransaction", "personal_sign", "eth_signTypedData", "wallet_switchEthereumChain"],
191
195
  SOLANA: ["solana_signTransaction", "solana_signMessage"]
192
196
  };
193
197
  var WC_EVENTS = {
@@ -582,6 +586,54 @@ var requestWalletConnect = async (method, params, chainId) => {
582
586
  }
583
587
  };
584
588
 
589
+ // src/lib/walletconnect/transactions.ts
590
+ var toHex = (value) => `0x${value.toString(16)}`;
591
+ var getWcChainId = (chainId) => `eip155:${chainId}`;
592
+ var wcSwitchChain = async (chainId) => {
593
+ const session = getCurrentSession();
594
+ if (!session) throw new Error("No WalletConnect session");
595
+ await requestWalletConnect(
596
+ "wallet_switchEthereumChain",
597
+ [{ chainId: toHex(chainId) }],
598
+ getWcChainId(chainId)
599
+ );
600
+ };
601
+ var wcSendTransaction = async (params) => {
602
+ const session = getCurrentSession();
603
+ if (!session) throw new Error("No WalletConnect session");
604
+ const txParams = {
605
+ from: params.from,
606
+ to: params.to
607
+ };
608
+ if (params.value) {
609
+ txParams.value = params.value;
610
+ }
611
+ if (params.data) {
612
+ txParams.data = params.data;
613
+ }
614
+ const hash = await requestWalletConnect(
615
+ "eth_sendTransaction",
616
+ [txParams],
617
+ getWcChainId(params.chainId)
618
+ );
619
+ return { hash };
620
+ };
621
+ var getWcEvmAddress = () => {
622
+ const session = getCurrentSession();
623
+ if (!session) return null;
624
+ const account = session.namespaces.eip155?.accounts?.[0];
625
+ if (!account) return null;
626
+ return account.split(":")[2];
627
+ };
628
+ var getWcEvmChainId = () => {
629
+ const session = getCurrentSession();
630
+ if (!session) return null;
631
+ const account = session.namespaces.eip155?.accounts?.[0];
632
+ if (!account) return null;
633
+ const chainId = account.split(":")[1];
634
+ return chainId ? parseInt(chainId, 10) : null;
635
+ };
636
+
585
637
  // src/lib/connectors/shared/walletconnect.ts
586
638
  var connectViaWalletConnect = async (wcConfig, parseSession, getDeeplink) => {
587
639
  let qrUri = null;
@@ -818,10 +870,12 @@ var createMetaMaskSolanaDappBrowserConnector = () => createDappBrowserSolanaConn
818
870
  // src/lib/connectors/solflare.ts
819
871
  var SOLFLARE_CONNECT_URL = "https://solflare.com/ul/v1/connect";
820
872
  var SOLFLARE_SIGN_MESSAGE_URL = "https://solflare.com/ul/v1/signMessage";
821
- var SOLFLARE_BROWSE_URL = "https://solflare.com/ul/v1/browse";
873
+ var buildSolflareBrowseUrl = () => `https://solflare.com/ul/v1/browse/${encodeURIComponent(
874
+ window.location.href
875
+ )}?ref=${encodeURIComponent(window.location.origin)}`;
822
876
  var createSolflareSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector({
823
877
  walletId: "solflare",
824
- browseUrl: SOLFLARE_BROWSE_URL,
878
+ buildUrl: buildSolflareBrowseUrl,
825
879
  injectedKey: "isSolflare"
826
880
  });
827
881
  var SOLFLARE_CONFIG = {
@@ -893,12 +947,12 @@ var TRUST_CONFIG = {
893
947
  wcDeeplink: "https://link.trustwallet.com/wc",
894
948
  injectedKey: "isTrust"
895
949
  };
896
- var TRUST_BROWSE_URL = "https://link.trustwallet.com/open_url";
950
+ var buildTrustBrowseUrl = () => `https://link.trustwallet.com/open_url?url=${encodeURIComponent(window.location.href)}`;
897
951
  var createTrustEvmMobileConnector = () => createWcEvmConnector(TRUST_CONFIG);
898
952
  var createTrustSolanaMobileConnector = () => createWcSolanaConnector(TRUST_CONFIG);
899
953
  var createTrustSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector({
900
954
  walletId: "trust",
901
- browseUrl: TRUST_BROWSE_URL,
955
+ buildUrl: buildTrustBrowseUrl,
902
956
  injectedKey: "isTrust"
903
957
  });
904
958
 
@@ -916,14 +970,8 @@ var EXODUS_CONFIG = {
916
970
  wcDeeplink: "https://exodus.com/wc",
917
971
  injectedKey: "isExodus"
918
972
  };
919
- var EXODUS_BROWSE_URL = "https://exodus.com/m/browser";
920
973
  var createExodusEvmMobileConnector = () => createWcEvmConnector(EXODUS_CONFIG);
921
974
  var createExodusSolanaMobileConnector = () => createWcSolanaConnector(EXODUS_CONFIG);
922
- var createExodusSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector({
923
- walletId: "exodus",
924
- browseUrl: EXODUS_BROWSE_URL,
925
- injectedKey: "isExodus"
926
- });
927
975
 
928
976
  // src/lib/connectors/binance.ts
929
977
  var BINANCE_CONFIG = {
@@ -941,11 +989,7 @@ var createBinanceSolanaDappBrowserConnector = () => createDappBrowserSolanaConne
941
989
  });
942
990
 
943
991
  // src/lib/connectors/okx.ts
944
- var buildOkxBrowseUrl = () => {
945
- const dappUrl = window.location.href;
946
- const deepLink = `okx://wallet/dapp/url?dappUrl=${encodeURIComponent(dappUrl)}`;
947
- return `https://web3.okx.com/download?deeplink=${encodeURIComponent(deepLink)}`;
948
- };
992
+ var buildOkxBrowseUrl = () => `okx://wallet/dapp/url?dappUrl=${encodeURIComponent(window.location.href)}`;
949
993
  var createOkxSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector({
950
994
  walletId: "okx",
951
995
  injectedKey: "isOkxWallet",
@@ -961,12 +1005,17 @@ var createCoinbaseSolanaDappBrowserConnector = () => createDappBrowserSolanaConn
961
1005
  });
962
1006
 
963
1007
  // src/lib/connectors/bitget.ts
964
- var BITGET_BROWSE_URL = "https://bkcode.vip/dapp";
1008
+ var BITGET_CONFIG = {
1009
+ walletId: "bitget",
1010
+ wcDeeplink: "bitkeep://bkconnect",
1011
+ injectedKey: "isBitKeep"
1012
+ };
1013
+ var buildBitgetBrowseUrl = () => `https://bkcode.vip?action=dapp&url=${encodeURIComponent(window.location.href)}`;
1014
+ var createBitgetSolanaConnector = () => createWcSolanaConnector(BITGET_CONFIG);
965
1015
  var createBitgetSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector({
966
1016
  walletId: "bitget",
967
- browseUrl: BITGET_BROWSE_URL,
968
1017
  injectedKey: "isBitKeep",
969
- stripProtocol: true
1018
+ buildUrl: buildBitgetBrowseUrl
970
1019
  });
971
1020
 
972
1021
  // src/lib/connectors/walletconnect.ts
@@ -1056,6 +1105,7 @@ var EVM_FALLBACK_CONNECTORS = [
1056
1105
  { id: "rainbow", create: createRainbowEvmMobileConnector },
1057
1106
  { id: "exodus", create: createExodusEvmMobileConnector }
1058
1107
  ];
1108
+ var sleep = (ms) => new Promise((r) => window.setTimeout(r, ms));
1059
1109
  var cleanupWalletLocalStorage = () => {
1060
1110
  Object.keys(window.localStorage).filter((key) => key.startsWith("wagmi.")).forEach((key) => window.localStorage.removeItem(key));
1061
1111
  };
@@ -1070,9 +1120,21 @@ var getEvmConnectors = () => {
1070
1120
  wallet: {
1071
1121
  _connector: c,
1072
1122
  connect: async () => {
1073
- const result = await connect(getEvmConfig(), { connector: c });
1074
- if (!result.accounts[0]) throw new Error("No accounts returned");
1075
- return connectedResult(result.accounts[0], { chainId: result.chainId });
1123
+ try {
1124
+ const result = await connect(getEvmConfig(), { connector: c });
1125
+ if (!result.accounts[0]) throw new Error("No accounts returned");
1126
+ return connectedResult(result.accounts[0], { chainId: result.chainId });
1127
+ } catch (err) {
1128
+ if (err instanceof Error && err.name === "ConnectorAlreadyConnectedError") {
1129
+ cleanupWalletLocalStorage();
1130
+ await disconnect(getEvmConfig(), { connector: c });
1131
+ await sleep(100);
1132
+ const result = await connect(getEvmConfig(), { connector: c });
1133
+ if (!result.accounts[0]) throw new Error("No accounts returned");
1134
+ return connectedResult(result.accounts[0], { chainId: result.chainId });
1135
+ }
1136
+ throw err;
1137
+ }
1076
1138
  },
1077
1139
  disconnect: async () => {
1078
1140
  cleanupWalletLocalStorage();
@@ -1093,6 +1155,71 @@ var watchEvmConnections = (onChange) => {
1093
1155
  return watchConnections(getEvmConfig(), { onChange });
1094
1156
  };
1095
1157
 
1158
+ // src/lib/evm/transactions.ts
1159
+ import {
1160
+ sendTransaction as wagmiSendTransaction,
1161
+ switchChain as wagmiSwitchChain,
1162
+ waitForTransactionReceipt as wagmiWaitForReceipt
1163
+ } from "@wagmi/core";
1164
+ var switchChain = async (chainId) => {
1165
+ await wagmiSwitchChain(getEvmConfig(), { chainId });
1166
+ };
1167
+ var sendTransaction = async (params) => {
1168
+ const hash = await wagmiSendTransaction(getEvmConfig(), {
1169
+ to: params.to,
1170
+ value: params.value,
1171
+ data: params.data
1172
+ });
1173
+ return { hash };
1174
+ };
1175
+ var waitForTransactionReceipt = async (hash) => {
1176
+ const receipt = await wagmiWaitForReceipt(getEvmConfig(), { hash });
1177
+ return {
1178
+ hash: receipt.transactionHash,
1179
+ status: receipt.status,
1180
+ blockNumber: receipt.blockNumber
1181
+ };
1182
+ };
1183
+
1184
+ // src/lib/evm/erc20.ts
1185
+ import { readContract, writeContract } from "@wagmi/core";
1186
+ import { erc20Abi } from "viem";
1187
+ var getAllowance = async (params) => {
1188
+ return readContract(getEvmConfig(), {
1189
+ abi: erc20Abi,
1190
+ address: params.tokenAddress,
1191
+ functionName: "allowance",
1192
+ args: [params.owner, params.spender]
1193
+ });
1194
+ };
1195
+ var approve = async (params) => {
1196
+ const hash = await writeContract(getEvmConfig(), {
1197
+ address: params.tokenAddress,
1198
+ abi: erc20Abi,
1199
+ functionName: "approve",
1200
+ args: [params.spender, params.amount]
1201
+ });
1202
+ return waitForTransactionReceipt(hash);
1203
+ };
1204
+ var ensureAllowance = async (params) => {
1205
+ const currentAllowance = await getAllowance({
1206
+ tokenAddress: params.tokenAddress,
1207
+ owner: params.owner,
1208
+ spender: params.spender
1209
+ });
1210
+ if (currentAllowance >= params.amount) {
1211
+ return null;
1212
+ }
1213
+ if (currentAllowance > 0n) {
1214
+ await approve({
1215
+ tokenAddress: params.tokenAddress,
1216
+ spender: params.spender,
1217
+ amount: 0n
1218
+ });
1219
+ }
1220
+ return approve(params);
1221
+ };
1222
+
1096
1223
  // src/lib/solana/connection.ts
1097
1224
  var currentConnection = {
1098
1225
  connection: null,
@@ -1215,11 +1342,10 @@ var SOLANA_FALLBACK_CONNECTORS = isMobile() ? [
1215
1342
  },
1216
1343
  {
1217
1344
  id: "exodus",
1218
- create: () => createSolanaMobileConnector(createExodusSolanaDappBrowserConnector())
1345
+ create: () => createSolanaMobileConnector(createExodusSolanaMobileConnector())
1219
1346
  }
1220
1347
  ] : [
1221
1348
  { id: "phantom", create: () => createSolanaMobileConnector(createPhantomSolanaConnector()) },
1222
- // { id: 'metamask', create: () => createSolanaMobileConnector(createMetaMaskSolanaConnector()) },
1223
1349
  {
1224
1350
  id: "solflare",
1225
1351
  create: () => createSolanaMobileConnector(createSolflareSolanaMobileConnector())
@@ -1229,6 +1355,7 @@ var SOLANA_FALLBACK_CONNECTORS = isMobile() ? [
1229
1355
  create: () => createSolanaMobileConnector(createTrustSolanaMobileConnector())
1230
1356
  },
1231
1357
  { id: "binance", create: () => createSolanaMobileConnector(createBinanceSolanaConnector()) },
1358
+ { id: "bitget", create: createBitgetSolanaConnector },
1232
1359
  {
1233
1360
  id: "exodus",
1234
1361
  create: () => createSolanaMobileConnector(createExodusSolanaMobileConnector())
@@ -1240,6 +1367,8 @@ var getSolanaWallets = () => {
1240
1367
  const connectors = wallets.filter(isWalletAdapterCompatibleStandardWallet).filter((w) => {
1241
1368
  return w.constructor.name !== "SolflareMetaMaskWallet";
1242
1369
  }).map(createSolanaConnector);
1370
+ console.log({ wallets });
1371
+ console.log({ connectors });
1243
1372
  addFallbackConnectors(connectors, SOLANA_FALLBACK_CONNECTORS);
1244
1373
  return connectors;
1245
1374
  };
@@ -1389,6 +1518,60 @@ var useEvmWallet = (options) => {
1389
1518
  };
1390
1519
  };
1391
1520
 
1521
+ // src/lib/context/hooks/useEvmTransactions.ts
1522
+ var useEvmTransactions = (hasWcSession) => {
1523
+ const isWc = () => hasWcSession() && getCurrentSession();
1524
+ const switchChain2 = async (chainId) => {
1525
+ if (isWc()) {
1526
+ await wcSwitchChain(chainId);
1527
+ } else {
1528
+ await switchChain(chainId);
1529
+ }
1530
+ };
1531
+ const sendTransaction2 = async (params) => {
1532
+ if (isWc()) {
1533
+ const address = getWcEvmAddress();
1534
+ if (!address) throw new Error("No WalletConnect EVM address");
1535
+ const chainId = getWcEvmChainId();
1536
+ if (!chainId) throw new Error("No WalletConnect chain ID");
1537
+ const result = await wcSendTransaction({
1538
+ from: address,
1539
+ to: params.to,
1540
+ value: params.value !== void 0 ? `0x${params.value.toString(16)}` : void 0,
1541
+ data: params.data,
1542
+ chainId
1543
+ });
1544
+ return { hash: result.hash };
1545
+ }
1546
+ return sendTransaction(params);
1547
+ };
1548
+ const sendAndWait = async (params) => {
1549
+ const { hash } = await sendTransaction2(params);
1550
+ return waitForTransactionReceipt(hash);
1551
+ };
1552
+ const approve2 = async (params) => {
1553
+ if (isWc()) {
1554
+ throw new Error("ERC20 approve via WalletConnect not yet supported");
1555
+ }
1556
+ return approve(params);
1557
+ };
1558
+ const ensureAllowance2 = async (params) => {
1559
+ if (isWc()) {
1560
+ throw new Error("ERC20 ensureAllowance via WalletConnect not yet supported");
1561
+ }
1562
+ return ensureAllowance(params);
1563
+ };
1564
+ return {
1565
+ switchChain: switchChain2,
1566
+ sendTransaction: sendTransaction2,
1567
+ sendAndWait,
1568
+ waitForReceipt: waitForTransactionReceipt,
1569
+ approve: approve2,
1570
+ ensureAllowance: ensureAllowance2,
1571
+ getAllowance
1572
+ };
1573
+ };
1574
+
1392
1575
  // src/lib/context/hooks/useSolanaWallet.ts
1393
1576
  import { createSignal as createSignal2, onCleanup as onCleanup2, onMount as onMount2 } from "solid-js";
1394
1577
  var useSolanaWallet = () => {
@@ -1398,13 +1581,16 @@ var useSolanaWallet = () => {
1398
1581
  null
1399
1582
  );
1400
1583
  onMount2(() => {
1401
- const connectors = getSolanaWallets();
1402
1584
  const wcConnector = createWalletConnectSolanaConnector();
1403
- if (wcConnector) {
1404
- connectors.unshift(wcConnector);
1405
- }
1406
- setSolanaConnectors(connectors);
1407
- const unsubscribeWallets = onSolanaWalletsChange(setSolanaConnectors);
1585
+ const getConnectorsWithWc = () => {
1586
+ const connectors = getSolanaWallets();
1587
+ if (wcConnector) connectors.unshift(wcConnector);
1588
+ return connectors;
1589
+ };
1590
+ setSolanaConnectors(getConnectorsWithWc());
1591
+ const unsubscribeWallets = onSolanaWalletsChange(() => {
1592
+ setSolanaConnectors(getConnectorsWithWc());
1593
+ });
1408
1594
  const unsubscribeConnection = watchSolanaConnection((state) => {
1409
1595
  setSolanaConnection(state.connection);
1410
1596
  if (state.connector) {
@@ -1536,6 +1722,7 @@ var WalletProvider = (props) => {
1536
1722
  onEvmConnection: evm.setEvmConnection,
1537
1723
  onSolanaConnection: solana.setSolanaConnection
1538
1724
  });
1725
+ const evmTx = useEvmTransactions(wc.hasWcEvmSession);
1539
1726
  const disconnectEvm = async () => {
1540
1727
  if (evm.connectedEvmConnector()) {
1541
1728
  await evm.disconnectEvm();
@@ -1601,7 +1788,8 @@ var WalletProvider = (props) => {
1601
1788
  disconnectEvm,
1602
1789
  connectSolana: solana.connectSolana,
1603
1790
  disconnectSolana,
1604
- signMessage
1791
+ signMessage,
1792
+ evmTx
1605
1793
  };
1606
1794
  return <WalletContext.Provider value={value}>{props.children}</WalletContext.Provider>;
1607
1795
  };