将脚本移至scripts

This commit is contained in:
CounterFire2023 2024-10-16 16:34:39 +08:00
parent 1904ebcd3f
commit 23e793df4c
29 changed files with 116 additions and 95 deletions

View File

@ -7,31 +7,29 @@
"build": "tsc -p tsconfig.json", "build": "tsc -p tsconfig.json",
"dev:api": "ts-node -r tsconfig-paths/register src/api.ts", "dev:api": "ts-node -r tsconfig-paths/register src/api.ts",
"prod:api": "NODE_PATH=./dist node dist/api.js", "prod:api": "NODE_PATH=./dist node dist/api.js",
"dev:admin": "ts-node -r tsconfig-paths/register src/admin.ts",
"prod:admin": "node dist/admin.js",
"lint": "eslint --ext .ts src/**", "lint": "eslint --ext .ts src/**",
"format": "eslint --ext .ts src/** --fix", "format": "eslint --ext .ts src/** --fix",
"initdata": "ts-node src/initdata.ts", "initdata": "ts-node src/scripts/initdata.ts",
"repairdata": "ts-node -r tsconfig-paths/register src/repairdata.ts", "repairdata": "ts-node -r tsconfig-paths/register src/scripts/repairdata.ts",
"repairdata2": "ts-node -r tsconfig-paths/register src/repairdata2.ts", "repairdata2": "ts-node -r tsconfig-paths/register src/scripts/repairdata2.ts",
"repairredis": "ts-node -r tsconfig-paths/register src/repairredis.ts", "repairredis": "ts-node -r tsconfig-paths/register src/scripts/repairredis.ts",
"checkredis": "ts-node -r tsconfig-paths/register src/checkredis.ts", "checkredis": "ts-node -r tsconfig-paths/register src/scripts/checkredis.ts",
"additem": "ts-node -r tsconfig-paths/register src/addboxdata.ts", "additem": "ts-node -r tsconfig-paths/register src/scripts/addboxdata.ts",
"fixdata": "ts-node -r tsconfig-paths/register src/fixdata.ts", "fixdata": "ts-node -r tsconfig-paths/register src/scripts/fixdata.ts",
"nochain": "ts-node -r tsconfig-paths/register src/removeNoChain.ts", "nochain": "ts-node -r tsconfig-paths/register src/scripts/removeNoChain.ts",
"out": "ts-node -r tsconfig-paths/register src/queryScoreList.ts", "out": "ts-node -r tsconfig-paths/register src/scripts/queryScoreList.ts",
"sybil": "ts-node -r tsconfig-paths/register src/removeSybil.ts", "sybil": "ts-node -r tsconfig-paths/register src/scripts/removeSybil.ts",
"releation": "ts-node -r tsconfig-paths/register src/updateReleation.ts", "releation": "ts-node -r tsconfig-paths/register src/scripts/updateReleation.ts",
"rankquery": "ts-node -r tsconfig-paths/register src/rankquery2.ts", "rankquery": "ts-node -r tsconfig-paths/register src/scripts/rankquery2.ts",
"mail": "ts-node -r tsconfig-paths/register src/batch_mail.ts", "mail": "ts-node -r tsconfig-paths/register src/scripts/batch_mail.ts",
"eth": "ts-node -r tsconfig-paths/register src/queryEthTx.ts -s 0 -l 10000 -k TC7Y76AS4AMQ468XXNKKF2R3TI7V844HUC", "eth": "ts-node -r tsconfig-paths/register src/scripts/queryEthTx.ts -s 0 -l 10000 -k TC7Y76AS4AMQ468XXNKKF2R3TI7V844HUC",
"taskid": "ts-node -r tsconfig-paths/register src/generateTaskId.ts", "taskid": "ts-node -r tsconfig-paths/register src/scripts/generateTaskId.ts",
"token": "ts-node -r tsconfig-paths/register src/generateToken.ts", "token": "ts-node -r tsconfig-paths/register src/scripts/generateToken.ts",
"ingame": "ts-node -r tsconfig-paths/register src/fixIngame.ts", "ingame": "ts-node -r tsconfig-paths/register src/scripts/fixIngame.ts",
"reward": "ts-node -r tsconfig-paths/register src/rewardSchedule.ts", "reward": "ts-node -r tsconfig-paths/register src/scripts/rewardSchedule.ts",
"testdraw": "ts-node -r tsconfig-paths/register src/testdraw.ts", "testdraw": "ts-node -r tsconfig-paths/register src/scripts/testdraw.ts",
"importcec": "ts-node -r tsconfig-paths/register src/importCEC.ts", "importcec": "ts-node -r tsconfig-paths/register src/scripts/importCEC.ts",
"parsecec": "ts-node -r tsconfig-paths/register src/cecStatic.ts", "parsecec": "ts-node -r tsconfig-paths/register src/scripts/cecStatic.ts",
"test:watch": "jest --watch", "test:watch": "jest --watch",
"test": "jest" "test": "jest"
}, },

View File

@ -36,16 +36,16 @@ const removeSmallNum = (val: any) => {
return val return val
} }
var b = ethers.utils.formatEther(val) var b = ethers.utils.formatEther(val)
b = b.substring(0, b.indexOf('.')+3) b = b.substring(0, b.indexOf('.') + 3)
var b1 = parseFloat(b) var b1 = parseFloat(b)
return BigInt(ethers.utils.parseEther(b1+'').toString()) return BigInt(ethers.utils.parseEther(b1 + '').toString())
} }
/** /**
* cec claim状态 * cec claim状态
* , , , * , , ,
* @param address * @param address
* @returns * @returns
*/ */
const queryCECClaimStatus = async (address: string) => { const queryCECClaimStatus = async (address: string) => {
let total = 0n let total = 0n
@ -58,7 +58,7 @@ const queryCECClaimStatus = async (address: string) => {
} }
const records = await CECRecordTotal.find({ address }) const records = await CECRecordTotal.find({ address })
//@ts-ignore //@ts-ignore
await updateClaimStatus({ address: CEC_CLAIM_CONTRACT, account: address, token: CEC_ADDRESS, records}) await updateClaimStatus({ address: CEC_CLAIM_CONTRACT, account: address, token: CEC_ADDRESS, records })
const bindRecord = await BitgetBindInfo.findOne({ wallet: address }) const bindRecord = await BitgetBindInfo.findOne({ wallet: address })
let bit = 0n let bit = 0n
for (const record of records) { for (const record of records) {
@ -75,17 +75,17 @@ const queryCECClaimStatus = async (address: string) => {
// 预充值, 且记录有效, 且没有跳过绑定检查 // 预充值, 且记录有效, 且没有跳过绑定检查
if (bindRecord && !bindRecord.invalid && !record.skipBind) { if (bindRecord && !bindRecord.invalid && !record.skipBind) {
claimed += (currentTotal * BigInt(val.rate)) / 100n claimed += (currentTotal * BigInt(val.rate)) / 100n
} else if (val.status === ClaimStatusEnum.NORMAL){ } else if (val.status === ClaimStatusEnum.NORMAL) {
available += (currentTotal * BigInt(val.rate)) / 100n available += (currentTotal * BigInt(val.rate)) / 100n
bit = bit | 1n << BigInt(val.bit) bit = bit | (1n << BigInt(val.bit))
} else if ( val.status === ClaimStatusEnum.CLAIMED) { } else if (val.status === ClaimStatusEnum.CLAIMED) {
claimed += (currentTotal * BigInt(val.rate)) / 100n claimed += (currentTotal * BigInt(val.rate)) / 100n
} }
} }
} else if (stage <= CEC_CLAIM_STAGE && val.status === ClaimStatusEnum.NORMAL) { } else if (stage <= CEC_CLAIM_STAGE && val.status === ClaimStatusEnum.NORMAL) {
available += (currentTotal * BigInt(val.rate)) / 100n available += (currentTotal * BigInt(val.rate)) / 100n
bit = bit | 1n << BigInt(val.bit) bit = bit | (1n << BigInt(val.bit))
} else if ( val.status === ClaimStatusEnum.CLAIMED) { } else if (val.status === ClaimStatusEnum.CLAIMED) {
claimed += (currentTotal * BigInt(val.rate)) / 100n claimed += (currentTotal * BigInt(val.rate)) / 100n
} }
} }
@ -128,31 +128,31 @@ class CECController extends BaseController {
for (const record of records) { for (const record of records) {
total += record.amount total += record.amount
let firstRate = record.firstRate || 50 let firstRate = record.firstRate || 50
let firstAmount = record.amount * BigInt(firstRate) / 100n let firstAmount = (record.amount * BigInt(firstRate)) / 100n
firstTotal += firstAmount firstTotal += firstAmount
if (STAGE1_UNLOCK_TIME < now) { if (STAGE1_UNLOCK_TIME < now) {
available += firstAmount available += firstAmount
} }
if (STAGE2_UNLOCK_TIME < now) { if (STAGE2_UNLOCK_TIME < now) {
available += (record.amount - firstAmount) available += record.amount - firstAmount
} }
lists.push(record.toJson()) lists.push(record.toJson())
} }
stages.push({ stages.push({
stage: 1, stage: 1,
amount: firstTotal.toString(), amount: firstTotal.toString(),
status: 0, status: 0,
unlocked: STAGE1_UNLOCK_TIME < now, unlocked: STAGE1_UNLOCK_TIME < now,
unlockTime: STAGE1_UNLOCK_TIME unlockTime: STAGE1_UNLOCK_TIME,
}) })
stages.push({ stages.push({
stage: 2, stage: 2,
amount: (total - firstTotal).toString(), amount: (total - firstTotal).toString(),
status: 0, status: 0,
unlocked: STAGE2_UNLOCK_TIME < now, unlocked: STAGE2_UNLOCK_TIME < now,
unlockTime: STAGE2_UNLOCK_TIME unlockTime: STAGE2_UNLOCK_TIME,
}) })
const historys = await CECClaimHistory.find({ address }) const historys = await CECClaimHistory.find({ address })
for (const history of historys) { for (const history of historys) {
if (history.status === CECClaimStatus.FAILED) { if (history.status === CECClaimStatus.FAILED) {
@ -160,7 +160,7 @@ class CECController extends BaseController {
} }
if (history.status === CECClaimStatus.CONFIRMED) { if (history.status === CECClaimStatus.CONFIRMED) {
claimed += history.amount claimed += history.amount
} }
stages[history.stage - 1].status = history.status stages[history.stage - 1].status = history.status
stages[history.stage - 1].claimTime = history.claimTime stages[history.stage - 1].claimTime = history.claimTime
available -= history.amount available -= history.amount
@ -170,7 +170,7 @@ class CECController extends BaseController {
available: available.toString(), available: available.toString(),
claimed: claimed.toString(), claimed: claimed.toString(),
stages, stages,
records: lists records: lists,
} }
} }
@ -188,7 +188,7 @@ class CECController extends BaseController {
unavailable: unavailable.toString(), unavailable: unavailable.toString(),
// records: records.map(record => record.toJson()), // records: records.map(record => record.toJson()),
bindUid: bindRecord ? hidePartString(bindRecord.biggetAcc) : '', bindUid: bindRecord ? hidePartString(bindRecord.biggetAcc) : '',
bindAddress: bindRecord ? hidePartString(bindRecord.address) : '' bindAddress: bindRecord ? hidePartString(bindRecord.address) : '',
} }
} }
@ -201,7 +201,7 @@ class CECController extends BaseController {
if (CEC_CLAIM_STAGE === 0) { if (CEC_CLAIM_STAGE === 0) {
throw new ZError(14, 'not begin') throw new ZError(14, 'not begin')
} }
let wallet: string; // 通过该地址查询可以claim的cec数量 let wallet: string // 通过该地址查询可以claim的cec数量
if (user.plat === PlatEnum.EXTERNAL_WALLET) { if (user.plat === PlatEnum.EXTERNAL_WALLET) {
wallet = user.openId || user.openid wallet = user.openId || user.openid
} else { } else {
@ -210,7 +210,7 @@ class CECController extends BaseController {
wallet = walletRecord.address wallet = walletRecord.address
} }
} }
if (!wallet) { if (!wallet) {
throw new ZError(11, 'wallet not found') throw new ZError(11, 'wallet not found')
} }
@ -221,16 +221,16 @@ class CECController extends BaseController {
if (available === 0n) { if (available === 0n) {
throw new ZError(16, 'no cec to claim') throw new ZError(16, 'no cec to claim')
} }
const nonce = now + '' +((Math.random() * 1000) | 0); const nonce = now + '' + ((Math.random() * 1000) | 0)
let data = await buildTokenClaimData({ let data = await buildTokenClaimData({
address, address,
account: wallet, account: wallet,
token: CEC_ADDRESS, token: CEC_ADDRESS,
amount: available.toString(), amount: available.toString(),
bit: bit.toString(), bit: bit.toString(),
nonce nonce,
}) })
return { calls: [{trans_req: data, trans_id: ''}], direct: true } return { calls: [{ trans_req: data, trans_id: '' }], direct: true }
} }
// @role(ROLE_ANON) // @role(ROLE_ANON)
@ -254,13 +254,13 @@ class CECController extends BaseController {
bit: 9, bit: 9,
claimStatus: { claimStatus: {
'1': { bit: 16, rate: 15, status: 1, time: 0 }, '1': { bit: 16, rate: 15, status: 1, time: 0 },
'2': { bit: 17, rate: 85, status: 1, time: 0 } '2': { bit: 17, rate: 85, status: 1, time: 0 },
} },
}) })
await record.save() await record.save()
return record.toJson() return record.toJson()
} }
@router('post /api/cec/bind_account') @router('post /api/cec/bind_account')
async bindAccount(req: any) { async bindAccount(req: any) {
await new SyncLocker().checkLock(req) await new SyncLocker().checkLock(req)
@ -272,15 +272,15 @@ class CECController extends BaseController {
throw new ZError(14, 'bind parse ended') throw new ZError(14, 'bind parse ended')
} }
if (accid && !address || !accid && address) { if ((accid && !address) || (!accid && address)) {
throw new ZError(11, 'address and accid are required') throw new ZError(11, 'address and accid are required')
} }
if (address && !ethers.utils.isAddress(address)) { if (address && !ethers.utils.isAddress(address)) {
throw new ZError(12, 'address is invalid') throw new ZError(12, 'address is invalid')
} }
let wallet: string; // 通过该地址查询可以claim的cec数量 let wallet: string // 通过该地址查询可以claim的cec数量
if (user.plat === PlatEnum.EXTERNAL_WALLET) { if (user.plat === PlatEnum.EXTERNAL_WALLET) {
wallet = user.openId || user.openid wallet = user.openId || user.openid
} else { } else {
@ -289,7 +289,7 @@ class CECController extends BaseController {
wallet = walletRecord.address wallet = walletRecord.address
} }
} }
if (!wallet) { if (!wallet) {
throw new ZError(11, 'wallet not found') throw new ZError(11, 'wallet not found')
} }
@ -300,8 +300,8 @@ class CECController extends BaseController {
throw new ZError(15, 'no claimable record found') throw new ZError(15, 'no claimable record found')
} }
await BitgetBindInfo.insertOrUpdate({ wallet }, {address, biggetAcc: accid}) await BitgetBindInfo.insertOrUpdate({ wallet }, { address, biggetAcc: accid })
return {} return {}
} }
} }

View File

@ -1,8 +1,6 @@
import { dbconn } from 'decorators/dbconn' import { dbconn } from 'decorators/dbconn'
import { getModelForClass, index, modelOptions, prop, mongoose } from '@typegoose/typegoose' import { getModelForClass, index, modelOptions, prop } from '@typegoose/typegoose'
import { BaseModule } from './Base' import { BaseModule } from './Base'
import { BigNumber } from 'ethers'
/** /**
* CEC赚取记录 * CEC赚取记录
@ -11,12 +9,12 @@ import { BigNumber } from 'ethers'
export enum CECStatusEnum { export enum CECStatusEnum {
NORMAL = 1, NORMAL = 1,
STAGE1_CLAIMED = 2, STAGE1_CLAIMED = 2,
STAGE2_CLAIMED = 3 STAGE2_CLAIMED = 3,
} }
export enum ClaimStatusEnum { export enum ClaimStatusEnum {
NORMAL = 1, NORMAL = 1,
CLAIMED = 2 CLAIMED = 2,
} }
@modelOptions({ schemaOptions: { _id: false } }) @modelOptions({ schemaOptions: { _id: false } })
@ -68,7 +66,7 @@ export class CECRecordTotalClass extends BaseModule {
* founder's tag holder: 19 * founder's tag holder: 19
*/ */
@prop({ type: () => ClaimStatus, _id: false }) @prop({ type: () => ClaimStatus, _id: false })
public claimStatus?: Map<string, ClaimStatus>; public claimStatus?: Map<string, ClaimStatus>
@prop() @prop()
public earnTime: string public earnTime: string
@ -86,7 +84,7 @@ export class CECRecordTotalClass extends BaseModule {
*/ */
@prop() @prop()
public skipBind: number public skipBind: number
@prop({ enum: CECStatusEnum, default: CECStatusEnum.NORMAL }) @prop({ enum: CECStatusEnum, default: CECStatusEnum.NORMAL })
public status: CECStatusEnum public status: CECStatusEnum
@ -95,7 +93,7 @@ export class CECRecordTotalClass extends BaseModule {
address: this.address, address: this.address,
amount: this.amount.toString(), amount: this.amount.toString(),
desc: this.desc, desc: this.desc,
earnTime: this.earnTime earnTime: this.earnTime,
} }
} }
} }

View File

@ -7,8 +7,8 @@ import mongoose from 'mongoose'
const envFile = process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? `.env.production` : '.env.development' const envFile = process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? `.env.production` : '.env.development'
dotenv.config({ path: envFile }) dotenv.config({ path: envFile })
console.log(process.env.DB_MAIN) console.log(process.env.DB_MAIN)
import { CECRecord } from './models/CECRecord' import { CECRecord } from 'models/CECRecord'
import { CECRecordTotal } from './models/CECRecordTotal' import { CECRecordTotal } from 'models/CECRecordTotal'
const dbMain = mongoose.createConnection(process.env.DB_MAIN) const dbMain = mongoose.createConnection(process.env.DB_MAIN)

View File

@ -1,5 +1,5 @@
import { Contract } from 'ethers' import { Contract } from 'ethers'
import { CECRecordTotalClass, CECStatusEnum, ClaimStatusEnum } from 'models/CECRecordTotal' import { CECRecordTotalClass, ClaimStatusEnum } from 'models/CECRecordTotal'
import { CheckIn } from 'models/chain/CheckIn' import { CheckIn } from 'models/chain/CheckIn'
import { NftHolder } from 'models/chain/NftHolder' import { NftHolder } from 'models/chain/NftHolder'
import { NftStake } from 'models/chain/NftStake' import { NftStake } from 'models/chain/NftStake'
@ -7,7 +7,6 @@ import { TokenClaimRecord } from 'models/chain/TokenClaimRecord'
import { sign } from 'utils/sign.utils' import { sign } from 'utils/sign.utils'
import { getMonthBegin, getNDayAgo } from 'utils/utcdate.util' import { getMonthBegin, getNDayAgo } from 'utils/utcdate.util'
import { timeoutFetch } from 'zutils/utils/net.util' import { timeoutFetch } from 'zutils/utils/net.util'
import { numberToBN } from 'zutils/utils/number.util'
const DEFAULT_TIMEOUT = 30000 const DEFAULT_TIMEOUT = 30000
const ACTIVITY_RPC_URL = process.env.ACTIVITY_RPC_URL const ACTIVITY_RPC_URL = process.env.ACTIVITY_RPC_URL
@ -169,20 +168,33 @@ export const fetchClaimStatus = async (address: string, taskId: string) => {
return fetchChainStatus(address, `0x${method}${addressStr}${valStr}`) return fetchChainStatus(address, `0x${method}${addressStr}${valStr}`)
} }
export const updateClaimStatus = async ( export const updateClaimStatus = async ({
{address, account, token, records}: address,
{address: string, account: string, token: string, records: Partial<CECRecordTotalClass>[]}) => { account,
token,
records,
}: {
address: string
account: string
token: string
records: Partial<CECRecordTotalClass>[]
}) => {
const chain = process.env.CLAIM_CHAIN + '' const chain = process.env.CLAIM_CHAIN + ''
const record = await TokenClaimRecord.findOne({ chain, address: address.toLowerCase(), token: token.toLowerCase(), account }) const record = await TokenClaimRecord.findOne({
chain,
address: address.toLowerCase(),
token: token.toLowerCase(),
account,
})
if (!record) { if (!record) {
return return
} }
const bitTotal = BigInt(record.bit) const bitTotal = BigInt(record.bit)
for (let item of records) { for (let item of records) {
let changed = false let changed = false
for ( let value of item.claimStatus.values()) { for (let value of item.claimStatus.values()) {
let bit = BigInt(value.bit) let bit = BigInt(value.bit)
if (value.status == ClaimStatusEnum.NORMAL && (bitTotal & 1n << bit) > 0n ) { if (value.status == ClaimStatusEnum.NORMAL && (bitTotal & (1n << bit)) > 0n) {
value.status = ClaimStatusEnum.CLAIMED value.status = ClaimStatusEnum.CLAIMED
changed = true changed = true
//@ts-ignore //@ts-ignore
@ -193,32 +205,45 @@ export const updateClaimStatus = async (
//@ts-ignore //@ts-ignore
await item.save() await item.save()
} }
} }
} }
const claimTokenAbi = [ const claimTokenAbi = ['function claim(address,address,uint256[4],bytes)']
'function claim(address,address,uint256[4],bytes)',
]
const claimKeyArr = ["address","address", "address", "address", "uint256","uint256", "uint256", "uint256", "uint256"] const claimKeyArr = ['address', 'address', 'address', 'address', 'uint256', 'uint256', 'uint256', 'uint256', 'uint256']
export const buildTokenClaimData = async ({address, account, token, amount, bit, nonce}: export const buildTokenClaimData = async ({
{ address,
address: string, account,
account: string, token,
token: string, amount,
amount: string, bit,
bit: number | string, nonce,
nonce: string }: {
}) => { address: string
account: string
token: string
amount: string
bit: number | string
nonce: string
}) => {
const contract = new Contract(process.env.CLAIM_CONTRACT, claimTokenAbi) const contract = new Contract(process.env.CLAIM_CONTRACT, claimTokenAbi)
const time = (Date.now() / 1000 | 0)+'' const time = ((Date.now() / 1000) | 0) + ''
bit = bit +'' bit = bit + ''
const signValArr = [address, account, token, process.env.CLAIM_CONTRACT, process.env.CLAIM_CHAIN, amount, bit, time, nonce] const signValArr = [
address,
account,
token,
process.env.CLAIM_CONTRACT,
process.env.CLAIM_CHAIN,
amount,
bit,
time,
nonce,
]
const signature = await sign(process.env.SIGN_PRIVATE_KEY, claimKeyArr, signValArr) const signature = await sign(process.env.SIGN_PRIVATE_KEY, claimKeyArr, signValArr)
const vals = [amount, bit, time, nonce] const vals = [amount, bit, time, nonce]
const params = [account, token, vals, signature] const params = [account, token, vals, signature]
console.log(JSON.stringify(params)) console.log(JSON.stringify(params))
return contract.populateTransaction['claim'](...params) return contract.populateTransaction['claim'](...params)
} }