From 0f17a67e0017b16009a935a1a7deb5fc876830af Mon Sep 17 00:00:00 2001 From: Filipe Soccol Date: Tue, 3 Dec 2024 16:18:10 -0300 Subject: [PATCH] Correct bugs and adjust Buyer form. --- src/blockchain/buyerMethods.ts | 51 +++++++------ src/blockchain/sellerMethods.ts | 3 +- src/components/QrCodeComponent.vue | 3 +- src/components/SearchComponent.vue | 72 +++++++++++++++---- .../SellerSteps/SellerComponent.vue | 8 +-- src/store/ether.ts | 2 +- src/utils/bbPay.ts | 18 ++++- src/views/HomeView.vue | 13 ++-- src/views/SellerView.vue | 2 +- 9 files changed, 113 insertions(+), 59 deletions(-) diff --git a/src/blockchain/buyerMethods.ts b/src/blockchain/buyerMethods.ts index bd2da74..3abc13d 100644 --- a/src/blockchain/buyerMethods.ts +++ b/src/blockchain/buyerMethods.ts @@ -1,28 +1,22 @@ import { getContract, getProvider } from "./provider"; import { getP2PixAddress, getTokenAddress } from "./addresses"; +import { encodeBytes32String, Signature, Contract, parseEther } from "ethers"; import p2pix from "@/utils/smart_contract_files/P2PIX.json"; -import { - solidityPackedKeccak256, - encodeBytes32String, - Signature, - Contract, - getBytes, - Wallet, - parseEther, -} from "ethers"; import type { TokenEnum } from "@/model/NetworkEnum"; +import { createSolicitation } from "../utils/bbPay"; +import type { Offer } from "../utils/bbPay"; const addLock = async ( - seller: string, + sellerId: string, token: string, amount: number ): Promise => { const p2pContract = await getContract(); const lock = await p2pContract.lock( - seller, + sellerId, token, parseEther(String(amount)), // BigNumber [], @@ -32,26 +26,29 @@ const addLock = async ( const lock_rec = await lock.wait(); const [t] = lock_rec.events; - return String(t.args.lockID); + const offer: Offer = { + amount, + lockId: String(t.args.lockID), + sellerId: sellerId, + }; + const solicitation = await createSolicitation(offer); + + return; }; -const releaseLock = async ( - pixKey: string, - amount: number, - e2eId: string, - lockId: string -): Promise => { - const mockBacenSigner = new Wallet( - "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" - ); +const releaseLock = async (solicitation: any): Promise => { + // const mockBacenSigner = new Wallet( + // "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" + // ); - const messageToSign = solidityPackedKeccak256( - ["bytes32", "uint256", "bytes32"], - [pixKey, parseEther(String(amount)), encodeBytes32String(e2eId)] - ); + // const messageToSign = solidityPackedKeccak256( + // ["bytes32", "uint256", "bytes32"], + // [sellerId, parseEther(String(amount)), encodeBytes32String(signature)] + // ); + + // const messageHashBytes = getBytes(messageToSign); + // const flatSig = await mockBacenSigner.signMessage(messageHashBytes); - const messageHashBytes = getBytes(messageToSign); - const flatSig = await mockBacenSigner.signMessage(messageHashBytes); const provider = getProvider(); const sig = Signature.from(flatSig); diff --git a/src/blockchain/sellerMethods.ts b/src/blockchain/sellerMethods.ts index fd96b06..203ff4f 100644 --- a/src/blockchain/sellerMethods.ts +++ b/src/blockchain/sellerMethods.ts @@ -5,7 +5,8 @@ import { encodeBytes32String, Contract, parseEther } from "ethers"; import mockToken from "../utils/smart_contract_files/MockToken.json"; import { useEtherStore } from "@/store/ether"; -import { createParticipant, Participant } from "@/utils/bbPay"; +import { createParticipant } from "@/utils/bbPay"; +import type { Participant } from "@/utils/bbPay"; const approveTokens = async (participant: Participant): Promise => { const provider = getProvider(); diff --git a/src/components/QrCodeComponent.vue b/src/components/QrCodeComponent.vue index b2a6861..5bda0ef 100644 --- a/src/components/QrCodeComponent.vue +++ b/src/components/QrCodeComponent.vue @@ -1,13 +1,14 @@ @@ -306,4 +344,10 @@ input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { -webkit-appearance: none; } + +.custom-button { + @apply w-full py-3 px-6 rounded-lg font-semibold text-white bg-indigo-600 + hover:bg-indigo-700 disabled:bg-gray-400 disabled:cursor-not-allowed + transition-colors duration-200; +} diff --git a/src/components/SellerSteps/SellerComponent.vue b/src/components/SellerSteps/SellerComponent.vue index 9eaab1a..18343ed 100644 --- a/src/components/SellerSteps/SellerComponent.vue +++ b/src/components/SellerSteps/SellerComponent.vue @@ -9,6 +9,10 @@ import { getTokenImage } from "@/utils/imagesPath"; import { useOnboard } from "@web3-onboard/vue"; import ChevronDown from "@/assets/chevron.svg"; +// Import the bank list +import bankList from "@/utils/files/isbpList.json"; +import type { Participant } from "@/utils/bbPay"; + // Define Bank interface interface Bank { ISPB: string; @@ -38,10 +42,6 @@ const bankSearchQuery = ref(""); const showBankList = ref(false); const selectedBank = ref(null); -// Import the bank list -import bankList from "@/utils/files/isbpList.json"; -import { Participant } from "@/utils/bbPay"; - const filteredBanks = computed(() => { if (!bankSearchQuery.value) return []; return bankList diff --git a/src/store/ether.ts b/src/store/ether.ts index f908abb..6410fff 100644 --- a/src/store/ether.ts +++ b/src/store/ether.ts @@ -1,6 +1,6 @@ import { NetworkEnum, TokenEnum } from "../model/NetworkEnum"; import type { ValidDeposit } from "@/model/ValidDeposit"; -import { Participant } from "@/utils/bbPay"; +import type { Participant } from "../utils/bbPay"; import { defineStore } from "pinia"; export const useEtherStore = defineStore("ether", { diff --git a/src/utils/bbPay.ts b/src/utils/bbPay.ts index e6f869c..664b320 100644 --- a/src/utils/bbPay.ts +++ b/src/utils/bbPay.ts @@ -15,9 +15,13 @@ export interface ParticipantWithID extends Participant { export interface Offer { amount: number; - sellerID: string; + lockId: string; + sellerId: string; } +// Specs for BB Pay Sandbox +// https://apoio.developers.bb.com.br/sandbox/spec/665797498bb48200130fc32c + export const createParticipant = async (participant: Participant) => { const response = await fetch(`${process.env.VUE_APP_API_URL}/participants`, { method: "PUT", @@ -39,5 +43,15 @@ export const getSolicitation = async (id: string) => { const response = await fetch( `${process.env.VUE_APP_API_URL}/solicitation/${id}` ); - return response.json(); + + const obj: any = response.json(); + + return { + id: obj.numeroSolicitacao, + lockId: obj.codigoConciliacaoSolicitacao, + amount: obj.valorSolicitacao, + qrcode: obj.pix.textoQrCode, + status: obj.valorSomatorioPagamentosEfetivados >= obj.valorSolicitacao, + signature: obj.assinatura, + }; }; diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 0f2bb12..b87c962 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -59,18 +59,15 @@ const confirmBuyClick = async ( } }; -const releaseTransaction = async (e2eId: string) => { +const releaseTransaction = async (lockId: string) => { flowStep.value = Step.List; showBuyAlert.value = true; loadingRelease.value = true; - if (lockID.value && tokenAmount.value && pixTarget.value) { - const release = await releaseLock( - pixTarget.value, - tokenAmount.value, - e2eId, - lockID.value - ); + const solicitation = await getSolicitation(lockId); + + if (solicitation.confirmed) { + const release = await releaseLock(solicitation); await release.wait(); await updateWalletStatus(); diff --git a/src/views/SellerView.vue b/src/views/SellerView.vue index 02c9ad1..cf2343e 100644 --- a/src/views/SellerView.vue +++ b/src/views/SellerView.vue @@ -7,7 +7,7 @@ import { approveTokens, addDeposit } from "@/blockchain/sellerMethods"; import { ref } from "vue"; import { useEtherStore } from "@/store/ether"; import CustomAlert from "@/components/CustomAlert/CustomAlert.vue"; -import { Participant } from "@/utils/bbPay"; +import type { Participant } from "@/utils/bbPay"; enum Step { Search,