92 lines
2.9 KiB
TypeScript
92 lines
2.9 KiB
TypeScript
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<string> = 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)
|
|
})()
|