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