将脚本移至scripts
This commit is contained in:
parent
1904ebcd3f
commit
23e793df4c
44
package.json
44
package.json
@ -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"
|
||||
},
|
||||
|
@ -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 {}
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user