seller flow + blockchain integration

This commit is contained in:
brunoedcf 2022-12-23 15:51:13 -03:00
parent 17d6e86508
commit 0de0046064
8 changed files with 61 additions and 32 deletions

View File

@ -11,6 +11,8 @@ const props = defineProps({
tokenValue: Number, tokenValue: Number,
}); });
console.log(props.pixTarget, props.tokenValue);
const qrCode = ref<string>(""); const qrCode = ref<string>("");
const qrCodePayload = ref<string>(""); const qrCodePayload = ref<string>("");
const isPixValid = ref<boolean>(false); const isPixValid = ref<boolean>(false);

View File

@ -4,9 +4,11 @@ import CustomButton from "@/components/CustomButton.vue";
// Emits // Emits
const emit = defineEmits(["sendNetwork"]); const emit = defineEmits(["sendNetwork"]);
const sendNetworkHandle = () => { // props and store references
emit("sendNetwork"); const props = defineProps({
}; pixKey: String,
offer: Number,
});
</script> </script>
<template> <template>
@ -27,12 +29,12 @@ const sendNetworkHandle = () => {
> >
<div> <div>
<p>Tokens ofertados</p> <p>Tokens ofertados</p>
<p class="text-2xl text-gray-900">100 BRZ</p> <p class="text-2xl text-gray-900">{{ props.offer }} BRZ</p>
</div> </div>
<div class="my-3"> <div class="my-3">
<p>Chave Pix</p> <p>Chave Pix</p>
<p class="text-xl text-gray-900 break-words"> <p class="text-xl text-gray-900 break-words">
c02942far7047f6shri5ifh371908973 {{ props.pixKey }}
</p> </p>
</div> </div>
<div class="mb-5"> <div class="mb-5">
@ -44,7 +46,7 @@ const sendNetworkHandle = () => {
</div> </div>
<CustomButton <CustomButton
:text="'Enviar para a rede'" :text="'Enviar para a rede'"
@buttonClicked="sendNetworkHandle()" @buttonClicked="emit('sendNetwork')"
/> />
</div> </div>
</div> </div>

View File

@ -14,12 +14,6 @@ const validDecimals = ref(true);
// Emits // Emits
const emit = defineEmits(["approveTokens"]); const emit = defineEmits(["approveTokens"]);
// Blockchain methods
const approveTokensHandle = async () => {
console.log(offer.value, pixKey.value);
emit("approveTokens");
};
// Debounce methods // Debounce methods
const handleInputEvent = (event: any) => { const handleInputEvent = (event: any) => {
const { value } = event.target; const { value } = event.target;
@ -106,7 +100,7 @@ const decimalCount = (num: Number) => {
</div> </div>
<CustomButton <CustomButton
:text="'Aprovar tokens'" :text="'Aprovar tokens'"
@buttonClicked="approveTokensHandle()" @buttonClicked="emit('approveTokens', { offer, pixKey })"
/> />
</div> </div>
</div> </div>

View File

@ -170,7 +170,10 @@ const disconnectUser = () => {
<div <div
class="top-bar-info cursor-pointer" class="top-bar-info cursor-pointer"
@click=" @click="
[(menuOpenToggle = !menuOpenToggle), (currencyMenuOpenToggle = false)] [
(menuOpenToggle = !menuOpenToggle),
(currencyMenuOpenToggle = false),
]
" "
@mouseover="menuHoverToggle = true" @mouseover="menuHoverToggle = true"
@mouseout="menuHoverToggle = false" @mouseout="menuHoverToggle = false"

View File

@ -241,8 +241,7 @@ const getProvider = (): ethers.providers.Web3Provider | null => {
}; };
// Deposit methods // Deposit methods
// Gets value and pix key from user's form to create a deposit in the blockchain const approveTokens = async (tokenQty: Number) => {
const addDeposit = async (tokenQty: Number, pixKey: string) => {
const provider = getProvider(); const provider = getProvider();
if (!provider) return; if (!provider) return;
@ -253,16 +252,23 @@ const addDeposit = async (tokenQty: Number, pixKey: string) => {
mockToken.abi, mockToken.abi,
signer signer
); );
const p2pContract = new ethers.Contract(addresses.p2pix, p2pix.abi, signer);
// First get the approval
const apprv = await tokenContract.approve( const apprv = await tokenContract.approve(
addresses.p2pix, addresses.p2pix,
formatEther(String(tokenQty)) formatEther(String(tokenQty))
); );
await apprv.wait(); await apprv.wait();
return apprv;
};
// Gets value and pix key from user's form to create a deposit in the blockchain
const addDeposit = async (tokenQty: Number, pixKey: String) => {
const provider = getProvider();
if (!provider) return;
const signer = provider.getSigner();
const p2pContract = new ethers.Contract(addresses.p2pix, p2pix.abi, signer);
// Now we make the deposit
const deposit = await p2pContract.deposit( const deposit = await p2pContract.deposit(
addresses.token, addresses.token,
formatEther(String(tokenQty)), formatEther(String(tokenQty)),
@ -391,6 +397,7 @@ export default {
listReleaseTransactionByWalletAddress, listReleaseTransactionByWalletAddress,
listDepositTransactionByWalletAddress, listDepositTransactionByWalletAddress,
listLockTransactionByWalletAddress, listLockTransactionByWalletAddress,
approveTokens,
addDeposit, addDeposit,
mapDeposits, mapDeposits,
formatBigNumber, formatBigNumber,

View File

@ -1,5 +1,4 @@
<script setup lang="ts"> <script setup lang="ts"></script>
</script>
<template> <template>
<div class="page">Histórico de ofertas</div> <div class="page">Histórico de ofertas</div>

View File

@ -1,5 +1,4 @@
<script setup lang="ts"> <script setup lang="ts"></script>
</script>
<template> <template>
<div class="page">Gerenciar Ofertas</div> <div class="page">Gerenciar Ofertas</div>

View File

@ -2,9 +2,11 @@
import WantSellComponent from "../components/SellerSteps/WantSellComponent.vue"; import WantSellComponent from "../components/SellerSteps/WantSellComponent.vue";
import SendNetwork from "../components/SellerSteps/SendNetwork.vue"; import SendNetwork from "../components/SellerSteps/SendNetwork.vue";
import ValidationComponent from "../components/LoadingComponent.vue"; import ValidationComponent from "../components/LoadingComponent.vue";
import blockchain from "../utils/blockchain";
import { ref } from "vue"; import { ref } from "vue";
import router from "@/router"; import router from "@/router";
import { pix } from "@/utils/QrCodePix";
enum Step { enum Step {
Search, Search,
@ -15,24 +17,40 @@ enum Step {
const flowStep = ref<Step>(Step.Sell); const flowStep = ref<Step>(Step.Sell);
const loading = ref<boolean>(false); const loading = ref<boolean>(false);
const offerValue = ref<number>();
const pixKeyBuyer = ref<string>("");
const walletConnect = async () => { const walletConnect = async () => {
flowStep.value = Step.Sell; flowStep.value = Step.Sell;
}; };
const approveTokens = async () => { // Verificar tipagem
const approveOffer = async ({ offer, pixKey }: any) => {
loading.value = true; loading.value = true;
setTimeout(() => { try {
loading.value = false; offerValue.value = offer;
pixKeyBuyer.value = pixKey;
await blockchain.approveTokens(offerValue.value);
flowStep.value = Step.Network; flowStep.value = Step.Network;
}, 2000); loading.value = false;
} catch {
flowStep.value = Step.Sell;
loading.value = false;
}
}; };
const sendNetwork = async () => { const sendNetwork = async () => {
loading.value = true; loading.value = true;
setTimeout(() => { try {
if (offerValue.value && pixKeyBuyer.value) {
await blockchain.addDeposit(offerValue.value, pixKeyBuyer.value);
flowStep.value = Step.Sell;
loading.value = false;
}
} catch {
flowStep.value = Step.Network;
loading.value = false; loading.value = false;
router.push("/"); }
}, 2000);
}; };
</script> </script>
@ -42,14 +60,19 @@ const sendNetwork = async () => {
@token-buy="walletConnect" @token-buy="walletConnect"
/> --> /> -->
<div v-if="flowStep == Step.Sell"> <div v-if="flowStep == Step.Sell">
<WantSellComponent v-if="!loading" @approve-tokens="approveTokens" /> <WantSellComponent v-if="!loading" @approve-tokens="approveOffer" />
<ValidationComponent <ValidationComponent
v-if="loading" v-if="loading"
:message="'A transação está sendo enviada para a rede.'" :message="'A transação está sendo enviada para a rede.'"
/> />
</div> </div>
<div v-if="flowStep == Step.Network"> <div v-if="flowStep == Step.Network">
<SendNetwork v-if="!loading" @send-network="sendNetwork" /> <SendNetwork
:pixKey="pixKeyBuyer"
:offer="Number(offerValue)"
v-if="!loading"
@send-network="sendNetwork"
/>
<ValidationComponent <ValidationComponent
v-if="loading" v-if="loading"
:message="'A transação está sendo enviada para a rede.'" :message="'A transação está sendo enviada para a rede.'"