diff --git a/src/blockchain/__tests__/addresses.spec.ts b/src/blockchain/__tests__/addresses.spec.ts index 59a8fae..eba82f8 100644 --- a/src/blockchain/__tests__/addresses.spec.ts +++ b/src/blockchain/__tests__/addresses.spec.ts @@ -4,8 +4,6 @@ import { getP2PixAddress, getProviderUrl, isPossibleNetwork, - possibleChains, - network2Chain, } from "../addresses"; import { setActivePinia, createPinia } from "pinia"; @@ -18,9 +16,6 @@ describe("addresses.ts types", () => { expectTypeOf(getP2PixAddress).toBeFunction(); expectTypeOf(getProviderUrl).toBeFunction(); expectTypeOf(isPossibleNetwork).toBeFunction(); - - expectTypeOf(possibleChains).toBeObject(); - expectTypeOf(network2Chain).toBeObject(); }); }); @@ -115,13 +110,12 @@ describe("addresses.ts functions", () => { it("isPossibleNetwork Returns", () => { const etherStore = useEtherStore(); etherStore.setNetworkName(NetworkEnum.ethereum); - expect(isPossibleNetwork("0x5")).toBe(true); - expect(isPossibleNetwork("5")).toBe(true); - expect(isPossibleNetwork("0x13881")).toBe(true); - expect(isPossibleNetwork("80001")).toBe(true); + expect(isPossibleNetwork(0x5)).toBe(true); + expect(isPossibleNetwork(5)).toBe(true); + expect(isPossibleNetwork(0x13881)).toBe(true); + expect(isPossibleNetwork(80001)).toBe(true); - expect(isPossibleNetwork("")).toBe(false); - expect(isPossibleNetwork(" ")).toBe(false); - expect(isPossibleNetwork("0x55")).toBe(false); + expect(isPossibleNetwork(NaN)).toBe(false); + expect(isPossibleNetwork(0x55)).toBe(false); }); }); diff --git a/src/blockchain/addresses.ts b/src/blockchain/addresses.ts index df6068c..9f5e530 100644 --- a/src/blockchain/addresses.ts +++ b/src/blockchain/addresses.ts @@ -1,62 +1,44 @@ import { useEtherStore } from "@/store/ether"; import { NetworkEnum, TokenEnum } from "@/model/NetworkEnum"; -const ethereumTokens: { [key in TokenEnum]: string } = { - BRZ: "0x3eBE67A2C7bdB2081CBd34ba3281E90377462289", - BRX: "0x3eBE67A2C7bdB2081CBd34ba3281E90377462289", -} - -const polygonTokens: { [key in TokenEnum]: string } = { - BRZ: "0xC86042E9F2977C62Da8c9dDF7F9c40fde4796A29", - BRX: "0xC86042E9F2977C62Da8c9dDF7F9c40fde4796A29", -} - -const rootstockTokens: { [key in TokenEnum]: string } = { - BRZ: "0xfE841c74250e57640390f46d914C88d22C51e82e", - BRX: "0xfE841c74250e57640390f46d914C88d22C51e82e", -} +const Tokens: { [key in NetworkEnum]: {[key in TokenEnum] :string} } = { + [NetworkEnum.ethereum]: { + BRZ: "0x3eBE67A2C7bdB2081CBd34ba3281E90377462289", + BRX: "0x3eBE67A2C7bdB2081CBd34ba3281E90377462289", + }, + [NetworkEnum.polygon]: { + BRZ: "0xC86042E9F2977C62Da8c9dDF7F9c40fde4796A29", + BRX: "0xC86042E9F2977C62Da8c9dDF7F9c40fde4796A29", + }, + [NetworkEnum.rootstock]: { + BRZ: "0xfE841c74250e57640390f46d914C88d22C51e82e", + BRX: "0xfE841c74250e57640390f46d914C88d22C51e82e", + } +}; export const getTokenByAddress = (address: string) => { - for (const token of Object.keys(ethereumTokens)) { - if (address === ethereumTokens[token as TokenEnum]) { - return token as TokenEnum; - } - } - - for (const token of Object.keys(polygonTokens)) { - if (address === ethereumTokens[token as TokenEnum]) { - return token as TokenEnum; - } - } - - for (const token of Object.keys(rootstockTokens)) { - if (address === ethereumTokens[token as TokenEnum]) { - return token as TokenEnum; + for ( let network in NetworkEnum ) { + for (const token of Object.keys(Tokens[network])) { + if (address === Tokens[network][token as TokenEnum]) { + return token as TokenEnum; + } } } return null; -} +}; const getTokenAddress = (token: TokenEnum, network?: NetworkEnum): string => { const etherStore = useEtherStore(); - - const possibleTokenAddresses: { [key: string]: { [key in TokenEnum]: string } } = { - Ethereum: ethereumTokens, - Polygon: polygonTokens, - Rootstock: rootstockTokens, - }; - - return possibleTokenAddresses[network ? network : etherStore.networkName][token]; + return Tokens[network ? network : etherStore.networkName][token]; }; const getP2PixAddress = (network?: NetworkEnum): string => { const etherStore = useEtherStore(); - - const possibleP2PixAddresses: { [key: string]: string } = { - Ethereum: "0xb7cD135F5eFD9760981e02E2a898790b688939fe", - Polygon: "0x4A2886EAEc931e04297ed336Cc55c4eb7C75BA00", - Rootstock: "0x98ba35eb14b38D6Aa709338283af3e922476dE34", + const possibleP2PixAddresses: { [key in NetworkEnum]: string } = { + [NetworkEnum.ethereum]: "0xb7cD135F5eFD9760981e02E2a898790b688939fe", + [NetworkEnum.polygon]: "0x4A2886EAEc931e04297ed336Cc55c4eb7C75BA00", + [NetworkEnum.rootstock]: "0x98ba35eb14b38D6Aa709338283af3e922476dE34", }; return possibleP2PixAddresses[network ? network : etherStore.networkName]; @@ -64,40 +46,22 @@ const getP2PixAddress = (network?: NetworkEnum): string => { const getProviderUrl = (): string => { const etherStore = useEtherStore(); - const possibleProvidersUrls: { [key: string]: string } = { - Ethereum: import.meta.env.VITE_SEPOLIA_API_URL, - Polygon: import.meta.env.VITE_MUMBAI_API_URL, - Rootstock: import.meta.env.VITE_RSK_API_URL, + const possibleProvidersUrls: { [key in NetworkEnum]: string } = { + [NetworkEnum.ethereum]: import.meta.env.VITE_SEPOLIA_API_URL, + [NetworkEnum.polygon]: import.meta.env.VITE_MUMBAI_API_URL, + [NetworkEnum.rootstock]: import.meta.env.VITE_RSK_API_URL, }; return possibleProvidersUrls[etherStore.networkName]; }; -const possibleChains: { [key: string]: NetworkEnum } = { - "11155111": NetworkEnum.ethereum, - "80001": NetworkEnum.polygon, - "31": NetworkEnum.rootstock, -}; - -const network2Chain: { [key: string]: string } = { - Ethereum: "0xAA36A7", - Polygon: "0x13881", - Localhost: "0x7a69", - Rootstock: "0x1f", -}; - -const isPossibleNetwork = (networkChain: string): boolean => { - if (Object.keys(possibleChains).includes(networkChain.toString())) { - return true; - } - return false; +const isPossibleNetwork = (networkChain: NetworkEnum): boolean => { + return (Number(networkChain) in NetworkEnum); }; export { getTokenAddress, getProviderUrl, - possibleChains, - network2Chain, isPossibleNetwork, getP2PixAddress, }; diff --git a/src/blockchain/provider.ts b/src/blockchain/provider.ts index 08448e7..80166ee 100644 --- a/src/blockchain/provider.ts +++ b/src/blockchain/provider.ts @@ -6,11 +6,12 @@ import { updateWalletStatus } from "./wallet"; import { getProviderUrl, isPossibleNetwork, - possibleChains, - network2Chain, getP2PixAddress, } from "./addresses"; +import type { NetworkEnum } from "@/model/NetworkEnum"; +import { Networks } from "@/model/Networks"; + import { ethers } from "ethers"; const getProvider = ( @@ -57,11 +58,11 @@ const listenToWalletChange = (connection: any): void => { const listenToNetworkChange = (connection: any) => { const etherStore = useEtherStore(); - connection.on("chainChanged", (networkChain: string) => { + connection.on("chainChanged", (networkChain: NetworkEnum) => { console.log("Changed network!"); if (isPossibleNetwork(networkChain)) { - etherStore.setNetworkName(possibleChains[networkChain]); + etherStore.setNetworkName(networkChain); updateWalletStatus(); } else { window.alert("Invalid chain!"); @@ -69,7 +70,7 @@ const listenToNetworkChange = (connection: any) => { }); }; -const requestNetworkChange = async (network: string): Promise => { +const requestNetworkChange = async (network: NetworkEnum): Promise => { const etherStore = useEtherStore(); if (!etherStore.walletAddress) return true; @@ -77,7 +78,7 @@ const requestNetworkChange = async (network: string): Promise => { const window_ = window as any; await window_.ethereum.request({ method: "wallet_switchEthereumChain", - params: [{ chainId: network2Chain[network] }], // chainId must be in hexadecimal numbers + params: [{ chainId: Networks[network].chainId }], // chainId must be in hexadecimal numbers }); } catch { return false; diff --git a/src/blockchain/wallet.ts b/src/blockchain/wallet.ts index 12d8d17..db822f5 100644 --- a/src/blockchain/wallet.ts +++ b/src/blockchain/wallet.ts @@ -1,7 +1,7 @@ import { useEtherStore } from "@/store/ether"; import { getContract, getProvider } from "./provider"; -import { getTokenAddress, possibleChains, isPossibleNetwork } from "./addresses"; +import { getTokenAddress, isPossibleNetwork } from "./addresses"; import mockToken from "@/utils/smart_contract_files/MockToken.json"; @@ -21,11 +21,11 @@ const updateWalletStatus = async (): Promise => { const signer = provider.getSigner(); const { chainId } = await provider.getNetwork(); - if (!isPossibleNetwork(chainId.toString())) { + if (!isPossibleNetwork(chainId)) { window.alert("Invalid chain!:" + chainId); return; } - etherStore.setNetworkName(possibleChains[chainId]); + etherStore.setNetworkName(chainId); const mockTokenContract = new ethers.Contract( getTokenAddress(etherStore.selectedToken), diff --git a/src/components/TopBar/TopBar.vue b/src/components/TopBar/TopBar.vue index ac79893..172f141 100644 --- a/src/components/TopBar/TopBar.vue +++ b/src/components/TopBar/TopBar.vue @@ -6,6 +6,7 @@ import { onClickOutside } from "@vueuse/core"; import { NetworkEnum } from "@/model/NetworkEnum"; import { connectProvider, requestNetworkChange } from "@/blockchain/provider"; import { getNetworkImage } from "@/utils/imagesPath"; +import { Networks } from "@/model/Networks"; // Store reference const etherStore = useEtherStore(); @@ -227,7 +228,7 @@ onClickOutside(infoMenuRef, () => { > Choosed network image @@ -241,7 +242,7 @@ onClickOutside(infoMenuRef, () => { : 'rgb(249 250 251)', }" > - {{ etherStore.networkName }} + {{ Networks[etherStore.networkName].chainName }} {
@@ -455,18 +456,18 @@ onClickOutside(infoMenuRef, () => {
diff --git a/src/model/NetworkEnum.ts b/src/model/NetworkEnum.ts index b1b88d8..1930791 100644 --- a/src/model/NetworkEnum.ts +++ b/src/model/NetworkEnum.ts @@ -1,7 +1,7 @@ export enum NetworkEnum { - ethereum = "Ethereum", - polygon = "Polygon", - rootstock = "Rootstock", + ethereum = 11155111, + polygon = 80001, + rootstock = 31, } export enum TokenEnum { diff --git a/src/model/Networks.ts b/src/model/Networks.ts new file mode 100644 index 0000000..cccc99f --- /dev/null +++ b/src/model/Networks.ts @@ -0,0 +1,41 @@ +import { NetworkEnum } from "@/model/NetworkEnum"; + +export const Networks = { + [NetworkEnum.ethereum]: + { + chainId: "0xAA36A7", + chainName: "Sepolia" + }, + [NetworkEnum.polygon]: + { + chainId: "0x13881", + chainName: "Polygon Mumbai", + nativeCurrency: { + name: "MATIC", + symbol: "MATIC", + decimals: 18 + }, + blockExplorerUrls: [ + "https://mumbai.polygonscan.com/" + ] + }, + [NetworkEnum.rootstock]: + { + chainId: "0x1F", + chainName: "Rootstock Testnet", + rpcUrls: [ + "https://public-node.testnet.rsk.co/" + ], + iconUrls: [ + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAoCAYAAACWwljjAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPOSURBVHgBxVhNUhpBFH6vGdxp4S4LoSYnEE8gnEA4AbpMJUQ4gXgCRJK1egLxBOIJJCdwJElVllMu49Cd1z04zD/dY1H5qihmut/M93VPv59uhHdAXFaPAaEDgA2/BaeA4hq/zG+gIBAKQoyr9yshid4Jdn+2oQAYFIC4rA2zxUhgS3yrDqEAjGdIDD/YYG09aRl7L7vYd10wgPkMlcoNfdvtFhjCXJBAeyO2S5gLQuFo25bEIxjCCt8oN2Z46I+Mu4A4SbjwojQBi1+BDl5LP+JNYlhtQRmPsjjQN1ILldwY7JTXOuD9bWL/jxO8dFy7oL9TyMcIu/PeSghxlLduQUA9jwPXiAk98HLw5jFiaFfAEjRLImPR0qi7z+2VmArZ7zzqcDAS01ljCKqf7QSjxb7jKkIhTohu6rOCq64RjsNiFEo7x7ocSNMvlddhPWb0CQ6gAAw4HKZpKGFDcWhzSEG6kbQCm4dLbi9m+XlpBTHea2D31zTSNtxrAGMNdcP5FPuxfhlKdCHgASUJxcd7zUcobkAPXvkzWGyf7uVCt2M2DtkMljaHSxu92WWLAz8OjWsD+juD/4tzcpqBSh3yQrmwoNFFMZNuDB7bJRsp/hzMMQqeT+NQ96KtNEBK+SG+23XgHgUyy8FPjpPozy3M4sZwh1/nLRMOK26Mn50Z5IHjA6XkBugJSn1XHkeBbK8dJsxsl0jMEOUpm0o9+gkX+7+TI0E+0x6Hsk0ijyNYQ/4OAqWn2aF+5cLxEoRq6idqtyEPtFhp/XyMNI2p9ADFUc/iYL5h7YzEXEEyptj04mvVHxkGP4F8MS4sWDsqRr4DbyGZRiIcqCKtpRMYeTMcpVVAFewqMVPSjUkMVQTBp6BPVKeiTqN65E0qP1AvIArWC98qcQsms39oDeBEtoXFKFgLbQ76ZKiXiRH2E01UF9Go+kGDh32/LWHZAD2OQ7mGdLO4ndrqWaHZyNyD6XJUWEq6yIQqReOweCe49ivD2DNUIutjJgXpHwyUtyPbY/IMWehfBA0IZxQSQoW9rKXL+ltq0oKqYC+RB6yLKys4xEw/Idde5R02cTGOcgh1LSNnid+nihIqcN0tr48MhL89L2uoG+Dqv5Px/IwqAhkqnEi296M1OyLPqVCgdKhcuKNjlUnQL4X78cRk1E1JlMkBME1sFE0gRrRJZGs3iT44bRZP5z0wQJHzIZMMbpztN1t+FDhsMBe0YNfatimHDetgLGiZGkYapqPwYt6YIAWPDYI9fSrETfjkwwSFT2EVrV/USY+r+/GGNp2I7zoW/gdR9aOdZ/lPGgAAAABJRU5ErkJggg==", + ], + nativeCurrency: { + name: "tRBTC", + symbol: "tRBTC", + decimals: 18 + }, + blockExplorerUrls: [ + "https://explorer.testnet.rootstock.io/" + ] + } +} \ No newline at end of file diff --git a/src/store/ether.ts b/src/store/ether.ts index de98fa1..a6308dd 100644 --- a/src/store/ether.ts +++ b/src/store/ether.ts @@ -33,7 +33,7 @@ export const useEtherStore = defineStore("ether", { this.selectedToken = token; }, setNetworkName(networkName: NetworkEnum) { - this.networkName = networkName; + this.networkName = Number(networkName); }, setLoadingLock(isLoadingLock: boolean) { this.loadingLock = isLoadingLock;