task-svr/src/removeSybil.ts
2024-07-09 11:22:29 +08:00

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)
})()