From 7dd4a65746635cde0d8ddfcf1d015c9c31c64da5 Mon Sep 17 00:00:00 2001 From: cwsnt Date: Tue, 18 Mar 2025 07:57:53 +0700 Subject: [PATCH 1/2] init: ossov snapshot script --- package-lock.json | 14 + package.json | 3 + scripts/ossov/config.json | 3 + scripts/ossov/results/progress_log.json | 7 + .../staking_rewards_snapshot_block.csv | 101 +++++ scripts/ossov/snapshot-ossov.ts | 418 ++++++++++++++++++ 6 files changed, 546 insertions(+) create mode 100644 scripts/ossov/config.json create mode 100644 scripts/ossov/results/progress_log.json create mode 100644 scripts/ossov/results/staking_rewards_snapshot_block.csv create mode 100644 scripts/ossov/snapshot-ossov.ts diff --git a/package-lock.json b/package-lock.json index 4d37dd0a6..86dca4d18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,9 @@ "name": "sovrynsmartcontracts", "version": "1.0.0", "license": "Apache-2.0", + "dependencies": { + "csv-writer": "^1.6.0" + }, "devDependencies": { "@defi-wonderland/smock": "^2.3.4", "@nomicfoundation/hardhat-foundry": "^1.0.2", @@ -13403,6 +13406,12 @@ "node": ">= 10" } }, + "node_modules/csv-writer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/csv-writer/-/csv-writer-1.6.0.tgz", + "integrity": "sha512-NOx7YDFWEsM/fTRAJjRpPp8t+MKRVvniAg9wQlUKx20MFrPs73WLJhFf5iteqrxNYnsy924K3Iroh3yNHeYd2g==", + "license": "MIT" + }, "node_modules/d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -56360,6 +56369,11 @@ "minimist": "^1.2.0" } }, + "csv-writer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/csv-writer/-/csv-writer-1.6.0.tgz", + "integrity": "sha512-NOx7YDFWEsM/fTRAJjRpPp8t+MKRVvniAg9wQlUKx20MFrPs73WLJhFf5iteqrxNYnsy924K3Iroh3yNHeYd2g==" + }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", diff --git a/package.json b/package.json index 2f9323108..0827f85f9 100644 --- a/package.json +++ b/package.json @@ -108,5 +108,8 @@ "pre-commit": "yarn prettier", "pre-push": "yarn lint && yarn prettier-check" } + }, + "dependencies": { + "csv-writer": "^1.6.0" } } diff --git a/scripts/ossov/config.json b/scripts/ossov/config.json new file mode 100644 index 000000000..e3e1b8dd7 --- /dev/null +++ b/scripts/ossov/config.json @@ -0,0 +1,3 @@ +{ + "addresses": [] +} diff --git a/scripts/ossov/results/progress_log.json b/scripts/ossov/results/progress_log.json new file mode 100644 index 000000000..68be54dfd --- /dev/null +++ b/scripts/ossov/results/progress_log.json @@ -0,0 +1,7 @@ +{ + "targetBlock": 14551520, + "totalStakers": 1121, + "processedCount": 100, + "lastProcessedIndex": 99, + "lastUpdateTime": "2025-03-14T15:11:59.963Z" +} diff --git a/scripts/ossov/results/staking_rewards_snapshot_block.csv b/scripts/ossov/results/staking_rewards_snapshot_block.csv new file mode 100644 index 000000000..6964499fc --- /dev/null +++ b/scripts/ossov/results/staking_rewards_snapshot_block.csv @@ -0,0 +1,101 @@ +address,osSOV_balance,osSOV_unclaimed +0x2bD2201BFE156A71EB0D02837172ffc237218505,0,70373076923076923 +0xaDbEE234896B1A53a80D113A7eceF5f2B4AeAED6,0,35186538461538461 +0x3fF003142742d54E7c6A0c8dA2861dEAE392Dcce,0,0 +0x639c1170066c025B2Aca4361D9Ec7De6998c2576,0,0 +0x78f9ddE9838b5F6d58e9134B2D30dfc9d13550c1,0,2213066157129478748 +0x99679f6c76d4bdb3082Bd4b944437ECee93D596A,0,0 +0xC857a07Ca20babEdA3f76E9Be6B1B2701A29fC11,0,1926544606183631920 +0x68911e58f65062066abc81559a6DEf797402f345,0,250639587181134990291 +0x3e39235C3822730C0d9F62599D3fDA5cA1366e37,0,69881219924369558204 +0xE3f1121A1ddC59572Fa764334Dd007403EACaDdb,0,0 +0xBBFd9988eA52EE8C88f7BA28d1db827e73955ae8,0,0 +0x9227dFf3a69caC5bc42984256588c88d1581237B,0,662660411071459007 +0xC2AF342A3A3b861064792070849cFb33A55552E2,0,0 +0x3ce20d8d94Fe41e71190361C2d424CffaFe401Ce,0,0 +0x351B2237DF1427AD44b8192ca5EFF13c15f3F26e,0,0 +0x2Bd4045d7f9444643C4506C0d8df181392eCbEbF,0,0 +0x3c821bB57ea467d6A0fCccE2c853C8C4117Bca84,0,0 +0x5e117276A540DfFE52f7406FA453359631B3a6C5,0,0 +0x5F8A304af1311EB5630625Bf2042c2ACE00489c3,0,797884615384615384615 +0x2E8A5909Ac98c5913a7BA4f8A6Ec2cd32CedE625,0,0 +0xA6adEdD1aDc8237aC8c5d3009cC5D4B90Fc0a8CF,0,2177625186448418636 +0xb401AbB70432d13e46d65aB4DEe47232437D28d0,0,406976580264285131 +0x7579265244a4CB64C4BEa197161A449E16FD28D0,0,0 +0xb0cc4ed0CC3c2231581eaf6feA6f422928A23F4F,0,7255852375396518329 +0x4B0cf52b56E664b377cb588Cd300Be94B5062B1c,0,12394445842574742712 +0x5f9fEbf1F2A99fe11Edad119462DB23f28A6dDBb,0,472500000000000000 +0xa8e98bD2D3DA823C7503FE6f4cf2FCD01CF6BE4C,0,270179527241119297683 +0xE48440c1f17235038C2B9E535C50fC64c6F8703A,0,63873320840255767027 +0x121Acf78D8B71eeC95Da4e5FFBEFbc07674A64Cd,0,0 +0xc5fd654bA7c9C9d6b5710Fc347c1306e855Ec582,0,0 +0xf9A0c6eEa16E4F4c5ef40D835Eb1A2Fc489F4ACD,0,0 +0x77535aEF7F300d9ce6d9dE85A7E813F8DcF23Bc5,0,20786538461538461 +0x8d4190772bA1C59138303679c2Ac89E3d00736A7,0,0 +0xA9deEDBa572029155090DE0eea714c14015c2043,0,0 +0x41a350d22d432C66c2A4E06cDc54A1683782B2Bd,0,0 +0xd5C96ACf8004fF1f3c59f284a92F0d964655599a,0,0 +0x7a45C487784ea72Dce85D48A9E3F5Ad5EDc34Ee2,0,3740216444480538777 +0x922f2928f4d244611e8beF9e8dAD88A5B6E2B59C,0,12028846153846153846 +0xba710BE407751FD2c4c8eD7e95c452d11c2E4A85,0,75384069603443427 +0x1d0b10032bd425BEA8f2CDe0D52a280243C66965,0,633013306991096971 +0xb8128b1063e86C821B287778ed500b36033Ae02B,0,9195353367384434812 +0xBa986c82A78db4Cc36D05fd99836C795bece1663,0,0 +0x843857D513aB6E360c3E85ce8D85694d2b19450a,0,10293576923076923076 +0xA99B5cb190582aE0966778C26188eABbf0feFfb8,0,150569705575226228260 +0x8BE13377A580653551c593BD3752241CD807dee0,0,2850220931814240225 +0xC1307678f788ec362124090207e81486D06fA4b0,0,0 +0x94c74DFA070500E317DddE4d64007FE26ae8aB9A,0,0 +0xA70bceaa99dA8CF2EDAe5b17DA79607cBF6286Dd,0,47655153557748300655 +0xC4ecb7bA7C8894465Aa3DE607B50bFECde581875,0,6229959598852057396 +0x1FA4D89f1d044dCa763610F30E51AAda92C6c38c,0,0 +0x0257E54fB88E143511CD2e4B94aaE8e1FA6DE520,0,356368870325081920980 +0x90fDF1b91a06e59b736E3a6FbFc5F0D06b4E928f,0,68061082659827435446 +0xf63a521ad77803a3b5f92EDdb4613D719d32448a,0,27070983087573544674 +0xDfd12D539448385a1A49797e7E72Ece104448546,0,6478129451499409018 +0xEAcDD6b4B80Fcb241A4cfAb7f46e886F19c89340,0,0 +0xbE01Ac936a0567cE6328524ae50a2aD036f5Cd07,0,0 +0x2b5B3c98AD9b7C6b814eDc5e63DD487e6BC5f454,0,27366684015956229185 +0x6e4d7FdD7Cae2A616B37a44f0E090A281120D1C1,0,977649665971543642 +0xD2FaE24701e3a5B862Fe6EE2F386EC40A872c68b,0,0 +0xF50f458AC4961185FAe7C9b5599A119EAcaD009b,0,16052113019360800904 +0xBeD7482409659EAB8B9B6EfD746f8a53699bDda6,0,93460938148688639 +0x9b06Ce7455D3350D00994a886F77CAD77B5724b6,0,0 +0x380321D5ef1596a15B78ff63a7B268399968769C,0,20250000000000000000 +0x93624C41A99e17089D0856a974E6c018cBbEE93D,0,0 +0xdFcAd7b53504ada98D7a93F02ff049b18Ff2B18C,0,0 +0x7214E37eF397Dd58b95888C6B7eBCA5629bd83A5,0,124615384615384 +0x285695009860f910f78401345ff353BA6d0cfE58,0,18000000000000000 +0x954095D2801Cc6c0526ED8816CA4d99Fbb8a0330,0,0 +0x342A085E69aC726B9965AE6Ca0E6f23a23256E03,0,0 +0xf50c7B18C127B43CF0De88Ed753f3f8D0235eF8a,0,0 +0x442269e9E7cB11AEfD08EB6981Ee7DDEA1Fc938E,0,33267597205150657 +0x396dF64508673753BD43fE1465D745CB2Cabc079,0,70857692307692307 +0x42Ca6b4266179c47Cd1e19a054214965DF28da78,0,0 +0xb3fbDA6D402a4874DB14ffF4495e6dFbD34b6ff4,0,131191536350945898 +0x73d9Ac8CDB2E0c7aE1e743CE7078Ab2ea4b08481,0,0 +0xf33350b3778985A606468906908eb002644c2D59,0,113249270433969323 +0xE93709A5d4AFA46ed6A2D1B4D93dd13137bAbcB9,0,0 +0xCbfeaA6D42d5D5A15Cb5D499dd5905e1231aF74a,0,1177316173221223612 +0xB9bE759044e13F545225173b286C70410a5ACA31,0,0 +0x79432Cc61878Bc3ed352ea311761359a2625AF8F,0,0 +0x538aB12CDa2a972c9D37828A7A9239fb97b863b6,0,319086787820585517 +0x2d3117E30D36D561f878640B82BE8209fC69eDc0,0,0 +0xBeF54c3b0898d005fB500C6931DED87579d7a3A8,0,899569723065547088711 +0x907f6BA8cbbc4528D262c69633062B5f8FA95136,0,11809828723107367562 +0xaf6Da5C20cd40F43ED023Ee1EA9F9fcbFf724743,0,29402100000000000000 +0x709371EBe78323999dD3e1D2d6DE46b1D57b082c,0,0 +0x9a32D0389D3910683F5A1851cf3D60564Acb26E2,0,309085504041778035 +0xF4A50Ca186DABe0c3A17DE7F88A415488AAf011e,0,127107692307692307692 +0xD805Aa04c701049B282a94eCBf6dD6481BFEC162,0,0 +0x20ad091f64EB31267C248F6200775561BcA17168,0,0 +0x9ccB7EcF70D0481538aD6632BB5D8dd0E909Fcf8,0,0 +0x1d1C383D839F4F7426cCdADC7307a2344e66e252,0,6808680000000000 +0x52882EC01fEafbF9de48115D10df6BB75CA3912e,0,1062562020939700111 +0x49eb2a1eF5bbfD234e4F50c78bCf78177C0F50E7,0,2548609327532716213 +0xD3362E86aaBCaf3f3508A6B878Ab41Fcb82F2Bd5,0,37607916951281549 +0xC8D69403c231A31a77fD5e6e87367Fc8f12b0c5B,0,143446153846153846 +0x0244f3ba246aEE6F6214ea1439bf64084A323FD2,0,253641573715981180 +0x08893092E474F58aDaB42eDd09C37A31a13aA8e4,0,0 +0x2150e80DAE8359592D2F7A3f83D9DFA4Cd343c71,0,9210302329223794 +0x4Ba38d76D13Fd9cb2691DA53490085708D1E5053,0,0 diff --git a/scripts/ossov/snapshot-ossov.ts b/scripts/ossov/snapshot-ossov.ts new file mode 100644 index 000000000..4ea6a10ed --- /dev/null +++ b/scripts/ossov/snapshot-ossov.ts @@ -0,0 +1,418 @@ +import { ethers } from "ethers"; +import { createObjectCsvWriter } from "csv-writer"; +import dotenv from "dotenv"; +import fs from "fs"; +import path from "path"; + +dotenv.config(); + +interface StakingData { + address: string; + osSOV_balance: string; + osSOV_unclaimed: string; +} + +interface TokensStakedEvent { + args: [string, bigint, bigint, bigint] & { + staker: string; + amount: bigint; + lockedUntil: bigint; + totalStaked: bigint; + }; +} + +const STAKING_ABI = [ + "event TokensStaked(address indexed staker, uint256 amount, uint256 lockedUntil, uint256 totalStaked)", +]; + +const REWARDS_ABI = [ + "function getArbitraryStakerCurrentReward(bool considerMaxDuration, uint256 startTime, address staker) view returns (uint256 nextWithdrawTimestamp, uint256 amount)", + "function getOsSOV() view returns (address)", + "function getStaking() view returns (address)", +]; + +const ERC20_ABI = [ + "function balanceOf(address account) view returns (uint256)", +]; + +const ADDRESSES = { + REWARDS: "0xFdC57Cb52264209afd1559E7E3Db0F28351E9422", +} as const; + +const CHUNK_SIZE = 10000000; + +async function getStakingData(params: { + startFromBlock?: number; + endBlock?: number; + specificAddresses?: string[]; +}) { + console.log("Starting snapshot process..."); + + const provider = new ethers.providers.JsonRpcProvider(process.env.RPC_URL); + if (!provider) throw new Error("Failed to initialize provider"); + + // define target block + let { startFromBlock, endBlock, specificAddresses } = params; + if (!startFromBlock) startFromBlock = 0; + const targetBlock = endBlock || (await provider.getBlockNumber()); + console.log(`Using block number: ${targetBlock}`); + console.log(`Starting from block: ${startFromBlock}`); + + const rewardsContract = new ethers.Contract( + ADDRESSES.REWARDS, + REWARDS_ABI, + provider, + ); + const stakingContractAddress = await rewardsContract.getStaking(); + const stakingContract = new ethers.Contract( + stakingContractAddress, + STAKING_ABI, + provider, + ); + + // Get osSOV token address and contract + const osSOVAddress = await rewardsContract.getOsSOV(); + const osSOVContract = new ethers.Contract(osSOVAddress, ERC20_ABI, provider); + console.log(`osSOV token address: ${osSOVAddress}`); + + let stakers: string[] = []; + + // If specific addresses are provided, use them directly + if (specificAddresses && specificAddresses.length > 0) { + console.log( + `Using ${specificAddresses.length} provided addresses instead of querying events`, + ); + stakers = specificAddresses; + } else { + // Otherwise fetch all staking events in chunks + console.log("Fetching staking events..."); + const filter = stakingContract.filters.TokensStaked(); + + // Process in chunks of 10,000 blocks + let allEvents: TokensStakedEvent[] = []; + + for ( + let fromBlock = startFromBlock; + fromBlock <= targetBlock; + fromBlock += CHUNK_SIZE + ) { + const toBlock = Math.min(fromBlock + CHUNK_SIZE - 1, targetBlock); + console.log(`Querying blocks ${fromBlock} to ${toBlock}...`); + + try { + const chunkEvents = ( + await stakingContract.queryFilter(filter, fromBlock, toBlock) + ).map((event) => { + return { + args: event.args as unknown as [string, bigint, bigint, bigint] & { + staker: string; + amount: bigint; + lockedUntil: bigint; + totalStaked: bigint; + }, + } as TokensStakedEvent; + }); + + allEvents = [...allEvents, ...chunkEvents]; + console.log( + `Found ${chunkEvents.length} events in this chunk. Total: ${allEvents.length}`, + ); + + // Add delay between chunks to avoid rate limiting + if (fromBlock + CHUNK_SIZE <= targetBlock) { + console.log("Waiting before next chunk..."); + await sleep(1000); + } + } catch (error) { + console.error(`Error querying blocks ${fromBlock}-${toBlock}:`, error); + // Continue to next chunk + } + } + + // Get unique stakers + stakers = [...new Set(allEvents.map((event) => event.args.staker))]; + console.log(`Found ${stakers.length} unique stakers`); + } + + // Create results directory if it doesn't exist + const resultsDir = path.resolve(__dirname, "./results"); + if (!fs.existsSync(resultsDir)) { + fs.mkdirSync(resultsDir, { recursive: true }); + } + + // Define CSV file path + const csvFilePath = path.join( + resultsDir, + `staking_rewards_snapshot_block.csv`, + ); + + // Check if file exists and load existing data + let existingData: Record = {}; + if (fs.existsSync(csvFilePath)) { + console.log(`Found existing CSV file. Loading data...`); + const csvContent = fs.readFileSync(csvFilePath, "utf8"); + const rows = csvContent.split("\n").slice(1); // Skip header + + for (const row of rows) { + if (!row.trim()) continue; + const [address, osSOV_balance, osSOV_unclaimed] = row.split(","); + if (address) { + existingData[address.toLowerCase()] = { + address, + osSOV_balance, + osSOV_unclaimed, + }; + } + } + console.log(`Loaded ${Object.keys(existingData).length} existing records`); + + // Filter out already processed addresses + stakers = stakers.filter( + (staker) => + !existingData[staker.toLowerCase()] || + specificAddresses?.includes(staker), + ); + console.log(`Remaining addresses to process: ${stakers.length}`); + } + + // Process all of the unique stakers + const results: StakingData[] = []; + let successCount = 0; + let errorCount = 0; + const failedAddresses: string[] = []; + + // Create progress log file + const progressLogPath = path.join(resultsDir, `progress_log.json`); + let progressData = { + targetBlock, + totalStakers: stakers.length, + processedCount: 0, + lastProcessedIndex: -1, + lastUpdateTime: new Date().toISOString(), + }; + + // Load existing progress if available + if (fs.existsSync(progressLogPath)) { + try { + progressData = JSON.parse(fs.readFileSync(progressLogPath, "utf8")); + console.log(`Resuming from index ${progressData.lastProcessedIndex + 1}`); + } catch (error) { + console.error(`Error reading progress log:`, error); + } + } + + // Process in smaller chunks and save progress regularly + const PROCESS_CHUNK_SIZE = 20; // Process 20 addresses at a time + + for (let i = progressData.lastProcessedIndex + 1; i < stakers.length; i++) { + const staker = stakers[i]; + if (!staker) continue; + + try { + // Add delay to avoid rate limiting + await sleep(100); + + const [balance, [, unclaimed]] = await Promise.all([ + osSOVContract.balanceOf(staker, { blockTag: targetBlock }), + rewardsContract.getArbitraryStakerCurrentReward(false, 0, staker, { + blockTag: targetBlock, + }), + ]); + + results.push({ + address: staker, + osSOV_balance: balance.toString(), + osSOV_unclaimed: unclaimed.toString(), + }); + + successCount++; + progressData.processedCount++; + progressData.lastProcessedIndex = i; + + if (successCount % 10 === 0) { + console.log( + `Processed ${successCount}/${stakers.length} stakers successfully`, + ); + } + } catch (error) { + console.error(`Error processing staker ${staker}:`, error); + errorCount++; + failedAddresses.push(staker); + } + + // Save progress and results every PROCESS_CHUNK_SIZE addresses + if ((i + 1) % PROCESS_CHUNK_SIZE === 0 || i === stakers.length - 1) { + // Update progress log + progressData.lastUpdateTime = new Date().toISOString(); + fs.writeFileSync(progressLogPath, JSON.stringify(progressData, null, 2)); + + // Append to CSV if we have new results + if (results.length > 0) { + // Combine new results with existing data + const allResults: StakingData[] = [ + ...Object.values(existingData), + ...results, + ]; + + // Write to CSV + const csvWriter = createObjectCsvWriter({ + path: csvFilePath, + header: [ + { id: "address", title: "address" }, + { id: "osSOV_balance", title: "osSOV_balance" }, + { id: "osSOV_unclaimed", title: "osSOV_unclaimed" }, + ], + }); + + await csvWriter.writeRecords(allResults); + console.log( + `Saved progress: ${progressData.processedCount}/${stakers.length} addresses processed`, + ); + + // Update existing data with new results to avoid duplicates in next chunk + for (const result of results) { + existingData[result.address.toLowerCase()] = result; + } + + // Clear results array for next chunk + results.length = 0; + } + } + } + + console.log("\nSnapshot completed!"); + console.log( + `Successfully processed: ${successCount}/${stakers.length} stakers`, + ); + console.log(`Errors encountered: ${errorCount} stakers`); + console.log(`Total records in CSV: ${Object.keys(existingData).length}`); + console.log(`Results saved to: ${csvFilePath}`); + + // If there are failed addresses, try to process them again + if (failedAddresses.length > 0) { + console.log( + `\nAttempting to process ${failedAddresses.length} failed addresses again...`, + ); + + // Save failed addresses to a file for future reference + const failedAddressesPath = path.join( + resultsDir, + `failed_addresses_${targetBlock}.json`, + ); + fs.writeFileSync( + failedAddressesPath, + JSON.stringify(failedAddresses, null, 2), + ); + console.log(`Failed addresses saved to: ${failedAddressesPath}`); + + // Wait a bit longer before retrying + await sleep(5000); + + // Retry with increased delay + const retryResults: StakingData[] = []; + let retrySuccessCount = 0; + const stillFailedAddresses: string[] = []; + + for (const staker of failedAddresses) { + try { + // Longer delay for retries + await sleep(500); + + const [balance, [, unclaimed]] = await Promise.all([ + osSOVContract.balanceOf(staker, { blockTag: targetBlock }), + rewardsContract.getArbitraryStakerCurrentReward(false, 0, staker, { + blockTag: targetBlock, + }), + ]); + + retryResults.push({ + address: staker, + osSOV_balance: balance.toString(), + osSOV_unclaimed: unclaimed.toString(), + }); + + retrySuccessCount++; + console.log(`Retry successful for ${staker}`); + } catch (error) { + console.error(`Retry failed for staker ${staker}:`, error); + stillFailedAddresses.push(staker); + } + } + + // If we recovered some addresses, update the CSV + if (retrySuccessCount > 0) { + const finalResults = [...Object.values(existingData), ...retryResults]; + + const csvWriter = createObjectCsvWriter({ + path: csvFilePath, + header: [ + { id: "address", title: "address" }, + { id: "osSOV_balance", title: "osSOV_balance" }, + { id: "osSOV_unclaimed", title: "osSOV_unclaimed" }, + ], + }); + + await csvWriter.writeRecords(finalResults); + + console.log(`\nRetry completed!`); + console.log( + `Successfully recovered: ${retrySuccessCount}/${failedAddresses.length} stakers`, + ); + console.log(`Total records in CSV: ${finalResults.length}`); + } + + // If there are still failed addresses, save them and notify + if (stillFailedAddresses.length > 0) { + const stillFailedPath = path.join( + resultsDir, + `still_failed_addresses_${targetBlock}.json`, + ); + fs.writeFileSync( + stillFailedPath, + JSON.stringify(stillFailedAddresses, null, 2), + ); + console.log( + `\n⚠️ WARNING: ${stillFailedAddresses.length} addresses still failed processing`, + ); + console.log(`These addresses saved to: ${stillFailedPath}`); + console.log(`You can process them manually by running:`); + console.log( + `node scripts/ossov/snapshot-ossov.js --block ${targetBlock} --addresses ${stillFailedPath}`, + ); + + // Return the list of still failed addresses + return stillFailedAddresses; + } + } + + return []; +} + +let specificAddresses: string[] | undefined; +const configPath = path.resolve(__dirname, "./config.json"); +if (fs.existsSync(configPath)) { + try { + const config = JSON.parse(fs.readFileSync(configPath, "utf8")); + specificAddresses = config.addresses; + console.log( + `Loaded ${specificAddresses?.length} addresses from config.json`, + ); + } catch (error) { + console.error("Error reading config file:", error); + } +} + +getStakingData({ + startFromBlock: 900618, // block where the staking contract have stake txs + specificAddresses: + specificAddresses && specificAddresses.length > 0 + ? specificAddresses + : undefined, +}) + .then(() => process.exit(0)) + .catch((error) => { + console.error("Fatal error:", error); + process.exit(1); + }); + +const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); From 412544c101fa897912086324a68b3e1e32707204 Mon Sep 17 00:00:00 2001 From: cwsnt Date: Fri, 13 Feb 2026 19:32:41 +0700 Subject: [PATCH 2/2] SOV-5306: init osSOV snapshot --- scripts/ossov/README.md | 169 +++ scripts/ossov/config.json | 8 + .../results/bob_progress_block_26296185.json | 9 + .../results/bob_snapshot_block_26296185.csv | 1163 +++++++++++++++++ .../staking_rewards_snapshot_block.csv | 101 -- scripts/ossov/snapshot-ossov.ts | 502 ++++--- 6 files changed, 1686 insertions(+), 266 deletions(-) create mode 100644 scripts/ossov/README.md create mode 100644 scripts/ossov/results/bob_progress_block_26296185.json create mode 100644 scripts/ossov/results/bob_snapshot_block_26296185.csv delete mode 100644 scripts/ossov/results/staking_rewards_snapshot_block.csv diff --git a/scripts/ossov/README.md b/scripts/ossov/README.md new file mode 100644 index 000000000..437d9cb38 --- /dev/null +++ b/scripts/ossov/README.md @@ -0,0 +1,169 @@ +# osSOV Snapshot Tool + +A unified TypeScript tool for capturing osSOV balances and unclaimed rewards across multiple networks (RSK Mainnet and BOB). + +--- + +## Quick Start + +### 1. Setup Configuration + +```bash +# Create config.json from example +cp scripts/ossov/config.json.example scripts/ossov/config.json + +# Edit config.json with your network settings +``` + +**config.json structure:** +```json +{ + "networks": { + "bob": { + "name": "BOB", + "rpcUrl": "https://rpc.gobob.xyz", + "rewardsAddress": "0xYourRewardsContractAddress", + "startBlock": 26296185 + } + }, + "addresses": [] +} +``` + +### 2. Run Snapshot + +**BOB Network with auto-discovery:** +```bash +npx ts-node scripts/ossov/snapshot-ossov.ts \ + --network bob \ + --auto-discover \ + --block 26296185 +``` + +**With specific addresses:** +```bash +npx ts-node scripts/ossov/snapshot-ossov.ts \ + --network rsk \ + --addresses ./my-addresses.json +``` + +--- + +## Command-Line Options + +| Option | Description | Example | +|--------|-------------|---------| +| `--network` | Network to use (rsk or bob) | `--network bob` | +| `--block` | Target block number (default: latest) | `--block 26296185` | +| `--start-block` | Starting block for discovery | `--start-block 900618` | +| `--auto-discover` | Enable auto-discovery mode | `--auto-discover` | +| `--addresses` | JSON file with addresses | `--addresses ./addresses.json` | + +--- + +## Usage Examples + +### Example: BOB Network Auto-Discovery + +```bash +npx ts-node scripts/ossov/snapshot-ossov.ts \ + --network bob \ + --auto-discover \ + --block 26296185 +``` + +### Example 3: BOB with Custom Block Range + +```bash +npx ts-node scripts/ossov/snapshot-ossov.ts \ + --network bob \ + --auto-discover \ + --start-block 26296185 \ + --block 26300000 +``` + +--- + +## Auto-Discovery Mode + +When `--auto-discover` is enabled, the script automatically finds all relevant addresses by scanning: + +### 1. TokensStaked Events +``` +Staking Contract → TokensStaked events → Extract staker addresses +``` + +### 2. Transfer Events +``` +osSOV Token → Transfer events → Extract from/to addresses +``` + +### 3. Deduplicate +``` +Combine all addresses → Remove duplicates → Final address list +``` + +This ensures you capture all addresses that have ever: +- Staked tokens +- Received osSOV tokens +- Transferred osSOV tokens + +--- + +## Output Files + +### CSV: `results/{network}_snapshot_block_{BLOCK}.csv` + +```csv +address,osSOV_balance,osSOV_unclaimed +0x1234...,5000000000000000000,250000000000000000 +0x5678...,10000000000000000000,500000000000000000 +``` + +**Columns:** +- `address` - Ethereum address +- `osSOV_balance` - Current osSOV token balance (wei) +- `osSOV_unclaimed` - Unclaimed rewards available (wei) + +### Progress: `results/{network}_progress_block_{BLOCK}.json` + +```json +{ + "network": "BOB", + "targetBlock": 26296185, + "startFromBlock": 26296185, + "totalAddresses": 150, + "processedCount": 75, + "lastProcessedIndex": 74, + "lastUpdateTime": "2026-02-09T12:34:56.789Z" +} +``` + +--- + +## Resume Capability + +If the script stops (network issue, rate limit, etc.), just run it again: + +```bash +npx ts-node scripts/ossov/snapshot-ossov.ts \ + --network bob \ + --auto-discover \ + --block 26296185 +``` + +The script will: +1. ✅ Load existing CSV data +2. ✅ Load progress log +3. ✅ Skip already processed addresses +4. ✅ Continue from where it stopped + +--- + +## Network Configuration + +### BOB +- **RPC:** `https://rpc.gobob.xyz` +- **Rewards Contract:** *Set in config.json* +- **Start Block:** `26296185` +- **Chunk Size:** `5000` (5K blocks per query, optimized for BOB) diff --git a/scripts/ossov/config.json b/scripts/ossov/config.json index e3e1b8dd7..eb7a080de 100644 --- a/scripts/ossov/config.json +++ b/scripts/ossov/config.json @@ -1,3 +1,11 @@ { + "networks": { + "bob": { + "name": "BOB", + "rpcUrl": "https://rpc.gobob.xyz", + "rewardsAddress": "0xFdC57Cb52264209afd1559E7E3Db0F28351E9422", + "startBlock": 797159 + } + }, "addresses": [] } diff --git a/scripts/ossov/results/bob_progress_block_26296185.json b/scripts/ossov/results/bob_progress_block_26296185.json new file mode 100644 index 000000000..7ff2c6f74 --- /dev/null +++ b/scripts/ossov/results/bob_progress_block_26296185.json @@ -0,0 +1,9 @@ +{ + "network": "BOB", + "targetBlock": 26296185, + "startFromBlock": 797159, + "totalAddresses": 1162, + "processedCount": 1162, + "lastProcessedIndex": 1161, + "lastUpdateTime": "2026-02-13T11:05:48.923Z" +} diff --git a/scripts/ossov/results/bob_snapshot_block_26296185.csv b/scripts/ossov/results/bob_snapshot_block_26296185.csv new file mode 100644 index 000000000..217b4332a --- /dev/null +++ b/scripts/ossov/results/bob_snapshot_block_26296185.csv @@ -0,0 +1,1163 @@ +address,osSOV_balance,osSOV_unclaimed +0x2bd2201bfe156a71eb0d02837172ffc237218505,0,128042307692307692 +0xadbee234896b1a53a80d113a7ecef5f2b4aeaed6,0,64021153846153846 +0x3ff003142742d54e7c6a0c8da2861deae392dcce,0,1193538461538461538 +0x639c1170066c025b2aca4361d9ec7de6998c2576,0,0 +0x78f9dde9838b5f6d58e9134b2d30dfc9d13550c1,0,0 +0x99679f6c76d4bdb3082bd4b944437ecee93d596a,0,0 +0xc857a07ca20babeda3f76e9be6b1b2701a29fc11,0,0 +0x68911e58f65062066abc81559a6def797402f345,0,692374550224129807434 +0x3e39235c3822730c0d9f62599d3fda5ca1366e37,0,0 +0xe3f1121a1ddc59572fa764334dd007403eacaddb,0,0 +0xbbfd9988ea52ee8c88f7ba28d1db827e73955ae8,0,0 +0x9227dff3a69cac5bc42984256588c88d1581237b,0,0 +0xc2af342a3a3b861064792070849cfb33a55552e2,0,0 +0x3ce20d8d94fe41e71190361c2d424cffafe401ce,0,0 +0x351b2237df1427ad44b8192ca5eff13c15f3f26e,0,0 +0x2bd4045d7f9444643c4506c0d8df181392ecbebf,0,0 +0x3c821bb57ea467d6a0fccce2c853c8c4117bca84,0,0 +0x5e117276a540dffe52f7406fa453359631b3a6c5,0,0 +0x5f8a304af1311eb5630625bf2042c2ace00489c3,0,0 +0x2e8a5909ac98c5913a7ba4f8a6ec2cd32cede625,0,0 +0xa6adedd1adc8237ac8c5d3009cc5d4b90fc0a8cf,0,2177625186448418636 +0xb401abb70432d13e46d65ab4dee47232437d28d0,0,406976580264285131 +0x7579265244a4cb64c4bea197161a449e16fd28d0,0,0 +0xb0cc4ed0cc3c2231581eaf6fea6f422928a23f4f,0,7255852375396518329 +0x4b0cf52b56e664b377cb588cd300be94b5062b1c,0,0 +0x5f9febf1f2a99fe11edad119462db23f28a6ddbb,0,472500000000000000 +0xa8e98bd2d3da823c7503fe6f4cf2fcd01cf6be4c,0,0 +0xe48440c1f17235038c2b9e535c50fc64c6f8703a,0,0 +0x121acf78d8b71eec95da4e5ffbefbc07674a64cd,0,0 +0xc5fd654ba7c9c9d6b5710fc347c1306e855ec582,0,0 +0xf9a0c6eea16e4f4c5ef40d835eb1a2fc489f4acd,0,0 +0x77535aef7f300d9ce6d9de85a7e813f8dcf23bc5,0,20959615384615384 +0x8d4190772ba1c59138303679c2ac89e3d00736a7,0,0 +0xa9deedba572029155090de0eea714c14015c2043,0,0 +0x41a350d22d432c66c2a4e06cdc54a1683782b2bd,0,0 +0xd5c96acf8004ff1f3c59f284a92f0d964655599a,0,0 +0x7a45c487784ea72dce85d48a9e3f5ad5edc34ee2,0,3740216444480538777 +0x922f2928f4d244611e8bef9e8dad88a5b6e2b59c,0,12028846153846153846 +0xba710be407751fd2c4c8ed7e95c452d11c2e4a85,0,75384069603443427 +0x1d0b10032bd425bea8f2cde0d52a280243c66965,0,633013306991096971 +0xb8128b1063e86c821b287778ed500b36033ae02b,0,0 +0xba986c82a78db4cc36d05fd99836c795bece1663,0,0 +0x843857d513ab6e360c3e85ce8d85694d2b19450a,0,0 +0xa99b5cb190582ae0966778c26188eabbf0feffb8,0,0 +0x8be13377a580653551c593bd3752241cd807dee0,0,2850220931814240225 +0xc1307678f788ec362124090207e81486d06fa4b0,0,0 +0x94c74dfa070500e317ddde4d64007fe26ae8ab9a,0,0 +0xa70bceaa99da8cf2edae5b17da79607cbf6286dd,0,115359061145298199163 +0xc4ecb7ba7c8894465aa3de607b50bfecde581875,0,0 +0x1fa4d89f1d044dca763610f30e51aada92c6c38c,0,0 +0x0257e54fb88e143511cd2e4b94aae8e1fa6de520,0,537209171052376202020 +0x90fdf1b91a06e59b736e3a6fbfc5f0d06b4e928f,0,94093662663355901538 +0xf63a521ad77803a3b5f92eddb4613d719d32448a,0,52998595460889324728 +0xdfd12d539448385a1a49797e7e72ece104448546,0,6478129451499409018 +0xeacdd6b4b80fcb241a4cfab7f46e886f19c89340,0,0 +0xbe01ac936a0567ce6328524ae50a2ad036f5cd07,0,0 +0x2b5b3c98ad9b7c6b814edc5e63dd487e6bc5f454,0,51521831392126220843 +0x6e4d7fdd7cae2a616b37a44f0e090a281120d1c1,0,977649665971543642 +0xd2fae24701e3a5b862fe6ee2f386ec40a872c68b,0,0 +0xf50f458ac4961185fae7c9b5599a119eacad009b,0,73967005366746245579 +0xe2cc7c92e564acdc07739287b397ef2078b00f0e,0,0 +0xf9bf898bf2f41ade970d9ff718d6027a217c491c,0,61731803452893031860 +0x7edfb7b8f49776c3ec6744087fc37c253da6329a,0,121848153254747393 +0x4b3a7d64baadef80a9a65495f8d3d3936e991ade,0,0 +0x71430b08eba9ef1ebeaed53d9fa9ee5f6523161c,0,0 +0xba9636ed6a47ff6b4f50060172a01f362b91b7b6,0,30185809364433282166 +0xfed286937b839e9ee719272c00ad8e32db79c3af,0,0 +0x4a806aa877d0bcd317e793200090fd01b4cff21c,0,2545517029363113066 +0x1ac17a302e4dcd39ef3b6d3ff57c1fcebe70703d,0,613843269230769230769 +0x58039818b69dda1648d233d0329d9105fcdc7f5d,0,0 +0xf681bd2db1b4605fde1f7df0098d5c13e1f97aed,0,0 +0x314fe519f7016b54f865cc0b6aac24837c5a4374,0,329990815384615384615 +0xeeb771b07002afb86b81bd90ff238b19faf5e1b2,0,0 +0x9193f32b0995815c4ff4a0111d85cfd83bb05247,0,6380871597921953520 +0x17aa0157235528bfb9d270e78377d7f9d98e303b,0,0 +0x8ada03dc8185ca17f2cb77c15a5a228c245641dd,0,0 +0x2aa5089e84fef227ce4b373a64900ab256ff8c4b,0,0 +0x30751c9862dcce8029d9704e828e982e7b1119a0,0,0 +0xe2021c5cd208c28c80342f504d9ce3db91cc0d9e,0,0 +0xa7ef7a4e4fbe6864d1c038ceb7c3a50e55be918c,0,7596000000000000000 +0x9132617d7e804459b7c232e03e9e2a8ee0270093,0,0 +0xa9ba157770045cffe977601fd46b9cc3c4429604,0,0 +0xf3ba5b880f3c4bc5c55cf069cc2ecd7c81e94a05,0,162809201541799727 +0x9a4f1cce9b6d353f77de35298527f7551260a526,0,0 +0xe85ef47ff9d5bf9c36ee0bf71c5607cb67a92b03,0,0 +0xad2dd699e25b2f8d0f09af228034f360d94196ab,0,272270058931429984 +0x2387e29e76b0c713aeef4c4927fbae271e14a6b7,0,190038461538461538461 +0x3ce3c7061cfcdeb4003d7c47358e8aa8ab1ea6f1,0,0 +0x3844e4d1beb0dece98a0c6d97599a86c6c3cc143,0,5248384615384615384 +0x333efcc3fa92eac8810da06c3543c093e00803a5,0,0 +0x59c80150824cda6adff654f04b725ce253445378,0,5952880342298509 +0xb713814c5643fd8e76dc2ff2eb7504bf12d47406,0,162825259695582683 +0x150438a0e37ce7963942b744ebad1ab057225115,0,220984615384615384 +0xb4847c2997777ce3b7ea9fff2b8af452a4aeb83e,0,0 +0xff9d9dd9371f6407233adc69d205c16581903ed2,0,4820848936380751201560 +0x6e08df1885f4aa156d0d03b498e421df0821c491,0,6576927420519307249 +0x0000005d3584925bfe774d112b623469533d1655,0,0 +0x859bae12fa963ea121da5a3da50d8991139c171a,0,0 +0xa02b6e47052132ec568cf5183c5afbf7f1ad8660,0,123550175473048758519 +0xfa8eb5e34c4e1e5cf0e55e806c0801b81d68be1f,0,3027061242230496716 +0x48b41e8b5914e5d56654c816585270c95b6456f1,0,428365384615384615384 +0xec61467ec20ef38957ecdada669c5af084f6d7b2,0,27649560899234434541 +0xad7c503d51fd217eba25cbd15c64a03573859424,0,0 +0x9aa206d1394a072ae1fbdbc62c64e7c55ca3ace4,0,0 +0x196cce9fc5e7ff557ce98d87ed0571ef2bce3f28,0,3176141850000000000 +0x5efc363626e8b1aa07e82a91300e480385f47dfc,0,0 +0x3fe49621a5c27eb3817489e64811b54b401cd4d7,0,6161322578317427339 +0x2669ce86cb94e4a2c31b690102c7be6a3ddac820,0,102638535426074174566 +0xbd221a2d0ecf973c59abb33e058d13b5c6a49808,0,0 +0x3a54e0c7ef8444115197d3b6e21315b6f608ceec,0,145303390938208446 +0x19685581afda56c1b0a47bc3e7eac7ec976e0806,0,0 +0xb3a6ca1c3783e06a8c5f987954bf650ea368cb1c,0,0 +0x6474183ade6709a76c3c411157f501d78b4c5482,0,303401564593989886 +0x1a95fc83a6237276b462b18f1cd99c5ce668e77d,0,195615652457505912996 +0x330a0bbddd2837008329b308d6bda3a8a4e3c9dc,0,22019284412456543905 +0x0cf5254bf39e4d096b1972b0a5b1cb2d4890bfc0,0,0 +0x2052319165fb2b632b3fa1d6e242cda42eebdd31,0,1944832050441704361 +0x82a380de97be9b507433d37e0bd9c8b8b2f10401,0,172801250568564103 +0xa2aead4397f72fb460939fd5a7df9de9f1e737c3,0,128942307692307692 +0x2a20f002b40f91ff46568029674fc5a5ac3393b9,0,0 +0xbed7482409659eab8b9b6efd746f8a53699bdda6,0,93460938148688639 +0x9b06ce7455d3350d00994a886f77cad77b5724b6,0,0 +0x380321d5ef1596a15b78ff63a7b268399968769c,0,20250000000000000000 +0x93624c41a99e17089d0856a974e6c018cbbee93d,0,0 +0xdfcad7b53504ada98d7a93f02ff049b18ff2b18c,0,0 +0x7214e37ef397dd58b95888c6b7ebca5629bd83a5,0,124615384615384 +0x285695009860f910f78401345ff353ba6d0cfe58,0,18000000000000000 +0x954095d2801cc6c0526ed8816ca4d99fbb8a0330,0,0 +0x342a085e69ac726b9965ae6ca0e6f23a23256e03,0,0 +0xf50c7b18c127b43cf0de88ed753f3f8d0235ef8a,0,0 +0x442269e9e7cb11aefd08eb6981ee7ddea1fc938e,0,1294877245062017910 +0x396df64508673753bd43fe1465d745cb2cabc079,0,129807692307692307 +0x42ca6b4266179c47cd1e19a054214965df28da78,0,0 +0xb3fbda6d402a4874db14fff4495e6dfbd34b6ff4,0,239553172993761505 +0x73d9ac8cdb2e0c7ae1e743ce7078ab2ea4b08481,0,0 +0xf33350b3778985a606468906908eb002644c2d59,0,195834774333385020 +0xe93709a5d4afa46ed6a2d1b4d93dd13137babcb9,0,0 +0xcbfeaa6d42d5d5a15cb5d499dd5905e1231af74a,0,2149756247671106840 +0xb9be759044e13f545225173b286c70410a5aca31,0,0 +0x79432cc61878bc3ed352ea311761359a2625af8f,0,0 +0x538ab12cda2a972c9d37828a7a9239fb97b863b6,0,327110363325067339 +0x2d3117e30d36d561f878640b82be8209fc69edc0,0,0 +0xbef54c3b0898d005fb500c6931ded87579d7a3a8,0,1360887529765827647025 +0x907f6ba8cbbc4528d262c69633062b5f8fa95136,0,0 +0xaf6da5c20cd40f43ed023ee1ea9f9fcbff724743,0,29402100000000000000 +0x709371ebe78323999dd3e1d2d6de46b1d57b082c,0,0 +0x9a32d0389d3910683f5a1851cf3d60564acb26e2,0,309085504041778035 +0xf4a50ca186dabe0c3a17de7f88a415488aaf011e,0,232096153846153846153 +0xd805aa04c701049b282a94ecbf6dd6481bfec162,0,0 +0x20ad091f64eb31267c248f6200775561bca17168,0,0 +0x9ccb7ecf70d0481538ad6632bb5d8dd0e909fcf8,0,0 +0x1d1c383d839f4f7426ccdadc7307a2344e66e252,0,6808680000000000 +0x52882ec01feafbf9de48115d10df6bb75ca3912e,0,1062562020939700111 +0x49eb2a1ef5bbfd234e4f50c78bcf78177c0f50e7,0,2548609327532716213 +0xd3362e86aabcaf3f3508a6b878ab41fcb82f2bd5,0,0 +0xc8d69403c231a31a77fd5e6e87367fc8f12b0c5b,0,0 +0x0244f3ba246aee6f6214ea1439bf64084a323fd2,0,253641573715981180 +0x08893092e474f58adab42edd09c37a31a13aa8e4,0,0 +0x2150e80dae8359592d2f7a3f83d9dfa4cd343c71,0,9210302329223794 +0x4ba38d76d13fd9cb2691da53490085708d1e5053,0,0 +0xe091a69ff4d7db773bc0adedfbf69e7a14f4457d,0,166961633899995049 +0x3407427e3efaf4fd67e150c4b30a3f7eb725f133,0,388164981867996074 +0xf95f66436006d32b8b6a0d0a6fd2736a7fbb37c1,0,0 +0xfa4cd34a21b4170249f0ce2257bb0d649fb18005,0,260469738119766416170 +0xfbfb866279306e570e7ab8508d1512e2fb3180a2,0,188649432146234226 +0xd51029410eef4fb303fc0b327b6cbe9b209706c5,0,13055530632073650 +0xcad4f4417ed241bfb0061c6e9d572a3e12159549,0,2403858892973977 +0x0f76c39f10d6e04bd0ba9ed171c7343ebf9748bd,0,60684604089049382 +0x83e070cee02275b5657774c3ad6019eefc38ad62,0,0 +0x545f3c090ad35b17603b72c9fe054e197b503e26,0,11682692307692307 +0x8755491263b0f40318905cbe3594ba8cd3f95189,0,0 +0xa5a9cf3b8826169fd195b15a34a5f3d6e91d7898,0,6230769230769230 +0x73ff448cf98a97c1ee1f2263f0988988103d90f2,0,0 +0xd1ccc44f7386c1bc7b5b5d9a12ee93246fa4fc9d,0,124615384615384615 +0x1a53a2c61c9d4aed9fd7ff1539b50a66f7d78bf7,0,3320625045861897 +0xd47835d494ac1bf8c140b6a04e69b67e75928022,0,508481749030507990 +0x7a40002f9a331e2a136c1995b630009e9753e486,0,0 +0x797351cf2d2e3d6e253070d2ccd7dd825861d493,0,0 +0x03ff99a1eca3eb566030d6439dcb75c47e389592,0,438739629289259039993 +0xafe41874e60e1a2e677725a4a278d6b81485c42a,0,8185057785784819 +0x9cfd1d28bbf173b23344bdd66f5ba25bdcbc4045,0,0 +0x2f1264dca7397b768ff567db2d4bf6f409594286,0,850500000000000000 +0xe91a0cc3bc2c0664b1e0f53b3e852b8d980788ea,0,2070000000000000 +0x3fa8d30e3963042c0bc05853bfeb3f524a6cbb4a,0,77372120664608930438 +0x158632dfcceae59262e8a7b11b8250e9ccaa92d0,0,127571398881690231 +0x1501e01a8636e8d6c3ccd2eba465942bee958a5b,0,0 +0x6ed8ac491b284c73dbe6a742588639a5992ccf65,0,0 +0x20190624a599f91009afd91d6ced6a26951e2b90,0,0 +0xd04443a8310153743560e8af6fd48fe7dc1119c0,0,79196905357891009 +0x0138c0a6c4930a69487e796d03030e269c24d5f1,0,73976736173851183 +0x7b2a5b508dd1dbd647f8dd5954af0132da614cb2,0,385222979248512573 +0x39221e5cbee674cfa531ac922c8e73e8781ef216,0,5129015478948990 +0xef0ddad99e75a3f55401e54889c73134094bd208,0,3275840581206 +0xdcec3e617bdb5160ed3743a5735c8a47f82d038f,0,73512191761293931 +0x9b4101801113e210cb2b46608ce1ea9c95903e2c,0,0 +0xb49f4a3edc04ee7052ec3b97c5895624b0087d39,0,0 +0x609c0851b8aeefb1e2be596316356156b282fec6,0,85004784407653216 +0x5b012d6620867979bf0a8729207ca0dcb0a9284f,0,246218020972423111 +0xffffd230115df924d3b805624437f4e47281c3f8,0,10176616340616779 +0x66c6553823c724bb25f775a04b4d67a827d1fc43,0,1370769230769230 +0x7ab33ad5f25db07d1da7a8df55a71036f07da22e,0,0 +0x984212c576730bf384c935572bab5dfdc4b4641e,0,1280769230769 +0x9e7581604b5ebfcc4edddaaaf3fd64626d037772,0,344346099529811 +0x35d70668a7bbb9f7dd28635f0452f848530b58d9,0,47468038894844825 +0x7d178d5b060de15fd8a92ad63d36b7b5e1ae5966,0,0 +0x9fee9d03865568a3f3df36eb8e792af79ba41183,0,60703293708231 +0xe9490f7408bba5e401dc1b15c0cf076fbf237899,0,941538461538461538 +0xfad17417cff098b1004b8439d5e0dfa9aab96f2d,0,0 +0x4c3a603f3c19f34aeeb1b14814790e9a34b49930,0,0 +0xd8a3b1c3e87bc223fc0a03ae44318aabe1eb9c88,0,0 +0xcf53cab789e7971f331b8ee1a045ac920109ba78,0,0 +0x19aab34b479e28c9dfa55f6e8c6f29fa8dd5bb1c,0,38642038787248164 +0x85a78745098bb46e3e504cc6d1e96ba8af6f7446,0,42440831779372107 +0xff40713eaf9b0842dc10e24773b361a6a79f53d4,0,41895330439194405 +0xae88dfe528f0514a2abe756ae73bce6e41a5659e,0,0 +0xb7dcc1e16e36e07c67cf25ff3ac623f9d3208e55,0,62708081268513947 +0x4fb4ae5c3340bfe00b064bb0332ed932626c0d51,0,35014835029206230 +0x6e503d00477f257885f24b58203301f1007ffbe6,0,45535286464976558 +0xfacd51712f5d643beba1b3f86602b4ea2f1fd682,0,0 +0x3bc0ab9c16bb49b0b2f5dbdda1a99ecb63acc08f,0,86192307692307692 +0x27ae4f09f0abf1d07657be262b22fcba3b57f0de,0,1133965384615384 +0x9a6769d56ec5ac109684d4bcd3d341b53cc5694a,0,1847802044070421 +0xe841ad481449b26f559337ced5fcd4c968847e85,0,2846964174808590 +0x45d96136013438a6a66b456ac2f3df76068a534e,0,487704437166832531 +0xc1cd51787057529d6ae260c99e22758ee45c3975,0,4794542443832200 +0x7f4697b5e014df7647963f368dc37f13baf3381c,0,1972605193112995 +0xc221f1b9309724b7855e13c1a3cacdaa6cc5e9bf,0,3213759585334270 +0x107626c589ec9603b016595ead04af41a6a0c5f4,0,54000116561839846 +0x9324e778083e22afadcd536a8b2b801a87ceb771,0,0 +0x3cbcb64343ad71fb364be739f0b2475390b53402,0,10972741949347327 +0x1cc660c45bf703fc2a4d2d12b2b296e2127997f2,0,0 +0xb689dc0f0016d3798b2a7e58c6da8e4de3b723e2,0,684349255136909659 +0x428158e81e1b9571b97382523f4a8f85483d54cb,0,0 +0x85fb7a773ae571c907283fa68277a86a8c53187b,0,12336923076923076 +0xcb2e511709c64c8057e376433e213467629526b4,0,660151430639273146 +0xc460a404ee689d6f84db589f26dbf606b974e38d,0,1246153846153846 +0x9fffe74cc5886c2b87cf7628bbbf2b051656e337,0,37826025606925511 +0xe6a10e25852881ca0c8093dfc4a3107b6e90a711,0,578864012945323171 +0x924f917db69cf1bc0a6420928c04f2877c64d6fd,0,12980769230769230 +0x39f8936f12b7645f08f611ba75f0d6216090c99b,0,16892303097729466 +0x63b822836cc79399b19b4a5b55fb19181e61af9d,0,16345141147438416 +0xffaba83782c4a7ad9259efb204b57230c432cc5d,0,27155963165417542 +0x85a0fc9fb31f6027843d29684b375df8cd3ec4e8,0,2597510111523682 +0x46578bbf31552737bb8180a99537a3bae2320a03,0,2857723714673874 +0xe38dd570aa7c0de83d3e7faa4c1524b8e398030e,0,5168710910947152 +0x5fae784e7e53d5e03576007c781b31c4c43aa73f,0,0 +0x93433c44eae07730d2c2468d277a479825c33737,0,81796153846153846 +0xdc372cc7c3ba586805fd2229fb75f03e9276e384,0,41058830393692994 +0x78c034a21f9ccf28c11118a5987127e90bb0a40c,0,41993301463703039 +0x27796303c9a13ad82f9608de6d038bbeed23a3c5,0,148051749102132859 +0xd1d23a2fcb3d5c20fb90b0a5b5b481aed0333e89,0,5573076923076 +0x2ed030df041920ae64110494c1fce662ed8991e5,0,23216115821766656 +0x5a008e1944df5cf9b712170b93bb0cc6c700a2b4,0,36571869588701406795 +0xdcc17487175ff15ec18cdf7009b0a301aa57e4c7,0,2425421675289948 +0x4ff409391681e5129ab13aab94a59bf3a178af94,0,27341613227850589 +0x1c51a009806d2e4b02960b394ff6d95767fc5930,0,610761782003553 +0xa36010f45e09e12c4ba756bfa5c0b46fbb35737a,0,3816945585969230769 +0xa42ecd2a1454b0f55b42db042cec0207d0c18a93,0,17708194835140013 +0xdd6fa21105fe98dff55577620712d27bfc6b2d0c,0,20461798158324967 +0x7c287698eb3f91d588aee5db3b3ea3fb6581418c,0,236835007660315432 +0x2ede7660f310c62b318546a479edf496df2e5d19,0,12969188690872362 +0x310e989c73b58591bb61596972b5019354f8b668,0,259615384615384615 +0x52b9dbc4257cecc278a348c6670f7eed8b10bb03,0,29234033058397563 +0xa61a64458d74cda95e90fd18a100f0e4de4ab65a,0,19093519434700097 +0xcf00164bc79ba5ab64f97b5ecf9028166b7a5c6a,0,16326680219680947 +0xb8e551536afeead0e108a0b464180ad5236d28b6,0,16005614436986417 +0x91b55eeb67207ed88743e8d7cd14e7c59af05545,0,2818120432367717258 +0xd45e6cd13ede5e37d96854e587c9e01a39ab66fa,0,16149831446776467 +0x322b0bb9967aa5083774dd06c7c37e35fc9a8572,0,17496973880463891 +0xc12e4e095d927378911d254fa6f1ebdf36cf80c8,0,0 +0xa6cf201c2bf7d0dec646358b0e559ff47aab79bb,0,0 +0xbc66cae009e8846bc957c74786dc76e51b27c442,0,16382941698352643 +0x7cf666a3c3d7aec6e18de6b4ef0119808a7e8d5d,0,5572384615384615 +0x2463d5d9dc384ccc5e17c5b7e71d2330e0d71d95,0,186935538461 +0xae543109b66df80e334e8839c6cca79d3e3df1ca,0,0 +0xd54788f645fa63317a630e12b5542a1935076271,0,0 +0x8fe7cbef7f36816c260ee69d34fe5846d86c1934,0,229698485472696 +0x95cbc6598be3c7b73d5f2dc87472367912039328,0,0 +0x41b88386c547a07ebed3e8565cb071f2e84c7513,0,1795424870691424211 +0x97c8925ba3c1ee3c4378e04e900abe1f6dfa9b66,0,0 +0x59177919686fdd58ac20192a35cfd8e3167bf44a,0,62307692307 +0x8762b567342b2cbf87ac6517bc75aaa84c54af26,0,14160511850868035 +0xdc5629eb3e2c57c185d9017c52500c18e6413909,0,2781024348623218 +0x13a7a1c39ab139d985cbce2c193eab774e29e961,0,0 +0x8dc44ad53b5e45281700ff67e14f3bfc9c929d2c,0,580631043718944904 +0x72abc62e83d88a9b3b3bbad1e3ea4c0967b43040,0,0 +0x6858a4d8d7d0297c138b403b6a34cb3b424b7f4a,0,0 +0x4ef1ec513005a62040fa2a9a5f533522326933b0,0,0 +0x4ff3d7a244fe5094b38bafa49290e0cc5fcbc172,0,0 +0x8160bddd9421cec8037bb7b216724f12fb57052d,0,25252335193698338 +0xbe5db17252907470e9e8f927c15a68f482c61da5,0,1026423729390130173 +0x5ddce00caad6757b42d04a67b107dc78feca8d78,0,404490859335869 +0x83bad39f067ef72e354f2ea9d318eaad381a7f15,0,812620919190941274 +0xd6ddcca9d6928bd07ab564beaf8d8ad92f0fb401,0,55248369275469755 +0xc695a251bc2e6f5b78ad2edcb9818e3630488dd2,0,5159923440759665781218 +0x1dcc3403d39485720139af6a1242552d5c585c43,0,19766361163343821 +0x7538816e92fd160fbbc96e3a3d1566aa49b5a603,0,0 +0x25528514fc655052da22a3db80b9beb5bb0af0e6,0,908380051571522 +0xa76fa1b82a9e98cef82e354b505614f23f5f5187,0,21038088984115926 +0xa718876f8551306146028ea6e295f24bea02cbb5,0,0 +0x5ef565121ad175b62da0514169431c8441512148,0,16711915095506340 +0xfefedf38c9526443be27144f3896995965d8b075,0,60399462306815136 +0xd17bc3661f04896308a7e948b34598f22996fa64,0,146690452095924 +0x91d1edc06ed1661f3b491613c866e163021f5f00,0,186125206612791053 +0x9c44d61d0eb36d734290ae21aa2ba71551d5906d,0,231300000000000000 +0xffa87c15752d477e45764279ea70cf624b049abd,0,1704252971381078 +0x08ebb5802646849f5f34b64a700ef19538b29222,0,2056843632614689 +0xe779090f04f4aaea99e503dc5f0a63623a603a96,0,1774611023142256 +0x78eeaff0e960649ff2e727d10131157d142c04ad,0,42001601255232499 +0x4f63fd753716c5c95a14ac49300d0b361572535e,0,21639959789282539 +0x0919a32fbafab4ad42158f323468b6e6f292db40,0,18965062121307347 +0x96f3c38bec52a1b38bf2e89dd4ae7801999c4670,0,14764956938829560 +0x518f047ea1078231d74bd7225fced1fec5058437,0,22008748960355959 +0xb2f7a93ac8f7e72d1afb66bac8feebc53ca4bccb,0,37529393419953 +0xf20f32a7d883d7a752bc9c040edc23fbd33823bb,0,284373459955404 +0x0376e70999c1a9bb786b3cf6d3ac4874b2b87a51,0,0 +0x84423ff43abb7483814db4da7be6a03f819317a0,0,20834041338821892 +0x6fe378ed2912b8ab62d31c5ec934cadc443f2fa8,0,0 +0xd3cf84edf9bed670cf9e9983b252b5d9c4818afa,0,749061381544544411 +0x7f97f1e1173741f971565779cbdeeda97d60d164,0,5695149491945061484 +0x8a1a3b377983a59ad4961311928cf86e9fa3a5da,0,0 +0x3c0b8c0715e60384f9dc4124838ff16b7a1aee0d,0,0 +0xde3fa4bfba6aeace7c4179fd2e88c0d8f2dc1169,0,33657749640233843 +0x5c4eedb85defc14641e5d18e1c781390eb2776fe,0,160185530278717 +0xa55acfe18b8e931eff95f981375ffd3a2db48dd3,0,62307692307692 +0x32e5163f2dc2378f7617f0f4905e6a892bc59068,0,44431577151611 +0x7a25c7b819cc7623867ae20ac6edb85223f3ad6e,0,0 +0x457e8e5f51c374633a0db049945d39c61da4321a,0,354632111843977877 +0x562ea28e6233eff6bc7d021bc3c60d88c6910a5e,0,23486317079026285 +0x9f5b83f1c65bfabcc405e8d044788ad171c79094,0,23591317912314839 +0x29d62e8c72885486b27b93f171ccd46683af179d,0,1156153846153846153 +0x234a6ebf4cea3230bc46ab4c145018cb1f24d21a,0,21319506622989955 +0x7040ab396d75b9bac78fd85cecc2c2556b514144,0,23684317034570123 +0xad88b04c8316ba080bdb148457cd1b5b03f3c82c,0,16876305277545517875 +0x4bffc55bff5df4be74e3b6cbf61280f7fbea7093,0,22129225839338756 +0xaf9d2abf6b340991016c4e2ab2a88e7398116ad9,0,144658298833013 +0x727e869a9b139249eb2ce14700e7ca3fe766f9ca,0,19502923714742273 +0xd6a34c6af98d5df7be3d6b657eaacf49b38046fe,0,22566469673264918 +0x1dd504f31601d7d9ae2b9248219f2a540ed93507,0,21231775707081798 +0x476863fc6046371b976b9106359e2a2efa70a899,0,0 +0x912077a903c90fef0e95e9d4fc85becedaa7b2e7,0,226874473586109 +0xb13b1c464c66a5b814d74fa0f439b8f2d9c69dbd,0,429583618176624 +0x4d25df0c7d724f55aa57899e07cff9c922509585,0,18555538653733057 +0x1a0ea57a9b53281a3fdbe68251296c0c0de6f530,0,67508344197492467 +0x2de3c415edfb4e28ba82bbc03de7672f0ac8d282,0,1078923569311419790 +0xaeddc5c90df91d8a9f1e9ec96aee93e64c8f045a,0,41280111783342504 +0xb1c5a8ff5d68b34864b5483cb1d6276590c67f28,0,20262375631763362 +0xe5ef8803f1bf5e8c1d984055c6a09f369afe1732,0,0 +0x27c9ab85106271d2168f914e573479fcb6df0982,0,21979589275199368 +0x6803db429e0d20ef8635779f6475121a1f6fe197,0,503757692307692307 +0x19312918aaf9b94b36badb1af1b479f7aaf7fb5b,0,483092307692307692 +0xc04726cb7f97a08f0156ae934d09f847a975d4b6,0,33278426631055530 +0x17f8854df119e3c20ac0b9a78b6b121a3a5b7f8c,0,60576923076923 +0x50516046078f8add248d34e8c91e827c19efc7d6,0,32801163669154782 +0xe166682e0c02fc795662e3fc675927643eaf69b3,0,96909292053685948 +0xc2aedb7d84b168683185cc401dd2d0d9b14d1aae,0,12565687146919473 +0x1f93d3c7d61895fa4dd89e16c66f087f6ec47179,0,22084078783846153846 +0x8dded6cd3f65337356f06eff3fbe1ac95145b11d,0,0 +0x856565db827588a88780454863f98a4a323e13aa,0,0 +0x3b471ed3704c2b7ffe43d29b147448a88e5f1372,0,19374583249548703 +0xcbfa6a77c83db4682653d5fb970db8f93b3a0e37,0,20145930589845770 +0xd4efd8b84e39efef6f18cdf808c9d311b6408f2f,0,0 +0x4e584d24f84a302929519167bb9345144db3d9d2,0,21285640323404292 +0x08199dbd981bcd819a58776131a7fd6e567e6046,0,155179699414412309 +0xb00f24baf8debb8eba33c78e5f00c5dd63fa217b,0,257994168968424 +0x53079ca29e016c248a03f138e41777c7b3ecd4a4,0,30802563659443359 +0xb10812f4cd2723ee31ca5eb12798134b31be2129,0,0 +0x1a49ab85d7a245aca1126f7cfdad8720994b9a29,0,0 +0x402b58544c5c4a39995a4a7d0b3c9e84ce73c2ae,0,0 +0x3639be6daeb173436b4892d561a916b4cdd72a4b,0,22869025683915494 +0x4b7644290e00b234920e0cef2281c1f5e07363c7,0,0 +0xaefdf9b8ca28da1d2fef58a9a9698f48fd00ead5,0,23086694966151321 +0x73c548a41c54d32fdd3817015abb2a2578431f29,0,21954088207920461 +0x58d7a173ea50a750bee9bb5dfefd6829b2145dfe,0,22134103319762847 +0x2e83d0c131d7b4a1fd86e788539af4e57639b977,0,15261230769230769 +0xb3c827be673400aeedb084574914ee8869553b2f,0,20089902494585444 +0xe2725c7a4f336be5d7c95cbd7f6006be7ebeb9a2,0,7120769836211481 +0xb489fbb8cd821552c8b2d26a4b77d8751056649c,0,220880689662511055 +0x3c1195a1c3b48ccbb289e4021b3fbe6ce2804f2c,0,770053846153846153 +0x1ee0c544e04b6e0a3a28f5cf9fbc664c61a4c38b,0,0 +0x7020b9e0a662a9fca2213938fd5c0feac356cfee,0,0 +0x39fde624e251b42a43e2564ad9fd07160cb2abb2,0,0 +0x5dad5b8c4b640305585bf4586713bad0fe992dd6,0,1271769230769230 +0x7b4857c87f900006d840a84edf967c23d00e54b5,0,26542300804599803 +0xd4f80e6f656c52fc7705ab293a8b2b88c849520d,0,26150600027993590 +0x544b5d6566969b5d6f5c823d6522bc7dafe6c3fd,0,27738286199680297 +0x637e4ff673d5eb7c870c285ec2e72c9f9cfcf272,0,25607462760667121 +0x230dec681d6ad64b5c6b916e7a83de0da3597634,0,557510493291560617 +0x65b2689f54618359ecf7455d14fafbfcc180a47a,0,31353287793976382248 +0x4c931f43429b3be27606a7c8820c80d2cf4e6359,0,18086298728288118 +0xb06e5a34a47c547dff8bd9f994ee2aa9c0602c66,0,0 +0x5cfee9ad75f227da9c955d8d556e0a0ef2469665,0,0 +0x1be36b292a1af0b38b6cefa63f6b94bf01a391db,0,3153846665776400 +0x3e317c33e8f9865d5a8f085f8edd45bd1cb8ef08,0,25972367855877657 +0x063de94964053d9eac42aeb36eecae3e26a5b89a,0,25493881062475492 +0x9717b0191798e7d1d07aea238dabafe21f7502cc,0,0 +0xf2912b3bb482f8f18c8859acdc188bb9e9c6491e,0,25520281463476637 +0x8ab98f169985c22f5549d80538dfa8f32f4427eb,0,18000000000000000 +0xde6896d44762a8230050a9c071362777e7afa423,0,0 +0x8ef28bec95538d329f9133b32f15063392ca7f7a,0,564923076923076923 +0xdae7ecb35a668ade4958b2f67a6c398f28e30cdc,0,0 +0x0ab818fe4064979cd4d4bdeeedb2e6104fffaa30,0,29645967561921826 +0x6a79f52204981e46cd40b63c4aef5b93b6971394,0,25947329545075195 +0x45d2f730c3c1bf987542e61aba438453ba6e54d6,0,5091461023035228 +0x9039e38cd65d26079f95a23c5744c9b418d54cfc,0,0 +0x20897a7d7e7bdc6fd1245561ee2214d47edbeff2,0,0 +0x91294e33c48160f931aebb380f2a026fc0eb11ba,0,145988032779506033 +0x98d11b91fcfc9891a86f9af4f02c4a317bfdb473,0,18000000000000 +0x4b55b2ea25f4194c804351c9761445d7bfa4e249,0,30518223858851725 +0x9c4d592042f959254485d443bbc337d29572264f,0,31794230769230769230 +0x4eb4d210be79a69bb2375241d8a60150c8412b81,0,0 +0x929c3f573f008766714a9f65e7b514881628116c,0,127176923076923 +0x7d82063102866508fce403ac4682382d24d278d3,0,30510123444493928 +0x8eb36edd4425c519f580e6e7b02f4e7896efb0ce,0,29779953370983684 +0x558c35df8b42515cebd7ea2f3487cc6425c07833,0,0 +0x18a893eb55f022ec207f7271c15ec073881fb1ab,0,24300954235656908 +0x7a41c3ba635b549e7f902563a5e1dc86641fbbd5,0,25162470327298623 +0xf0bdf46909b52386890ed55961f6c1e0f675f123,0,29719076965526141 +0x660499d41756d79a9bfec122482fe347a712b22a,0,28490396533692483 +0x46edd3a38b705d9f08ae2ff3cc484b972fb40eb7,0,26070645679237435 +0xd7768312a9d23b7ebe7c2f6bb52904f3d7b5a861,0,157379174556256579 +0xc72f710fd81a7d84212c1c21429aff0ea1394ee5,0,36872488826225602 +0xfe372175689a0edaa1625352e15f730325320c65,0,0 +0x9aa07339cc531dac4180d6d4470cae00a9ed8def,0,21044421059684843 +0xa7069a982514affbb636022236dede5b58592d56,0,2063316985656406421 +0x79f07f8b7beaa11ff3985417a56a2667d619cae9,0,42843379824133552 +0x2454c082c6944e9ee3fea8a677d7190c44eb4310,0,4415566290716776 +0x7fc40fede7fbdf11bf7a40f58a924909fb39659a,0,441577294501325 +0x515805924ecf181133475513c347a7b90f47b7b8,0,3014056311015444972 +0x7001d8a32ecbb18e0598607f5d12b807833e7b41,0,4428432632682274 +0xfde8bf6808009a9d2d7bf6fb9a253242ba0af9ea,0,4426748664504554 +0x780efa10afe08c84b1134599f11813b9d5e739a2,0,4426748107847685 +0x8e38e24a838f595ddc0444dc1caaecb5a91feeb1,0,4425562840555638 +0x2c70a8a1338f07125e030053f2200e20ef46e370,0,28004317752932011 +0x08d51ef4e89233b1ccafdfac0f15dd235c5f8e51,0,19608132695232338 +0xe0247bfca9fb2e99b7d42ef8d77ca18e3133aae9,0,3033464538461538461 +0x8faa2def5d6386a342a953433ea4236489f55b49,0,204750000000000000 +0x4f84369d98d5717a32e54929dc323a2eaa935b36,0,27271964563962447 +0xc0372f727345e6ddbd19ee14e8b30692e039df86,0,28895460010975881 +0x1d8f8ae7328232043b1623b7641c39ba6a71006f,0,24168315545811986 +0x4d023f0044a8f4daa3ef94aaac4bf4ee85c933b6,0,0 +0x9f43e799f593f1782dd983c2b886190ab341596b,0,26908943520219541 +0x791b79db3844062c1a3bd3245173b90165da3462,0,0 +0xaa87f291082c3f9e707719edbc5286f3db813483,0,27627290787380412 +0x56b8ceade0d52f42e8c1a82bda68557ab74e3d3c,0,659076923076923076 +0xe0d7ca2fada9d1b526e61be2d33dd7840a5ed494,0,129073780115352295 +0x654d55d89738ae3bf8cd24e7608a514234aef26c,0,18900000000000000 +0x110fca0a281bce707de66c4c154c79e5959c3fc8,0,24853221297849234 +0x2915fd43f6c7a77974ef34dd1feedd177c1aaebc,0,24906764681761480 +0x54f4ceda74fd1914363d31c427a651b691170a0b,0,29027592716518260 +0xeff9736086d11653dbdfb34b6f54c7afdf64a51f,0,0 +0x9a7a03cf3bc98eb0f2da1318b451e4f2604a65db,0,0 +0x67b16a32bf2bd2930c10913539f14371a1687dee,0,24826185890517320 +0x48cbda5274cc6e847ff9470a54864b5efff8f33a,0,21129901383759189 +0x2c12708ef3e449068e9b3fdb2016122181c84aea,0,4033610265699647283 +0x0877365a0d63eab900f3aea50d880a694f149d6c,0,861628416752263 +0x59d29a2433ef5967ade3e1b291a83516aa21ebea,0,4488917426369738 +0xe046ee0f7e12afc56cb0ae01c99df5919da9b2a4,0,1258163317124869 +0x7fe0b85787d53986f19c711ed0bfe15127769b7f,0,507920275012127 +0x7eeda752afdc307734ce32c3fe6c90843fc026d2,0,7470692307692307 +0xfe9435c29920850f74a156125694641734444dbd,0,27265320474915666 +0xa2274609091cd51f443a09855884a4df5039ebb3,0,0 +0x8db273bd6b00cb41760ffa571fb52624c0bd1aec,0,26404277484646492 +0xe4c75db5f9c367e3cd909a82a093a66be6943b56,0,28393007070485321 +0xbdbebff9e92dc8bf81843e5235ac59a16355852e,0,7373023637495490477 +0x6f5b35781bd45d15f4153c8a96a2ca5172c0d2b4,0,476350870789834172 +0xce483bdae0d0a577834bc0b12ee05876a3ac954c,0,0 +0x442fe8edd0c6ff4dfaef454c660bd23d0403e1c1,0,202500000000000000 +0x2a698e23bffffd4d6b22e8ccd1d59e7469f01830,0,40257692307692307 +0x55b64054896349e81de075b99bc315a29f395de9,0,3437707987722577 +0x3cd017711a9b4a42cd1e83d27b49896442016146,0,17680649948352805 +0x2cbba6ec6995accd8608684a59957ab9b8ade5db,0,22890814907460836 +0xdfd3cd70bfb0cc76d17e83fdf0523c64acf0280e,0,0 +0x75579d98205a4fc67c84336725816a551b6247df,0,0 +0xaebd04cc5993402133ea28a906df2a2878614c91,0,0 +0x01217f85d1490d476e0ddc9bfa2929790d873915,0,25221582268070065 +0x06416381233dc1c08cdac8494059e82f4d0acc29,0,29144552662676881 +0x36d92ec35b00d2dbfb2cea2e3d62cf0b5a6f9f83,0,49804615384615384 +0x884f27340847963c756d3253b9c75fd26e742793,0,0 +0xa3d21b8ba3c4d97d48084d0e1aaaf7456939ac56,0,32476141895434747 +0xe0c93041b2a45d256c327c4cf649da242fde5b46,0,31335375354603299 +0xca68c24207b5b66cc28e331c5ddb53f67fa36b24,0,38206699057759216 +0x7a6a59588b8106045303e1923227a2cefbec2b66,0,18676730769230769230 +0x42814251be1581e64d519b1fe3ab01d92d4bb0e7,0,94500000000000 +0xd3ccf911e8699dcc64123225e69e0fd99b706ac7,0,0 +0xf1d33dee2af10937c18ddd4b8a8cc69bcd3b24a8,0,1188776631432226280 +0x6f27330279c174122b09f5848b9ffe6246b7b8df,0,36374899654443813 +0x7f511115538100f8abeaa563fc1c3e2b8718f7fa,0,31842324996417143 +0xa939eeef91b7402ce705a707eaafe2d797f428a0,0,31824593227528193 +0xa5a1f7cbfea441603f374513a76c59d8b8110b24,0,32277166546803405 +0x7cca805b0fbc8c4cf7b907808f85380af6f56851,0,36238093975510658 +0x290f00b428fcf8da24e74fed5b5ff9e1ff341bac,0,32207157558479585 +0x9978d43ea666d5da2bc8b17d5f2cc042db5564a6,0,0 +0x981bdd21452ef5c3210b8a01bdd55cbec96faef8,0,0 +0x7034d9816f04f989cbdc453ae8543c68f6af3ec5,0,0 +0x38fbab971861141de69e6e5bed297943fbabbf28,0,0 +0x3eb49c4a1e353595791cc71e0dc1e7190ef4250f,0,0 +0xb2e079559b2e2ab36dab20d04a41a7924f3b9162,0,0 +0xcd217d15eea6e99569ee8acda9a2fa3080678599,0,0 +0xe269d042f48d73e5530635dff745f60ff094c9ee,0,38022183834496254 +0xc1813fa44f94531c20180962d972bb6f79082334,0,33100600314540681 +0x5b3e8059d2a09a8429d699dacc396e5deb5ed571,0,0 +0x1ce60622cdf37358d0bf1b12018d5afc6e8dcc9d,0,0 +0xdace92392b99b18ca16e8f6015cd82d82f1e28c0,0,37263347138653398 +0xe44808979dff28582cd51d82f5435f8f830b573f,0,0 +0xaec1f5ee4bab89cb0309f987972de0a6909a613c,0,37845059189648504 +0x9f7702112486b84bc3283cbeb38fd4cf4498b2a8,0,0 +0x3b440eaaf2f43451c48241ada5b8a98e06e5922d,0,30809000843420758 +0x29f4ae3c24681940e537f72830b4fe4076bdf9fe,0,1112227479619671878 +0xd968d7b9a2a960ccc2ccf8944efc106931cca8ff,0,0 +0xd0363f2c14f9d5d2229b3c6cb37f854c99e7c70d,0,34913975574555940 +0x612647b526b53d32274fa95929eafc15b25a6de1,0,0 +0x53623dc723f03565522a7d58ec0790f10562ca1f,0,0 +0x2d1d161cd8ae9e8dc2ed19939695c64bbb217f39,0,37273692737538182 +0x3d3be36815dd90cf136d32471868497c9722baf3,0,34497522215489438 +0xb715d51644bb8ee99c5f694511f7b7b78840a496,0,36355272133867275 +0x24a32550c597d7eb0864cee5780b4b6e90a0e8e7,0,37522140865975496 +0xae899be060be4347e8d8caaa765341a6534ef59d,0,35931676128337607 +0xfc46c7ad5405af97e19e45db5d2fe7ea2fa96b3c,0,36560169402269856 +0x23ee2ff6f15375976ab97e2eee81af43bcd8dd47,0,39126001234736902 +0xd5cd77b851b3807219ddea7e6aaf24363f6aa29e,0,149413846153846153 +0x45ed4c76e000fed1d5ba207c2d84b71bf159646d,0,40396637588554873 +0x4ae40a69f6b4691b810cbbd93fb1397ed00a8716,0,39209685910117352 +0xfc66759a2bab883ee651005e91c83752996390af,0,1494138461538461538 +0xb08322aa1bdf80832a13cd9d6ff3f41d7f5a243b,0,0 +0x151430b296eaddb46d050ba984803d548033c671,0,40991872213108177 +0x4f100cc66442561a2d8f3c2eb3e7a9ac69253c58,0,36345840319469096 +0x0342230a873e8ba0c8e2bfbc23f29cf022ff6d7c,0,0 +0x0f51b72b9731cec3d4289fc12be6f385db3b68de,0,41764862482890872 +0x48c6462a40aec01c1470270f6d24ab90bb6ae102,0,34288097557693880 +0x9bacaec9626e537072882077386d41a0c01fea25,0,0 +0x649423e36de90bd12672ed12fd75af8f20d37884,0,73611527941711796 +0xf0f38dbe6a19a054c8563ac6797655f501e1cece,0,35063681691303060 +0xf2fce03bd0be4d3d91939d135a4299b878da7f98,0,39176580634891941 +0xe787febc1223c4b1ab7453676504257efca18b5e,0,39245313471684202 +0xe7e0677aa03316e9e9b6ab5ae17de372a17ed072,0,0 +0x1b4447e7b14de3b2ac09325580c6b840564d7672,0,0 +0xf9abfb1e62dfb5c0aa9517e4aaf34d1b74339e12,0,0 +0x46350e704928ee62b77270fd21daeefbda022596,0,0 +0x41619ccbbdad1783838ecd4a3071f2d8bc564e51,0,0 +0xef69d65a4ced9a84a8836e8c8ae8eff309810f07,0,0 +0x1c62a47d4654a540e069cbb473b03e3d693a70f7,0,0 +0x8a5a34da15357d83f76abfcf43985a001cd99199,0,0 +0x11d4e8c07bc8200b85a5c6a4290c9ba1c7a8e14d,0,0 +0xcc8f99a82d2625094612263f7a48363c293fd8a4,0,0 +0x392bae4b9579db8bcf34139ef671efb229ae3391,0,0 +0x7459cd5622c12ead414007885ef03a8a894e971d,0,0 +0x1a7c265b2407a16825a609f680d44901637ad439,0,0 +0x397bf6b88dfd7845b613be5611962d3dcfb880e0,0,83669783763396082154 +0xd81bde2cd4e8718b3fa3e262143b37da303ccc86,0,0 +0x3afb135a87f02ed9fcf50d560e9b2ad0d769ae93,0,38227457904418156 +0xe40f3ad6cccff1cfdf701f8cf13fccacb78742fa,0,0 +0x85251cacfd56ff3334a4a0b3e28f53c4d189515e,0,0 +0xaa52e7deca52955f9a309455ef4b00be274de14e,0,0 +0xfecd3041ec8713dda55880ef7deadd4151add472,0,0 +0x9212d3c27ef909a2ccf3cf3ea4ab865c1221d857,0,16530480020010017 +0x7c7f9260f85cffa29737d99ef8c84f886400cfb6,0,19723592975225821 +0x0fa1ef3d5a5990eade9b54ded59d2c6a9c092288,0,20296535564689925 +0x85983988285448a3b8b760a5f0a0dcafe64ed9b1,0,24809905429578592 +0xed19b3a7c49fd33e3bc5c8667ba657250a887840,0,24812229259456596 +0xf673f32849c356ea3f9d0ed6c8ddc8c4169eaf49,0,24033785449139971 +0x1f51a679c5f6ce63445f33eab519ad881db0e52f,0,24850732724399680 +0xc4218985343cc87e3c930c635316aeae260fb503,0,24853061221200283 +0xde9e117c7f003f9b3fd72dc031eb6f90d67117f7,0,20345847272595314 +0xd2cff81e2e3d9293e159a89fd0f48d2701d64a28,0,24832197218318516 +0x6860ac889be7073ca2ede55e14941efa1cc67909,0,24866189616541908 +0x6a7df44debad17eafb3be76394a6a4a085efe164,0,0 +0x4267facf606a485228ff0ba88fcd1f235338bd07,0,0 +0xb0e82aa1ed772cb344811fb27074ac99976cdd8f,0,34633709355322088 +0x7d774ab4a16169cfd8089b82d25e7a78378de903,0,0 +0x6771da5878cdaa348cb04c364c2d202456aa462b,0,0 +0xf3e2b1250de9ecff266608187ee195548b1b16e4,0,0 +0xb387ff13623f6118608eb87c44a4cfb2c8c5857d,0,0 +0xed480717119c826e7f56d3b32a86fbef7dfb467c,0,0 +0xf9cc7c85726d555e173f4a7174bf86f15395cb3a,0,0 +0x44e89bb35cfa32b6e5d0b947bb33c547ea2064f7,0,34585214776664237 +0x71ef6fc42ff226b56e3bcc514d7255a8432689aa,0,0 +0xce2f3600d79ea3608feb1ea0f51a88bfc7d485c7,0,0 +0x690523c0da72b56743a332d422a20479b641e7c7,0,0 +0x657392b426337cbdd55b935817c851dca9956962,0,33440916855283214 +0x72c58c7f892c6e255d0c08494abeaee8f8c95e5a,0,3665920352491349415 +0x7e4cf9d736900862f2eb68a8e827b06886097d93,0,0 +0x99eda16d6589938c5347d3989ac95ef2af348551,0,125959521105323689 +0x351580044c8329215c98caa6bc5b52e677a6648f,0,5472967154483703 +0x33d5b3e5d0c1a5b575018d19b22f2576723ec71c,0,0 +0x3a9693c73f505bcccda282632a99502492fab56c,0,0 +0x7c6d0252098734bc6fe1a04fe4d54a3bf974e3d3,0,0 +0x8bea1147f760ba125ff15cfad09b7b92005c12a7,0,0 +0x3829e519905808c5a2fe1aae2abce9f2fbe41c68,0,3005912959410938 +0x99b79d49288dd6393af9169eca7158f2d799d912,0,44210906890844935 +0x566122be1807a2b8567ad49d613a128a170b55b2,0,0 +0x731e95a6d491cdc87e1b76ff3c376c9265608136,0,0 +0xb14c275fbe778a4986fecbec3d83af2e062970e2,0,0 +0x9a14fff66e561224a21347cdc65b42c4d55f2523,0,0 +0x93a6c82060b27e62bd6b8c2075db10d5e9b3ad06,0,0 +0x0c85ce7021db33bac6e9002103f45c2ff592abb0,0,0 +0x22d9f39bca5f65e272e4019df5bb1c31eed5e676,0,44185674429736113 +0xf332a2ae8fccb557a9fbce911349b0025eba55c3,0,0 +0xfb700484e48ae5339adea1e6f616027aa3526cdf,0,0 +0x5cb9bc4ec1edbc9b77e82cd2ca68a799dcea0504,0,0 +0x570e9966596363836402d761e543dc5cd1afe00b,0,44199059095729577 +0xf738679846f0d00eeec8a9abd1298c493e74084d,0,0 +0x34cd30f8a26f57a0df3ddbc1c0d1f70e3b98ba81,0,0 +0x8dd5a931ef84380febead8270447cc5a7db50b1f,0,0 +0xfdfb946910e72a8496037c6d77263605604496e8,0,0 +0x3cc9cecc10a4e551379991c37d6b3f3d93b41d6b,0,0 +0x31dccbe17320a574b9dfa49e22de4c7003eb9f50,0,736666677528849 +0x0914d40c5b51a1ce39ca4bad072e6570758b58df,0,153022836585985010 +0x56eeb07313f677ac06f892f038921715354bfd5a,0,0 +0x26d1622e02418ed4e8b39e1604b12737633fd0b7,0,23571423246698801 +0x1644f49d834832905cc22772613c5185993ac9b3,0,0 +0xffeccdb9f646fab16df67c1fe6169aab873a45c9,0,0 +0x48b3be4ab29dab1e7e8d457d8a5c06ca51ddf11f,0,0 +0x0d4a5c06254da95dc7f7487a89dded83838c39c8,0,0 +0x8b00eca10d02766499ed5c70e251905b5b06d984,0,0 +0x8bebd10085c2e803cd79eef0f90d65451bce9fcd,0,0 +0x8bcc404c4d1db27c7f1fe3ff3ba3c9e11820dc8e,0,0 +0x93a7dec843630ce43fe28908e8dc8b994dbc4b10,0,0 +0x8e02b6c4b60c1097596bf3c080fa542d879fb603,0,0 +0xcf4f3df5dc24e1504beb4db532da7d1990dca22b,0,39343851027888725 +0x9d12ca5063a2d7b8a58f337c53e9c895f7a5d29c,0,44024680666714303 +0x8159dd404f35d0fcf3dbd3b6007de874281da378,0,0 +0x49577d0395da611681a5762b9926af5694e84185,0,0 +0x7be327a376fe2c9854ed520753d8af2e8e6f57f4,0,0 +0x32ff6d85055b783acdb83739c4a5e51f911adfef,0,3714701083877083 +0x5709437eab39b23fe1807e4ff05e7424e4f70861,0,41653218363129510 +0x4026e119e2a75d4f36cb5da2f0ea415d95a04283,0,0 +0x32326f65b0e53043305ee6b46af35b7c4c59208b,0,0 +0xb3e743142971d86294c48ff4c6f9e431e1b3a173,0,72357844754415084 +0x395ff4a88a288ea26a773e4cd1fa4b4710d12322,0,0 +0x20942a70efb66c9280afee609fb214651765124d,0,0 +0x6511887da07c11c208f024ddc438376021d0f686,0,0 +0xb0c7aa2354529f03c3cb3ec1c869142c54bc5b9c,0,31223844251141725657 +0xecd227b51328faba79c951da9f5e582387b7f89f,0,6012555532160386571 +0x16d6995da1c23df1ca7ca7f47dc8abe3aed31e3c,0,0 +0xa7994df7c06a54781b2e338eef9f82d7a71e6721,0,0 +0x82bb6dee1496d71dfa4a5ae7e7898db4350af176,0,0 +0x2c3057db63ce94fa69713ddd1571643e22ded997,0,0 +0x84c9756c9cd150c8450866399fa59548c7fabd79,0,0 +0x5f73f084b790c48d382555dc6e09da2ef3bdbfde,0,0 +0xeee2c8ef5c886c1c854e7e5273bdb4f4628f60da,0,0 +0x16010bd4a55d758db2dd17e0ff3bba97861b712a,0,0 +0xe07a81a0c4a9453fb65d3de6589bb1ab24340db7,0,0 +0x1b8768d65beff30b4ceeb24ba5dba40c5b9f97d7,0,0 +0x3073708d3e4a504ef0cb4bd8b372446bed2cceb9,0,0 +0xeee70bf2d98773a8539677d391de272d2ebdb1d6,0,0 +0x4f7fea878bf4cbe2fa1d0e32597e07e5c9b4925c,0,0 +0x61f7b4983d20f87e8bd0abb029ab95d320fe95d4,0,0 +0x5471a487749eae1913f8f13d4effaafbb95a1cab,0,0 +0xcd5f78bd21848f45ccaa0d895214d24e4e08786f,0,0 +0xd5bac35955405bf81d2bec4bf94dc587784e5be2,0,0 +0x275da74ae609123dd30c7ba8d9cd0b79115ea2ef,0,0 +0xc0d4499a3e452bed3ce794c2360916452bfbf6a5,0,0 +0xf52f3f02d9d9340ee4f3c0cf4d10aa3480216747,0,0 +0x3721866d5d794b8357565fea63bfd93adf556362,0,0 +0x96b1914170e00aa2a8880a0442b6cd7ee281c0a1,0,0 +0x5dd1834c37527275f9e0453c1b4b3acaf3e4c304,0,0 +0x50dde3120dbfaeffdf0c137451cfbde209e57f1d,0,0 +0x81deb5ea1784c7eb277fe0a147f1d724583f8f12,0,0 +0x76c644460410070f7293c1f83da81c1389a6efe6,0,13644386258953862417 +0xa967a148093d2f4f4fd22021354d8da152d74c0d,0,0 +0x575d1e76ba7869c6c84359a768f0f3c7c7dda6ed,0,0 +0x443861497fca40e394a8be75f347fdfd1a4f34f0,0,0 +0x41fe0bac97d358347c029ae107d09a238d2059fc,0,0 +0xab77ea8768f0c874a2957135225442fb523130e9,0,38192016604793155 +0x83bd885e147c48b554e7271dfc5c0c301b3dba10,0,19353607694833246 +0xc18db05375cbd8e41d6ee1e3b9cbc7f32687cf84,0,74807651976946557 +0xdbf29618dcdbd228b026fd3578e16843d73c5520,0,0 +0xb49a640df452b6685cb6a12cd4b1f6413061d2ab,0,0 +0xf8195f0ba33550bec4ec36e2400c4d8fea6d1c77,0,0 +0x215960068190b294c34588f49620a498fd7c2938,0,41549549778360776 +0x8a150a6fa2b9fa107f79497f0a54500b7473f6dd,0,0 +0xb14be44cc0122fb2d7a8ec898d7db5b1bc512324,0,0 +0xa42afa6f9f72ec3bfb24993bac85d801b2eb94e9,0,0 +0x484f5f3a256b5b7120d6546af01e62be7510908d,0,41600210294557720 +0x357ba85bf59eb0f0bc5383aff2e59698890a2d80,0,38224517906388408 +0x47c10d163a299661c32b0122606232d0646dbe6f,0,0 +0xa4d004695c2b6d2d47d34e69fa5ce07621897a2e,0,0 +0xd152e0618ee3ccdbba54139f926f632d3e2bdbca,0,0 +0x25762858bcbd1e6657b448b6b1064e714ddb9c65,0,0 +0x79f49449a106d290e697c3492694b80171052a8c,0,64480165617317495520 +0x82f78c7f71aa2d50ae7059e120332f08e01c9e8b,0,48368928055777125 +0x114d8de8c7e27aa1da4a6d1382bd7f4a0bc7e915,0,0 +0x782c5b54b37da35b43aff8c48683e91c96725b7d,0,0 +0xad8d8d3a88782134cff398b09d5db17e7f6d492a,0,0 +0x99277948d79758d8309882dd9a3c5bfa3add9ffd,0,0 +0x37a90e3e025e6b832bc40cacebd8fc988e2a8525,0,0 +0x706ad9dd68afb0327b58ed8041cc8c51194d2d62,0,0 +0xf5f6063ca52efa6b407d15ee52e202d8d936fe45,0,0 +0x9a500847ffedbc3092b5e09ef421660066c8b5ac,0,0 +0x51e3c9706dd66fa60aeb5c5e860c5ad6536a8b4c,0,0 +0x6b4a530f3a5244b1b4a53f95c26630132d7f6702,0,0 +0x60317a83587194d05f86858e24fabe4f0021cc6e,0,0 +0xcadbf9096447fa1bbb2c5f3581833a21af218251,0,0 +0x16b7b8c42ba7e688f2fd97a69569d92d01a28c7f,0,0 +0xc816f19e2ad32ecb792b15f68dbbc1dbf4070c21,0,0 +0x0132776fda8bf81155d54976fc8e516215285bd4,0,0 +0x7a535497652ad56a11223f562f79164c005da58f,0,0 +0x112285a9b1860fdbf00bf434d7246e8bdeabf84a,0,0 +0xb793346b7335790be81e35ff401d9aa8c7251435,0,43916634778533960 +0x09d49b2bc434de05b645ff9dce4837fe0e7ab703,0,41951338040347668 +0xed61643578738437d86a4fe3cff49bcc637f874d,0,44361720878545626 +0xfc9af68da613b6dbc6754ab2abd55df0e0051e91,0,0 +0x28bccb5836519632e2c0dbab32b6176ee42a391e,0,0 +0x8b478359b5593747473e67f78b1f0048c1c523ed,0,3828236451343335880 +0x4cfd776e775a2c0359eca21b681d5bfffeb4848f,0,47446744449980047 +0xf213bbe4d48ff435abb7e9c83ac12d3720651314,0,45897689096896484 +0xc2350e722c89b1dfb4cbd9352cc72bed45d20643,0,39206174989005652 +0x8f78c070e8139cae2e33f7bff46fe5988154a195,0,514340649664224973757 +0x4f96ad3cbd8b69f9a098d82b1299649083737aaf,0,513717698492698497404 +0xa14bdb76c1d95aba11a7adbe4e5f4df7c0f7d76d,0,41747328087937882 +0x152a539bdc40ffdfedea965604f6557d690f2aa4,0,40732871148418437 +0x6d7c21585346ca9749eeabfe8849bc2d49899f34,0,766672992594525666 +0xc83b9b2ba8669f248bf4c44dae1e753d503bf1b7,0,46078859863224458 +0x3f5ebabbbd23e1c41ae20d8f972939d42e7497dc,0,46088026442310810 +0x28d562691415db153a6284108bbfe751a9331a99,0,8976943463216251 +0x8017422aeb2de85973c44ba2b7fb68b2133cd52b,0,0 +0x09364455d077c7a9b5e3296023df1181a8766d8a,0,0 +0x9acaf27d1fc92578b0b2e72ed5b2f4c809a6d489,0,0 +0x0530993fcd6fad0fc230057d10419ddcb9a42f3b,0,0 +0x7768c8443fdd6fa0b487b326c86efeec7c6e0bc4,0,0 +0x8532e9d4141012b411bef8bb88818b7998ff939d,0,0 +0x0afbb820f31e468fef59324252978356d9629a06,0,0 +0xdc5eb0b0010f1f9226acca51454b9607afb23bed,0,0 +0x60e4c6a71dbe333e5da0d66c5ad691dd6512318f,0,0 +0xb917be81b4f8d9c2d99c2d9db3a1d2f8ae3200d4,0,0 +0xe5c7b4166d5cfaa9cae93048cf683f870ad4faeb,0,0 +0x7c89c0dea2adbc5112b31dfce66c7e73c68771d8,0,0 +0xe9aa98ed8eea3a93c87c44d8fdb7fd97b6a094c6,0,0 +0x91c126d4e455abe45468dcd1a4e930b4d0de4d19,0,0 +0x7e4d781826dd41c0d4e65a383ee419b8f13a4758,0,738851673662134316 +0x81235dbc24df5fe69239d90f6e171af26953a478,0,41626864315588084 +0xb700c70bf1801be0a11b7698c9208c8977998d85,0,40465861519511940 +0x41a8078e5e5e6af0edce03977168e2b5af90ecf7,0,8212421249667554 +0xd4978e8c9cce2a33d0f4ca3b8a6feb2f8dfb10f4,0,40757146342348527 +0xc1c3d0cd8c23bdec19b7f8d2601cc3b3b35c2629,0,374584677172429424 +0xd848986871490748eb6fa9bc3ec88f1d46ae6961,0,39707290163240283 +0xb555da36566c6ba4346b6396af1ff9f741d26a28,0,44683430675515751 +0xaa8770696513fd25b66751bcb2a6042f1a298a88,0,40101841653005514 +0xa1897e9ebfcb9111c46e01bf75134b85e2933d58,0,35647515158968979 +0xc4f29753bbfd2990b2ad11588c67b7c41cf8de95,0,0 +0x782e42c8dc64cf5be8a16d2380c7bd1a003d4508,0,39024913983166351 +0xf8557fde4e4c6c803a8ab8147687865a8a47a17b,0,619151846516537013 +0x10d1bbfa14027a59f603ef1ba77d7b35306c338c,0,0 +0x1f6e7c066b3ed195ba71e07eb6baa0ab85b0f6ef,0,4597295247378181478 +0x2363db71c791ad30b12410a539f0e2bcf8a59f64,0,0 +0x3ea57494b38426da39b8ed1fcfaba7e4ee1c9924,0,0 +0x7eb4fe7bd988cf0de12c70f3aac7a912d50d66a8,0,0 +0xc8b19839ae371bd541f20b15c3a3cb82bfb6a6c6,0,0 +0x2006c2a03ce586ac85819987d4a326ef9ece54d5,0,0 +0x149058e5e2568254a6e7cab2ad74baa6834260aa,0,405345779125227716 +0xff0c44e4b8e3f2cf4d622bcc313f021ed715d42c,0,0 +0x53df8100840d97021a379e9058819b75686bc66a,0,0 +0x3fab8906ec5c13c7a5689bd31872051b26d9c8ce,0,17582285180461624161 +0xb3623d62ff30fadb5b2e127c07cab0d1b0808276,0,0 +0x19da3eaf23e92ec4f34ff73ca40e747d4fffef6e,0,0 +0x91f5c90be9d68009554806abe3f3eba609dbb75d,0,0 +0x9203b8a4b646320464c344c7c2b58888105dfa82,0,8557469738510005 +0xdd678bda6e7164e792ddea37feaea8bcc2e5087d,0,245977180777997612 +0xd9a071fa36f5c57548dbd339bbdad277ad3b5b6f,0,0 +0xc64284527b04a48c6673df62f5b48188ccfdf658,0,2908752319731 +0xa3b8ea3c975cbbfda21b23662a719e89e610fd65,0,138519185768655270 +0x17fad61c429c71d977660589b4c81de68fccb2b4,0,6135200515930271 +0x98f2ce1dbf528fa51126a41863e91e8a9a259c46,0,18915008283717823102 +0xeeec5752de8fc4bdac29c97fbf687e4347b80068,0,0 +0x4d0fbd8714b3a6eb073f13adef0f3774fbac8a98,0,0 +0xf99bc20283eef818f407eae076f01164d7bcab65,0,0 +0xd6fd47aab2112ab74fd2a75bffc3d21de328c2fb,0,0 +0xe375ba0880723516f24c8554fa17892588de18da,0,3405971173514548624 +0xdd30b0def53ce3104a9e761cda005a8759c13d08,0,0 +0x4d26f0e78c154f8fda7acf6646246fa135507017,0,9146438837162848992 +0x90a5ab5d823ae130dfe5b4be0ddda104f978040c,0,831161833534934401 +0xae74f851c73370d6e05bb2b82d82fb448290745a,0,6163488778247678 +0x1f99c2f594005f184db82f60d118ff87ab4d5907,0,0 +0xabc67a49d7d75bd04fa1dae22cd4b8c4f796540a,0,0 +0xe0ab2ec3853af4f95f259510d627931f4157f63c,0,0 +0x8c9e2eece72343b103397f6f2c61e973127cac8c,0,0 +0xcb6222f4df04385ea08e8da2a5871131ff5f6cba,0,586410505095022055 +0xae8d6523bb3340dc7be9dd61a4bdefa2525ccb6f,0,0 +0xdf1854a6467614809634aa7f8d1ab9672045d7c9,0,0 +0x4e3e782053e560fdebd2be4a6c9a1f26c9a0faa4,0,0 +0x7a4c8e3655d665f3e25ccd6b60b1b024629b3705,0,0 +0x220a6f204a8f8e6af9397c14ed019df08843ad3a,0,0 +0xcd96e1536e7f599e0ae2ad7de780960fd0a3ba87,0,0 +0x6e591152746d2291e323f22db118db2330357351,0,0 +0x491fcb4ce418817f849beeba02571f2d8497e3ee,0,0 +0x1464ce2ff550c9f91e25e4c46644b1bc88b14229,0,0 +0x009ffcd9e46c8ad4f10d9b46bf518674d811beb0,0,0 +0x359cfb2ff4e629ecaf56edca359f69bd007f9c90,0,0 +0x979c8590414ddeb53c2a9b6d37ea0c27eb26887b,0,106029809644601857 +0xa1ee4c1d9eaa32b1829bdcd95b82c2b4b079a2c7,0,0 +0xd433e7771aec2e4c882e00d75d658b3a467d57c2,0,0 +0xa2f047e2bf50d65e06e335bbcdf9313371a9708e,0,8329038543463929912 +0xe418e52b672417cb07404fddf12972c1de075b2a,0,11816136202463681854 +0xfacec1c32ae56097866a6c1dda1124f2c6844f40,0,0 +0xeda496624956e4980e6a0fa409e7dbcda08581bb,0,0 +0xea21480e2757cdd4ff45f635d47c503bd7d488f5,0,0 +0xb238855898ed8678a74d1f4a0b75be8f8beb3890,0,0 +0x3b5fe49bb72e8f077f128392ed208e6d3fdcd6bc,0,2641346697838308533 +0x6e15c338b6e2e1ff69f33104db33d9ea751048b0,0,0 +0x0d08e42eaa8a1c8eaf75a0e941c71dd0a92a4a44,0,0 +0xbd5c58530eae28be03bb2bebc194d1ee8d530262,0,0 +0x60090335df2550ee20b564965b817ad18e52a09e,0,136019516293429443601 +0x5e1ca9efc1aa4a61768509bc6bba355bb87602d1,0,0 +0x8e691ec08006be258181e0bb97763e37b3eac8c3,0,55287596895 +0x2ad9c246a09f3a6cbb297b2ecfb1916606dd14b6,0,141451411172395 +0x8ea417470df27e487e0f0be5fddcb86c9d86982e,0,532825456384085790 +0x4c0a5541c4577e07a29073a5443d7082c1007e8f,0,1899750346702705967 +0x0316ee8122b792ed37fd7cbd3fcfb2c66d3d3833,0,204564212203429994 +0x0566e51e6c27dfb9070ac968021b84f51e4f856e,0,0 +0x9258204a7b735562081a8fb9d1f1bf362f6e6c49,0,0 +0xc353319f75d12fe058ebbb7ae76977150eb4e77b,0,243807888376463801 +0x3d6ccb03f8d2c49c08f58a65ca77f7e23123345f,0,0 +0xbe70b5e456fafb6ff4a5bc07c62e1d2d56ff6af7,0,708145368771086015 +0x8e1f5dff0de792a58c6b8a1682e50e3b3be28ec5,0,0 +0x60c09f02b574300c1c47482c9097d826bea61ab3,0,0 +0xd8aae1308fb7b260e45edcf1ef99a2f6ed2ce333,0,0 +0x25c8ae960ff99d4d3195b7b70fa8a8091e3d9323,0,0 +0xa55cab664a7dac7e7153fe8de326434086ca691c,0,394674943075971904 +0x0319632ba6e1588bf9a37c05da7dea521d566f4d,0,0 +0x6f985192f33834dcb91dc28c36ac6da18284a33f,0,0 +0x6c707a1bf5a724a880dc49d0456503ab433d4e33,0,0 +0x1654d1c04ed0f3986d21a667f41f38cd52e18813,0,0 +0xb168eb2d0cba59d1f59fb6f74520190ec21c192f,0,0 +0x39e25e5c9b00c9a043860e6d58a55d0cf8c9b7ba,0,0 +0x491de08f6079348e665e29290c1abab383786156,0,213919389868598519 +0x2b64eadef83ffc37db0f2cbf03bc9b3dc92a1df2,0,0 +0xe85741fc4ba80d7324fc3a0abcadb39c55b5e05b,0,0 +0xc3e6af4efedea7a3350869799aaee59ad4a1bdae,0,0 +0xea2310314304ba1e090e86e4f79f56c949f19eb8,0,0 +0x50d91664040ad01cece59cc04d3d708032c9eeba,0,0 +0x154d77dcf1d2f0da8aefe480ce0d440d5b40ea2b,0,0 +0x5c036ff44c1366ce0f11b079aeac098bfe11f3f1,0,0 +0xb44f44f564e9fec30feeb13ba7d128962493d937,0,2131455911286334315 +0xd1d11353c2cb897cd94f71c45820cc9bf890d0b6,0,0 +0x904f4ad12ecad4d5dd51f387c0428d28c4ded08e,0,517604899912749607 +0x604b2a1d9c1f3d89a2538b5ade3cf74693dc0f3b,0,0 +0x551d5743d293727489826f6c556eb940c471101f,0,0 +0xaad66568d9f4219d6f1873eef7beae0204444150,0,748000296406128117 +0x17a1f1aec735459dcca275a8f76dbe5b29a7ee24,0,0 +0x0f486b86bf08e66039391b79fb2a9e8225d4c265,0,0 +0x1df1ce31402fe00ae29e9e7025f8058de74eb2fd,0,82894450853018795 +0x1f65e678462e7bad54191fbfc75b17df9b741b5a,0,101769230769230769 +0xdebf8b7ed39ca7d65bfbd732c3c68b3afa7d48a3,0,0 +0x7e11a3883e901bdc0eef2b4e135f11e1fe57c1de,0,0 +0xafa4abb426d62e4269ada6a15d365d8ac49ef4c7,0,0 +0xe4382973618d13780eb686db003ca1111abb5c73,0,363115085548572435 +0x2c6488104ca4a974a73361c4cf439b039c786447,0,181531394024416302 +0xb2410bfa1ac58414c429c351f7bea286375627b8,0,0 +0x08bbbab5973400dc496670a0bfa5a644cb342f4b,0,0 +0x0530cd763828cdcbfe7fd6e1239bbd8c96f0e8ee,0,0 +0xee60f3fcabcc920395aaba9d771049bd70727d69,0,231577962716261375 +0x74c9b03081e21195185efc3ad76e7b624a50e7ee,0,0 +0x7eddaf5716d726bffd1568f49730ec1c8f1cc0d1,0,0 +0x8bdfd395b252b8f85fed7ab4405a8527fb69ac57,0,187815826329053030 +0xe478f67038fcfc169ffd055baa81e18d14d2c415,0,531868336902285420477 +0x6df5d1ec0834438e15ff13414962399c9774ef98,0,0 +0x98c0d7d027be8fb628c149971be865f5c0a7e0e8,0,20566622045158678508 +0xaf7fa888e1f67f064c44a11f9c47f102fc7b7611,0,3781145654187531 +0x9bc86996822381b9dc51d367a6bf088d397d9f68,0,34665902893037885 +0x975c4a429c173f990fe9bf5c42e394be22cb1411,0,230356694912981955 +0x4bc1ec9cce19ea56adfe902b5e4cd1b04353db45,0,187181430555930257 +0x3369bc37a42e7ab2bc2ce45878ce0f4fd8b89436,0,460582980951278264 +0xfadf49b729904dae9d7f121dbb0429301377e86b,0,230431298149472744 +0xaac6ad84d2d7b93c86d51b32765121c1176946a1,0,0 +0x38430336153468dcf36af5cea7d6bc472425633a,0,4245084693692668680 +0xd5e2cac497e42f7357c6ddc3b415d9ba677b9425,0,2028839104603964167 +0x24ab16fa32702c0b3206f571c9d34a0e586408ec,0,1426938191982369472 +0x03a42983da655b33b0ed0ba01214877022bc6ed5,0,699807025765840482 +0xa8a0ef9ea2db26655326a1e96a361765e6d385c0,0,374148548978950593 +0x49c55149f0c557618be12aa57927e07eb95af388,0,1122062081485336506 +0xa74afd7f45115fdce4afe51d28aba286848ac2c7,0,897213884443723600 +0x1d5062931f2d33fcbca78983be2eb8518755fb32,0,1074479359682117592 +0x1dd3851b88a56e4ddfb7768296bfe90b9661212a,0,279983863676555409 +0x5bb5671ffbba56aad22313e862494f57a151febf,0,933021863940461027 +0xa3632276bf54a4faad7079d48a4a13feed55cb53,0,932313454491372371 +0xbcd6d196e824a734630050f27a0a22f9770afd28,0,464334929967313119 +0x1ab52660f4c6fd232d348181bb974948e28687b9,0,482443326182561104 +0xbd82e2613bf9313fa754fc53138af953e0f2a9b0,0,927976924894722849 +0x90bd5897a9bf6fc0a41c3b752f8eeb6cb760058c,0,0 +0x2399104b3918693200d211dfd6cb0a4f69b90122,0,0 +0x72d14d70ee264b26fbeaa1253b016d0167469ebd,0,0 +0xa522e30ee01395d1ff88611917a2e501f7d71dd2,0,0 +0xd726ca482ee3a88857132da245ae38a3cbab4df7,0,1158912987345388979 +0x67624e5bfef752c524055482a88ca25771abd8f8,0,0 +0x77cac996632fa63a2b7b6d3218897ddb8ef950f2,0,2685765724599944765 +0xca8f0b0a00d9f32efdec4942565e2a550cde77b5,0,27703222761486721 +0x5dbc28567877b16cc57140fb0a7636cfe489dc6e,0,0 +0xaf59ca4088e6f609b1812157ea1c724baf6d369d,0,689538461538461538 +0x067e0f9db931a84f3a6db90065de9580c9acf9b6,0,464121061314183198 +0x63433dc48c9639c61561870f145f2fc7a56cfb1a,0,360604851881280101 +0x325f3e52bb8529352091a268f60750ba5a978cc4,0,1361418402425938470 +0x22b908c2fea7a1e6043ffcdbc77d660d4d326961,0,15683839173378585000 +0x857d6f24012caa5de35238f616cb57e6e20534d4,0,0 +0xa3dd994d10f5a0334ae65d3d3207668c69e05a39,0,268748763935635523 +0x44fbef86239debd8e68a22a9ba58cd7ab6be6947,0,0 +0xd3bbc8e884f17e57d5be065913067efca48ba221,0,0 +0xa5bbaf2202a729c782da9e0dbd64d125a192be7d,0,0 +0x9221a3c1fa16fa522f92d2b721dbd62ea242146a,0,20353846153846153 +0x897e24cb9850fd6a0bfda61cab3b5dabb722f29c,0,0 +0x06e494a749b16c02e55855cf6664457b5b15a47f,0,0 +0x304a0509c993cbfbbed46e93139218e84e90ba63,0,15715384615384615 +0xd8cc6dc79e2f60a48a5424e9c34ca65118dd8cd6,0,0 +0xc632f3582fee8eb54e71f9013bcc5ef2fda4f985,0,10391295628388060 +0x927108a91689fca501a625ba4df6015df252960f,0,0 +0x0295ae6c6451732d94fc1e3ab40990efcd28f869,0,341733879100990177 +0xe0788ecfdb8125bba670fa0cbd4247235eeeb2ef,0,220929081249653864 +0x0ddb6cde2d835526318541336c9d60b89d6069c6,0,0 +0x14ad12f0156ad0e3cc669c17ef2e611b0d541ca6,0,0 +0xb29da577ee292c7d821927b6b95090e1d90fe169,0,0 +0x0dc99550acc01f97db95aca0b1a95b10b6c36c99,0,4296403231510132350 +0x9bbc4b0f8d1a497ab97d021db3a4ced0006c448e,0,724153846153846153 +0xe0f1a6494ee81864a2bb84e31d7f252342b90476,0,21705161654347194 +0xa4d8be5669e7ed4b6c23b572c59320a66c26a5ce,0,349803384623001504 +0xc0a929079db299399ac3afbe217b3060a75f31f0,0,0 +0xfb2814a61dc43d7cd16d2016248bd6921681cc2b,0,0 +0xa462b5883c37a5e5210ac0f1bb03efae545feaec,0,0 +0xde72353f50f9ec2dbf956f9db3ff63393e51215e,0,0 +0x0c52d3db2d924b588f8aa9b61456505b738e8892,0,313390792738516371 +0x5959bfa1e1d6f4a8005c2daa5b3561848ae9045a,0,600133175748994911 +0x81abfb835de2579fc33402f465a988e3ce766310,0,0 +0xc5eab4265621b93e44d1c431df70de4451bd6fc6,0,0 +0x9614d9536dc4a0e4876ca813abb9d0ca42eca6b9,0,0 +0x3dc105285e287521f68e209a3df243340fe3eb9f,0,0 +0xea766bb09f3a6a1e2518f52828139caf239f1bf9,0,0 +0xa2ae31fafcd5f1b6c6dc7ff4943f6b17b4f6d2aa,0,0 +0x6e8828cc90fb77382965a71130c524e473a13ccb,0,2460976832936239674 +0xc1983ed711404b0b50db6276951816f477f39016,0,684631000020672588 +0xda36cc4136a24035d2fa1e35873cfb6b4ebf4321,0,763864615384615384 +0xa995a3fcf9785c70b1e4e06ddc86807f55168bb2,0,0 +0xd7d4f4d454e624889bc5617f177dc0b4719bf94e,0,0 +0x93724dbd13d18d090a68ce070567469cfafd6296,0,0 +0x046861ba370fb262e96c730981e25c051598a075,0,26781816972872176068 +0xc856591012d3f3e83e0af2ddec263969ae047777,0,224148067444678316 +0xfdf2958561bc1197348539380065186e1f46e11d,0,8987621906691455514 +0xee6066b7655657e34f6190629a64f0a8014d3a96,0,651564794148929484 +0x19006874a71b1658b7c75f8fd4e80b4ec9a1c9ed,0,96707634258100985 +0x71c1c5e6f56291678fc2e4079becb42739845d2a,0,221517931830766559 +0x53185b800b6edb037f3624ab731e967431abd86f,0,32694324194639028639 +0xe33ffabf893d7832bd186404408dcb9484e50bfe,0,0 +0x4496243326c78fbb6bf2c38bf695312ea81d94e3,0,571366885485796 +0x47ad23a8adbe09319267df1e4ac61b943128d83c,0,0 +0x9ebadb1b80c801b328539162663235a15509a812,0,0 +0xc59ce8c7c937b2891b2e6a6b99a9fb313ee8340b,0,0 +0xc823cc426e891c27cc3779e1c2ee43a42fa05fdc,0,2250455366604257102 +0xd8853908df52c225b0b056575665e3b320db83a4,0,0 +0xa1f37e2f57f694ea5716096067ea02a46741aad6,0,0 +0x324158bbb8f4f1de9006cc01bc346d3883d04750,0,0 +0x4666dee6d1765745991025ee20d91303c979fddc,0,0 +0x93eb1c54b89855ca05adba923b030270a39d12a5,0,0 +0x63244c4b2791aa7fc78e22f29601bfb7921a2efb,0,0 +0xd2557f6eb5559ab39180c8f76b59b33a5401eb00,0,46453846153846153 +0x03bfc36358a1e3c4e800cd5f5734361d2dffea2f,0,0 +0x8908445ce26fd105156dd65f6caa0b9f9e336586,0,13899254507799254309 +0x0c6dd1eaea2e8f6a19a8043d6da99d5b25a0a7f5,0,0 +0xff0db36bdf740ce4190892e0d930bc411420ef44,0,15436348311726146427 +0xb4bd7d410543cb27f42c562ab3ff5dc12fbdd42f,0,20957662718943820 +0x4b5699cbd3aed13a2bc0be73af63e248a15d74e8,0,992159583026197266 +0xeaa08a50aec07050955e37a02237da141032f72f,0,0 +0x529497b2d1dfd5c23b3680ae5e12b12cb0aa2c7a,0,846702840648106124 +0x89f32163d1da975390fae9cf48ed7a8b5b958ebe,0,0 +0x8bc25dfa5bfa4d28c8181d7222ff79298beb9b21,0,1133719911132603836 +0xa077b54582e5d05de3873b080ca9ed4b59acf015,0,8414910921174996028 +0x77477268cea88552b0ad26de34413cb453a77e53,0,0 +0xef79b9d76590b873409430b17b0ec9aecc64fb70,0,169476923076923076 +0x982cf6bf54948f3d57f831c77228ad3f40185d96,0,33714773126029252979 +0x00e4846e2971bb2b29cec7c9efc8fa686ae21342,0,14275986282509267037 +0xd6906d98eb6311f3554af6973c774caedfdd951e,0,8199207527333744 +0x45132ca373279a0dc45bb9bc9f42a922910cfd8e,0,21130073158543819 +0x1e2a19ecf024b40626377ebb27c08bb53395e099,0,1858283544007139210 +0x27030963e5b3863b55de7f5282b69dae720482cd,0,0 +0xdeda861920d25431fcf345a0b4ab780c8819ce05,0,20149094621440468561 +0x45a12827fa024e342ee4c6848ce7c145b215c8a9,0,0 +0xad9167c459104f61c06a7d828daf237b6e36fa5d,0,0 +0x1cd2880c7e66dabd401c6c721960195a57c1f34c,0,15715384615384615 +0xcd3e10a3557413d81fdd01d3bf1f16bf2685914e,0,1266251440546485247 +0x6e868846b2182235c16fd122fcd44739e55a58e4,0,30249949956729345946 +0xf7401c0e16d547faaee4e156dc1a272d8cef5c15,0,273016696845836 +0x65757eaed3825979b989476735a6bbd9e8514f13,0,3895566623111316061 +0x2cedb695d990f71ca6a394005e328a20068d3d94,0,22611708685196062917 +0x5fac362d5b177eab597d9da1998590f702704cfb,0,593424056687535260 +0x69fffa2ff2f27332de4a137db7e80d5878c29377,0,1266039671018302 +0xdcfb55c69eb40d86e628d6c01b1e9cb6db49a1ba,0,161552410048285987 +0xbc09716f78c97f9a07821d3aec752512228ea17d,0,1919811581310191745 +0xb50c49d84fc86ae6c61ba11373654938f81b8bd7,0,178600595005430860 +0xa5c3a9e9c8c2ffe3c4733d065665626ee46abb08,0,962347059820097718 +0x441df44d430282a9702b86c955b17227487031e5,0,140247762369035063 +0x53beaa9e800065c2f566b91498dc2daf22fc6e14,0,18830769230769230769 +0x5b5affd7bb3f7eb11be364c468b1ae69c5fda97e,0,802078901269716110 +0x9dff5a21555fdfda53e455d24b266bac45633a71,0,760361538461538461 +0x4b359329c5ce4cabff9483eddf2f0c270aa05f54,0,1279021153846153846 +0xa96e1c089f3e3ca5cfc57e2d3416190dcb3e1c24,0,760361538461538461 +0x88e54cf27a8bc82a73a5710082f6543985f4d2d3,0,760361538461538461 +0x25a4b2aae47804051a6712b61f3098be98cc7440,0,0 +0x761c204f005ba5c400c4519a9052750108f38196,0,14700438550215059254 +0xa3467d897838f0f1979f90037815cb3be8c95bb5,0,1323713075610831500 +0xe84087cf2313d35b1413ad31034ded6953909637,0,96555689296246401 +0xfad77c9306de9ad9bb2726d53c57b11f4d4ee135,0,0 +0x3eb46b2f5decb65d836b26ab4d9d8736bf345212,0,33583846153846153846 +0xbb63050b76abf45d48e33c549623f5568f9bebff,0,410326017016729779 +0xafb270ed1f14fcece56d8a52b8ffd3079aacc65d,0,1680751101503395303 +0x1724b473c47bcafec09afb1d22424fded9f43cd4,0,386917933212347723 +0x6f7a6433a6ee76ba74300061d0dc59c60490466d,0,478716764538562035 +0xeea2ec21fa0730f800b9dc91fa07975446788ced,0,441078468922431163 +0x56e118092ef8db194ebfe1b0a6b24070afc21c8f,0,294921636826070508 +0x659c97d553e70fa2a2e8e57556952d003c64d6bc,0,113316216116628609 +0xc4e80c659bef2612291eb077fb2ccb176220ed34,0,356267630132369923 +0xa961da5d129aa0f191b7643a7b5edc0188d393f8,0,0 +0x60a6ef8c9e8978a0e2ac4e62f1eee8d88d20e2ad,0,22355059791599317576 +0x59ef210048ad892bfb8f18127a5ceecbc6a32919,0,1954581189463171172 +0xf6814e9bbead3ac04ee3aa17ca06c99b46924394,0,0 +0x568f94d11ce0b5a6bf2d9d3fdff42eace811b91c,0,52824949585449903 +0x3e4484c909ad3d3b980bc0905a918f40b1fedfd0,0,703871372558051348 +0x96df265f0bcad338ff205d003a1c62c16278b09e,0,347533540207879230 +0x2295b8316fd02512ca165d1da286b68a43c7e373,0,74561613938709281 +0x779b06b0da2d10356776fe5d4eb2cdc19f2ca850,0,231019778627958647 +0x13dce4f4dbc1f91a61001ea6ca2ae471bfa6951b,0,1241702690583017981 +0x254487dd94e0b5c9836d8a3781d60c0914f1f177,0,8359615384615384 +0xdc79be5d6d70ca9900912aa9482497723e52e522,0,5036273324577807901 +0x9fa98f075bfd60ab888b85a948f2c7f0861afbb7,0,0 +0xaa9d7fa2dd9e24a74806855af652de08535819d0,0,7349218013716350063 +0xb4e385afba84411e87611dbe8d6a1de4a49c61cf,0,0 +0x4770f67db9d09ca7347c1fccbf3795a464065ecb,0,0 +0x7171df6143f546638b52796d7aad170ed29b0611,0,0 +0xc19c83c73c10ef32f41d0eb62bd5db2ed6591e9e,0,0 +0x1cc46367d9055ce7d63f772368470e4e548b3b4b,0,11878477018144554 +0xd7a481069fe91e8b8c2a44e62e128f4edb32681e,0,0 +0x956bddae944f9730e9d8a33cd46fec6e07fbcca7,0,30160584228451495 +0xd62894e32731d8cde1b947a2d84745e8a3a68692,0,251337537039100864 +0xd6b6edbb4de3b65b0ad19e8c0f49f878e294bca8,0,9527437463165769 +0x237fcc8b1d7a8cb25c60bf27abb7a8f7f53e6527,0,67767682918532363 +0xe597d96afa6f15af67a72477b62464a7168bf8ff,0,608884615384615384 +0x3c8d349e229941885949e846410bd0df7e663118,0,1038793594517097560 +0x7a300fc5a947330ae0cb1797d5da0a6167c41faa,0,1491230769230769230 +0x58fe3699ea925fd6353bd5c14e2f76f296f30533,0,974215384615384615 +0x220a6cb04d48ca2c33735e94df78c17f8b0f7c9f,0,3044423076923076923 +0x26505e8c8bed588d1afab00d851a6beb1fb74a19,0,0 +0x8a1e61941c3fcdded751256967aab10eb9546522,0,0 +0x7d1858c45e03eff49cfe35c2d10c0101c44de2f0,0,145115334744458346 +0x00af1c9758556f0182f4af53aa2e1b8ff2f965d1,0,97344472471012012 +0xb0f47497b66516d306cf049ef4e501552f7a8ee8,0,47762875614883634 +0x5ce6aa07566218774e2bc383cefaf9201336dec7,0,195107028140139281 +0x4da26836ab516663085e489ec80a6ae867228f67,0,31285846420616488 +0xc7266c9f68aa42339b6381de92f1748afe0b4edd,0,110304821366904649 +0x2b2b7c5772429a2d82e83232d9c33ced6c8fe47c,0,153586402896763388 +0xc6b18f77b8adc5dd5b349710c53e27323278986b,0,244222863535629701 +0x68b2300d2886496ba29f0867aa9f633ed9528026,0,511130769230 +0x05f3c0b939ee8ae38821ebf7798d2647693c62b3,0,5375797436766911 +0x8d682d0dcc1689b8300d18fd152ebddcccb7c7fb,0,56484935542148580 +0x87547d8b61de47354cb831940f34b727c1afa1a8,0,87216542347891900 +0x3c7101ab435b2393338ccc318d3a1ebbda01a6bc,0,804461538461538 +0x6edb301eafb35f9a8aa2e392105844cc4e0e3022,0,2413384615384615 +0xa01c28cebcea47f26877995af0dd8a445f4adad5,0,1482467457843835723 +0x99eb7c8c85dd90dd1deaca9f06d2289e15de923a,0,46109201552323289 +0x697b4459a81ef36212fa83cf72cc572e86c50975,0,0 +0xbf5310fae4d7a0c6df0452bcda09aefa2748ad59,0,40223076923076923 +0x6ec8b8cec5645066fda40c6c6d6c3b749a565755,0,80446153846153846 +0x9b2855918fff918739d96b1d930b1b3e3a0a9500,0,643569230769230769 +0x570faea82f317bdc4ccf9d4675920b32ef46ca4f,0,0 +0x49e81b1b3deef00037eda6b2c6fc13c94cb7fca1,0,145596769131560678 +0x253b1874c72fecad3e64ea2979b3f06bc6a4c001,0,415399323330889812 +0x1186abf15af03e6e813d9964f99a2b778216d1a3,0,57164956446987414 +0x3b4e990df25456802a350994e64f6ad82e608523,0,114329072139905583 +0xebb034c19e7aaec13ac4214afb22642db62034ae,0,102666553262030676 +0x2f57116550bb4ceb4bd98e07c83a8aab8e267a6d,0,290452543913117306 +0xd4f85dcd2348461796e28a731ed092f4416f75de,0,207197995913834763 +0x1b0907865528f145090520c2c02d43a6b04a37cc,0,174147063597234177 +0xc1552594938a9f134e21e7253e7605db358e4e29,0,43379348093630706 +0xecc7a52ba577d17427182ecfd6ba43fc0a25f886,0,217449431428179039 +0x8d28929c14a05644d566302727bc7afabf8d0a7c,0,112775575112385903 +0xde44de06c561baade6bba573cd4d3abc13e33448,0,0 +0xb6dc0b08a0102cfb61404e1f17fb625d33e54981,0,226641719078882339 +0x6718f03b382e252e92b47be953fdea94be85314d,0,477778923403164554 +0x3ca76aa9cb6e8fa0963ae4d6372e1e3192809e86,0,250864174281673926 +0x73e8317b0551d2abcde0ef0e0b2ad1405be8a11e,0,282787083575058163 +0x7e879a761ac72b4d8f38abb151fe630ae6b0f086,0,222356236754423299 +0x5fd5907ebb8cc0c9d248b8455babbd6184242f99,0,66318147777387195 +0x27bf7dd9d1dbfd7a48fda98d27b88a3cdb616719,0,142108637904428277 +0xbf0b8a8b6c2c2b7d325106afd0bd16f83ddf1b82,0,0 +0xe117e9d62b20e138263b835fe3ae05ba98e22007,0,85023989454625377 +0x968474c84030fa08d54ad5e02791414c28966b0d,0,232640472051670886 +0xa264c1c4a0ae30b6df6e2b1e06554985d86c14b3,0,236593608140164077 +0x9905f09e7e3e3925fe051f12b69eee310501f32d,0,179078559064873581 +0x555f8d6990f8cdc2c3c90f4ebeb7be6a4a6f3d07,0,136475507094104478 +0x874cadd232585866fc4b6ac8bdbf0032b3d46449,0,99719373145446360 +0x2185fb92e58485ccade6d74d30326d98a411a4de,0,524039725953443715 +0x62f749182c2f023d5b8f8685d0cac1471d2323da,0,355626662462445390 +0xe88ade0824ba4dd6a36891dd60b83c20462b3545,0,0 +0x3e35a1edf0a31eeafc538e603f4bdda89692cf00,0,83065909398181491 +0xbb2bc7edb95d63de0c47d511a3834ecec3a4e791,0,49926558943071839 +0x2e35f8767a5ca66163e035f02f225fc072863623,0,1926843908951079442 +0x2a7e565499ae3da536072316d710750accd6e506,0,117866151619097551 +0xae7c10b0e0b0166989dc85ceb527adf9f0b8084e,0,132869602152614878 +0x2de2bbef69cf4933f67ff68b4b749e83b540b4a6,0,235488971743267934 +0xd0be5393d1a423e2761225cabb62a6fa81d5fdc0,0,792692307692307 +0x6e101a50da0ceb415f86978973a58f33dedd796c,0,0 +0xee29d21ec86a184507216c808429aac8f274c7b6,0,54335367412662709 +0xcd21f536f8f587fba0f7b2b631ff27c43a8510ea,0,108668802203708560 +0xe1e1fa52e7c78acd8924ed464f62438f5903388a,0,162819790430274343 +0x343a217727bf930c18ac46bf3493abd7d02dd1ac,0,483450097115941996 +0x3b8ac96f305afd0b5b37e97158f108c787df4ed8,0,337424813461368123 +0xfc81184dbd92282a91eea8cf5e9952d47ff82e15,0,99537367724249654 +0xefa1dd555edb27777c153355eab6d737a0fb594d,0,34392485542489447 +0x23894dd02bcf6137f4d3d4d66dda0cd87deb6963,0,0 +0x34be6e3051308fc28b0fb69b87ce249a23b33013,0,0 +0x64fedc3fe26c7a6072cd844a3eaea4b4c5a88dcd,0,6271359371312165564 +0xadf09ed5f07acdc724f65a133f53c94cb79407b0,0,134280000000000000 +0x92600a72606ff33ae9afa3d5fae58c55700e1d3d,0,0 +0xe59e9f2dfe52fe635c9616cfdde9cec815169bee,0,0 +0xa390b7445c5de65c68d232898d84a6f4619e10ee,0,0 +0xb94c44b56a6b4d29d068c7edb7ee87d8d35c2e06,0,0 +0x95822483aa42c08c1116b4d26a8c9569a4c0b165,0,0 +0xed9a912182745fe101ecb4291d00b802d982ba0f,0,7866644546664750970 +0xde21ba4b00c4b0cbb03a14d9ae9dd112fa764245,0,84331228674800849788 +0xebf367eda8fef77507c4b278cf822e50397d6fed,0,80277189917150769 +0xc8728ae130381eb77fc9a8b715564b00e83e19df,0,0 +0xb007fe067b7caca64359828026e629a8e0badc54,0,747346153846153846 +0xcd4a208888fc69d34a06a5c0d0cb6c685e3e6d81,0,57488069770444480 +0x7483c5cd74382d255efc66b64d66fdb53a146fcf,0,542179730769230769230 +0x0a25e8827ed9eee9385896e2943bcb03df759119,0,0 +0x597cb8d70f15c06349950792e39202503cff035d,0,7105003852615481 +0x63d3aa6876abca2834c67ddf54798785145919b1,0,2230926923076923076 +0x3b5a7b8d9ed71ceab3c4e2ccfb2a53fd49b291b8,0,4211135692329531 +0x115ea58a28c2c22e61cc4f2c80440a11a5f18efd,0,0 +0x9c0269901476573e9a6f27ed7b760703d15a6d72,0,0 +0x75f3b20555b3d7dd9ce76f8a2d97e8a934a8f091,0,38557381084306970454 +0x52542ffc9120723ac5bd1e7b6b2da9b066621ae3,0,395345190101284857 +0x57f59de0cbe848009c2dff1b335342c07a98dfb9,0,0 +0x8f00bce777e16de03717c8ad696f4666b79351d4,0,0 +0x080e617f07af30eecbe12d19fa8f1c6cb6687cd4,0,18716781972582725721 +0x1398c0a0f6d1f3a38baf382aac71063b2dd08c69,0,0 +0x3724c6b82edee8b33edb3f8a55954686c4cd82dc,0,57904535895583761082 +0x638673a8641891671c3da5b97bce68ea29ee786e,0,0 +0xafe51b3884de21993bbfefe974960d4021d97b47,0,26824432994595594346 +0xe8cf2f9ffb1967cde68c70463b2256d1fff97c14,0,337500000000000000 +0x632b4760f5a948fa60fe71d74eb32a89b538698a,0,550335475631130 +0x11f4a4be0a947851b0133290ddb6726a44dc70a4,0,54450000000000000 +0x33bd8d5a4f40285df90694ccb29d6f5859c3977e,0,16338803997499525620 +0xa1eb1c196b72d52d6831184714c003f1e0fcf156,0,56056732485290826722 +0x668b04a4a340cd7302f0c587d7f563bdfafb7963,0,20808931934359974050 +0x389878b6401d3b01eba47fd99f26b28774a9eae2,0,0 +0x4aa60959b1571e62f9b353937c3e45978fd07713,0,75021412939618885 +0x402904e954aebee2e78b7b09595393cf05571333,0,0 +0x87e1492fd1bc0e452c7aac9f7a013cea83214f3a,0,0 +0x8d7de458060bd070fe69f14031f0f44d143903ff,0,0 +0x026c556af5d4e315235cb907fe85fe796775f7c4,0,14988098274059364113 +0x29bcce0253c52780452103bcf09c60d848bdd91d,0,340061538461538461 +0x5eac9bf89d82113af4ff95af7274104e6dafb432,0,271186198597083214304 +0x04000848c9a371c018be34f977a6150cedd156a9,0,434492307692307692 +0x3d25aa40d20e6967b55f5f02a07b0d88aeeb25fe,0,0 +0x74dd73d498fceed337a35961e07d29e2b6b24782,0,140123076923076923 +0x06359486bc0f501032519e7fc0eaf1f92b79ae08,0,54553846153846153 +0x992a47511b1aedadc7762b5ed8b1d7e3bfffa6e3,0,5823707392326998479 +0x6f25c4a740107b57897578ee60d5d7e19caf6e9d,0,195670944018255936 +0x05bbc353afe7dd120440df1c1ba9e0933d79c2ba,0,214933910149798006 +0x81e7436ae65a5d3a35793ff1b5dc82e3b12c9a68,0,3220218380107467909 +0x5894a716231109e420600de169734bd2666df89c,0,13337999141753248054 +0x6298b4449b0417e88cc3a63bf9322742c4a2ef33,0,163367281989032119248 +0x370da9cce56f3a8bd16a6da599a014ce7b58ce50,0,3620965638147927284 +0x393925d08a58dc9e7332afb0c2e6520c4b7aafe6,0,104230681782576849826 +0xcab56c67f6af4a95f39bdb0db4085b8b486480ea,0,20946461538461538461 +0x37ccc807ecf56ddfd72bb7fface5a32782c42d72,0,1364276462669673187 diff --git a/scripts/ossov/results/staking_rewards_snapshot_block.csv b/scripts/ossov/results/staking_rewards_snapshot_block.csv deleted file mode 100644 index 6964499fc..000000000 --- a/scripts/ossov/results/staking_rewards_snapshot_block.csv +++ /dev/null @@ -1,101 +0,0 @@ -address,osSOV_balance,osSOV_unclaimed -0x2bD2201BFE156A71EB0D02837172ffc237218505,0,70373076923076923 -0xaDbEE234896B1A53a80D113A7eceF5f2B4AeAED6,0,35186538461538461 -0x3fF003142742d54E7c6A0c8dA2861dEAE392Dcce,0,0 -0x639c1170066c025B2Aca4361D9Ec7De6998c2576,0,0 -0x78f9ddE9838b5F6d58e9134B2D30dfc9d13550c1,0,2213066157129478748 -0x99679f6c76d4bdb3082Bd4b944437ECee93D596A,0,0 -0xC857a07Ca20babEdA3f76E9Be6B1B2701A29fC11,0,1926544606183631920 -0x68911e58f65062066abc81559a6DEf797402f345,0,250639587181134990291 -0x3e39235C3822730C0d9F62599D3fDA5cA1366e37,0,69881219924369558204 -0xE3f1121A1ddC59572Fa764334Dd007403EACaDdb,0,0 -0xBBFd9988eA52EE8C88f7BA28d1db827e73955ae8,0,0 -0x9227dFf3a69caC5bc42984256588c88d1581237B,0,662660411071459007 -0xC2AF342A3A3b861064792070849cFb33A55552E2,0,0 -0x3ce20d8d94Fe41e71190361C2d424CffaFe401Ce,0,0 -0x351B2237DF1427AD44b8192ca5EFF13c15f3F26e,0,0 -0x2Bd4045d7f9444643C4506C0d8df181392eCbEbF,0,0 -0x3c821bB57ea467d6A0fCccE2c853C8C4117Bca84,0,0 -0x5e117276A540DfFE52f7406FA453359631B3a6C5,0,0 -0x5F8A304af1311EB5630625Bf2042c2ACE00489c3,0,797884615384615384615 -0x2E8A5909Ac98c5913a7BA4f8A6Ec2cd32CedE625,0,0 -0xA6adEdD1aDc8237aC8c5d3009cC5D4B90Fc0a8CF,0,2177625186448418636 -0xb401AbB70432d13e46d65aB4DEe47232437D28d0,0,406976580264285131 -0x7579265244a4CB64C4BEa197161A449E16FD28D0,0,0 -0xb0cc4ed0CC3c2231581eaf6feA6f422928A23F4F,0,7255852375396518329 -0x4B0cf52b56E664b377cb588Cd300Be94B5062B1c,0,12394445842574742712 -0x5f9fEbf1F2A99fe11Edad119462DB23f28A6dDBb,0,472500000000000000 -0xa8e98bD2D3DA823C7503FE6f4cf2FCD01CF6BE4C,0,270179527241119297683 -0xE48440c1f17235038C2B9E535C50fC64c6F8703A,0,63873320840255767027 -0x121Acf78D8B71eeC95Da4e5FFBEFbc07674A64Cd,0,0 -0xc5fd654bA7c9C9d6b5710Fc347c1306e855Ec582,0,0 -0xf9A0c6eEa16E4F4c5ef40D835Eb1A2Fc489F4ACD,0,0 -0x77535aEF7F300d9ce6d9dE85A7E813F8DcF23Bc5,0,20786538461538461 -0x8d4190772bA1C59138303679c2Ac89E3d00736A7,0,0 -0xA9deEDBa572029155090DE0eea714c14015c2043,0,0 -0x41a350d22d432C66c2A4E06cDc54A1683782B2Bd,0,0 -0xd5C96ACf8004fF1f3c59f284a92F0d964655599a,0,0 -0x7a45C487784ea72Dce85D48A9E3F5Ad5EDc34Ee2,0,3740216444480538777 -0x922f2928f4d244611e8beF9e8dAD88A5B6E2B59C,0,12028846153846153846 -0xba710BE407751FD2c4c8eD7e95c452d11c2E4A85,0,75384069603443427 -0x1d0b10032bd425BEA8f2CDe0D52a280243C66965,0,633013306991096971 -0xb8128b1063e86C821B287778ed500b36033Ae02B,0,9195353367384434812 -0xBa986c82A78db4Cc36D05fd99836C795bece1663,0,0 -0x843857D513aB6E360c3E85ce8D85694d2b19450a,0,10293576923076923076 -0xA99B5cb190582aE0966778C26188eABbf0feFfb8,0,150569705575226228260 -0x8BE13377A580653551c593BD3752241CD807dee0,0,2850220931814240225 -0xC1307678f788ec362124090207e81486D06fA4b0,0,0 -0x94c74DFA070500E317DddE4d64007FE26ae8aB9A,0,0 -0xA70bceaa99dA8CF2EDAe5b17DA79607cBF6286Dd,0,47655153557748300655 -0xC4ecb7bA7C8894465Aa3DE607B50bFECde581875,0,6229959598852057396 -0x1FA4D89f1d044dCa763610F30E51AAda92C6c38c,0,0 -0x0257E54fB88E143511CD2e4B94aaE8e1FA6DE520,0,356368870325081920980 -0x90fDF1b91a06e59b736E3a6FbFc5F0D06b4E928f,0,68061082659827435446 -0xf63a521ad77803a3b5f92EDdb4613D719d32448a,0,27070983087573544674 -0xDfd12D539448385a1A49797e7E72Ece104448546,0,6478129451499409018 -0xEAcDD6b4B80Fcb241A4cfAb7f46e886F19c89340,0,0 -0xbE01Ac936a0567cE6328524ae50a2aD036f5Cd07,0,0 -0x2b5B3c98AD9b7C6b814eDc5e63DD487e6BC5f454,0,27366684015956229185 -0x6e4d7FdD7Cae2A616B37a44f0E090A281120D1C1,0,977649665971543642 -0xD2FaE24701e3a5B862Fe6EE2F386EC40A872c68b,0,0 -0xF50f458AC4961185FAe7C9b5599A119EAcaD009b,0,16052113019360800904 -0xBeD7482409659EAB8B9B6EfD746f8a53699bDda6,0,93460938148688639 -0x9b06Ce7455D3350D00994a886F77CAD77B5724b6,0,0 -0x380321D5ef1596a15B78ff63a7B268399968769C,0,20250000000000000000 -0x93624C41A99e17089D0856a974E6c018cBbEE93D,0,0 -0xdFcAd7b53504ada98D7a93F02ff049b18Ff2B18C,0,0 -0x7214E37eF397Dd58b95888C6B7eBCA5629bd83A5,0,124615384615384 -0x285695009860f910f78401345ff353BA6d0cfE58,0,18000000000000000 -0x954095D2801Cc6c0526ED8816CA4d99Fbb8a0330,0,0 -0x342A085E69aC726B9965AE6Ca0E6f23a23256E03,0,0 -0xf50c7B18C127B43CF0De88Ed753f3f8D0235eF8a,0,0 -0x442269e9E7cB11AEfD08EB6981Ee7DDEA1Fc938E,0,33267597205150657 -0x396dF64508673753BD43fE1465D745CB2Cabc079,0,70857692307692307 -0x42Ca6b4266179c47Cd1e19a054214965DF28da78,0,0 -0xb3fbDA6D402a4874DB14ffF4495e6dFbD34b6ff4,0,131191536350945898 -0x73d9Ac8CDB2E0c7aE1e743CE7078Ab2ea4b08481,0,0 -0xf33350b3778985A606468906908eb002644c2D59,0,113249270433969323 -0xE93709A5d4AFA46ed6A2D1B4D93dd13137bAbcB9,0,0 -0xCbfeaA6D42d5D5A15Cb5D499dd5905e1231aF74a,0,1177316173221223612 -0xB9bE759044e13F545225173b286C70410a5ACA31,0,0 -0x79432Cc61878Bc3ed352ea311761359a2625AF8F,0,0 -0x538aB12CDa2a972c9D37828A7A9239fb97b863b6,0,319086787820585517 -0x2d3117E30D36D561f878640B82BE8209fC69eDc0,0,0 -0xBeF54c3b0898d005fB500C6931DED87579d7a3A8,0,899569723065547088711 -0x907f6BA8cbbc4528D262c69633062B5f8FA95136,0,11809828723107367562 -0xaf6Da5C20cd40F43ED023Ee1EA9F9fcbFf724743,0,29402100000000000000 -0x709371EBe78323999dD3e1D2d6DE46b1D57b082c,0,0 -0x9a32D0389D3910683F5A1851cf3D60564Acb26E2,0,309085504041778035 -0xF4A50Ca186DABe0c3A17DE7F88A415488AAf011e,0,127107692307692307692 -0xD805Aa04c701049B282a94eCBf6dD6481BFEC162,0,0 -0x20ad091f64EB31267C248F6200775561BcA17168,0,0 -0x9ccB7EcF70D0481538aD6632BB5D8dd0E909Fcf8,0,0 -0x1d1C383D839F4F7426cCdADC7307a2344e66e252,0,6808680000000000 -0x52882EC01fEafbF9de48115D10df6BB75CA3912e,0,1062562020939700111 -0x49eb2a1eF5bbfD234e4F50c78bCf78177C0F50E7,0,2548609327532716213 -0xD3362E86aaBCaf3f3508A6B878Ab41Fcb82F2Bd5,0,37607916951281549 -0xC8D69403c231A31a77fD5e6e87367Fc8f12b0c5B,0,143446153846153846 -0x0244f3ba246aEE6F6214ea1439bf64084A323FD2,0,253641573715981180 -0x08893092E474F58aDaB42eDd09C37A31a13aA8e4,0,0 -0x2150e80DAE8359592D2F7A3f83D9DFA4Cd343c71,0,9210302329223794 -0x4Ba38d76D13Fd9cb2691DA53490085708D1E5053,0,0 diff --git a/scripts/ossov/snapshot-ossov.ts b/scripts/ossov/snapshot-ossov.ts index 4ea6a10ed..4cb348f03 100644 --- a/scripts/ossov/snapshot-ossov.ts +++ b/scripts/ossov/snapshot-ossov.ts @@ -1,10 +1,23 @@ import { ethers } from "ethers"; import { createObjectCsvWriter } from "csv-writer"; -import dotenv from "dotenv"; import fs from "fs"; import path from "path"; -dotenv.config(); +interface NetworkConfig { + name: string; + rpcUrl: string; + rewardsAddress: string; + startBlock: number; + chunkSize?: number; +} + +interface Config { + networks: { + rsk?: NetworkConfig; + bob?: NetworkConfig; + }; + addresses?: string[]; +} interface StakingData { address: string; @@ -21,6 +34,14 @@ interface TokensStakedEvent { }; } +interface TokenTransferEvent { + args: [string, string, bigint] & { + from: string; + to: string; + value: bigint; + }; +} + const STAKING_ABI = [ "event TokensStaked(address indexed staker, uint256 amount, uint256 lockedUntil, uint256 totalStaked)", ]; @@ -33,33 +54,160 @@ const REWARDS_ABI = [ const ERC20_ABI = [ "function balanceOf(address account) view returns (uint256)", + "event Transfer(address indexed from, address indexed to, uint256 value)", ]; -const ADDRESSES = { - REWARDS: "0xFdC57Cb52264209afd1559E7E3Db0F28351E9422", -} as const; +// Default network configurations +const DEFAULT_NETWORKS: Config["networks"] = { + bob: { + name: "BOB", + rpcUrl: "https://rpc.gobob.xyz", + rewardsAddress: "0xFdC57Cb52264209afd1559E7E3Db0F28351E9422", + startBlock: 26296185, + chunkSize: 5000, + }, +}; + +async function getAllAddressesFromEvents(params: { + startBlock: number; + endBlock: number; + provider: ethers.providers.JsonRpcProvider; + stakingContract: ethers.Contract; + osSOVContract: ethers.Contract; + chunkSize: number; +}) { + const { + startBlock, + endBlock, + provider, + stakingContract, + osSOVContract, + chunkSize, + } = params; + + console.log("\n=== AUTO-DISCOVERY MODE ==="); + console.log(`Scanning blocks ${startBlock} to ${endBlock}`); + + const allAddresses = new Set(); + + // 1. Get stakers from TokensStaked events + console.log("\n1. Fetching stakers from TokensStaked events..."); + const stakingFilter = stakingContract.filters.TokensStaked(); + + for ( + let fromBlock = startBlock; + fromBlock <= endBlock; + fromBlock += chunkSize + ) { + const toBlock = Math.min(fromBlock + chunkSize - 1, endBlock); + console.log(` Querying blocks ${fromBlock} to ${toBlock}...`); + + try { + const events = await stakingContract.queryFilter( + stakingFilter, + fromBlock, + toBlock, + ); + for (const event of events) { + const staker = (event as any).args?.staker; + if (staker) { + allAddresses.add(staker.toLowerCase()); + } + } + console.log( + ` Found ${events.length} staking events. Total unique addresses: ${allAddresses.size}`, + ); + + await sleep(500); + } catch (error) { + console.error(` Error querying blocks ${fromBlock}-${toBlock}:`, error); + } + } + + // 2. Get osSOV token holders from Transfer events + console.log("\n2. Fetching osSOV holders from Transfer events..."); + const transferFilter = osSOVContract.filters.Transfer(); -const CHUNK_SIZE = 10000000; + for ( + let fromBlock = startBlock; + fromBlock <= endBlock; + fromBlock += chunkSize + ) { + const toBlock = Math.min(fromBlock + chunkSize - 1, endBlock); + console.log(` Querying blocks ${fromBlock} to ${toBlock}...`); + + try { + const events = await osSOVContract.queryFilter( + transferFilter, + fromBlock, + toBlock, + ); + for (const event of events) { + const from = (event as any).args?.from; + const to = (event as any).args?.to; + + if (from && from !== ethers.constants.AddressZero) { + allAddresses.add(from.toLowerCase()); + } + if (to && to !== ethers.constants.AddressZero) { + allAddresses.add(to.toLowerCase()); + } + } + console.log( + ` Found ${events.length} transfer events. Total unique addresses: ${allAddresses.size}`, + ); + + await sleep(500); + } catch (error) { + console.error(` Error querying blocks ${fromBlock}-${toBlock}:`, error); + } + } + + console.log(`\n✅ Total unique addresses discovered: ${allAddresses.size}`); + return Array.from(allAddresses); +} async function getStakingData(params: { + network: NetworkConfig; startFromBlock?: number; endBlock?: number; specificAddresses?: string[]; + autoDiscover?: boolean; }) { + const { network, autoDiscover } = params; + + console.log("\n" + "=".repeat(60)); + console.log("OSSOV SNAPSHOT TOOL"); + console.log("=".repeat(60)); + console.log(`Network: ${network.name}`); + console.log(`RPC: ${network.rpcUrl}`); + console.log("=".repeat(60) + "\n"); + console.log("Starting snapshot process..."); - const provider = new ethers.providers.JsonRpcProvider(process.env.RPC_URL); + const provider = new ethers.providers.JsonRpcProvider(network.rpcUrl); if (!provider) throw new Error("Failed to initialize provider"); - // define target block + // Verify network connection + const networkInfo = await provider.getNetwork(); + console.log(`Connected to chainId: ${networkInfo.chainId}`); + + // Define target block let { startFromBlock, endBlock, specificAddresses } = params; - if (!startFromBlock) startFromBlock = 0; + if (!startFromBlock) startFromBlock = network.startBlock; const targetBlock = endBlock || (await provider.getBlockNumber()); - console.log(`Using block number: ${targetBlock}`); - console.log(`Starting from block: ${startFromBlock}`); + console.log(`Target block: ${targetBlock}`); + console.log(`Scanning from block: ${startFromBlock}`); + + // Validate rewards address + if (!network.rewardsAddress) { + throw new Error( + `Rewards address not configured for ${network.name}. Please update config.json.`, + ); + } const rewardsContract = new ethers.Contract( - ADDRESSES.REWARDS, + network.rewardsAddress, REWARDS_ABI, provider, ); @@ -74,29 +222,37 @@ async function getStakingData(params: { const osSOVAddress = await rewardsContract.getOsSOV(); const osSOVContract = new ethers.Contract(osSOVAddress, ERC20_ABI, provider); console.log(`osSOV token address: ${osSOVAddress}`); - - let stakers: string[] = []; - - // If specific addresses are provided, use them directly - if (specificAddresses && specificAddresses.length > 0) { - console.log( - `Using ${specificAddresses.length} provided addresses instead of querying events`, - ); - stakers = specificAddresses; + console.log(`Staking contract: ${stakingContractAddress}`); + + let addressesToProcess: string[] = []; + + // Determine which addresses to process + if (autoDiscover) { + console.log("\n🔍 AUTO-DISCOVERY MODE ENABLED"); + addressesToProcess = await getAllAddressesFromEvents({ + startBlock: startFromBlock, + endBlock: targetBlock, + provider, + stakingContract, + osSOVContract, + chunkSize: network.chunkSize || 10000, + }); + } else if (specificAddresses && specificAddresses.length > 0) { + console.log(`\n📋 Using ${specificAddresses.length} provided addresses`); + addressesToProcess = specificAddresses; } else { - // Otherwise fetch all staking events in chunks - console.log("Fetching staking events..."); + // Fallback: fetch from TokensStaked events only (legacy behavior) + console.log("\n📋 Fetching addresses from TokensStaked events..."); const filter = stakingContract.filters.TokensStaked(); - - // Process in chunks of 10,000 blocks let allEvents: TokensStakedEvent[] = []; + const chunkSize = network.chunkSize || 10000; for ( let fromBlock = startFromBlock; fromBlock <= targetBlock; - fromBlock += CHUNK_SIZE + fromBlock += chunkSize ) { - const toBlock = Math.min(fromBlock + CHUNK_SIZE - 1, targetBlock); + const toBlock = Math.min(fromBlock + chunkSize - 1, targetBlock); console.log(`Querying blocks ${fromBlock} to ${toBlock}...`); try { @@ -118,20 +274,16 @@ async function getStakingData(params: { `Found ${chunkEvents.length} events in this chunk. Total: ${allEvents.length}`, ); - // Add delay between chunks to avoid rate limiting - if (fromBlock + CHUNK_SIZE <= targetBlock) { - console.log("Waiting before next chunk..."); - await sleep(1000); - } + await sleep(1000); } catch (error) { console.error(`Error querying blocks ${fromBlock}-${toBlock}:`, error); - // Continue to next chunk } } - // Get unique stakers - stakers = [...new Set(allEvents.map((event) => event.args.staker))]; - console.log(`Found ${stakers.length} unique stakers`); + addressesToProcess = [ + ...new Set(allEvents.map((event) => event.args.staker)), + ]; + console.log(`Found ${addressesToProcess.length} unique stakers`); } // Create results directory if it doesn't exist @@ -140,10 +292,11 @@ async function getStakingData(params: { fs.mkdirSync(resultsDir, { recursive: true }); } - // Define CSV file path + // Define CSV file path with network name + const networkSlug = network.name.toLowerCase().replace(/\s+/g, "_"); const csvFilePath = path.join( resultsDir, - `staking_rewards_snapshot_block.csv`, + `${networkSlug}_snapshot_block_${targetBlock}.csv`, ); // Check if file exists and load existing data @@ -167,25 +320,30 @@ async function getStakingData(params: { console.log(`Loaded ${Object.keys(existingData).length} existing records`); // Filter out already processed addresses - stakers = stakers.filter( - (staker) => - !existingData[staker.toLowerCase()] || - specificAddresses?.includes(staker), + addressesToProcess = addressesToProcess.filter( + (addr) => + !existingData[addr.toLowerCase()] || specificAddresses?.includes(addr), ); - console.log(`Remaining addresses to process: ${stakers.length}`); + console.log(`Remaining addresses to process: ${addressesToProcess.length}`); } - // Process all of the unique stakers + // Process all addresses + console.log("\n=== PROCESSING ADDRESSES ==="); const results: StakingData[] = []; let successCount = 0; let errorCount = 0; const failedAddresses: string[] = []; // Create progress log file - const progressLogPath = path.join(resultsDir, `progress_log.json`); + const progressLogPath = path.join( + resultsDir, + `${networkSlug}_progress_block_${targetBlock}.json`, + ); let progressData = { + network: network.name, targetBlock, - totalStakers: stakers.length, + startFromBlock, + totalAddresses: addressesToProcess.length, processedCount: 0, lastProcessedIndex: -1, lastUpdateTime: new Date().toISOString(), @@ -204,23 +362,27 @@ async function getStakingData(params: { // Process in smaller chunks and save progress regularly const PROCESS_CHUNK_SIZE = 20; // Process 20 addresses at a time - for (let i = progressData.lastProcessedIndex + 1; i < stakers.length; i++) { - const staker = stakers[i]; - if (!staker) continue; + for ( + let i = progressData.lastProcessedIndex + 1; + i < addressesToProcess.length; + i++ + ) { + const address = addressesToProcess[i]; + if (!address) continue; try { // Add delay to avoid rate limiting await sleep(100); const [balance, [, unclaimed]] = await Promise.all([ - osSOVContract.balanceOf(staker, { blockTag: targetBlock }), - rewardsContract.getArbitraryStakerCurrentReward(false, 0, staker, { + osSOVContract.balanceOf(address, { blockTag: targetBlock }), + rewardsContract.getArbitraryStakerCurrentReward(false, 0, address, { blockTag: targetBlock, }), ]); results.push({ - address: staker, + address, osSOV_balance: balance.toString(), osSOV_unclaimed: unclaimed.toString(), }); @@ -231,17 +393,20 @@ async function getStakingData(params: { if (successCount % 10 === 0) { console.log( - `Processed ${successCount}/${stakers.length} stakers successfully`, + `Processed ${successCount}/${addressesToProcess.length} addresses successfully`, ); } } catch (error) { - console.error(`Error processing staker ${staker}:`, error); + console.error(`Error processing address ${address}:`, error); errorCount++; - failedAddresses.push(staker); + failedAddresses.push(address); } // Save progress and results every PROCESS_CHUNK_SIZE addresses - if ((i + 1) % PROCESS_CHUNK_SIZE === 0 || i === stakers.length - 1) { + if ( + (i + 1) % PROCESS_CHUNK_SIZE === 0 || + i === addressesToProcess.length - 1 + ) { // Update progress log progressData.lastUpdateTime = new Date().toISOString(); fs.writeFileSync(progressLogPath, JSON.stringify(progressData, null, 2)); @@ -266,7 +431,7 @@ async function getStakingData(params: { await csvWriter.writeRecords(allResults); console.log( - `Saved progress: ${progressData.processedCount}/${stakers.length} addresses processed`, + `Saved progress: ${progressData.processedCount}/${addressesToProcess.length} addresses processed`, ); // Update existing data with new results to avoid duplicates in next chunk @@ -280,139 +445,146 @@ async function getStakingData(params: { } } - console.log("\nSnapshot completed!"); + console.log("\n=== SNAPSHOT COMPLETED ==="); + console.log(`Network: ${network.name}`); + console.log(`Block: ${targetBlock}`); console.log( - `Successfully processed: ${successCount}/${stakers.length} stakers`, + `Successfully processed: ${successCount}/${addressesToProcess.length}`, ); - console.log(`Errors encountered: ${errorCount} stakers`); + console.log(`Errors: ${errorCount}`); console.log(`Total records in CSV: ${Object.keys(existingData).length}`); console.log(`Results saved to: ${csvFilePath}`); - // If there are failed addresses, try to process them again + // Handle failed addresses if (failedAddresses.length > 0) { - console.log( - `\nAttempting to process ${failedAddresses.length} failed addresses again...`, - ); - - // Save failed addresses to a file for future reference - const failedAddressesPath = path.join( + const failedPath = path.join( resultsDir, - `failed_addresses_${targetBlock}.json`, + `${networkSlug}_failed_addresses_${targetBlock}.json`, ); - fs.writeFileSync( - failedAddressesPath, - JSON.stringify(failedAddresses, null, 2), + fs.writeFileSync(failedPath, JSON.stringify(failedAddresses, null, 2)); + console.log( + `\n⚠️ ${failedAddresses.length} failed addresses saved to: ${failedPath}`, ); - console.log(`Failed addresses saved to: ${failedAddressesPath}`); - - // Wait a bit longer before retrying - await sleep(5000); - - // Retry with increased delay - const retryResults: StakingData[] = []; - let retrySuccessCount = 0; - const stillFailedAddresses: string[] = []; - - for (const staker of failedAddresses) { - try { - // Longer delay for retries - await sleep(500); - - const [balance, [, unclaimed]] = await Promise.all([ - osSOVContract.balanceOf(staker, { blockTag: targetBlock }), - rewardsContract.getArbitraryStakerCurrentReward(false, 0, staker, { - blockTag: targetBlock, - }), - ]); - - retryResults.push({ - address: staker, - osSOV_balance: balance.toString(), - osSOV_unclaimed: unclaimed.toString(), - }); - - retrySuccessCount++; - console.log(`Retry successful for ${staker}`); - } catch (error) { - console.error(`Retry failed for staker ${staker}:`, error); - stillFailedAddresses.push(staker); - } - } - - // If we recovered some addresses, update the CSV - if (retrySuccessCount > 0) { - const finalResults = [...Object.values(existingData), ...retryResults]; - - const csvWriter = createObjectCsvWriter({ - path: csvFilePath, - header: [ - { id: "address", title: "address" }, - { id: "osSOV_balance", title: "osSOV_balance" }, - { id: "osSOV_unclaimed", title: "osSOV_unclaimed" }, - ], - }); - - await csvWriter.writeRecords(finalResults); + } - console.log(`\nRetry completed!`); - console.log( - `Successfully recovered: ${retrySuccessCount}/${failedAddresses.length} stakers`, - ); - console.log(`Total records in CSV: ${finalResults.length}`); - } + return { + totalAddresses: addressesToProcess.length, + successCount, + errorCount, + csvPath: csvFilePath, + }; +} - // If there are still failed addresses, save them and notify - if (stillFailedAddresses.length > 0) { - const stillFailedPath = path.join( - resultsDir, - `still_failed_addresses_${targetBlock}.json`, - ); - fs.writeFileSync( - stillFailedPath, - JSON.stringify(stillFailedAddresses, null, 2), - ); - console.log( - `\n⚠️ WARNING: ${stillFailedAddresses.length} addresses still failed processing`, - ); - console.log(`These addresses saved to: ${stillFailedPath}`); - console.log(`You can process them manually by running:`); - console.log( - `node scripts/ossov/snapshot-ossov.js --block ${targetBlock} --addresses ${stillFailedPath}`, - ); +// Helper function +const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); - // Return the list of still failed addresses - return stillFailedAddresses; +// Parse command line arguments +const args = process.argv.slice(2); +const cliArgs: { + network?: string; + block?: number; + startBlock?: number; + autoDiscover?: boolean; + addresses?: string[]; +} = {}; + +for (let i = 0; i < args.length; i++) { + if (args[i] === "--network" && args[i + 1]) { + cliArgs.network = args[i + 1].toLowerCase(); + i++; + } else if (args[i] === "--block" && args[i + 1]) { + cliArgs.block = parseInt(args[i + 1]); + i++; + } else if (args[i] === "--start-block" && args[i + 1]) { + cliArgs.startBlock = parseInt(args[i + 1]); + i++; + } else if (args[i] === "--auto-discover") { + cliArgs.autoDiscover = true; + } else if (args[i] === "--addresses" && args[i + 1]) { + try { + const addressData = JSON.parse(fs.readFileSync(args[i + 1], "utf8")); + cliArgs.addresses = Array.isArray(addressData) + ? addressData + : addressData.addresses; + } catch (error) { + console.error(`Error loading addresses from file:`, error); } + i++; } - - return []; } -let specificAddresses: string[] | undefined; +// Load config.json +let config: Config = { networks: {} }; const configPath = path.resolve(__dirname, "./config.json"); if (fs.existsSync(configPath)) { try { - const config = JSON.parse(fs.readFileSync(configPath, "utf8")); - specificAddresses = config.addresses; - console.log( - `Loaded ${specificAddresses?.length} addresses from config.json`, - ); + config = JSON.parse(fs.readFileSync(configPath, "utf8")); + console.log(`✅ Loaded configuration from config.json`); } catch (error) { - console.error("Error reading config file:", error); + console.error("❌ Error reading config file:", error); } +} else { + console.log("⚠️ config.json not found. Using default configurations."); + console.log( + " Create config.json from config.json.example for custom settings.\n", + ); } +// Merge config with defaults +const networks = { + rsk: { + ...DEFAULT_NETWORKS.rsk!, + ...(config.networks?.rsk || {}), + } as NetworkConfig, + bob: { + ...DEFAULT_NETWORKS.bob!, + ...(config.networks?.bob || {}), + } as NetworkConfig, +}; + +// Determine which network to use +const selectedNetwork = cliArgs.network || "rsk"; +const networkConfig = networks[selectedNetwork as keyof typeof networks]; + +if (!networkConfig) { + console.error(`❌ Unknown network: ${selectedNetwork}`); + console.error(` Available networks: rsk, bob`); + process.exit(1); +} + +// Determine addresses +const specificAddresses = + cliArgs.addresses || + (config.addresses && config.addresses.length > 0 + ? config.addresses + : undefined); + +// Execute snapshot +console.log("\n" + "=".repeat(70)); +console.log("OSSOV SNAPSHOT TOOL"); +console.log("=".repeat(70)); +console.log(`Network: ${networkConfig.name}`); +console.log(`Target Block: ${cliArgs.block || "latest"}`); +console.log(`Start Block: ${cliArgs.startBlock || networkConfig.startBlock}`); +console.log(`Auto-discover: ${cliArgs.autoDiscover || false}`); +if (specificAddresses) { + console.log(`Specific addresses: ${specificAddresses.length}`); +} +console.log("=".repeat(70) + "\n"); + getStakingData({ - startFromBlock: 900618, // block where the staking contract have stake txs - specificAddresses: - specificAddresses && specificAddresses.length > 0 - ? specificAddresses - : undefined, + network: networkConfig, + startFromBlock: cliArgs.startBlock, + endBlock: cliArgs.block, + specificAddresses: specificAddresses, + autoDiscover: cliArgs.autoDiscover || false, }) - .then(() => process.exit(0)) + .then((result) => { + console.log("\n✅ Snapshot completed successfully!"); + console.log(`📄 CSV file: ${result.csvPath}`); + process.exit(0); + }) .catch((error) => { - console.error("Fatal error:", error); + console.error("\n❌ Fatal error:", error); process.exit(1); }); - -const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));