@bit-buccaneers/wallet-abstraction 0.0.16 → 0.0.18

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 CHANGED
@@ -5,6 +5,7 @@ import { mainnet } from 'viem/chains';
5
5
  import bs582 from 'bs58';
6
6
  import nacl from 'tweetnacl';
7
7
  import { SignClient } from '@walletconnect/sign-client';
8
+ import { CoinbaseWalletAdapter } from '@solana/wallet-adapter-coinbase';
8
9
  import { isWalletAdapterCompatibleStandardWallet } from '@solana/wallet-adapter-base';
9
10
  import { getWallets } from '@wallet-standard/app';
10
11
  import { createComponent } from 'solid-js/web';
@@ -381,8 +382,8 @@ var parseEvmAccount = (account) => {
381
382
  var parseSolanaAccount = async (account) => {
382
383
  const address = account.split(":")[2];
383
384
  if (!address) throw new Error("Invalid Solana account format");
384
- const { default: bs587 } = await import('bs58');
385
- return connectedResult(address, { publicKey: bs587.decode(address) });
385
+ const { default: bs588 } = await import('bs58');
386
+ return connectedResult(address, { publicKey: bs588.decode(address) });
386
387
  };
387
388
  var getEvmAccountFromSession = (namespaces) => {
388
389
  const account = namespaces.eip155?.accounts?.[0];
@@ -799,6 +800,7 @@ var METAMASK_CONFIG = {
799
800
  };
800
801
  var METAMASK_BROWSE_URL = "https://metamask.app.link/dapp";
801
802
  var createMetaMaskEvmConnector = () => createWcEvmConnector(METAMASK_CONFIG);
803
+ var createMetaMaskSolanaConnector = () => createDownloadOnlySolanaConnector({ walletId: "metamask" });
802
804
  var createMetaMaskSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector({
803
805
  walletId: "metamask",
804
806
  browseUrl: METAMASK_BROWSE_URL,
@@ -899,227 +901,6 @@ var createOkxSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector
899
901
  buildUrl: buildOkxBrowseUrl
900
902
  });
901
903
 
902
- // src/lib/connectors/coinbase.ts
903
- var buildCoinbaseBrowseUrl = () => `cbwallet://dapp?url=${encodeURIComponent(window.location.href)}`;
904
- var createCoinbaseSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector({
905
- walletId: "coinbase",
906
- injectedKey: "isCoinbaseWallet",
907
- buildUrl: buildCoinbaseBrowseUrl
908
- });
909
-
910
- // src/lib/connectors/bitget.ts
911
- var BITGET_CONFIG = {
912
- walletId: "bitget",
913
- wcDeeplink: "bitkeep://bkconnect",
914
- injectedKey: "isBitKeep"
915
- };
916
- var buildBitgetBrowseUrl = () => `https://bkcode.vip?action=dapp&url=${encodeURIComponent(window.location.href)}`;
917
- var createBitgetSolanaConnector = () => createWcSolanaConnector(BITGET_CONFIG);
918
- var createBitgetSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector({
919
- walletId: "bitget",
920
- injectedKey: "isBitKeep",
921
- buildUrl: buildBitgetBrowseUrl
922
- });
923
- var walletConfig = WALLETS.find((w) => w.id === "walletconnect");
924
- var disconnectWc2 = async () => {
925
- if (getCurrentSession()) {
926
- await disconnectWalletConnect();
927
- }
928
- };
929
- var createWalletConnectEvmConnector = () => {
930
- return {
931
- id: walletConfig.id,
932
- name: walletConfig.name,
933
- icon: walletConfig.icon,
934
- type: "evm",
935
- installed: false,
936
- wallet: {
937
- _connector: null,
938
- connect: async () => {
939
- return connectViaWalletConnect(EVM_WC_CONFIG, getEvmAccountFromSession);
940
- },
941
- disconnect: disconnectWc2,
942
- signMessage: async (message) => {
943
- const session = getCurrentSession();
944
- if (!session) {
945
- throw new Error("No WalletConnect session");
946
- }
947
- const account = session.namespaces.eip155?.accounts?.[0];
948
- if (!account) {
949
- throw new Error("No EVM account in session");
950
- }
951
- const address = account.split(":")[2];
952
- const result = await requestWalletConnect(
953
- "personal_sign",
954
- [message, address],
955
- WC_CHAINS.EVM_MAINNET
956
- );
957
- return result;
958
- }
959
- }
960
- };
961
- };
962
- var createWalletConnectSolanaConnector = () => {
963
- return {
964
- id: walletConfig.id,
965
- name: walletConfig.name,
966
- icon: walletConfig.icon,
967
- type: "solana",
968
- installed: false,
969
- wallet: {
970
- _provider: null,
971
- connect: async () => {
972
- return connectViaWalletConnect(SOLANA_WC_CONFIG, getSolanaAccountFromSession);
973
- },
974
- disconnect: disconnectWc2,
975
- signMessage: async (message) => {
976
- const session = getCurrentSession();
977
- if (!session) {
978
- throw new Error("No WalletConnect session");
979
- }
980
- const account = session.namespaces.solana?.accounts?.[0];
981
- if (!account) {
982
- throw new Error("No Solana account in session");
983
- }
984
- const pubkey = account.split(":")[2];
985
- const messageBytes = new TextEncoder().encode(message);
986
- const result = await requestWalletConnect(
987
- "solana_signMessage",
988
- { message: bs582.encode(messageBytes), pubkey },
989
- WC_CHAINS.SOLANA_MAINNET
990
- );
991
- return result.signature;
992
- }
993
- }
994
- };
995
- };
996
-
997
- // src/lib/evm/connectors.ts
998
- var EVM_FALLBACK_CONNECTORS = [
999
- {
1000
- id: "phantom",
1001
- create: isMobile() ? createPhantomEvmConnectorDeeplink : createPhantomEvmConnector
1002
- },
1003
- ...isMobile() ? [] : [{ id: "metamask", create: createMetaMaskEvmConnector }],
1004
- { id: "trust", create: createTrustEvmMobileConnector },
1005
- { id: "binance", create: createBinanceEvmConnector },
1006
- { id: "okx", create: createOkxEvmConnector },
1007
- { id: "rainbow", create: createRainbowEvmMobileConnector },
1008
- ...isMobile() ? [] : [{ id: "rabby", create: createRabbyEvmConnector }]
1009
- ];
1010
- var sleep = (ms) => new Promise((r) => window.setTimeout(r, ms));
1011
- var checkEvmWalletInstalled = (connectorId) => {
1012
- if (typeof window === "undefined" || !window.ethereum) return false;
1013
- const providers = window.ethereum.providers ?? [window.ethereum];
1014
- switch (connectorId) {
1015
- case "metaMaskSDK":
1016
- return providers.some((p) => p.isMetaMask && !p.isBraveWallet);
1017
- case "coinbaseWalletSDK":
1018
- return providers.some((p) => p.isCoinbaseWallet);
1019
- default:
1020
- return true;
1021
- }
1022
- };
1023
- var cleanupWalletLocalStorage = () => {
1024
- Object.keys(window.localStorage).filter((key) => key.startsWith("wagmi.")).forEach((key) => window.localStorage.removeItem(key));
1025
- };
1026
- var getEvmConnectors = () => {
1027
- const wagmiConnectors = getConnectors(getEvmConfig());
1028
- const connectors = wagmiConnectors.map((c) => ({
1029
- id: normalizeEvmWalletId(c.id),
1030
- name: c.name,
1031
- icon: c.icon,
1032
- type: "evm",
1033
- installed: checkEvmWalletInstalled(c.id),
1034
- wallet: {
1035
- _connector: c,
1036
- connect: async () => {
1037
- try {
1038
- const result = await connect(getEvmConfig(), { connector: c });
1039
- if (!result.accounts[0]) throw new Error("No accounts returned");
1040
- return connectedResult(result.accounts[0], { chainId: result.chainId });
1041
- } catch (err) {
1042
- if (err instanceof Error && err.name === "ConnectorAlreadyConnectedError") {
1043
- cleanupWalletLocalStorage();
1044
- await disconnect(getEvmConfig(), { connector: c });
1045
- await sleep(100);
1046
- const result = await connect(getEvmConfig(), { connector: c });
1047
- if (!result.accounts[0]) throw new Error("No accounts returned");
1048
- return connectedResult(result.accounts[0], { chainId: result.chainId });
1049
- }
1050
- throw err;
1051
- }
1052
- },
1053
- disconnect: async () => {
1054
- cleanupWalletLocalStorage();
1055
- await disconnect(getEvmConfig());
1056
- },
1057
- signMessage: async (message) => {
1058
- return signMessage(getEvmConfig(), { message });
1059
- }
1060
- }
1061
- }));
1062
- addFallbackConnectors(connectors, EVM_FALLBACK_CONNECTORS);
1063
- return connectors;
1064
- };
1065
- var watchEvmConnections = (onChange) => {
1066
- return watchConnections(getEvmConfig(), { onChange });
1067
- };
1068
- var switchChain = async (chainId) => {
1069
- await switchChain$1(getEvmConfig(), { chainId });
1070
- };
1071
- var sendTransaction = async (params) => {
1072
- const hash = await sendTransaction$1(getEvmConfig(), {
1073
- to: params.to,
1074
- value: params.value,
1075
- data: params.data
1076
- });
1077
- return { hash };
1078
- };
1079
- var waitForTransactionReceipt = async (hash) => {
1080
- const receipt = await waitForTransactionReceipt$1(getEvmConfig(), { hash });
1081
- return {
1082
- hash: receipt.transactionHash,
1083
- status: receipt.status,
1084
- blockNumber: receipt.blockNumber
1085
- };
1086
- };
1087
- var getAllowance = async (params) => {
1088
- return readContract(getEvmConfig(), {
1089
- abi: erc20Abi,
1090
- address: params.tokenAddress,
1091
- functionName: "allowance",
1092
- args: [params.owner, params.spender]
1093
- });
1094
- };
1095
- var approve = async (params) => {
1096
- const hash = await writeContract(getEvmConfig(), {
1097
- address: params.tokenAddress,
1098
- abi: erc20Abi,
1099
- functionName: "approve",
1100
- args: [params.spender, params.amount]
1101
- });
1102
- return waitForTransactionReceipt(hash);
1103
- };
1104
- var ensureAllowance = async (params) => {
1105
- const currentAllowance = await getAllowance({
1106
- tokenAddress: params.tokenAddress,
1107
- owner: params.owner,
1108
- spender: params.spender
1109
- });
1110
- if (currentAllowance >= params.amount) {
1111
- return null;
1112
- }
1113
- if (currentAllowance > 0n) {
1114
- await approve({
1115
- tokenAddress: params.tokenAddress,
1116
- spender: params.spender,
1117
- amount: 0n
1118
- });
1119
- }
1120
- return approve(params);
1121
- };
1122
-
1123
904
  // src/lib/solana/connection.ts
1124
905
  var currentConnection = {
1125
906
  connection: null,
@@ -1234,6 +1015,10 @@ var SOLANA_FALLBACK_CONNECTORS = isMobile() ? [
1234
1015
  create: () => createSolanaMobileConnector(createBinanceSolanaDappBrowserConnector())
1235
1016
  }
1236
1017
  ] : [
1018
+ {
1019
+ id: "metamask",
1020
+ create: () => createSolanaMobileConnector(createMetaMaskSolanaConnector())
1021
+ },
1237
1022
  { id: "phantom", create: () => createSolanaMobileConnector(createPhantomSolanaConnector()) },
1238
1023
  {
1239
1024
  id: "solflare",
@@ -1244,8 +1029,12 @@ var SOLANA_FALLBACK_CONNECTORS = isMobile() ? [
1244
1029
  create: () => createSolanaMobileConnector(createTrustSolanaMobileConnector())
1245
1030
  },
1246
1031
  { id: "binance", create: () => createSolanaMobileConnector(createBinanceSolanaConnector()) },
1247
- { id: "bitget", create: createBitgetSolanaConnector },
1248
- { id: "okx", create: createOkxSolanaConnector }
1032
+ { id: "bitget", create: () => createSolanaMobileConnector(createBitgetSolanaConnector()) },
1033
+ { id: "okx", create: () => createSolanaMobileConnector(createOkxSolanaConnector()) },
1034
+ {
1035
+ id: "coinbase",
1036
+ create: () => createSolanaMobileConnector(createCoinbaseSolanaConnector())
1037
+ }
1249
1038
  ];
1250
1039
  var getSolanaWallets = () => {
1251
1040
  const { get } = getWallets();
@@ -1347,6 +1136,266 @@ var checkSolflareSignCallback = () => {
1347
1136
  if (!isSolflareSignPending()) return null;
1348
1137
  return handleSolflareSignCallback();
1349
1138
  };
1139
+
1140
+ // src/lib/connectors/coinbase.ts
1141
+ var buildCoinbaseBrowseUrl = () => `cbwallet://dapp?url=${encodeURIComponent(window.location.href)}`;
1142
+ var createCoinbaseSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector({
1143
+ walletId: "coinbase",
1144
+ injectedKey: "isCoinbaseWallet",
1145
+ buildUrl: buildCoinbaseBrowseUrl
1146
+ });
1147
+ var createCoinbaseSolanaConnector = () => {
1148
+ const walletConfig2 = WALLETS.find((w) => w.id === "coinbase");
1149
+ const adapter = new CoinbaseWalletAdapter();
1150
+ const connector = {
1151
+ id: "coinbase",
1152
+ name: walletConfig2.name,
1153
+ icon: walletConfig2.icon,
1154
+ type: "solana",
1155
+ installed: adapter.readyState === "Installed",
1156
+ wallet: {
1157
+ _provider: adapter,
1158
+ connect: async () => {
1159
+ await adapter.connect();
1160
+ if (!adapter.publicKey) {
1161
+ throw new Error("No public key returned from Coinbase Wallet");
1162
+ }
1163
+ const address = adapter.publicKey.toBase58();
1164
+ const result = connectedResult(address, {
1165
+ publicKey: adapter.publicKey.toBytes()
1166
+ });
1167
+ storage.setString(STORAGE_KEYS.SOLANA_WALLET, "coinbase");
1168
+ setConnection(result, connector);
1169
+ return result;
1170
+ },
1171
+ disconnect: async () => {
1172
+ await adapter.disconnect();
1173
+ },
1174
+ signMessage: async (message) => {
1175
+ const encodedMessage = new TextEncoder().encode(message);
1176
+ const signature = await adapter.signMessage(encodedMessage);
1177
+ return bs582.encode(signature);
1178
+ }
1179
+ }
1180
+ };
1181
+ return connector;
1182
+ };
1183
+
1184
+ // src/lib/connectors/bitget.ts
1185
+ var BITGET_CONFIG = {
1186
+ walletId: "bitget",
1187
+ wcDeeplink: "bitkeep://bkconnect",
1188
+ injectedKey: "isBitKeep"
1189
+ };
1190
+ var buildBitgetBrowseUrl = () => `https://bkcode.vip?action=dapp&url=${encodeURIComponent(window.location.href)}`;
1191
+ var createBitgetSolanaConnector = () => createWcSolanaConnector(BITGET_CONFIG);
1192
+ var createBitgetSolanaDappBrowserConnector = () => createDappBrowserSolanaConnector({
1193
+ walletId: "bitget",
1194
+ injectedKey: "isBitKeep",
1195
+ buildUrl: buildBitgetBrowseUrl
1196
+ });
1197
+ var walletConfig = WALLETS.find((w) => w.id === "walletconnect");
1198
+ var disconnectWc2 = async () => {
1199
+ if (getCurrentSession()) {
1200
+ await disconnectWalletConnect();
1201
+ }
1202
+ };
1203
+ var createWalletConnectEvmConnector = () => {
1204
+ return {
1205
+ id: walletConfig.id,
1206
+ name: walletConfig.name,
1207
+ icon: walletConfig.icon,
1208
+ type: "evm",
1209
+ installed: false,
1210
+ wallet: {
1211
+ _connector: null,
1212
+ connect: async () => {
1213
+ return connectViaWalletConnect(EVM_WC_CONFIG, getEvmAccountFromSession);
1214
+ },
1215
+ disconnect: disconnectWc2,
1216
+ signMessage: async (message) => {
1217
+ const session = getCurrentSession();
1218
+ if (!session) {
1219
+ throw new Error("No WalletConnect session");
1220
+ }
1221
+ const account = session.namespaces.eip155?.accounts?.[0];
1222
+ if (!account) {
1223
+ throw new Error("No EVM account in session");
1224
+ }
1225
+ const address = account.split(":")[2];
1226
+ const result = await requestWalletConnect(
1227
+ "personal_sign",
1228
+ [message, address],
1229
+ WC_CHAINS.EVM_MAINNET
1230
+ );
1231
+ return result;
1232
+ }
1233
+ }
1234
+ };
1235
+ };
1236
+ var createWalletConnectSolanaConnector = () => {
1237
+ return {
1238
+ id: walletConfig.id,
1239
+ name: walletConfig.name,
1240
+ icon: walletConfig.icon,
1241
+ type: "solana",
1242
+ installed: false,
1243
+ wallet: {
1244
+ _provider: null,
1245
+ connect: async () => {
1246
+ return connectViaWalletConnect(SOLANA_WC_CONFIG, getSolanaAccountFromSession);
1247
+ },
1248
+ disconnect: disconnectWc2,
1249
+ signMessage: async (message) => {
1250
+ const session = getCurrentSession();
1251
+ if (!session) {
1252
+ throw new Error("No WalletConnect session");
1253
+ }
1254
+ const account = session.namespaces.solana?.accounts?.[0];
1255
+ if (!account) {
1256
+ throw new Error("No Solana account in session");
1257
+ }
1258
+ const pubkey = account.split(":")[2];
1259
+ const messageBytes = new TextEncoder().encode(message);
1260
+ const result = await requestWalletConnect(
1261
+ "solana_signMessage",
1262
+ { message: bs582.encode(messageBytes), pubkey },
1263
+ WC_CHAINS.SOLANA_MAINNET
1264
+ );
1265
+ return result.signature;
1266
+ }
1267
+ }
1268
+ };
1269
+ };
1270
+
1271
+ // src/lib/evm/connectors.ts
1272
+ var EVM_FALLBACK_CONNECTORS = [
1273
+ {
1274
+ id: "phantom",
1275
+ create: isMobile() ? createPhantomEvmConnectorDeeplink : createPhantomEvmConnector
1276
+ },
1277
+ ...isMobile() ? [] : [{ id: "metamask", create: createMetaMaskEvmConnector }],
1278
+ { id: "trust", create: createTrustEvmMobileConnector },
1279
+ { id: "binance", create: createBinanceEvmConnector },
1280
+ { id: "okx", create: createOkxEvmConnector },
1281
+ { id: "rainbow", create: createRainbowEvmMobileConnector },
1282
+ ...isMobile() ? [] : [{ id: "rabby", create: createRabbyEvmConnector }]
1283
+ ];
1284
+ var sleep = (ms) => new Promise((r) => window.setTimeout(r, ms));
1285
+ var checkEvmWalletInstalled = (connectorId) => {
1286
+ if (typeof window === "undefined") return false;
1287
+ const providers = window.ethereum?.providers ?? (window.ethereum ? [window.ethereum] : []);
1288
+ switch (connectorId) {
1289
+ case "metaMaskSDK":
1290
+ return providers.some((p) => p.isMetaMask && !p.isBraveWallet);
1291
+ case "coinbaseWalletSDK":
1292
+ if ("coinbaseWalletExtension" in window) return true;
1293
+ return providers.some(
1294
+ (p) => p.isCoinbaseWallet || p.isCoinbaseBrowser
1295
+ );
1296
+ default:
1297
+ return true;
1298
+ }
1299
+ };
1300
+ var cleanupWalletLocalStorage = () => {
1301
+ Object.keys(window.localStorage).filter((key) => key.startsWith("wagmi.")).forEach((key) => window.localStorage.removeItem(key));
1302
+ };
1303
+ var getEvmConnectors = () => {
1304
+ const wagmiConnectors = getConnectors(getEvmConfig());
1305
+ const connectors = wagmiConnectors.map((c) => ({
1306
+ id: normalizeEvmWalletId(c.id),
1307
+ name: c.name,
1308
+ icon: c.icon,
1309
+ type: "evm",
1310
+ installed: checkEvmWalletInstalled(c.id),
1311
+ wallet: {
1312
+ _connector: c,
1313
+ connect: async () => {
1314
+ try {
1315
+ const result = await connect(getEvmConfig(), { connector: c });
1316
+ if (!result.accounts[0]) throw new Error("No accounts returned");
1317
+ return connectedResult(result.accounts[0], { chainId: result.chainId });
1318
+ } catch (err) {
1319
+ if (err instanceof Error && err.name === "ConnectorAlreadyConnectedError") {
1320
+ cleanupWalletLocalStorage();
1321
+ await disconnect(getEvmConfig(), { connector: c });
1322
+ await sleep(100);
1323
+ const result = await connect(getEvmConfig(), { connector: c });
1324
+ if (!result.accounts[0]) throw new Error("No accounts returned");
1325
+ return connectedResult(result.accounts[0], { chainId: result.chainId });
1326
+ }
1327
+ throw err;
1328
+ }
1329
+ },
1330
+ disconnect: async () => {
1331
+ cleanupWalletLocalStorage();
1332
+ await disconnect(getEvmConfig());
1333
+ },
1334
+ signMessage: async (message) => {
1335
+ return signMessage(getEvmConfig(), { message });
1336
+ }
1337
+ }
1338
+ }));
1339
+ addFallbackConnectors(connectors, EVM_FALLBACK_CONNECTORS);
1340
+ return connectors;
1341
+ };
1342
+ var watchEvmConnections = (onChange) => {
1343
+ return watchConnections(getEvmConfig(), { onChange });
1344
+ };
1345
+ var switchChain = async (chainId) => {
1346
+ await switchChain$1(getEvmConfig(), { chainId });
1347
+ };
1348
+ var sendTransaction = async (params) => {
1349
+ const hash = await sendTransaction$1(getEvmConfig(), {
1350
+ to: params.to,
1351
+ value: params.value,
1352
+ data: params.data
1353
+ });
1354
+ return { hash };
1355
+ };
1356
+ var waitForTransactionReceipt = async (hash) => {
1357
+ const receipt = await waitForTransactionReceipt$1(getEvmConfig(), { hash });
1358
+ return {
1359
+ hash: receipt.transactionHash,
1360
+ status: receipt.status,
1361
+ blockNumber: receipt.blockNumber
1362
+ };
1363
+ };
1364
+ var getAllowance = async (params) => {
1365
+ return readContract(getEvmConfig(), {
1366
+ abi: erc20Abi,
1367
+ address: params.tokenAddress,
1368
+ functionName: "allowance",
1369
+ args: [params.owner, params.spender]
1370
+ });
1371
+ };
1372
+ var approve = async (params) => {
1373
+ const hash = await writeContract(getEvmConfig(), {
1374
+ address: params.tokenAddress,
1375
+ abi: erc20Abi,
1376
+ functionName: "approve",
1377
+ args: [params.spender, params.amount]
1378
+ });
1379
+ return waitForTransactionReceipt(hash);
1380
+ };
1381
+ var ensureAllowance = async (params) => {
1382
+ const currentAllowance = await getAllowance({
1383
+ tokenAddress: params.tokenAddress,
1384
+ owner: params.owner,
1385
+ spender: params.spender
1386
+ });
1387
+ if (currentAllowance >= params.amount) {
1388
+ return null;
1389
+ }
1390
+ if (currentAllowance > 0n) {
1391
+ await approve({
1392
+ tokenAddress: params.tokenAddress,
1393
+ spender: params.spender,
1394
+ amount: 0n
1395
+ });
1396
+ }
1397
+ return approve(params);
1398
+ };
1350
1399
  var useEvmWallet = (options) => {
1351
1400
  const [evmConnectors, setEvmConnectors] = createSignal([]);
1352
1401
  const [evmConnection, setEvmConnection] = createSignal(null);