Compare commits

...

4 Commits

Author SHA1 Message Date
hueso
fd61376b36 fixed locks filter
Some checks are pending
Deploy FrontEnd / deploy-staging (push) Waiting to run
Deploy FrontEnd / deploy-production (push) Waiting to run
CI script / lint (push) Waiting to run
CI script / build (push) Waiting to run
CI script / SonarCloud (push) Waiting to run
2024-10-09 22:05:25 -03:00
hueso
42fcae0465 add RPC to wallet on unrecognized chains 2024-10-09 21:56:33 -03:00
hueso
e483fd537c refactored network and token selection 2024-10-09 21:52:59 -03:00
hueso
1f003f19bc updated types for new ABI 2024-10-09 20:45:14 -03:00
11 changed files with 119 additions and 116 deletions

View File

@ -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);
});
});

View File

@ -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,
};

View File

@ -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,18 +70,23 @@ const listenToNetworkChange = (connection: any) => {
});
};
const requestNetworkChange = async (network: string): Promise<boolean> => {
const requestNetworkChange = async (network: NetworkEnum): Promise<boolean> => {
const etherStore = useEtherStore();
if (!etherStore.walletAddress) return true;
const window_ = window as any;
try {
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;
} catch (e:any){
if (e.code == 4902){ // Unrecognized chain ID
await window_.ethereum.request({
"method": "wallet_addEthereumChain",
"params": [ Networks[network] ],
});
}
}
return true;

View File

@ -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<void> => {
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),
@ -172,10 +172,7 @@ const listLockTransactionBySellerAddress = async (
const eventsReleasedLocks = await p2pContract.queryFilter(filterAddedLocks);
return eventsReleasedLocks.filter((lock) =>
lock.args?.seller
.toHexString()
.substring(3)
.includes(sellerAddress.substring(2).toLowerCase())
lock.args?.seller.toLowerCase() == sellerAddress.toLowerCase()
);
};

View File

@ -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, () => {
>
<img
alt="Choosed network image"
:src="getNetworkImage(etherStore.networkName)"
:src="getNetworkImage(NetworkEnum[etherStore.networkName])"
height="24"
width="24"
/>
@ -241,7 +242,7 @@ onClickOutside(infoMenuRef, () => {
: 'rgb(249 250 251)',
}"
>
{{ etherStore.networkName }}
{{ Networks[etherStore.networkName].chainName }}
</span>
<img
class="text-gray-900"
@ -267,18 +268,18 @@ onClickOutside(infoMenuRef, () => {
<div class="mt-2">
<div class="bg-white rounded-md z-10">
<div
v-for="network in NetworkEnum"
v-for="(chainData, network) in Networks"
class="menu-button gap-2 px-4 rounded-md cursor-pointer"
@click="networkChange(network)"
>
<img
:alt="network + ' image'"
:alt="chainData.chainName + ' image'"
width="20"
height="20"
:src="getNetworkImage(network)"
:src="getNetworkImage(NetworkEnum[network])"
/>
<span class="text-gray-900 py-4 text-end font-semibold text-sm">
{{ network }}
{{ chainData.chainName }}
</span>
</div>
<div class="w-full flex justify-center">
@ -455,18 +456,18 @@ onClickOutside(infoMenuRef, () => {
<div class="pl-4 mt-2 h-full">
<div class="bg-white rounded-md z-10 h-full">
<div
v-for="network in NetworkEnum"
v-for="(chainData, network) in Networks"
class="menu-button gap-2 sm:px-4 rounded-md cursor-pointer py-2"
@click="networkChange(network)"
>
<img
:alt="network + 'image'"
:alt="chainData.chainName + 'image'"
width="20"
height="20"
:src="getNetworkImage(network)"
:src="getNetworkImage(NetworkEnum[network])"
/>
<span class="text-gray-900 py-4 text-end font-bold text-sm">
{{ network }}
{{ chainData.chainName }}
</span>
</div>
</div>

View File

@ -1,7 +1,7 @@
export enum NetworkEnum {
ethereum = "Ethereum",
polygon = "Polygon",
rootstock = "Rootstock",
ethereum = 11155111,
polygon = 80001,
rootstock = 31,
}
export enum TokenEnum {

41
src/model/Networks.ts Normal file
View File

@ -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/"
]
}
}

View File

@ -3,6 +3,6 @@ export type ValidDeposit = {
blockNumber: number;
remaining: number;
seller: string;
pixKey: number;
pixKey: string;
open?: boolean;
};

View File

@ -6,34 +6,34 @@ export const MockValidDeposits: ValidDeposit[] = [
token: "1",
remaining: 70,
seller: "mockedSellerAddress",
pixKey: 123456789,
pixKey: "123456789",
},
{
blockNumber: 2,
token: "2",
remaining: 200,
seller: "mockedSellerAddress",
pixKey: 123456789,
pixKey: "123456789",
},
{
blockNumber: 3,
token: "3",
remaining: 1250,
seller: "mockedSellerAddress",
pixKey: 123456789,
pixKey: "123456789",
},
{
blockNumber: 4,
token: "4",
remaining: 4000,
seller: "mockedSellerAddress",
pixKey: 123456789,
pixKey: "123456789",
},
{
blockNumber: 5,
token: "5",
remaining: 2000,
seller: "mockedSellerAddress",
pixKey: 123456789,
pixKey: "123456789",
},
];

View File

@ -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;

View File

@ -25,7 +25,7 @@ etherStore.setSellerView(false);
// States
const { loadingLock, walletAddress, networkName } = storeToRefs(etherStore);
const flowStep = ref<Step>(Step.Search);
const pixTarget = ref<number>();
const pixTarget = ref<string>();
const tokenAmount = ref<number>();
const lockID = ref<string>("");
const loadingRelease = ref<boolean>(false);