diff --git a/src/blockchain/events.ts b/src/blockchain/events.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/blockchain/provider.ts b/src/blockchain/provider.ts index b83143a..574d984 100644 --- a/src/blockchain/provider.ts +++ b/src/blockchain/provider.ts @@ -1,15 +1,62 @@ import { ethers } from "ethers"; import { useEtherStore } from "@/store/ether"; +import { NetworkEnum } from "@/model/NetworkEnum"; +import { updateWalletStatus } from "./wallet"; -const getProvider = (): ethers.providers.Web3Provider | null => { - const etherStore = useEtherStore(); - +const getProvider = (): ethers.providers.Web3Provider | ethers.providers.JsonRpcProvider => { const window_ = window as any; const connection = window_.ethereum; - - if (!connection) return null; - - return new ethers.providers.Web3Provider(connection); + + if (!connection) + return new ethers.providers.JsonRpcProvider("provider_url"); // alchemy provider + + return new ethers.providers.Web3Provider(connection); // metamask provider }; -export { getProvider } \ No newline at end of file +const connectProvider = async (): Promise => { + const window_ = window as any; + const connection = window_.ethereum; + const provider = getProvider(); + + if(!(provider instanceof ethers.providers.Web3Provider)){ + window.alert("Please, connect to metamask extension"); + return null; + } + + await updateWalletStatus(); + // await updateValidDeposits(); + // await updateDepositAddedEvents(); + // await updateLockAddedEvents(); + // await updateLockReleasedEvents(); + + listenToNetworkChange(connection); + listenToWalletChange(connection); +}; + +const listenToWalletChange = (connection: any): void => { + connection.on("accountsChanged", async () => { + await updateWalletStatus(); + }); +} + + +const listenToNetworkChange = (connection: any) => { + const etherStore = useEtherStore(); + + const possibleNetworks: {[key: string]: NetworkEnum} = { + "0x5": NetworkEnum.ethereum, + "0x13881": NetworkEnum.polygon, + "0x7a69": NetworkEnum.localhost, + } + + connection.on("chainChanged", (networkChain: string) => { + if (Object.keys(possibleNetworks).includes(networkChain)){ + etherStore.setNetworkName(possibleNetworks[networkChain]); + } + }); +} + +export { + getProvider, + listenToNetworkChange + } \ No newline at end of file diff --git a/src/blockchain/transfer.ts b/src/blockchain/transfer.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/blockchain/wallet.ts b/src/blockchain/wallet.ts new file mode 100644 index 0000000..e78f65c --- /dev/null +++ b/src/blockchain/wallet.ts @@ -0,0 +1,43 @@ +import { ethers } from "ethers"; +import { getProvider } from "./provider"; +import blockchain from "../utils/blockchain" +import { useEtherStore } from "@/store/ether"; + +import mockToken from "../utils/smart_contract_files/MockToken.json"; +import addresses from "../utils/smart_contract_files/localhost.json"; + +const updateWalletStatus = async () => { + const etherStore = useEtherStore(); + const provider = getProvider(); + + if (!provider) return; + + const signer = provider.getSigner(); + const contract = new ethers.Contract(addresses.token, mockToken.abi, signer); + + const walletAddress = await provider.send("eth_requestAccounts", []); + + const balance = await contract.balanceOf(walletAddress[0]); + etherStore.setBalance(blockchain.formatBigNumber(balance)); + etherStore.setWalletAddress(ethers.utils.getAddress(walletAddress[0])); + }; + + const updateWalletBalance = async () => { + const etherStore = useEtherStore(); + const provider = getProvider(); + + if (!provider) return; + + const signer = provider.getSigner(); + const contract = new ethers.Contract(addresses.token, mockToken.abi, signer); + + const walletAddress = await provider.send("eth_requestAccounts", []); + + const balance = await contract.balanceOf(walletAddress[0]); + etherStore.setBalance(blockchain.formatBigNumber(balance)); + }; + + export { + updateWalletStatus, + updateWalletBalance + } \ No newline at end of file diff --git a/src/utils/blockchain.ts b/src/utils/blockchain.ts index a69057b..28056f6 100644 --- a/src/utils/blockchain.ts +++ b/src/utils/blockchain.ts @@ -8,40 +8,7 @@ import addresses from "./smart_contract_files/localhost.json"; // Mock wallets import import { wallets } from "./smart_contract_files/wallets.json"; import { getProvider } from "../blockchain/provider"; -import { NetworkEnum } from "@/model/NetworkEnum"; - -// Wallet methods -// Update wallet state (balance and address) -const updateWalletStatus = async () => { - const etherStore = useEtherStore(); - const provider = getProvider(); - - if (!provider) return; - - const signer = provider.getSigner(); - const contract = new ethers.Contract(addresses.token, mockToken.abi, signer); - - const walletAddress = await provider.send("eth_requestAccounts", []); - - const balance = await contract.balanceOf(walletAddress[0]); - etherStore.setBalance(formatBigNumber(balance)); - etherStore.setWalletAddress(ethers.utils.getAddress(walletAddress[0])); -}; - -const updateWalletBalance = async () => { - const etherStore = useEtherStore(); - const provider = getProvider(); - - if (!provider) return; - - const signer = provider.getSigner(); - const contract = new ethers.Contract(addresses.token, mockToken.abi, signer); - - const walletAddress = await provider.send("eth_requestAccounts", []); - - const balance = await contract.balanceOf(walletAddress[0]); - etherStore.setBalance(formatBigNumber(balance)); -}; +import { updateWalletBalance, updateWalletStatus } from "../blockchain/wallet"; // Split tokens between wallets in wallets.json const splitTokens = async () => { @@ -264,39 +231,6 @@ const updateLockReleasedEvents = async () => { console.log("RELEASES", eventsReleases); }; -// Provider methods -const connectProvider = async () => { - const window_ = window as any; - const connection = window_.ethereum; - - await updateWalletStatus(); - await updateValidDeposits(); - await updateDepositAddedEvents(); - await updateLockAddedEvents(); - await updateLockReleasedEvents(); - listenToNetworkChange(connection); - - connection.on("accountsChanged", async () => { - await updateWalletStatus(); - }); -}; - -const listenToNetworkChange = (connection: any) => { - const etherStore = useEtherStore(); - - const possibleNetworks: {[key: string]: NetworkEnum} = { - "0x5": NetworkEnum.ethereum, - "0x13881": NetworkEnum.polygon, - "0x7a69": NetworkEnum.localhost, - } - - connection.on("chainChanged", (networkChain: string) => { - if (Object.keys(possibleNetworks).includes(networkChain)){ - etherStore.setNetworkName(possibleNetworks[networkChain]); - } - }); -} - // Deposit methods const approveTokens = async (tokenQty: Number) => { const provider = getProvider(); @@ -516,9 +450,7 @@ const formatBigNumber = (num: BigNumber) => { }; export default { - connectProvider, formatEther, - updateWalletStatus, splitTokens, listValidDepositTransactionsByWalletAddress, listAllTransactionByWalletAddress,