forked from bacen/pilotord-kit-onboarding
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexample5.ts
114 lines (99 loc) · 3.89 KB
/
example5.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import {ethers} from "hardhat";
import { BigNumber } from "ethers";
import { approveRealDigital } from "./approveRealDigital";
import abiITPFtOperation1002 from "../abi/ITPFtOperation1002.json";
import abiAddressDiscovery from "../abi/AddressDiscovery.json";
/**
* TPFtOperation1002 - Permite que o Bacen realize a liquidação de oferta pública
* envolvendo Título Público Federal tokenizado (TPFt) para um participante
* que esteja cadastrado no Real Digital utilizando seus CNPJ8.
* @dev Para a operação ocorrer é necessário que cada carteira de aprovação para o endereço contrato TPFtDvP
* no Real Digital através da função approve e no TPFt através setApprovalForAll.
*/
async function tpftOperation1002() {
/**
* Obtém contrato Address Discovery
*/
const addressDiscrovery = await ethers.getContractAt(
abiAddressDiscovery,
'<Endereço do Contrato Address Discovery>'
);
/**
* Endereço do TPFtDvP
*/
const tpftDvpAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtDvP'));
/**
* Endereço do Real Digital
*/
const realDigitalAddress = await addressDiscrovery.addressDiscovery(ethers.utils.id('RealDigital'));
/**
* Endereço do TPFtOperation1002
*/
const tpftOperation1002Address = await addressDiscrovery.addressDiscovery(ethers.utils.id('TPFtOperation1002'));
/**
* Obtém contrato TPFtOperation1002
*/
const TPFtOperation1002 = await ethers.getContractAt(
abiITPFtOperation1002,
tpftOperation1002Address
);
/**
* Sender refere-se ao cedente - Bacen atua a nome da Secretaria Nacional do Tesouro (STN).
* Receiver refere-se ao cessionário - Instituição Financeira Participante cadastrada no Real Digital.
* Restrições:
* 1. O endereço da carteira do Bacen deverá ter a _role_ de AUCTION_PLACEMENT_ROLE.
* 2. Tanto o endereço de carteira da STN como da Instituição Financeira Participante
* deverão estar habilitados no contrato TPFt.
*/
const [ , , receiverAccount ] = await ethers.getSigners();
const params = {
operationId: '<Número de operação + data vigente no formato yyyyMMdd>',
cnpj8Sender: '<CNPJ8 do cedente da operação. Sempre será o CNPJ8 da STN>',
cnpj8Receiver: '<CNPJ8 do cessionário da operação>',
tpftData: {
acronym: '<A sigla do TPFt>',
code: "<O código único do TPFt>",
// Ex: const date = new Date("2023-09-26"); Math.floor(date.getTime() / 1000); retorno 1695686400
maturityDate: '<Data de vencimento em segundos do TPFt (timestamp Unix)>',
},
tpftAmount: '<Quantidade de TPFt a ser negociada>',
unitPrice: '<Preço unitário do TPFt>',
}
/**
* 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 para aprovar uma quantidade de Real Digital para o contrato TPFtDvP
* de acordo com os critérios do participante.
*/
const realDigitalAmount = 1000;
approveRealDigital(realDigitalAddress, receiverAccount.address, realDigitalAmount, tpftDvpAddress)
/**
* Registro da liquidação de oferta pública de TPFt por parte do receiver
* chamando a função auctionPlacement
*/
const receiverTransaction = await TPFtOperation1002
.connect(receiverAccount)
.auctionPlacement(
params.operationId,
params.cnpj8Sender,
params.cnpj8Receiver,
callerPartByReceiver,
params.tpftData,
params.tpftAmount,
params.unitPrice
)
/**
* Aguarda até que a transação enviada pelo receiver seja confirmada na blockchain.
*/
await receiverTransaction.wait();
/**
* Resposta da operação de liquidação de oferta pública de TPFt.
*/
console.log(receiverTransaction.hash);
}