12 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
hueso
4b4b5af550 update contract ABI
Some checks failed
Deploy FrontEnd / deploy-staging (push) Has been cancelled
Deploy FrontEnd / deploy-production (push) Has been cancelled
CI script / lint (push) Has been cancelled
CI script / build (push) Has been cancelled
CI script / SonarCloud (push) Has been cancelled
2024-10-06 20:23:28 -03:00
hueso
659cc34d68 token selection chevron 2024-08-30 14:20:35 -03:00
hueso
814e6a4eac add Rootstock tests
Some checks failed
Deploy FrontEnd / deploy-staging (push) Has been cancelled
Deploy FrontEnd / deploy-production (push) Has been cancelled
CI script / lint (push) Has been cancelled
CI script / build (push) Has been cancelled
CI script / SonarCloud (push) Has been cancelled
2024-08-29 22:22:04 -03:00
Filipe Soccol
f15361599f Added different types of tokens. 2024-08-07 14:09:23 -03:00
hueso
0a51a80e0c Discord -> LinkedIn
Some checks failed
Deploy FrontEnd / deploy-staging (push) Has been cancelled
Deploy FrontEnd / deploy-production (push) Has been cancelled
CI script / lint (push) Has been cancelled
CI script / build (push) Has been cancelled
CI script / SonarCloud (push) Has been cancelled
2024-07-31 13:08:00 -03:00
hueso
8ad42cc0f2 background optimization 2024-07-31 13:07:40 -03:00
hueso
ae60edd324 Network selection overhaul 2024-07-31 12:32:44 -03:00
hueso
fbe32e78ab Görli -> Sepolia
Some checks failed
Deploy FrontEnd / deploy-staging (push) Has been cancelled
Deploy FrontEnd / deploy-production (push) Has been cancelled
CI script / lint (push) Has been cancelled
CI script / build (push) Has been cancelled
CI script / SonarCloud (push) Has been cancelled
2024-07-18 19:37:39 -03:00
28 changed files with 635 additions and 503 deletions

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 1.0 MiB

1
src/assets/brx.svg Normal file
View File

@@ -0,0 +1 @@
<svg height="32" viewBox="0 0 32 32" width="32" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><circle cx="16" cy="16" fill="#efb914" fill-rule="nonzero" r="16"/><path d="M21.002 9.855A7.947 7.947 0 0124 15.278l-2.847-.708a5.357 5.357 0 00-3.86-3.667c-2.866-.713-5.76.991-6.465 3.806s1.05 5.675 3.917 6.388a5.373 5.373 0 005.134-1.43l2.847.707a7.974 7.974 0 01-5.2 3.385L16.716 27l-2.596-.645.644-2.575a8.28 8.28 0 01-1.298-.323l-.643 2.575-2.596-.646.81-3.241c-2.378-1.875-3.575-4.996-2.804-8.081s3.297-5.281 6.28-5.823L15.323 5l2.596.645-.644 2.575a8.28 8.28 0 011.298.323l.643-2.575 2.596.646z" fill="#fff"/></g></svg>

After

Width:  |  Height:  |  Size: 644 B

View File

@@ -0,0 +1 @@
<?xml version="1.0"?><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"> <path d="M41,4H9C6.24,4,4,6.24,4,9v32c0,2.76,2.24,5,5,5h32c2.76,0,5-2.24,5-5V9C46,6.24,43.76,4,41,4z M17,20v19h-6V20H17z M11,14.47c0-1.4,1.2-2.47,3-2.47s2.93,1.07,3,2.47c0,1.4-1.12,2.53-3,2.53C12.2,17,11,15.87,11,14.47z M39,39h-6c0,0,0-9.26,0-10 c0-2-1-4-3.5-4.04h-0.08C27,24.96,26,27.02,26,29c0,0.91,0,10,0,10h-6V20h6v2.56c0,0,1.93-2.56,5.81-2.56 c3.97,0,7.19,2.73,7.19,8.26V39z"/></svg>

After

Width:  |  Height:  |  Size: 501 B

View File

@@ -9,8 +9,7 @@
padding: 2rem;
height: fit-content;
min-height: 100vh;
background-image: url( './bg.svg' );
background-size: cover;
background: radial-gradient(ellipse at 50% -50%, rgba(49, 46, 129, 1) 60%, rgba(24, 30, 42, 1) 80%);
font-weight: normal;
}

View File

@@ -4,12 +4,10 @@ import {
getP2PixAddress,
getProviderUrl,
isPossibleNetwork,
possibleChains,
network2Chain,
} from "../addresses";
import { setActivePinia, createPinia } from "pinia";
import { NetworkEnum } from "@/model/NetworkEnum";
import { NetworkEnum, TokenEnum } from "@/model/NetworkEnum";
import { useEtherStore } from "@/store/ether";
describe("addresses.ts types", () => {
@@ -18,9 +16,6 @@ describe("addresses.ts types", () => {
expectTypeOf(getP2PixAddress).toBeFunction();
expectTypeOf(getProviderUrl).toBeFunction();
expectTypeOf(isPossibleNetwork).toBeFunction();
expectTypeOf(possibleChains).toBeObject();
expectTypeOf(network2Chain).toBeObject();
});
});
@@ -32,7 +27,7 @@ describe("addresses.ts functions", () => {
it("getTokenAddress Ethereum", () => {
const etherStore = useEtherStore();
etherStore.setNetworkName(NetworkEnum.ethereum);
expect(getTokenAddress()).toBe(
expect(getTokenAddress(TokenEnum.BRZ)).toBe(
"0x4A2886EAEc931e04297ed336Cc55c4eb7C75BA00"
);
});
@@ -40,13 +35,22 @@ describe("addresses.ts functions", () => {
it("getTokenAddress Polygon", () => {
const etherStore = useEtherStore();
etherStore.setNetworkName(NetworkEnum.polygon);
expect(getTokenAddress()).toBe(
expect(getTokenAddress(TokenEnum.BRZ)).toBe(
"0xC86042E9F2977C62Da8c9dDF7F9c40fde4796A29"
);
});
it("getTokenAddress Rootstock", () => {
const etherStore = useEtherStore();
etherStore.setNetworkName(NetworkEnum.rootstock);
expect(getTokenAddress(TokenEnum.BRZ)).toBe(
"0xfE841c74250e57640390f46d914C88d22C51e82e"
);
});
it("getTokenAddress Default", () => {
expect(getTokenAddress()).toBe(
expect(getTokenAddress(TokenEnum.BRZ)).toBe(
"0x4A2886EAEc931e04297ed336Cc55c4eb7C75BA00"
);
});
@@ -67,6 +71,14 @@ describe("addresses.ts functions", () => {
);
});
it("getP2PixAddress Rootstock", () => {
const etherStore = useEtherStore();
etherStore.setNetworkName(NetworkEnum.rootstock);
expect(getP2PixAddress()).toBe(
"0x98ba35eb14b38D6Aa709338283af3e922476dE34"
);
});
it("getP2PixAddress Default", () => {
expect(getP2PixAddress()).toBe(
"0x2414817FF64A114d91eCFA16a834d3fCf69103d4"
@@ -85,6 +97,12 @@ describe("addresses.ts functions", () => {
expect(getProviderUrl()).toBe(import.meta.env.VITE_MUMBAI_API_URL);
});
it("getProviderUrl Rootstock", () => {
const etherStore = useEtherStore();
etherStore.setNetworkName(NetworkEnum.rootstock);
expect(getProviderUrl()).toBe(import.meta.env.VITE_ROOTSTOCK_API_URL);
});
it("getProviderUrl Default", () => {
expect(getProviderUrl()).toBe(import.meta.env.VITE_GOERLI_API_URL);
});
@@ -92,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,25 +1,44 @@
import { useEtherStore } from "@/store/ether";
import { NetworkEnum } from "@/model/NetworkEnum";
import { NetworkEnum, TokenEnum } from "@/model/NetworkEnum";
const getTokenAddress = (network?: NetworkEnum): string => {
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 ( 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]: string } = {
Ethereum: "0x4A2886EAEc931e04297ed336Cc55c4eb7C75BA00",
Polygon: "0xC86042E9F2977C62Da8c9dDF7F9c40fde4796A29",
Rootstock: "0xfE841c74250e57640390f46d914C88d22C51e82e",
};
return possibleTokenAddresses[network ? network : etherStore.networkName];
return Tokens[network ? network : etherStore.networkName][token];
};
const getP2PixAddress = (network?: NetworkEnum): string => {
const etherStore = useEtherStore();
const possibleP2PixAddresses: { [key: string]: string } = {
Ethereum: "0x2414817FF64A114d91eCFA16a834d3fCf69103d4",
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];
@@ -27,43 +46,22 @@ const getP2PixAddress = (network?: NetworkEnum): string => {
const getProviderUrl = (): string => {
const etherStore = useEtherStore();
const possibleProvidersUrls: { [key: string]: string } = {
Ethereum: import.meta.env.VITE_GOERLI_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 } = {
"0x5": NetworkEnum.ethereum,
"5": NetworkEnum.ethereum,
"0x13881": NetworkEnum.polygon,
"80001": NetworkEnum.polygon,
"31": NetworkEnum.rootstock,
};
const network2Chain: { [key: string]: string } = {
Ethereum: "0x5",
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

@@ -7,6 +7,7 @@ import p2pix from "@/utils/smart_contract_files/P2PIX.json";
import { BigNumber, ethers } from "ethers";
import { parseEther } from "ethers/lib/utils";
import type { TokenEnum } from "@/model/NetworkEnum";
const addLock = async (
seller: string,
@@ -20,9 +21,6 @@ const addLock = async (
const lock = await p2pContract.lock(
seller,
token,
etherStore.walletAddress, // String "0x70997970C51812dc3A010C7d01b50e0d17dc79C8" (Example)
ethers.constants.AddressZero, // String "0x0000000000000000000000000000000000000000"
0,
parseEther(String(amount)), // BigNumber
[],
[]
@@ -35,7 +33,7 @@ const addLock = async (
};
const releaseLock = async (
pixKey: number,
pixKey: string,
amount: number,
e2eId: string,
lockId: string
@@ -45,7 +43,7 @@ const releaseLock = async (
);
const messageToSign = ethers.utils.solidityKeccak256(
["uint160", "uint256", "bytes32"],
["bytes32", "uint256", "bytes32"],
[
pixKey,
parseEther(String(amount)),
@@ -64,11 +62,8 @@ const releaseLock = async (
const release = await p2pContract.release(
BigNumber.from(lockId),
ethers.constants.AddressZero,
ethers.utils.formatBytes32String(e2eId),
sig.r,
sig.s,
sig.v
flatSig
);
await release.wait();
@@ -84,11 +79,11 @@ const cancelDeposit = async (depositId: BigNumber): Promise<any> => {
return cancel;
};
const withdrawDeposit = async (amount: string): Promise<any> => {
const withdrawDeposit = async (amount: string, token: TokenEnum): Promise<any> => {
const contract = getContract();
const withdraw = await contract.withdraw(
getTokenAddress(),
getTokenAddress(token),
parseEther(String(amount)),
[]
);

View File

@@ -12,11 +12,10 @@ import type { Pix } from "@/model/Pix";
const getNetworksLiquidity = async (): Promise<void> => {
const etherStore = useEtherStore();
const goerliProvider = new ethers.providers.JsonRpcProvider(
import.meta.env.VITE_GOERLI_API_URL,
5
); // goerli provider
const sepoliaProvider = new ethers.providers.JsonRpcProvider(
import.meta.env.VITE_SEPOLIA_API_URL,
11155111
); // sepolia provider
const mumbaiProvider = new ethers.providers.JsonRpcProvider(
import.meta.env.VITE_MUMBAI_API_URL,
80001
@@ -26,17 +25,16 @@ const getNetworksLiquidity = async (): Promise<void> => {
31
); // rootstock provider
const p2pContractGoerli = new ethers.Contract(
const p2pContractSepolia = new ethers.Contract(
getP2PixAddress(NetworkEnum.ethereum),
p2pix.abi,
goerliProvider
sepoliaProvider
);
const p2pContractMumbai = new ethers.Contract(
getP2PixAddress(NetworkEnum.polygon),
p2pix.abi,
mumbaiProvider
);
const p2pContractRootstock = new ethers.Contract(
getP2PixAddress(NetworkEnum.rootstock),
p2pix.abi,
@@ -44,22 +42,22 @@ const getNetworksLiquidity = async (): Promise<void> => {
);
etherStore.setLoadingNetworkLiquidity(true);
const depositListGoerli = await getValidDeposits(
getTokenAddress(NetworkEnum.ethereum),
p2pContractGoerli
);
const depositListMumbai = await getValidDeposits(
getTokenAddress(NetworkEnum.polygon),
p2pContractMumbai
const depositListSepolia = await getValidDeposits(
getTokenAddress(etherStore.selectedToken, NetworkEnum.ethereum),
p2pContractSepolia
);
etherStore.setDepositsValidListGoerli(depositListGoerli);
// const depositListMumbai = await getValidDeposits(
// getTokenAddress(etherStore.selectedToken, NetworkEnum.polygon),
// p2pContractMumbai
// );
const depositListRootstock = await getValidDeposits(
getTokenAddress(NetworkEnum.rootstock),
getTokenAddress(etherStore.selectedToken, NetworkEnum.rootstock),
p2pContractRootstock
);
etherStore.setDepositsValidListMumbai(depositListMumbai);
etherStore.setDepositsValidListSepolia(depositListSepolia);
// etherStore.setDepositsValidListMumbai(depositListMumbai);
etherStore.setDepositsValidListRootstock(depositListRootstock);
etherStore.setLoadingNetworkLiquidity(false);
};
@@ -105,7 +103,7 @@ const getValidDeposits = async (
blockNumber: deposit.blockNumber,
remaining: Number(formatEther(mappedBalance._hex)),
seller: deposit.args?.seller,
pixKey: Number(mappedPixTarget._hex),
pixKey: mappedPixTarget,
};
}
@@ -129,7 +127,7 @@ const getUnreleasedLockById = async (
const pixTarget = lock.pixTarget;
const amount = formatEther(lock?.amount);
pixData.pixKey = String(Number(pixTarget));
pixData.pixKey = pixTarget;
pixData.value = Number(amount);
return {

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

@@ -5,13 +5,15 @@ import { parseEther } from "ethers/lib/utils";
import { ethers } from "ethers";
import mockToken from "../utils/smart_contract_files/MockToken.json";
import { useEtherStore } from "@/store/ether";
const approveTokens = async (tokenQty: string): Promise<any> => {
const provider = getProvider();
const signer = provider.getSigner();
const etherStore = useEtherStore();
const tokenContract = new ethers.Contract(
getTokenAddress(),
getTokenAddress(etherStore.selectedToken),
mockToken.abi,
signer
);
@@ -27,13 +29,14 @@ const approveTokens = async (tokenQty: string): Promise<any> => {
const addDeposit = async (tokenQty: string, pixKey: string): Promise<any> => {
const p2pContract = getContract();
const etherStore = useEtherStore();
const deposit = await p2pContract.deposit(
getTokenAddress(),
parseEther(tokenQty),
pixKey,
true,
ethers.utils.formatBytes32String("")
ethers.utils.formatBytes32String(""),
getTokenAddress(etherStore.selectedToken),
parseEther(tokenQty),
true
);
await deposit.wait();

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,14 +21,14 @@ const updateWalletStatus = async (): Promise<void> => {
const signer = provider.getSigner();
const { chainId } = await provider.getNetwork();
if(!isPossibleNetwork(chainId.toString())){
window.alert("Invalid chain!:"+chainId);
if (!isPossibleNetwork(chainId)) {
window.alert("Invalid chain!:" + chainId);
return;
}
etherStore.setNetworkName(possibleChains[chainId]);
etherStore.setNetworkName(chainId);
const mockTokenContract = new ethers.Contract(
getTokenAddress(),
getTokenAddress(etherStore.selectedToken),
mockToken.abi,
signer
);
@@ -43,7 +43,8 @@ const updateWalletStatus = async (): Promise<void> => {
const listValidDepositTransactionsByWalletAddress = async (
walletAddress: string
): Promise<ValidDeposit[]> => {
const walletDeposits = await getValidDeposits(getTokenAddress());
const etherStore = useEtherStore();
const walletDeposits = await getValidDeposits(getTokenAddress(etherStore.selectedToken));
if (walletDeposits) {
return walletDeposits
@@ -171,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()
);
};
@@ -200,7 +198,7 @@ const checkUnreleasedLock = async (
const pixTarget = lock.pixTarget;
const amount = formatEther(lock?.amount);
pixData.pixKey = String(Number(pixTarget));
pixData.pixKey = pixTarget;
pixData.value = Number(amount);
return {

View File

@@ -54,7 +54,7 @@ const getWalletTransactions = async () => {
const callWithdraw = async (amount: string) => {
if (amount) {
etherStore.setLoadingWalletTransactions(true);
const withdraw = await withdrawDeposit(amount);
const withdraw = await withdrawDeposit(amount, etherStore.selectedToken);
if (withdraw) {
console.log("Saque realizado!");
await getWalletTransactions();
@@ -92,13 +92,15 @@ onMounted(async () => {
>
<div>
<p>Tokens recebidos</p>
<p class="text-2xl text-gray-900">{{ props.tokenAmount }} BRZ</p>
<p class="text-2xl text-gray-900">
{{ props.tokenAmount }} {{ etherStore.selectedToken }}
</p>
</div>
<div class="my-5">
<p class="text-sm">
<b>Não encontrou os tokens? </b><br />Clique no botão abaixo para
<br />
cadastrar o BRZ em sua carteira.
cadastrar o {{ etherStore.selectedToken }} em sua carteira.
</p>
</div>
<CustomButton :text="'Cadastrar token'" @buttonClicked="() => {}" />

View File

@@ -9,6 +9,7 @@ import { ref, watch, onMounted } from "vue";
import SpinnerComponent from "../SpinnerComponent.vue";
import { decimalCount } from "@/utils/decimalCount";
import { debounce } from "@/utils/debounce";
import { getTokenByAddress } from "@/blockchain/addresses";
import { useFloating, arrow, offset, flip, shift } from "@floating-ui/vue";
const etherStore = useEtherStore();
@@ -107,7 +108,7 @@ const showInitialItems = (): void => {
const openEtherscanUrl = (transactionHash: string): void => {
const networkUrl =
etherStore.networkName == NetworkEnum.ethereum
? "goerli.etherscan.io"
? "sepolia.etherscan.io"
: "mumbai.polygonscan.com";
const url = `https://${networkUrl}/tx/${transactionHash}`;
window.open(url, "_blank");
@@ -175,11 +176,13 @@ showInitialItems();
Saldo disponível
</p>
<p class="text-xl leading-7 font-semibold text-gray-900">
{{ getRemaining() }} BRZ
{{ getRemaining() }} {{ etherStore.selectedToken }}
</p>
<div class="flex gap-2 w-32 sm:w-56" v-if="activeLockAmount != 0">
<span class="text-xs font-normal text-gray-400" ref="infoText">{{
`com ${activeLockAmount.toFixed(2)} BRZ em lock`
`com ${activeLockAmount.toFixed(2)} ${
etherStore.selectedToken
} em lock`
}}</span>
<div
class="absolute mt-[2px] md-view"
@@ -282,7 +285,7 @@ showInitialItems();
class="text-xl sm:text-xl leading-7 font-semibold text-gray-900"
>
{{ item.amount }}
BRZ
{{ getTokenByAddress(item.token) }}
</span>
</div>
<div>

View File

@@ -10,14 +10,19 @@ import { NetworkEnum } from "@/model/NetworkEnum";
import type { ValidDeposit } from "@/model/ValidDeposit";
import { decimalCount } from "@/utils/decimalCount";
import SpinnerComponent from "./SpinnerComponent.vue";
import { getTokenImage } from "@/utils/imagesPath";
import { TokenEnum } from "@/model/NetworkEnum";
// Store reference
const etherStore = useEtherStore();
const selectTokenToggle = ref<boolean>(false);
const {
walletAddress,
networkName,
depositsValidListGoerli,
selectedToken,
depositsValidListSepolia,
depositsValidListMumbai,
loadingNetworkLiquidity,
} = storeToRefs(etherStore);
@@ -28,7 +33,7 @@ const enableConfirmButton = ref<boolean>(false);
const enableWalletButton = ref<boolean>(false);
const hasLiquidity = ref<boolean>(true);
const validDecimals = ref<boolean>(true);
const selectedGoerliDeposit = ref<ValidDeposit>();
const selectedSepoliaDeposit = ref<ValidDeposit>();
const selectedMumbaiDeposit = ref<ValidDeposit>();
const selectedRootstockDeposit = ref<ValidDeposit>();
@@ -45,7 +50,7 @@ const connectAccount = async (): Promise<void> => {
const emitConfirmButton = (): void => {
const selectedDeposit =
networkName.value == NetworkEnum.ethereum
? selectedGoerliDeposit.value
? selectedSepoliaDeposit.value
: selectedMumbaiDeposit.value;
emit("tokenBuy", selectedDeposit, tokenValue.value);
};
@@ -66,10 +71,19 @@ const handleInputEvent = (event: any): void => {
verifyLiquidity();
};
const openTokenSelection = (): void => {
selectTokenToggle.value = true;
};
const handleSelectedToken = (token: TokenEnum): void => {
etherStore.setSelectedToken(token);
selectTokenToggle.value = false;
};
// Verify if there is a valid deposit to buy
const verifyLiquidity = (): void => {
enableConfirmButton.value = false;
selectedGoerliDeposit.value = undefined;
selectedSepoliaDeposit.value = undefined;
selectedMumbaiDeposit.value = undefined;
selectedRootstockDeposit.value = undefined;
@@ -78,10 +92,10 @@ const verifyLiquidity = (): void => {
return;
}
selectedGoerliDeposit.value = verifyNetworkLiquidity(
selectedSepoliaDeposit.value = verifyNetworkLiquidity(
tokenValue.value,
walletAddress.value,
depositsValidListGoerli.value
depositsValidListSepolia.value
);
selectedMumbaiDeposit.value = verifyNetworkLiquidity(
tokenValue.value,
@@ -90,7 +104,7 @@ const verifyLiquidity = (): void => {
);
enableOrDisableConfirmButton();
if (selectedGoerliDeposit.value || selectedMumbaiDeposit.value) {
if (selectedSepoliaDeposit.value || selectedMumbaiDeposit.value) {
hasLiquidity.value = true;
enableWalletButton.value = true;
} else {
@@ -100,7 +114,7 @@ const verifyLiquidity = (): void => {
};
const enableOrDisableConfirmButton = (): void => {
if (selectedGoerliDeposit.value && networkName.value == NetworkEnum.ethereum)
if (selectedSepoliaDeposit.value && networkName.value == NetworkEnum.ethereum)
enableConfirmButton.value = true;
else if (
selectedMumbaiDeposit.value &&
@@ -150,20 +164,54 @@ watch(walletAddress, (): void => {
placeholder="0 "
step=".01"
/>
<div
class="flex flex-row p-2 px-3 bg-gray-300 rounded-3xl min-w-fit gap-1"
>
<img
alt="Token image"
class="sm:w-fit w-4"
src="@/assets/brz.svg"
/>
<span class="text-gray-900 sm:text-lg text-md w-fit" id="brz"
>BRZ</span
<div class="relative">
<button
class="flex flex-row p-2 px-3 bg-gray-300 rounded-3xl min-w-fit gap-1"
@click="openTokenSelection()"
>
<img
class="text-gray-900"
alt="Chevron Down"
src="@/assets/chevronDownBlack.svg"
/>
<img
alt="Token image"
class="sm:w-fit w-4"
:src="getTokenImage(selectedToken)"
/>
<span class="text-gray-900 sm:text-lg text-md w-fit" id="token">{{
selectedToken
}}</span>
</button>
<div
v-if="selectTokenToggle"
class="mt-2 w-[100px] text-gray-900 lg-view absolute"
>
<div class="bg-white rounded-md z-10">
<div
v-for="token in TokenEnum"
class="flex menu-button gap-2 px-4 rounded-md cursor-pointer hover:bg-gray-300"
@click="handleSelectedToken(token)"
>
<img
:alt="token + ' logo'"
width="20"
height="20"
:src="getTokenImage(token)"
/>
<span
class="text-gray-900 py-4 text-end font-semibold text-sm"
>
{{ token }}
</span>
</div>
<div class="w-full flex justify-center">
<hr class="w-4/5" />
</div>
</div>
</div>
</div>
</div>
<div class="custom-divide py-2 mb-2"></div>
<div
class="flex justify-between"
@@ -185,7 +233,7 @@ watch(walletAddress, (): void => {
src="@/assets/ethereum.svg"
width="24"
height="24"
v-if="selectedGoerliDeposit"
v-if="selectedSepoliaDeposit"
/>
</div>
</div>

View File

@@ -4,6 +4,13 @@ import CustomButton from "@/components/CustomButton/CustomButton.vue";
import { debounce } from "@/utils/debounce";
import { decimalCount } from "@/utils/decimalCount";
import { TokenEnum } from "@/model/NetworkEnum";
import { useEtherStore } from "@/store/ether";
import { getTokenImage } from "@/utils/imagesPath";
// Store
const etherStore = useEtherStore();
// Reactive state
const tokenValue = ref<number>(0);
const enableSelectButton = ref<boolean>(false);
@@ -58,8 +65,14 @@ const handleInputEvent = (event: any): void => {
<div
class="flex flex-row p-2 px-3 bg-gray-300 rounded-3xl min-w-fit gap-1"
>
<img alt="Token image" class="w-fit" src="@/assets/brz.svg" />
<span class="text-gray-900 text-lg w-fit" id="brz">BRZ</span>
<img
alt="Token image"
class="w-fit"
:src="getTokenImage(etherStore.selectedToken)"
/>
<span class="text-gray-900 text-lg w-fit" id="token">{{
etherStore.selectedToken
}}</span>
</div>
</div>
@@ -94,6 +107,7 @@ const handleInputEvent = (event: any): void => {
>
</div>
</div>
<CustomButton
:text="'Conectar carteira'"
@buttonClicked="emit('tokenBuy')"

View File

@@ -8,6 +8,7 @@ const emit = defineEmits(["sendNetwork"]);
const props = defineProps({
pixKey: String,
offer: Number,
selectedToken: String,
});
</script>
@@ -31,7 +32,9 @@ const props = defineProps({
>
<div>
<p>Tokens ofertados</p>
<p class="text-2xl text-gray-900">{{ props.offer }} BRZ</p>
<p class="text-2xl text-gray-900">
{{ props.offer }} {{ props.selectedToken }}
</p>
</div>
<div class="my-3">
<p>Chave Pix</p>

View File

@@ -7,13 +7,16 @@ import { pixFormatValidation, postProcessKey } from "@/utils/pixKeyFormat";
import { useEtherStore } from "@/store/ether";
import { storeToRefs } from "pinia";
import { connectProvider } from "@/blockchain/provider";
import { TokenEnum } from "@/model/NetworkEnum";
import { getTokenImage } from "@/utils/imagesPath";
// Reactive state
const etherStore = useEtherStore();
const { walletAddress } = storeToRefs(etherStore);
const { walletAddress, selectedToken } = storeToRefs(etherStore);
const offer = ref<string>("");
const pixKey = ref<string>("");
const selectTokenToggle = ref<boolean>(false);
const enableSelectButton = ref<boolean>(false);
const hasLiquidity = ref<boolean>(true);
@@ -52,6 +55,15 @@ const handlePixKeyInputEvent = (event: any): void => {
validPixFormat.value = false;
};
const openTokenSelection = (): void => {
selectTokenToggle.value = true;
};
const handleSelectedToken = (token: TokenEnum): void => {
etherStore.setSelectedToken(token);
selectTokenToggle.value = false;
};
const handleButtonClick = async (
offer: string,
pixKey: string
@@ -94,15 +106,47 @@ const handleButtonClick = async (
placeholder="Digite sua oferta"
step=".01"
/>
<div
class="flex flex-row p-2 px-3 bg-gray-300 rounded-3xl min-w-fit gap-1"
>
<img
alt="Token image"
class="sm:w-fit w-4"
src="@/assets/brz.svg"
/>
<span class="text-gray-900 w-fit" id="brz"> BRZ </span>
<div class="relative">
<button
class="flex flex-row p-2 px-3 bg-gray-300 rounded-3xl min-w-fit gap-1"
@click="openTokenSelection()"
>
<img
alt="Token image"
class="sm:w-fit w-4"
:src="getTokenImage(selectedToken)"
/>
<span class="text-gray-900 sm:text-lg text-md w-fit" id="token">{{
selectedToken
}}</span>
</button>
<div
v-if="selectTokenToggle"
class="mt-2 w-[100px] text-gray-900 lg-view absolute"
>
<div class="bg-white rounded-md z-10">
<div
v-for="token in TokenEnum"
class="flex menu-button gap-2 px-4 rounded-md cursor-pointer hover:bg-gray-300"
@click="handleSelectedToken(token)"
>
<img
:alt="token + ' logo'"
width="20"
height="20"
:src="getTokenImage(token)"
/>
<span
class="text-gray-900 py-4 text-end font-semibold text-sm"
>
{{ token }}
</span>
</div>
<div class="w-full flex justify-center">
<hr class="w-4/5" />
</div>
</div>
</div>
</div>
</div>

View File

@@ -5,10 +5,8 @@ import { ref } from "vue";
import { onClickOutside } from "@vueuse/core";
import { NetworkEnum } from "@/model/NetworkEnum";
import { connectProvider, requestNetworkChange } from "@/blockchain/provider";
import ethereumImage from "@/assets/ethereum.svg";
import polygonImage from "@/assets/polygon.svg";
import rootstockImage from "@/assets/rootstock.svg";
import { getNetworkImage } from "@/utils/imagesPath";
import { Networks } from "@/model/Networks";
// Store reference
const etherStore = useEtherStore();
@@ -55,17 +53,6 @@ const networkChange = async (network: NetworkEnum): Promise<void> => {
if (change) etherStore.setNetworkName(network);
};
const getNetworkImage = (networkName: NetworkEnum): string => {
let validImages = {
Ethereum: ethereumImage,
Polygon: polygonImage,
Rootstock: rootstockImage,
Localhost: ethereumImage,
};
return validImages[networkName];
};
onClickOutside(walletAddressRef, () => {
menuHoverToggle.value = false;
menuOpenToggle.value = false;
@@ -134,32 +121,39 @@ onClickOutside(infoMenuRef, () => {
>
<div class="redirect_button flex mr-4">
<div class="mr-6">
<img
alt="Twitter"
width="20"
height="20"
src="@/assets/twitterIcon.svg"
class="cursor-pointer"
onclick="location.href = 'https://www.twitter.com/doiim';"
/>
<a href="https://www.twitter.com/doiim">
<img
alt="Twitter"
width="20"
height="20"
src="@/assets/twitterIcon.svg"
class="cursor-pointer"
/>
</a>
</div>
<div class="mr-6">
<img
alt="Discord"
width="20"
height="20"
src="@/assets/discordIcon.svg"
class="cursor-pointer"
/>
<a href="https://www.linkedin.com/company/doiim/">
<img
alt="LinkedIn"
width="20"
height="20"
src="@/assets/linkedinIcon.svg"
class="cursor-pointer"
href="https://www.linkedin.com/company/doiim/"
/>
</a>
</div>
<div class="mr-6">
<a href="https://www.github.com/doiim">
<img
alt="Github"
width="20"
height="20"
src="@/assets/githubIcon.svg"
class="cursor-pointer"
/>
</a>
</div>
<img
alt="Github"
width="20"
height="20"
src="@/assets/githubIcon.svg"
class="cursor-pointer"
onclick="location.href = 'https://github.com/doiim';"
/>
</div>
</div>
<div class="w-full flex justify-center">
@@ -234,7 +228,7 @@ onClickOutside(infoMenuRef, () => {
>
<img
alt="Choosed network image"
:src="getNetworkImage(etherStore.networkName)"
:src="getNetworkImage(NetworkEnum[etherStore.networkName])"
height="24"
width="24"
/>
@@ -248,7 +242,7 @@ onClickOutside(infoMenuRef, () => {
: 'rgb(249 250 251)',
}"
>
{{ etherStore.networkName }}
{{ Networks[etherStore.networkName].chainName }}
</span>
<img
class="text-gray-900"
@@ -274,51 +268,18 @@ onClickOutside(infoMenuRef, () => {
<div class="mt-2">
<div class="bg-white rounded-md z-10">
<div
v-for="(chainData, network) in Networks"
class="menu-button gap-2 px-4 rounded-md cursor-pointer"
@click="networkChange(NetworkEnum.rootstock)"
@click="networkChange(network)"
>
<img
alt="Rootstock image"
:alt="chainData.chainName + ' image'"
width="20"
height="20"
src="@/assets/rootstock.svg"
:src="getNetworkImage(NetworkEnum[network])"
/>
<span class="text-gray-900 py-4 text-end font-semibold text-sm">
Rootstock
</span>
</div>
<div class="w-full flex justify-center">
<hr class="w-4/5" />
</div>
<div
class="menu-button gap-2 px-4 rounded-md cursor-pointer"
@click="networkChange(NetworkEnum.ethereum)"
>
<img
alt="Ethereum image"
width="20"
height="20"
src="@/assets/ethereum.svg"
/>
<span class="text-gray-900 py-4 text-end font-semibold text-sm">
Ethereum
</span>
</div>
<div class="w-full flex justify-center">
<hr class="w-4/5" />
</div>
<div
class="menu-button gap-2 px-4 rounded-md cursor-pointer"
@click="networkChange(NetworkEnum.polygon)"
>
<img
alt="Polygon image"
width="20"
height="20"
src="@/assets/polygon.svg"
/>
<span class="text-gray-900 py-4 text-end font-semibold text-sm">
Polygon
{{ chainData.chainName }}
</span>
</div>
<div class="w-full flex justify-center">
@@ -456,28 +417,33 @@ onClickOutside(infoMenuRef, () => {
</div>
<div class="menu-button pb-10">
<div class="redirect_button flex">
<img
alt="Twitter"
width="20"
height="20"
src="@/assets/twitterIcon.svg"
class="mr-6"
onclick="location.href = 'https://www.twitter.com/doiim';"
/>
<img
alt="Discord"
width="20"
height="20"
src="@/assets/discordIcon.svg"
class="mr-6"
/>
<img
alt="Github"
width="20"
height="20"
src="@/assets/githubIcon.svg"
onclick="location.href = 'https://github.com/doiim';"
/>
<a href="https://www.twitter.com/doiim/">
<img
alt="Twitter"
width="20"
height="20"
src="@/assets/twitterIcon.svg"
class="mr-6"
onclick="location.href = 'https://www.twitter.com/doiim';"
/>
</a>
<a href="https://www.linkedin.com/company/doiim/">
<img
alt="LinkedIn"
width="20"
height="20"
src="@/assets/linkedinIcon.svg"
class="mr-6"
/>
</a>
<a href="https://github.com/doiim/">
<img
alt="Github"
width="20"
height="20"
src="@/assets/githubIcon.svg"
/>
</a>
</div>
</div>
</div>
@@ -490,56 +456,20 @@ onClickOutside(infoMenuRef, () => {
<div class="pl-4 mt-2 h-full">
<div class="bg-white rounded-md z-10 h-full">
<div
v-for="(chainData, network) in Networks"
class="menu-button gap-2 sm:px-4 rounded-md cursor-pointer py-2"
@click="networkChange(NetworkEnum.rootstock)"
@click="networkChange(network)"
>
<img
alt="Rootstock image"
:alt="chainData.chainName + 'image'"
width="20"
height="20"
src="@/assets/rootstock.svg"
:src="getNetworkImage(NetworkEnum[network])"
/>
<span class="text-gray-900 py-4 text-end font-bold text-sm">
Rootstock
{{ chainData.chainName }}
</span>
</div>
<div class="w-full flex justify-center pb-12">
<hr class="w-4/5" />
</div>
<div
class="menu-button gap-2 sm:px-4 rounded-md cursor-pointer py-2"
@click="networkChange(NetworkEnum.ethereum)"
>
<img
alt="Ethereum image"
width="20"
height="20"
src="@/assets/ethereum.svg"
/>
<span class="text-gray-900 py-4 text-end font-bold text-sm">
Ethereum
</span>
</div>
<div class="w-full flex justify-center">
<hr class="w-4/5" />
</div>
<div
class="menu-button gap-2 sm:px-4 rounded-md cursor-pointer py-2"
@click="networkChange(NetworkEnum.polygon)"
>
<img
alt="Polygon image"
width="20"
height="20"
src="@/assets/polygon.svg"
/>
<span class="text-gray-900 py-4 text-end font-bold text-sm">
Polygon
</span>
</div>
<div class="w-full flex justify-center pb-12">
<hr class="w-4/5" />
</div>
</div>
</div>
</div>

View File

@@ -1,5 +1,10 @@
export enum NetworkEnum {
ethereum = "Ethereum",
polygon = "Polygon",
rootstock = "Rootstock",
ethereum = 11155111,
polygon = 80001,
rootstock = 31,
}
export enum TokenEnum {
BRZ = 'BRZ',
BRX = 'BRX'
}

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

@@ -1,16 +1,20 @@
import { NetworkEnum } from "@/model/NetworkEnum";
import { NetworkEnum, TokenEnum } from "../model/NetworkEnum";
import type { ValidDeposit } from "@/model/ValidDeposit";
import { defineStore } from "pinia";
export const useEtherStore = defineStore("ether", {
state: () => ({
walletAddress: "",
balance: "",
networkName: NetworkEnum.ethereum,
selectedToken: TokenEnum.BRZ,
loadingLock: false,
sellerView: false,
// Depósitos válidos para compra GOERLI
depositsValidListGoerli: [] as ValidDeposit[],
// Depósitos válidos para compra SEPOLIA
depositsValidListSepolia: [] as ValidDeposit[],
// Depósitos válidos para compra MUMBAI
depositsValidListMumbai: [] as ValidDeposit[],
// Depósitos válidos para compra ROOTSTOCK
@@ -25,8 +29,11 @@ export const useEtherStore = defineStore("ether", {
setBalance(balance: string) {
this.balance = balance;
},
setSelectedToken(token: TokenEnum) {
this.selectedToken = token;
},
setNetworkName(networkName: NetworkEnum) {
this.networkName = networkName;
this.networkName = Number(networkName);
},
setLoadingLock(isLoadingLock: boolean) {
this.loadingLock = isLoadingLock;
@@ -34,8 +41,8 @@ export const useEtherStore = defineStore("ether", {
setSellerView(sellerView: boolean) {
this.sellerView = sellerView;
},
setDepositsValidListGoerli(depositsValidList: ValidDeposit[]) {
this.depositsValidListGoerli = depositsValidList;
setDepositsValidListSepolia(depositsValidList: ValidDeposit[]) {
this.depositsValidListSepolia = depositsValidList;
},
setDepositsValidListMumbai(depositsValidList: ValidDeposit[]) {
this.depositsValidListMumbai = depositsValidList;
@@ -54,7 +61,7 @@ export const useEtherStore = defineStore("ether", {
getters: {
getValidDepositByWalletAddress: (state) => {
return (walletAddress: string) =>
state.depositsValidListGoerli
state.depositsValidListSepolia
.filter((deposit) => deposit.seller == walletAddress)
.sort((a, b) => {
return b.blockNumber - a.blockNumber;

17
src/utils/imagesPath.ts Normal file
View File

@@ -0,0 +1,17 @@
import type { NetworkEnum, TokenEnum } from "@/model/NetworkEnum";
export const imagesPath = import.meta.glob<string>('@/assets/*.{png,svg}', { eager: true, query: '?url', import: 'default' });
export const getNetworkImage = (networkName: NetworkEnum): string => {
const path = Object.keys(imagesPath).find((key) =>
key.endsWith(`${networkName.toLowerCase()}.svg`)
);
return path ? imagesPath[path] : "";
};
export const getTokenImage = (tokenName: TokenEnum): string => {
const path = Object.keys(imagesPath).find((key) =>
key.endsWith(`${tokenName.toLowerCase()}.svg`)
);
return path ? imagesPath[path] : "";
};

File diff suppressed because one or more lines are too long

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);
@@ -83,7 +83,7 @@ const checkForUnreleasedLocks = async (): Promise<void> => {
if (walletLocks) {
lockID.value = walletLocks.lockID;
tokenAmount.value = walletLocks.pix.value;
pixTarget.value = Number(walletLocks.pix.pixKey);
pixTarget.value = walletLocks.pix.pixKey;
showModal.value = true;
} else {
flowStep.value = Step.Search;
@@ -96,7 +96,7 @@ if (paramLockID) {
if (lockToRedirect) {
lockID.value = lockToRedirect.lockID;
tokenAmount.value = lockToRedirect.pix.value;
pixTarget.value = Number(lockToRedirect.pix.pixKey);
pixTarget.value = lockToRedirect.pix.pixKey;
flowStep.value = Step.Buy;
} else {
flowStep.value = Step.Search;

View File

@@ -17,8 +17,7 @@ import type { WalletTransaction } from "@/model/WalletTransaction";
import router from "@/router/index";
const etherStore = useEtherStore();
const { walletAddress, networkName } = storeToRefs(etherStore);
const { walletAddress, networkName, selectedToken } = storeToRefs(etherStore);
const loadingWithdraw = ref<boolean>(false);
const showAlert = ref<boolean>(false);
@@ -31,7 +30,7 @@ const callWithdraw = async (amount: string) => {
loadingWithdraw.value = true;
let withdraw;
try {
withdraw = await withdrawDeposit(amount);
withdraw = await withdrawDeposit(amount, selectedToken.value);
} catch {
loadingWithdraw.value = false;
}

View File

@@ -77,6 +77,7 @@ const sendNetwork = async () => {
<SendNetwork
:pixKey="pixKeyBuyer"
:offer="Number(offerValue)"
:selected-token="etherStore.selectedToken"
v-if="!loading"
@send-network="sendNetwork"
/>