From 13b694ca14426b12a999a066f5963b3439e0438d Mon Sep 17 00:00:00 2001 From: Aldenio de Vilaca Burgos Date: Thu, 23 Nov 2023 11:43:23 -0300 Subject: [PATCH] Revert "Atualiza os exemplos 5, 6 e 9" This reverts commit 8cb9e13ba85fa9f1d2566d5ce75a46d5a9078f07. --- exemplos/README.md | 2 +- exemplos/approveRealDigital.ts | 12 +-- exemplos/example5.ts | 3 - exemplos/example6.ts | 2 - exemplos/example9.ts | 178 ++++++++++++++++++++++++++++----- 5 files changed, 160 insertions(+), 37 deletions(-) diff --git a/exemplos/README.md b/exemplos/README.md index fd1c6e4..f2f3295 100644 --- a/exemplos/README.md +++ b/exemplos/README.md @@ -19,7 +19,7 @@ Esse código foi testado mas não foi feita nenhuma auditoria ou análise de vul Participante buscando o endereço de Real Digital no contrato de AddressDiscovery. [Exemplo 5](example5.ts): -Operação 1002: Registro de liquidação de oferta pública. +Operação 1002: Registro de liquidação de oferta pública. [Exemplo 6](example6.ts): Operação 1052: Registro de operação de compra e venda entre participantes. diff --git a/exemplos/approveRealDigital.ts b/exemplos/approveRealDigital.ts index 31d737b..2f99a46 100644 --- a/exemplos/approveRealDigital.ts +++ b/exemplos/approveRealDigital.ts @@ -9,7 +9,7 @@ export async function approveRealDigital( walletAccount: string, realDigitalAmount: number, tpftDvpAddress: string, - swapOneStepAddrress?: string) + swapOneStepFromAddrress?: string) { /** @@ -30,11 +30,11 @@ export async function approveRealDigital( */ await realDigital.connect(walletAccountSigner).approve(tpftDvpAddress, realDigitalAmount); - if(swapOneStepAddrress) { + if(swapOneStepFromAddrress) { /** - * Aprova o contrato SwapOneStep a negociar valor de Real Digital + * Aprova o contrato SwapOneStepFrom a negociar valor de Real Digital */ - await realDigital.connect(walletAccountSigner).approve(swapOneStepAddrress, realDigitalAmount); + await realDigital.connect(walletAccountSigner).approve(swapOneStepFromAddrress, realDigitalAmount); } } @@ -52,7 +52,7 @@ export async function approveRealDigital( ) /** - * Função a ser chamada para aprovar uma quantidade de Real Digital para o contrato TPFtDvP e SwapOneStep + * Função a ser chamada para aprovar uma quantidade de Real Digital para o contrato TPFtDvP e SwapOneStepFrom * de acordo com os critérios do participante. */ approveRealDigital( @@ -60,5 +60,5 @@ export async function approveRealDigital( '', realDigitalAmount, '', - '' + '' ) diff --git a/exemplos/example5.ts b/exemplos/example5.ts index af2e056..6201d26 100644 --- a/exemplos/example5.ts +++ b/exemplos/example5.ts @@ -59,7 +59,6 @@ async function tpftOperation1002() { operationId: '', cnpj8Sender: '', cnpj8Receiver: '', - callerPart: '', tpftData: { acronym: '', code: "", @@ -113,5 +112,3 @@ async function tpftOperation1002() { */ console.log(receiverTransaction.hash); } - - diff --git a/exemplos/example6.ts b/exemplos/example6.ts index e01a5cc..9dfe3da 100644 --- a/exemplos/example6.ts +++ b/exemplos/example6.ts @@ -58,7 +58,6 @@ async function tradeByCNPJ8() { operationId: "", cnpj8Sender: "", cnpj8Receiver: "", - callerPart: "", tpftData: { acronym: "", code: "", @@ -193,7 +192,6 @@ async function tradeByAddresses() { const params = { operationId: "", - callerPart: "", tpftData: { acronym: "", code: "", diff --git a/exemplos/example9.ts b/exemplos/example9.ts index 3207967..6f9ac4e 100644 --- a/exemplos/example9.ts +++ b/exemplos/example9.ts @@ -1,31 +1,159 @@ import { ethers } from "hardhat"; -import abiKeyDictionary from "../abi/KeyDictionary.json"; +import { BigNumber } from "ethers"; +import { setApprovalForAll } from "./setApprovalForAll"; +import { approveRealTokenizado } from "./approveRealTokenizado"; +import abiITPFtOperation1052 from "../abi/ITPFtOperation1052.json"; +import abiAddressDiscovery from "../abi/AddressDiscovery.json"; -// adiciona um cliente ao KeyDictionary e busca o endereço da carteira a partir da chave -async function example9() { - const contract = await ethers.getContractAt(abiKeyDictionary, ''); - - const customerData = { - taxId: 69280471007, // cpf fictício do cliente - bankNumber: 123, // identificador do banco - account: 987654, // conta do cliente - branch: 123, // agencia - wallet: '' - } - - // hash kcal256 do cpf - const key = ethers.utils.id(String(customerData.taxId)); + +/** + * TPFtOperation1052 - Permite que a operação de compra e venda envolvendo Título Público Federal tokenizado (TPFt) + * seja realizada entre um participante (cedente) cadastrado no Real Digital e seus clientes (cessionários) + * utilizando seus respetivos endereços de carteiras. + * @dev Para que a operação seja concluida com sucesso, a carteira do participante e do seu cliente devem + * aprovar o endereço do contrato TPFtDvP em seu Real Tokenizado usando a função "approve" e + * no TPFt por meio da função "setApprovalForAll". + */ +async function tradeParticipantAndItsClientByAddresses() { + + /** + * Obtém contrato Address Discovery + */ + const addressDiscrovery = await ethers.getContractAt( + abiAddressDiscovery, + '' + ); + + /** + * Endereço do TPFt + */ + const tpftAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFt')); + + /** + * Endereço do TPFtDvP + */ + const tpftDvpAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtDvP')); + + /** + * Endereço do TPFtOperation1052 + */ + const tpftOperation1052Address = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtOperation1052')); + + /** + * Obtém contrato TPFtOperation1052 + */ + const TPFtOperation1052 = await ethers.getContractAt( + abiITPFtOperation1052, + tpftOperation1052Address + ); + + /** + * senderParticipant (Ex. Participante A) refere-se ao cedente (detentor de TPFts) + */ + const [, , senderParticipant] = await ethers.getSigners(); + const senderParticipantAddress = senderParticipant.address; + + /** + * receiverClient (Ex. Cliente do Participante A) refere-se ao cessionário (não detentor de TPFts) + */ + const receiverClientAddress = ''; + const receiverClient = await ethers.getSigner(receiverClientAddress); + + /** + * Endereço do RealTokenizedParticipant (Ex. Endereço do Real Tokenizado do Participante A) + * @dev Como o receiverClient (Ex. Cliente do Participante A) pertence ao senderParticipant, o mesmo endereço do + * contrato do RealTokenizedParticipant deve ser utilizado por ambas partes. + * Além disso, o receiverClient deve estar cadastrado no RealTokenizedParticipant + */ + const realTokenizedParticipantAddress = '' - // adiciona o cliente - const response = await contract.addAccount(key, customerData.taxId, customerData.bankNumber, - customerData.account, customerData.branch, customerData.wallet); - - await response.wait(); - console.log(response.hash); + const params = { + operationId: "", + tpftData: { + acronym: "", + code: "", + // Ex: const date = new Date("2023-09-26"); Math.floor(date.getTime() / 1000); retorno 1695686400 + maturityDate: "", + }, + tpftAmount: "", + unitPrice: "", + }; - // busca um endereço de carteira de uma chave - const customerAddress = await contract.getWallet(key); + /** + * Quando o cedente está transmitindo o comando da operação. + */ + const callerPartBySender = BigNumber.from(0); + /** + * Quando o cessionário está transmitindo o comando da operação. + */ + const callerPartByReceiver = BigNumber.from(1); + + /** + * Função a ser chamada somente uma vez para aprovar o contrato TPFtDvP no TPFt. + */ + setApprovalForAll(senderParticipantAddress, tpftAddress, tpftDvpAddress) + + /** + * Função a ser chamada para aprovar uma quantidade de Real Tokenizado para o contrato TPFtDvP + * de acordo com os critérios do cliente. + */ + const realTokenizadoAmount = 1000; + + approveRealTokenizado(realTokenizedParticipantAddress, receiverClientAddress, realTokenizadoAmount, tpftDvpAddress) + + /** + * Registro por parte do senderParticipant (cedente) para realizar operação de + * compra e venda informando o endereço das carteiras. + */ + const senderTransaction = await TPFtOperation1052 + .connect(senderParticipant) + ?.[ + "trade(uint256,address,address,address,address,uint8,(string,string,uint256),uint256,uint256)" + ]( + params.operationId, + senderParticipantAddress, + realTokenizedParticipantAddress, + receiverClientAddress, + realTokenizedParticipantAddress, + callerPartBySender, + params.tpftData, + params.tpftAmount, + params.unitPrice + ); + + /** + * Aguarda até que a transação enviada pelo sender seja confirmada na blockchain. + */ + await senderTransaction.wait(); + + /** + * Registro por parte do receiverClient (cessionário) para realizar operação de + * compra e venda informando o endereço das carteiras. + */ + const receiverTransaction = await TPFtOperation1052 + .connect(receiverClient) + ?.[ + "trade(uint256,address,address,address,address,uint8,(string,string,uint256),uint256,uint256)" + ]( + params.operationId, + senderParticipantAddress, + realTokenizedParticipantAddress, + receiverClientAddress, + realTokenizedParticipantAddress, + callerPartByReceiver, + params.tpftData, + params.tpftAmount, + params.unitPrice + ); - console.log(customerAddress); -} + /** + * Aguarda até que a transação enviada pelo receiver seja confirmada na blockchain. + */ + await receiverTransaction.wait(); + /** + * Resposta da execução da operação de compra e venda + */ + console.log(senderTransaction.hash); + console.log(receiverTransaction.hash); +}