rwadurian/backend/services/mining-service/prisma/seed.ts

120 lines
3.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { PrismaClient } from '@prisma/client';
import Decimal from 'decimal.js';
const prisma = new PrismaClient();
/**
* Mining Service 数据库初始化
*
* 需求:
* - 积分股共 100.02 亿
* - 200 万原始积分股作为全网贡献值分配
* - 第一个两年分配 100 万,第二个两年分配 50 万(减半)
* - 100 亿通过销毁机制进入黑洞10年完成
* - 每秒分配一次,用户实时看到收益
*/
async function main() {
console.log('🚀 Mining-service seed starting...\n');
const now = new Date();
// 常量
const TOTAL_SHARES = new Decimal('100020000000'); // 100.02B
const DISTRIBUTION_POOL = new Decimal('2000000'); // 200万
const ERA1_DISTRIBUTION = new Decimal('1000000'); // 100万第一个两年
const BURN_TARGET = new Decimal('10000000000'); // 100亿
// 每秒分配量计算: 100万 / (2年 * 365天 * 24小时 * 60分钟 * 60秒)
const SECONDS_IN_2_YEARS = 2 * 365 * 24 * 60 * 60; // 63,072,000秒
const SECOND_DISTRIBUTION = ERA1_DISTRIBUTION.dividedBy(SECONDS_IN_2_YEARS);
// 1. MiningConfig - 挖矿配置(不激活,等待管理员手动启动)
await prisma.miningConfig.upsert({
where: { id: 'default' },
create: {
id: 'default',
totalShares: TOTAL_SHARES,
distributionPool: DISTRIBUTION_POOL,
remainingDistribution: ERA1_DISTRIBUTION,
halvingPeriodYears: 2,
currentEra: 1,
eraStartDate: now,
secondDistribution: SECOND_DISTRIBUTION,
isActive: false, // 等待管理员在后台启动
activatedAt: null,
},
update: {},
});
console.log('✅ MiningConfig initialized (inactive, waiting for admin activation)');
// 2. BlackHole - 黑洞账户
await prisma.blackHole.upsert({
where: { id: 'default' },
create: {
id: 'default',
totalBurned: 0,
targetBurn: BURN_TARGET,
remainingBurn: BURN_TARGET,
},
update: {},
});
console.log('✅ BlackHole initialized');
// 3. MiningEra - 第一纪元
await prisma.miningEra.upsert({
where: { eraNumber: 1 },
create: {
eraNumber: 1,
startDate: now,
initialDistribution: ERA1_DISTRIBUTION,
totalDistributed: 0,
secondDistribution: SECOND_DISTRIBUTION,
isActive: true,
},
update: {},
});
console.log('✅ MiningEra 1 initialized');
// 4. PoolAccounts - 池账户
const pools = [
{ poolType: 'SHARE_POOL', name: '积分股池', balance: TOTAL_SHARES },
{ poolType: 'BLACK_HOLE_POOL', name: '黑洞池', balance: new Decimal(0) },
{ poolType: 'CIRCULATION_POOL', name: '流通池', balance: new Decimal(0) },
];
for (const pool of pools) {
await prisma.poolAccount.upsert({
where: { poolType: pool.poolType as any },
create: {
poolType: pool.poolType as any,
name: pool.name,
balance: pool.balance,
totalInflow: pool.balance,
totalOutflow: 0,
isActive: true,
},
update: {},
});
}
console.log('✅ PoolAccounts initialized');
// 输出配置
console.log('\n📊 Configuration:');
console.log(` Total Shares: ${TOTAL_SHARES.toFixed(0)} (100.02B)`);
console.log(` Distribution Pool: ${DISTRIBUTION_POOL.toFixed(0)} (200万)`);
console.log(` Era 1 Distribution: ${ERA1_DISTRIBUTION.toFixed(0)} (100万)`);
console.log(` Seconds in 2 Years: ${SECONDS_IN_2_YEARS}`);
console.log(` Second Distribution: ${SECOND_DISTRIBUTION.toFixed(12)}`);
console.log(` Burn Target: ${BURN_TARGET.toFixed(0)} (100亿, 10年完成)`);
console.log(` Mining Active: false (需要在管理后台手动启动)`);
console.log('\n🎉 Mining-service seed completed!');
}
main()
.catch((e) => {
console.error('❌ Seed failed:', e);
process.exit(1);
})
.finally(() => prisma.$disconnect());