Total overhaul

This commit is contained in:
Filipe Soccol
2024-11-07 11:35:15 -03:00
parent 9205909f9f
commit 659db5ef04
35 changed files with 1404 additions and 646 deletions

View File

@@ -1,96 +1,27 @@
import { useEtherStore } from "@/store/ether";
import p2pix from "@/utils/smart_contract_files/P2PIX.json";
import { updateWalletStatus } from "./wallet";
import {
getProviderUrl,
isPossibleNetwork,
getP2PixAddress,
} from "./addresses";
import type { NetworkEnum } from "@/model/NetworkEnum";
import { Networks } from "@/model/Networks";
import { getProviderUrl, getP2PixAddress } from "./addresses";
import { BrowserProvider, JsonRpcProvider, Contract } from "ethers";
const getProvider = (
onlyAlchemyProvider: boolean = false
): BrowserProvider | JsonRpcProvider => {
let provider: BrowserProvider | JsonRpcProvider | null = null;
const getProvider = (onlyAlchemyProvider: boolean = false) => {
if (onlyAlchemyProvider) return new JsonRpcProvider(getProviderUrl()); // alchemy provider
return (window as any).ethereum as BrowserProvider;
return provider;
};
const getContract = async (onlyAlchemyProvider: boolean = false) => {
const provider = getProvider(onlyAlchemyProvider);
const signer = await provider.getSigner();
return new Contract(getP2PixAddress(), p2pix.abi, signer);
};
const connectProvider = async (): Promise<void> => {
const window_ = window as any;
const connection = window_.ethereum;
const provider = getProvider();
await (provider as any).enable();
if (!(provider instanceof BrowserProvider)) {
window.alert("Please, connect to metamask extension");
return;
}
await updateWalletStatus();
listenToNetworkChange(connection);
listenToWalletChange(connection);
};
const listenToWalletChange = (connection: any): void => {
connection.on("accountsChanged", async () => {
console.log("Changed account!");
updateWalletStatus();
});
};
const listenToNetworkChange = (connection: any) => {
const etherStore = useEtherStore();
connection.on("chainChanged", (networkChain: NetworkEnum) => {
console.log("Changed network!");
if (isPossibleNetwork(networkChain)) {
etherStore.setNetworkName(networkChain);
updateWalletStatus();
} else {
window.alert("Invalid chain!");
}
});
};
const requestNetworkChange = async (network: NetworkEnum): Promise<boolean> => {
const etherStore = useEtherStore();
if (!etherStore.walletAddress) return true;
const window_ = window as any;
const p = getProvider(onlyAlchemyProvider);
try {
await window_.ethereum.request({
method: "wallet_switchEthereumChain",
params: [{ chainId: Networks[network].chainId }], // chainId must be in hexadecimal numbers
});
} catch (e: any) {
if (e.code == 4902) {
// Unrecognized chain ID
await window_.ethereum.request({
method: "wallet_addEthereumChain",
params: [Networks[network]],
});
}
const signer = await p?.getSigner();
return new Contract(getP2PixAddress(), p2pix.abi, signer);
} catch (err) {
return new Contract(getP2PixAddress(), p2pix.abi, p);
}
return true;
};
export {
getProvider,
getContract,
connectProvider,
listenToNetworkChange,
requestNetworkChange,
const connectProvider = async (p: any): Promise<void> => {
provider = new BrowserProvider(p, "any");
await updateWalletStatus();
};
export { getProvider, getContract, connectProvider };