import * as dotenv from 'dotenv' const envFile = process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? `.env.production` : '.env.development' dotenv.config({ path: envFile }) console.log(process.env.DB_MAIN) import mongoose from 'mongoose' import { ActivityUser } from 'models/ActivityUser' import { DeleteRecord } from 'models/DeleteRecord' import { ScoreRecord } from 'models/ScoreRecord' import { FixAddress } from 'models/ctrl/FixAddress' mongoose.set('debug', false) const dbMain = mongoose.createConnection(process.env.DB_MAIN) const ACTIVITY = 'uaw_activity' let fs = require('fs') let sybilSet: Set = new Set() let sybilArr: string[] = [] // const loadSybils = async () => { // let wallets = fs.readFileSync('configs/sybil.txt', 'utf-8').split('\n') // // let fromSet = new Set(wallets) // let records = await EthTx.find({ from: { $in: wallets } }) // for (let record of records) { // sybilSet.add(record.to.toLowerCase()) // } // } const loadSybils = async (index: number) => { sybilArr = fs.readFileSync(`data/address_list${(index + '').padStart(2, '0')}`, 'utf-8').split('\n') } const loadWhitelist = async () => { let records = await FixAddress.find() for (let record of records) { if (sybilSet.has(record.address.toLowerCase())) { sybilSet.delete(record.address.toLowerCase()) } } } const deleteUser = async () => { let userArr = [] let records = await ActivityUser.find({ address: { $in: sybilArr } }) for (let record of records) { userArr.push(record.id) } await ActivityUser.aggregate([{ $match: { address: { $in: sybilArr } } }, { $out: 'delete_users2' }]) console.log('delete_users: ', userArr.length) const res1 = await ActivityUser.deleteMany({ address: { $in: sybilArr } }) console.log(res1) const res2 = await ScoreRecord.deleteMany({ user: { $in: userArr }, activity: ACTIVITY }) console.log(res2) const res3 = await ScoreRecord.deleteMany({ 'data.fromUser': { $in: userArr }, type: 'invite_rebate' }) console.log(res3) } const parseOneUser = async (record: any) => { const address = record.address if (sybilSet.has(address)) { console.log(`no chain record: `, address) let dRecord = new DeleteRecord({ type: 'user_no_chain', data: record, }) await ScoreRecord.deleteMany({ user: record.id, activity: ACTIVITY }) await ScoreRecord.deleteMany({ 'data.fromUser': record.id, type: 'invite_rebate' }) await dRecord.save() await ActivityUser.deleteOne({ _id: record.id }) } } ;(async () => { for (let i = 0; i < 33; i++) { try { await loadSybils(i) console.log(i, 'sybilArr: ', sybilArr.length) await deleteUser() } catch (err) { console.log(err) } } // try { // // await loadWhitelist() // // console.log('sybilSet: ', sybilSet.size) // // await ActivityUser.find().cursor().eachAsync(parseOneUser) // } catch (e) { // console.log(e) // } console.log('end') process.exit(0) })()