将脚本移至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",
"dev:api": "ts-node -r tsconfig-paths/register src/api.ts",
"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/**",
"format": "eslint --ext .ts src/** --fix",
"initdata": "ts-node src/initdata.ts",
"repairdata": "ts-node -r tsconfig-paths/register src/repairdata.ts",
"repairdata2": "ts-node -r tsconfig-paths/register src/repairdata2.ts",
"repairredis": "ts-node -r tsconfig-paths/register src/repairredis.ts",
"checkredis": "ts-node -r tsconfig-paths/register src/checkredis.ts",
"additem": "ts-node -r tsconfig-paths/register src/addboxdata.ts",
"fixdata": "ts-node -r tsconfig-paths/register src/fixdata.ts",
"nochain": "ts-node -r tsconfig-paths/register src/removeNoChain.ts",
"out": "ts-node -r tsconfig-paths/register src/queryScoreList.ts",
"sybil": "ts-node -r tsconfig-paths/register src/removeSybil.ts",
"releation": "ts-node -r tsconfig-paths/register src/updateReleation.ts",
"rankquery": "ts-node -r tsconfig-paths/register src/rankquery2.ts",
"mail": "ts-node -r tsconfig-paths/register src/batch_mail.ts",
"eth": "ts-node -r tsconfig-paths/register src/queryEthTx.ts -s 0 -l 10000 -k TC7Y76AS4AMQ468XXNKKF2R3TI7V844HUC",
"taskid": "ts-node -r tsconfig-paths/register src/generateTaskId.ts",
"token": "ts-node -r tsconfig-paths/register src/generateToken.ts",
"ingame": "ts-node -r tsconfig-paths/register src/fixIngame.ts",
"reward": "ts-node -r tsconfig-paths/register src/rewardSchedule.ts",
"testdraw": "ts-node -r tsconfig-paths/register src/testdraw.ts",
"importcec": "ts-node -r tsconfig-paths/register src/importCEC.ts",
"parsecec": "ts-node -r tsconfig-paths/register src/cecStatic.ts",
"initdata": "ts-node src/scripts/initdata.ts",
"repairdata": "ts-node -r tsconfig-paths/register src/scripts/repairdata.ts",
"repairdata2": "ts-node -r tsconfig-paths/register src/scripts/repairdata2.ts",
"repairredis": "ts-node -r tsconfig-paths/register src/scripts/repairredis.ts",
"checkredis": "ts-node -r tsconfig-paths/register src/scripts/checkredis.ts",
"additem": "ts-node -r tsconfig-paths/register src/scripts/addboxdata.ts",
"fixdata": "ts-node -r tsconfig-paths/register src/scripts/fixdata.ts",
"nochain": "ts-node -r tsconfig-paths/register src/scripts/removeNoChain.ts",
"out": "ts-node -r tsconfig-paths/register src/scripts/queryScoreList.ts",
"sybil": "ts-node -r tsconfig-paths/register src/scripts/removeSybil.ts",
"releation": "ts-node -r tsconfig-paths/register src/scripts/updateReleation.ts",
"rankquery": "ts-node -r tsconfig-paths/register src/scripts/rankquery2.ts",
"mail": "ts-node -r tsconfig-paths/register src/scripts/batch_mail.ts",
"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/scripts/generateTaskId.ts",
"token": "ts-node -r tsconfig-paths/register src/scripts/generateToken.ts",
"ingame": "ts-node -r tsconfig-paths/register src/scripts/fixIngame.ts",
"reward": "ts-node -r tsconfig-paths/register src/scripts/rewardSchedule.ts",
"testdraw": "ts-node -r tsconfig-paths/register src/scripts/testdraw.ts",
"importcec": "ts-node -r tsconfig-paths/register src/scripts/importCEC.ts",
"parsecec": "ts-node -r tsconfig-paths/register src/scripts/cecStatic.ts",
"test:watch": "jest --watch",
"test": "jest"
},

View File

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

View File

@ -1,8 +1,6 @@
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 { BigNumber } from 'ethers'
/**
* CEC赚取记录
@ -11,12 +9,12 @@ import { BigNumber } from 'ethers'
export enum CECStatusEnum {
NORMAL = 1,
STAGE1_CLAIMED = 2,
STAGE2_CLAIMED = 3
STAGE2_CLAIMED = 3,
}
export enum ClaimStatusEnum {
NORMAL = 1,
CLAIMED = 2
CLAIMED = 2,
}
@modelOptions({ schemaOptions: { _id: false } })
@ -68,7 +66,7 @@ export class CECRecordTotalClass extends BaseModule {
* founder's tag holder: 19
*/
@prop({ type: () => ClaimStatus, _id: false })
public claimStatus?: Map<string, ClaimStatus>;
public claimStatus?: Map<string, ClaimStatus>
@prop()
public earnTime: string
@ -86,7 +84,7 @@ export class CECRecordTotalClass extends BaseModule {
*/
@prop()
public skipBind: number
@prop({ enum: CECStatusEnum, default: CECStatusEnum.NORMAL })
public status: CECStatusEnum
@ -95,7 +93,7 @@ export class CECRecordTotalClass extends BaseModule {
address: this.address,
amount: this.amount.toString(),
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'
dotenv.config({ path: envFile })
console.log(process.env.DB_MAIN)
import { CECRecord } from './models/CECRecord'
import { CECRecordTotal } from './models/CECRecordTotal'
import { CECRecord } from 'models/CECRecord'
import { CECRecordTotal } from 'models/CECRecordTotal'
const dbMain = mongoose.createConnection(process.env.DB_MAIN)

View File

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