@raac/rpc 1.1.0-beta.55 → 1.1.0-beta.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/RPCLibrary.js +11 -0
  2. package/dist/oracles/houses/request.js +3 -13
  3. package/dist/oracles/houses/simulate.js +21 -0
  4. package/dist/oracles/prime-rate/config.js +3 -36
  5. package/dist/oracles/prime-rate/request.js +8 -11
  6. package/dist/oracles/prime-rate/simulate.js +25 -0
  7. package/dist/pools/lendingPool/getAdapterAddress.js +8 -10
  8. package/dist/pools/stabilityPool/getStabilityPoolInfo.js +0 -21
  9. package/dist/pools/stabilityPool/getWithdrawRequestInfo.js +3 -1
  10. package/dist/scripts/analyze_lending_positions.js +277 -0
  11. package/dist/scripts/analyze_transfers.js +247 -0
  12. package/dist/scripts/calculate_portfolio.js +167 -0
  13. package/dist/scripts/index.js +53 -45
  14. package/dist/scripts/run_analysis.js +115 -0
  15. package/dist/scripts/test_lending_analysis.js +105 -0
  16. package/dist/scripts/users.js +304 -0
  17. package/dist/types/RPCLibrary.d.ts +10 -0
  18. package/dist/types/oracles/houses/request.d.ts +2 -1
  19. package/dist/types/oracles/houses/simulate.d.ts +1 -0
  20. package/dist/types/oracles/prime-rate/config.d.ts +2 -1
  21. package/dist/types/oracles/prime-rate/request.d.ts +2 -1
  22. package/dist/types/oracles/prime-rate/simulate.d.ts +1 -0
  23. package/dist/types/pools/stabilityPool/getStabilityPoolInfo.d.ts +0 -1
  24. package/dist/types/pools/stabilityPool/getWithdrawRequestInfo.d.ts +1 -0
  25. package/dist/types/scripts/analyze_lending_positions.d.ts +1 -0
  26. package/dist/types/scripts/analyze_transfers.d.ts +1 -0
  27. package/dist/types/scripts/calculate_portfolio.d.ts +1 -0
  28. package/dist/types/scripts/run_analysis.d.ts +1 -0
  29. package/dist/types/scripts/test_lending_analysis.d.ts +1 -0
  30. package/dist/types/scripts/users.d.ts +1 -0
  31. package/package.json +2 -1
@@ -0,0 +1,247 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const ethers_1 = require("ethers");
40
+ const fs = __importStar(require("fs"));
41
+ const csv_parser_1 = __importDefault(require("csv-parser"));
42
+ const RPC_URL = 'https://eth-sepolia.g.alchemy.com/v2/GRu4-s8cjabOCnh-3ZFzapF-MwUcURV_';
43
+ const provider = new ethers_1.ethers.JsonRpcProvider(RPC_URL);
44
+ const TOKEN_CONTRACT_ADDRESS = '0xd39d5D3289B6B76D4d584a9cD58AED99442D29eb';
45
+ const START_BLOCK = 8718016;
46
+ const END_BLOCK = 'latest';
47
+ const BLOCK_RANGE_LIMIT = 500;
48
+ // User to exclude from all calculations
49
+ const EXCLUDED_USER = '0x7FaE0737292cD3B7Dc9067AA30a67C42c205015c'.toLowerCase();
50
+ const ERC20_ABI = [
51
+ 'event Transfer(address indexed from, address indexed to, uint256 value)',
52
+ 'function balanceOf(address owner) view returns (uint256)'
53
+ ];
54
+ async function isEOA(address) {
55
+ const code = await provider.getCode(address);
56
+ return code === '0x';
57
+ }
58
+ async function queryLogsInChunks(contract, filter, startBlock, endBlock) {
59
+ const logs = [];
60
+ let endBlockNumber;
61
+ if (typeof endBlock === 'string' && endBlock === 'latest') {
62
+ endBlockNumber = await provider.getBlockNumber();
63
+ }
64
+ else {
65
+ endBlockNumber = endBlock;
66
+ }
67
+ let currentBlock = startBlock;
68
+ while (currentBlock < endBlockNumber) {
69
+ const chunkEndBlock = Math.min(currentBlock + BLOCK_RANGE_LIMIT - 1, endBlockNumber);
70
+ console.log(`Querying logs from block ${currentBlock} to ${chunkEndBlock}...`);
71
+ try {
72
+ const chunkLogs = await contract.queryFilter(filter, currentBlock, chunkEndBlock);
73
+ logs.push(...chunkLogs);
74
+ console.log(`Found ${chunkLogs.length} logs in this chunk`);
75
+ }
76
+ catch (error) {
77
+ console.error(`Error querying logs from ${currentBlock} to ${chunkEndBlock}:`, error);
78
+ if (chunkEndBlock - currentBlock > 100) {
79
+ console.log('Retrying with smaller block range...');
80
+ const smallerEndBlock = Math.min(currentBlock + 100 - 1, endBlockNumber);
81
+ const smallerChunkLogs = await contract.queryFilter(filter, currentBlock, smallerEndBlock);
82
+ logs.push(...smallerChunkLogs);
83
+ console.log(`Found ${smallerChunkLogs.length} logs in smaller chunk`);
84
+ currentBlock = smallerEndBlock + 1;
85
+ }
86
+ else {
87
+ throw error;
88
+ }
89
+ }
90
+ currentBlock = chunkEndBlock + 1;
91
+ }
92
+ return logs;
93
+ }
94
+ function arrayToCSV(data) {
95
+ if (data.length === 0)
96
+ return '';
97
+ const headers = Object.keys(data[0]);
98
+ const csvRows = [headers.join(',')];
99
+ for (const row of data) {
100
+ const values = headers.map(header => {
101
+ const value = row[header];
102
+ if (typeof value === 'string' && (value.includes(',') || value.includes('"'))) {
103
+ return `"${value.replace(/"/g, '""')}"`;
104
+ }
105
+ return value;
106
+ });
107
+ csvRows.push(values.join(','));
108
+ }
109
+ return csvRows.join('\n');
110
+ }
111
+ async function readUserBalances() {
112
+ return new Promise((resolve, reject) => {
113
+ const users = [];
114
+ fs.createReadStream('user_balances.csv')
115
+ .pipe((0, csv_parser_1.default)())
116
+ .on('data', (row) => {
117
+ users.push(row);
118
+ })
119
+ .on('end', () => {
120
+ console.log(`āœ… Loaded ${users.length} users from user_balances.csv`);
121
+ resolve(users);
122
+ })
123
+ .on('error', reject);
124
+ });
125
+ }
126
+ async function main() {
127
+ // Check if user_balances.csv exists
128
+ if (!fs.existsSync('user_balances.csv')) {
129
+ console.error('āŒ user_balances.csv not found. Please run the users.ts script first.');
130
+ return;
131
+ }
132
+ console.log('Loading user data from user_balances.csv...');
133
+ const users = await readUserBalances();
134
+ // Filter out the excluded user
135
+ const filteredUsers = users.filter(user => user.address.toLowerCase() !== EXCLUDED_USER);
136
+ const userAddresses = filteredUsers.map(u => u.address.toLowerCase());
137
+ console.log(`Analyzing transfers for ${userAddresses.length} users (excluded ${users.length - filteredUsers.length} user)...`);
138
+ const token = new ethers_1.ethers.Contract(TOKEN_CONTRACT_ADDRESS, ERC20_ABI, provider);
139
+ console.log('Querying all transfer events...');
140
+ const allTransferEvents = await queryLogsInChunks(token, token.filters.Transfer(), START_BLOCK, END_BLOCK);
141
+ console.log(`Found ${allTransferEvents.length} total transfer events`);
142
+ const eoaTransfers = [];
143
+ const processedTransactions = new Set();
144
+ console.log('Analyzing transfers involving EOAs...');
145
+ for (const event of allTransferEvents) {
146
+ const from = event?.args?.from?.toLowerCase();
147
+ const to = event?.args?.to?.toLowerCase();
148
+ const value = event?.args?.value;
149
+ const blockNumber = event.blockNumber;
150
+ const transactionHash = event.transactionHash;
151
+ // Skip if we've already processed this transaction
152
+ if (processedTransactions.has(transactionHash))
153
+ continue;
154
+ processedTransactions.add(transactionHash);
155
+ // Skip if either from or to is the excluded user
156
+ if (from === EXCLUDED_USER || to === EXCLUDED_USER)
157
+ continue;
158
+ // Check if either from or to is one of our users
159
+ const isFromUser = userAddresses.includes(from);
160
+ const isToUser = userAddresses.includes(to);
161
+ if (isFromUser || isToUser) {
162
+ // Check if the other party is an EOA
163
+ const otherParty = isFromUser ? to : from;
164
+ const isOtherPartyEOA = await isEOA(otherParty);
165
+ if (isOtherPartyEOA) {
166
+ if (isFromUser) {
167
+ // User sent tokens to EOA
168
+ eoaTransfers.push({
169
+ user: from,
170
+ type: 'sent',
171
+ toFrom: to,
172
+ amount: ethers_1.ethers.formatUnits(value, 18),
173
+ blockNumber: blockNumber,
174
+ transactionHash: transactionHash
175
+ });
176
+ }
177
+ else {
178
+ // User received tokens from EOA
179
+ eoaTransfers.push({
180
+ user: to,
181
+ type: 'received',
182
+ toFrom: from,
183
+ amount: ethers_1.ethers.formatUnits(value, 18),
184
+ blockNumber: blockNumber,
185
+ transactionHash: transactionHash
186
+ });
187
+ }
188
+ }
189
+ }
190
+ }
191
+ console.log(`\n=== USERS WHO TRANSFERRED/RECEIVED TOKENS WITH EOAs ===`);
192
+ console.log(`Found ${eoaTransfers.length} transfers involving EOAs`);
193
+ // Group by user
194
+ const userTransfers = {};
195
+ for (const transfer of eoaTransfers) {
196
+ if (!userTransfers[transfer.user]) {
197
+ userTransfers[transfer.user] = [];
198
+ }
199
+ userTransfers[transfer.user].push(transfer);
200
+ }
201
+ console.log(`\nUsers involved in EOA transfers: ${Object.keys(userTransfers).length}`);
202
+ for (const [user, transfers] of Object.entries(userTransfers)) {
203
+ const userData = filteredUsers.find(u => u.address.toLowerCase() === user);
204
+ console.log(`\nUser: ${user}`);
205
+ console.log(` Mint Count: ${userData?.mintCount || 'N/A'}`);
206
+ console.log(` Current Token Balance: ${userData?.tokenBalance || 'N/A'}`);
207
+ console.log(` Transfers with EOAs:`);
208
+ for (const transfer of transfers) {
209
+ const direction = transfer.type === 'sent' ? '→' : '←';
210
+ console.log(` ${direction} ${transfer.amount} tokens ${transfer.type === 'sent' ? 'to' : 'from'} ${transfer.toFrom} (Block: ${transfer.blockNumber})`);
211
+ }
212
+ }
213
+ // Save detailed transfer data to CSV
214
+ const transferCSVData = eoaTransfers.map(transfer => ({
215
+ user: transfer.user,
216
+ type: transfer.type,
217
+ toFrom: transfer.toFrom,
218
+ amount: transfer.amount,
219
+ blockNumber: transfer.blockNumber,
220
+ transactionHash: transfer.transactionHash
221
+ }));
222
+ const transferCSV = arrayToCSV(transferCSVData);
223
+ fs.writeFileSync('eoa_transfers.csv', transferCSV);
224
+ console.log('\nāœ… Saved detailed transfer data to eoa_transfers.csv');
225
+ // Save summary by user
226
+ const userSummaryData = Object.entries(userTransfers).map(([user, transfers]) => {
227
+ const userData = filteredUsers.find(u => u.address.toLowerCase() === user);
228
+ const sentTransfers = transfers.filter(t => t.type === 'sent');
229
+ const receivedTransfers = transfers.filter(t => t.type === 'received');
230
+ const totalSent = sentTransfers.reduce((sum, t) => sum + parseFloat(t.amount), 0);
231
+ const totalReceived = receivedTransfers.reduce((sum, t) => sum + parseFloat(t.amount), 0);
232
+ return {
233
+ address: user,
234
+ mintCount: userData?.mintCount || '0',
235
+ currentTokenBalance: userData?.tokenBalance || '0',
236
+ totalSentToEOA: totalSent.toString(),
237
+ totalReceivedFromEOA: totalReceived.toString(),
238
+ sentTransactions: sentTransfers.length,
239
+ receivedTransactions: receivedTransfers.length,
240
+ totalTransactions: transfers.length
241
+ };
242
+ });
243
+ const summaryCSV = arrayToCSV(userSummaryData);
244
+ fs.writeFileSync('eoa_transfer_summary.csv', summaryCSV);
245
+ console.log('āœ… Saved user summary to eoa_transfer_summary.csv');
246
+ }
247
+ main().catch(console.error);
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const fs = __importStar(require("fs"));
40
+ const csv_parser_1 = __importDefault(require("csv-parser"));
41
+ // User to exclude from all calculations
42
+ const EXCLUDED_USER = '0x7FaE0737292cD3B7Dc9067AA30a67C42c205015c'.toLowerCase();
43
+ function arrayToCSV(data) {
44
+ if (data.length === 0)
45
+ return '';
46
+ const headers = Object.keys(data[0]);
47
+ const csvRows = [headers.join(',')];
48
+ for (const row of data) {
49
+ const values = headers.map(header => {
50
+ const value = row[header];
51
+ if (typeof value === 'string' && (value.includes(',') || value.includes('"'))) {
52
+ return `"${value.replace(/"/g, '""')}"`;
53
+ }
54
+ return value;
55
+ });
56
+ csvRows.push(values.join(','));
57
+ }
58
+ return csvRows.join('\n');
59
+ }
60
+ async function readUserBalances() {
61
+ return new Promise((resolve, reject) => {
62
+ const users = [];
63
+ fs.createReadStream('user_balances.csv')
64
+ .pipe((0, csv_parser_1.default)())
65
+ .on('data', (row) => {
66
+ users.push(row);
67
+ })
68
+ .on('end', () => {
69
+ console.log(`āœ… Loaded ${users.length} users from user_balances.csv`);
70
+ resolve(users);
71
+ })
72
+ .on('error', reject);
73
+ });
74
+ }
75
+ function calculateTotalNftValue(nftDataString) {
76
+ try {
77
+ const nftData = JSON.parse(nftDataString);
78
+ let totalValue = 0;
79
+ const details = [];
80
+ for (const nft of nftData) {
81
+ const price = parseFloat(nft.price);
82
+ if (!isNaN(price)) {
83
+ totalValue += price;
84
+ details.push(`Token ${nft.tokenId}: $${price.toFixed(2)} (${nft.timestamp})`);
85
+ }
86
+ }
87
+ return {
88
+ totalValue,
89
+ details: details.join('; ')
90
+ };
91
+ }
92
+ catch (error) {
93
+ console.error('Error parsing NFT data:', error);
94
+ return { totalValue: 0, details: 'Error parsing NFT data' };
95
+ }
96
+ }
97
+ async function main() {
98
+ // Check if user_balances.csv exists
99
+ if (!fs.existsSync('user_balances.csv')) {
100
+ console.error('āŒ user_balances.csv not found. Please run the users.ts script first.');
101
+ return;
102
+ }
103
+ console.log('Loading user data from user_balances.csv...');
104
+ const users = await readUserBalances();
105
+ // Filter out the excluded user
106
+ const filteredUsers = users.filter(user => user.address.toLowerCase() !== EXCLUDED_USER);
107
+ console.log(`Calculating portfolio values for ${filteredUsers.length} users (excluded ${users.length - filteredUsers.length} user)...`);
108
+ console.log('Calculating portfolio values...');
109
+ const portfolioData = [];
110
+ for (const user of filteredUsers) {
111
+ // Parse token balances
112
+ const rTokenValue = parseFloat(user.rTokenBalance) || 0;
113
+ const deTokenValue = parseFloat(user.deTokenBalance) || 0;
114
+ const iraacValue = (parseFloat(user.iraacBalance) || 0) * 0.97; // Apply 0.97 multiplier to iRAAC balance
115
+ const tokenValue = parseFloat(user.tokenBalance) || 0;
116
+ // Calculate NFT total value
117
+ const { totalValue: nftTotalValue, details: nftDetails } = calculateTotalNftValue(user.nftData);
118
+ // Calculate total portfolio value
119
+ const totalPortfolioValue = rTokenValue + deTokenValue + iraacValue + tokenValue + nftTotalValue;
120
+ const portfolio = {
121
+ address: user.address,
122
+ mintCount: user.mintCount,
123
+ hasInteractedWithEOA: user.hasInteractedWithEOA,
124
+ rTokenBalance: user.rTokenBalance,
125
+ deTokenBalance: user.deTokenBalance,
126
+ iraacBalance: user.iraacBalance,
127
+ tokenBalance: user.tokenBalance,
128
+ nftBalance: user.nftBalance,
129
+ totalNftValue: nftTotalValue.toFixed(2),
130
+ totalPortfolioValue: totalPortfolioValue.toFixed(2),
131
+ nftDetails: nftDetails
132
+ };
133
+ portfolioData.push(portfolio);
134
+ console.log(`\nUser: ${user.address}`);
135
+ console.log(` R Token: $${rTokenValue.toFixed(2)}`);
136
+ console.log(` DE Token: $${deTokenValue.toFixed(2)}`);
137
+ console.log(` iRAAC: $${iraacValue.toFixed(2)}`);
138
+ console.log(` Token: $${tokenValue.toFixed(2)}`);
139
+ console.log(` NFT Total: $${nftTotalValue.toFixed(2)}`);
140
+ console.log(` Total Portfolio: $${totalPortfolioValue.toFixed(2)}`);
141
+ if (nftDetails && nftDetails !== 'Error parsing NFT data') {
142
+ console.log(` NFT Details: ${nftDetails}`);
143
+ }
144
+ }
145
+ // Sort by total portfolio value (highest first)
146
+ portfolioData.sort((a, b) => parseFloat(b.totalPortfolioValue) - parseFloat(a.totalPortfolioValue));
147
+ // Save to CSV
148
+ const csvData = arrayToCSV(portfolioData);
149
+ fs.writeFileSync('user_portfolios.csv', csvData);
150
+ console.log('\nāœ… Saved portfolio data to user_portfolios.csv');
151
+ // Print summary statistics
152
+ const totalUsers = portfolioData.length;
153
+ const usersWithValue = portfolioData.filter(p => parseFloat(p.totalPortfolioValue) > 0).length;
154
+ const totalPortfolioValue = portfolioData.reduce((sum, p) => sum + parseFloat(p.totalPortfolioValue), 0);
155
+ const averagePortfolioValue = totalPortfolioValue / totalUsers;
156
+ console.log('\n=== PORTFOLIO SUMMARY ===');
157
+ console.log(`Total Users: ${totalUsers}`);
158
+ console.log(`Users with Value > 0: ${usersWithValue}`);
159
+ console.log(`Total Portfolio Value: $${totalPortfolioValue.toFixed(2)}`);
160
+ console.log(`Average Portfolio Value: $${averagePortfolioValue.toFixed(2)}`);
161
+ // Top 10 portfolios
162
+ console.log('\n=== TOP 10 PORTFOLIOS ===');
163
+ portfolioData.slice(0, 10).forEach((portfolio, index) => {
164
+ console.log(`${index + 1}. ${portfolio.address}: $${portfolio.totalPortfolioValue}`);
165
+ });
166
+ }
167
+ main().catch(console.error);
@@ -10,7 +10,9 @@ const RPCLibrary_1 = __importDefault(require("../RPCLibrary"));
10
10
  const contracts_1 = require("../utils/contracts");
11
11
  const artifacts_1 = require("../utils/artifacts");
12
12
  const _helpers_1 = require("../pools/rwaVault/_helpers");
13
- const chainId = 8453;
13
+ const request_1 = require("../oracles/prime-rate/request");
14
+ const ethers5_1 = require("ethers5");
15
+ const chainId = 11155111;
14
16
  const config = chains_1.default[chainId];
15
17
  const TEST_MNEMONIC = process.env.TEST_MNEMONIC;
16
18
  const TEST_PRIVATE_KEY = process.env.TEST_PRIVATE_KEY;
@@ -34,9 +36,6 @@ async function createWallet(mnemonic, provider) {
34
36
  }
35
37
  async function setup() {
36
38
  const rpc = new RPCLibrary_1.default();
37
- const error = rpc.errors.getErrorInfo("0xa9b65aba");
38
- console.log(error);
39
- return;
40
39
  const provider = await getProvider();
41
40
  const signer = await createWallet(TEST_MNEMONIC, provider);
42
41
  // const rpc = new RPCLibrary();
@@ -53,9 +52,54 @@ async function setup() {
53
52
  const housePriceAddress = (0, contracts_1.getContractAddress)(chainId, "raachouseprices");
54
53
  const housePriceABI = (0, artifacts_1.getABI)("raachouseprices");
55
54
  const housePriceContract = new ethers_1.ethers.Contract(housePriceAddress, housePriceABI, signer);
55
+ const primeRateOracleAddress = (0, contracts_1.getContractAddress)(chainId, "raacprimerateoracle");
56
+ const primeRateOracleABI = (0, artifacts_1.getABI)("raacprimerateoracle");
57
+ const primeRateOracleContract = new ethers_1.ethers.Contract(primeRateOracleAddress, primeRateOracleABI, signer);
58
+ const lendingPoolAddress = (0, contracts_1.getContractAddress)(chainId, "lendingpool");
59
+ const lendingPoolABI = (0, artifacts_1.getABI)("lendingpool");
60
+ const lendingPoolContract = new ethers_1.ethers.Contract(lendingPoolAddress, lendingPoolABI, signer);
61
+ const StabilityPoolAddress = (0, contracts_1.getContractAddress)(chainId, "stabilitypool");
62
+ const StabilityPoolABI = (0, artifacts_1.getABI)("stabilitypool");
63
+ const StabilityPoolContract = new ethers_1.ethers.Contract(StabilityPoolAddress, StabilityPoolABI, signer);
64
+ const providerV5 = new ethers5_1.ethers.providers.JsonRpcProvider(config.rpcs[0]);
65
+ const signerV5 = new ethers5_1.ethers.Wallet(TEST_PRIVATE_KEY, providerV5);
66
+ await (0, request_1.request)(chainId, signerV5);
56
67
  // await (await housePriceContract.setOracle(signer.address)).wait();
57
68
  // console.log(await rpc.pools.lendingPool.getLendingPoolInfo(chainId, signer.address, provider))
58
69
  // console.log(await LendingPoolContract.rateData())
70
+ // fetch all nfts and their price, decrease the price by 20-30% and 4-5 by 40%
71
+ // const tx = await LendingPoolContract.initiateLiquidation("0x8DCc5f781933A6232d7aA6003cb5b07138B7A8AA", "0xC3f1d3048fE5De050ca2965e47981f5C0039A2d8", new ethers.AbiCoder().encode(["uint256"], [150]))
72
+ // await tx.wait();
73
+ // console.log(tx);
74
+ // let tx = await StabilityPoolContract.setLiquidationVaultTokenSplit(2_50, 2_50, 90_00, 5_00)
75
+ // await tx.wait();
76
+ return;
77
+ console.log(await StabilityPoolContract.liquidationSplit());
78
+ console.log(await StabilityPoolContract.liquidationSwap());
79
+ console.log(await StabilityPoolContract.liquidityGauge());
80
+ console.log(await StabilityPoolContract.treasury());
81
+ const tx = await StabilityPoolContract.liquidateBorrower("0x8DCc5f781933A6232d7aA6003cb5b07138B7A8AA", "0x0C45430F37ce079740b55B323c090b3B498DBdf0", "0xC3f1d3048fE5De050ca2965e47981f5C0039A2d8", new ethers_1.ethers.AbiCoder().encode(["uint256"], [150]));
82
+ await tx.wait();
83
+ console.log(tx);
84
+ const position = await LendingPoolContract.getPositionView("0x8DCc5f781933A6232d7aA6003cb5b07138B7A8AA", "0xC3f1d3048fE5De050ca2965e47981f5C0039A2d8", new ethers_1.ethers.AbiCoder().encode(["uint256"], [150]));
85
+ console.log(position);
86
+ return;
87
+ function randomBetween(min, max) {
88
+ return Math.random() * (max - min) + min;
89
+ }
90
+ // Pick 5 NFTs for the deeper cut
91
+ const bigCutIds = new Set([10, 50, 100, 150, 200]);
92
+ for (let nft = 1; nft <= 201; nft++) {
93
+ const price = await rpc.nfts.getHousePrice(chainId, Number(nft), provider);
94
+ // Decide discount %: 20–30% normally, 40–50% for special ones
95
+ const discount = bigCutIds.has(nft)
96
+ ? randomBetween(0.40, 0.50)
97
+ : randomBetween(0.20, 0.30);
98
+ const newPrice = parseFloat(price) * (1 - discount);
99
+ // same format as before
100
+ console.log(nft, newPrice);
101
+ }
102
+ return;
59
103
  // Add funds in the Mock Liquidity Pool
60
104
  const CURVE_POOL_ADDRESSES = {
61
105
  11155111: '0x645A38Bbe56Dc014fb28536bEA9796b2b2D92c0c', // Sepolia
@@ -84,19 +128,12 @@ async function setup() {
84
128
  // console.log("Liquidity in the Mock Liquidity Pool", liquidity);
85
129
  // mint the current user 5 million irAAC
86
130
  console.log("Minting 5 million irAAC");
87
- await rpc.wallet.assets.approveAsset(chainId, "crvusd", await rpc.pools.rwaVault.getAdapterAddress(chainId, "crvusdadapter").address, "5000000", signer);
88
- const data = new ethers_1.ethers.AbiCoder().encode(["uint256"], [ethers_1.ethers.parseEther("5000000")]);
89
- await rpc.pools.rwaVault.depositToRWAVault(chainId, "crvusdadapter", data, signer.address, signer);
90
- return;
131
+ // await rpc.wallet.assets.approveAsset(chainId, "crvusd", await rpc.pools.rwaVault.getAdapterAddress(chainId, "crvusdadapter").address, "5000000", signer);
132
+ // const data = new ethers.AbiCoder().encode(["uint256"], [ ethers.parseEther("5000000") ])
133
+ // await rpc.pools.rwaVault.depositToRWAVault(chainId, "crvusdadapter", data, signer.address, signer)
91
134
  /// END OF ADD FUNDS IN THE MOCK LIQUIDITY POOL
92
- // // // send myself some CRVUSD
93
- // await rpc.wallet.assets.mintAsset(
94
- // chainId,
95
- // "crvusd",
96
- // 10000000n,
97
- // signer.address,
98
- // signer
99
- // );
135
+ // // send myself some CRVUSD
136
+ await rpc.wallet.assets.mintAsset(chainId, "crvusd", 10000000n, signer.address, signer);
100
137
  // set the base uri to instruxi data gateway
101
138
  await rpc.nfts.setBaseUri(chainId, "http://44.211.155.244:3000/v1/properties/", signer);
102
139
  const RWAVaultAddress = (0, contracts_1.getContractAddress)(chainId, "rwavault");
@@ -144,35 +181,6 @@ async function setup() {
144
181
  throw new Error("Price not set correctly");
145
182
  }
146
183
  }
147
- let nftIdStart = countTokens + 3;
148
- let nftIdEnd = countTokens + 10;
149
- for (let i = nftIdStart; i <= nftIdEnd; i++) {
150
- const price = Math.floor(Math.random() * (2000000 - 100000) + 100000);
151
- const tx = await housePriceContract.setHousePrice(i, (0, ethers_1.parseEther)(price.toString()));
152
- await tx.wait();
153
- console.log("Price set for house", i);
154
- }
155
- // Generate some random NFT and set price only: not purchased yet
156
- // let nftIdStart = countTokens + 2;
157
- // let nftIdEnd = countTokens + 10;
158
- // for (let i = nftIdStart; i <= nftIdEnd; i++) {
159
- // try {
160
- // const price = Math.floor(Math.random() * (2000000 - 100000) + 100000);
161
- // const tx = await housePriceContract.setHousePrice(
162
- // i,
163
- // parseEther(price.toString()),
164
- // {
165
- // nonce: await provider.getTransactionCount(signer.address)
166
- // }
167
- // );
168
- // const receipt = await tx.wait();
169
- // console.log("Price set for house", i, "tx:", receipt.hash);
170
- // await new Promise(resolve => setTimeout(resolve, 2000));
171
- // } catch (error) {
172
- // console.error(`Failed to set price for house ${i}:`, error);
173
- // continue;
174
- // }
175
- // }
176
184
  }
177
185
  const execute = async () => {
178
186
  const provider = await getProvider();
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const child_process_1 = require("child_process");
37
+ const fs = __importStar(require("fs"));
38
+ async function runScript(scriptName) {
39
+ return new Promise((resolve, reject) => {
40
+ console.log(`\nšŸš€ Starting ${scriptName}...`);
41
+ console.log('='.repeat(50));
42
+ const child = (0, child_process_1.spawn)('npx', ['ts-node', `scripts/${scriptName}`], {
43
+ stdio: 'inherit',
44
+ shell: true
45
+ });
46
+ child.on('close', (code) => {
47
+ if (code === 0) {
48
+ console.log(`\nāœ… ${scriptName} completed successfully`);
49
+ resolve();
50
+ }
51
+ else {
52
+ console.error(`\nāŒ ${scriptName} failed with exit code ${code}`);
53
+ reject(new Error(`${scriptName} failed with exit code ${code}`));
54
+ }
55
+ });
56
+ child.on('error', (error) => {
57
+ console.error(`\nāŒ Error running ${scriptName}:`, error);
58
+ reject(error);
59
+ });
60
+ });
61
+ }
62
+ async function main() {
63
+ console.log('šŸ“Š Starting Complete User Analysis Pipeline');
64
+ console.log('='.repeat(60));
65
+ const startTime = Date.now();
66
+ try {
67
+ // Step 1: Run users.ts to collect user data
68
+ console.log('\nšŸ“‹ Step 1: Collecting user data and balances...');
69
+ await runScript('users.ts');
70
+ // Check if user_balances.csv was created
71
+ if (!fs.existsSync('user_balances.csv')) {
72
+ throw new Error('user_balances.csv was not created by users.ts');
73
+ }
74
+ // Step 2: Run analyze_transfers.ts to analyze EOA transfers
75
+ console.log('\nšŸ”„ Step 2: Analyzing EOA transfers...');
76
+ await runScript('analyze_transfers.ts');
77
+ // Step 3: Run calculate_portfolio.ts to calculate total portfolio values
78
+ console.log('\nšŸ’° Step 3: Calculating portfolio values...');
79
+ await runScript('calculate_portfolio.ts');
80
+ const endTime = Date.now();
81
+ const duration = (endTime - startTime) / 1000;
82
+ console.log('\nšŸŽ‰ Complete Analysis Pipeline Finished Successfully!');
83
+ console.log('='.repeat(60));
84
+ console.log(`ā±ļø Total execution time: ${duration.toFixed(2)} seconds`);
85
+ // List all generated files
86
+ console.log('\nšŸ“ Generated Files:');
87
+ const files = [
88
+ 'user_balances.csv',
89
+ 'multiple_minters.csv',
90
+ 'eoa_transfers.csv',
91
+ 'eoa_transfer_summary.csv',
92
+ 'user_portfolios.csv'
93
+ ];
94
+ files.forEach(file => {
95
+ if (fs.existsSync(file)) {
96
+ const stats = fs.statSync(file);
97
+ console.log(` āœ… ${file} (${(stats.size / 1024).toFixed(2)} KB)`);
98
+ }
99
+ else {
100
+ console.log(` āŒ ${file} (not found)`);
101
+ }
102
+ });
103
+ console.log('\nšŸ“Š Analysis Summary:');
104
+ console.log(' • user_balances.csv - All user token balances and NFT data');
105
+ console.log(' • multiple_minters.csv - Users who minted multiple times');
106
+ console.log(' • eoa_transfers.csv - Detailed EOA transfer transactions');
107
+ console.log(' • eoa_transfer_summary.csv - Summary of EOA transfers by user');
108
+ console.log(' • user_portfolios.csv - Total portfolio values for each user');
109
+ }
110
+ catch (error) {
111
+ console.error('\nšŸ’„ Pipeline failed:', error);
112
+ process.exit(1);
113
+ }
114
+ }
115
+ main().catch(console.error);