Skip to content

Commit fb44546

Browse files
committed
fix solana provider
1 parent 10bfee4 commit fb44546

File tree

14 files changed

+220
-199
lines changed

14 files changed

+220
-199
lines changed

packages/no-modal/src/connectors/base-solana-connector/baseSolanaConnector.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { signChallenge, verifySignedChallenge } from "@toruslabs/base-controllers";
2-
import bs58 from "bs58";
2+
import { SOLANA_METHOD_TYPES } from "@web3auth/ws-embed";
33

44
import {
55
BaseConnector,
@@ -49,14 +49,13 @@ export abstract class BaseSolanaConnector<T> extends BaseConnector<T> {
4949
};
5050

5151
const challenge = await signChallenge(payload, chainNamespace);
52-
const encodedMessage = new TextEncoder().encode(challenge);
53-
const signedMessage = await this.provider.request<{ message: Uint8Array; display: string }, Uint8Array>({
54-
method: "signMessage",
55-
params: { message: encodedMessage, display: "utf8" },
52+
const signedMessage = await this.provider.request<{ data: string; display: string }, string>({
53+
method: SOLANA_METHOD_TYPES.SIGN_MESSAGE,
54+
params: { data: challenge, display: "utf8" },
5655
});
5756
const idToken = await verifySignedChallenge(
5857
chainNamespace,
59-
bs58.encode(signedMessage as Uint8Array),
58+
signedMessage,
6059
challenge,
6160
this.name,
6261
this.coreOptions.sessionTime,
@@ -71,7 +70,7 @@ export abstract class BaseSolanaConnector<T> extends BaseConnector<T> {
7170

7271
async disconnectSession(): Promise<void> {
7372
super.checkDisconnectionRequirements();
74-
const accounts = await this.provider.request<never, string[]>({ method: "getAccounts" });
73+
const accounts = await this.provider.request<never, string[]>({ method: SOLANA_METHOD_TYPES.GET_ACCOUNTS });
7574
if (accounts && accounts.length > 0) {
7675
clearToken(accounts[0], this.name);
7776
}

packages/no-modal/src/connectors/default-solana-connector/walletStandardConnector.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,9 @@ import {
2323
WalletLoginError,
2424
Web3AuthError,
2525
} from "@/core/base";
26-
import { WalletStandardProvider } from "@/core/solana-provider";
26+
import { getSolanaChainByChainConfig, type WalletStandard, WalletStandardProvider } from "@/core/solana-provider";
2727

2828
import { BaseSolanaConnector } from "../base-solana-connector";
29-
import { getSolanaChainByChainConfig } from "./utils";
30-
import { WalletStandard, WalletStandardProviderHandler } from "./walletStandardHandler";
3129

3230
export class WalletStandardConnector extends BaseSolanaConnector<void> {
3331
readonly name: string;
@@ -72,11 +70,7 @@ export class WalletStandardConnector extends BaseSolanaConnector<void> {
7270
super.checkInitializationRequirements({ chainConfig });
7371

7472
this.injectedProvider = new WalletStandardProvider({ config: { chain: chainConfig, chains: this.coreOptions.chains } });
75-
const providerHandler = new WalletStandardProviderHandler({
76-
wallet: this.wallet,
77-
getCurrentChain: () => getSolanaChainByChainConfig(chainConfig),
78-
});
79-
this.injectedProvider.setupProvider(providerHandler, options.chainId);
73+
this.injectedProvider.setupProvider(this.wallet, options.chainId);
8074

8175
this.status = CONNECTOR_STATUS.READY;
8276
this.emit(CONNECTOR_EVENTS.READY, this.name);

packages/no-modal/src/connectors/default-solana-connector/walletStandardHandler.ts

Lines changed: 0 additions & 86 deletions
This file was deleted.

packages/no-modal/src/connectors/wallet-connect-v2-connector/WalletConnectV2Provider.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ export class WalletConnectV2Provider extends BaseProvider<BaseProviderConfig, Wa
8484

8585
this.emit("chainChanged", chainId);
8686
this.emit("connect", { chainId });
87+
88+
this.update({ chainId });
8789
}
8890

8991
private async setupEthEngine(connector: ISignClient, chainId: string): Promise<void> {

packages/no-modal/src/connectors/wallet-connect-v2-connector/walletConnectV2Connector.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { signChallenge, verifySignedChallenge } from "@toruslabs/base-controller
22
import Client from "@walletconnect/sign-client";
33
import { SessionTypes } from "@walletconnect/types";
44
import { getSdkError, isValidArray } from "@walletconnect/utils";
5-
import base58 from "bs58";
5+
import { EVM_METHOD_TYPES, SOLANA_METHOD_TYPES } from "@web3auth/ws-embed";
66
import deepmerge from "deepmerge";
77

88
import {
@@ -214,7 +214,7 @@ class WalletConnectV2Connector extends BaseConnector<void> {
214214

215215
const { chainNamespace } = currentChainConfig;
216216
const accounts = await this.provider.request<never, string[]>({
217-
method: chainNamespace === CHAIN_NAMESPACES.EIP155 ? "eth_accounts" : "getAccounts",
217+
method: chainNamespace === CHAIN_NAMESPACES.EIP155 ? EVM_METHOD_TYPES.GET_ACCOUNTS : SOLANA_METHOD_TYPES.GET_ACCOUNTS,
218218
});
219219
if (accounts && accounts.length > 0) {
220220
const existingToken = getSavedToken(accounts[0] as string, this.name);
@@ -389,12 +389,11 @@ class WalletConnectV2Connector extends BaseConnector<void> {
389389
}
390390

391391
private async _getSignedMessage(challenge: string, accounts: string[], chainNamespace: ChainNamespaceType): Promise<string> {
392-
const signedMessage = await this.provider.request<string[] | { message: Uint8Array }, string | Uint8Array>({
393-
method: chainNamespace === CHAIN_NAMESPACES.EIP155 ? "personal_sign" : "signMessage",
394-
params: chainNamespace === CHAIN_NAMESPACES.EIP155 ? [challenge, accounts[0]] : { message: Buffer.from(challenge) },
392+
const signedMessage = await this.provider.request<string[] | { data: string }, string>({
393+
method: chainNamespace === CHAIN_NAMESPACES.EIP155 ? EVM_METHOD_TYPES.PERSONAL_SIGN : SOLANA_METHOD_TYPES.SIGN_MESSAGE,
394+
params: chainNamespace === CHAIN_NAMESPACES.EIP155 ? [challenge, accounts[0]] : { data: challenge },
395395
});
396-
if (chainNamespace === CHAIN_NAMESPACES.SOLANA) return base58.encode(signedMessage as Uint8Array);
397-
return signedMessage as string;
396+
return signedMessage;
398397
}
399398
}
400399

packages/no-modal/src/connectors/wallet-connect-v2-connector/walletConnectV2Utils.ts

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import type { ISignClient, SessionTypes } from "@walletconnect/types";
22
import { getAccountsFromNamespaces, parseAccountId } from "@walletconnect/utils";
33
import { type JRPCRequest, providerErrors, rpcErrors } from "@web3auth/auth";
4+
import { EVM_METHOD_TYPES, SOLANA_METHOD_TYPES } from "@web3auth/ws-embed";
45
import base58 from "bs58";
56

67
import { WalletLoginError } from "@/core/base";
78
import type { IEthProviderHandlers, MessageParams, TransactionParams, TypedMessageParams } from "@/core/ethereum-provider";
8-
import type { ISolanaProviderHandlers, TransactionOrVersionedTransaction } from "@/core/solana-provider";
9+
import type { ISolanaProviderHandlers } from "@/core/solana-provider";
910

1011
import { SOLANA_CAIP_CHAIN_MAP } from "./config";
1112

@@ -82,23 +83,31 @@ export function getEthProviderHandlers({ connector, chainId }: { connector: ISig
8283
return getAccounts(connector);
8384
},
8485
processTransaction: async (txParams: TransactionParams, _: JRPCRequest<unknown>): Promise<string> => {
85-
const methodRes = await sendJrpcRequest<string, TransactionParams[]>(connector, `eip155:${chainId}`, "eth_sendTransaction", [txParams]);
86+
const methodRes = await sendJrpcRequest<string, TransactionParams[]>(connector, `eip155:${chainId}`, EVM_METHOD_TYPES.ETH_TRANSACTION, [
87+
txParams,
88+
]);
8689
return methodRes;
8790
},
8891
processSignTransaction: async (txParams: TransactionParams, _: JRPCRequest<unknown>): Promise<string> => {
8992
const methodRes = await sendJrpcRequest<string, TransactionParams[]>(connector, `eip155:${chainId}`, "eth_signTransaction", [txParams]);
9093
return methodRes;
9194
},
9295
processEthSignMessage: async (msgParams: MessageParams<string>, _: JRPCRequest<unknown>): Promise<string> => {
93-
const methodRes = await sendJrpcRequest<string, string[]>(connector, `eip155:${chainId}`, "eth_sign", [msgParams.from, msgParams.data]);
96+
const methodRes = await sendJrpcRequest<string, string[]>(connector, `eip155:${chainId}`, EVM_METHOD_TYPES.ETH_SIGN, [
97+
msgParams.from,
98+
msgParams.data,
99+
]);
94100
return methodRes;
95101
},
96102
processPersonalMessage: async (msgParams: MessageParams<string>, _: JRPCRequest<unknown>): Promise<string> => {
97-
const methodRes = await sendJrpcRequest<string, string[]>(connector, `eip155:${chainId}`, "personal_sign", [msgParams.data, msgParams.from]);
103+
const methodRes = await sendJrpcRequest<string, string[]>(connector, `eip155:${chainId}`, EVM_METHOD_TYPES.PERSONAL_SIGN, [
104+
msgParams.data,
105+
msgParams.from,
106+
]);
98107
return methodRes;
99108
},
100109
processTypedMessageV4: async (msgParams: TypedMessageParams): Promise<string> => {
101-
const methodRes = await sendJrpcRequest<string, unknown[]>(connector, `eip155:${chainId}`, "eth_signTypedData_v4", [
110+
const methodRes = await sendJrpcRequest<string, unknown[]>(connector, `eip155:${chainId}`, EVM_METHOD_TYPES.ETH_SIGN_TYPED_DATA_V4, [
102111
msgParams.from,
103112
msgParams.data,
104113
]);
@@ -130,31 +139,27 @@ export function getSolProviderHandlers({ connector, chainId }: { connector: ISig
130139
signAndSendTransaction: async (_: JRPCRequest<unknown>) => {
131140
throw rpcErrors.methodNotSupported();
132141
},
133-
signMessage: async (req: JRPCRequest<{ message: Uint8Array }>): Promise<Uint8Array> => {
142+
signMessage: async (req: JRPCRequest<{ data: string }>): Promise<string> => {
134143
const methodRes = await sendJrpcRequest<{ signature: string }, { message: string }>(
135144
connector,
136145
`solana:${SOLANA_CAIP_CHAIN_MAP[chainId]}`,
137-
"solana_signMessage",
138-
{
139-
message: base58.encode(req.params.message),
140-
}
146+
SOLANA_METHOD_TYPES.SIGN_MESSAGE,
147+
{ message: base58.encode(Buffer.from(req.params.data, "utf-8")) }
141148
);
142-
return base58.decode(methodRes.signature);
149+
return methodRes.signature;
143150
},
144-
signTransaction: async (req: JRPCRequest<{ message: TransactionOrVersionedTransaction }>): Promise<TransactionOrVersionedTransaction> => {
145-
const [{ PublicKey }, accounts] = await Promise.all([import("@solana/web3.js"), getAccounts(connector)]);
151+
signTransaction: async (req: JRPCRequest<{ message: string }>): Promise<string> => {
152+
const accounts = await getAccounts(connector);
146153
if (accounts.length === 0) {
147154
throw providerErrors.disconnected();
148155
}
149156
const methodRes = await sendJrpcRequest<{ signature: string }, { transaction: string }>(
150157
connector,
151158
`solana:${SOLANA_CAIP_CHAIN_MAP[chainId]}`,
152-
"solana_signTransaction",
153-
{ transaction: req.params.message.serialize({ requireAllSignatures: false }).toString("base64") }
159+
SOLANA_METHOD_TYPES.SIGN_TRANSACTION,
160+
{ transaction: req.params.message }
154161
);
155-
const finalTransaction = req.params.message;
156-
finalTransaction.addSignature(new PublicKey(accounts[0]), Buffer.from(base58.decode(methodRes.signature)));
157-
return finalTransaction;
162+
return methodRes.signature;
158163
},
159164
};
160165
}

packages/no-modal/src/providers/solana-provider/interface.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import type { Transaction, VersionedTransaction } from "@solana/web3.js";
2-
import BN from "bn.js";
32

43
import { RequestArguments } from "@/core/base";
54

@@ -16,10 +15,8 @@ export interface ISolanaWallet {
1615

1716
export interface IBaseWalletProvider {
1817
publicKey?: { toBytes(): Uint8Array };
19-
signMessage?(message: Uint8Array, display?: "hex" | "utf8"): Promise<{ signature: Uint8Array; publicKey: BN }>;
20-
signTransaction?<T extends TransactionOrVersionedTransaction>(transaction: T): Promise<T>;
21-
signAllTransactions?<T extends TransactionOrVersionedTransaction>(transactions: T[]): Promise<T[]>;
22-
signAndSendTransaction?<T extends TransactionOrVersionedTransaction>(transaction: T): Promise<{ signature: string }>;
18+
signMessage?(message: string, pubKey: string, display?: "hex" | "utf8"): Promise<string>; // TODO: check display
19+
signTransaction?(transaction: string): Promise<string>;
20+
signAllTransactions?(transactions: string[]): Promise<string[]>;
21+
signAndSendTransaction?(transaction: string): Promise<string>;
2322
}
24-
25-
export interface IWalletStandardProviderHandler extends IBaseWalletProvider {}

packages/no-modal/src/providers/solana-provider/providers/injectedProviders/base/providerHandlers.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { JRPCRequest, rpcErrors } from "@web3auth/auth";
22
import bs58 from "bs58";
33

4-
import { IBaseWalletProvider, TransactionOrVersionedTransaction } from "../../../interface";
4+
import { IBaseWalletProvider } from "../../../interface";
55
import { ISolanaProviderHandlers } from "../../../rpc";
66

77
export const getBaseProviderHandlers = (injectedProvider: IBaseWalletProvider): ISolanaProviderHandlers => {
@@ -19,24 +19,24 @@ export const getBaseProviderHandlers = (injectedProvider: IBaseWalletProvider):
1919
getSecretKey: async () => {
2020
throw rpcErrors.methodNotSupported();
2121
},
22-
signTransaction: async (req: JRPCRequest<{ message: TransactionOrVersionedTransaction }>): Promise<TransactionOrVersionedTransaction> => {
22+
signTransaction: async (req: JRPCRequest<{ message: string }>): Promise<string> => {
2323
const transaction = await injectedProvider.signTransaction(req.params.message);
2424
return transaction;
2525
},
26-
signMessage: async (req: JRPCRequest<{ message: Uint8Array; display?: string }>): Promise<Uint8Array> => {
27-
const sigData = await injectedProvider.signMessage(req.params.message, req.params.display as "utf8" | "hex");
28-
return sigData.signature;
26+
signMessage: async (req: JRPCRequest<{ data: string; from: string; display?: string }>): Promise<string> => {
27+
const sigData = await injectedProvider.signMessage(req.params.data, req.params.from, req.params.display as "utf8" | "hex");
28+
return sigData;
2929
},
30-
signAllTransactions: async (req: JRPCRequest<{ message: TransactionOrVersionedTransaction[] }>): Promise<TransactionOrVersionedTransaction[]> => {
30+
signAllTransactions: async (req: JRPCRequest<{ message: string[] }>): Promise<string[]> => {
3131
if (!req.params?.message || !req.params?.message.length) {
3232
throw rpcErrors.invalidParams("message");
3333
}
3434
const transaction = await injectedProvider.signAllTransactions(req.params.message);
3535
return transaction;
3636
},
37-
signAndSendTransaction: async (req: JRPCRequest<{ message: TransactionOrVersionedTransaction }>): Promise<{ signature: string }> => {
37+
signAndSendTransaction: async (req: JRPCRequest<{ message: string }>): Promise<string> => {
3838
const txRes = await injectedProvider.signAndSendTransaction(req.params.message);
39-
return { signature: txRes.signature };
39+
return txRes;
4040
},
4141
};
4242
return providerHandlers;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1+
export * from "./utils";
12
export * from "./walletStandardProvider";
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { IdentifierString } from "@wallet-standard/base";
2+
3+
import { CustomChainConfig } from "@/core/base";
4+
5+
export const getSolanaChainByChainConfig = (chainConfig: CustomChainConfig): IdentifierString => {
6+
switch (chainConfig.chainId) {
7+
case "0x65":
8+
return "solana:mainnet";
9+
case "0x66":
10+
return "solana:testnet";
11+
case "0x67":
12+
return "solana:devnet";
13+
default:
14+
return null;
15+
}
16+
};

0 commit comments

Comments
 (0)