Get Opened Accounts
In this section, we'll get all the opened CreditAccounts by querying the CreditManager
s. Let's directly go through the code below.
First of all, we get the
AddressProvider
and then get theContractRegister
and get theCreditManager
list by queryingContractRegister
.Now, we can querying the
OpenCreditAccount
event from eachCreditManager
. As shown in the code, we query the event from block13858003
to latest since the firstOpenCreditAccount
event happened in block13858003
.After get all the
OpenCreditAccountEvent
s, we still need to filter out those have been closed or liquidated. Same as queryingOpenCreditAccountEvent
, we get all theCloseCreditAccountEvent
s andLiquidateCreditAccountEvent
s.NOTE: For filtering out, we sort all the event by
blockNum
andtransactionIndex
because it is possible that a borrower has opened anCreditAccount
with aCreditManager
twice and the addresses of bothCreditAccount
s are same.
We use the primary codes in get-opened-accounts to illustrate the details of step 2 and 3.
If you check the code, you could see we have a for loop to iterate the CreditManagerList
, for each CreditManager
, we use the code below to get three types of events including openCreditAccountEvents
, closeCreditAccountEvents
and liquidateCreditAccountEvents
. And sort them by blockNum
and transactionIndex
.
jsx
// We get all the CreditAccounts through all the OpenAccountEvent and filter// out those have been closed or liquidated. query OpenCreditAccount event// in this CreditManager from block 13858003 to the latest blocklet openCreditAccountEvents = await creditManager.queryFilter(creditManager.filters.OpenCreditAccount(), 13858003, 'latest');// query CloseCreditAccount event in this CreditManager from block 13858003// to the latest blocklet closeCreditAccountEvents = await creditManager.queryFilter(creditManager.filters.CloseCreditAccount(), 13858003, 'latest');// query LiquidateCreditAccount event in this CreditManager from block// 13858003 to the latest blocklet liquidateCreditAccountEvents = await creditManager.queryFilter(creditManager.filters.LiquidateCreditAccount(), 13858003, 'latest');// sorting for avoid some errorsopenCreditAccountEvents = openCreditAccountEvents.sort(compareBlockNumberAndTransactionIndex);closeCreditAccountEvents = closeCreditAccountEvents.sort(compareBlockNumberAndTransactionIndex);liquidateCreditAccountEvents = liquidateCreditAccountEvents.sort(compareBlockNumberAndTransactionIndex);
jsx
// We get all the CreditAccounts through all the OpenAccountEvent and filter// out those have been closed or liquidated. query OpenCreditAccount event// in this CreditManager from block 13858003 to the latest blocklet openCreditAccountEvents = await creditManager.queryFilter(creditManager.filters.OpenCreditAccount(), 13858003, 'latest');// query CloseCreditAccount event in this CreditManager from block 13858003// to the latest blocklet closeCreditAccountEvents = await creditManager.queryFilter(creditManager.filters.CloseCreditAccount(), 13858003, 'latest');// query LiquidateCreditAccount event in this CreditManager from block// 13858003 to the latest blocklet liquidateCreditAccountEvents = await creditManager.queryFilter(creditManager.filters.LiquidateCreditAccount(), 13858003, 'latest');// sorting for avoid some errorsopenCreditAccountEvents = openCreditAccountEvents.sort(compareBlockNumberAndTransactionIndex);closeCreditAccountEvents = closeCreditAccountEvents.sort(compareBlockNumberAndTransactionIndex);liquidateCreditAccountEvents = liquidateCreditAccountEvents.sort(compareBlockNumberAndTransactionIndex);
After got the sorted events, we need to filter out the accounts that have been closed or liquidated after opening.
jsx
openCreditAccountEvents.forEach(event => {let closedOrLiqudated: boolean = false;// Check if it has been closedcloseCreditAccountEvents.every(closeEvent => {if (event.blockNumber < closeEvent.blockNumber ||(event.blockNumber == closeEvent.blockNumber &&event.transactionIndex < closeEvent.transactionIndex)) {if (event.args.onBehalfOf == closeEvent.args.owner) {closedOrLiqudated = true;return false;}}return true;});// Check if it has been liquidatedliquidateCreditAccountEvents.every(liquidateEvent => {if (event.blockNumber < liquidateEvent.blockNumber ||(event.blockNumber == liquidateEvent.blockNumber &&event.transactionIndex < liquidateEvent.transactionIndex)) {if (event.args.onBehalfOf == liquidateEvent.args.owner) {closedOrLiqudated = true;return false;}}return true;});if (!closedOrLiqudated) {console.log(event.args.onBehalfOf, ',', event.args.creditAccount, ',',event.address, ',', tokenSymbol, ',', event.args.amount, ',',event.args.borrowAmount)}});
jsx
openCreditAccountEvents.forEach(event => {let closedOrLiqudated: boolean = false;// Check if it has been closedcloseCreditAccountEvents.every(closeEvent => {if (event.blockNumber < closeEvent.blockNumber ||(event.blockNumber == closeEvent.blockNumber &&event.transactionIndex < closeEvent.transactionIndex)) {if (event.args.onBehalfOf == closeEvent.args.owner) {closedOrLiqudated = true;return false;}}return true;});// Check if it has been liquidatedliquidateCreditAccountEvents.every(liquidateEvent => {if (event.blockNumber < liquidateEvent.blockNumber ||(event.blockNumber == liquidateEvent.blockNumber &&event.transactionIndex < liquidateEvent.transactionIndex)) {if (event.args.onBehalfOf == liquidateEvent.args.owner) {closedOrLiqudated = true;return false;}}return true;});if (!closedOrLiqudated) {console.log(event.args.onBehalfOf, ',', event.args.creditAccount, ',',event.address, ',', tokenSymbol, ',', event.args.amount, ',',event.args.borrowAmount)}});
We can run this code by
bash
npx hardhat run scripts/get-opened-accounts.ts
bash
npx hardhat run scripts/get-opened-accounts.ts
And you will get a table with columns Borrower,CreditAccount,CreditManager,UnderlyingToken,BorrowerOwnedAmount,BorrowedAmount
.