-
Notifications
You must be signed in to change notification settings - Fork 224
/
walletsCheckingFlow.ts
277 lines (267 loc) · 9.42 KB
/
walletsCheckingFlow.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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
import { ethers } from "hardhat";
import abiRealDigital from "../abi/RealDigital.json"
import abiRealTokenizado from "../abi/RealTokenizado.json"
import abiITPFt from "../abi/ITPFt.json"
import abiAddressDiscovery from "../abi/AddressDiscovery.json";
import abiKeyDictionary from "../abi/KeyDictionary.json";
interface CheckAddress {
name: string;
publicAddress: string;
}
/**
* Script WalletsCheckingFlow
* Objetivo: verificar se uma ou mais carteiras estão com as permissões necessárias para realizar as operações envolvendo TPFt.
* Premissa: para executar esse script é necessário assinar a transação com uma carteira de um participante habilitado no real digital.
* @param wallets Lista de carteiras que serão verificadas
*/
async function TPFtCheckApproves(wallets: CheckAddress[]) {
// Valida se lista de carteira está vazia
if (!wallets?.length) {
throw new Error("Insira carteira(s) e os contratos de TPFt e TPFtDvP");
}
// Endereço do contrato TPFt
const TPFT_CONTRACT_ADDRESS = (await addressDiscoveryContract("TPFt"))
.contractAddress;
// Endereço do contrato TPFtDvP
const TPFT_DVP_ADDRESS = (await addressDiscoveryContract("TPFtDvP"))
.contractAddress;
// Obtém contrato TPFt
const tpftContract = await ethers.getContractAt(
abiITPFt,
TPFT_CONTRACT_ADDRESS
);
console.log(`\nConsultando contrato > \x1b[33mTPFt...\x1b[0m`);
// Loop de verificação
for await (const wallet of wallets) {
// Verifica se a carteira deu aprovação para o contrato TPFtDvP operar no contrato de TPFt
const hasApprove = await tpftContract.isApprovedForAll(
wallet.publicAddress,
TPFT_DVP_ADDRESS
);
// Verifica se a carteira está habilitada no TPFt
const isEnabledAddress = await tpftContract.isEnabledAddress(
wallet.publicAddress
);
// Indica se a carteira deu aprovação ou não ao TPFtDvP
if (hasApprove) {
console.log(`>>>\x1b[32m ${wallet.name} deu aprovação ao TPFtDvP\x1b[0m`);
} else {
console.log(
`\x1b[31m ${wallet.name} não deu aprovação ao TPFtDvP\x1b[0m`
);
}
// Indica se a carteira está habilitada no contrato TPFt
if (isEnabledAddress) {
console.log(`>>>\x1b[32m ${wallet.name} está habilitado no TPFt\x1b[0m`);
} else {
console.log(`\x1b[31m${wallet.name} não está habilitado no TPFt\x1b[0m`);
}
}
console.log("---Verificação no TPFt finalizada---\n");
}
/**
* Verifica se a carteira está habilitada no Real Digital
* @param wallets Lista de carteiras que serão verificadas
*/
async function RealDigitalCheck(wallets: CheckAddress[]) {
// Valida se lista de carteira está vazia
if (!wallets?.length) {
throw new Error("Insira as carteira(s) para verificação no Real Digital");
}
// Endereço do contrato Real Digital
const REAL_DIGITAL_ADDRESS = (await addressDiscoveryContract("RealDigital"))
.contractAddress;
// Obtém contrato RealDigital
const realDigitalContract = await ethers.getContractAt(
abiRealDigital,
REAL_DIGITAL_ADDRESS
);
console.log("Consultando contrato > \x1b[33mReal Digital....\x1b[0m");
// Loop de verificação
for (const wallet of wallets) {
// Verifica se a carteira está habilitada no RealDigital
const isEnable = await realDigitalContract.authorizedAccounts(
wallet.publicAddress
);
// Indica se a carteira está habilitada ou não no RealDigital
if (isEnable) {
console.log(
`>>>\x1b[32m ${wallet.name} está habilitada no Real Digital \x1b[0m`
);
} else {
console.log(
`\x1b[31m ${wallet.name} não está habilitada no Real Digital\x1b[0m`
);
}
}
console.log("---Verificação no Real Digital finalizada--\n");
}
/**
* Verifica se uma ou mais carteiras estão habilitadas no Real Tokenizado
* @param wallets Lista de carteiras que serão verificadas
* @param realTokenizados Lista de Real Tokenizado
*/
async function RealTokenizadoCheck(
wallets: CheckAddress[],
realTokenizados: CheckAddress[]
) {
// Valida se lista de carteiras ou realTokenizados estão vazias
if (!wallets?.length || !realTokenizados?.length) {
throw new Error("Insira as carteira(s) e os contrato(s) de Real Tokenizado");
}
console.log("Consultando contrato > \x1b[33mReal Tokenizado...\x1b[0m");
// Loop de verificacão
for (const realTokenizado of realTokenizados) {
// Obtém contrato do RealTokenizado
const realTokenizadoContract = await ethers.getContractAt(
abiRealTokenizado,
realTokenizado.publicAddress
);
for (const wallet of wallets) {
// Verifica se a carteira está habilitada
const isEnable = await realTokenizadoContract.authorizedAccounts(
wallet.publicAddress
);
// Indica se a carteira está habilitada ou não no RealTokenizado
if (isEnable) {
console.log(
`>>>\x1b[32m ${wallet.name} está habilitada no Real Tokenizado \x1b[0m`
);
} else {
console.log(
`\x1b[31m${wallet.name} não está habilitada no Real Tokenizado \x1b[0m`
);
}
}
}
console.log("---Verificação no Real Tokenizado finalizada---\n");
}
/**
* Verifica se uma ou mais carteiras estão cadastradas no Key Dictionary
* @param wallets Lista de carteiras que serão verificadas
*/
async function keyDictionaryCheck(wallets: CheckAddress[]) {
// Endereço do KeyDictionary
const KEY_DICTIONARY_ADDRESS = (
await addressDiscoveryContract("KeyDictionary")
).contractAddress;
// Obtém contrato KeyDictionary
const keyDictionaryContract = await ethers.getContractAt(
abiKeyDictionary,
KEY_DICTIONARY_ADDRESS
);
// Valor default do tipo bytes32 na DLT
const bytes32Default =
"0x0000000000000000000000000000000000000000000000000000000000000000";
console.log("Consultando contrato >\x1b[33m keyDictionary\x1b[0m");
// Loop de verificação
for await (const wallet of wallets) {
// Obtém a chave da informação do cliente
const getKey = await keyDictionaryContract.getKey(wallet.publicAddress);
// Verifica se a chave tem o valor default e faz log se a carteira está cadastrada no KeyDictionary
if (bytes32Default === getKey) {
console.log(
`\x1b[31m Carteira não está cadastrada no Key Dictionary \x1b[0m`
);
} else {
console.log(
`>>>\x1b[32m Carteira está cadastrada no Key Dictionary \x1b[0m`
);
}
// Obtém dados do cliente no contrato KeyDictionary
const clientCustomData = await keyDictionaryContract.getCustomerData(
getKey
);
// Nome do RealTokenizado
const realTokenizadoName = `RealTokenizado@${clientCustomData.cnpj8}`;
// Obtém contrato RealTokenizado
const realTokenizadoAddress = (
await addressDiscoveryContract(realTokenizadoName)
).contractAddress;
// Informação do RealTokenizado
const realTokenizado = {
name: realTokenizadoName,
publicAddress: realTokenizadoAddress,
};
console.log("---Verificação no Key Dictionary finalizada---\n");
// Chama o script do RealTokenizado para verificar se a carteira está habilitada
await RealTokenizadoCheck(wallets, [realTokenizado]);
}
}
/**
* Busca endereço do contrato no addressDiscovery
* @param key Nome do contrato
* @returns Retorna o endereço de contrato
*/
async function addressDiscoveryContract(key: string) {
// Obtém o contrato AddressDiscovery
const addressDiscoveryContract = await ethers.getContractAt(
abiAddressDiscovery,
ADDRESS_DISCOVERY_ADDRESS
);
// Endereço do contrato
const contractAddress = await addressDiscoveryContract.addressDiscovery(
ethers.utils.id(key)
);
// Retorna erro se o contrato pesquisado no AddressDiscovery não existir
if (contractAddress === ethers.constants.AddressZero) {
throw new Error("Endereço de contrato não encontrado no Address Discovery");
}
// Retorna o endereço do contrato
return {
contractAddress,
};
}
/**
* Verifica se os endereços das carteiras são validos
* @param wallets Lista de carteiras que serão verificadas
*/
async function isWallets(wallets: CheckAddress[]) {
// Loop de verificação
wallets.forEach((wallet) => {
// Verifica se o endereço da carteira é valido
if (!ethers.utils.isAddress(wallet.publicAddress)) {
throw new Error(`${wallet.name} não é um endereço de carteira valido.`);
}
});
}
/**
* Executa todas as verificações
* @param wallets Lista de carteiras que serão verificadas
* @param addressDiscoveryAddress Endereço do contrato AddressDiscovery
*/
async function main(wallets: CheckAddress[], addressDiscoveryAddress: string) {
ADDRESS_DISCOVERY_ADDRESS = addressDiscoveryAddress;
isWallets(wallets);
await TPFtCheckApproves(wallets);
await RealDigitalCheck(wallets);
await keyDictionaryCheck(wallets);
}
/**
* Mapeamento de mensagens de erros
*/
const errors: Record<string, string> = {
"RealDigitalDefaultAccount: Not authorized Account":
"Signer isn't an authorized participant",
};
/**
* Endereço do contrato AddressDiscovery
*/
let ADDRESS_DISCOVERY_ADDRESS:string;
/**
* Lista de carteiras que serão verificadas
*/
const wallets: CheckAddress[] = [
{
name: "NOME_DA_CARTEIRA",
publicAddress: "ENDEREÇO_DA_CARTEIRA",
}
];
/**
* Executa todas as verificações
*/
main(wallets, "ENDEREÇO_DO_ADDRESS_DISCOVERY").catch((error) => {
const reason = error?.reason ? errors[error?.reason] : error;
console.error(`>>> \x1b[31m${reason} \x1b[0m`);
error.exitCode = 1;
});