", 84 | }; 85 | 86 | /** 87 | * Quando o cedente está transmitindo o comando da operação. 88 | */ 89 | const callerPartBySender = BigNumber.from(0); 90 | /** 91 | * Quando o cessionário está transmitindo o comando da operação. 92 | */ 93 | const callerPartByReceiver = BigNumber.from(1); 94 | 95 | /** 96 | * Função a ser chamada somente uma vez para aprovar o contrato TPFtDvP no TPFt. 97 | */ 98 | setApprovalForAll(senderAccount, tpftAddress, tpftDvpAddress) 99 | 100 | /** 101 | * Função a ser chamada para aprovar uma quantidade de Real Tokenizado para o contrato TPFtDvP 102 | * de acordo com os critérios do cliente. 103 | */ 104 | const realTokenizadoAmount = 1000; 105 | 106 | approveRealTokenizado(realTokenizadoReceiverAddress, receiverAccount, realTokenizadoAmount, tpftDvpAddress) 107 | 108 | /** 109 | * Registro por parte do sender (cedente) para realizar operação de 110 | * compra e venda informando o endereço das carteiras. 111 | */ 112 | const senderTransaction = await TPFtOperation1052 113 | .connect(senderAccountSigner) 114 | ?.[ 115 | "trade(uint256,address,address,address,address,uint8,(string,string,uint256),uint256,uint256)" 116 | ]( 117 | params.operationId, 118 | senderAccount, 119 | realTokenizadoSenderAddress, 120 | receiverAccount, 121 | realTokenizadoReceiverAddress, 122 | callerPartBySender, 123 | params.tpftData, 124 | params.tpftAmount, 125 | params.unitPrice 126 | ); 127 | 128 | /** 129 | * Aguarda até que a transação enviada pelo sender seja confirmada na blockchain. 130 | */ 131 | await senderTransaction.wait(); 132 | 133 | /** 134 | * Registro por parte do receiver (cessionário) para realizar operação de 135 | * compra e venda informando o endereço das carteiras. 136 | */ 137 | const receiverTransaction = await TPFtOperation1052 138 | .connect(receiverAccountSigner) 139 | ?.[ 140 | "trade(uint256,address,address,address,address,uint8,(string,string,uint256),uint256,uint256)" 141 | ]( 142 | params.operationId, 143 | senderAccount, 144 | realTokenizadoSenderAddress, 145 | receiverAccount, 146 | realTokenizadoReceiverAddress, 147 | callerPartByReceiver, 148 | params.tpftData, 149 | params.tpftAmount, 150 | params.unitPrice 151 | ); 152 | 153 | /** 154 | * Aguarda até que a transação enviada pelo receiver seja confirmada na blockchain. 155 | */ 156 | await receiverTransaction.wait(); 157 | 158 | /** 159 | * Resposta da execução da operação de compra e venda 160 | */ 161 | console.log(senderTransaction.hash); 162 | console.log(receiverTransaction.hash); 163 | } 164 | -------------------------------------------------------------------------------- /exemplos/example11.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import { BigNumber } from "ethers"; 3 | import { setApprovalForAll } from "./setApprovalForAll"; 4 | import { approveRealDigital } from "./approveRealDigital"; 5 | import { approveRealTokenizado } from "./approveRealTokenizado"; 6 | import abiITPFtOperation1052 from "../abi/ITPFtOperation1052.json"; 7 | import abiAddressDiscovery from "../abi/AddressDiscovery.json"; 8 | 9 | /** 10 | * TPFtOperation1052 - Permite que a operação de compra e venda envolvendo Título Público Federal tokenizado (TPFt) 11 | * seja realizada entre um participante (cedente) e um cliente (cessionário) pertencente a um outro participante 12 | * utilizando seus endereços de carteiras. Ambos participantes devem estar cadastrados no Real Digital. 13 | * Além disso, o cliente deve estar cadastrado no Real Tokenizado do seu respetivo participante. 14 | * Como o cliente encontra-se em um participante diferente, é necessário que o contrato SwapOneStepFrom 15 | * no Real Digital seja aprovado por meio da função "approve" usando a carteira do participante cujo 16 | * cliente é um cessionário. 17 | * @dev Para que a operação seja concluida com sucesso, a carteira do participante e a do cliente devem 18 | * aprovar o endereço do contrato TPFtDvP em seus respetivos Real Tokenizados usando a função "approve" e 19 | * no TPFt por meio da função "setApprovalForAll". 20 | */ 21 | async function tradeParticipantAndDifferentClient() { 22 | 23 | /** 24 | * Obtém contrato Address Discovery 25 | */ 26 | const addressDiscrovery = await ethers.getContractAt( 27 | abiAddressDiscovery, 28 | '' 29 | ); 30 | 31 | /** 32 | * Endereço do TPFt 33 | */ 34 | const tpftAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFt')); 35 | 36 | /** 37 | * Endereço do TPFtDvP 38 | */ 39 | const tpftDvpAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtDvP')); 40 | 41 | /** 42 | * Endereço do SwapOneStepFrom 43 | */ 44 | const swapOneStepFromAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('SwapOneStepFrom')); 45 | 46 | /** 47 | * Endereço do Real Digital 48 | */ 49 | const realDigitalAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('RealDigital')); 50 | 51 | /** 52 | * Endereço do TPFtOperation1052 53 | */ 54 | const tpftOperation1052Address = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtOperation1052')); 55 | 56 | /** 57 | * Obtém contrato TPFtOperation1052 58 | */ 59 | const TPFtOperation1052 = await ethers.getContractAt( 60 | abiITPFtOperation1052, 61 | tpftOperation1052Address 62 | ); 63 | 64 | /** 65 | * senderParticipant (Ex. Participante A) refere-se ao cedente (detentor de TPFts). 66 | * receiverParticipant (Ex. Participante B) refere-se a um outro participante na rede. 67 | */ 68 | const [, , senderParticipant, receiverParticipant] = await ethers.getSigners(); 69 | const senderParticipantAddress = senderParticipant.address; 70 | const receiverParticipantAddress = receiverParticipant.address; 71 | 72 | /** 73 | * Endereço do RealTokenizedParticipantSenderAddress (Ex. Endereço do Real Tokenizado do Participante A) 74 | */ 75 | const realTokenizedParticipantSenderAddress = ' ' 76 | 77 | /** 78 | * receiverClient (Ex. Cliente do Participante B) refere-se ao cessionário (não detentor de TPFts) 79 | * que pertence ao receiverParticipant. 80 | */ 81 | const receiverClientAddress = ' '; 82 | const receiverClient = await ethers.getSigner(receiverClientAddress); 83 | 84 | /** 85 | * Endereço do RealTokenizedParticipantReceiverAddress (Ex. Endereço do Real Tokenizado do Participante B) 86 | * @dev Note-se que o receiverClient (Ex. Cliente do Participante B) deve estar cadastrado no 87 | * RealTokenizedParticipantReceiverAddress (Ex. Real Tokenizado do Participante B) 88 | */ 89 | const realTokenizedParticipantReceiverAddress = ' ' 90 | 91 | const params = { 92 | operationId: " ", 93 | tpftData: { 94 | acronym: "", 95 | code: " ", 96 | // Ex: const date = new Date("2023-09-26"); Math.floor(date.getTime() / 1000); retorno 1695686400 97 | maturityDate: "", 98 | }, 99 | tpftAmount: " ", 100 | unitPrice: " ", 101 | }; 102 | 103 | /** 104 | * Quando o cedente está transmitindo o comando da operação. 105 | */ 106 | const callerPartBySender = BigNumber.from(0); 107 | /** 108 | * Quando o cessionário está transmitindo o comando da operação. 109 | */ 110 | const callerPartByReceiver = BigNumber.from(1); 111 | 112 | /** 113 | * Função a ser chamada somente uma vez para aprovar o contrato TPFtDvP no TPFt. 114 | */ 115 | setApprovalForAll(senderParticipantAddress, tpftAddress, tpftDvpAddress) 116 | 117 | /** 118 | * Função a ser chamada para aprovar uma quantidade de Real Digital para o contrato TPFtDvP 119 | * de acordo com os critérios do participante (Ex. Participante B) do receiverClient (cessionário). 120 | */ 121 | const realDigitalAmount = 1000; 122 | 123 | approveRealDigital(realDigitalAddress, receiverParticipantAddress, realDigitalAmount, tpftDvpAddress, swapOneStepFromAddress) 124 | 125 | /** 126 | * Função a ser chamada para aprovar uma quantidade de Real Tokenizado para o contrato TPFtDvP 127 | * de acordo com os critérios do cliente. 128 | */ 129 | const realTokenizadoAmount = 1000; 130 | 131 | approveRealTokenizado(realTokenizedParticipantReceiverAddress, receiverClientAddress, realTokenizadoAmount, tpftDvpAddress) 132 | 133 | /** 134 | * Registro por parte do senderParticipant (cedente) para realizar operação de 135 | * compra e venda informando o endereço das carteiras. 136 | */ 137 | const senderTransaction = await TPFtOperation1052 138 | .connect(senderParticipant) 139 | ?.[ 140 | "trade(uint256,address,address,address,address,uint8,(string,string,uint256),uint256,uint256)" 141 | ]( 142 | params.operationId, 143 | senderParticipantAddress, 144 | realTokenizedParticipantSenderAddress, 145 | receiverClientAddress, 146 | realTokenizedParticipantReceiverAddress, 147 | callerPartBySender, 148 | params.tpftData, 149 | params.tpftAmount, 150 | params.unitPrice 151 | ); 152 | 153 | /** 154 | * Aguarda até que a transação enviada pelo sender seja confirmada na blockchain. 155 | */ 156 | await senderTransaction.wait(); 157 | 158 | /** 159 | * Registro por parte do receiverClient (cessionário) para realizar operação de 160 | * compra e venda informando o endereço das carteiras. 161 | */ 162 | const receiverTransaction = await TPFtOperation1052 163 | .connect(receiverClient) 164 | ?.[ 165 | "trade(uint256,address,address,address,address,uint8,(string,string,uint256),uint256,uint256)" 166 | ]( 167 | params.operationId, 168 | senderParticipantAddress, 169 | realTokenizedParticipantSenderAddress, 170 | receiverClientAddress, 171 | realTokenizedParticipantReceiverAddress, 172 | callerPartByReceiver, 173 | params.tpftData, 174 | params.tpftAmount, 175 | params.unitPrice 176 | ); 177 | 178 | /** 179 | * Aguarda até que a transação enviada pelo receiver seja confirmada na blockchain. 180 | */ 181 | await receiverTransaction.wait(); 182 | 183 | /** 184 | * Resposta da execução da operação de compra e venda 185 | */ 186 | console.log(senderTransaction.hash); 187 | console.log(receiverTransaction.hash); 188 | } 189 | -------------------------------------------------------------------------------- /exemplos/example12.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import { BigNumber } from "ethers"; 3 | import { setApprovalForAll } from "./setApprovalForAll"; 4 | import { approveRealDigital } from "./approveRealDigital"; 5 | import { approveRealTokenizado } from "./approveRealTokenizado"; 6 | import abiITPFtOperation1052 from "../abi/ITPFtOperation1052.json"; 7 | import abiAddressDiscovery from "../abi/AddressDiscovery.json"; 8 | 9 | 10 | 11 | /** 12 | * TPFtOperation1052 - Permite que clientes pertencentes a participantes cadastrados no Real Digital 13 | * realizem a operação de compra e venda envolvendo Título Público Federal tokenizado (TPFt) 14 | * entre si e/ou seus clientes utilizando seus endereços de carteiras. 15 | * @dev Para que a operação seja concluida com sucesso, é necessário que cada carteira do participante aprove o endereço do contrato TPFtDvP. 16 | * Além disso, há dois cénarios possíveis: 17 | * 1. Quando os clientes estão no mesmo participante; 18 | * 2. Quando os clientes estão em participantes diferentes: nesse casso, é necessário que o contrato SwapOneStepFrom 19 | * no Real Digital seja aprovado por meio da função "approve" usando a carteira do participante cujo cliente é um cessionário. 20 | * Adicionalmente, as carteiras dos participantes/clientes devem aprovar o endereço do contrato TPFtDvP 21 | * em seus Real Tokenizados usando a função "approve" e no TPFt por meio da função "setApprovalForAll". 22 | * 23 | * 24 | */ 25 | async function tradeByClientAddressesInDifferentParticipant() { 26 | 27 | /** 28 | * Obtém contrato Address Discovery 29 | */ 30 | const addressDiscrovery = await ethers.getContractAt( 31 | abiAddressDiscovery, 32 | '' 33 | ); 34 | 35 | /** 36 | * Endereço do TPFt 37 | */ 38 | const tpftAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFt')); 39 | 40 | /** 41 | * Endereço do TPFtDvP 42 | */ 43 | const tpftDvpAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtDvP')); 44 | 45 | /** 46 | * Endereço do SwapOneStepFrom 47 | */ 48 | const swapOneStepFromAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('SwapOneStepFrom')); 49 | 50 | /** 51 | * Endereço do Real Digital 52 | */ 53 | const realDigitalAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('RealDigital')); 54 | 55 | /** 56 | * Endereço do TPFtOperation1052 57 | */ 58 | const tpftOperation1052Address = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtOperation1052')); 59 | 60 | /** 61 | * Obtém contrato TPFtOperation1052 62 | */ 63 | const TPFtOperation1052 = await ethers.getContractAt( 64 | abiITPFtOperation1052, 65 | tpftOperation1052Address 66 | ); 67 | 68 | /** 69 | * Sender refere-se ao cedente (detentor de TPFts) 70 | */ 71 | const senderAccount = ' '; 72 | const senderAccountSigner = await ethers.getSigner(senderAccount); 73 | 74 | //Endereço do RealTokenizedSender 75 | const realTokenizadoSenderAddress = ' ' 76 | 77 | /** 78 | * Receiver refere-se ao cessionário (não detentor de TPFts) 79 | */ 80 | const participantReceiverAccount = ' '; 81 | const receiverAccount = ' '; 82 | const receiverAccountSigner = await ethers.getSigner(receiverAccount); 83 | 84 | //Endereço do RealTokenizedReceiver 85 | const realTokenizadoReceiverAddress = ' ' 86 | 87 | const params = { 88 | operationId: " ", 89 | tpftData: { 90 | acronym: "", 91 | code: " ", 92 | // Ex: const date = new Date("2023-09-26"); Math.floor(date.getTime() / 1000); retorno 1695686400 93 | maturityDate: "", 94 | }, 95 | tpftAmount: " ", 96 | unitPrice: " ", 97 | }; 98 | 99 | /** 100 | * Quando o cedente está transmitindo o comando da operação. 101 | */ 102 | const callerPartBySender = BigNumber.from(0); 103 | /** 104 | * Quando o cessionário está transmitindo o comando da operação. 105 | */ 106 | const callerPartByReceiver = BigNumber.from(1); 107 | 108 | /** 109 | * Função a ser chamada somente uma vez para aprovar o contrato TPFtDvP no TPFt. 110 | */ 111 | setApprovalForAll(senderAccount, tpftAddress, tpftDvpAddress) 112 | 113 | /** 114 | * Função a ser chamada para aprovar uma quantidade de Real Digital para o contrato TPFtDvP 115 | * de acordo com os critérios do participante do cliente (cessionário). 116 | */ 117 | const realDigitalAmount = 1000; 118 | 119 | approveRealDigital(realDigitalAddress, participantReceiverAccount, realDigitalAmount, tpftDvpAddress, swapOneStepFromAddress) 120 | 121 | /** 122 | * Função a ser chamada para aprovar uma quantidade de Real Tokenizado para o contrato TPFtDvP 123 | * de acordo com os critérios do cliente. 124 | */ 125 | const realTokenizadoAmount = 1000; 126 | 127 | approveRealTokenizado(realTokenizadoReceiverAddress, receiverAccount, realTokenizadoAmount, tpftDvpAddress) 128 | 129 | /** 130 | * Registro por parte do sender (cedente) para realizar operação de 131 | * compra e venda informando o endereço das carteiras. 132 | */ 133 | const senderTransaction = await TPFtOperation1052 134 | .connect(senderAccountSigner) 135 | ?.[ 136 | "trade(uint256,address,address,address,address,uint8,(string,string,uint256),uint256,uint256)" 137 | ]( 138 | params.operationId, 139 | senderAccount, 140 | realTokenizadoSenderAddress, 141 | receiverAccount, 142 | realTokenizadoReceiverAddress, 143 | callerPartBySender, 144 | params.tpftData, 145 | params.tpftAmount, 146 | params.unitPrice 147 | ); 148 | 149 | /** 150 | * Aguarda até que a transação enviada pelo sender seja confirmada na blockchain. 151 | */ 152 | await senderTransaction.wait(); 153 | 154 | /** 155 | * Registro por parte do receiver (cessionário) para realizar operação de 156 | * compra e venda informando o endereço das carteiras. 157 | */ 158 | const receiverTransaction = await TPFtOperation1052 159 | .connect(receiverAccountSigner) 160 | ?.[ 161 | "trade(uint256,address,address,address,address,uint8,(string,string,uint256),uint256,uint256)" 162 | ]( 163 | params.operationId, 164 | senderAccount, 165 | realTokenizadoSenderAddress, 166 | receiverAccount, 167 | realTokenizadoReceiverAddress, 168 | callerPartByReceiver, 169 | params.tpftData, 170 | params.tpftAmount, 171 | params.unitPrice 172 | ); 173 | 174 | /** 175 | * Aguarda até que a transação enviada pelo receiver seja confirmada na blockchain. 176 | */ 177 | await receiverTransaction.wait(); 178 | 179 | /** 180 | * Resposta da execução da operação de compra e venda 181 | */ 182 | console.log(senderTransaction.hash); 183 | console.log(receiverTransaction.hash); 184 | } 185 | -------------------------------------------------------------------------------- /exemplos/example2.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import abiRealDigital from '../abi/RealDigital.json'; 3 | import abiRealDigitalDefaultAccount from '../abi/RealDigitalDefaultAccount.json'; 4 | 5 | // Busca a conta padrão do participante e realiza transferência de CBDC 6 | async function example2() { 7 | const defaultAccount = await ethers.getContractAt(abiRealDigitalDefaultAccount, ''); 8 | const cbdc = await ethers.getContractAt(abiRealDigital, 'Endereço contrato RealDigital'); 9 | const [, participantX] = await ethers.getSigners(); 10 | 11 | // Identificador do participante que vai receber a transferência 12 | const cnpj8AnotherParticipant = '87654321'; 13 | 14 | // Busca o endereço padrão para a transferência 15 | const address = await defaultAccount.defaultAccount(cnpj8AnotherParticipant); 16 | 17 | // Realiza a transferência de CBDC 18 | const response = await cbdc.connect(participantX).transfer(address, ethers.utils.parseUnits("100", 2)); 19 | 20 | console.log(response.hash); 21 | } -------------------------------------------------------------------------------- /exemplos/example3.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import abiRealTokenizado from '../abi/RealTokenizado.json'; 3 | 4 | function delay(ms: number) { 5 | return new Promise( resolve => setTimeout(resolve, ms) ); 6 | }; 7 | 8 | // Participante ativando um endereço para um cliente e realizando uma emissão de DVt ou MEt 9 | async function example3() { 10 | const dvtParticipantX = await ethers.getContractAt(abiRealTokenizado, ' '); 11 | const [, participantX, customerX ] = await ethers.getSigners(); 12 | 13 | // participante do piloto habilitando endereço para cliente 14 | await dvtParticipantX.connect(participantX).enableAccount(customerX.address); 15 | 16 | await delay(5000); 17 | 18 | // Participante do piloto emitindo dvt para cliente 19 | const response = await dvtParticipantX.connect(participantX).mint(customerX.address, ethers.utils.parseUnits("100", 2)); 20 | 21 | console.log(response.hash); 22 | } -------------------------------------------------------------------------------- /exemplos/example4.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import abiAddressDiscovery from '../abi/AddressDiscovery.json'; 3 | 4 | // busca o endereço do contrato do RealDigital 5 | async function example4() { 6 | const contract = await ethers.getContractAt(abiAddressDiscovery, ' '); 7 | const realDigitalAddress = await contract.addressDiscovery(ethers.utils.id('RealDigital')); 8 | 9 | console.log(realDigitalAddress); 10 | } -------------------------------------------------------------------------------- /exemplos/example5.ts: -------------------------------------------------------------------------------- 1 | import {ethers} from "hardhat"; 2 | import { BigNumber } from "ethers"; 3 | import { approveRealDigital } from "./approveRealDigital"; 4 | import abiITPFtOperation1002 from "../abi/ITPFtOperation1002.json"; 5 | import abiAddressDiscovery from "../abi/AddressDiscovery.json"; 6 | 7 | /** 8 | * TPFtOperation1002 - Permite que o Bacen realize a liquidação de oferta pública 9 | * envolvendo Título Público Federal tokenizado (TPFt) para um participante 10 | * que esteja cadastrado no Real Digital utilizando seus CNPJ8. 11 | * @dev Para a operação ocorrer é necessário que cada carteira de aprovação para o endereço contrato TPFtDvP 12 | * no Real Digital através da função approve e no TPFt através setApprovalForAll. 13 | */ 14 | async function tpftOperation1002() { 15 | 16 | /** 17 | * Obtém contrato Address Discovery 18 | */ 19 | const addressDiscrovery = await ethers.getContractAt( 20 | abiAddressDiscovery, 21 | ' ' 22 | ); 23 | 24 | /** 25 | * Endereço do TPFtDvP 26 | */ 27 | const tpftDvpAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtDvP')); 28 | 29 | /** 30 | * Endereço do Real Digital 31 | */ 32 | const realDigitalAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('RealDigital')); 33 | 34 | /** 35 | * Endereço do TPFtOperation1002 36 | */ 37 | const tpftOperation1002Address = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtOperation1002')); 38 | 39 | /** 40 | * Obtém contrato TPFtOperation1002 41 | */ 42 | const TPFtOperation1002 = await ethers.getContractAt( 43 | abiITPFtOperation1002, 44 | tpftOperation1002Address 45 | ); 46 | 47 | /** 48 | * Sender refere-se ao cedente - Bacen atua a nome da Secretaria Nacional do Tesouro (STN). 49 | * Receiver refere-se ao cessionário - Instituição Financeira Participante cadastrada no Real Digital. 50 | * Restrições: 51 | * 1. O endereço da carteira do Bacen deverá ter a _role_ de AUCTION_PLACEMENT_ROLE. 52 | * 2. Tanto o endereço de carteira da STN como da Instituição Financeira Participante 53 | * deverão estar habilitados no contrato TPFt. 54 | */ 55 | 56 | const [ , , receiverAccount ] = await ethers.getSigners(); 57 | 58 | const params = { 59 | operationId: ' ', 60 | cnpj8Sender: ' ', 61 | cnpj8Receiver: ' ', 62 | tpftData: { 63 | acronym: '', 64 | code: " ", 65 | // Ex: const date = new Date("2023-09-26"); Math.floor(date.getTime() / 1000); retorno 1695686400 66 | maturityDate: '', 67 | }, 68 | tpftAmount: ' ', 69 | unitPrice: ' ', 70 | } 71 | 72 | /** 73 | * Quando o cedente está transmitindo o comando da operação. 74 | */ 75 | const callerPartBySender = BigNumber.from(0) 76 | /** 77 | * Quando o cessionário está transmitindo o comando da operação. 78 | */ 79 | const callerPartByReceiver = BigNumber.from(1) 80 | 81 | /** 82 | * Função a ser chamada para aprovar uma quantidade de Real Digital para o contrato TPFtDvP 83 | * de acordo com os critérios do participante. 84 | */ 85 | const realDigitalAmount = 1000; 86 | 87 | approveRealDigital(realDigitalAddress, receiverAccount.address, realDigitalAmount, tpftDvpAddress) 88 | 89 | /** 90 | * Registro da liquidação de oferta pública de TPFt por parte do receiver 91 | * chamando a função auctionPlacement 92 | */ 93 | const receiverTransaction = await TPFtOperation1002 94 | .connect(receiverAccount) 95 | .auctionPlacement( 96 | params.operationId, 97 | params.cnpj8Sender, 98 | params.cnpj8Receiver, 99 | callerPartByReceiver, 100 | params.tpftData, 101 | params.tpftAmount, 102 | params.unitPrice 103 | ) 104 | 105 | /** 106 | * Aguarda até que a transação enviada pelo receiver seja confirmada na blockchain. 107 | */ 108 | await receiverTransaction.wait(); 109 | 110 | /** 111 | * Resposta da operação de liquidação de oferta pública de TPFt. 112 | */ 113 | console.log(receiverTransaction.hash); 114 | } 115 | -------------------------------------------------------------------------------- /exemplos/example6.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import { BigNumber } from "ethers"; 3 | import { setApprovalForAll } from "./setApprovalForAll"; 4 | import { approveRealDigital } from "./approveRealDigital"; 5 | import abiITPFtOperation1052 from "../abi/ITPFtOperation1052.json"; 6 | import abiAddressDiscovery from "../abi/AddressDiscovery.json"; 7 | 8 | /** 9 | * TPFtOperation1052 - Permite que participantes cadastrados no Real Digital 10 | * realizem a operação de compra e venda envolvendo Título Público Federal tokenizado (TPFt) 11 | * entre si e/ou seus clientes utilizando seus CNPJ8s. 12 | * @dev Para a operação ocorrer é necessário que cada carteira de aprovação para o endereço contrato TPFtDvP 13 | * no Real Digital através da função approve e no TPFt através setApprovalForAll. 14 | */ 15 | async function tradeByCNPJ8() { 16 | /** 17 | * Obtém contrato Address Discovery 18 | */ 19 | const addressDiscrovery = await ethers.getContractAt( 20 | abiAddressDiscovery, 21 | '' 22 | ); 23 | 24 | /** 25 | * Endereço do TPFt 26 | */ 27 | const tpftAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFt')); 28 | 29 | /** 30 | * Endereço do TPFtDvP 31 | */ 32 | const tpftDvpAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtDvP')); 33 | 34 | /** 35 | * Endereço do Real Digital 36 | */ 37 | const realDigitalAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('RealDigital')); 38 | 39 | /** 40 | * Endereço do TPFtOperation1052 41 | */ 42 | const tpftOperation1052Address = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtOperation1052')); 43 | 44 | /** 45 | * Obtém contrato TPFtOperation1052 46 | */ 47 | const TPFtOperation1052 = await ethers.getContractAt( 48 | abiITPFtOperation1052, 49 | tpftOperation1052Address 50 | ); 51 | 52 | /** 53 | * Sender refere-se ao cedente (detentor de TPFts) e receiver refere-se ao cessionário (não detentor de TPFts) 54 | */ 55 | const [, senderAccount, receiverAccount] = await ethers.getSigners(); 56 | 57 | const params = { 58 | operationId: " ", 59 | cnpj8Sender: " ", 60 | cnpj8Receiver: " ", 61 | tpftData: { 62 | acronym: "", 63 | code: " ", 64 | // Ex: const date = new Date("2023-09-26"); Math.floor(date.getTime() / 1000); retorno 1695686400 65 | maturityDate: "", 66 | }, 67 | tpftAmount: " ", 68 | unitPrice: " ", 69 | }; 70 | 71 | /** 72 | * Quando o cedente está transmitindo o comando da operação. 73 | */ 74 | const callerPartBySender = BigNumber.from(0); 75 | /** 76 | * Quando o cessionário está transmitindo o comando da operação. 77 | */ 78 | const callerPartByReceiver = BigNumber.from(1); 79 | 80 | /** 81 | * Função a ser chamada somente uma vez para aprovar o contrato TPFtDvP no TPFt. 82 | */ 83 | setApprovalForAll(senderAccount.address, tpftAddress, tpftDvpAddress) 84 | 85 | /** 86 | * Função a ser chamada para aprovar uma quantidade de Real Digital para o contrato TPFtDvP 87 | * de acordo com os critérios do participante. 88 | */ 89 | const realDigitalAmount = 1000; 90 | 91 | approveRealDigital(realDigitalAddress, receiverAccount.address, realDigitalAmount, tpftDvpAddress) 92 | 93 | /** 94 | * Execução por parte do sender (cedente) para realizar operação de 95 | * Compra e venda informando o CNPJ8. 96 | */ 97 | const senderTransaction = await TPFtOperation1052 98 | .connect(senderAccount) 99 | ?.[ 100 | "trade(uint256,uint256,uint256,uint8,(string,string,uint256),uint256,uint256)" 101 | ]( 102 | params.operationId, 103 | params.cnpj8Sender, 104 | params.cnpj8Receiver, 105 | callerPartBySender, 106 | params.tpftData, 107 | params.tpftAmount, 108 | params.unitPrice 109 | ); 110 | 111 | /** 112 | * Aguarda até que a transação enviada pelo sender seja confirmada na blockchain. 113 | */ 114 | await senderTransaction.wait(); 115 | 116 | /** 117 | * Execução por parte do receiver (cessionário) para realizar operação de 118 | * Compra e venda informando o CNPJ8. 119 | */ 120 | const receiverTransaction = await TPFtOperation1052 121 | .connect(receiverAccount) 122 | ?.[ 123 | "trade(uint256,uint256,uint256,uint8,(string,string,uint256),uint256,uint256)" 124 | ]( 125 | params.operationId, 126 | params.cnpj8Sender, 127 | params.cnpj8Receiver, 128 | callerPartByReceiver, 129 | params.tpftData, 130 | params.tpftAmount, 131 | params.unitPrice 132 | ); 133 | 134 | /** 135 | * Aguarda até que a transação enviada pelo receiver seja confirmada na blockchain. 136 | */ 137 | await receiverTransaction.wait(); 138 | 139 | /** 140 | * Resposta da execução da operação de compra e venda 141 | */ 142 | console.log(senderTransaction.hash); 143 | console.log(receiverTransaction.hash); 144 | } 145 | 146 | /** 147 | * TPFtOperation1052 - Permite que participantes cadastrados no Real Digital 148 | * realizem a operação de compra e venda envolvendo Título Público Federal tokenizado (TPFt) 149 | * entre si e/ou seus clientes utilizando seus endereços de carteiras. 150 | * @dev Para a operação ocorrer é necessário que cada carteira de aprovação para o endereço contrato TPFtDvP 151 | * no Real Digital através da função approve e no TPFt através setApprovalForAll. 152 | */ 153 | async function tradeByAddresses() { 154 | 155 | /** 156 | * Obtém contrato Address Discovery 157 | */ 158 | const addressDiscrovery = await ethers.getContractAt( 159 | abiAddressDiscovery, 160 | '' 161 | ); 162 | 163 | /** 164 | * Endereço do TPFt 165 | */ 166 | const tpftAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFt')); 167 | 168 | /** 169 | * Endereço do TPFtDvP 170 | */ 171 | const tpftDvpAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtDvP')); 172 | 173 | /** 174 | * Endereço do Real Digital 175 | */ 176 | const realDigitalAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('RealDigital')); 177 | 178 | /** 179 | * Endereço do TPFtOperation1052 180 | */ 181 | const tpftOperation1052Address = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtOperation1052')); 182 | 183 | const TPFtOperation1052 = await ethers.getContractAt( 184 | abiITPFtOperation1052, 185 | tpftOperation1052Address 186 | ); 187 | 188 | /** 189 | * Sender refere-se ao cedente (detentor de TPFts) e receiver refere-se ao cessionário (não detentor de TPFts) 190 | */ 191 | const [, senderAccount, receiverAccount] = await ethers.getSigners(); 192 | 193 | const params = { 194 | operationId: " ", 195 | tpftData: { 196 | acronym: "", 197 | code: " ", 198 | // Ex: const date = new Date("2023-09-26"); Math.floor(date.getTime() / 1000); retorno 1695686400 199 | maturityDate: "", 200 | }, 201 | tpftAmount: " ", 202 | unitPrice: " ", 203 | }; 204 | 205 | /** 206 | * Quando o cedente está transmitindo o comando da operação. 207 | */ 208 | const callerPartBySender = BigNumber.from(0); 209 | /** 210 | * Quando o cessionário está transmitindo o comando da operação. 211 | */ 212 | const callerPartByReceiver = BigNumber.from(1); 213 | 214 | /** 215 | * Função a ser chamada somente uma vez para aprovar o contrato TPFtDvP no TPFt. 216 | */ 217 | setApprovalForAll(senderAccount.address, tpftAddress, tpftDvpAddress) 218 | 219 | /** 220 | * Função a ser chamada para aprovar uma quantidade de Real Digital para o contrato TPFtDvP 221 | * de acordo com os critérios do participante. 222 | */ 223 | const realDigitalAmount = 1000; 224 | 225 | approveRealDigital(realDigitalAddress, receiverAccount.address, realDigitalAmount, tpftDvpAddress) 226 | 227 | /** 228 | * Registro por parte do sender (cedente) para realizar operação de 229 | * compra e venda informando o endereço das carteiras. 230 | */ 231 | const senderTransaction = await TPFtOperation1052 232 | .connect(senderAccount) 233 | ?.[ 234 | "trade(uint256,address,address,uint8,(string,string,uint256),uint256,uint256)" 235 | ]( 236 | params.operationId, 237 | senderAccount.address, 238 | receiverAccount.address, 239 | callerPartBySender, 240 | params.tpftData, 241 | params.tpftAmount, 242 | params.unitPrice 243 | ); 244 | 245 | /** 246 | * Aguarda até que a transação enviada pelo sender seja confirmada na blockchain. 247 | */ 248 | await senderTransaction.wait(); 249 | 250 | /** 251 | * Registro por parte do receiver (cessionário) para realizar operação de 252 | * compra e venda informando o endereço das carteiras. 253 | */ 254 | const receiverTransaction = await TPFtOperation1052 255 | .connect(receiverAccount) 256 | ?.[ 257 | "trade(uint256,address,address,uint8,(string,string,uint256),uint256,uint256)" 258 | ]( 259 | params.operationId, 260 | senderAccount.address, 261 | receiverAccount.address, 262 | callerPartByReceiver, 263 | params.tpftData, 264 | params.tpftAmount, 265 | params.unitPrice 266 | ); 267 | 268 | /** 269 | * Aguarda até que a transação enviada pelo receiver seja confirmada na blockchain. 270 | */ 271 | await receiverTransaction.wait(); 272 | 273 | /** 274 | * Resposta da execução da operação de compra e venda 275 | */ 276 | console.log(senderTransaction.hash); 277 | console.log(receiverTransaction.hash); 278 | } 279 | -------------------------------------------------------------------------------- /exemplos/example7.ts: -------------------------------------------------------------------------------- 1 | import {ethers} from "hardhat"; 2 | import abiTPFt from "../abi/ITPFt.json"; 3 | import abiIERC1155 from "../abi/IERC1155.json"; 4 | import abiAddressDiscovery from "../abi/AddressDiscovery.json"; 5 | 6 | /** 7 | * TPFt - Permite a obtenção do id do TPFt 8 | */ 9 | async function getTpftId() { 10 | /** 11 | * Obtém contrato Address Discovery 12 | */ 13 | const addressDiscrovery = await ethers.getContractAt( 14 | abiAddressDiscovery, 15 | '' 16 | ); 17 | 18 | /** 19 | * Endereço do TPFt 20 | */ 21 | const tpftAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFt')); 22 | 23 | /** 24 | * Obtém contrato TPFt 25 | */ 26 | const TPFt = await ethers.getContractAt( 27 | abiTPFt, 28 | tpftAddress 29 | ); 30 | 31 | const params = { 32 | tpftData: { 33 | acronym: '', 34 | code: ' ', 35 | // A função Math.floor(date.getTime() / 1000) transformar data milissegundos em segundos(timestamp Unix) 36 | maturityDate: '', 37 | } 38 | } 39 | 40 | //Obtém o id do TPFt. 41 | const tpftId = await TPFt.getTPFtId( 42 | params.tpftData, 43 | ); 44 | 45 | //Imprime o id do TPFt. 46 | console.log(tpftId.toString()); 47 | 48 | return tpftId; 49 | 50 | } 51 | 52 | /** 53 | * TPFt - Permite a consulta de saldo de TPFt em base ao seu id 54 | */ 55 | async function balanceOfTpft() { 56 | /** 57 | * Obtém contrato Address Discovery 58 | */ 59 | const addressDiscrovery = await ethers.getContractAt( 60 | abiAddressDiscovery, 61 | ' ' 62 | ); 63 | 64 | /** 65 | * Endereço do TPFt 66 | */ 67 | const tpftAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFt')); 68 | 69 | /** 70 | * Obtém contrato TPFt 71 | */ 72 | const TPFt = await ethers.getContractAt( 73 | abiIERC1155, 74 | tpftAddress 75 | ); 76 | 77 | const params = { 78 | tpftId: ' ', 79 | } 80 | 81 | //Consulta do saldo do TPFt. 82 | const balanceOfTPFt = await TPFt.balanceOf( 83 | ' ', 84 | params.tpftId 85 | ) 86 | 87 | //Saldo do TPFt. 88 | console.log(balanceOfTPFt.toString()); 89 | } 90 | 91 | 92 | -------------------------------------------------------------------------------- /exemplos/example8.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import abiSwapOneStep from '../abi/SwapOneStep.json'; 3 | import abiRealDigital from '../abi/RealDigital.json'; 4 | import abiRealTokenizado from '../abi/RealTokenizado.json'; 5 | 6 | // exemplo de transferencia entre clientes de instituições diferentes usando o SwapOneStep 7 | async function example8() { 8 | // Os endereços dos contratos podem ser consultados no AddressDiscovery 9 | const swapOneStep = await ethers.getContractAt(abiSwapOneStep, ' '); 10 | const cbdc = await ethers.getContractAt(abiRealDigital, ' '); 11 | const drexSender = await ethers.getContractAt(abiRealTokenizado, ' '); 12 | const drexReceiverAddress = ' '; 13 | 14 | // Pode ser consultado no KeyDictionary 15 | const receiver = ' '; 16 | const amount = ethers.utils.parseUnits("100", 2); 17 | 18 | // drexSenderAuthority é a carteira que possui autoridade sobre o real tokenizado do participante que esta enviando a transação, 19 | // caso o endereço de reserva do real tokenizado tenha sido atualizado, deve ser passado a carteira de reserva para qual foi atualizada. 20 | const [ drexSenderAuthority, senderCustomer ] = await ethers.getSigners(); 21 | 22 | await (await cbdc.connect(drexSenderAuthority).approve(swapOneStep.address, amount)).wait(); 23 | await (await drexSender.connect(senderCustomer).approve(swapOneStep.address, amount)).wait(); 24 | 25 | const result = await swapOneStep.connect(senderCustomer).executeSwap(drexSender.address, drexReceiverAddress, receiver, amount); 26 | await result.wait(); 27 | 28 | console.log(result.hash); 29 | } -------------------------------------------------------------------------------- /exemplos/example9.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import { BigNumber } from "ethers"; 3 | import { setApprovalForAll } from "./setApprovalForAll"; 4 | import { approveRealTokenizado } from "./approveRealTokenizado"; 5 | import abiITPFtOperation1052 from "../abi/ITPFtOperation1052.json"; 6 | import abiAddressDiscovery from "../abi/AddressDiscovery.json"; 7 | 8 | 9 | /** 10 | * TPFtOperation1052 - Permite que a operação de compra e venda envolvendo Título Público Federal tokenizado (TPFt) 11 | * seja realizada entre um participante (cedente) cadastrado no Real Digital e seus clientes (cessionários) 12 | * utilizando seus respetivos endereços de carteiras. 13 | * @dev Para que a operação seja concluida com sucesso, a carteira do participante e do seu cliente devem 14 | * aprovar o endereço do contrato TPFtDvP em seu Real Tokenizado usando a função "approve" e 15 | * no TPFt por meio da função "setApprovalForAll". 16 | */ 17 | async function tradeParticipantAndItsClientByAddresses() { 18 | 19 | /** 20 | * Obtém contrato Address Discovery 21 | */ 22 | const addressDiscrovery = await ethers.getContractAt( 23 | abiAddressDiscovery, 24 | ' ' 25 | ); 26 | 27 | /** 28 | * Endereço do TPFt 29 | */ 30 | const tpftAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFt')); 31 | 32 | /** 33 | * Endereço do TPFtDvP 34 | */ 35 | const tpftDvpAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtDvP')); 36 | 37 | /** 38 | * Endereço do TPFtOperation1052 39 | */ 40 | const tpftOperation1052Address = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtOperation1052')); 41 | 42 | /** 43 | * Obtém contrato TPFtOperation1052 44 | */ 45 | const TPFtOperation1052 = await ethers.getContractAt( 46 | abiITPFtOperation1052, 47 | tpftOperation1052Address 48 | ); 49 | 50 | /** 51 | * senderParticipant (Ex. Participante A) refere-se ao cedente (detentor de TPFts) 52 | */ 53 | const [, , senderParticipant] = await ethers.getSigners(); 54 | const senderParticipantAddress = senderParticipant.address; 55 | 56 | /** 57 | * receiverClient (Ex. Cliente do Participante A) refere-se ao cessionário (não detentor de TPFts) 58 | */ 59 | const receiverClientAddress = ' '; 60 | const receiverClient = await ethers.getSigner(receiverClientAddress); 61 | 62 | /** 63 | * Endereço do RealTokenizedParticipant (Ex. Endereço do Real Tokenizado do Participante A) 64 | * @dev Como o receiverClient (Ex. Cliente do Participante A) pertence ao senderParticipant, o mesmo endereço do 65 | * contrato do RealTokenizedParticipant deve ser utilizado por ambas partes. 66 | * Além disso, o receiverClient deve estar cadastrado no RealTokenizedParticipant 67 | */ 68 | const realTokenizedParticipantAddress = ' ' 69 | 70 | const params = { 71 | operationId: " ", 72 | tpftData: { 73 | acronym: "", 74 | code: " ", 75 | // Ex: const date = new Date("2023-09-26"); Math.floor(date.getTime() / 1000); retorno 1695686400 76 | maturityDate: "", 77 | }, 78 | tpftAmount: " ", 79 | unitPrice: " ", 80 | }; 81 | 82 | /** 83 | * Quando o cedente está transmitindo o comando da operação. 84 | */ 85 | const callerPartBySender = BigNumber.from(0); 86 | /** 87 | * Quando o cessionário está transmitindo o comando da operação. 88 | */ 89 | const callerPartByReceiver = BigNumber.from(1); 90 | 91 | /** 92 | * Função a ser chamada somente uma vez para aprovar o contrato TPFtDvP no TPFt. 93 | */ 94 | setApprovalForAll(senderParticipantAddress, tpftAddress, tpftDvpAddress) 95 | 96 | /** 97 | * Função a ser chamada para aprovar uma quantidade de Real Tokenizado para o contrato TPFtDvP 98 | * de acordo com os critérios do cliente. 99 | */ 100 | const realTokenizadoAmount = 1000; 101 | 102 | approveRealTokenizado(realTokenizedParticipantAddress, receiverClientAddress, realTokenizadoAmount, tpftDvpAddress) 103 | 104 | /** 105 | * Registro por parte do senderParticipant (cedente) para realizar operação de 106 | * compra e venda informando o endereço das carteiras. 107 | */ 108 | const senderTransaction = await TPFtOperation1052 109 | .connect(senderParticipant) 110 | ?.[ 111 | "trade(uint256,address,address,address,address,uint8,(string,string,uint256),uint256,uint256)" 112 | ]( 113 | params.operationId, 114 | senderParticipantAddress, 115 | realTokenizedParticipantAddress, 116 | receiverClientAddress, 117 | realTokenizedParticipantAddress, 118 | callerPartBySender, 119 | params.tpftData, 120 | params.tpftAmount, 121 | params.unitPrice 122 | ); 123 | 124 | /** 125 | * Aguarda até que a transação enviada pelo sender seja confirmada na blockchain. 126 | */ 127 | await senderTransaction.wait(); 128 | 129 | /** 130 | * Registro por parte do receiverClient (cessionário) para realizar operação de 131 | * compra e venda informando o endereço das carteiras. 132 | */ 133 | const receiverTransaction = await TPFtOperation1052 134 | .connect(receiverClient) 135 | ?.[ 136 | "trade(uint256,address,address,address,address,uint8,(string,string,uint256),uint256,uint256)" 137 | ]( 138 | params.operationId, 139 | senderParticipantAddress, 140 | realTokenizedParticipantAddress, 141 | receiverClientAddress, 142 | realTokenizedParticipantAddress, 143 | callerPartByReceiver, 144 | params.tpftData, 145 | params.tpftAmount, 146 | params.unitPrice 147 | ); 148 | 149 | /** 150 | * Aguarda até que a transação enviada pelo receiver seja confirmada na blockchain. 151 | */ 152 | await receiverTransaction.wait(); 153 | 154 | /** 155 | * Resposta da execução da operação de compra e venda 156 | */ 157 | console.log(senderTransaction.hash); 158 | console.log(receiverTransaction.hash); 159 | } 160 | -------------------------------------------------------------------------------- /exemplos/hardhat.config.ts: -------------------------------------------------------------------------------- 1 | import { HardhatUserConfig } from "hardhat/config"; 2 | import "@nomicfoundation/hardhat-toolbox"; 3 | 4 | 5 | const config: HardhatUserConfig = { 6 | solidity: { 7 | version: "0.8.19", 8 | settings: { 9 | optimizer: { 10 | enabled: true, 11 | runs: 200 12 | }, 13 | }, 14 | }, 15 | networks: { 16 | besu: { 17 | url: "", 18 | accounts: [" "] 19 | } 20 | } 21 | }; 22 | 23 | export default config; 24 | -------------------------------------------------------------------------------- /exemplos/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kit-onboarding-example", 3 | "version": "0.0.1", 4 | "description": "Exemplo de chamada dos contratos", 5 | "main": "index.js", 6 | "scripts": { 7 | "example": "npx hardhat run --network besu ./example.ts" 8 | }, 9 | "author": "", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "@ethersproject/abi": "^5.7.0", 13 | "@ethersproject/providers": "^5.7.2", 14 | "@nomicfoundation/hardhat-chai-matchers": "^1.0.6", 15 | "@nomicfoundation/hardhat-network-helpers": "^1.0.6", 16 | "@nomicfoundation/hardhat-toolbox": "^2.0.0", 17 | "@nomiclabs/hardhat-ethers": "^2.2.0", 18 | "@nomiclabs/hardhat-etherscan": "^3.1.1", 19 | "@openzeppelin/contracts": "^4.8.0", 20 | "@typechain/ethers-v5": "^10.1.1", 21 | "@typechain/hardhat": "^6.1.4", 22 | "@types/chai": "^4.3.3", 23 | "@types/mocha": "^9.1.1", 24 | "@types/node": "^18.11.6", 25 | "chai": "^4.3.6", 26 | "ethers": "^5.7.2", 27 | "hardhat": "^2.12.0", 28 | "hardhat-gas-reporter": "^1.0.9", 29 | "solidity-coverage": "^0.8.2", 30 | "ts-node": "^10.9.1", 31 | "typechain": "^8.1.1", 32 | "typescript": "^4.8.4" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /exemplos/setApprovalForAll.ts: -------------------------------------------------------------------------------- 1 | import { ethers } from "hardhat"; 2 | import abiIERC1155 from "../abi/IERC1155.json"; 3 | 4 | /** 5 | * TPFt - como dar aprovação ao contrato TPFtDvP necessária em algumas operações. 6 | */ 7 | export async function setApprovalForAll( 8 | owner: string, 9 | tpftAddress: string, 10 | tpftDvpAddress: string) 11 | { 12 | /** 13 | * Obtém contrato TPFt 14 | */ 15 | const TPFt = await ethers.getContractAt( 16 | abiIERC1155, 17 | tpftAddress 18 | ); 19 | 20 | /** 21 | * Dono do TPFt 22 | */ 23 | const ownerSigner = await ethers.getSigner(owner); 24 | 25 | /** 26 | * Aprova o contrato TPFtDvP a negociar TPFt 27 | */ 28 | await TPFt.connect(ownerSigner).setApprovalForAll(tpftDvpAddress, true); 29 | } 30 | 31 | /** 32 | * Função a ser chamada somente uma vez para aprovar o contrato TPFtDvP no TPFt. 33 | */ 34 | setApprovalForAll( 35 | ' ', 36 | ' ', 37 | ' ' 38 | ) 39 | -------------------------------------------------------------------------------- /exemplos/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2020", 4 | "module": "commonjs", 5 | "esModuleInterop": true, 6 | "forceConsistentCasingInFileNames": true, 7 | "strict": true, 8 | "skipLibCheck": true, 9 | "resolveJsonModule": true 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /genesis.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "chainId": 381660001, 4 | "muirglacierblock": 0, 5 | "qbft": { 6 | "blockperiodseconds": 5, 7 | "epochlength": 30000, 8 | "requesttimeoutseconds": 10 9 | } 10 | }, 11 | "nonce": "0x0", 12 | "timestamp": "0x58ee40ba", 13 | "extraData": "0xf87aa00000000000000000000000000000000000000000000000000000000000000000f854946b45f213f53d31e2f125b1a7a0647e966314a581943d6ab39222b6fc9a3b0838ff43ac6b989eaec74094fc13c289e22249d8f3c949ed61865f309fc4be0b943017ae288af105620c148f4973e8208b8077175fc080c0", 14 | "gasLimit": "0x1fffffffffffff", 15 | "difficulty": "0x1", 16 | "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", 17 | "coinbase": "0x0000000000000000000000000000000000000000", 18 | "alloc": { 19 | "0x0000000000000000000000000000000000009999": { 20 | "comment": "Node Ingress smart contract", 21 | "balance": "0", 22 | "code": "608060405234801561001057600080fd5b50600436106100a95760003560e01c80634dc3fefc116100715780634dc3fefc146101365780638aa104351461014b578063a43e04d814610153578063de8fa43114610166578063e001f8411461016e578063fe9fbb801461018157600080fd5b80630d2020dd146100ae57806310d9042e146100de57806311601306146100f35780631e7c27cb1461010a57806345a59e5b14610113575b600080fd5b6100c16100bc3660046107b7565b610194565b6040516001600160a01b0390911681526020015b60405180910390f35b6100e66101d8565b6040516100d591906107d0565b6100fc60005481565b6040519081526020016100d5565b6100fc60015481565b61012661012136600461085d565b610230565b60405190151581526020016100d5565b6101496101443660046108f9565b6102f0565b005b6005546100fc565b6101266101613660046107b7565b6103ab565b6003546100fc565b61012661017c366004610934565b6105ac565b61012661018f366004610960565b61070d565b6000816101bc5760405162461bcd60e51b81526004016101b39061097b565b60405180910390fd5b506000908152600260205260409020546001600160a01b031690565b6060600380548060200260200160405190810160405280929190818152602001828054801561022657602002820191906000526020600020905b815481526020019060010190808311610212575b5050505050905090565b6000806001600160a01b0316610247600054610194565b6001600160a01b03160361025d575060006102e7565b60008054815260026020526040908190205490516345a59e5b60e01b81526001600160a01b03909116906345a59e5b906102a390899089908990899089906004016109d9565b602060405180830381865afa1580156102c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e49190610a17565b90505b95945050505050565b600080548152600260205260409020546001600160a01b031633146103735760405162461bcd60e51b815260206004820152603360248201527f4f6e6c792052756c657320636f6e74726163742063616e20747269676765722060448201527252756c6573206368616e6765206576656e747360681b60648201526084016101b3565b60405181151581527f66120f934b66d52127e448f8e94c2460ea62821335e0dd18e89ed38a4a09b4139060200160405180910390a150565b6000816103ca5760405162461bcd60e51b81526004016101b39061097b565b60035461044f5760405162461bcd60e51b815260206004820152604760248201527f4d7573742068617665206174206c65617374206f6e652072656769737465726560448201527f6420636f6e747261637420746f20657865637574652064656c657465206f70656064820152663930ba34b7b71760c91b608482015260a4016101b3565b6104583361070d565b6104745760405162461bcd60e51b81526004016101b390610a34565b600082815260046020526040902054801580159061049457506003548111155b156105a35760035481146105135760038054600091906104b690600190610a7f565b815481106104c6576104c6610aa0565b906000526020600020015490508060036001846104e39190610a7f565b815481106104f3576104f3610aa0565b600091825260208083209091019290925591825260049052604090208190555b600380548061052457610524610ab6565b6000828152602080822060001990840181018390559092019092558482526004815260408083208390556002825280832080546001600160a01b031916905580519283529082018590527fe3d908a1f6d2467f8e7c8198f30125843211345eedb763beb4cdfb7fe728a5af91015b60405180910390a150600192915050565b50600092915050565b6000826105cb5760405162461bcd60e51b81526004016101b39061097b565b6001600160a01b03821661062c5760405162461bcd60e51b815260206004820152602260248201527f436f6e74726163742061646472657373206d757374206e6f74206265207a6572604482015261379760f11b60648201526084016101b3565b6106353361070d565b6106515760405162461bcd60e51b81526004016101b390610a34565b60008381526004602052604081205490036106a657600380546001810182557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b01849055546000848152600460205260409020555b60008381526002602090815260409182902080546001600160a01b0319166001600160a01b03861690811790915582519081529081018590527fe3d908a1f6d2467f8e7c8198f30125843211345eedb763beb4cdfb7fe728a5af9101610592565b92915050565b6001546000908152600260205260408120546001600160a01b031661073457506001919050565b600154600090815260026020526040908190205490516301fd3f7760e71b81526001600160a01b0384811660048301529091169063fe9fbb8090602401602060405180830381865afa15801561078e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107079190610a17565b919050565b6000602082840312156107c957600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015610808578351835292840192918401916001016107ec565b50909695505050505050565b60008083601f84011261082657600080fd5b50813567ffffffffffffffff81111561083e57600080fd5b60208301915083602082850101111561085657600080fd5b9250929050565b60008060008060006060868803121561087557600080fd5b853567ffffffffffffffff8082111561088d57600080fd5b61089989838a01610814565b909750955060208801359150808211156108b257600080fd5b506108bf88828901610814565b909450925050604086013561ffff811681146108da57600080fd5b809150509295509295909350565b80151581146108f657600080fd5b50565b60006020828403121561090b57600080fd5b8135610916816108e8565b9392505050565b80356001600160a01b03811681146107b257600080fd5b6000806040838503121561094757600080fd5b823591506109576020840161091d565b90509250929050565b60006020828403121561097257600080fd5b6109168261091d565b6020808252818101527f436f6e7472616374206e616d65206d757374206e6f7420626520656d7074792e604082015260600190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006109ed6060830187896109b0565b8281036020840152610a008186886109b0565b91505061ffff831660408301529695505050505050565b600060208284031215610a2957600080fd5b8151610916816108e8565b6020808252602b908201527f4e6f7420617574686f72697a656420746f2075706461746520636f6e7472616360408201526a3a103932b3b4b9ba393c9760a91b606082015260800190565b8181038181111561070757634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfea26469706673582212207ab8f87f5693b99fe9c6bd25a60c3bdae73fa6a640827bce9829a2c17eaca56164736f6c63430008130033", 23 | "storage": { 24 | "0x0000000000000000000000000000000000000000000000000000000000000000": "0x72756c6573000000000000000000000000000000000000000000000000000000", 25 | "0x0000000000000000000000000000000000000000000000000000000000000001": "0x61646d696e697374726174696f6e000000000000000000000000000000000000", 26 | "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0f4240" 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /smartcontracts.md: -------------------------------------------------------------------------------- 1 | # Interação com os _smart contracts_ 2 | 3 | ## Objetivo 4 | 5 | Esta documentação tem como objetivo explicar como será feita a interação com os _smart contracts_ que estão disponíveis na Rede do Piloto do Real Digital para uso dos ativos Real Digital e Real Tokenizado. 6 | 7 | Por se tratar de um piloto em ambiente de testes, esta documentação está sujeita a constantes evoluções que serão aqui refletidas. 8 | 9 | Serão fornecidos ao participante do piloto a [ABI](https://docs.soliditylang.org/en/v0.8.20/abi-spec.html) de cada um dos contratos e seus respectivos endereços publicados na rede. Cada participante deve implementar, da forma que melhor entender, a sua interação com os contratos, fazendo uso de bibliotecas padrão Web3 como, por exemplo, o [Web3JS](https://web3js.readthedocs.io/en/v1.10.0/), [Web3J](https://docs.web3j.io/4.10.0/), ou frameworks como, por exemplo, o [Hardhat](https://hardhat.org/) ou [Truffle](https://trufflesuite.com/). 10 | 11 | No piloto, todos os contratos serão implementados e publicados na rede pelo Banco Central do Brasil. 12 | 13 | 14 | ## CBDC - [Real Digital](./RealDigital.md) 15 | 16 | O CBDC (Central Bank Digital Currency) está definido no contrato chamado [RealDigital](./abi/RealDigital.json). 17 | 18 | Este contrato foi desenvolvido usando como base o padrão [ERC20](https://ethereum.org/pt/developers/docs/standards/tokens/erc-20/), com a adição de [funções específicas de controle de acesso](./CBDCAccessControl.md) e com as seguintes características: 19 | 20 | * A carteira do Banco Central do Brasil é a gestora do token. 21 | * O símbolo do token é `BRL`. 22 | * Valor definido com 2 casas decimais 23 | * Apenas instituições detentoras de Conta Reservas ou Conta de Liquidação e o Tesouro Nacional poderão ter Real Digital em suas carteiras. 24 | * Cada participante deve mandar ao Banco Central do Brasil o endereço da sua carteira principal para o cadastro. Esta carteira será a carteira _default_ do participante e poderá ser posteriormente alterada através do contrato [RealDigitalDefaultAccount](./RealDigitalDefaultAccount.md). 25 | * Após o cadastro inicial, o próprio participante poderá habilitar outras carteiras a receber Real Digital através do contrato [RealDigitalEnableAccount](./RealDigitalDefaultAccount.md). 26 | * A solicitação de emissão de Real Digital será feita mediante chamada da carteira ao contrato [STR](./abi/STR.md) 27 | 28 | ### [Real Digital Default Account](./RealDigitalDefaultAccount.md) 29 | 30 | O contrato [RealDigitalDefaulAccount](./abi/RealDigitalDefaultAccount.json) permite ao participante trocar a sua carteira _default_, através do método `updateDefaultWallet`. 31 | 32 | Ainda, através do _mapping_ `defaultAccount`, é possível recuperar a carteira _default_ dos outros participantes, bastando passar como parâmetro o CNPJ8 da instituição desejada. 33 | 34 | A carteira _default_ será necessária para as transações de _swap_ detalhadas em seção específica de [swaps](). 35 | 36 | ### [Real Digital Enable Account](./RealDigitalEnableAccount.md) 37 | 38 | O contrato [RealDigitalEnableAccount](./abi/RealDigitalEnableAccount.json) permite ao participante habilitar ou desabilitar outras carteiras de sua posse para o recebimento de Real Digital. 39 | 40 | Para habilitação deve ser utilizado o método `enableAccount`. Para desabilitação, `disableAccount`. 41 | 42 | ### [STR](./STR.md) 43 | 44 | O contrato chamado [STR](./abi/STR.json) representa uma simulação do sistema STR, será por meio desse contrato que os participantes solicitarão Real Digital ao Banco Central do Brasil no âmbito do projeto Piloto. 45 | 46 | Este contrato permite que qualquer participante solicite o _mint_ de Real Digital através de uma carteira previamente habilitada. 47 | 48 | Para solicitar a emissão deve ser utilizado o método `requestToMint`. 49 | 50 | 51 | ## DVt (Depósito bancário à vista tokenizado) e MEt (Moeda eletrônica tokenizada) - [Real Tokenizado](./RealTokenizado.md) 52 | 53 | O Real Tokenizado está definido no contrato chamado [RealTokenizado](./abi/RealTokenizado.json). 54 | 55 | Este contrato foi desenvolvido usando como base o padrão [ERC20](https://ethereum.org/pt/developers/docs/standards/tokens/erc-20/), com a adição de [funções específicas de controle de acesso](./CBDCAccessControl.md) e com as seguintes características: 56 | 57 | 58 | * A primeira carteira default do participante será a gestora do token; 59 | * A criação e publicação do contrato na rede será feita exclusivamente pelo Banco Central do Brasil; 60 | * Caso seja necessário alterar a carteira gestora, deve ser feita solicitação de alteração ao Banco Central do Brasil através dos mecanismos oficiais de comunicação; 61 | * O símbolo do token `BRL@CNPJ8`. Exemplo `BRL@11111111`, para o Real Tokenizado da instituição '11111111'; 62 | * Valor definido com 2 casas decimais; 63 | * Assim como o Real Digital, somente carteiras autorizadas podem receber Real Tokenizado; 64 | * O participante deve utilizar dos métodos `enableAccount` e `disableAccount` para gerenciar as carteiras permitidas. 65 | 66 | 67 | 68 | ### [KeyDictionary](./KeyDictionary.md) 69 | 70 | O contrato [KeyDictionary](./abi/KeyDictionary.json) simulará um Diretório de Identificadores de Contas Transacionais ([DICT](https://www.bcb.gov.br/estabilidadefinanceira/dict)) para a transferência de Real Tokenizado. Durante o piloto, os dados de clientes, sempre fictícios, devem ser inseridos na rede para recuperação e identificação das carteiras de clientes durante as operações de _swap_ de transferência entre clientes. 71 | O método a ser invocado para a inserção de dados é o `addAccount`, que tem os seguintes parâmetros: 72 | 73 | * Chave, identificador único gerado pelo participante, deve ser salvo no formato hash (keccak256); 74 | * CPF do cliente fictício; 75 | * Código do participante; 76 | * Conta do cliente fictício; 77 | * Agência do cliente fictício; 78 | * Carteira do cliente fictício. 79 | 80 | Ao iniciar uma transferência o participante poderá recuperar a carteira do destinatário através de consulta ao método `getWallet`. 81 | 82 | Ao receber uma transferência o participante recebedor poderá identificar o cliente pagador através da consulta aos métodos `getKey` e `getCustomerData`. 83 | 84 | 85 | ## Swaps e comunicação Off-Chain 86 | 87 | Sempre que houver uma transferência de Real Tokenizado entre clientes de instituições distintas, essa transferência deve ser efetivada por meio de um contrato de _swap_ que permita a troca de Real Tokenizado, usando como reserva o Real Digital das respectivas instituições envolvidas. 88 | 89 | No momento, há três implementações disponíveis: uma que executa o _swap_ em apenas uma transação e outras duas que dependem da aprovação do recebedor para que a troca seja concluída. Todas as implementações foram efetuadas utilizando os padrões de _approve_ para o respectivo contrato de _swap_ previamente à execução da operação. 90 | 91 | O objetivo do piloto é testar formas distintas de _swap_ de forma a avaliar como podem se encaixar em diferentes negócios. Há, ainda, a possibilidade de implementação de um _swap_ que envolva a troca de informações _off-chain_. 92 | 93 | 94 | ### [Swap One Step](./SwapOneStep.md) 95 | 96 | O contrato [SwapOneStep](./abi/SwapOneStep.json) efetua a transferência de Real Tokenizado em uma única transação atômica. Após os _approves_ das carteiras pagadoras de Real Tokenizado e Real Digital, a chamada ao `executeSwap` efetivará a destruição (`burn`) de Real Tokenizado do cliente pagador, a transferência (`transferFrom`) de Real Digital da instituição pagadora para a instituição recebedora e a emissão (`mint`) de Real Tokenizado para o cliente recebedor. 97 | 98 | 99 | ### [Swap Two Steps](./SwapTwoSteps.md) 100 | 101 | O contrato [SwapTwoSteps](./abi/SwapTwoSteps.json) executa a transferência de forma atômica quando o participante recebedor confirmar a operação. Após os _approves_ das carteiras pagadoras de Real Tokenizado e Real Digital, a chamada ao `startSwap` irá gerar um evento para a instituição recebedora. A instituição recebedora avalia o crédito e confirma a transferência efetivando, assim, a operação atômica. 102 | 103 | 104 | ### [Swap Two Steps Reserve](./SwapTwoStepsReserve.md) 105 | 106 | O contrato [SwapTwoStepsReserve](./abi/SwapTwoStepsReserve.json), assim como o [SwapTwoSteps](./abi/SwapTwoSteps.json), executa a transferência de forma atômica quando o participante recebedor confirmar a operação. Nesse contrato, entretanto, após os _approves_ das carteiras pagadoras de Real Tokenizado e Real Digital, a chamada ao `startSwap` efetivará a transferência dos tokens de Real Tokenizado e Real Digital para o contrato SwapToStepsReserve como forma de reserva e garantia de saldo, além de gerar um evento para a instituição recebedora. A instituição recebedora então avalia o crédito e confirma a transferência efetivando, assim, a operação atômica. 107 | 108 | 109 | 110 | [<<< Voltar](README.md) 111 | -------------------------------------------------------------------------------- /smartcontractsTitulos.md: -------------------------------------------------------------------------------- 1 | # Interação com os _smart contracts_ 2 | 3 | ## Objetivo 4 | 5 | Esta documentação tem como objetivo explicar como será feita a interação com os _smart contracts_ que estão disponíveis na Rede do Piloto do Real Digital para uso dos Títulos Públicos Federais Tokenizados e as operações de oferta e compra e venda destes títulos. 6 | 7 | Por se tratar de um piloto em ambiente de testes, esta documentação está sujeita a constantes evoluções que serão aqui refletidas. 8 | 9 | Serão fornecidos ao participante do piloto a [ABI](https://docs.soliditylang.org/en/v0.8.20/abi-spec.html) de cada um dos contratos e seus respectivos endereços publicados na rede. Cada participante deve implementar, da forma que melhor entender, a sua interação com os contratos, fazendo uso de bibliotecas padrão Web3 como, por exemplo, o [Web3JS](https://web3js.readthedocs.io/en/v1.10.0/), [Web3J](https://docs.web3j.io/4.10.0/), ou frameworks como, por exemplo, o [Hardhat](https://hardhat.org/) ou [Truffle](https://trufflesuite.com/). 10 | 11 | No piloto, todos os contratos serão implementados e publicados na rede pelo Banco Central do Brasil. 12 | 13 | ## Smart Contracts 14 | 15 | Uma operação será identificada unicamente pelo operationId informado pelo participante. Este número será único na rede e sugere-se que seja utilizado o número da faixa do participante concatenado com a data vigente. Este formato não será validado e o operationId será utilizado para realizar a correspondência de uma operação de duplo comando. 16 | 17 | Os valores de preço unitário, quantidade e valor financeiro serão tratados nos contratos assumindo os últimos algarismos como casas decimais de acordo com cada tipo de atributo. Caso o atributo seja um inteiro, deve ser preenchido o número de casas decimais com zero nos últimos algarismos. 18 | 19 | ## Título Público Federal tokenizado - [TPFt](./ITPFt.md) 20 | 21 | O TPFt está definido no contrato chamado TPFt que implementa a interface [ITPFt](./abi/ITPFt.json). 22 | 23 | - O TPFt é fungível e identificado pelo seu código, sigla e data vencimento. 24 | - A carteira da Secretaria do Tesouro Nacional (STN) é a gestora do token. 25 | - Somente carteiras autorizadas podem receber TPFt. 26 | - Os tokens disponibilizados seguirão as [características dos Títulos Públicos Federais](https://www.bcb.gov.br/content/estabilidadefinanceira/selic/CaracteristicaTitulos.pdf). 27 | 28 | ### Liquidação de oferta pública - [Operação 1002](./ITPFtOperation1002.md) 29 | 30 | A liquidação de oferta pública está definida no contrato chamado TPFtOperation1002 que implementa a interface [ITPFtOperation1002](./abi/ITPFtOperation1002.json). O contrato permite transferir quantidades inteiras de TPFt da carteira _default_ da STN para a carteira _default_ de um participante cadastrado por meio do método `auctionPlacement`. A liquidação da operação é realizada com a entrega contra pagamento (DvP) e somente o Bacen pode transmitir o comando cedente dessa operação. 31 | 32 | ### Compra e venda - [Operação 1052](./ITPFtOperation1052.md) 33 | 34 | A operação de compra e venda entre participantes e/ou clientes está definida no contrato chamado TPFtOperation1052 que implementa a interface [ITPFtOperation1052](./abi/ITPFtOperation1052.json). O contrato permite transferir quantidades fracionárias de TPFt entre carteiras de participantes e/ou clientes cadastrados por meio do método `trade`. A liquidação da operação é executada com a entrega contra pagamento (DvP). 35 | 36 | 37 | [<<< Voltar](README.md) 38 | -------------------------------------------------------------------------------- /topologia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wireshape/pilotord-kit-onboarding/efdfdea5f833bc2f31312a2b054063e838ebabf5/topologia.png --------------------------------------------------------------------------------