udi*_*r11 6 typescript ethereum
我正在使用 Nextjs + Reactjs + Typescript。如果没有 Typescript,它可以完美工作,但在使用 Typescript 时出现此错误。
顺便说一下,我useMemo
在这里使用,但我尝试在函数之外初始化它。在这两种情况下,我都遇到了相同的错误。
这是我当前正在使用的代码片段
const INFURA_ID = process.env.REACT_APP_INFURA_ID;
const initWeb3 = (provider: any) => {
const web3 = new Web3(provider);
web3.eth.extend({
methods: [
{
name: "chainId",
call: "eth_chainId",
outputFormatter: web3.utils.hexToNumber as any,
},
],
});
return web3;
};
export function Web3UtilityProvider() {
const [walletAddress, setWalletAddress] = useState(null);
const { user, authDispatch } = useAuth();
const dAppClient = useMemo(() => new DAppClient({ name: "Beacon Docs" }), []);
const web3Modal = useMemo(() => {
return new Web3Modal({
// network: "mainnet", // optional
cacheProvider: true, // optional
providerOptions: {
walletconnect: {
package: WalletConnectProvider, // required
options: {
infuraId: INFURA_ID,
},
},
// torus: {
// package: Torus,
// },
fortmatic: {
package: Fortmatic,
options: {
key: process.env.REACT_APP_FORTMATIC_KEY,
},
},
authereum: {
package: Authereum,
},
bitski: {
package: Bitski,
options: {
clientId: process.env.REACT_APP_BITSKI_CLIENT_ID,
callbackUrl:
window.location.href + "bitski-callback.html",
},
},
},
});
}, []);
const logoutOfWeb3Modal = useCallback(async () => {
async () => {
web3Modal.clearCachedProvider();
setTimeout(() => {
typeof window !== "undefined" && window.location.reload();
}, 1);
};
}, [web3Modal]);
const loadWeb3Modal = useCallback(async () => {
const provider = await web3Modal.connect();
if (!provider?.on) {
return;
}
const web3 = initWeb3(provider);
const accounts = await web3.eth.getAccounts();
provider.on("close", () => {
logoutOfWeb3Modal();
});
provider.on("accountsChanged", async (accounts: any) => {
console.log("accountsChanged", accounts);
if (!accounts || !accounts.length) {
return;
}
});
}, []);
return (
<Web3Context.Provider
value={{
logoutOfWeb3Modal,
loadWeb3Modal
}}
>
{children}
</Web3Context.Provider>
);
}
Run Code Online (Sandbox Code Playgroud)
其实这个错误与js或者ts无关;由于CSR,它正在与reactjs应用程序一起使用,但在我的例子中,我使用的是nextjs,并且由于SSR,窗口对象未定义。因此,为了解决这个错误,我只是使用了后备(即 useEffect)。
归档时间: |
|
查看次数: |
2967 次 |
最近记录: |