Hello,
I was able to obtain the SolanaProvider.
I will share my code for this.
import React, { useState, useEffect } from 'react';
import { TouchableOpacity, View, Text } from 'react-native';
import EncryptedStorage from 'react-native-encrypted-storage';
import * as WebBrowser from '@toruslabs/react-native-web-browser';
import Web3Auth, {
LOGIN_PROVIDER,
OPENLOGIN_NETWORK,
} from '@web3auth/react-native-sdk';
import {
SolanaWallet,
SolanaPrivateKeyProvider,
} from '@web3auth/solana-provider';
const WEB3 = {
URL: ‘test://openlogin’,
CLIENTID: ‘YOURCLIENTID’,
CHAIN: {
chainNamespace: ‘solana’,
chainId: ‘0x2’, // Please use 0x1 for Mainnet, 0x2 for Testnet, 0x3 for Devnet
rpcTarget: ‘https://api.testnet.solana.com’,
displayName: ‘Solana Test’,
blockExplorer: ‘https://explorer.solana.com’,
ticker: ‘SOL’,
tickerName: ‘Solana Token’,
},
};
const Web3 = ({}) => {
const [web3auth, setWeb3Auth] = useState(null);
const [userInfo, setUserInfo] = useState(null);
const [privKey, setPrivKey] = useState(‘’);
useEffect(() => {
const init = async () => {
try {
const auth = new Web3Auth(WebBrowser, EncryptedStorage, {
clientId: WEB3.CLIENTID,
network: OPENLOGIN_NETWORK.TESTNET,
chainConfig: WEB3.CHAIN,
});
setWeb3Auth(auth);
await auth.init();
if (auth?.privKey) {
console.log('Re logged in');
setUserInfo(auth.userInfo());
setPrivKey(auth.privKey);
}
} catch (e) {
console.log('error', e);
}
};
init();
}, );
const getSolanaPublicKey = async () => {
const solanaPrivateProvider =
await SolanaPrivateKeyProvider.getProviderInstance({
chainConfig: WEB3.CHAIN,
privKey: web3auth.ed25519Key,
});
const solanaWallet = new SolanaWallet(solanaPrivateProvider.provider);
const accounts = await solanaWallet.requestAccounts();
return accounts[0];
};
const login = async provider => {
try {
if (!web3auth) {
console.log(‘Web3auth not initialized’);
return;
}
console.log(‘Logging in’);
await web3auth.login({
loginProvider: LOGIN_PROVIDER[provider],
redirectUrl: WEB3.URL,
});
if (web3auth.privKey) {
console.log(`Logged in ${web3auth.privKey}`);
setPrivKey(web3auth.privKey);
setUserInfo(web3auth.userInfo());
const publicKey = await getSolanaPublicKey();
return {
privateKey: web3auth.privKey,
userInfo: web3auth.userInfo(),
publicKey,
};
}
} catch (e) {
console.log(e.message);
}
};
const logout = async () => {
if (!web3auth) {
console.log(‘Web3auth not initialized’);
return;
}
console.log(‘Logging out’);
await web3auth.logout();
if (!web3auth.privKey) {
setUserInfo(undefined);
setPrivKey('');
console.log('Logged out');
}
};
return (
<View>
<TouchableOpacity
onPress={async () => {
const { privateKey, publicKey, userInfo } = await login();
}}>
<Text>Login</Text>
</TouchableOpacity>
</View>
);
};
Don’t forget to add extraNodeModules in your metro.config file
//web3
stream: require.resolve('readable-stream'),
crypto: require.resolve('react-native-quick-crypto'),
//solana
https: require.resolve('https-browserify'),
http: require.resolve('stream-http'),
//zlib requires installing assert, util
zlib: require.resolve('browserify-zlib'),
url: require.resolve('url'),
Tell me if you have any question