@m3rcena/eco 0.0.0-stage → 14.28.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/DOCUMENTATION.md +869 -0
  3. package/LICENSE +191 -0
  4. package/README.md +182 -2
  5. package/assets/logo.png +0 -0
  6. package/dist/host-Bmld-WtZ.cjs +6163 -0
  7. package/dist/host-Bmld-WtZ.cjs.map +1 -0
  8. package/dist/host-XZmTzNyx.d.cts +1833 -0
  9. package/dist/host-XZmTzNyx.d.cts.map +1 -0
  10. package/dist/host-_xxHiG2p.d.mts +1833 -0
  11. package/dist/host-_xxHiG2p.d.mts.map +1 -0
  12. package/dist/host-qJNVzdDa.mjs +5894 -0
  13. package/dist/host-qJNVzdDa.mjs.map +1 -0
  14. package/dist/host.cjs +4 -0
  15. package/dist/host.d.cts +2 -0
  16. package/dist/host.d.mts +2 -0
  17. package/dist/host.mjs +2 -0
  18. package/dist/index.cjs +1440 -0
  19. package/dist/index.cjs.map +1 -0
  20. package/dist/index.d.cts +339 -0
  21. package/dist/index.d.cts.map +1 -0
  22. package/dist/index.d.mts +339 -0
  23. package/dist/index.d.mts.map +1 -0
  24. package/dist/index.mjs +1371 -0
  25. package/dist/index.mjs.map +1 -0
  26. package/dist/register.cjs +46 -0
  27. package/dist/register.cjs.map +1 -0
  28. package/dist/register.d.cts +6 -0
  29. package/dist/register.d.cts.map +1 -0
  30. package/dist/register.d.mts +6 -0
  31. package/dist/register.d.mts.map +1 -0
  32. package/dist/register.mjs +44 -0
  33. package/dist/register.mjs.map +1 -0
  34. package/dist/resolver.cjs +305 -0
  35. package/dist/resolver.cjs.map +1 -0
  36. package/dist/resolver.d.cts +40 -0
  37. package/dist/resolver.d.cts.map +1 -0
  38. package/dist/resolver.d.mts +40 -0
  39. package/dist/resolver.d.mts.map +1 -0
  40. package/dist/resolver.mjs +296 -0
  41. package/dist/resolver.mjs.map +1 -0
  42. package/dist/rolldown-runtime-CmQyd0Gu.cjs +27 -0
  43. package/dist/rolldown-runtime-D3PmRqjj.mjs +4 -0
  44. package/package.json +94 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-Bmld-WtZ.cjs","names":["path","fs","DatabaseSync","path","fs","createCanvas","loadImage","createCanvas","EventEmitter","EventEmitter","getAllPackageResolutions","http"],"sources":["../src/storage/EcoStorage.ts","../src/storage/SqliteEcoStorage.ts","../src/storage/PrismaEcoStorage.ts","../src/storage/EcoDatabaseHandler.ts","../src/modules/BankManager.ts","../src/modules/RewardManager.ts","../src/modules/CareerManager.ts","../src/modules/ShopManager.ts","../src/modules/BusinessManager.ts","../src/modules/CasinoManager.ts","../src/modules/LeaderboardManager.ts","../src/modules/StockMarketManager.ts","../src/modules/HeistManager.ts","../src/modules/PetManager.ts","../src/modules/CrateManager.ts","../src/modules/VaultManager.ts","../src/modules/LoanManager.ts","../src/modules/TaxManager.ts","../src/canvas/RenderBankCard.ts","../src/canvas/RenderMarketChart.ts","../src/utils/Notifier.ts","../src/bridge/EcoBridgeRouter.ts","../src/connector/EcoWekyConnector.ts","../src/EcoManager.ts","../src/host.ts"],"sourcesContent":["/**\n * @m3rcena/eco\n * Pluggable Storage Adapters for Economy Accounts and Data.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport { UserAccount } from \"../types.js\";\n\nexport interface EcoStorageAdapter {\n getAccount(userId: string, guildId?: string): Promise<UserAccount | null>;\n saveAccount(account: UserAccount): Promise<void>;\n getTopAccounts(sortBy: \"netWorth\" | \"wallet\" | \"bank\" | \"level\", limit?: number, guildId?: string): Promise<UserAccount[]>;\n getAllAccounts(guildId?: string): Promise<UserAccount[]>;\n}\n\nexport function createDefaultAccount(\n userId: string,\n guildId?: string,\n defaultWallet = 500,\n defaultBankCap = 10000\n): UserAccount {\n return {\n userId,\n guildId,\n wallet: defaultWallet,\n bank: 0,\n bankCapacity: defaultBankCap,\n xp: 0,\n level: 1,\n streak: {\n daily: 0,\n },\n inventory: [],\n businesses: [],\n activeEffects: [],\n stats: {\n totalEarned: defaultWallet,\n totalSpent: 0,\n totalGambled: 0,\n totalGambleWon: 0,\n totalRobbed: 0,\n timesRobbed: 0,\n jobsCompleted: 0,\n itemsBought: 0,\n },\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n}\n\nexport class MemoryEcoStorage implements EcoStorageAdapter {\n private accounts: Map<string, UserAccount> = new Map();\n\n private makeKey(userId: string, guildId?: string): string {\n return guildId ? `${guildId}_${userId}` : userId;\n }\n\n public async getAccount(userId: string, guildId?: string): Promise<UserAccount | null> {\n const key = this.makeKey(userId, guildId);\n const acc = this.accounts.get(key);\n return acc ? JSON.parse(JSON.stringify(acc)) : null;\n }\n\n public async saveAccount(account: UserAccount): Promise<void> {\n const key = this.makeKey(account.userId, account.guildId);\n account.updatedAt = Date.now();\n this.accounts.set(key, JSON.parse(JSON.stringify(account)));\n }\n\n public async getTopAccounts(\n sortBy: \"netWorth\" | \"wallet\" | \"bank\" | \"level\" = \"netWorth\",\n limit: number = 10,\n guildId?: string\n ): Promise<UserAccount[]> {\n let list = Array.from(this.accounts.values());\n if (guildId) list = list.filter((a) => a.guildId === guildId);\n\n const sortFn = (a: UserAccount, b: UserAccount) => {\n if (sortBy === \"wallet\") return b.wallet - a.wallet;\n if (sortBy === \"bank\") return b.bank - a.bank;\n if (sortBy === \"level\") return b.level - a.level;\n const nwA = a.wallet + a.bank;\n const nwB = b.wallet + b.bank;\n return nwB - nwA;\n };\n\n return list.sort(sortFn).slice(0, limit);\n }\n\n public async getAllAccounts(guildId?: string): Promise<UserAccount[]> {\n let list = Array.from(this.accounts.values());\n if (guildId) list = list.filter((a) => a.guildId === guildId);\n return list;\n }\n}\n\nexport class JsonEcoStorage implements EcoStorageAdapter {\n private filePath: string;\n private cache: Record<string, UserAccount> = {};\n private loaded = false;\n\n constructor(filePath: string = \"./eco-data.json\") {\n this.filePath = path.resolve(process.cwd(), filePath);\n }\n\n private makeKey(userId: string, guildId?: string): string {\n return guildId ? `${guildId}_${userId}` : userId;\n }\n\n private async ensureLoaded(): Promise<void> {\n if (this.loaded) return;\n try {\n if (fs.existsSync(this.filePath)) {\n const raw = await fs.promises.readFile(this.filePath, \"utf-8\");\n this.cache = JSON.parse(raw);\n }\n } catch {\n this.cache = {};\n }\n this.loaded = true;\n }\n\n private async persist(): Promise<void> {\n try {\n const dir = path.dirname(this.filePath);\n if (!fs.existsSync(dir)) await fs.promises.mkdir(dir, { recursive: true });\n await fs.promises.writeFile(this.filePath, JSON.stringify(this.cache, null, 2), \"utf-8\");\n } catch (err) {\n console.error(\"[JsonEcoStorage] Failed to save accounts to disk:\", err);\n }\n }\n\n public async getAccount(userId: string, guildId?: string): Promise<UserAccount | null> {\n await this.ensureLoaded();\n const key = this.makeKey(userId, guildId);\n const acc = this.cache[key];\n return acc ? JSON.parse(JSON.stringify(acc)) : null;\n }\n\n public async saveAccount(account: UserAccount): Promise<void> {\n await this.ensureLoaded();\n const key = this.makeKey(account.userId, account.guildId);\n account.updatedAt = Date.now();\n this.cache[key] = JSON.parse(JSON.stringify(account));\n await this.persist();\n }\n\n public async getTopAccounts(\n sortBy: \"netWorth\" | \"wallet\" | \"bank\" | \"level\" = \"netWorth\",\n limit: number = 10,\n guildId?: string\n ): Promise<UserAccount[]> {\n await this.ensureLoaded();\n let list = Object.values(this.cache);\n if (guildId) list = list.filter((a) => a.guildId === guildId);\n\n const sortFn = (a: UserAccount, b: UserAccount) => {\n if (sortBy === \"wallet\") return b.wallet - a.wallet;\n if (sortBy === \"bank\") return b.bank - a.bank;\n if (sortBy === \"level\") return b.level - a.level;\n const nwA = a.wallet + a.bank;\n const nwB = b.wallet + b.bank;\n return nwB - nwA;\n };\n\n return list.sort(sortFn).slice(0, limit);\n }\n\n public async getAllAccounts(guildId?: string): Promise<UserAccount[]> {\n await this.ensureLoaded();\n let list = Object.values(this.cache);\n if (guildId) list = list.filter((a) => a.guildId === guildId);\n return list;\n }\n}\n","/**\n * @m3rcena/eco\n * Native SQLite Storage Adapter using node:sqlite (Node.js >= 22.0.0).\n * Provides fast, zero-dependency, transactional local database storage.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { DatabaseSync } from \"node:sqlite\";\nimport { EcoStorageAdapter } from \"./EcoStorage.js\";\nimport { UserAccount } from \"../types.js\";\n\nexport interface SqliteEcoStorageOptions {\n /** Database file path on disk (default: \"./eco.sqlite\") */\n path?: string;\n /** Whether to enable WAL mode for high concurrency (default: true) */\n walMode?: boolean;\n}\n\nexport class SqliteEcoStorage implements EcoStorageAdapter {\n private db: DatabaseSync;\n public readonly dbPath: string;\n\n constructor(options: string | SqliteEcoStorageOptions = \"./eco.sqlite\") {\n const rawPath = typeof options === \"string\" ? options : options.path || \"./eco.sqlite\";\n if (rawPath === \":memory:\") {\n this.dbPath = \":memory:\";\n } else {\n this.dbPath = path.resolve(process.cwd(), rawPath);\n const dir = path.dirname(this.dbPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n }\n\n this.db = new DatabaseSync(this.dbPath);\n\n const wal = typeof options === \"object\" ? options.walMode ?? true : true;\n if (wal) {\n try {\n this.db.exec(\"PRAGMA journal_mode = WAL;\");\n } catch {\n // Suppress pragma errors on in-memory or read-only configs\n }\n }\n\n this.initTables();\n }\n\n private initTables(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS eco_accounts (\n user_id TEXT NOT NULL,\n guild_id TEXT NOT NULL DEFAULT '',\n wallet REAL NOT NULL DEFAULT 0,\n bank REAL NOT NULL DEFAULT 0,\n level INTEGER NOT NULL DEFAULT 1,\n data TEXT NOT NULL,\n updated_at INTEGER NOT NULL,\n PRIMARY KEY (user_id, guild_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_eco_accounts_guild ON eco_accounts (guild_id);\n CREATE INDEX IF NOT EXISTS idx_eco_accounts_wallet ON eco_accounts (wallet DESC);\n CREATE INDEX IF NOT EXISTS idx_eco_accounts_bank ON eco_accounts (bank DESC);\n CREATE INDEX IF NOT EXISTS idx_eco_accounts_level ON eco_accounts (level DESC);\n CREATE INDEX IF NOT EXISTS idx_eco_accounts_updated ON eco_accounts (updated_at DESC);\n `);\n }\n\n public async getAccount(userId: string, guildId?: string): Promise<UserAccount | null> {\n const gid = guildId || \"\";\n const stmt = this.db.prepare(\"SELECT data FROM eco_accounts WHERE user_id = ? AND guild_id = ? LIMIT 1\");\n const row = stmt.get(userId, gid) as { data: string } | undefined;\n if (!row || !row.data) return null;\n\n try {\n return JSON.parse(row.data) as UserAccount;\n } catch {\n return null;\n }\n }\n\n public async saveAccount(account: UserAccount): Promise<void> {\n account.updatedAt = Date.now();\n const gid = account.guildId || \"\";\n const payload = JSON.stringify(account);\n\n const stmt = this.db.prepare(`\n INSERT INTO eco_accounts (user_id, guild_id, wallet, bank, level, data, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(user_id, guild_id) DO UPDATE SET\n wallet = excluded.wallet,\n bank = excluded.bank,\n level = excluded.level,\n data = excluded.data,\n updated_at = excluded.updated_at\n `);\n\n stmt.run(\n account.userId,\n gid,\n account.wallet,\n account.bank,\n account.level,\n payload,\n account.updatedAt\n );\n }\n\n public async getTopAccounts(\n sortBy: \"netWorth\" | \"wallet\" | \"bank\" | \"level\" = \"netWorth\",\n limit: number = 10,\n guildId?: string\n ): Promise<UserAccount[]> {\n const gid = guildId || null;\n let query: string;\n\n if (sortBy === \"wallet\") {\n query = gid\n ? \"SELECT data FROM eco_accounts WHERE guild_id = ? ORDER BY wallet DESC LIMIT ?\"\n : \"SELECT data FROM eco_accounts ORDER BY wallet DESC LIMIT ?\";\n } else if (sortBy === \"bank\") {\n query = gid\n ? \"SELECT data FROM eco_accounts WHERE guild_id = ? ORDER BY bank DESC LIMIT ?\"\n : \"SELECT data FROM eco_accounts ORDER BY bank DESC LIMIT ?\";\n } else if (sortBy === \"level\") {\n query = gid\n ? \"SELECT data FROM eco_accounts WHERE guild_id = ? ORDER BY level DESC LIMIT ?\"\n : \"SELECT data FROM eco_accounts ORDER BY level DESC LIMIT ?\";\n } else {\n // Net worth: wallet + bank\n query = gid\n ? \"SELECT data FROM eco_accounts WHERE guild_id = ? ORDER BY (wallet + bank) DESC LIMIT ?\"\n : \"SELECT data FROM eco_accounts ORDER BY (wallet + bank) DESC LIMIT ?\";\n }\n\n const stmt = this.db.prepare(query);\n const rows = gid ? (stmt.all(gid, limit) as { data: string }[]) : (stmt.all(limit) as { data: string }[]);\n\n const result: UserAccount[] = [];\n for (const r of rows) {\n try {\n if (r && r.data) {\n result.push(JSON.parse(r.data));\n }\n } catch {\n // Skip corrupted rows\n }\n }\n return result;\n }\n\n public async getAllAccounts(guildId?: string): Promise<UserAccount[]> {\n const gid = guildId || null;\n const query = gid\n ? \"SELECT data FROM eco_accounts WHERE guild_id = ?\"\n : \"SELECT data FROM eco_accounts\";\n\n const stmt = this.db.prepare(query);\n const rows = gid ? (stmt.all(gid) as { data: string }[]) : (stmt.all() as { data: string }[]);\n\n const result: UserAccount[] = [];\n for (const r of rows) {\n try {\n if (r && r.data) {\n result.push(JSON.parse(r.data));\n }\n } catch {\n // Skip corrupted rows\n }\n }\n return result;\n }\n\n /**\n * Closes the SQLite database connection.\n */\n public close(): void {\n try {\n this.db.close();\n } catch {\n // Safe ignore\n }\n }\n}\n\n","/**\n * @m3rcena/eco\n * Enterprise Prisma Storage Adapter.\n * Integrates directly with existing PrismaClient instances with automated table migration\n * and native fallback to raw SQL queries if models haven't been compiled yet.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { EcoStorageAdapter } from \"./EcoStorage.js\";\nimport { UserAccount } from \"../types.js\";\n\n/**\n * Prisma Schema snippet that developers can paste into their schema.prisma.\n */\nexport const PRISMA_ECO_MODEL = `\n// Added by @m3rcena/eco\nmodel EcoAccount {\n userId String\n guildId String @default(\"\")\n wallet Float @default(0)\n bank Float @default(0)\n level Int @default(1)\n data String\n updatedAt DateTime @updatedAt\n\n @@id([userId, guildId])\n @@index([guildId])\n}\n`.trim();\n\n/**\n * Automatically inspects and appends the EcoAccount model to a schema.prisma file if missing.\n * @param schemaPath Path to schema.prisma (default: \"prisma/schema.prisma\")\n * @returns True if model was appended, false if already present or schema file not found.\n */\nexport function applyPrismaEcoModel(schemaPath: string = \"prisma/schema.prisma\"): boolean {\n try {\n const resolved = path.resolve(process.cwd(), schemaPath);\n if (!fs.existsSync(resolved)) {\n return false;\n }\n const content = fs.readFileSync(resolved, \"utf-8\");\n if (content.includes(\"model EcoAccount\")) {\n return false; // Already present\n }\n const updated = `${content.trim()}\\n\\n${PRISMA_ECO_MODEL}\\n`;\n fs.writeFileSync(resolved, updated, \"utf-8\");\n return true;\n } catch (err) {\n console.error(\"[applyPrismaEcoModel] Failed to append model to schema:\", err);\n return false;\n }\n}\n\nexport interface PrismaEcoStorageOptions {\n /** The PrismaClient instance provided by the bot */\n client: any;\n /** Property name of the model on the PrismaClient (default: \"ecoAccount\") */\n model?: string;\n /** Underlying SQL table name (default: \"EcoAccount\") */\n tableName?: string;\n /** Automatically run table migration on connection if missing (default: true) */\n autoMigrate?: boolean;\n}\n\nexport class PrismaEcoStorage implements EcoStorageAdapter {\n private client: any;\n private modelName: string;\n private tableName: string;\n private autoMigrate: boolean;\n private migrated = false;\n\n constructor(options: any | PrismaEcoStorageOptions) {\n if (options && options.client) {\n this.client = options.client;\n this.modelName = options.model || \"ecoAccount\";\n this.tableName = options.tableName || \"EcoAccount\";\n this.autoMigrate = options.autoMigrate ?? true;\n } else {\n // Raw client passed directly\n this.client = options;\n this.modelName = \"ecoAccount\";\n this.tableName = \"EcoAccount\";\n this.autoMigrate = true;\n }\n }\n\n private async ensureMigrated(): Promise<void> {\n if (this.migrated || !this.autoMigrate || !this.client) return;\n this.migrated = true;\n\n // If client delegate already exists, migration was likely handled by prisma migrate\n if (this.client[this.modelName]) {\n return;\n }\n\n // Attempt auto-creation via raw queries\n if (typeof this.client.$executeRawUnsafe === \"function\") {\n try {\n await this.client.$executeRawUnsafe(`\n CREATE TABLE IF NOT EXISTS \"${this.tableName}\" (\n \"userId\" VARCHAR(191) NOT NULL,\n \"guildId\" VARCHAR(191) NOT NULL DEFAULT '',\n \"wallet\" DOUBLE PRECISION NOT NULL DEFAULT 0,\n \"bank\" DOUBLE PRECISION NOT NULL DEFAULT 0,\n \"level\" INTEGER NOT NULL DEFAULT 1,\n \"data\" TEXT NOT NULL,\n \"updatedAt\" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n PRIMARY KEY (\"userId\", \"guildId\")\n );\n `);\n } catch {\n try {\n await this.client.$executeRawUnsafe(`\n CREATE TABLE IF NOT EXISTS ${this.tableName} (\n userId TEXT NOT NULL,\n guildId TEXT NOT NULL DEFAULT '',\n wallet REAL NOT NULL DEFAULT 0,\n bank REAL NOT NULL DEFAULT 0,\n level INTEGER NOT NULL DEFAULT 1,\n data TEXT NOT NULL,\n updatedAt DATETIME DEFAULT CURRENT_TIMESTAMP,\n PRIMARY KEY (userId, guildId)\n );\n `);\n } catch {\n // Table exists or database permissions prohibit DDL\n }\n }\n }\n }\n\n public async getAccount(userId: string, guildId?: string): Promise<UserAccount | null> {\n await this.ensureMigrated();\n const gid = guildId || \"\";\n\n const delegate = this.client[this.modelName];\n if (delegate && typeof delegate.findUnique === \"function\") {\n try {\n const record = await delegate.findUnique({\n where: {\n userId_guildId: { userId, guildId: gid },\n },\n });\n if (!record || !record.data) return null;\n return typeof record.data === \"string\" ? JSON.parse(record.data) : (record.data as UserAccount);\n } catch {\n // Fallback to findFirst in case composite primary key differs\n try {\n const record = await delegate.findFirst({\n where: { userId, guildId: gid },\n });\n if (!record || !record.data) return null;\n return typeof record.data === \"string\" ? JSON.parse(record.data) : (record.data as UserAccount);\n } catch {\n return null;\n }\n }\n }\n\n // Fallback using raw queries if model delegate is not yet compiled in prisma client\n if (typeof this.client.$queryRawUnsafe === \"function\") {\n try {\n const rows: any[] = await this.client.$queryRawUnsafe(\n `SELECT \"data\" FROM \"${this.tableName}\" WHERE \"userId\" = $1 AND \"guildId\" = $2 LIMIT 1`,\n userId,\n gid\n );\n if (rows && rows.length > 0 && rows[0].data) {\n return JSON.parse(rows[0].data);\n }\n } catch {\n try {\n const rows: any[] = await this.client.$queryRawUnsafe(\n `SELECT data FROM ${this.tableName} WHERE userId = ? AND guildId = ? LIMIT 1`,\n userId,\n gid\n );\n if (rows && rows.length > 0 && rows[0].data) {\n return JSON.parse(rows[0].data);\n }\n } catch {\n return null;\n }\n }\n }\n\n return null;\n }\n\n public async saveAccount(account: UserAccount): Promise<void> {\n await this.ensureMigrated();\n account.updatedAt = Date.now();\n const gid = account.guildId || \"\";\n const serialized = JSON.stringify(account);\n\n const delegate = this.client[this.modelName];\n if (delegate && typeof delegate.upsert === \"function\") {\n try {\n await delegate.upsert({\n where: {\n userId_guildId: { userId: account.userId, guildId: gid },\n },\n update: {\n wallet: account.wallet,\n bank: account.bank,\n level: account.level,\n data: serialized,\n updatedAt: new Date(account.updatedAt),\n },\n create: {\n userId: account.userId,\n guildId: gid,\n wallet: account.wallet,\n bank: account.bank,\n level: account.level,\n data: serialized,\n updatedAt: new Date(account.updatedAt),\n },\n });\n return;\n } catch {\n // Fall through to raw query fallback\n }\n }\n\n // Raw query execution fallback\n if (typeof this.client.$executeRawUnsafe === \"function\") {\n try {\n await this.client.$executeRawUnsafe(\n `\n INSERT INTO \"${this.tableName}\" (\"userId\", \"guildId\", \"wallet\", \"bank\", \"level\", \"data\", \"updatedAt\")\n VALUES ($1, $2, $3, $4, $5, $6, NOW())\n ON CONFLICT (\"userId\", \"guildId\") DO UPDATE SET\n \"wallet\" = EXCLUDED.\"wallet\",\n \"bank\" = EXCLUDED.\"bank\",\n \"level\" = EXCLUDED.\"level\",\n \"data\" = EXCLUDED.\"data\",\n \"updatedAt\" = NOW()\n `,\n account.userId,\n gid,\n account.wallet,\n account.bank,\n account.level,\n serialized\n );\n } catch {\n // SQLite dialect fallback\n await this.client.$executeRawUnsafe(\n `\n INSERT INTO ${this.tableName} (userId, guildId, wallet, bank, level, data, updatedAt)\n VALUES (?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)\n ON CONFLICT(userId, guildId) DO UPDATE SET\n wallet = excluded.wallet,\n bank = excluded.bank,\n level = excluded.level,\n data = excluded.data,\n updatedAt = CURRENT_TIMESTAMP\n `,\n account.userId,\n gid,\n account.wallet,\n account.bank,\n account.level,\n serialized\n );\n }\n }\n }\n\n public async getTopAccounts(\n sortBy: \"netWorth\" | \"wallet\" | \"bank\" | \"level\" = \"netWorth\",\n limit: number = 10,\n guildId?: string\n ): Promise<UserAccount[]> {\n await this.ensureMigrated();\n const gid = guildId || undefined;\n const delegate = this.client[this.modelName];\n\n if (delegate && typeof delegate.findMany === \"function\") {\n try {\n let orderBy: any = {};\n if (sortBy === \"wallet\") orderBy = { wallet: \"desc\" };\n else if (sortBy === \"bank\") orderBy = { bank: \"desc\" };\n else if (sortBy === \"level\") orderBy = { level: \"desc\" };\n\n const records = await delegate.findMany({\n where: gid ? { guildId: gid } : undefined,\n orderBy: Object.keys(orderBy).length > 0 ? orderBy : undefined,\n take: sortBy === \"netWorth\" ? undefined : limit,\n });\n\n const list = records\n .map((r: any) => (typeof r.data === \"string\" ? JSON.parse(r.data) : r.data))\n .filter(Boolean) as UserAccount[];\n\n if (sortBy === \"netWorth\") {\n list.sort((a, b) => b.wallet + b.bank - (a.wallet + a.bank));\n return list.slice(0, limit);\n }\n return list;\n } catch {\n // Fall through to getAll fallback\n }\n }\n\n const all = await this.getAllAccounts(guildId);\n return all\n .sort((a, b) => {\n if (sortBy === \"wallet\") return b.wallet - a.wallet;\n if (sortBy === \"bank\") return b.bank - a.bank;\n if (sortBy === \"level\") return b.level - a.level;\n return b.wallet + b.bank - (a.wallet + a.bank);\n })\n .slice(0, limit);\n }\n\n public async getAllAccounts(guildId?: string): Promise<UserAccount[]> {\n await this.ensureMigrated();\n const gid = guildId || undefined;\n const delegate = this.client[this.modelName];\n\n if (delegate && typeof delegate.findMany === \"function\") {\n try {\n const records = await delegate.findMany({\n where: gid ? { guildId: gid } : undefined,\n });\n return records\n .map((r: any) => (typeof r.data === \"string\" ? JSON.parse(r.data) : r.data))\n .filter(Boolean) as UserAccount[];\n } catch {\n // Fall through\n }\n }\n\n if (typeof this.client.$queryRawUnsafe === \"function\") {\n try {\n const rows: any[] = gid\n ? await this.client.$queryRawUnsafe(`SELECT data FROM ${this.tableName} WHERE guildId = ?`, gid)\n : await this.client.$queryRawUnsafe(`SELECT data FROM ${this.tableName}`);\n return rows.map((r) => JSON.parse(r.data)).filter(Boolean);\n } catch {\n return [];\n }\n }\n\n return [];\n }\n}\n\n","/**\n * @m3rcena/eco\n * Unified Database Handler and Factory for SQLite, Prisma, JSON, and Memory storage.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { EcoStorageAdapter, MemoryEcoStorage, JsonEcoStorage } from \"./EcoStorage.js\";\nimport { SqliteEcoStorage, SqliteEcoStorageOptions } from \"./SqliteEcoStorage.js\";\nimport { PrismaEcoStorage, PrismaEcoStorageOptions, PRISMA_ECO_MODEL, applyPrismaEcoModel } from \"./PrismaEcoStorage.js\";\nimport { EcoDatabaseConfig } from \"../types.js\";\n\nexport class EcoDatabaseHandler {\n /**\n * Instantiates the requested database storage adapter based on developer configuration.\n */\n public static create(config?: EcoDatabaseConfig): EcoStorageAdapter {\n if (!config || config === \"memory\") {\n return new MemoryEcoStorage();\n }\n\n if (config === \"sqlite\") {\n return new SqliteEcoStorage(\"./eco.sqlite\");\n }\n\n if (config === \"json\") {\n return new JsonEcoStorage(\"./eco-data.json\");\n }\n\n if (typeof config === \"object\") {\n if (config.type === \"sqlite\") {\n return new SqliteEcoStorage(config.path || \"./eco.sqlite\");\n }\n\n if (config.type === \"prisma\") {\n return new PrismaEcoStorage({\n client: config.client,\n model: config.model || \"ecoAccount\",\n autoMigrate: config.autoMigrate ?? true,\n });\n }\n\n if (config.type === \"json\") {\n return new JsonEcoStorage(config.path || \"./eco-data.json\");\n }\n\n if (config.type === \"memory\") {\n return new MemoryEcoStorage();\n }\n }\n\n // Default fallback\n return new MemoryEcoStorage();\n }\n\n /**\n * Helper utility to automatically append the EcoAccount model to schema.prisma.\n */\n public static applyPrismaSchema(schemaPath: string = \"prisma/schema.prisma\"): boolean {\n return applyPrismaEcoModel(schemaPath);\n }\n}\n\n/**\n * Convenience helper to resolve an EcoStorageAdapter from either an existing storage instance or database config.\n */\nexport function resolveEcoStorage(options: { storage?: any; database?: EcoDatabaseConfig }): EcoStorageAdapter {\n if (options.storage && typeof options.storage === \"object\" && typeof options.storage.getAccount === \"function\") {\n return options.storage;\n }\n if (typeof options.storage === \"string\") {\n return EcoDatabaseHandler.create(options.storage as any);\n }\n if (options.database) {\n return EcoDatabaseHandler.create(options.database);\n }\n return new MemoryEcoStorage();\n}\n\n","/**\n * @m3rcena/eco\n * Bank & Wallet Management System.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { EcoStorageAdapter, createDefaultAccount } from \"../storage/EcoStorage.js\";\nimport { TransferResult, UserAccount } from \"../types.js\";\n\nexport class BankManager {\n private storage: EcoStorageAdapter;\n private defaultWallet: number;\n private defaultBankCap: number;\n private transactionFee: number;\n\n constructor(\n storage: EcoStorageAdapter,\n options: { defaultWallet?: number; defaultBankCap?: number; transactionFee?: number } = {}\n ) {\n this.storage = storage;\n this.defaultWallet = options.defaultWallet ?? 500;\n this.defaultBankCap = options.defaultBankCap ?? 10000;\n this.transactionFee = options.transactionFee ?? 0;\n }\n\n public async getAccount(userId: string, guildId?: string): Promise<UserAccount> {\n let acc = await this.storage.getAccount(userId, guildId);\n if (!acc) {\n acc = createDefaultAccount(userId, guildId, this.defaultWallet, this.defaultBankCap);\n await this.storage.saveAccount(acc);\n }\n return acc;\n }\n\n public async saveAccount(account: UserAccount): Promise<void> {\n await this.storage.saveAccount(account);\n }\n\n /**\n * Deposits cash from wallet into the bank up to bank capacity.\n */\n public async deposit(\n userId: string,\n amount: number | \"all\",\n guildId?: string\n ): Promise<{ success: boolean; deposited: number; wallet: number; bank: number; error?: string }> {\n const acc = await this.getAccount(userId, guildId);\n\n const availableSpace = Math.max(0, acc.bankCapacity - acc.bank);\n if (availableSpace <= 0) {\n return { success: false, deposited: 0, wallet: acc.wallet, bank: acc.bank, error: \"Bank capacity is full!\" };\n }\n\n const maxCanDeposit = Math.min(acc.wallet, availableSpace);\n const toDeposit = amount === \"all\" ? maxCanDeposit : Math.min(amount, maxCanDeposit);\n\n if (toDeposit <= 0) {\n return { success: false, deposited: 0, wallet: acc.wallet, bank: acc.bank, error: \"No funds available to deposit.\" };\n }\n\n acc.wallet -= toDeposit;\n acc.bank += toDeposit;\n await this.saveAccount(acc);\n\n return { success: true, deposited: toDeposit, wallet: acc.wallet, bank: acc.bank };\n }\n\n /**\n * Withdraws cash from bank to wallet.\n */\n public async withdraw(\n userId: string,\n amount: number | \"all\",\n guildId?: string\n ): Promise<{ success: boolean; withdrawn: number; wallet: number; bank: number; error?: string }> {\n const acc = await this.getAccount(userId, guildId);\n\n const toWithdraw = amount === \"all\" ? acc.bank : Math.min(amount, acc.bank);\n if (toWithdraw <= 0) {\n return { success: false, withdrawn: 0, wallet: acc.wallet, bank: acc.bank, error: \"Insufficient bank funds.\" };\n }\n\n acc.bank -= toWithdraw;\n acc.wallet += toWithdraw;\n await this.saveAccount(acc);\n\n return { success: true, withdrawn: toWithdraw, wallet: acc.wallet, bank: acc.bank };\n }\n\n /**\n * Transfers funds from one user's wallet to another.\n */\n public async transfer(\n fromUserId: string,\n toUserId: string,\n amount: number,\n guildId?: string\n ): Promise<TransferResult> {\n if (fromUserId === toUserId) {\n return {\n success: false,\n fromUserId,\n toUserId,\n amount: 0,\n fee: 0,\n fromWallet: 0,\n toWallet: 0,\n error: \"Cannot transfer funds to yourself.\",\n };\n }\n\n if (amount <= 0) {\n return {\n success: false,\n fromUserId,\n toUserId,\n amount: 0,\n fee: 0,\n fromWallet: 0,\n toWallet: 0,\n error: \"Transfer amount must be greater than zero.\",\n };\n }\n\n const sender = await this.getAccount(fromUserId, guildId);\n if (sender.wallet < amount) {\n return {\n success: false,\n fromUserId,\n toUserId,\n amount: 0,\n fee: 0,\n fromWallet: sender.wallet,\n toWallet: 0,\n error: \"Insufficient wallet funds.\",\n };\n }\n\n const fee = Math.floor(amount * this.transactionFee);\n const amountReceived = amount - fee;\n\n const receiver = await this.getAccount(toUserId, guildId);\n\n sender.wallet -= amount;\n sender.stats.totalSpent += amount;\n\n receiver.wallet += amountReceived;\n receiver.stats.totalEarned += amountReceived;\n\n await this.saveAccount(sender);\n await this.saveAccount(receiver);\n\n return {\n success: true,\n fromUserId,\n toUserId,\n amount: amountReceived,\n fee,\n fromWallet: sender.wallet,\n toWallet: receiver.wallet,\n };\n }\n\n /**\n * Upgrades bank capacity for a fee.\n */\n public async upgradeCapacity(\n userId: string,\n additionalCapacity: number,\n cost: number,\n guildId?: string\n ): Promise<{ success: boolean; newCapacity: number; wallet: number; error?: string }> {\n const acc = await this.getAccount(userId, guildId);\n if (acc.wallet < cost) {\n return {\n success: false,\n newCapacity: acc.bankCapacity,\n wallet: acc.wallet,\n error: `Insufficient funds. Upgrade requires ${cost} coins.`,\n };\n }\n\n acc.wallet -= cost;\n acc.bankCapacity += additionalCapacity;\n acc.stats.totalSpent += cost;\n await this.saveAccount(acc);\n\n return { success: true, newCapacity: acc.bankCapacity, wallet: acc.wallet };\n }\n\n /**\n * Adds cash to wallet.\n */\n public async addWallet(userId: string, amount: number, guildId?: string): Promise<number> {\n const { newBalance } = await this.modifyWallet(userId, Math.max(0, amount), guildId);\n return newBalance;\n }\n\n /**\n * Removes cash from wallet.\n */\n public async removeWallet(userId: string, amount: number, guildId?: string): Promise<number> {\n const { newBalance } = await this.modifyWallet(userId, -Math.abs(amount), guildId);\n return newBalance;\n }\n\n /**\n * Adds or subtracts wallet balance directly (admin/reward action).\n */\n public async modifyWallet(\n userId: string,\n delta: number,\n guildId?: string\n ): Promise<{ newBalance: number }> {\n const acc = await this.getAccount(userId, guildId);\n acc.wallet = Math.max(0, acc.wallet + delta);\n if (delta > 0) acc.stats.totalEarned += delta;\n if (delta < 0) acc.stats.totalSpent += Math.abs(delta);\n await this.saveAccount(acc);\n return { newBalance: acc.wallet };\n }\n}\n","/**\n * @m3rcena/eco\n * Earning, Daily Streaks, Work, Crime, and Robbery System.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { BankManager } from \"./BankManager.js\";\nimport { RobResult } from \"../types.js\";\n\nconst DEFAULT_COOLDOWNS = {\n daily: 24 * 60 * 60 * 1000,\n weekly: 7 * 24 * 60 * 60 * 1000,\n monthly: 30 * 24 * 60 * 60 * 1000,\n hourly: 60 * 60 * 1000,\n work: 30 * 60 * 1000,\n beg: 5 * 60 * 1000,\n crime: 45 * 60 * 1000,\n rob: 2 * 60 * 60 * 1000,\n};\n\nconst BEG_RESPONSES = [\n { npc: \"Mr. Beast\", quote: \"I just tipped you a chunk of cash!\", min: 100, max: 400 },\n { npc: \"Generous Grandma\", quote: \"Here is some sweet candy money, dear.\", min: 50, max: 200 },\n { npc: \"Homeless Veteran\", quote: \"Sharing what little I have left, stay safe.\", min: 10, max: 80 },\n { npc: \"Tech Bro\", quote: \"Take some crypto change, to the moon!\", min: 80, max: 350 },\n { npc: \"Street Busker\", quote: \"A little coin for appreciating my tunes.\", min: 40, max: 150 },\n];\n\nexport class RewardManager {\n private bank: BankManager;\n private cooldowns: Record<string, number>;\n\n constructor(bank: BankManager, customCooldowns: Record<string, number> = {}) {\n this.bank = bank;\n this.cooldowns = { ...DEFAULT_COOLDOWNS, ...customCooldowns };\n }\n\n private checkCooldown(lastUsed: number | undefined, cooldownMs: number): { onCooldown: boolean; remainingMs: number } {\n if (!lastUsed) return { onCooldown: false, remainingMs: 0 };\n const elapsed = Date.now() - lastUsed;\n if (elapsed < cooldownMs) {\n return { onCooldown: true, remainingMs: cooldownMs - elapsed };\n }\n return { onCooldown: false, remainingMs: 0 };\n }\n\n /**\n * Claims the daily reward with streak multipliers.\n */\n public async claimDaily(\n userId: string,\n guildId?: string\n ): Promise<{\n success: boolean;\n amount: number;\n rewardAmount: number;\n streak: number;\n isMilestone: boolean;\n jackpotMilestone?: boolean;\n remainingMs?: number;\n cooldownRemainingMs?: number;\n }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const { onCooldown, remainingMs } = this.checkCooldown(acc.streak.lastDaily, this.cooldowns.daily);\n\n if (onCooldown) {\n return {\n success: false,\n amount: 0,\n rewardAmount: 0,\n streak: acc.streak.daily,\n isMilestone: false,\n jackpotMilestone: false,\n remainingMs,\n cooldownRemainingMs: remainingMs,\n };\n }\n\n // Streak calculation (reset if missed by > 48 hours)\n const missedStreak = acc.streak.lastDaily && Date.now() - acc.streak.lastDaily > 48 * 60 * 60 * 1000;\n const currentStreak = missedStreak ? 1 : (acc.streak.daily || 0) + 1;\n acc.streak.daily = currentStreak;\n acc.streak.lastDaily = Date.now();\n\n // Base: 1000 + 100 per streak day (up to day 30), Day 7 has 2x jackpot\n const isMilestone = currentStreak % 7 === 0;\n const baseAmount = 1000 + Math.min(currentStreak, 30) * 100;\n const finalAmount = isMilestone ? baseAmount * 2 : baseAmount;\n\n acc.wallet += finalAmount;\n acc.stats.totalEarned += finalAmount;\n acc.xp += 100;\n this.checkLevelUp(acc);\n\n await this.bank.saveAccount(acc);\n return {\n success: true,\n amount: finalAmount,\n rewardAmount: finalAmount,\n streak: currentStreak,\n isMilestone,\n jackpotMilestone: isMilestone,\n };\n }\n\n /**\n * Claims weekly reward bonus.\n */\n public async claimWeekly(\n userId: string,\n guildId?: string\n ): Promise<{ success: boolean; amount: number; rewardAmount: number; remainingMs?: number; cooldownRemainingMs?: number }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const { onCooldown, remainingMs } = this.checkCooldown(acc.streak.lastWeekly, this.cooldowns.weekly);\n\n if (onCooldown) {\n return { success: false, amount: 0, rewardAmount: 0, remainingMs, cooldownRemainingMs: remainingMs };\n }\n\n const reward = 5000 + acc.level * 500;\n acc.wallet += reward;\n acc.stats.totalEarned += reward;\n acc.xp += 300;\n acc.streak.lastWeekly = Date.now();\n this.checkLevelUp(acc);\n await this.bank.saveAccount(acc);\n\n return { success: true, amount: reward, rewardAmount: reward };\n }\n\n /**\n * Claims monthly reward bonus.\n */\n public async claimMonthly(\n userId: string,\n guildId?: string\n ): Promise<{ success: boolean; amount: number; rewardAmount: number; remainingMs?: number; cooldownRemainingMs?: number }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const { onCooldown, remainingMs } = this.checkCooldown(acc.streak.lastMonthly, this.cooldowns.monthly);\n\n if (onCooldown) {\n return { success: false, amount: 0, rewardAmount: 0, remainingMs, cooldownRemainingMs: remainingMs };\n }\n\n const reward = 25000 + acc.level * 2500;\n acc.wallet += reward;\n acc.stats.totalEarned += reward;\n acc.xp += 1500;\n acc.streak.lastMonthly = Date.now();\n this.checkLevelUp(acc);\n await this.bank.saveAccount(acc);\n\n return { success: true, amount: reward, rewardAmount: reward };\n }\n\n /**\n * Claims hourly allowance.\n */\n public async claimHourly(\n userId: string,\n guildId?: string\n ): Promise<{ success: boolean; amount: number; rewardAmount: number; remainingMs?: number; cooldownRemainingMs?: number }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const { onCooldown, remainingMs } = this.checkCooldown(acc.streak.lastHourly, this.cooldowns.hourly);\n\n if (onCooldown) {\n return { success: false, amount: 0, rewardAmount: 0, remainingMs, cooldownRemainingMs: remainingMs };\n }\n\n const reward = 150 + acc.level * 25;\n acc.wallet += reward;\n acc.stats.totalEarned += reward;\n acc.streak.lastHourly = Date.now();\n await this.bank.saveAccount(acc);\n\n return { success: true, amount: reward, rewardAmount: reward };\n }\n\n /**\n * Completes a work shift.\n */\n public async work(\n userId: string,\n guildId?: string,\n bonusSalary: number = 0\n ): Promise<{\n success: boolean;\n earned: number;\n earnedAmount: number;\n xp: number;\n xpEarned: number;\n jobTitle: string;\n remainingMs?: number;\n cooldownRemainingMs?: number;\n }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const { onCooldown, remainingMs } = this.checkCooldown(acc.streak.lastWork, this.cooldowns.work);\n\n if (onCooldown) {\n return {\n success: false,\n earned: 0,\n earnedAmount: 0,\n xp: 0,\n xpEarned: 0,\n jobTitle: acc.career?.jobTitle || \"Freelancer\",\n remainingMs,\n cooldownRemainingMs: remainingMs,\n };\n }\n\n const jobTitle = acc.career?.jobTitle || \"Freelancer\";\n const baseSalary = bonusSalary > 0 ? bonusSalary : (acc.career ? 300 + acc.career.level * 150 : 200);\n const variance = Math.floor(Math.random() * 100) - 30;\n const earned = Math.max(50, baseSalary + variance);\n const xpEarned = 50 + (acc.career?.level || 1) * 10;\n\n acc.wallet += earned;\n acc.stats.totalEarned += earned;\n acc.stats.jobsCompleted++;\n acc.xp += xpEarned;\n acc.streak.lastWork = Date.now();\n\n if (acc.career) {\n acc.career.shiftsCompleted++;\n }\n\n this.checkLevelUp(acc);\n await this.bank.saveAccount(acc);\n\n return { success: true, earned, earnedAmount: earned, xp: xpEarned, xpEarned, jobTitle };\n }\n\n /**\n * Begs for coins from random NPCs.\n */\n public async beg(\n userId: string,\n guildId?: string\n ): Promise<{\n success: boolean;\n earned: number;\n npc: string;\n donor: string;\n quote: string;\n remainingMs?: number;\n cooldownRemainingMs?: number;\n }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const { onCooldown, remainingMs } = this.checkCooldown(acc.streak.lastBeg, this.cooldowns.beg);\n\n if (onCooldown) {\n return { success: false, earned: 0, npc: \"\", donor: \"\", quote: \"\", remainingMs, cooldownRemainingMs: remainingMs };\n }\n\n // 20% pity fail chance\n const isSuccess = Math.random() > 0.2;\n acc.streak.lastBeg = Date.now();\n\n if (!isSuccess) {\n await this.bank.saveAccount(acc);\n return {\n success: false,\n earned: 0,\n npc: \"Grumpy Stranger\",\n donor: \"Grumpy Stranger\",\n quote: \"Get a job, kid! Nothing for you.\",\n };\n }\n\n const pick = BEG_RESPONSES[Math.floor(Math.random() * BEG_RESPONSES.length)];\n const earned = Math.floor(Math.random() * (pick.max - pick.min + 1)) + pick.min;\n\n acc.wallet += earned;\n acc.stats.totalEarned += earned;\n await this.bank.saveAccount(acc);\n\n return { success: true, earned, npc: pick.npc, donor: pick.npc, quote: pick.quote };\n }\n\n /**\n * Attempts an illicit crime for high stakes.\n */\n public async commitCrime(\n userId: string,\n guildId?: string\n ): Promise<{\n success: boolean;\n payout: number;\n earned?: number;\n fine: number;\n message: string;\n remainingMs?: number;\n cooldownRemainingMs?: number;\n }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const { onCooldown, remainingMs } = this.checkCooldown(acc.streak.lastCrime, this.cooldowns.crime);\n\n if (onCooldown) {\n return {\n success: false,\n payout: 0,\n earned: 0,\n fine: 0,\n message: \"Police heat is too high!\",\n remainingMs,\n cooldownRemainingMs: remainingMs,\n };\n }\n\n acc.streak.lastCrime = Date.now();\n\n // 55% success rate\n const isSuccess = Math.random() < 0.55;\n\n if (isSuccess) {\n const payout = Math.floor(Math.random() * 800) + 400; // 400 - 1200\n acc.wallet += payout;\n acc.stats.totalEarned += payout;\n acc.xp += 120;\n this.checkLevelUp(acc);\n await this.bank.saveAccount(acc);\n\n return {\n success: true,\n payout,\n earned: payout,\n fine: 0,\n message: `You successfully hacked a high-frequency trading server and laundered ${payout} coins!`,\n };\n } else {\n const fine = Math.min(acc.wallet, Math.floor(Math.random() * 400) + 200);\n acc.wallet -= fine;\n acc.stats.totalSpent += fine;\n await this.bank.saveAccount(acc);\n\n return {\n success: false,\n payout: 0,\n earned: 0,\n fine,\n message: `The police caught you red-handed! You paid a bail fine of ${fine} coins.`,\n };\n }\n }\n\n /**\n * Alias for commitCrime.\n */\n public async crime(\n userId: string,\n guildId?: string\n ): Promise<{\n success: boolean;\n payout: number;\n earned?: number;\n fine: number;\n message: string;\n remainingMs?: number;\n cooldownRemainingMs?: number;\n }> {\n return this.commitCrime(userId, guildId);\n }\n\n /**\n * Attempts to rob another player's wallet.\n */\n public async rob(\n robberId: string,\n victimId: string,\n guildId?: string\n ): Promise<RobResult> {\n if (robberId === victimId) {\n return {\n success: false,\n robberId,\n victimId,\n amountStolen: 0,\n robberWallet: 0,\n victimWallet: 0,\n message: \"You cannot rob yourself!\",\n };\n }\n\n const robber = await this.bank.getAccount(robberId, guildId);\n const { onCooldown } = this.checkCooldown(robber.streak.lastRob, this.cooldowns.rob);\n\n if (onCooldown) {\n return {\n success: false,\n robberId,\n victimId,\n amountStolen: 0,\n robberWallet: robber.wallet,\n victimWallet: 0,\n message: \"You are currently laying low. Wait before planning another robbery!\",\n };\n }\n\n if (robber.wallet < 200) {\n return {\n success: false,\n robberId,\n victimId,\n amountStolen: 0,\n robberWallet: robber.wallet,\n victimWallet: 0,\n message: \"You need at least 200 coins in your wallet to cover police fines if you fail!\",\n };\n }\n\n const victim = await this.bank.getAccount(victimId, guildId);\n if (victim.wallet < 100) {\n return {\n success: false,\n robberId,\n victimId,\n amountStolen: 0,\n robberWallet: robber.wallet,\n victimWallet: victim.wallet,\n message: \"Your target is broke! They have less than 100 coins in their wallet.\",\n };\n }\n\n robber.streak.lastRob = Date.now();\n\n // Check if victim has active shield/padlock effect\n const shieldIdx = victim.activeEffects.findIndex((e) => e.type === \"shield\" && e.expiresAt > Date.now());\n if (shieldIdx !== -1) {\n // Shield consumed\n victim.activeEffects.splice(shieldIdx, 1);\n const fine = Math.min(robber.wallet, 250);\n robber.wallet -= fine;\n robber.stats.totalSpent += fine;\n victim.stats.timesRobbed++;\n\n await this.bank.saveAccount(robber);\n await this.bank.saveAccount(victim);\n\n return {\n success: false,\n robberId,\n victimId,\n amountStolen: 0,\n finePaid: fine,\n blockedByShield: true,\n robberWallet: robber.wallet,\n victimWallet: victim.wallet,\n message: `Robbery failed! Target was protected by a high-security padlock shield. You paid ${fine} coins in fines!`,\n };\n }\n\n // 50% base success probability\n const isSuccess = Math.random() < 0.5;\n\n if (isSuccess) {\n const percent = Math.random() * 0.4 + 0.2; // 20% to 60% of wallet\n const stolen = Math.floor(victim.wallet * percent);\n\n victim.wallet -= stolen;\n victim.stats.timesRobbed++;\n\n robber.wallet += stolen;\n robber.stats.totalRobbed += stolen;\n robber.stats.totalEarned += stolen;\n\n await this.bank.saveAccount(robber);\n await this.bank.saveAccount(victim);\n\n return {\n success: true,\n robberId,\n victimId,\n amountStolen: stolen,\n blockedByShield: false,\n robberWallet: robber.wallet,\n victimWallet: victim.wallet,\n message: `Heist successful! You stealthily stole ${stolen} coins from their wallet!`,\n };\n } else {\n const fine = Math.min(robber.wallet, Math.floor(victim.wallet * 0.2) + 150);\n robber.wallet -= fine;\n robber.stats.totalSpent += fine;\n\n // Half the fine goes to the victim as compensation\n const comp = Math.floor(fine * 0.5);\n victim.wallet += comp;\n\n await this.bank.saveAccount(robber);\n await this.bank.saveAccount(victim);\n\n return {\n success: false,\n robberId,\n victimId,\n amountStolen: 0,\n finePaid: fine,\n blockedByShield: false,\n robberWallet: robber.wallet,\n victimWallet: victim.wallet,\n message: `You tripped the silent alarm and got tackled! You were fined ${fine} coins (half given to victim as compensation).`,\n };\n }\n }\n\n private checkLevelUp(acc: any): boolean {\n const requiredXp = acc.level * 500;\n if (acc.xp >= requiredXp) {\n acc.level++;\n acc.bankCapacity += 2500; // Bonus bank capacity on level up!\n return true;\n }\n return false;\n }\n}\n","/**\n * @m3rcena/eco\n * Career & Job Progression System.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { BankManager } from \"./BankManager.js\";\nimport { CareerJob, UserCareer } from \"../types.js\";\n\nexport const DEFAULT_JOBS: CareerJob[] = [\n {\n id: \"intern\",\n title: \"Junior Intern\",\n category: \"Corporate\",\n baseSalary: 250,\n minLevel: 1,\n requiredShiftsForPromotion: 3,\n description: \"Get coffee and organize files. A humble start.\",\n perk: \"+5% Work XP bonus\",\n },\n {\n id: \"barista\",\n title: \"Artisan Barista\",\n category: \"Hospitality\",\n baseSalary: 500,\n minLevel: 2,\n requiredShiftsForPromotion: 5,\n description: \"Brew espresso and master latte art for demanding customers.\",\n perk: \"Free daily energy boost\",\n },\n {\n id: \"software_engineer\",\n title: \"Full-Stack Developer\",\n category: \"Technology\",\n baseSalary: 1400,\n minLevel: 5,\n requiredShiftsForPromotion: 8,\n description: \"Write robust code, debug edge cases, and push releases.\",\n perk: \"+15% Salary bonus on promotions\",\n },\n {\n id: \"data_scientist\",\n title: \"AI & Data Scientist\",\n category: \"Technology\",\n baseSalary: 3000,\n minLevel: 10,\n requiredShiftsForPromotion: 12,\n description: \"Train neural networks and unlock algorithmic profits.\",\n perk: \"Increased Lucky Streak chance\",\n },\n {\n id: \"investment_banker\",\n title: \"Wall Street Banker\",\n category: \"Finance\",\n baseSalary: 6500,\n minLevel: 15,\n requiredShiftsForPromotion: 15,\n description: \"Leverage derivatives and manage multi-million dollar portfolios.\",\n perk: \"+20% Bank deposit capacity bonus\",\n },\n {\n id: \"cyber_syndicate_lead\",\n title: \"Syndicate Boss\",\n category: \"Underground\",\n baseSalary: 12500,\n minLevel: 20,\n requiredShiftsForPromotion: 20,\n description: \"Command underground operations from the shadows.\",\n perk: \"+25% Crime payout bonus\",\n },\n];\n\nexport class CareerManager {\n private bank: BankManager;\n private jobs: Map<string, CareerJob> = new Map();\n\n constructor(bank: BankManager, initialJobs: CareerJob[] = DEFAULT_JOBS) {\n this.bank = bank;\n for (const job of initialJobs) {\n this.jobs.set(job.id, job);\n }\n }\n\n /**\n * Returns all available jobs.\n */\n public getJobs(): CareerJob[] {\n return Array.from(this.jobs.values());\n }\n\n /**\n * Retrieves a job by ID.\n */\n public getJob(jobId: string): CareerJob | undefined {\n return this.jobs.get(jobId);\n }\n\n /**\n * Registers a new custom job.\n */\n public registerJob(job: CareerJob): void {\n this.jobs.set(job.id, job);\n }\n\n /**\n * Returns a user's current career.\n */\n public async getCareer(userId: string, guildId?: string): Promise<UserCareer | null> {\n const acc = await this.bank.getAccount(userId, guildId);\n return acc.career ?? null;\n }\n\n /**\n * Applies for a job. User must meet the minimum level requirement.\n */\n public async apply(\n userId: string,\n jobId: string,\n guildId?: string\n ): Promise<{ success: boolean; job?: CareerJob; error?: string }> {\n const job = this.jobs.get(jobId);\n if (!job) {\n return { success: false, error: `Job with ID \"${jobId}\" does not exist.` };\n }\n\n const acc = await this.bank.getAccount(userId, guildId);\n\n if (acc.level < job.minLevel) {\n return {\n success: false,\n error: `You need to be at least Level ${job.minLevel} to apply for ${job.title}. (Your level: ${acc.level})`,\n };\n }\n\n if (acc.career?.jobId === jobId) {\n return { success: false, error: `You are already employed as a ${job.title}!` };\n }\n\n acc.career = {\n jobId: job.id,\n jobTitle: job.title,\n level: 1,\n shiftsCompleted: 0,\n lastPromoted: Date.now(),\n };\n\n await this.bank.saveAccount(acc);\n return { success: true, job };\n }\n\n /**\n * Resigns from the current career.\n */\n public async resign(\n userId: string,\n guildId?: string\n ): Promise<{ success: boolean; previousJob?: string; error?: string }> {\n const acc = await this.bank.getAccount(userId, guildId);\n\n if (!acc.career) {\n return { success: false, error: \"You are not currently employed in any career.\" };\n }\n\n const prev = acc.career.jobTitle;\n acc.career = undefined;\n await this.bank.saveAccount(acc);\n\n return { success: true, previousJob: prev };\n }\n\n /**\n * Records a shift worked and checks for a promotion.\n */\n public async recordShift(\n userId: string,\n guildId?: string\n ): Promise<{\n hasCareer: boolean;\n promoted: boolean;\n newCareerLevel?: number;\n promotionBonus?: number;\n shiftsCompleted?: number;\n job?: CareerJob;\n }> {\n const acc = await this.bank.getAccount(userId, guildId);\n if (!acc.career) {\n return { hasCareer: false, promoted: false };\n }\n\n const job = this.jobs.get(acc.career.jobId);\n if (!job) {\n return { hasCareer: true, promoted: false };\n }\n\n acc.career.shiftsCompleted += 1;\n let promoted = false;\n let bonus = 0;\n\n // Check if eligible for promotion\n const requiredShifts = job.requiredShiftsForPromotion * acc.career.level;\n if (acc.career.shiftsCompleted >= requiredShifts) {\n acc.career.level += 1;\n acc.career.shiftsCompleted = 0;\n acc.career.lastPromoted = Date.now();\n promoted = true;\n\n // Promotion bonus = 2x base salary * new level\n bonus = job.baseSalary * 2 * acc.career.level;\n acc.wallet += bonus;\n acc.stats.totalEarned += bonus;\n }\n\n await this.bank.saveAccount(acc);\n\n return {\n hasCareer: true,\n promoted,\n newCareerLevel: acc.career.level,\n promotionBonus: bonus,\n shiftsCompleted: acc.career.shiftsCompleted,\n job,\n };\n }\n\n /**\n * Computes salary for a user based on their career and career level.\n */\n public calculateSalary(career?: UserCareer): number {\n if (!career) return 0;\n const job = this.jobs.get(career.jobId);\n if (!job) return 0;\n\n // Base salary + 25% extra per career level\n const multiplier = 1 + (career.level - 1) * 0.25;\n return Math.floor(job.baseSalary * multiplier);\n }\n}\n\n","/**\n * @m3rcena/eco\n * Shop, Inventory & Consumable Buff Items System.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { BankManager } from \"./BankManager.js\";\nimport { ActiveEffect, InventoryItem, ShopItem } from \"../types.js\";\n\nexport const DEFAULT_SHOP_ITEMS: ShopItem[] = [\n {\n id: \"padlock\",\n name: \"Titanium Padlock\",\n description: \"Equips a high-security lock to your wallet. Automatically blocks the next robbery attempt!\",\n price: 1500,\n category: \"tool\",\n consumable: true,\n usableEffect: \"shield\",\n effectDurationMs: 24 * 60 * 60 * 1000, // 24 hours\n resaleValue: 750,\n },\n {\n id: \"energy_drink\",\n name: \"Cyber Caffeine Overdrive\",\n description: \"Instant caffeine rush! Immediately resets your work shift cooldown.\",\n price: 800,\n category: \"consumable\",\n consumable: true,\n usableEffect: \"cooldown_reset\",\n resaleValue: 400,\n },\n {\n id: \"lucky_coin\",\n name: \"Enchanted Gold Coin\",\n description: \"A mystical coin favored by fortune. Grants +15% casino winning probability for 1 hour.\",\n price: 2500,\n category: \"consumable\",\n consumable: true,\n usableEffect: \"gamble_luck\",\n effectDurationMs: 60 * 60 * 1000, // 1 hour\n resaleValue: 1200,\n },\n {\n id: \"xp_potion\",\n name: \"Elixir of Knowledge\",\n description: \"Ancient brew that accelerates learning. Doubles all XP gains for 2 hours.\",\n price: 2000,\n category: \"consumable\",\n consumable: true,\n usableEffect: \"xp_boost\",\n effectDurationMs: 2 * 60 * 60 * 1000, // 2 hours\n resaleValue: 1000,\n },\n {\n id: \"bank_vault_key\",\n name: \"Swiss Vault Key\",\n description: \"Upgrades your safe deposit box, permanently expanding your bank capacity by +25,000.\",\n price: 15000,\n category: \"upgrade\",\n consumable: true,\n usableEffect: \"bank_capacity\",\n effectMagnitude: 25000,\n resaleValue: 8000,\n },\n {\n id: \"lottery_ticket\",\n name: \"Mega Millions Scratch Ticket\",\n description: \"Scratch to win! Offers a chance to win up to 50,000 cash.\",\n price: 500,\n category: \"consumable\",\n consumable: true,\n usableEffect: \"lottery\",\n resaleValue: 100,\n },\n {\n id: \"gold_watch\",\n name: \"Rolex Submariner Gold\",\n description: \"A luxury timepiece that exudes status and class.\",\n price: 12000,\n category: \"collectible\",\n consumable: false,\n resaleValue: 9500,\n },\n {\n id: \"diamond_trophy\",\n name: \"Championship Diamond Trophy\",\n description: \"A solid diamond trophy celebrating legendary wealth.\",\n price: 50000,\n category: \"collectible\",\n consumable: false,\n resaleValue: 42000,\n },\n];\n\nexport class ShopManager {\n private bank: BankManager;\n private items: Map<string, ShopItem> = new Map();\n\n constructor(bank: BankManager, initialItems: ShopItem[] = DEFAULT_SHOP_ITEMS) {\n this.bank = bank;\n for (const item of initialItems) {\n this.items.set(item.id, item);\n }\n }\n\n /**\n * Returns all items currently in the shop.\n */\n public getItems(): ShopItem[] {\n return Array.from(this.items.values());\n }\n\n /**\n * Retrieves an item by ID.\n */\n public getItem(itemId: string): ShopItem | undefined {\n return this.items.get(itemId);\n }\n\n /**\n * Registers a new item or updates an existing one in the shop catalog.\n */\n public registerItem(item: ShopItem): void {\n this.items.set(item.id, item);\n }\n\n /**\n * Cleans expired effects from an account.\n */\n private cleanExpiredEffects(effects: ActiveEffect[]): ActiveEffect[] {\n const now = Date.now();\n return effects.filter((e) => e.expiresAt > now);\n }\n\n /**\n * Purchases one or more units of an item.\n */\n public async buy(\n userId: string,\n itemId: string,\n quantity: number = 1,\n guildId?: string\n ): Promise<{\n success: boolean;\n item?: ShopItem;\n quantity: number;\n totalCost: number;\n newWallet: number;\n error?: string;\n }> {\n if (quantity <= 0) {\n return { success: false, quantity, totalCost: 0, newWallet: 0, error: \"Quantity must be greater than zero.\" };\n }\n\n const item = this.items.get(itemId);\n if (!item) {\n return { success: false, quantity, totalCost: 0, newWallet: 0, error: `Item \"${itemId}\" not found in the shop.` };\n }\n\n const acc = await this.bank.getAccount(userId, guildId);\n const totalCost = item.price * quantity;\n\n if (acc.wallet < totalCost) {\n return {\n success: false,\n item,\n quantity,\n totalCost,\n newWallet: acc.wallet,\n error: `Insufficient funds in your wallet! Needed: ${totalCost}, Available: ${acc.wallet}.`,\n };\n }\n\n // Deduct wallet\n acc.wallet -= totalCost;\n acc.stats.totalSpent += totalCost;\n acc.stats.itemsBought += quantity;\n\n // Add to inventory\n const existing = acc.inventory.find((i) => i.itemId === item.id);\n if (existing) {\n existing.quantity += quantity;\n } else {\n acc.inventory.push({\n id: `${item.id}_${Date.now()}`,\n itemId: item.id,\n name: item.name,\n description: item.description,\n quantity,\n category: item.category,\n acquiredAt: Date.now(),\n });\n }\n\n await this.bank.saveAccount(acc);\n\n return {\n success: true,\n item,\n quantity,\n totalCost,\n newWallet: acc.wallet,\n };\n }\n\n /**\n * Sells an item from inventory back to the store.\n */\n public async sell(\n userId: string,\n itemId: string,\n quantity: number = 1,\n guildId?: string\n ): Promise<{\n success: boolean;\n item?: ShopItem;\n quantity: number;\n earned: number;\n newWallet: number;\n error?: string;\n }> {\n if (quantity <= 0) {\n return { success: false, quantity, earned: 0, newWallet: 0, error: \"Quantity must be greater than zero.\" };\n }\n\n const acc = await this.bank.getAccount(userId, guildId);\n const invIndex = acc.inventory.findIndex((i) => i.itemId === itemId);\n if (invIndex === -1 || acc.inventory[invIndex].quantity < quantity) {\n const owned = invIndex !== -1 ? acc.inventory[invIndex].quantity : 0;\n return {\n success: false,\n quantity,\n earned: 0,\n newWallet: acc.wallet,\n error: `You do not own ${quantity}x of this item (owned: ${owned}).`,\n };\n }\n\n const shopItem = this.items.get(itemId);\n const unitPrice = shopItem?.resaleValue ?? (shopItem ? Math.floor(shopItem.price * 0.6) : 100);\n const totalEarned = unitPrice * quantity;\n\n // Deduct from inventory\n acc.inventory[invIndex].quantity -= quantity;\n if (acc.inventory[invIndex].quantity <= 0) {\n acc.inventory.splice(invIndex, 1);\n }\n\n acc.wallet += totalEarned;\n acc.stats.totalEarned += totalEarned;\n\n await this.bank.saveAccount(acc);\n\n return {\n success: true,\n item: shopItem,\n quantity,\n earned: totalEarned,\n newWallet: acc.wallet,\n };\n }\n\n /**\n * Uses/consumes an item from the user's inventory.\n */\n public async use(\n userId: string,\n itemId: string,\n guildId?: string\n ): Promise<{\n success: boolean;\n message: string;\n item?: ShopItem;\n effect?: ActiveEffect;\n lotteryWon?: number;\n error?: string;\n }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const invIndex = acc.inventory.findIndex((i) => i.itemId === itemId);\n if (invIndex === -1 || acc.inventory[invIndex].quantity <= 0) {\n return { success: false, message: \"\", error: \"You do not have this item in your inventory.\" };\n }\n\n const shopItem = this.items.get(itemId);\n if (!shopItem || !shopItem.consumable) {\n return { success: false, message: \"\", error: \"This item cannot be consumed or used directly.\" };\n }\n\n // Deduct 1 unit from inventory\n acc.inventory[invIndex].quantity -= 1;\n if (acc.inventory[invIndex].quantity <= 0) {\n acc.inventory.splice(invIndex, 1);\n }\n\n // Clean expired effects first\n acc.activeEffects = this.cleanExpiredEffects(acc.activeEffects);\n\n let message = `You used ${shopItem.name}.`;\n let activeEffect: ActiveEffect | undefined;\n let lotteryWon: number | undefined;\n\n switch (shopItem.usableEffect) {\n case \"shield\": {\n const duration = shopItem.effectDurationMs ?? 24 * 60 * 60 * 1000;\n activeEffect = {\n id: `shield_${Date.now()}`,\n name: \"Titanium Shield\",\n type: \"shield\",\n magnitude: 1,\n expiresAt: Date.now() + duration,\n };\n // Replace any existing shield\n acc.activeEffects = acc.activeEffects.filter((e) => e.type !== \"shield\");\n acc.activeEffects.push(activeEffect);\n message = `🛡️ ${shopItem.name} activated! Your wallet is protected from the next robbery attempt for 24 hours.`;\n break;\n }\n\n case \"cooldown_reset\": {\n acc.streak.lastWork = undefined;\n message = `⚡ ${shopItem.name} consumed! Your work shift cooldown has been completely reset. You can work now!`;\n break;\n }\n\n case \"gamble_luck\": {\n const duration = shopItem.effectDurationMs ?? 60 * 60 * 1000;\n activeEffect = {\n id: `luck_${Date.now()}`,\n name: \"Lady Luck's Favor\",\n type: \"gamble_luck\",\n magnitude: 15,\n expiresAt: Date.now() + duration,\n };\n acc.activeEffects = acc.activeEffects.filter((e) => e.type !== \"gamble_luck\");\n acc.activeEffects.push(activeEffect);\n message = `🍀 ${shopItem.name} activated! You have +15% enhanced luck at the casino for the next hour!`;\n break;\n }\n\n case \"xp_boost\": {\n const duration = shopItem.effectDurationMs ?? 2 * 60 * 60 * 1000;\n activeEffect = {\n id: `xp_${Date.now()}`,\n name: \"Double XP Elixir\",\n type: \"xp_boost\",\n magnitude: 2,\n expiresAt: Date.now() + duration,\n };\n acc.activeEffects = acc.activeEffects.filter((e) => e.type !== \"xp_boost\");\n acc.activeEffects.push(activeEffect);\n message = `✨ ${shopItem.name} activated! You will receive 2x XP from all jobs and activities for 2 hours!`;\n break;\n }\n\n case \"bank_capacity\": {\n const increase = shopItem.effectMagnitude ?? 25000;\n acc.bankCapacity += increase;\n message = `🔑 ${shopItem.name} used! Your bank capacity has been permanently increased by +${increase.toLocaleString()}! New Capacity: ${acc.bankCapacity.toLocaleString()}.`;\n break;\n }\n\n case \"lottery\": {\n // Roll lottery: 40% win nothing, 35% win small (200-1,000), 20% win medium (2,500-10,000), 5% jackpot (25,000-50,000)\n const roll = Math.random() * 100;\n if (roll < 40) {\n lotteryWon = 0;\n message = `🎫 You scratched the ticket... Unfortunately, it was a blank! Better luck next time!`;\n } else if (roll < 75) {\n lotteryWon = Math.floor(Math.random() * 800) + 200;\n acc.wallet += lotteryWon;\n acc.stats.totalEarned += lotteryWon;\n message = `🎫 Winning ticket! You won ${lotteryWon.toLocaleString()} in cash!`;\n } else if (roll < 95) {\n lotteryWon = Math.floor(Math.random() * 7500) + 2500;\n acc.wallet += lotteryWon;\n acc.stats.totalEarned += lotteryWon;\n message = `🎉 Big Win! You matched 3 lucky stars and won ${lotteryWon.toLocaleString()}!`;\n } else {\n lotteryWon = Math.floor(Math.random() * 25000) + 25000;\n acc.wallet += lotteryWon;\n acc.stats.totalEarned += lotteryWon;\n message = `💎 💥 JACKPOT! You scratched off the GRAND PRIZE of ${lotteryWon.toLocaleString()}!`;\n }\n break;\n }\n\n default:\n message = `You used ${shopItem.name}.`;\n }\n\n await this.bank.saveAccount(acc);\n\n return {\n success: true,\n message,\n item: shopItem,\n effect: activeEffect,\n lotteryWon,\n };\n }\n\n /**\n * Retrieves active, unexpired effects for a user.\n */\n public async getActiveEffects(userId: string, guildId?: string): Promise<ActiveEffect[]> {\n const acc = await this.bank.getAccount(userId, guildId);\n acc.activeEffects = this.cleanExpiredEffects(acc.activeEffects);\n return acc.activeEffects;\n }\n\n /**\n * Checks if a user has a specific effect active.\n */\n public async hasActiveEffect(userId: string, effectType: string, guildId?: string): Promise<boolean> {\n const active = await this.getActiveEffects(userId, guildId);\n return active.some((e) => e.type === effectType);\n }\n\n /**\n * Consumes an active effect (e.g. shield is spent when blocking robbery).\n */\n public async consumeActiveEffect(userId: string, effectType: string, guildId?: string): Promise<boolean> {\n const acc = await this.bank.getAccount(userId, guildId);\n acc.activeEffects = this.cleanExpiredEffects(acc.activeEffects);\n const idx = acc.activeEffects.findIndex((e) => e.type === effectType);\n if (idx !== -1) {\n acc.activeEffects.splice(idx, 1);\n await this.bank.saveAccount(acc);\n return true;\n }\n return false;\n }\n\n /**\n * Returns a user's inventory.\n */\n public async getInventory(userId: string, guildId?: string): Promise<InventoryItem[]> {\n const acc = await this.bank.getAccount(userId, guildId);\n return acc.inventory;\n }\n}\n\n","/**\n * @m3rcena/eco\n * Passive Business Investment & Automation System.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { BankManager } from \"./BankManager.js\";\nimport { BusinessConfig, UserBusiness } from \"../types.js\";\n\nexport const DEFAULT_BUSINESS_CATALOG: BusinessConfig[] = [\n {\n id: \"lemonade_stand\",\n name: \"Artisanal Lemonade Stand\",\n category: \"Small Business\",\n baseCost: 3000,\n baseHourlyRevenue: 200,\n upgradeCostMultiplier: 1.45,\n revenueMultiplier: 1.35,\n maxLevel: 10,\n description: \"A friendly neighborhood refreshment stand. Low investment, steady starter income.\",\n },\n {\n id: \"coffee_shop\",\n name: \"Urban Espresso Lounge\",\n category: \"Hospitality\",\n baseCost: 12500,\n baseHourlyRevenue: 950,\n upgradeCostMultiplier: 1.5,\n revenueMultiplier: 1.4,\n maxLevel: 10,\n description: \"Hip cafe serving pour-overs and pastries to bustling city commuters.\",\n },\n {\n id: \"tech_startup\",\n name: \"AI SaaS Enterprise\",\n category: \"Technology\",\n baseCost: 65000,\n baseHourlyRevenue: 5200,\n upgradeCostMultiplier: 1.6,\n revenueMultiplier: 1.45,\n maxLevel: 15,\n description: \"High-growth tech company delivering subscription AI services globally.\",\n },\n {\n id: \"crypto_mine\",\n name: \"Geothermal Crypto Mine\",\n category: \"Finance & Web3\",\n baseCost: 280000,\n baseHourlyRevenue: 24000,\n upgradeCostMultiplier: 1.7,\n revenueMultiplier: 1.5,\n maxLevel: 20,\n description: \"Mega-scale ASIC mining facility powered by green renewable energy.\",\n },\n {\n id: \"space_corp\",\n name: \"Orbital Cargo Logistics\",\n category: \"Aerospace\",\n baseCost: 1500000,\n baseHourlyRevenue: 150000,\n upgradeCostMultiplier: 1.85,\n revenueMultiplier: 1.6,\n maxLevel: 25,\n description: \"Interplanetary transport fleet delivering helium-3 and rare space minerals.\",\n },\n];\n\nexport class BusinessManager {\n private bank: BankManager;\n private catalog: Map<string, BusinessConfig> = new Map();\n private maxAccumulationHours: number;\n\n constructor(\n bank: BankManager,\n initialCatalog: BusinessConfig[] = DEFAULT_BUSINESS_CATALOG,\n maxAccumulationHours: number = 24\n ) {\n this.bank = bank;\n this.maxAccumulationHours = maxAccumulationHours;\n for (const b of initialCatalog) {\n this.catalog.set(b.id, b);\n }\n }\n\n /**\n * Returns all available businesses in the catalog.\n */\n public getCatalog(): BusinessConfig[] {\n return Array.from(this.catalog.values());\n }\n\n /**\n * Retrieves business configuration by ID.\n */\n public getBusinessConfig(id: string): BusinessConfig | undefined {\n return this.catalog.get(id);\n }\n\n /**\n * Registers a new custom business.\n */\n public registerBusiness(config: BusinessConfig): void {\n this.catalog.set(config.id, config);\n }\n\n /**\n * Calculates the upgrade cost for a business from its current level.\n */\n public calculateUpgradeCost(business: UserBusiness): number {\n const config = this.catalog.get(business.businessId);\n if (!config) return 0;\n return Math.floor(config.baseCost * Math.pow(config.upgradeCostMultiplier, business.level));\n }\n\n /**\n * Calculates employee hiring cost for a business.\n */\n public calculateEmployeeHiringCost(business: UserBusiness, count: number): number {\n const config = this.catalog.get(business.businessId);\n if (!config) return 0;\n const basePerEmployee = Math.floor(config.baseCost * 0.15);\n return basePerEmployee * count;\n }\n\n /**\n * Calculates the hourly revenue generated by a business.\n */\n public calculateHourlyRevenue(business: UserBusiness): number {\n const config = this.catalog.get(business.businessId);\n if (!config) return 0;\n\n const levelMultiplier = Math.pow(config.revenueMultiplier, business.level - 1);\n const employeeBonus = 1 + business.employees * 0.1; // +10% per employee\n return Math.floor(config.baseHourlyRevenue * levelMultiplier * employeeBonus);\n }\n\n /**\n * Computes pending unclaimed revenue for a business based on time elapsed.\n */\n public calculatePendingRevenue(business: UserBusiness): number {\n const elapsedMs = Math.max(0, Date.now() - business.lastCollected);\n const maxMs = this.maxAccumulationHours * 60 * 60 * 1000;\n const effectiveElapsedMs = Math.min(elapsedMs, maxMs);\n\n const hourly = this.calculateHourlyRevenue(business);\n const hours = effectiveElapsedMs / (60 * 60 * 1000);\n return Math.floor(hourly * hours);\n }\n\n /**\n * Retrieves all businesses owned by a user, enriched with pending revenue and stats.\n */\n public async getUserBusinesses(\n userId: string,\n guildId?: string\n ): Promise<\n Array<{\n business: UserBusiness;\n config: BusinessConfig;\n pendingRevenue: number;\n hourlyRevenue: number;\n upgradeCost: number;\n }>\n > {\n const acc = await this.bank.getAccount(userId, guildId);\n return acc.businesses\n .map((b) => {\n const config = this.catalog.get(b.businessId);\n if (!config) return null;\n return {\n business: b,\n config,\n pendingRevenue: this.calculatePendingRevenue(b),\n hourlyRevenue: this.calculateHourlyRevenue(b),\n upgradeCost: this.calculateUpgradeCost(b),\n };\n })\n .filter((b): b is NonNullable<typeof b> => b !== null);\n }\n\n /**\n * Purchases a new business enterprise.\n */\n public async buyBusiness(\n userId: string,\n businessId: string,\n guildId?: string\n ): Promise<{\n success: boolean;\n business?: UserBusiness;\n cost: number;\n newWallet: number;\n error?: string;\n }> {\n const config = this.catalog.get(businessId);\n if (!config) {\n return { success: false, cost: 0, newWallet: 0, error: `Business \"${businessId}\" does not exist in the catalog.` };\n }\n\n const acc = await this.bank.getAccount(userId, guildId);\n const alreadyOwns = acc.businesses.some((b) => b.businessId === businessId);\n if (alreadyOwns) {\n return {\n success: false,\n cost: 0,\n newWallet: acc.wallet,\n error: `You already own ${config.name}! Upgrade your existing facility instead.`,\n };\n }\n\n if (acc.wallet < config.baseCost) {\n return {\n success: false,\n cost: config.baseCost,\n newWallet: acc.wallet,\n error: `Insufficient funds! ${config.name} costs ${config.baseCost.toLocaleString()}, but you have ${acc.wallet.toLocaleString()}.`,\n };\n }\n\n acc.wallet -= config.baseCost;\n acc.stats.totalSpent += config.baseCost;\n\n const newBusiness: UserBusiness = {\n id: `${businessId}_${Date.now()}`,\n businessId: config.id,\n name: config.name,\n level: 1,\n employees: 0,\n lastCollected: Date.now(),\n totalCollected: 0,\n };\n\n acc.businesses.push(newBusiness);\n await this.bank.saveAccount(acc);\n\n return {\n success: true,\n business: newBusiness,\n cost: config.baseCost,\n newWallet: acc.wallet,\n };\n }\n\n /**\n * Upgrades an existing business level.\n */\n public async upgradeBusiness(\n userId: string,\n businessId: string,\n guildId?: string\n ): Promise<{\n success: boolean;\n business?: UserBusiness;\n newLevel: number;\n upgradeCost: number;\n newWallet: number;\n error?: string;\n }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const bIndex = acc.businesses.findIndex((b) => b.businessId === businessId);\n if (bIndex === -1) {\n return { success: false, newLevel: 0, upgradeCost: 0, newWallet: acc.wallet, error: \"You do not own this business.\" };\n }\n\n const business = acc.businesses[bIndex];\n const config = this.catalog.get(business.businessId);\n if (!config) {\n return { success: false, newLevel: 0, upgradeCost: 0, newWallet: acc.wallet, error: \"Business config not found.\" };\n }\n\n if (business.level >= config.maxLevel) {\n return {\n success: false,\n newLevel: business.level,\n upgradeCost: 0,\n newWallet: acc.wallet,\n error: `${business.name} is already at maximum level (${config.maxLevel})!`,\n };\n }\n\n const cost = this.calculateUpgradeCost(business);\n if (acc.wallet < cost) {\n return {\n success: false,\n newLevel: business.level,\n upgradeCost: cost,\n newWallet: acc.wallet,\n error: `Insufficient funds to upgrade! Cost: ${cost.toLocaleString()}, Wallet: ${acc.wallet.toLocaleString()}.`,\n };\n }\n\n acc.wallet -= cost;\n acc.stats.totalSpent += cost;\n business.level += 1;\n\n await this.bank.saveAccount(acc);\n\n return {\n success: true,\n business,\n newLevel: business.level,\n upgradeCost: cost,\n newWallet: acc.wallet,\n };\n }\n\n /**\n * Hires additional staff members to boost output.\n */\n public async hireEmployees(\n userId: string,\n businessId: string,\n count: number = 1,\n guildId?: string\n ): Promise<{\n success: boolean;\n business?: UserBusiness;\n totalEmployees: number;\n cost: number;\n newWallet: number;\n error?: string;\n }> {\n if (count <= 0) {\n return { success: false, totalEmployees: 0, cost: 0, newWallet: 0, error: \"Count must be greater than zero.\" };\n }\n\n const acc = await this.bank.getAccount(userId, guildId);\n const bIndex = acc.businesses.findIndex((b) => b.businessId === businessId);\n if (bIndex === -1) {\n return { success: false, totalEmployees: 0, cost: 0, newWallet: acc.wallet, error: \"You do not own this business.\" };\n }\n\n const business = acc.businesses[bIndex];\n const maxEmployees = business.level * 5;\n if (business.employees + count > maxEmployees) {\n return {\n success: false,\n totalEmployees: business.employees,\n cost: 0,\n newWallet: acc.wallet,\n error: `At Level ${business.level}, this business can only support up to ${maxEmployees} employees (current: ${business.employees}). Upgrade first!`,\n };\n }\n\n const cost = this.calculateEmployeeHiringCost(business, count);\n if (acc.wallet < cost) {\n return {\n success: false,\n totalEmployees: business.employees,\n cost,\n newWallet: acc.wallet,\n error: `Insufficient funds! Hiring ${count} employee(s) costs ${cost.toLocaleString()}, Wallet: ${acc.wallet.toLocaleString()}.`,\n };\n }\n\n acc.wallet -= cost;\n acc.stats.totalSpent += cost;\n business.employees += count;\n\n await this.bank.saveAccount(acc);\n\n return {\n success: true,\n business,\n totalEmployees: business.employees,\n cost,\n newWallet: acc.wallet,\n };\n }\n\n /**\n * Collects accumulated passive profits from all owned businesses or a specific business.\n */\n public async collectRevenue(\n userId: string,\n businessId?: string,\n guildId?: string\n ): Promise<{\n success: boolean;\n collected: number;\n newWallet: number;\n summary: Array<{ businessId: string; name: string; amount: number }>;\n error?: string;\n }> {\n const acc = await this.bank.getAccount(userId, guildId);\n if (acc.businesses.length === 0) {\n return { success: false, collected: 0, newWallet: acc.wallet, summary: [], error: \"You do not own any businesses yet.\" };\n }\n\n const targets = businessId\n ? acc.businesses.filter((b) => b.businessId === businessId)\n : acc.businesses;\n\n if (targets.length === 0) {\n return { success: false, collected: 0, newWallet: acc.wallet, summary: [], error: \"Selected business not found.\" };\n }\n\n let totalCollected = 0;\n const summary: Array<{ businessId: string; name: string; amount: number }> = [];\n\n for (const b of targets) {\n const revenue = this.calculatePendingRevenue(b);\n if (revenue > 0) {\n totalCollected += revenue;\n b.lastCollected = Date.now();\n b.totalCollected += revenue;\n summary.push({ businessId: b.businessId, name: b.name, amount: revenue });\n }\n }\n\n if (totalCollected <= 0) {\n return {\n success: false,\n collected: 0,\n newWallet: acc.wallet,\n summary: [],\n error: \"No profits have accumulated yet! Check back in a little while.\",\n };\n }\n\n acc.wallet += totalCollected;\n acc.stats.totalEarned += totalCollected;\n\n await this.bank.saveAccount(acc);\n\n return {\n success: true,\n collected: totalCollected,\n newWallet: acc.wallet,\n summary,\n };\n }\n}\n\n","/**\n * @m3rcena/eco\n * Casino & High-Stakes Gambling Engine.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { BankManager } from \"./BankManager.js\";\nimport { ShopManager } from \"./ShopManager.js\";\nimport { CasinoBetResult } from \"../types.js\";\n\nexport interface Card {\n suit: \"♠\" | \"♥\" | \"♦\" | \"♣\";\n rank: string;\n value: number;\n}\n\nexport interface BlackjackState {\n gameId: string;\n userId: string;\n guildId?: string;\n betAmount: number;\n deck: Card[];\n playerHand: Card[];\n dealerHand: Card[];\n status: \"playing\" | \"player_bust\" | \"dealer_bust\" | \"player_win\" | \"dealer_win\" | \"push\" | \"blackjack\";\n payout: number;\n finished: boolean;\n}\n\nexport class CasinoManager {\n private bank: BankManager;\n private shop?: ShopManager;\n private activeBlackjackGames: Map<string, BlackjackState> = new Map();\n\n constructor(bank: BankManager, shop?: ShopManager) {\n this.bank = bank;\n this.shop = shop;\n }\n\n public setShopManager(shop: ShopManager): void {\n this.shop = shop;\n }\n\n /**\n * Helper to check for active luck boost effect.\n */\n private async getLuckBoost(userId: string, guildId?: string): Promise<number> {\n if (!this.shop) return 0;\n const hasLuck = await this.shop.hasActiveEffect(userId, \"gamble_luck\", guildId);\n return hasLuck ? 0.12 : 0; // +12% probability bonus\n }\n\n /**\n * Pre-bet validation & deduction.\n */\n private async prepareBet(\n userId: string,\n betAmount: number,\n guildId?: string\n ): Promise<{ valid: boolean; error?: string }> {\n if (betAmount <= 0) {\n return { valid: false, error: \"Bet amount must be greater than zero.\" };\n }\n\n const acc = await this.bank.getAccount(userId, guildId);\n if (acc.wallet < betAmount) {\n return {\n valid: false,\n error: `Insufficient wallet funds! Your bet: ${betAmount.toLocaleString()}, Wallet: ${acc.wallet.toLocaleString()}.`,\n };\n }\n\n // Deduct bet from wallet\n acc.wallet -= betAmount;\n acc.stats.totalGambled += betAmount;\n await this.bank.saveAccount(acc);\n\n return { valid: true };\n }\n\n /**\n * Post-bet payout & stats recording.\n */\n private async finishBet(\n userId: string,\n payout: number,\n guildId?: string\n ): Promise<number> {\n const acc = await this.bank.getAccount(userId, guildId);\n if (payout > 0) {\n acc.wallet += payout;\n acc.stats.totalGambleWon += payout;\n }\n await this.bank.saveAccount(acc);\n return acc.wallet;\n }\n\n /* -------------------------------------------------------------------------- */\n /* COINFLIP */\n /* -------------------------------------------------------------------------- */\n\n public async coinflip(\n userId: string,\n betAmount: number,\n choice: \"heads\" | \"tails\",\n guildId?: string\n ): Promise<CasinoBetResult> {\n const prep = await this.prepareBet(userId, betAmount, guildId);\n if (!prep.valid) {\n const acc = await this.bank.getAccount(userId, guildId);\n return {\n game: \"coinflip\",\n betAmount,\n outcome: \"lose\",\n payout: 0,\n profit: -betAmount,\n multiplier: 0,\n details: prep.error ?? \"Invalid bet\",\n finalWallet: acc.wallet,\n };\n }\n\n const luck = await this.getLuckBoost(userId, guildId);\n // Base 50/50 win chance, luck increases win chance to 62%\n const winProbability = 0.5 + luck;\n const isWin = Math.random() < winProbability;\n\n const landed: \"heads\" | \"tails\" = isWin\n ? choice\n : choice === \"heads\"\n ? \"tails\"\n : \"heads\";\n\n const payout = isWin ? betAmount * 2 : 0;\n const finalWallet = await this.finishBet(userId, payout, guildId);\n\n return {\n game: \"coinflip\",\n betAmount,\n outcome: isWin ? \"win\" : \"lose\",\n payout,\n profit: payout - betAmount,\n multiplier: isWin ? 2 : 0,\n details: isWin\n ? `🪙 Coin landed on **${landed.toUpperCase()}**! You called it correctly and doubled your bet!`\n : `🪙 Coin landed on **${landed.toUpperCase()}**. You called ${choice.toUpperCase()} and lost your bet.`,\n finalWallet,\n };\n }\n\n /* -------------------------------------------------------------------------- */\n /* DICE */\n /* -------------------------------------------------------------------------- */\n\n public async dice(\n userId: string,\n betAmount: number,\n prediction: \"high\" | \"low\" | number,\n guildId?: string\n ): Promise<CasinoBetResult> {\n const prep = await this.prepareBet(userId, betAmount, guildId);\n if (!prep.valid) {\n const acc = await this.bank.getAccount(userId, guildId);\n return {\n game: \"dice\",\n betAmount,\n outcome: \"lose\",\n payout: 0,\n profit: -betAmount,\n multiplier: 0,\n details: prep.error ?? \"Invalid bet\",\n finalWallet: acc.wallet,\n };\n }\n\n const roll = Math.floor(Math.random() * 6) + 1;\n let won = false;\n let multiplier = 0;\n\n if (typeof prediction === \"number\") {\n won = roll === prediction;\n multiplier = won ? 6 : 0;\n } else if (prediction === \"high\") {\n won = roll >= 4;\n multiplier = won ? 2 : 0;\n } else {\n won = roll <= 3;\n multiplier = won ? 2 : 0;\n }\n\n const payout = won ? betAmount * multiplier : 0;\n const finalWallet = await this.finishBet(userId, payout, guildId);\n\n return {\n game: \"dice\",\n betAmount,\n outcome: won ? \"win\" : \"lose\",\n payout,\n profit: payout - betAmount,\n multiplier,\n details: won\n ? `🎲 The die rolled a **${roll}**! Your prediction (${prediction}) was spot on! Payout: ${payout.toLocaleString()}`\n : `🎲 The die rolled a **${roll}**. Your prediction (${prediction}) was incorrect.`,\n finalWallet,\n };\n }\n\n /* -------------------------------------------------------------------------- */\n /* SLOTS */\n /* -------------------------------------------------------------------------- */\n\n public async slots(userId: string, betAmount: number, guildId?: string): Promise<CasinoBetResult> {\n const prep = await this.prepareBet(userId, betAmount, guildId);\n if (!prep.valid) {\n const acc = await this.bank.getAccount(userId, guildId);\n return {\n game: \"slots\",\n betAmount,\n outcome: \"lose\",\n payout: 0,\n profit: -betAmount,\n multiplier: 0,\n details: prep.error ?? \"Invalid bet\",\n finalWallet: acc.wallet,\n };\n }\n\n const symbols = [\"🍒\", \"🍋\", \"🍇\", \"🔔\", \"⭐\", \"💎\", \"7️⃣\"];\n const luck = await this.getLuckBoost(userId, guildId);\n\n // Roll reels\n const pickSymbol = () => symbols[Math.floor(Math.random() * symbols.length)];\n let r1 = pickSymbol();\n let r2 = pickSymbol();\n let r3 = pickSymbol();\n\n // With luck boost, bias second/third reel towards matching\n if (luck > 0 && Math.random() < luck) {\n r2 = r1;\n if (Math.random() < 0.4) {\n r3 = r1;\n }\n }\n\n let multiplier = 0;\n let outcome: \"win\" | \"lose\" = \"lose\";\n let detailMsg = `[ ${r1} | ${r2} | ${r3} ]`;\n\n if (r1 === r2 && r2 === r3) {\n outcome = \"win\";\n switch (r1) {\n case \"7️⃣\":\n multiplier = 50;\n detailMsg += \" - 💥 TRIPLE SEVENS JACKPOT! (50x)\";\n break;\n case \"💎\":\n multiplier = 30;\n detailMsg += \" - 💎 DIAMOND EXTRAVAGANZA! (30x)\";\n break;\n case \"⭐\":\n multiplier = 20;\n detailMsg += \" - ⭐ SUPERNOVA MATCH! (20x)\";\n break;\n case \"🔔\":\n multiplier = 10;\n detailMsg += \" - 🔔 GOLDEN BELLS! (10x)\";\n break;\n default:\n multiplier = 5;\n detailMsg += \" - 🍇 FRUIT TRIPLET! (5x)\";\n }\n } else if (r1 === r2 || r2 === r3 || r1 === r3) {\n outcome = \"win\";\n multiplier = 1.5;\n detailMsg += \" - ✨ Double Match! (1.5x)\";\n } else {\n detailMsg += \" - No match. Better luck next spin!\";\n }\n\n const payout = Math.floor(betAmount * multiplier);\n const finalWallet = await this.finishBet(userId, payout, guildId);\n\n return {\n game: \"slots\",\n betAmount,\n outcome,\n payout,\n profit: payout - betAmount,\n multiplier,\n details: detailMsg,\n finalWallet,\n };\n }\n\n /* -------------------------------------------------------------------------- */\n /* ROULETTE */\n /* -------------------------------------------------------------------------- */\n\n public async roulette(\n userId: string,\n betAmount: number,\n betType: \"red\" | \"black\" | \"green\" | \"even\" | \"odd\" | number,\n guildId?: string\n ): Promise<CasinoBetResult> {\n const prep = await this.prepareBet(userId, betAmount, guildId);\n if (!prep.valid) {\n const acc = await this.bank.getAccount(userId, guildId);\n return {\n game: \"roulette\",\n betAmount,\n outcome: \"lose\",\n payout: 0,\n profit: -betAmount,\n multiplier: 0,\n details: prep.error ?? \"Invalid bet\",\n finalWallet: acc.wallet,\n };\n }\n\n // Numbers 0 to 36\n const redNumbers = [1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36];\n const landedNumber = Math.floor(Math.random() * 37);\n\n let landedColor: \"green\" | \"red\" | \"black\" = \"black\";\n if (landedNumber === 0) {\n landedColor = \"green\";\n } else if (redNumbers.includes(landedNumber)) {\n landedColor = \"red\";\n }\n\n let won = false;\n let multiplier = 0;\n\n if (typeof betType === \"number\") {\n won = landedNumber === betType;\n multiplier = won ? 36 : 0;\n } else if (betType === \"green\") {\n won = landedNumber === 0;\n multiplier = won ? 36 : 0;\n } else if (betType === \"red\" || betType === \"black\") {\n won = landedColor === betType;\n multiplier = won ? 2 : 0;\n } else if (betType === \"even\") {\n won = landedNumber > 0 && landedNumber % 2 === 0;\n multiplier = won ? 2 : 0;\n } else if (betType === \"odd\") {\n won = landedNumber > 0 && landedNumber % 2 !== 0;\n multiplier = won ? 2 : 0;\n }\n\n const payout = won ? betAmount * multiplier : 0;\n const finalWallet = await this.finishBet(userId, payout, guildId);\n\n const colorEmoji = landedColor === \"red\" ? \"🔴\" : landedColor === \"black\" ? \"⚫\" : \"🟢\";\n const details = won\n ? `🎡 Roulette ball stopped at ${colorEmoji} **${landedNumber} (${landedColor.toUpperCase()})**! Your bet on ${betType} won ${payout.toLocaleString()}!`\n : `🎡 Roulette ball stopped at ${colorEmoji} **${landedNumber} (${landedColor.toUpperCase()})**. You lost your bet on ${betType}.`;\n\n return {\n game: \"roulette\",\n betAmount,\n outcome: won ? \"win\" : \"lose\",\n payout,\n profit: payout - betAmount,\n multiplier,\n details,\n finalWallet,\n };\n }\n\n /* -------------------------------------------------------------------------- */\n /* CRASH */\n /* -------------------------------------------------------------------------- */\n\n public async crash(\n userId: string,\n betAmount: number,\n targetMultiplier: number,\n guildId?: string\n ): Promise<CasinoBetResult> {\n if (targetMultiplier < 1.01) {\n const acc = await this.bank.getAccount(userId, guildId);\n return {\n game: \"crash\",\n betAmount,\n outcome: \"lose\",\n payout: 0,\n profit: -betAmount,\n multiplier: 0,\n details: \"Target multiplier must be at least 1.01x.\",\n finalWallet: acc.wallet,\n };\n }\n\n const prep = await this.prepareBet(userId, betAmount, guildId);\n if (!prep.valid) {\n const acc = await this.bank.getAccount(userId, guildId);\n return {\n game: \"crash\",\n betAmount,\n outcome: \"lose\",\n payout: 0,\n profit: -betAmount,\n multiplier: 0,\n details: prep.error ?? \"Invalid bet\",\n finalWallet: acc.wallet,\n };\n }\n\n // House edge ~ 4%\n const rand = Math.random();\n let crashPoint = 1.0;\n if (rand >= 0.04) {\n // Exponential decay\n crashPoint = Math.floor((0.96 / (1 - rand)) * 100) / 100;\n crashPoint = Math.max(1.0, crashPoint);\n }\n\n const won = targetMultiplier <= crashPoint;\n const multiplier = won ? targetMultiplier : 0;\n const payout = won ? Math.floor(betAmount * targetMultiplier) : 0;\n const finalWallet = await this.finishBet(userId, payout, guildId);\n\n const details = won\n ? `🚀 Rocket flew up to **${crashPoint.toFixed(2)}x**! You safely cashed out at **${targetMultiplier.toFixed(2)}x**! Won: ${payout.toLocaleString()}`\n : `💥 CRASH! Rocket exploded at **${crashPoint.toFixed(2)}x** before reaching your target of **${targetMultiplier.toFixed(2)}x**!`;\n\n return {\n game: \"crash\",\n betAmount,\n outcome: won ? \"win\" : \"lose\",\n payout,\n profit: payout - betAmount,\n multiplier,\n details,\n finalWallet,\n };\n }\n\n /* -------------------------------------------------------------------------- */\n /* BLACKJACK ENGINE & SESSIONS */\n /* -------------------------------------------------------------------------- */\n\n private buildDeck(): Card[] {\n const suits: Array<Card[\"suit\"]> = [\"♠\", \"♥\", \"♦\", \"♣\"];\n const ranks = [\"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"J\", \"Q\", \"K\", \"A\"];\n const deck: Card[] = [];\n\n for (const suit of suits) {\n for (const rank of ranks) {\n let value = parseInt(rank, 10);\n if ([\"J\", \"Q\", \"K\"].includes(rank)) value = 10;\n if (rank === \"A\") value = 11;\n deck.push({ suit, rank, value });\n }\n }\n\n // Fisher-Yates Shuffle\n for (let i = deck.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [deck[i], deck[j]] = [deck[j], deck[i]];\n }\n\n return deck;\n }\n\n public calculateHand(hand: Card[]): { total: number; isSoft: boolean; isBust: boolean; isBlackjack: boolean } {\n let total = 0;\n let aces = 0;\n\n for (const card of hand) {\n total += card.value;\n if (card.rank === \"A\") aces += 1;\n }\n\n while (total > 21 && aces > 0) {\n total -= 10;\n aces -= 1;\n }\n\n const isSoft = aces > 0;\n const isBust = total > 21;\n const isBlackjack = hand.length === 2 && total === 21;\n\n return { total, isSoft, isBust, isBlackjack };\n }\n\n /**\n * Starts an interactive Blackjack game session.\n */\n public async startBlackjackGame(\n userId: string,\n betAmount: number,\n guildId?: string\n ): Promise<BlackjackState> {\n const prep = await this.prepareBet(userId, betAmount, guildId);\n if (!prep.valid) {\n throw new Error(prep.error ?? \"Invalid bet\");\n }\n\n const deck = this.buildDeck();\n const playerHand = [deck.pop()!, deck.pop()!];\n const dealerHand = [deck.pop()!, deck.pop()!];\n\n const pCalc = this.calculateHand(playerHand);\n const dCalc = this.calculateHand(dealerHand);\n\n const gameId = `bj_${userId}_${Date.now()}`;\n const state: BlackjackState = {\n gameId,\n userId,\n guildId,\n betAmount,\n deck,\n playerHand,\n dealerHand,\n status: \"playing\",\n payout: 0,\n finished: false,\n };\n\n // Check immediate blackjacks\n if (pCalc.isBlackjack && dCalc.isBlackjack) {\n state.status = \"push\";\n state.payout = betAmount;\n state.finished = true;\n await this.finishBet(userId, state.payout, guildId);\n } else if (pCalc.isBlackjack) {\n state.status = \"blackjack\";\n state.payout = Math.floor(betAmount * 2.5); // 3:2 payout\n state.finished = true;\n await this.finishBet(userId, state.payout, guildId);\n } else if (dCalc.isBlackjack) {\n state.status = \"dealer_win\";\n state.payout = 0;\n state.finished = true;\n await this.finishBet(userId, 0, guildId);\n }\n\n if (!state.finished) {\n this.activeBlackjackGames.set(gameId, state);\n }\n\n return state;\n }\n\n /**\n * Player draws a card (\"hit\").\n */\n public async blackjackHit(gameId: string): Promise<BlackjackState> {\n const game = this.activeBlackjackGames.get(gameId);\n if (!game || game.finished) {\n throw new Error(\"Active Blackjack game not found.\");\n }\n\n game.playerHand.push(game.deck.pop()!);\n const pCalc = this.calculateHand(game.playerHand);\n\n if (pCalc.isBust) {\n game.status = \"player_bust\";\n game.payout = 0;\n game.finished = true;\n this.activeBlackjackGames.delete(gameId);\n await this.finishBet(game.userId, 0, game.guildId);\n } else if (pCalc.total === 21) {\n // Auto stand on 21\n return this.blackjackStand(gameId);\n }\n\n return game;\n }\n\n /**\n * Player stands. Dealer resolves their hand according to standard casino rules (dealer hits until >= 17).\n */\n public async blackjackStand(gameId: string): Promise<BlackjackState> {\n const game = this.activeBlackjackGames.get(gameId);\n if (!game || game.finished) {\n throw new Error(\"Active Blackjack game not found.\");\n }\n\n const pCalc = this.calculateHand(game.playerHand);\n let dCalc = this.calculateHand(game.dealerHand);\n\n // Dealer hits on soft/hard < 17\n while (dCalc.total < 17) {\n game.dealerHand.push(game.deck.pop()!);\n dCalc = this.calculateHand(game.dealerHand);\n }\n\n game.finished = true;\n this.activeBlackjackGames.delete(gameId);\n\n if (dCalc.isBust) {\n game.status = \"dealer_bust\";\n game.payout = game.betAmount * 2;\n } else if (pCalc.total > dCalc.total) {\n game.status = \"player_win\";\n game.payout = game.betAmount * 2;\n } else if (pCalc.total < dCalc.total) {\n game.status = \"dealer_win\";\n game.payout = 0;\n } else {\n game.status = \"push\";\n game.payout = game.betAmount;\n }\n\n await this.finishBet(game.userId, game.payout, game.guildId);\n return game;\n }\n\n /**\n * Double down: doubles bet, receives exactly one card, and automatically stands.\n */\n public async blackjackDouble(gameId: string): Promise<BlackjackState> {\n const game = this.activeBlackjackGames.get(gameId);\n if (!game || game.finished) {\n throw new Error(\"Active Blackjack game not found.\");\n }\n\n // Must have enough wallet to double the original bet\n const extraPrep = await this.prepareBet(game.userId, game.betAmount, game.guildId);\n if (!extraPrep.valid) {\n throw new Error(`Cannot double down: ${extraPrep.error}`);\n }\n\n game.betAmount *= 2;\n game.playerHand.push(game.deck.pop()!);\n const pCalc = this.calculateHand(game.playerHand);\n\n if (pCalc.isBust) {\n game.status = \"player_bust\";\n game.payout = 0;\n game.finished = true;\n this.activeBlackjackGames.delete(gameId);\n await this.finishBet(game.userId, 0, game.guildId);\n return game;\n }\n\n return this.blackjackStand(gameId);\n }\n\n public getActiveBlackjackGame(gameId: string): BlackjackState | undefined {\n return this.activeBlackjackGames.get(gameId);\n }\n}\n\n","/**\n * @m3rcena/eco\n * Global & Guild Economy Leaderboards & Net Worth Rankings.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { EcoStorageAdapter } from \"../storage/EcoStorage.js\";\nimport { UserAccount } from \"../types.js\";\nimport { ShopManager } from \"./ShopManager.js\";\nimport { BusinessManager } from \"./BusinessManager.js\";\n\nexport type LeaderboardMetric = \"net_worth\" | \"wallet\" | \"bank\" | \"level\" | \"streak\";\n\nexport interface LeaderboardEntry {\n rank: number;\n userId: string;\n guildId?: string;\n value: number;\n wallet: number;\n bank: number;\n netWorth: number;\n level: number;\n streak: number;\n}\n\nexport class LeaderboardManager {\n private storage: EcoStorageAdapter;\n private shop?: ShopManager;\n private business?: BusinessManager;\n\n constructor(storage: EcoStorageAdapter, shop?: ShopManager, business?: BusinessManager) {\n this.storage = storage;\n this.shop = shop;\n this.business = business;\n }\n\n /**\n * Computes a user's total Net Worth across liquid cash, bank savings, business assets, and inventory collectibles.\n */\n public calculateNetWorth(account: UserAccount): number {\n let total = account.wallet + account.bank;\n\n // Add business assets valuation\n if (account.businesses && account.businesses.length > 0) {\n for (const b of account.businesses) {\n const config = this.business?.getBusinessConfig(b.businessId);\n if (config) {\n total += config.baseCost * b.level;\n total += b.employees * Math.floor(config.baseCost * 0.15);\n } else {\n total += 5000 * b.level;\n }\n }\n }\n\n // Add inventory valuation\n if (account.inventory && account.inventory.length > 0) {\n for (const item of account.inventory) {\n const shopItem = this.shop?.getItem(item.itemId);\n const unitVal = shopItem?.resaleValue ?? (shopItem ? Math.floor(shopItem.price * 0.6) : 100);\n total += unitVal * item.quantity;\n }\n }\n\n return total;\n }\n\n /**\n * Generates a ranked leaderboard for the specified metric.\n */\n public async getLeaderboard(\n metric: LeaderboardMetric = \"net_worth\",\n limit: number = 10,\n guildId?: string\n ): Promise<LeaderboardEntry[]> {\n const accounts = await this.storage.getAllAccounts(guildId);\n\n const enriched = accounts.map((acc) => {\n const netWorth = this.calculateNetWorth(acc);\n let sortValue = 0;\n\n switch (metric) {\n case \"net_worth\":\n sortValue = netWorth;\n break;\n case \"wallet\":\n sortValue = acc.wallet;\n break;\n case \"bank\":\n sortValue = acc.bank;\n break;\n case \"level\":\n sortValue = acc.level;\n break;\n case \"streak\":\n sortValue = acc.streak?.daily ?? 0;\n break;\n }\n\n return {\n userId: acc.userId,\n guildId: acc.guildId,\n value: sortValue,\n wallet: acc.wallet,\n bank: acc.bank,\n netWorth,\n level: acc.level,\n streak: acc.streak?.daily ?? 0,\n };\n });\n\n enriched.sort((a, b) => b.value - a.value);\n\n return enriched.slice(0, limit).map((entry, index) => ({\n ...entry,\n rank: index + 1,\n }));\n }\n\n /**\n * Formats the leaderboard entries into a clean Discord markdown string.\n */\n public formatLeaderboard(\n entries: LeaderboardEntry[],\n metric: LeaderboardMetric = \"net_worth\",\n currencySymbol: string = \"🪙\"\n ): string {\n if (entries.length === 0) {\n return \"No economy records found yet.\";\n }\n\n const metricTitles: Record<LeaderboardMetric, string> = {\n net_worth: \"Net Worth\",\n wallet: \"Wallet Cash\",\n bank: \"Bank Savings\",\n level: \"Level & XP\",\n streak: \"Daily Streak\",\n };\n\n let output = `🏆 **Top Economy Leaderboard (${metricTitles[metric]})**\\n\\n`;\n\n for (const e of entries) {\n let medal = `\\`#${e.rank}\\``;\n if (e.rank === 1) medal = \"🥇\";\n else if (e.rank === 2) medal = \"🥈\";\n else if (e.rank === 3) medal = \"🥉\";\n\n let formattedValue = \"\";\n if (metric === \"level\") {\n formattedValue = `Lvl ${e.value}`;\n } else if (metric === \"streak\") {\n formattedValue = `${e.value} days 🔥`;\n } else {\n formattedValue = `${currencySymbol} ${e.value.toLocaleString()}`;\n }\n\n output += `${medal} <@${e.userId}> — **${formattedValue}**\\n`;\n output += ` └ Net Worth: ${currencySymbol} ${e.netWorth.toLocaleString()} | Lvl ${e.level}\\n`;\n }\n\n return output;\n }\n}\n\n","/**\n * @m3rcena/eco\n * Stock & Cryptocurrency Exchange Simulation Engine.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { BankManager } from \"./BankManager.js\";\nimport { StockConfig, UserStockPosition, StockTradeResult, StockMarketTrend } from \"../types.js\";\n\nexport const DEFAULT_STOCKS: StockConfig[] = [\n {\n symbol: \"$AETH\",\n name: \"Aether AI Robotics\",\n category: \"TECH\",\n basePrice: 145.5,\n currentPrice: 145.5,\n high24h: 152.0,\n low24h: 140.2,\n change24h: 3.75,\n history: [138, 140, 142, 141, 144, 145.5],\n volatility: 0.04,\n dividendYield: 0.02,\n description: \"Next-gen neural AI processors and autonomous robotics.\",\n },\n {\n symbol: \"$NEXU\",\n name: \"Nexus Global Finance\",\n category: \"FINANCE\",\n basePrice: 85.0,\n currentPrice: 85.0,\n high24h: 88.5,\n low24h: 83.0,\n change24h: 1.2,\n history: [82, 83, 84, 84.5, 85],\n volatility: 0.02,\n dividendYield: 0.04,\n description: \"Interplanetary banking conglomerate and liquidity provider.\",\n },\n {\n symbol: \"$CORE\",\n name: \"DeepCore Asteroid Mining\",\n category: \"MINING\",\n basePrice: 320.0,\n currentPrice: 320.0,\n high24h: 345.0,\n low24h: 298.0,\n change24h: -4.5,\n history: [340, 335, 330, 318, 320],\n volatility: 0.07,\n dividendYield: 0.03,\n description: \"High-yield rare earth metal extraction from off-world asteroids.\",\n },\n {\n symbol: \"₿BIT\",\n name: \"BitCoin Core\",\n category: \"CRYPTO\",\n basePrice: 64200.0,\n currentPrice: 64200.0,\n high24h: 68500.0,\n low24h: 62000.0,\n change24h: 6.8,\n history: [61000, 62500, 63800, 63100, 64200],\n volatility: 0.09,\n description: \"Decentralized digital gold asset and store of cosmic value.\",\n },\n {\n symbol: \"ΞETH\",\n name: \"Ether Compute\",\n category: \"CRYPTO\",\n basePrice: 3450.0,\n currentPrice: 3450.0,\n high24h: 3620.0,\n low24h: 3310.0,\n change24h: 2.1,\n history: [3300, 3380, 3420, 3400, 3450],\n volatility: 0.08,\n description: \"Global decentralized smart contract compute platform.\",\n },\n];\n\nexport class StockMarketManager {\n private bank: BankManager;\n private stocks: Map<string, StockConfig> = new Map();\n private marketTrend: StockMarketTrend = \"BULL\";\n private lastTick: number = Date.now();\n\n constructor(bank: BankManager, initialStocks: StockConfig[] = DEFAULT_STOCKS) {\n this.bank = bank;\n for (const stock of initialStocks) {\n this.stocks.set(stock.symbol.toUpperCase(), { ...stock });\n }\n }\n\n public getStocks(): StockConfig[] {\n return Array.from(this.stocks.values());\n }\n\n public getStock(symbol: string): StockConfig | undefined {\n return this.stocks.get(symbol.toUpperCase());\n }\n\n public getMarketTrend(): StockMarketTrend {\n return this.marketTrend;\n }\n\n /**\n * Ticks the market forward, simulating realistic price fluctuations.\n */\n public tickMarket(): void {\n const trends: StockMarketTrend[] = [\"BULL\", \"BEAR\", \"STABLE\", \"VOLATILE\"];\n if (Math.random() < 0.15) {\n this.marketTrend = trends[Math.floor(Math.random() * trends.length)];\n }\n\n for (const [sym, stock] of this.stocks) {\n const vol = stock.volatility;\n let bias = 0;\n if (this.marketTrend === \"BULL\") bias = 0.015;\n else if (this.marketTrend === \"BEAR\") bias = -0.015;\n\n const deltaPct = (Math.random() * 2 - 1) * vol + bias;\n const oldPrice = stock.currentPrice;\n const newPrice = Math.max(1, parseFloat((oldPrice * (1 + deltaPct)).toFixed(2)));\n\n stock.currentPrice = newPrice;\n stock.high24h = Math.max(stock.high24h, newPrice);\n stock.low24h = Math.min(stock.low24h, newPrice);\n stock.change24h = parseFloat((((newPrice - stock.basePrice) / stock.basePrice) * 100).toFixed(2));\n\n stock.history.push(newPrice);\n if (stock.history.length > 20) stock.history.shift();\n }\n this.lastTick = Date.now();\n }\n\n /**\n * Purchases shares of a stock or cryptocurrency.\n */\n public async buyStock(userId: string, symbol: string, shares: number, guildId?: string): Promise<StockTradeResult> {\n const sym = symbol.toUpperCase();\n const stock = this.stocks.get(sym);\n if (!stock) {\n return { success: false, action: \"BUY\", symbol: sym, shares: 0, pricePerShare: 0, totalAmount: 0, userWallet: 0, sharesRemaining: 0, error: `Stock symbol \"${sym}\" not found.` };\n }\n\n if (shares <= 0 || isNaN(shares)) {\n return { success: false, action: \"BUY\", symbol: sym, shares: 0, pricePerShare: stock.currentPrice, totalAmount: 0, userWallet: 0, sharesRemaining: 0, error: \"Shares must be greater than zero.\" };\n }\n\n const totalCost = parseFloat((stock.currentPrice * shares).toFixed(2));\n const account = await this.bank.getAccount(userId, guildId);\n\n if (account.wallet < totalCost) {\n return {\n success: false,\n action: \"BUY\",\n symbol: sym,\n shares,\n pricePerShare: stock.currentPrice,\n totalAmount: totalCost,\n userWallet: account.wallet,\n sharesRemaining: 0,\n error: `Insufficient cash in wallet. Need $${totalCost.toLocaleString()}, you have $${account.wallet.toLocaleString()}.`,\n };\n }\n\n // Deduct cost from wallet\n account.wallet -= totalCost;\n account.stats.totalSpent += totalCost;\n account.stats.stockTrades = (account.stats.stockTrades || 0) + 1;\n\n // Update stock position\n if (!account.stocks) account.stocks = [];\n let position = account.stocks.find((p) => p.symbol.toUpperCase() === sym);\n\n if (!position) {\n position = {\n symbol: sym,\n shares,\n totalInvested: totalCost,\n averageBuyPrice: stock.currentPrice,\n lastTradeTimestamp: Date.now(),\n };\n account.stocks.push(position);\n } else {\n const prevTotal = position.shares * position.averageBuyPrice;\n position.shares += shares;\n position.totalInvested += totalCost;\n position.averageBuyPrice = parseFloat(((prevTotal + totalCost) / position.shares).toFixed(2));\n position.lastTradeTimestamp = Date.now();\n }\n\n await this.bank.saveAccount(account);\n\n return {\n success: true,\n action: \"BUY\",\n symbol: sym,\n shares,\n pricePerShare: stock.currentPrice,\n totalAmount: totalCost,\n userWallet: account.wallet,\n sharesRemaining: position.shares,\n };\n }\n\n /**\n * Sells shares of an owned stock or cryptocurrency.\n */\n public async sellStock(userId: string, symbol: string, sharesToSell: number | \"all\", guildId?: string): Promise<StockTradeResult> {\n const sym = symbol.toUpperCase();\n const stock = this.stocks.get(sym);\n if (!stock) {\n return { success: false, action: \"SELL\", symbol: sym, shares: 0, pricePerShare: 0, totalAmount: 0, userWallet: 0, sharesRemaining: 0, error: `Stock symbol \"${sym}\" not found.` };\n }\n\n const account = await this.bank.getAccount(userId, guildId);\n if (!account.stocks) account.stocks = [];\n\n const position = account.stocks.find((p) => p.symbol.toUpperCase() === sym);\n if (!position || position.shares <= 0) {\n return { success: false, action: \"SELL\", symbol: sym, shares: 0, pricePerShare: stock.currentPrice, totalAmount: 0, userWallet: account.wallet, sharesRemaining: 0, error: `You do not own any shares of ${sym}.` };\n }\n\n const shares = sharesToSell === \"all\" ? position.shares : sharesToSell;\n if (shares <= 0 || isNaN(shares) || shares > position.shares) {\n return { success: false, action: \"SELL\", symbol: sym, shares: 0, pricePerShare: stock.currentPrice, totalAmount: 0, userWallet: account.wallet, sharesRemaining: position.shares, error: `Invalid share count. You only own ${position.shares} shares.` };\n }\n\n const grossPayout = parseFloat((stock.currentPrice * shares).toFixed(2));\n const costBasis = parseFloat((position.averageBuyPrice * shares).toFixed(2));\n const profitOrLoss = parseFloat((grossPayout - costBasis).toFixed(2));\n\n account.wallet += grossPayout;\n account.stats.totalEarned += grossPayout;\n account.stats.stockTrades = (account.stats.stockTrades || 0) + 1;\n\n position.shares -= shares;\n if (position.shares <= 0) {\n account.stocks = account.stocks.filter((p) => p.symbol.toUpperCase() !== sym);\n }\n\n await this.bank.saveAccount(account);\n\n return {\n success: true,\n action: \"SELL\",\n symbol: sym,\n shares,\n pricePerShare: stock.currentPrice,\n totalAmount: grossPayout,\n userWallet: account.wallet,\n sharesRemaining: position ? position.shares : 0,\n profitOrLoss,\n };\n }\n\n /**\n * Retrieves user portfolio valuation and positions.\n */\n public async getUserPortfolio(userId: string, guildId?: string) {\n const account = await this.bank.getAccount(userId, guildId);\n const positions = (account.stocks || []).map((pos) => {\n const stock = this.stocks.get(pos.symbol.toUpperCase());\n const currentPrice = stock ? stock.currentPrice : pos.averageBuyPrice;\n const currentValue = parseFloat((pos.shares * currentPrice).toFixed(2));\n const costBasis = parseFloat((pos.shares * pos.averageBuyPrice).toFixed(2));\n const pnl = parseFloat((currentValue - costBasis).toFixed(2));\n const pnlPct = costBasis > 0 ? parseFloat(((pnl / costBasis) * 100).toFixed(2)) : 0;\n\n return {\n symbol: pos.symbol,\n name: stock ? stock.name : pos.symbol,\n shares: pos.shares,\n averageBuyPrice: pos.averageBuyPrice,\n currentPrice,\n currentValue,\n profitOrLoss: pnl,\n profitOrLossPercentage: pnlPct,\n };\n });\n\n const totalPortfolioValue = positions.reduce((acc, p) => acc + p.currentValue, 0);\n return {\n userId,\n positions,\n totalPortfolioValue: parseFloat(totalPortfolioValue.toFixed(2)),\n };\n }\n}\n\n","/**\n * @m3rcena/eco\n * Multiplayer Crew Bank Heist & Crime Syndicate Engine.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { BankManager } from \"./BankManager.js\";\nimport { HeistTarget, HeistSession, HeistResult, HeistRole } from \"../types.js\";\n\nexport const DEFAULT_HEIST_TARGETS: HeistTarget[] = [\n {\n id: \"corner_store\",\n name: \"Nightshift Mart Safe\",\n difficulty: \"EASY\",\n minLevel: 1,\n minCrew: 1,\n maxCrew: 2,\n baseBountyMin: 12000,\n baseBountyMax: 30000,\n failureBail: 3500,\n successRate: 0.8,\n description: \"Low-security register and floor safe. Fast cash with minimal police response.\",\n },\n {\n id: \"city_trust_bank\",\n name: \"First Metro Bank Vault\",\n difficulty: \"MEDIUM\",\n minLevel: 5,\n minCrew: 2,\n maxCrew: 3,\n baseBountyMin: 65000,\n baseBountyMax: 180000,\n failureBail: 15000,\n successRate: 0.65,\n description: \"Reinforced vault door with laser grid sensors. Needs a Hacker and a Muscle.\",\n },\n {\n id: \"casino_vault\",\n name: \"Grand Bellagio Casino Vault\",\n difficulty: \"HARD\",\n minLevel: 12,\n minCrew: 3,\n maxCrew: 4,\n baseBountyMin: 350000,\n baseBountyMax: 900000,\n failureBail: 65000,\n successRate: 0.5,\n description: \"High-roller cash depository protected by private armed security and motion alarms.\",\n },\n {\n id: \"federal_reserve\",\n name: \"Federal Bullion Depository\",\n difficulty: \"IMPOSSIBLE\",\n minLevel: 25,\n minCrew: 4,\n maxCrew: 4,\n baseBountyMin: 1500000,\n baseBountyMax: 4500000,\n failureBail: 250000,\n successRate: 0.38,\n description: \"The ultimate score: solid gold bullion pallets under biometric time locks.\",\n },\n];\n\nexport class HeistManager {\n private bank: BankManager;\n private targets: Map<string, HeistTarget> = new Map();\n private activeHeists: Map<string, HeistSession> = new Map();\n\n constructor(bank: BankManager, targets: HeistTarget[] = DEFAULT_HEIST_TARGETS) {\n this.bank = bank;\n for (const t of targets) {\n this.targets.set(t.id, t);\n }\n }\n\n public getTargets(): HeistTarget[] {\n return Array.from(this.targets.values());\n }\n\n public getTarget(id: string): HeistTarget | undefined {\n return this.targets.get(id);\n }\n\n public getHeist(heistId: string): HeistSession | undefined {\n return this.activeHeists.get(heistId);\n }\n\n /**\n * Creates a new Heist lobby.\n */\n public async createLobby(initiatorId: string, initiatorName: string, targetId: string, guildId?: string): Promise<{ success: boolean; session?: HeistSession; error?: string }> {\n const target = this.targets.get(targetId);\n if (!target) return { success: false, error: `Heist target \"${targetId}\" not found.` };\n\n const acc = await this.bank.getAccount(initiatorId, guildId);\n if (acc.level < target.minLevel) {\n return { success: false, error: `You need to be Level ${target.minLevel} to initiate this heist. (Your level: ${acc.level})` };\n }\n\n const heistId = \"heist_\" + Math.random().toString(36).substring(2, 8);\n const session: HeistSession = {\n id: heistId,\n guildId,\n initiatorId,\n target,\n crew: [\n {\n userId: initiatorId,\n username: initiatorName,\n role: \"HACKER\",\n ready: true,\n },\n ],\n phase: \"LOBBY\",\n createdAt: Date.now(),\n log: [`Planning initiated by ${initiatorName} targeting ${target.name}.`],\n };\n\n this.activeHeists.set(heistId, session);\n return { success: true, session };\n }\n\n /**\n * Joins an existing heist lobby with a specific role.\n */\n public joinLobby(heistId: string, userId: string, username: string, role: HeistRole): { success: boolean; session?: HeistSession; error?: string } {\n const session = this.activeHeists.get(heistId);\n if (!session) return { success: false, error: \"Heist lobby not found.\" };\n if (session.phase !== \"LOBBY\") return { success: false, error: \"Heist has already launched.\" };\n\n if (session.crew.some((m) => m.userId === userId)) {\n // Update role\n const member = session.crew.find((m) => m.userId === userId);\n if (member) member.role = role;\n return { success: true, session };\n }\n\n if (session.crew.length >= session.target.maxCrew) {\n return { success: false, error: \"Heist crew is already full!\" };\n }\n\n session.crew.push({ userId, username, role, ready: true });\n session.log.push(`${username} joined the crew as ${role}.`);\n return { success: true, session };\n }\n\n /**\n * Executes the heist.\n */\n public async executeHeist(heistId: string): Promise<HeistResult> {\n const session = this.activeHeists.get(heistId);\n if (!session) {\n throw new Error(`Heist session \"${heistId}\" not found.`);\n }\n\n if (session.crew.length < session.target.minCrew) {\n throw new Error(`Not enough crew members. Need at least ${session.target.minCrew} players.`);\n }\n\n session.phase = \"EXECUTION\";\n const target = session.target;\n\n // Calculate success chance with crew composition bonuses\n let successChance = target.successRate;\n const hasHacker = session.crew.some((m) => m.role === \"HACKER\");\n const hasDriver = session.crew.some((m) => m.role === \"DRIVER\");\n const hasDemo = session.crew.some((m) => m.role === \"DEMOLITIONIST\");\n const hasMuscle = session.crew.some((m) => m.role === \"MUSCLE\");\n\n if (hasHacker) successChance += 0.06;\n if (hasDriver) successChance += 0.05;\n if (hasDemo) successChance += 0.05;\n if (hasMuscle) successChance += 0.04;\n\n const roll = Math.random();\n const isSuccess = roll < successChance;\n session.success = isSuccess;\n session.phase = \"CONCLUDED\";\n\n if (isSuccess) {\n const totalBounty = Math.floor(Math.random() * (target.baseBountyMax - target.baseBountyMin + 1)) + target.baseBountyMin;\n const share = Math.floor(totalBounty / session.crew.length);\n\n session.totalLoot = totalBounty;\n session.lootSplit = {};\n\n session.log.push(`💥 Vault breached successfully! Looted $${totalBounty.toLocaleString()}!`);\n session.log.push(`🚓 Clean getaway! Each crew member takes home $${share.toLocaleString()}!`);\n\n // Award loot to all crew members\n for (const member of session.crew) {\n session.lootSplit[member.userId] = share;\n const acc = await this.bank.getAccount(member.userId, session.guildId);\n acc.wallet += share;\n acc.stats.totalEarned += share;\n acc.stats.heistsCompleted = (acc.stats.heistsCompleted || 0) + 1;\n await this.bank.saveAccount(acc);\n }\n\n return {\n success: true,\n targetName: target.name,\n totalLoot: totalBounty,\n crewCount: session.crew.length,\n sharePerPlayer: share,\n log: session.log,\n };\n } else {\n const bail = target.failureBail;\n session.log.push(`🚨 Silent alarm triggered! SWAT teams surrounded the perimeter!`);\n session.log.push(`🚔 Heist failed! Each member fined $${bail.toLocaleString()} in police bail!`);\n\n // Deduct bail fines\n for (const member of session.crew) {\n const acc = await this.bank.getAccount(member.userId, session.guildId);\n acc.wallet = Math.max(0, acc.wallet - bail);\n acc.stats.totalSpent += bail;\n await this.bank.saveAccount(acc);\n }\n\n return {\n success: false,\n targetName: target.name,\n totalLoot: 0,\n crewCount: session.crew.length,\n sharePerPlayer: 0,\n finePerPlayer: bail,\n log: session.log,\n };\n }\n }\n}\n\n","/**\n * @m3rcena/eco\n * Pet & Companion Foraging System.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { BankManager } from \"./BankManager.js\";\nimport { PetConfig, UserPet } from \"../types.js\";\n\nexport const DEFAULT_PETS: PetConfig[] = [\n {\n id: \"cyber_hound\",\n name: \"Cybernetic K9\",\n species: \"Canine\",\n rarity: \"common\",\n buyCost: 25000,\n description: \"Loyal robotic guardian. Barks at pickpockets and detects incoming robbers.\",\n emoji: \"🐕\",\n workMultiplierBonus: 0.1,\n crimeProtectionBonus: 0.15,\n luckBonus: 0.02,\n },\n {\n id: \"fortune_cat\",\n name: \"Maneki-Neko Lucky Cat\",\n species: \"Feline\",\n rarity: \"rare\",\n buyCost: 85000,\n description: \"Golden waving talisman that attracts coin drops and daily streak multipliers.\",\n emoji: \"🐱\",\n workMultiplierBonus: 0.2,\n crimeProtectionBonus: 0.05,\n luckBonus: 0.08,\n },\n {\n id: \"obsidian_drake\",\n name: \"Obsidian Drake\",\n species: \"Dragon\",\n rarity: \"epic\",\n buyCost: 350000,\n description: \"Armored juvenile dragon with molten breath that scares off high-tier syndicate thugs.\",\n emoji: \"🐉\",\n workMultiplierBonus: 0.35,\n crimeProtectionBonus: 0.3,\n luckBonus: 0.1,\n },\n {\n id: \"void_phoenix\",\n name: \"Celestial Void Phoenix\",\n species: \"Phoenix\",\n rarity: \"mythic\",\n buyCost: 1500000,\n description: \"Legendary cosmic firebird. Doubles expedition rewards and grants passive hourly coin drops.\",\n emoji: \"🦅\",\n workMultiplierBonus: 0.65,\n crimeProtectionBonus: 0.5,\n luckBonus: 0.2,\n },\n];\n\nexport class PetManager {\n private bank: BankManager;\n private catalog: Map<string, PetConfig> = new Map();\n\n constructor(bank: BankManager, initialPets: PetConfig[] = DEFAULT_PETS) {\n this.bank = bank;\n for (const pet of initialPets) {\n this.catalog.set(pet.id, pet);\n }\n }\n\n public getCatalog(): PetConfig[] {\n return Array.from(this.catalog.values());\n }\n\n public getPetConfig(id: string): PetConfig | undefined {\n return this.catalog.get(id);\n }\n\n /**\n * Adopts/purchases a companion pet.\n */\n public async adoptPet(userId: string, petId: string, customName?: string, guildId?: string): Promise<{ success: boolean; pet?: UserPet; error?: string }> {\n const config = this.catalog.get(petId);\n if (!config) return { success: false, error: `Pet \"${petId}\" not found.` };\n\n const acc = await this.bank.getAccount(userId, guildId);\n if (acc.wallet < config.buyCost) {\n return { success: false, error: `Insufficient cash. Need $${config.buyCost.toLocaleString()}, you have $${acc.wallet.toLocaleString()}.` };\n }\n\n if (!acc.pets) acc.pets = [];\n if (acc.pets.some((p) => p.petId === petId)) {\n return { success: false, error: `You already own a ${config.name}!` };\n }\n\n acc.wallet -= config.buyCost;\n acc.stats.totalSpent += config.buyCost;\n\n const newPet: UserPet = {\n id: \"pet_\" + Math.random().toString(36).substring(2, 8),\n petId: config.id,\n name: customName || config.name,\n species: config.species,\n level: 1,\n xp: 0,\n hunger: 100,\n happiness: 100,\n acquiredAt: Date.now(),\n isExpeditionActive: false,\n };\n\n acc.pets.push(newPet);\n await this.bank.saveAccount(acc);\n\n return { success: true, pet: newPet };\n }\n\n /**\n * Feeds a pet to restore hunger and happiness.\n */\n public async feedPet(userId: string, petId: string, guildId?: string): Promise<{ success: boolean; pet?: UserPet; error?: string }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const pet = (acc.pets || []).find((p) => p.petId === petId || p.id === petId);\n if (!pet) return { success: false, error: \"Pet not found in your shelter.\" };\n\n const foodCost = 250;\n if (acc.wallet < foodCost) return { success: false, error: `Feeding costs $${foodCost}.` };\n\n acc.wallet -= foodCost;\n pet.hunger = Math.min(100, pet.hunger + 40);\n pet.happiness = Math.min(100, pet.happiness + 25);\n pet.xp += 15;\n\n // Check level up\n const reqXp = pet.level * 100;\n if (pet.xp >= reqXp) {\n pet.level += 1;\n pet.xp -= reqXp;\n }\n\n await this.bank.saveAccount(acc);\n return { success: true, pet };\n }\n\n /**\n * Dispatches pet on a timed foraging expedition.\n */\n public async sendExpedition(userId: string, petId: string, durationHours: number = 2, guildId?: string): Promise<{ success: boolean; returnsAt?: number; error?: string }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const pet = (acc.pets || []).find((p) => p.petId === petId || p.id === petId);\n if (!pet) return { success: false, error: \"Pet not found.\" };\n if (pet.isExpeditionActive) return { success: false, error: \"Pet is already out on an expedition!\" };\n\n const returnsAt = Date.now() + durationHours * 3600 * 1000;\n pet.isExpeditionActive = true;\n pet.expeditionReturnsAt = returnsAt;\n\n await this.bank.saveAccount(acc);\n return { success: true, returnsAt };\n }\n\n /**\n * Claims rewards when a pet returns from an expedition.\n */\n public async claimExpedition(userId: string, petId: string, guildId?: string): Promise<{ success: boolean; reward?: any; error?: string }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const pet = (acc.pets || []).find((p) => p.petId === petId || p.id === petId);\n if (!pet) return { success: false, error: \"Pet not found.\" };\n if (!pet.isExpeditionActive || !pet.expeditionReturnsAt) return { success: false, error: \"Pet is not currently on an expedition.\" };\n\n if (Date.now() < pet.expeditionReturnsAt) {\n const remainingSec = Math.ceil((pet.expeditionReturnsAt - Date.now()) / 1000);\n return { success: false, error: `Expedition still in progress! Returning in ${Math.ceil(remainingSec / 60)} minutes.` };\n }\n\n const cfg = this.catalog.get(pet.petId);\n const multiplier = 1 + (cfg?.workMultiplierBonus || 0) + pet.level * 0.05;\n\n const coinsFound = Math.floor((Math.random() * 25000 + 8000) * multiplier);\n const xpGained = Math.floor(Math.random() * 60 + 40);\n\n acc.wallet += coinsFound;\n acc.stats.totalEarned += coinsFound;\n pet.xp += xpGained;\n pet.hunger = Math.max(10, pet.hunger - 35);\n pet.happiness = Math.max(10, pet.happiness - 20);\n pet.isExpeditionActive = false;\n pet.expeditionReturnsAt = undefined;\n\n await this.bank.saveAccount(acc);\n\n return {\n success: true,\n reward: {\n coins: coinsFound,\n xp: xpGained,\n petLevel: pet.level,\n },\n };\n }\n}\n\n","/**\n * @m3rcena/eco\n * Mystery Loot Crate Unboxing System.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { BankManager } from \"./BankManager.js\";\nimport { CrateTier, CrateReward } from \"../types.js\";\n\nexport const CRATE_PRICES: Record<CrateTier, number> = {\n common: 5000,\n rare: 25000,\n epic: 100000,\n legendary: 500000,\n mythic: 2000000,\n};\n\nexport class CrateManager {\n private bank: BankManager;\n\n constructor(bank: BankManager) {\n this.bank = bank;\n }\n\n public getCratePrice(tier: CrateTier): number {\n return CRATE_PRICES[tier] || 10000;\n }\n\n /**\n * Opens a mystery crate of the given tier and awards randomized rewards.\n */\n public async openCrate(userId: string, tier: CrateTier, guildId?: string): Promise<CrateReward> {\n const cost = this.getCratePrice(tier);\n const acc = await this.bank.getAccount(userId, guildId);\n\n if (acc.wallet < cost) {\n throw new Error(`Insufficient funds to open ${tier.toUpperCase()} crate. Price: $${cost.toLocaleString()}, you have: $${acc.wallet.toLocaleString()}`);\n }\n\n acc.wallet -= cost;\n acc.stats.totalSpent += cost;\n\n let minCoins = cost * 0.4;\n let maxCoins = cost * 2.2;\n let xp = 50;\n\n if (tier === \"mythic\") {\n minCoins = cost * 0.8;\n maxCoins = cost * 4.5;\n xp = 1000;\n } else if (tier === \"legendary\") {\n minCoins = cost * 0.6;\n maxCoins = cost * 3.0;\n xp = 450;\n } else if (tier === \"epic\") {\n xp = 200;\n }\n\n const wonCoins = Math.floor(Math.random() * (maxCoins - minCoins + 1)) + minCoins;\n acc.wallet += wonCoins;\n acc.stats.totalEarned += wonCoins;\n acc.xp += xp;\n\n // Check level up\n const reqXp = acc.level * 250;\n if (acc.xp >= reqXp) {\n acc.level += 1;\n acc.xp -= reqXp;\n }\n\n await this.bank.saveAccount(acc);\n\n return {\n tier,\n coins: wonCoins,\n xp,\n announcement: `Unboxed [${tier.toUpperCase()} CRATE] and discovered $${wonCoins.toLocaleString()} + ${xp} XP!`,\n };\n }\n}\n\n","/**\n * @m3rcena/eco\n * Bank Vault Tiers, Capacity Upgrades & Daily Compound Interest Engine.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { BankManager } from \"./BankManager.js\";\nimport { BankVaultTier, UserAccount } from \"../types.js\";\n\nexport const DEFAULT_VAULT_TIERS: BankVaultTier[] = [\n {\n tier: 1,\n name: \"Piggy Bank & Floor Safe\",\n capacity: 10000,\n upgradeCost: 0,\n interestRate: 0,\n robberyDefense: 0,\n perks: [\"Basic starter storage\", \"No interest yield\"],\n },\n {\n tier: 2,\n name: \"Community Commercial Safe\",\n capacity: 50000,\n upgradeCost: 15000,\n interestRate: 0.005, // 0.5% daily\n robberyDefense: 0.15,\n perks: [\"$50,000 capacity\", \"0.5% daily compound interest\", \"15% robbery defense\"],\n },\n {\n tier: 3,\n name: \"Reinforced Iron Vault\",\n capacity: 200000,\n upgradeCost: 75000,\n interestRate: 0.01, // 1.0% daily\n robberyDefense: 0.35,\n perks: [\"$200,000 capacity\", \"1.0% daily compound interest\", \"35% robbery defense\"],\n },\n {\n tier: 4,\n name: \"Titanium Security Depository\",\n capacity: 1000000,\n upgradeCost: 350000,\n interestRate: 0.018, // 1.8% daily\n robberyDefense: 0.6,\n perks: [\"$1,000,000 capacity\", \"1.8% daily compound interest\", \"60% robbery defense\"],\n },\n {\n tier: 5,\n name: \"Swiss Offshore Bunker\",\n capacity: 5000000,\n upgradeCost: 1500000,\n interestRate: 0.025, // 2.5% daily\n robberyDefense: 0.85,\n perks: [\"$5,000,000 capacity\", \"2.5% daily compound interest\", \"85% robbery defense\", \"Tax evasion resistance\"],\n },\n {\n tier: 6,\n name: \"Quantum Orbital Reserve\",\n capacity: 25000000,\n upgradeCost: 8000000,\n interestRate: 0.04, // 4.0% daily\n robberyDefense: 1.0,\n perks: [\"$25,000,000 capacity\", \"4.0% daily compound interest\", \"100% robbery immunity (Satellite defense)\"],\n },\n];\n\nexport class VaultManager {\n private bank: BankManager;\n private tiers: BankVaultTier[] = DEFAULT_VAULT_TIERS;\n\n constructor(bank: BankManager, customTiers?: BankVaultTier[]) {\n this.bank = bank;\n if (customTiers && customTiers.length > 0) {\n this.tiers = customTiers;\n }\n }\n\n public getVaultTiers(): BankVaultTier[] {\n return this.tiers;\n }\n\n public getVaultTier(tierNumber: number): BankVaultTier {\n return this.tiers.find((t) => t.tier === tierNumber) || this.tiers[0];\n }\n\n public async getUserVault(userId: string, guildId?: string): Promise<{\n currentTier: BankVaultTier;\n nextTier?: BankVaultTier;\n bank: number;\n capacity: number;\n dailyInterestAccrual: number;\n canClaimInterest: boolean;\n }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const tierNum = acc.bankTier || 1;\n const currentTier = this.getVaultTier(tierNum);\n const nextTier = this.tiers.find((t) => t.tier === tierNum + 1);\n\n const dailyInterestAccrual = Math.floor(acc.bank * currentTier.interestRate);\n const lastClaim = acc.lastInterestClaimedAt || 0;\n const oneDayMs = 24 * 60 * 60 * 1000;\n const canClaimInterest = Date.now() - lastClaim >= oneDayMs && acc.bank > 0 && currentTier.interestRate > 0;\n\n return {\n currentTier,\n nextTier,\n bank: acc.bank,\n capacity: acc.bankCapacity,\n dailyInterestAccrual,\n canClaimInterest,\n };\n }\n\n /**\n * Upgrades the user's bank vault to the next tier.\n */\n public async upgradeVault(userId: string, guildId?: string): Promise<{\n success: boolean;\n previousTier: BankVaultTier;\n newTier: BankVaultTier;\n cost: number;\n newCapacity: number;\n error?: string;\n }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const currentTierNum = acc.bankTier || 1;\n const currentTier = this.getVaultTier(currentTierNum);\n\n const nextTier = this.tiers.find((t) => t.tier === currentTierNum + 1);\n if (!nextTier) {\n return {\n success: false,\n previousTier: currentTier,\n newTier: currentTier,\n cost: 0,\n newCapacity: acc.bankCapacity,\n error: \"Your bank vault is already at the maximum tier (Quantum Orbital Reserve)!\",\n };\n }\n\n if (acc.wallet < nextTier.upgradeCost) {\n return {\n success: false,\n previousTier: currentTier,\n newTier: nextTier,\n cost: nextTier.upgradeCost,\n newCapacity: acc.bankCapacity,\n error: `Insufficient cash in wallet. Upgrade costs $${nextTier.upgradeCost.toLocaleString()}, you have $${acc.wallet.toLocaleString()}.`,\n };\n }\n\n acc.wallet -= nextTier.upgradeCost;\n acc.stats.totalSpent += nextTier.upgradeCost;\n acc.bankTier = nextTier.tier;\n acc.bankCapacity = nextTier.capacity;\n\n await this.bank.saveAccount(acc);\n\n return {\n success: true,\n previousTier: currentTier,\n newTier: nextTier,\n cost: nextTier.upgradeCost,\n newCapacity: nextTier.capacity,\n };\n }\n\n /**\n * Claims accumulated 24h compound interest on savings.\n */\n public async claimDailyInterest(userId: string, guildId?: string): Promise<{\n success: boolean;\n interestEarned: number;\n newBankBalance: number;\n rate: number;\n cooldownRemainingMs?: number;\n error?: string;\n }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const tier = this.getVaultTier(acc.bankTier || 1);\n\n if (tier.interestRate <= 0) {\n return {\n success: false,\n interestEarned: 0,\n newBankBalance: acc.bank,\n rate: 0,\n error: \"Your current vault tier does not yield interest. Upgrade to Community Safe (Tier 2) or higher!\",\n };\n }\n\n const lastClaim = acc.lastInterestClaimedAt || 0;\n const oneDayMs = 24 * 60 * 60 * 1000;\n const timeSince = Date.now() - lastClaim;\n\n if (timeSince < oneDayMs) {\n return {\n success: false,\n interestEarned: 0,\n newBankBalance: acc.bank,\n rate: tier.interestRate,\n cooldownRemainingMs: oneDayMs - timeSince,\n error: `Interest is distributed every 24 hours. Next payout in ${Math.ceil((oneDayMs - timeSince) / (60 * 1000))} minutes.`,\n };\n }\n\n if (acc.bank <= 0) {\n return {\n success: false,\n interestEarned: 0,\n newBankBalance: 0,\n rate: tier.interestRate,\n error: \"Your bank vault is empty. Deposit funds to earn compound interest!\",\n };\n }\n\n const interest = Math.floor(acc.bank * tier.interestRate);\n const availableSpace = Math.max(0, acc.bankCapacity - acc.bank);\n const actualInterest = Math.min(interest, availableSpace);\n\n acc.bank += actualInterest;\n acc.stats.totalEarned += actualInterest;\n acc.lastInterestClaimedAt = Date.now();\n\n await this.bank.saveAccount(acc);\n\n return {\n success: true,\n interestEarned: actualInterest,\n newBankBalance: acc.bank,\n rate: tier.interestRate,\n };\n }\n}\n\n","/**\n * @m3rcena/eco\n * Credit Score, Bank Loans & Debt Collection Engine.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { BankManager } from \"./BankManager.js\";\nimport { LoanOffer, LoanTier, UserLoan, CreditScoreData, CreditRating } from \"../types.js\";\n\nexport const LOAN_CATALOG: LoanOffer[] = [\n {\n tier: \"starter\",\n name: \"Micro Personal Advance\",\n principal: 10000,\n interestRate: 0.05, // 5%\n totalDue: 10500,\n minCreditScore: 500,\n durationHours: 48,\n description: \"Low-risk starter loan to fund early work tools or safety equipment.\",\n },\n {\n tier: \"business\",\n name: \"Small Enterprise Commercial Credit\",\n principal: 50000,\n interestRate: 0.08, // 8%\n totalDue: 54000,\n minCreditScore: 600,\n durationHours: 72,\n description: \"Working capital to acquire commercial businesses or hire employees.\",\n },\n {\n tier: \"commercial\",\n name: \"Metropolitan Venture Capital Loan\",\n principal: 250000,\n interestRate: 0.12, // 12%\n totalDue: 280000,\n minCreditScore: 700,\n durationHours: 96,\n description: \"Substantial institutional backing for high-stakes market operations.\",\n },\n {\n tier: \"whale\",\n name: \"Syndicate High-Roller Credit Line\",\n principal: 1000000,\n interestRate: 0.15, // 15%\n totalDue: 1150000,\n minCreditScore: 780,\n durationHours: 120,\n description: \"Massive institutional liquidity reserved for elite tycoons and syndicates.\",\n },\n];\n\nexport class LoanManager {\n private bank: BankManager;\n private offers: LoanOffer[] = LOAN_CATALOG;\n\n constructor(bank: BankManager, customOffers?: LoanOffer[]) {\n this.bank = bank;\n if (customOffers && customOffers.length > 0) {\n this.offers = customOffers;\n }\n }\n\n public getOffers(): LoanOffer[] {\n return this.offers;\n }\n\n public getRatingForScore(score: number): CreditRating {\n if (score >= 800) return \"EXCELLENT\";\n if (score >= 740) return \"VERY_GOOD\";\n if (score >= 670) return \"GOOD\";\n if (score >= 580) return \"FAIR\";\n return \"POOR\";\n }\n\n public async getCreditScore(userId: string, guildId?: string): Promise<CreditScoreData> {\n const acc = await this.bank.getAccount(userId, guildId);\n if (!acc.creditScore) {\n acc.creditScore = {\n score: 650,\n rating: \"FAIR\",\n loansRepaid: 0,\n defaultsCount: 0,\n taxesPaid: 0,\n };\n await this.bank.saveAccount(acc);\n }\n acc.creditScore.rating = this.getRatingForScore(acc.creditScore.score);\n return acc.creditScore;\n }\n\n public async getUserLoans(userId: string, guildId?: string): Promise<UserLoan[]> {\n const acc = await this.bank.getAccount(userId, guildId);\n return acc.loans || [];\n }\n\n /**\n * Applies for a new bank loan.\n */\n public async applyLoan(userId: string, tier: LoanTier, guildId?: string): Promise<{\n success: boolean;\n loan?: UserLoan;\n creditScore: number;\n error?: string;\n }> {\n const offer = this.offers.find((o) => o.tier === tier);\n if (!offer) {\n return { success: false, creditScore: 0, error: `Loan tier \"${tier}\" does not exist.` };\n }\n\n const acc = await this.bank.getAccount(userId, guildId);\n const credit = await this.getCreditScore(userId, guildId);\n\n if (credit.score < offer.minCreditScore) {\n return {\n success: false,\n creditScore: credit.score,\n error: `Credit score too low for ${offer.name}. Required: ${offer.minCreditScore}, Your Score: ${credit.score} (${credit.rating}).`,\n };\n }\n\n const activeLoans = (acc.loans || []).filter((l) => l.status === \"active\");\n if (activeLoans.length >= 2) {\n return {\n success: false,\n creditScore: credit.score,\n error: \"Maximum of 2 concurrent active loans permitted. Please repay outstanding debts first.\",\n };\n }\n\n const hasDefaulted = (acc.loans || []).some((l) => l.status === \"defaulted\");\n if (hasDefaulted) {\n return {\n success: false,\n creditScore: credit.score,\n error: \"Your account is flagged for an outstanding defaulted debt! Settle past debts to unfreeze credit lines.\",\n };\n }\n\n const now = Date.now();\n const newLoan: UserLoan = {\n id: \"loan_\" + Math.random().toString(36).substring(2, 8),\n tier: offer.tier,\n name: offer.name,\n principal: offer.principal,\n totalDue: offer.totalDue,\n remainingDue: offer.totalDue,\n takenAt: now,\n dueAt: now + offer.durationHours * 3600 * 1000,\n status: \"active\",\n };\n\n if (!acc.loans) acc.loans = [];\n acc.loans.push(newLoan);\n\n // Deposit loan cash into wallet\n acc.wallet += offer.principal;\n acc.stats.totalEarned += offer.principal;\n\n await this.bank.saveAccount(acc);\n\n return {\n success: true,\n loan: newLoan,\n creditScore: credit.score,\n };\n }\n\n /**\n * Repays active debt.\n */\n public async repayLoan(userId: string, loanId: string, amount: number | \"all\", guildId?: string): Promise<{\n success: boolean;\n amountPaid: number;\n remainingDue: number;\n isFullyPaid: boolean;\n newCreditScore: number;\n error?: string;\n }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const loan = (acc.loans || []).find((l) => l.id === loanId);\n\n if (!loan) {\n return { success: false, amountPaid: 0, remainingDue: 0, isFullyPaid: false, newCreditScore: 0, error: `Loan \"${loanId}\" not found.` };\n }\n\n if (loan.status === \"paid\") {\n return { success: false, amountPaid: 0, remainingDue: 0, isFullyPaid: true, newCreditScore: acc.creditScore?.score || 650, error: \"This loan has already been fully repaid.\" };\n }\n\n const paymentAmount = amount === \"all\" ? loan.remainingDue : Math.min(amount, loan.remainingDue);\n\n if (acc.wallet < paymentAmount) {\n return {\n success: false,\n amountPaid: 0,\n remainingDue: loan.remainingDue,\n isFullyPaid: false,\n newCreditScore: acc.creditScore?.score || 650,\n error: `Insufficient funds in wallet. Need $${paymentAmount.toLocaleString()}, you have $${acc.wallet.toLocaleString()}.`,\n };\n }\n\n acc.wallet -= paymentAmount;\n acc.stats.totalSpent += paymentAmount;\n loan.remainingDue = Math.max(0, loan.remainingDue - paymentAmount);\n\n let isFullyPaid = false;\n let scoreBoost = 0;\n\n if (!acc.creditScore) {\n acc.creditScore = { score: 650, rating: \"FAIR\", loansRepaid: 0, defaultsCount: 0, taxesPaid: 0 };\n }\n\n if (loan.remainingDue <= 0) {\n loan.status = \"paid\";\n isFullyPaid = true;\n acc.creditScore.loansRepaid += 1;\n scoreBoost = loan.tier === \"whale\" ? 45 : loan.tier === \"commercial\" ? 35 : loan.tier === \"business\" ? 25 : 15;\n acc.creditScore.score = Math.min(850, acc.creditScore.score + scoreBoost);\n acc.creditScore.rating = this.getRatingForScore(acc.creditScore.score);\n }\n\n await this.bank.saveAccount(acc);\n\n return {\n success: true,\n amountPaid: paymentAmount,\n remainingDue: loan.remainingDue,\n isFullyPaid,\n newCreditScore: acc.creditScore.score,\n };\n }\n\n /**\n * Audits active debts and executes repo / collections on defaulted loans.\n */\n public async processCollections(userId: string, guildId?: string): Promise<{\n defaultedLoans: UserLoan[];\n garnishedCash: number;\n scorePenalty: number;\n newScore: number;\n }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const loans = acc.loans || [];\n const now = Date.now();\n\n const defaulted: UserLoan[] = [];\n let totalGarnished = 0;\n let totalPenalty = 0;\n\n if (!acc.creditScore) {\n acc.creditScore = { score: 650, rating: \"FAIR\", loansRepaid: 0, defaultsCount: 0, taxesPaid: 0 };\n }\n\n for (const loan of loans) {\n if (loan.status === \"active\" && now > loan.dueAt) {\n loan.status = \"defaulted\";\n defaulted.push(loan);\n acc.creditScore.defaultsCount += 1;\n\n // Penalty 75 points per default\n const penalty = 75;\n acc.creditScore.score = Math.max(300, acc.creditScore.score - penalty);\n totalPenalty += penalty;\n\n // Wage garnishment: seize up to 60% of wallet cash\n const garnishment = Math.min(loan.remainingDue, Math.floor(acc.wallet * 0.6));\n if (garnishment > 0) {\n acc.wallet -= garnishment;\n loan.remainingDue -= garnishment;\n totalGarnished += garnishment;\n }\n }\n }\n\n acc.creditScore.rating = this.getRatingForScore(acc.creditScore.score);\n if (defaulted.length > 0) {\n await this.bank.saveAccount(acc);\n }\n\n return {\n defaultedLoans: defaulted,\n garnishedCash: totalGarnished,\n scorePenalty: totalPenalty,\n newScore: acc.creditScore.score,\n };\n }\n}\n\n","/**\n * @m3rcena/eco\n * Municipal Bills, Progressive Wealth Taxes & IRS Audit Engine.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { BankManager } from \"./BankManager.js\";\nimport { MunicipalBill } from \"../types.js\";\n\nexport class TaxManager {\n private bank: BankManager;\n\n constructor(bank: BankManager) {\n this.bank = bank;\n }\n\n public async getPendingBills(userId: string, guildId?: string): Promise<MunicipalBill[]> {\n const acc = await this.bank.getAccount(userId, guildId);\n return (acc.bills || []).filter((b) => !b.isPaid);\n }\n\n public async getAllBills(userId: string, guildId?: string): Promise<MunicipalBill[]> {\n const acc = await this.bank.getAccount(userId, guildId);\n return acc.bills || [];\n }\n\n /**\n * Generates municipal bills & progressive wealth taxes if due.\n */\n public async generateBillsIfDue(userId: string, guildId?: string): Promise<{\n generated: boolean;\n newBills: MunicipalBill[];\n totalBilled: number;\n }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const now = Date.now();\n const lastBilled = acc.streak.lastMonthly || 0; // Using monthly cycle\n const cycleMs = 7 * 24 * 60 * 60 * 1000; // 7 days billing cycle\n\n if (!acc.bills) acc.bills = [];\n\n // Check if user already has active unpaid bills\n const unpaid = acc.bills.filter((b) => !b.isPaid);\n if (unpaid.length >= 4) {\n return { generated: false, newBills: [], totalBilled: 0 };\n }\n\n const netWorth = acc.wallet + acc.bank;\n const newBills: MunicipalBill[] = [];\n\n // 1. Grid & Utility Data Bill\n const bizCount = (acc.businesses || []).length;\n const utilityCost = 1500 + bizCount * 800;\n newBills.push({\n id: \"bill_util_\" + Math.random().toString(36).substring(2, 8),\n type: \"utility\",\n title: \"⚡ Quantum Grid & Data Bandwidth Utilities\",\n amount: utilityCost,\n issuedAt: now,\n dueAt: now + 48 * 3600 * 1000,\n isPaid: false,\n });\n\n // 2. Vault Security & Maintenance\n const vaultTier = acc.bankTier || 1;\n if (vaultTier > 1) {\n const maintenance = vaultTier * 1250;\n newBills.push({\n id: \"bill_vault_\" + Math.random().toString(36).substring(2, 8),\n type: \"vault_maintenance\",\n title: \"🛡️ High-Security Vault Armored Maintenance\",\n amount: maintenance,\n issuedAt: now,\n dueAt: now + 72 * 3600 * 1000,\n isPaid: false,\n });\n }\n\n // 3. Progressive Wealth Tax (if net worth > $50,000)\n if (netWorth >= 50000) {\n let taxRate = 0.02; // 2% for 50k-250k\n if (netWorth >= 1000000) taxRate = 0.08; // 8% for 1M+\n else if (netWorth >= 250000) taxRate = 0.05; // 5% for 250k-1M\n\n const taxAmount = Math.floor(netWorth * taxRate);\n newBills.push({\n id: \"bill_tax_\" + Math.random().toString(36).substring(2, 8),\n type: \"wealth_tax\",\n title: `🏛️ Department of Revenue: ${(taxRate * 100).toFixed(0)}% Progressive Wealth Tax`,\n amount: taxAmount,\n issuedAt: now,\n dueAt: now + 96 * 3600 * 1000,\n isPaid: false,\n });\n }\n\n acc.bills.push(...newBills);\n await this.bank.saveAccount(acc);\n\n const totalBilled = newBills.reduce((sum, b) => sum + b.amount, 0);\n return { generated: true, newBills, totalBilled };\n }\n\n /**\n * Pays a specific municipal bill.\n */\n public async payBill(userId: string, billId: string, guildId?: string): Promise<{\n success: boolean;\n bill?: MunicipalBill;\n amountPaid: number;\n newCreditScore: number;\n error?: string;\n }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const bill = (acc.bills || []).find((b) => b.id === billId);\n\n if (!bill) {\n return { success: false, amountPaid: 0, newCreditScore: 0, error: `Bill \"${billId}\" not found.` };\n }\n\n if (bill.isPaid) {\n return { success: false, amountPaid: 0, newCreditScore: acc.creditScore?.score || 650, error: \"This bill has already been settled.\" };\n }\n\n if (acc.wallet < bill.amount) {\n return {\n success: false,\n amountPaid: 0,\n newCreditScore: acc.creditScore?.score || 650,\n error: `Insufficient cash in wallet. Bill amount: $${bill.amount.toLocaleString()}, you have $${acc.wallet.toLocaleString()}.`,\n };\n }\n\n acc.wallet -= bill.amount;\n acc.stats.totalSpent += bill.amount;\n bill.isPaid = true;\n\n if (!acc.creditScore) {\n acc.creditScore = { score: 650, rating: \"FAIR\", loansRepaid: 0, defaultsCount: 0, taxesPaid: 0 };\n }\n\n acc.creditScore.taxesPaid += 1;\n acc.creditScore.score = Math.min(850, acc.creditScore.score + 10);\n\n await this.bank.saveAccount(acc);\n\n return {\n success: true,\n bill,\n amountPaid: bill.amount,\n newCreditScore: acc.creditScore.score,\n };\n }\n\n /**\n * Settles all pending municipal bills at once.\n */\n public async payAllBills(userId: string, guildId?: string): Promise<{\n success: boolean;\n paidCount: number;\n totalAmountPaid: number;\n newCreditScore: number;\n error?: string;\n }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const pending = (acc.bills || []).filter((b) => !b.isPaid);\n\n if (pending.length === 0) {\n return { success: true, paidCount: 0, totalAmountPaid: 0, newCreditScore: acc.creditScore?.score || 650 };\n }\n\n const totalCost = pending.reduce((sum, b) => sum + b.amount, 0);\n\n if (acc.wallet < totalCost) {\n return {\n success: false,\n paidCount: 0,\n totalAmountPaid: 0,\n newCreditScore: acc.creditScore?.score || 650,\n error: `Insufficient cash to settle all bills. Total: $${totalCost.toLocaleString()}, you have $${acc.wallet.toLocaleString()}.`,\n };\n }\n\n acc.wallet -= totalCost;\n acc.stats.totalSpent += totalCost;\n for (const b of pending) {\n b.isPaid = true;\n }\n\n if (!acc.creditScore) {\n acc.creditScore = { score: 650, rating: \"FAIR\", loansRepaid: 0, defaultsCount: 0, taxesPaid: 0 };\n }\n\n acc.creditScore.taxesPaid += pending.length;\n acc.creditScore.score = Math.min(850, acc.creditScore.score + 25);\n\n await this.bank.saveAccount(acc);\n\n return {\n success: true,\n paidCount: pending.length,\n totalAmountPaid: totalCost,\n newCreditScore: acc.creditScore.score,\n };\n }\n\n /**\n * Attempts high-risk offshore tax evasion to wipe pending wealth taxes.\n */\n public async attemptTaxEvasion(userId: string, guildId?: string): Promise<{\n success: boolean;\n taxesEvaded: number;\n penaltyFined: number;\n creditScoreChange: number;\n newCreditScore: number;\n auditDetails: string;\n }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const wealthTaxBills = (acc.bills || []).filter((b) => !b.isPaid && b.type === \"wealth_tax\");\n\n if (wealthTaxBills.length === 0) {\n return {\n success: false,\n taxesEvaded: 0,\n penaltyFined: 0,\n creditScoreChange: 0,\n newCreditScore: acc.creditScore?.score || 650,\n auditDetails: \"No active wealth tax bills to evade.\",\n };\n }\n\n const totalTaxes = wealthTaxBills.reduce((sum, b) => sum + b.amount, 0);\n const roll = Math.random();\n\n // 40% success rate (Swiss vault tier boosts odds)\n const isSwissTier = (acc.bankTier || 1) >= 5;\n const successRate = isSwissTier ? 0.65 : 0.4;\n const isEvaded = roll < successRate;\n\n if (!acc.creditScore) {\n acc.creditScore = { score: 650, rating: \"FAIR\", loansRepaid: 0, defaultsCount: 0, taxesPaid: 0 };\n }\n\n if (isEvaded) {\n // Succeeded in routing funds through anonymous offshore trusts\n for (const b of wealthTaxBills) {\n b.isPaid = true;\n }\n await this.bank.saveAccount(acc);\n\n return {\n success: true,\n taxesEvaded: totalTaxes,\n penaltyFined: 0,\n creditScoreChange: 0,\n newCreditScore: acc.creditScore.score,\n auditDetails: `💼 **OFFSHORE SUCCESS!** Routed $${totalTaxes.toLocaleString()} through anonymous Swiss shell trusts. Taxes eliminated!`,\n };\n } else {\n // Busted by financial regulatory audit!\n const fine = Math.floor(totalTaxes * 2.2);\n acc.wallet = Math.max(0, acc.wallet - fine);\n acc.stats.totalSpent += fine;\n acc.creditScore.score = Math.max(300, acc.creditScore.score - 50);\n\n for (const b of wealthTaxBills) {\n b.isPaid = true;\n }\n await this.bank.saveAccount(acc);\n\n return {\n success: false,\n taxesEvaded: 0,\n penaltyFined: fine,\n creditScoreChange: -50,\n newCreditScore: acc.creditScore.score,\n auditDetails: `🚨 **IRS AUDIT TRIGGERED!** Regulators seized illicit ledgers. Fined 2.2x penalty of $${fine.toLocaleString()} and credit score penalized!`,\n };\n }\n }\n}\n\n","/**\n * @m3rcena/eco\n * Visual Canvas Bank Card & Passport Renderer.\n * Generates personalized debit/credit card artwork using @napi-rs/canvas.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { createCanvas, loadImage, GlobalFonts } from \"@napi-rs/canvas\";\n\nexport interface BankCardRenderOptions {\n username: string;\n avatarUrl?: string;\n wallet: number;\n bank: number;\n netWorth: number;\n currencySymbol?: string;\n cardNumber?: string;\n cardTier?: \"BRONZE\" | \"SILVER\" | \"GOLD\" | \"PLATINUM\" | \"OBSIDIAN\" | \"MYTHIC\";\n joinDate?: string;\n creditScore?: number;\n vaultTierName?: string;\n customGradient?: [string, string, string];\n bankName?: string;\n}\n\nexport class RenderBankCard {\n /**\n * Generates a high-tech personalized debit/credit card buffer.\n */\n public static async renderCard(options: BankCardRenderOptions): Promise<Buffer> {\n const width = 850;\n const height = 500;\n const canvas = createCanvas(width, height);\n const ctx = canvas.getContext(\"2d\");\n\n const tier = options.cardTier || this.resolveTier(options.netWorth);\n const symbol = options.currencySymbol || \"🪙\";\n\n // 1. Draw rounded card outline clip\n const radius = 28;\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(radius, 0);\n ctx.lineTo(width - radius, 0);\n ctx.quadraticCurveTo(width, 0, width, radius);\n ctx.lineTo(width, height - radius);\n ctx.quadraticCurveTo(width, height, width - radius, height);\n ctx.lineTo(radius, height);\n ctx.quadraticCurveTo(0, height, 0, height - radius);\n ctx.lineTo(0, radius);\n ctx.quadraticCurveTo(0, 0, radius, 0);\n ctx.closePath();\n ctx.clip();\n\n // 2. Base gradient based on Tier or Custom Gradient\n const bgGrad = ctx.createLinearGradient(0, 0, width, height);\n if (options.customGradient && options.customGradient.length === 3) {\n bgGrad.addColorStop(0, options.customGradient[0]);\n bgGrad.addColorStop(0.5, options.customGradient[1]);\n bgGrad.addColorStop(1, options.customGradient[2]);\n } else if (tier === \"MYTHIC\") {\n bgGrad.addColorStop(0, \"#0f051d\");\n bgGrad.addColorStop(0.5, \"#2a0845\");\n bgGrad.addColorStop(1, \"#6441a5\");\n } else if (tier === \"OBSIDIAN\") {\n bgGrad.addColorStop(0, \"#0a0a0c\");\n bgGrad.addColorStop(0.5, \"#18181b\");\n bgGrad.addColorStop(1, \"#27272a\");\n } else if (tier === \"PLATINUM\") {\n bgGrad.addColorStop(0, \"#1e293b\");\n bgGrad.addColorStop(0.5, \"#334155\");\n bgGrad.addColorStop(1, \"#64748b\");\n } else if (tier === \"GOLD\") {\n bgGrad.addColorStop(0, \"#2c1c02\");\n bgGrad.addColorStop(0.5, \"#78350f\");\n bgGrad.addColorStop(1, \"#d97706\");\n } else if (tier === \"SILVER\") {\n bgGrad.addColorStop(0, \"#1e1e24\");\n bgGrad.addColorStop(0.5, \"#4b5563\");\n bgGrad.addColorStop(1, \"#9ca3af\");\n } else {\n // BRONZE\n bgGrad.addColorStop(0, \"#1c1008\");\n bgGrad.addColorStop(0.5, \"#451a03\");\n bgGrad.addColorStop(1, \"#92400e\");\n }\n\n ctx.fillStyle = bgGrad;\n ctx.fillRect(0, 0, width, height);\n\n // Decorative holographic arcs\n ctx.save();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = \"rgba(255, 255, 255, 0.08)\";\n for (let i = 0; i < 6; i++) {\n ctx.beginPath();\n ctx.arc(width - 80, -40, 220 + i * 50, 0, Math.PI * 2);\n ctx.stroke();\n }\n ctx.restore();\n\n // 3. Bank Logo / Brand header\n const brandName = options.bankName || \"M3RCENA RESERVE\";\n ctx.fillStyle = \"#ffffff\";\n ctx.font = \"800 28px sans-serif\";\n ctx.fillText(brandName, 50, 65);\n\n const subtitle = options.vaultTierName ? `VAULT: ${options.vaultTierName.toUpperCase()}` : \"PRIVATE WEALTH & VAULT\";\n ctx.fillStyle = \"rgba(255, 255, 255, 0.65)\";\n ctx.font = \"600 16px sans-serif\";\n ctx.fillText(subtitle, 50, 92);\n\n // Contactless pay symbol\n this.drawContactless(ctx, width - 80, 65);\n\n // 4. Smart Chip & NFC circuits\n this.drawChip(ctx, 50, 140);\n\n // Tier Watermark badge\n ctx.save();\n ctx.fillStyle = \"rgba(255, 255, 255, 0.12)\";\n ctx.font = \"900 48px sans-serif\";\n ctx.textAlign = \"right\";\n ctx.fillText(tier, width - 50, 180);\n ctx.restore();\n\n // 5. Card Number (Embossed look)\n const cardNum = options.cardNumber || `4280 •••• •••• ${Math.floor(1000 + Math.random() * 9000)}`;\n ctx.fillStyle = \"#f8fafc\";\n ctx.font = \"600 32px monospace\";\n ctx.letterSpacing = \"4px\";\n ctx.shadowColor = \"rgba(0, 0, 0, 0.75)\";\n ctx.shadowBlur = 4;\n ctx.fillText(cardNum, 50, 265);\n ctx.shadowBlur = 0; // reset\n\n // 6. Balances & Net Worth\n ctx.fillStyle = \"rgba(255, 255, 255, 0.6)\";\n ctx.font = \"700 13px sans-serif\";\n ctx.fillText(\"TOTAL NET WORTH\", 50, 325);\n ctx.fillText(\"WALLET / VAULT\", 360, 325);\n\n ctx.fillStyle = \"#38bdf8\";\n ctx.font = \"800 24px sans-serif\";\n ctx.fillText(`${symbol} ${options.netWorth.toLocaleString()}`, 50, 355);\n\n ctx.fillStyle = \"#10b981\";\n ctx.font = \"700 20px sans-serif\";\n ctx.fillText(`${symbol} ${options.wallet.toLocaleString()}`, 360, 355);\n\n ctx.fillStyle = \"rgba(255, 255, 255, 0.4)\";\n ctx.font = \"600 16px sans-serif\";\n ctx.fillText(`+ ${symbol} ${options.bank.toLocaleString()} in bank`, 360, 380);\n\n // 7. Cardholder Name, Credit Score & Avatar\n ctx.fillStyle = \"rgba(255, 255, 255, 0.6)\";\n ctx.font = \"700 13px sans-serif\";\n const creditStr = options.creditScore ? ` • FICO CREDIT: ${options.creditScore}` : \"\";\n ctx.fillText(`CARDHOLDER${creditStr}`, 50, 425);\n\n ctx.fillStyle = \"#ffffff\";\n ctx.font = \"800 24px sans-serif\";\n ctx.fillText(options.username.toUpperCase(), 50, 455);\n\n // Draw Avatar if provided\n if (options.avatarUrl) {\n try {\n const avatarImg = await loadImage(options.avatarUrl);\n const avX = width - 110;\n const avY = height - 110;\n const avSize = 65;\n\n ctx.save();\n ctx.beginPath();\n ctx.arc(avX + avSize / 2, avY + avSize / 2, avSize / 2, 0, Math.PI * 2);\n ctx.closePath();\n ctx.clip();\n ctx.drawImage(avatarImg, avX, avY, avSize, avSize);\n ctx.restore();\n\n // Avatar ring\n ctx.strokeStyle = \"#38bdf8\";\n ctx.lineWidth = 3;\n ctx.beginPath();\n ctx.arc(avX + avSize / 2, avY + avSize / 2, avSize / 2, 0, Math.PI * 2);\n ctx.stroke();\n } catch {}\n }\n\n // Holographic Mastercard / Visa style circles\n this.drawHoloCircles(ctx, width - 180, height - 78);\n\n ctx.restore(); // restore clip\n return canvas.toBuffer(\"image/png\");\n }\n\n private static resolveTier(netWorth: number): \"BRONZE\" | \"SILVER\" | \"GOLD\" | \"PLATINUM\" | \"OBSIDIAN\" | \"MYTHIC\" {\n if (netWorth >= 5_000_000) return \"MYTHIC\";\n if (netWorth >= 1_000_000) return \"OBSIDIAN\";\n if (netWorth >= 250_000) return \"PLATINUM\";\n if (netWorth >= 50_000) return \"GOLD\";\n if (netWorth >= 10_000) return \"SILVER\";\n return \"BRONZE\";\n }\n\n private static drawChip(ctx: any, x: number, y: number): void {\n const chipW = 60;\n const chipH = 46;\n ctx.save();\n ctx.fillStyle = \"#e2b860\";\n ctx.strokeStyle = \"#92681e\";\n ctx.lineWidth = 1.5;\n\n ctx.beginPath();\n ctx.roundRect ? ctx.roundRect(x, y, chipW, chipH, 8) : ctx.rect(x, y, chipW, chipH);\n ctx.fill();\n ctx.stroke();\n\n // Internal circuit lines\n ctx.beginPath();\n ctx.moveTo(x + chipW * 0.35, y);\n ctx.lineTo(x + chipW * 0.35, y + chipH);\n ctx.moveTo(x + chipW * 0.65, y);\n ctx.lineTo(x + chipW * 0.65, y + chipH);\n ctx.moveTo(x, y + chipH * 0.5);\n ctx.lineTo(x + chipW, y + chipH * 0.5);\n ctx.stroke();\n\n ctx.restore();\n }\n\n private static drawContactless(ctx: any, x: number, y: number): void {\n ctx.save();\n ctx.strokeStyle = \"rgba(255, 255, 255, 0.75)\";\n ctx.lineWidth = 2.5;\n ctx.lineCap = \"round\";\n\n for (let i = 0; i < 3; i++) {\n ctx.beginPath();\n ctx.arc(x, y, 12 + i * 8, -Math.PI * 0.3, Math.PI * 0.3);\n ctx.stroke();\n }\n ctx.restore();\n }\n\n private static drawHoloCircles(ctx: any, x: number, y: number): void {\n ctx.save();\n ctx.beginPath();\n ctx.arc(x - 14, y, 22, 0, Math.PI * 2);\n ctx.fillStyle = \"rgba(239, 68, 68, 0.7)\";\n ctx.fill();\n\n ctx.beginPath();\n ctx.arc(x + 14, y, 22, 0, Math.PI * 2);\n ctx.fillStyle = \"rgba(245, 158, 11, 0.7)\";\n ctx.fill();\n ctx.restore();\n }\n}\n\n","/**\n * @m3rcena/eco\n * Stock & Crypto Canvas Chart Renderer.\n * Generates dynamic candlestick / sparkline price trend charts.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { createCanvas } from \"@napi-rs/canvas\";\n\nexport interface StockChartOptions {\n symbol: string;\n name: string;\n history: number[];\n currentPrice: number;\n change24h: number;\n currencySymbol?: string;\n}\n\nexport class RenderMarketChart {\n /**\n * Generates a sleek dark mode price chart buffer.\n */\n public static renderChart(options: StockChartOptions): Buffer {\n const width = 800;\n const height = 400;\n const canvas = createCanvas(width, height);\n const ctx = canvas.getContext(\"2d\");\n\n const isPositive = options.change24h >= 0;\n const accentColor = isPositive ? \"#10b981\" : \"#ef4444\";\n const history = options.history && options.history.length > 1 ? options.history : [options.currentPrice * 0.95, options.currentPrice];\n\n // Background\n ctx.fillStyle = \"#090d16\";\n ctx.fillRect(0, 0, width, height);\n\n // Grid lines\n ctx.strokeStyle = \"rgba(255, 255, 255, 0.05)\";\n ctx.lineWidth = 1;\n for (let y = 80; y < height - 50; y += 50) {\n ctx.beginPath();\n ctx.moveTo(40, y);\n ctx.lineTo(width - 40, y);\n ctx.stroke();\n }\n\n // Header info\n ctx.fillStyle = \"#ffffff\";\n ctx.font = \"800 24px sans-serif\";\n ctx.fillText(`${options.symbol} • ${options.name}`, 40, 48);\n\n const sym = options.currencySymbol || \"$\";\n ctx.font = \"800 28px monospace\";\n ctx.fillStyle = \"#ffffff\";\n ctx.fillText(`${sym}${options.currentPrice.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`, 40, 90);\n\n ctx.font = \"700 18px monospace\";\n ctx.fillStyle = accentColor;\n const sign = isPositive ? \"+\" : \"\";\n ctx.fillText(`${sign}${options.change24h.toFixed(2)}% (24h)`, 280, 90);\n\n // Plot chart points\n const minVal = Math.min(...history) * 0.98;\n const maxVal = Math.max(...history) * 1.02;\n const range = maxVal - minVal || 1;\n\n const plotX = 40;\n const plotY = 130;\n const plotW = width - 80;\n const plotH = height - 170;\n\n const points: { x: number; y: number }[] = [];\n for (let i = 0; i < history.length; i++) {\n const x = plotX + (i / (history.length - 1)) * plotW;\n const y = plotY + plotH - ((history[i] - minVal) / range) * plotH;\n points.push({ x, y });\n }\n\n // Gradient Area Fill under the line\n const areaGrad = ctx.createLinearGradient(0, plotY, 0, plotY + plotH);\n areaGrad.addColorStop(0, isPositive ? \"rgba(16, 185, 129, 0.25)\" : \"rgba(239, 68, 68, 0.25)\");\n areaGrad.addColorStop(1, \"rgba(0, 0, 0, 0)\");\n\n ctx.beginPath();\n ctx.moveTo(points[0].x, plotY + plotH);\n for (const pt of points) {\n ctx.lineTo(pt.x, pt.y);\n }\n ctx.lineTo(points[points.length - 1].x, plotY + plotH);\n ctx.closePath();\n ctx.fillStyle = areaGrad;\n ctx.fill();\n\n // Chart Line\n ctx.strokeStyle = accentColor;\n ctx.lineWidth = 3;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n ctx.beginPath();\n ctx.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i].x, points[i].y);\n }\n ctx.stroke();\n\n // End point indicator glowing dot\n const lastPt = points[points.length - 1];\n ctx.fillStyle = accentColor;\n ctx.shadowColor = accentColor;\n ctx.shadowBlur = 10;\n ctx.beginPath();\n ctx.arc(lastPt.x, lastPt.y, 6, 0, Math.PI * 2);\n ctx.fill();\n ctx.shadowBlur = 0;\n\n // High / Low watermark\n ctx.font = \"600 13px sans-serif\";\n ctx.fillStyle = \"rgba(255, 255, 255, 0.4)\";\n ctx.fillText(`24h Low: ${sym}${minVal.toFixed(2)}`, 40, height - 16);\n ctx.fillText(`24h High: ${sym}${maxVal.toFixed(2)}`, width - 200, height - 16);\n\n return canvas.toBuffer(\"image/png\");\n }\n}\n\n","/**\n * @m3rcena/eco\n * Terminal update notification box utility.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nconst yellow = (s: string) => `\\x1b[33m${s}\\x1b[39m`;\nconst green = (s: string) => `\\x1b[32m${s}\\x1b[39m`;\nconst red = (s: string) => `\\x1b[31m${s}\\x1b[39m`;\nconst cyan = (s: string) => `\\x1b[36m${s}\\x1b[39m`;\n\nexport const ECO_VERSION = \"14.28.1\";\n\n/**\n * Strips ANSI color escape codes to compute visible string length.\n */\nexport function stripAnsi(str: string): string {\n return str.replace(/\\x1B\\[[0-9;]*[a-zA-Z]/g, \"\");\n}\n\n/**\n * Renders an array of text messages inside a styled terminal box.\n */\nexport function boxConsole(messages: string[]): void {\n const defaultSpace = 4;\n const stripped = messages.map((m) => stripAnsi(m));\n const maxLen = Math.max(...stripped.map((s) => s.length)) + defaultSpace * 2;\n const line = yellow(\"─\".repeat(maxLen));\n\n console.log(yellow(\"┌\") + line + yellow(\"┐\"));\n console.log(yellow(\"│\") + \" \".repeat(maxLen) + yellow(\"│\"));\n\n for (let i = 0; i < messages.length; i++) {\n const len = stripped[i].length;\n const padTotal = maxLen - len;\n const padLeft = Math.floor(padTotal / 2);\n const padRight = padTotal - padLeft;\n console.log(yellow(\"│\") + \" \".repeat(padLeft) + messages[i] + \" \".repeat(padRight) + yellow(\"│\"));\n }\n\n console.log(yellow(\"│\") + \" \".repeat(maxLen) + yellow(\"│\"));\n console.log(yellow(\"└\") + line + yellow(\"┘\"));\n}\n\n/**\n * Compares two semantic version strings.\n * Returns -1 if v1 < v2, 0 if equal, 1 if v1 > v2.\n */\nexport function compareSemver(v1: string, v2: string): number {\n const clean1 = v1\n .replace(/^v/, \"\")\n .split(\"-\")[0]\n .split(\".\")\n .map((n) => parseInt(n, 10) || 0);\n const clean2 = v2\n .replace(/^v/, \"\")\n .split(\"-\")[0]\n .split(\".\")\n .map((n) => parseInt(n, 10) || 0);\n\n for (let i = 0; i < Math.max(clean1.length, clean2.length); i++) {\n const num1 = clean1[i] || 0;\n const num2 = clean2[i] || 0;\n if (num1 > num2) return 1;\n if (num1 < num2) return -1;\n }\n return 0;\n}\n\n/**\n * Fetches the latest published version of `@m3rcena/eco` from the npm registry.\n */\nexport async function fetchLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 3500);\n timer.unref?.();\n\n const res = await fetch(\"https://registry.npmjs.org/@m3rcena/eco/latest\", {\n signal: controller.signal,\n headers: { \"User-Agent\": \"@m3rcena/eco-update-notifier\" },\n });\n clearTimeout(timer);\n\n if (res.ok) {\n const data: any = await res.json();\n return typeof data.version === \"string\" ? data.version : null;\n }\n } catch {\n try {\n const { exec } = await import(\"child_process\");\n const { promisify } = await import(\"util\");\n const execPromise = promisify(exec);\n const { stdout } = await execPromise(\"npm show @m3rcena/eco version\", { timeout: 3500 });\n return stdout.trim() || null;\n } catch {\n return null;\n }\n }\n return null;\n}\n\n/**\n * Checks if a newer version of `@m3rcena/eco` is available and logs the notification box.\n */\nexport async function checkPackageUpdates(currentVersion: string = ECO_VERSION, disabled?: boolean): Promise<void> {\n if (disabled) return;\n\n try {\n const latest = await fetchLatestVersion();\n if (!latest) return;\n\n if (compareSemver(currentVersion, latest) < 0) {\n const messages: string[] = [\n `New ${green(\"version\")} of ${yellow(\"@m3rcena/eco\")} is available!`,\n `${red(currentVersion)} -> ${green(latest)}`,\n `Registry: ${cyan(\"https://www.npmjs.com/package/@m3rcena/eco\")}`,\n `Run ${green(`npm i @m3rcena/eco@${latest}`)} to update!`,\n ];\n\n boxConsole(messages);\n }\n } catch {\n // Silently ignore network failures\n }\n}\n","/**\n * @m3rcena/eco\n * Economy Bridge Package Router & Decoupled State Gateway.\n * Provides unified HTTP endpoints and WebSocket routing for real-time account dossiers,\n * bank vault upgrades, credit score management, loan issuance, bill settlement,\n * stock market trading, and custom visual Canvas card rendering.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { BridgePackageRouter, BridgeRequest, BridgeResponse, BridgeAction } from \"@m3rcena/bridge\";\nimport { EcoManager } from \"../EcoManager.js\";\nimport { RenderBankCard } from \"../canvas/RenderBankCard.js\";\nimport { RenderMarketChart } from \"../canvas/RenderMarketChart.js\";\nimport { LoanTier } from \"../types.js\";\nimport { ECO_VERSION } from \"../utils/Notifier.js\";\n\nexport class EcoBridgeRouter implements BridgePackageRouter {\n public name: string = \"economy\";\n public basePath: string = \"/api/eco\";\n public description: string = \"Universal economy engine, financial banking, loans, taxes, stock market, and debit card rendering.\";\n public version: string = ECO_VERSION;\n private eco: EcoManager;\n\n constructor(eco: EcoManager) {\n this.eco = eco;\n }\n\n public async handleRequest(req: BridgeRequest): Promise<BridgeResponse | null> {\n const path = req.subPath.replace(/\\/+$/, \"\") || \"/\";\n const method = req.method.toUpperCase();\n\n // 1. GET /account/:userId - Full Financial Dossier\n if (path.startsWith(\"/account/\") && method === \"GET\") {\n const userId = path.replace(\"/account/\", \"\").split(\"/\")[0];\n const guildId = (req.query.guildId as string) || undefined;\n\n try {\n const acc = await this.eco.getAccount(userId, guildId);\n const credit = await this.eco.getCreditScore(userId, guildId);\n const vault = await this.eco.getUserVault(userId, guildId);\n const loans = await this.eco.getUserLoans(userId, guildId);\n const bills = await this.eco.getPendingBills(userId, guildId);\n const portfolio = await this.eco.getStockPortfolio(userId, guildId);\n\n return {\n status: 200,\n body: {\n userId: acc.userId,\n wallet: acc.wallet,\n bank: acc.bank,\n bankCapacity: acc.bankCapacity,\n netWorth: acc.wallet + acc.bank,\n level: acc.level,\n xp: acc.xp,\n streak: acc.streak?.daily || 0,\n vault,\n creditScore: credit,\n loans,\n bills,\n portfolio,\n businesses: acc.businesses || [],\n inventory: acc.inventory || [],\n pets: acc.pets || [],\n },\n };\n } catch (err: any) {\n return { status: 500, body: { error: err.message } };\n }\n }\n\n // 2. POST /vault/upgrade - Upgrade Bank Vault\n if (path === \"/vault/upgrade\" && method === \"POST\") {\n const { userId, guildId } = req.body || {};\n if (!userId) return { status: 400, body: { error: \"Missing userId\" } };\n\n const res = await this.eco.upgradeVault(userId, guildId);\n return { status: res.success ? 200 : 400, body: res };\n }\n\n // 3. POST /vault/interest - Claim Daily Interest\n if (path === \"/vault/interest\" && method === \"POST\") {\n const { userId, guildId } = req.body || {};\n if (!userId) return { status: 400, body: { error: \"Missing userId\" } };\n\n const res = await this.eco.claimDailyInterest(userId, guildId);\n return { status: res.success ? 200 : 400, body: res };\n }\n\n // 4. GET /loans/offers - Loan Catalog\n if (path === \"/loans/offers\" && method === \"GET\") {\n const offers = this.eco.loans ? this.eco.loans.getOffers() : [];\n return { status: 200, body: { offers } };\n }\n\n // 5. POST /loans/apply - Apply for Loan\n if (path === \"/loans/apply\" && method === \"POST\") {\n const { userId, tier, guildId } = req.body || {};\n if (!userId || !tier) return { status: 400, body: { error: \"Missing userId or tier\" } };\n\n const res = await this.eco.applyLoan(userId, tier as LoanTier, guildId);\n return { status: res.success ? 200 : 400, body: res };\n }\n\n // 6. POST /loans/repay - Repay Debt\n if (path === \"/loans/repay\" && method === \"POST\") {\n const { userId, loanId, amount, guildId } = req.body || {};\n if (!userId) return { status: 400, body: { error: \"Missing userId\" } };\n\n let targetLoanId = loanId;\n if (!targetLoanId) {\n const userLoans = await this.eco.getUserLoans(userId, guildId);\n const active = userLoans.find((l) => l.status === \"active\");\n if (active) targetLoanId = active.id;\n }\n if (!targetLoanId) return { status: 400, body: { error: \"No active loan found to repay\" } };\n\n const res = await this.eco.repayLoan(userId, targetLoanId, amount || \"all\", guildId);\n return { status: res.success ? 200 : 400, body: res };\n }\n\n // 7. GET /bills/:userId - Pending Bills\n if (path.startsWith(\"/bills/\") && method === \"GET\") {\n const userId = path.replace(\"/bills/\", \"\").split(\"/\")[0];\n const guildId = (req.query.guildId as string) || undefined;\n const bills = await this.eco.getPendingBills(userId, guildId);\n return { status: 200, body: { bills } };\n }\n\n // 8. POST /bills/pay - Settle Bills\n if (path === \"/bills/pay\" && method === \"POST\") {\n const { userId, billId, payAll, guildId } = req.body || {};\n if (!userId) return { status: 400, body: { error: \"Missing userId\" } };\n\n if (payAll) {\n const res = await this.eco.payAllBills(userId, guildId);\n return { status: res.success ? 200 : 400, body: res };\n }\n\n if (billId) {\n const res = await this.eco.payBill(userId, billId, guildId);\n return { status: res.success ? 200 : 400, body: res };\n }\n\n return { status: 400, body: { error: \"Provide either billId or payAll: true\" } };\n }\n\n // 9. GET /stocks - Active Market Tickers\n if (path === \"/stocks\" && method === \"GET\") {\n const stocks = this.eco.getStocks();\n const trend = this.eco.stocks ? this.eco.stocks.getMarketTrend() : \"STABLE\";\n return { status: 200, body: { trend, stocks } };\n }\n\n // 10. POST /stocks/trade - Execute Buy / Sell Order\n if (path === \"/stocks/trade\" && method === \"POST\") {\n const { userId, symbol, action, shares, guildId } = req.body || {};\n if (!userId || !symbol || !action || !shares) {\n return { status: 400, body: { error: \"Missing userId, symbol, action (BUY/SELL), or shares\" } };\n }\n\n if (action.toUpperCase() === \"BUY\") {\n const res = await this.eco.buyStock(userId, symbol, parseInt(shares, 10), guildId);\n return { status: res.success ? 200 : 400, body: res };\n } else {\n const res = await this.eco.sellStock(userId, symbol, parseInt(shares, 10), guildId);\n return { status: res.success ? 200 : 400, body: res };\n }\n }\n\n // 11. GET /cards/debit/:userId - Visual Canvas Debit Card Buffer\n if (path.startsWith(\"/cards/debit/\") && method === \"GET\") {\n const userId = path.replace(\"/cards/debit/\", \"\").split(\"/\")[0];\n const guildId = (req.query.guildId as string) || undefined;\n\n try {\n const acc = await this.eco.getAccount(userId, guildId);\n const credit = await this.eco.getCreditScore(userId, guildId);\n const vault = await this.eco.getUserVault(userId, guildId);\n\n let customGradient: [string, string, string] | undefined = undefined;\n if (req.query.gradient) {\n const stops = (req.query.gradient as string).split(\",\");\n if (stops.length === 3) {\n customGradient = [stops[0].trim(), stops[1].trim(), stops[2].trim()];\n }\n }\n\n const cardBuffer = await RenderBankCard.renderCard({\n username: (req.query.username as string) || acc.userId,\n avatarUrl: (req.query.avatarUrl as string) || undefined,\n wallet: acc.wallet,\n bank: acc.bank,\n netWorth: acc.wallet + acc.bank,\n currencySymbol: this.eco.currencySymbol,\n cardTier: (req.query.tier as any) || undefined,\n creditScore: credit.score,\n vaultTierName: vault.currentTier.name,\n customGradient,\n bankName: (req.query.bankName as string) || undefined,\n });\n\n return {\n status: 200,\n body: cardBuffer,\n isBuffer: true,\n contentType: \"image/png\",\n };\n } catch (err: any) {\n return { status: 500, body: { error: `Failed to render debit card: ${err.message}` } };\n }\n }\n\n // 12. GET /cards/chart/:symbol - Visual Market Chart Buffer\n if (path.startsWith(\"/cards/chart/\") && method === \"GET\") {\n const rawSymbol = decodeURIComponent(path.replace(\"/cards/chart/\", \"\").split(\"/\")[0]).toUpperCase();\n const stock = this.eco.getStock(rawSymbol) || this.eco.getStock(`$${rawSymbol.replace(/^\\$/, \"\")}`);\n if (!stock) {\n return { status: 404, body: { error: `Stock symbol \"${rawSymbol}\" not found.` } };\n }\n\n try {\n const chartBuffer = await RenderMarketChart.renderChart({\n symbol: stock.symbol,\n name: stock.name,\n currentPrice: stock.currentPrice,\n change24h: stock.change24h,\n history: stock.history,\n });\n\n return {\n status: 200,\n body: chartBuffer,\n isBuffer: true,\n contentType: \"image/png\",\n };\n } catch (err: any) {\n return { status: 500, body: { error: `Failed to render market chart: ${err.message}` } };\n }\n }\n\n // 13. GET /leaderboard - Leaderboard Ranks\n if (path === \"/leaderboard\" && method === \"GET\") {\n const metric = (req.query.metric as any) || \"net_worth\";\n const limit = parseInt((req.query.limit as string) || \"10\", 10);\n const entries = await this.eco.getLeaderboard(metric, limit);\n return { status: 200, body: { metric, entries } };\n }\n\n return null;\n }\n\n public async handleAction(action: BridgeAction): Promise<any> {\n if (action.action === \"wallet:add\") {\n return this.eco.addWallet(action.playerId, action.payload?.amount || 0);\n }\n if (action.action === \"stock:buy\") {\n return this.eco.buyStock(action.playerId, action.payload?.symbol, action.payload?.shares || 1);\n }\n if (action.action === \"vault:upgrade\") {\n return this.eco.upgradeVault(action.playerId);\n }\n return { success: true };\n }\n}\n","/**\n * @m3rcena/eco\n * Eco <-> Weky Cross-Package Connector\n *\n * Connects the Eco economy engine with @m3rcena/weky minigames:\n * - Automatically rewards players in cash/coins for winning minigames\n * - Deducts optional penalties or wagers upon losing\n * - Distributes solo minigame score bonuses (e.g. 2048, Snake, FastType)\n * - Rewards consecutive win streaks with multiplier bonuses\n * - Manages PvP bet pots / wagers with atomic escrow & refund handling\n * - Awards championship prize pools for tournament winners\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { EventEmitter } from \"node:events\";\nimport type { EcoManager } from \"../EcoManager.js\";\n\nexport interface EcoGameRewardRule {\n /** Flat coins awarded on victory */\n winReward?: number;\n /** Flat coins deducted on defeat */\n lossPenalty?: number;\n /** Flat coins awarded on draw / tie */\n drawReward?: number;\n /** Multiplier for solo points/score (e.g. 0.05 means 1000 score = 50 coins) */\n scoreMultiplier?: number;\n /** Maximum coins allowed from score multiplier */\n maxScoreReward?: number;\n /** Bonus coins awarded per win streak count */\n streakBonus?: number;\n}\n\nexport interface EcoWagerRecord {\n id: string;\n player1Id: string;\n player2Id: string;\n amount: number;\n totalPot: number;\n guildId?: string;\n game?: string;\n createdAt: number;\n status: \"active\" | \"resolved\" | \"refunded\";\n winnerId?: string;\n}\n\nexport interface EcoWagerCreateResult {\n success: boolean;\n wager?: EcoWagerRecord;\n reason?: string;\n failedUserId?: string;\n}\n\nexport interface EcoWekyConnectorOptions {\n /** Default flat coins awarded on victory (default: 50) */\n defaultWinReward?: number;\n /** Default flat coins deducted on defeat (default: 0) */\n defaultLossPenalty?: number;\n /** Default flat coins awarded on tie/draw (default: 10) */\n defaultDrawReward?: number;\n /** Default multiplier applied to solo score (default: 0.05) */\n defaultScoreMultiplier?: number;\n /** Maximum coins awarded from score in a single game (default: 500) */\n maxScoreReward?: number;\n /** Bonus coins awarded per active win streak count (default: 5) */\n streakBonus?: number;\n /** Tournament champion cash prize (default: 500) */\n tournamentChampionPrize?: number;\n /** Tournament runner-up cash prize (default: 200) */\n tournamentRunnerUpPrize?: number;\n /** House fee percentage taken from PvP wager pots (0 - 100, default: 0) */\n wagerHouseFee?: number;\n /** Specific per-game rule overrides */\n games?: Record<string, EcoGameRewardRule>;\n /** Whether automatic rewards on gameOver are enabled (default: true) */\n autoReward?: boolean;\n}\n\nexport interface EcoRewardDistributionResult {\n userId: string;\n game: string;\n outcome: \"WIN\" | \"LOSE\" | \"DRAW\" | \"SCORE\" | \"TOURNAMENT\";\n amount: number;\n newBalance: number;\n reason: string;\n streakBonus?: number;\n scoreBonus?: number;\n wagerWon?: number;\n}\n\nexport interface EcoWagerResolvedEvent {\n wager: EcoWagerRecord;\n winnerId: string;\n loserId: string;\n payout: number;\n houseFee: number;\n}\n\nexport interface EcoWagerRefundedEvent {\n wager: EcoWagerRecord;\n reason: string;\n}\n\n/**\n * Type-safe map of events emitted by EcoWekyConnector.\n */\nexport interface EcoWekyConnectorEvents {\n wagerCreated: [wager: EcoWagerRecord];\n wagerResolved: [event: EcoWagerResolvedEvent];\n wagerRefunded: [event: EcoWagerRefundedEvent];\n reward: [result: EcoRewardDistributionResult];\n penalty: [result: EcoRewardDistributionResult];\n tournamentReward: [result: EcoRewardDistributionResult];\n error: [error: any];\n}\n\nexport class EcoWekyConnector extends EventEmitter {\n public readonly eco: EcoManager;\n public readonly weky: any;\n public options: EcoWekyConnectorOptions;\n\n private activeWagers: Map<string, EcoWagerRecord> = new Map();\n private userToWagerMap: Map<string, string> = new Map();\n\n constructor(eco: EcoManager, weky: any, options: EcoWekyConnectorOptions = {}) {\n super();\n\n if (!eco) {\n throw new TypeError(\"[EcoWekyConnector] A valid EcoManager instance is required.\");\n }\n if (!weky) {\n throw new TypeError(\"[EcoWekyConnector] A valid WekyManager instance is required.\");\n }\n\n this.eco = eco;\n this.weky = weky;\n this.options = {\n defaultWinReward: 50,\n defaultLossPenalty: 0,\n defaultDrawReward: 10,\n defaultScoreMultiplier: 0.05,\n maxScoreReward: 500,\n streakBonus: 5,\n tournamentChampionPrize: 500,\n tournamentRunnerUpPrize: 200,\n wagerHouseFee: 0,\n autoReward: true,\n ...options,\n };\n\n this.initListeners();\n }\n\n // --------------------------------------------------------------------------\n // Strongly-Typed EventEmitter Overrides\n // --------------------------------------------------------------------------\n\n public override on<K extends keyof EcoWekyConnectorEvents>(event: K, listener: (...args: EcoWekyConnectorEvents[K]) => void): this;\n public override on(event: string | symbol, listener: (...args: any[]) => void): this;\n public override on(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.on(event, listener);\n }\n\n public override once<K extends keyof EcoWekyConnectorEvents>(event: K, listener: (...args: EcoWekyConnectorEvents[K]) => void): this;\n public override once(event: string | symbol, listener: (...args: any[]) => void): this;\n public override once(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.once(event, listener);\n }\n\n public override emit<K extends keyof EcoWekyConnectorEvents>(event: K, ...args: EcoWekyConnectorEvents[K]): boolean;\n public override emit(event: string | symbol, ...args: any[]): boolean;\n public override emit(event: string | symbol, ...args: any[]): boolean {\n return super.emit(event, ...args);\n }\n\n public override off<K extends keyof EcoWekyConnectorEvents>(event: K, listener: (...args: EcoWekyConnectorEvents[K]) => void): this;\n public override off(event: string | symbol, listener: (...args: any[]) => void): this;\n public override off(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.off(event, listener);\n }\n\n public override addListener<K extends keyof EcoWekyConnectorEvents>(event: K, listener: (...args: EcoWekyConnectorEvents[K]) => void): this;\n public override addListener(event: string | symbol, listener: (...args: any[]) => void): this;\n public override addListener(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.addListener(event, listener);\n }\n\n public override removeListener<K extends keyof EcoWekyConnectorEvents>(event: K, listener: (...args: EcoWekyConnectorEvents[K]) => void): this;\n public override removeListener(event: string | symbol, listener: (...args: any[]) => void): this;\n public override removeListener(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.removeListener(event, listener);\n }\n\n public override prependListener<K extends keyof EcoWekyConnectorEvents>(event: K, listener: (...args: EcoWekyConnectorEvents[K]) => void): this;\n public override prependListener(event: string | symbol, listener: (...args: any[]) => void): this;\n public override prependListener(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.prependListener(event, listener);\n }\n\n public override prependOnceListener<K extends keyof EcoWekyConnectorEvents>(event: K, listener: (...args: EcoWekyConnectorEvents[K]) => void): this;\n public override prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;\n public override prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.prependOnceListener(event, listener);\n }\n\n private initListeners(): void {\n if (typeof (this.weky as any).on === \"function\") {\n this.weky.on(\"gameOver\", async (event: any) => {\n if (!this.options.autoReward) return;\n try {\n await this.handleGameOver(event);\n } catch (err) {\n this.emit(\"error\", err);\n }\n });\n\n this.weky.on(\"tournamentEnd\", async (event: any) => {\n if (!this.options.autoReward) return;\n try {\n await this.handleTournamentEnd(event);\n } catch (err) {\n this.emit(\"error\", err);\n }\n });\n }\n }\n\n /**\n * Creates and escrows a PvP wager match between two players.\n * Both players must have sufficient wallet balances.\n */\n public async createWager(params: {\n wagerId: string;\n player1Id: string;\n player2Id: string;\n amount: number;\n guildId?: string;\n game?: string;\n }): Promise<EcoWagerCreateResult> {\n const { wagerId, player1Id, player2Id, amount, guildId, game } = params;\n\n if (amount <= 0) {\n return { success: false, reason: \"Wager amount must be greater than zero.\" };\n }\n\n if (player1Id === player2Id) {\n return { success: false, reason: \"A player cannot wager against themselves.\" };\n }\n\n const p1Balance = await this.getUserWallet(player1Id, guildId);\n if (p1Balance < amount) {\n return { success: false, reason: \"Player 1 has insufficient funds.\", failedUserId: player1Id };\n }\n\n const p2Balance = await this.getUserWallet(player2Id, guildId);\n if (p2Balance < amount) {\n return { success: false, reason: \"Player 2 has insufficient funds.\", failedUserId: player2Id };\n }\n\n await this.deductWallet(player1Id, amount, `Wager escrow for ${game || \"match\"} vs <@${player2Id}>`, guildId);\n await this.deductWallet(player2Id, amount, `Wager escrow for ${game || \"match\"} vs <@${player1Id}>`, guildId);\n\n const record: EcoWagerRecord = {\n id: wagerId,\n player1Id,\n player2Id,\n amount,\n totalPot: amount * 2,\n guildId,\n game,\n createdAt: Date.now(),\n status: \"active\",\n };\n\n this.activeWagers.set(wagerId, record);\n this.userToWagerMap.set(player1Id, wagerId);\n this.userToWagerMap.set(player2Id, wagerId);\n\n this.emit(\"wagerCreated\", record);\n return { success: true, wager: record };\n }\n\n /**\n * Resolves an active wager, awarding the escrowed pot (minus optional house fee) to the winner.\n */\n public async resolveWager(wagerId: string, winnerId: string): Promise<EcoRewardDistributionResult | null> {\n const wager = this.activeWagers.get(wagerId);\n if (!wager || wager.status !== \"active\") return null;\n\n if (winnerId !== wager.player1Id && winnerId !== wager.player2Id) {\n throw new Error(`Winner ${winnerId} is not a participant in wager ${wagerId}`);\n }\n\n const loserId = winnerId === wager.player1Id ? wager.player2Id : wager.player1Id;\n const feePct = Math.max(0, Math.min(100, this.options.wagerHouseFee ?? 0));\n const houseFee = Math.floor((wager.totalPot * feePct) / 100);\n const winAmount = wager.totalPot - houseFee;\n\n const newBalance = await this.creditWallet(\n winnerId,\n winAmount,\n `Won wager pot in ${wager.game || \"PvP\"} (+${winAmount} coins)`,\n wager.guildId\n );\n\n wager.status = \"resolved\";\n wager.winnerId = winnerId;\n this.userToWagerMap.delete(wager.player1Id);\n this.userToWagerMap.delete(wager.player2Id);\n\n const result: EcoRewardDistributionResult = {\n userId: winnerId,\n game: wager.game || \"pvp\",\n outcome: \"WIN\",\n amount: winAmount,\n newBalance,\n reason: `Wager Victory vs <@${loserId}>`,\n wagerWon: winAmount,\n };\n\n this.emit(\"wagerResolved\", { wager, winnerId, loserId, payout: winAmount, houseFee });\n return result;\n }\n\n /**\n * Cancels and refunds an active wager back to both participants.\n */\n public async refundWager(wagerId: string, reason: string = \"Match cancelled or tied\"): Promise<boolean> {\n const wager = this.activeWagers.get(wagerId);\n if (!wager || wager.status !== \"active\") return false;\n\n await this.creditWallet(wager.player1Id, wager.amount, `Refund wager: ${reason}`, wager.guildId);\n await this.creditWallet(wager.player2Id, wager.amount, `Refund wager: ${reason}`, wager.guildId);\n\n wager.status = \"refunded\";\n this.userToWagerMap.delete(wager.player1Id);\n this.userToWagerMap.delete(wager.player2Id);\n\n this.emit(\"wagerRefunded\", { wager, reason });\n return true;\n }\n\n /**\n * Internal handler for Weky gameOver events.\n */\n private async handleGameOver(event: any): Promise<void> {\n const userId = typeof event.user === \"string\" ? event.user : event.user?.id;\n if (!userId) return;\n\n const game = event.game || \"unknown\";\n const rule = this.options.games?.[game] || {};\n const outcomeRaw = (event.outcome || \"\").toUpperCase();\n const isWin = outcomeRaw.includes(\"WIN\") || outcomeRaw === \"WON\" || outcomeRaw === \"VICTORY\";\n const isLoss = outcomeRaw.includes(\"LOSE\") || outcomeRaw.includes(\"LOST\") || outcomeRaw === \"DEFEAT\";\n const isTie = outcomeRaw.includes(\"TIE\") || outcomeRaw.includes(\"DRAW\");\n\n // Check for active wager associated with user or channel\n const wagerId = this.userToWagerMap.get(userId) || (event.channelId ? this.userToWagerMap.get(event.channelId) : undefined);\n if (wagerId && this.activeWagers.has(wagerId)) {\n if (isWin) {\n await this.resolveWager(wagerId, userId);\n return;\n } else if (isTie) {\n await this.refundWager(wagerId, \"Game ended in a draw\");\n return;\n } else if (isLoss) {\n const wager = this.activeWagers.get(wagerId)!;\n const opponentId = userId === wager.player1Id ? wager.player2Id : wager.player1Id;\n await this.resolveWager(wagerId, opponentId);\n return;\n }\n }\n\n const winReward = rule.winReward ?? this.options.defaultWinReward ?? 50;\n const lossPenalty = rule.lossPenalty ?? this.options.defaultLossPenalty ?? 0;\n const drawReward = rule.drawReward ?? this.options.defaultDrawReward ?? 10;\n const scoreMultiplier = rule.scoreMultiplier ?? this.options.defaultScoreMultiplier ?? 0.05;\n const maxScore = rule.maxScoreReward ?? this.options.maxScoreReward ?? 500;\n const streakBonusPerWin = rule.streakBonus ?? this.options.streakBonus ?? 5;\n\n if (isWin) {\n let streakBonus = 0;\n try {\n const player = await this.weky.leaderboard?.getPlayer(userId);\n if (player && player.winStreak > 0) {\n streakBonus = player.winStreak * streakBonusPerWin;\n }\n } catch {\n // Safe fallback\n }\n\n let scoreBonus = 0;\n if (typeof event.score === \"number\" && event.score > 0) {\n scoreBonus = Math.min(maxScore, Math.floor(event.score * scoreMultiplier));\n }\n\n const totalWin = winReward + streakBonus + scoreBonus;\n if (totalWin > 0) {\n const newBal = await this.creditWallet(\n userId,\n totalWin,\n `Minigame Victory: ${game} (+${totalWin} coins)`\n );\n\n const result: EcoRewardDistributionResult = {\n userId,\n game,\n outcome: \"WIN\",\n amount: totalWin,\n newBalance: newBal,\n reason: `Won ${game}`,\n streakBonus,\n scoreBonus,\n };\n\n this.emit(\"reward\", result);\n }\n } else if (isLoss) {\n if (lossPenalty > 0) {\n const newBal = await this.deductWallet(\n userId,\n lossPenalty,\n `Minigame Defeat: ${game} (-${lossPenalty} coins)`\n );\n\n const result: EcoRewardDistributionResult = {\n userId,\n game,\n outcome: \"LOSE\",\n amount: -lossPenalty,\n newBalance: newBal,\n reason: `Lost ${game}`,\n };\n\n this.emit(\"penalty\", result);\n }\n } else if (isTie) {\n if (drawReward > 0) {\n const newBal = await this.creditWallet(\n userId,\n drawReward,\n `Minigame Draw: ${game} (+${drawReward} coins)`\n );\n\n const result: EcoRewardDistributionResult = {\n userId,\n game,\n outcome: \"DRAW\",\n amount: drawReward,\n newBalance: newBal,\n reason: `Draw in ${game}`,\n };\n\n this.emit(\"reward\", result);\n }\n } else {\n // Solo Game with score\n if (typeof event.score === \"number\" && event.score > 0) {\n const scoreBonus = Math.min(maxScore, Math.floor(event.score * scoreMultiplier));\n if (scoreBonus > 0) {\n const newBal = await this.creditWallet(\n userId,\n scoreBonus,\n `Minigame Solo Score: ${game} (${event.score} pts -> +${scoreBonus} coins)`\n );\n\n const result: EcoRewardDistributionResult = {\n userId,\n game,\n outcome: \"SCORE\",\n amount: scoreBonus,\n newBalance: newBal,\n reason: `Scored ${event.score} in ${game}`,\n scoreBonus,\n };\n\n this.emit(\"reward\", result);\n }\n }\n }\n }\n\n /**\n * Internal handler for Weky tournamentEnd events.\n */\n private async handleTournamentEnd(event: any): Promise<void> {\n if (!event.champion || !event.champion.id) return;\n\n const championPrize = this.options.tournamentChampionPrize ?? 500;\n if (championPrize > 0) {\n const newBal = await this.creditWallet(\n event.champion.id,\n championPrize,\n `Tournament Champion: Crowned in Tournament ${event.tournamentId} (+${championPrize} coins)`\n );\n\n const result: EcoRewardDistributionResult = {\n userId: event.champion.id,\n game: \"tournament\",\n outcome: \"TOURNAMENT\",\n amount: championPrize,\n newBalance: newBal,\n reason: `Crowned champion in tournament ${event.tournamentId}`,\n };\n\n this.emit(\"tournamentReward\", result);\n }\n }\n\n public async getUserWallet(userId: string, guildId?: string): Promise<number> {\n const bal = await this.eco.getBalance(userId, guildId);\n return bal.wallet;\n }\n\n public async creditWallet(userId: string, amount: number, reason?: string, guildId?: string): Promise<number> {\n return this.eco.addWallet(userId, amount, guildId);\n }\n\n public async deductWallet(userId: string, amount: number, reason?: string, guildId?: string): Promise<number> {\n return this.eco.removeWallet(userId, amount, guildId);\n }\n\n public getActiveWagers(): EcoWagerRecord[] {\n return Array.from(this.activeWagers.values()).filter((w) => w.status === \"active\");\n }\n\n public getWager(wagerId: string): EcoWagerRecord | undefined {\n return this.activeWagers.get(wagerId);\n }\n}\n","/**\n * @m3rcena/eco\n * Central Economy Orchestrator & Dashboard Bridge Integration.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { EventEmitter } from \"node:events\";\nimport { BankManager } from \"./modules/BankManager.js\";\nimport { RewardManager } from \"./modules/RewardManager.js\";\nimport { CareerManager } from \"./modules/CareerManager.js\";\nimport { ShopManager } from \"./modules/ShopManager.js\";\nimport { BusinessManager } from \"./modules/BusinessManager.js\";\nimport { CasinoManager, BlackjackState } from \"./modules/CasinoManager.js\";\nimport { LeaderboardManager, LeaderboardMetric, LeaderboardEntry } from \"./modules/LeaderboardManager.js\";\nimport { StockMarketManager } from \"./modules/StockMarketManager.js\";\nimport { HeistManager } from \"./modules/HeistManager.js\";\nimport { PetManager } from \"./modules/PetManager.js\";\nimport { CrateManager } from \"./modules/CrateManager.js\";\nimport { VaultManager } from \"./modules/VaultManager.js\";\nimport { LoanManager } from \"./modules/LoanManager.js\";\nimport { TaxManager } from \"./modules/TaxManager.js\";\nimport { EcoBridgeRouter } from \"./bridge/EcoBridgeRouter.js\";\nimport { EcoStorageAdapter, MemoryEcoStorage, JsonEcoStorage } from \"./storage/EcoStorage.js\";\nimport { resolveEcoStorage, EcoDatabaseHandler } from \"./storage/EcoDatabaseHandler.js\";\nimport { EcoWekyConnector, EcoWekyConnectorOptions } from \"./connector/EcoWekyConnector.js\";\nimport { checkPackageUpdates, ECO_VERSION } from \"./utils/Notifier.js\";\nimport {\n EcoManagerOptions,\n UserAccount,\n TransferResult,\n RobResult,\n CasinoBetResult,\n ShopItem,\n CareerJob,\n BusinessConfig,\n StockConfig,\n StockTradeResult,\n UserStockPosition,\n HeistTarget,\n HeistRole,\n HeistSession,\n HeistResult,\n PetConfig,\n UserPet,\n PetExpeditionResult,\n CrateTier,\n CrateReward,\n EcoCustomMessages,\n EcoCustomEmojis,\n EcoEvents,\n BankVaultTier,\n CreditScoreData,\n LoanTier,\n LoanOffer,\n UserLoan,\n MunicipalBill,\n} from \"./types.js\";\n\nexport class EcoManager extends EventEmitter {\n public storage: EcoStorageAdapter;\n public bank: BankManager;\n public rewards: RewardManager;\n public careers: CareerManager;\n public shop: ShopManager;\n public businesses: BusinessManager;\n public casino: CasinoManager;\n public leaderboards: LeaderboardManager;\n public stocks: StockMarketManager;\n public heist: HeistManager;\n public pets: PetManager;\n public crates: CrateManager;\n public vault: VaultManager;\n public loans: LoanManager;\n public taxes: TaxManager;\n public router: EcoBridgeRouter;\n\n public currencySymbol: string;\n public currencyName: string;\n public embedColor?: any;\n public customMessages?: Partial<EcoCustomMessages>;\n public emojis?: Partial<EcoCustomEmojis>;\n public notifyUpdates: boolean;\n private bridge?: any;\n\n constructor(options: EcoManagerOptions = {}) {\n super();\n this.currencySymbol = options.currencySymbol ?? \"🪙\";\n this.currencyName = options.currencyName ?? \"Coins\";\n this.embedColor = options.embedColor ?? 0x5865f2;\n this.customMessages = options.customMessages;\n this.emojis = options.emojis;\n this.notifyUpdates = options.notifyUpdates ?? true;\n\n // Terminal update notification check\n if (this.notifyUpdates) {\n checkPackageUpdates(ECO_VERSION, false).catch(() => {});\n }\n\n // 1. Storage / Database Handler\n this.storage = resolveEcoStorage(options);\n\n // 2. Bank\n this.bank = new BankManager(this.storage, {\n defaultWallet: options.defaultWalletBalance ?? 500,\n defaultBankCap: options.defaultBankCapacity ?? 10000,\n transactionFee: options.transactionFeePercentage ?? 0,\n });\n\n // 3. Rewards\n this.rewards = new RewardManager(this.bank, options.cooldowns as any);\n\n // 4. Careers\n this.careers = new CareerManager(this.bank);\n\n // 5. Shop\n this.shop = new ShopManager(this.bank);\n\n // 6. Businesses\n this.businesses = new BusinessManager(this.bank);\n\n // 7. Casino\n this.casino = new CasinoManager(this.bank, this.shop);\n\n // 8. Leaderboards\n this.leaderboards = new LeaderboardManager(this.storage, this.shop, this.businesses);\n\n // 9. Stocks & Crypto Exchange\n this.stocks = new StockMarketManager(this.bank, options.initialStocks);\n\n // 10. Multiplayer Syndicate Heists\n this.heist = new HeistManager(this.bank, options.initialHeistTargets);\n\n // 11. Pets & Companions\n this.pets = new PetManager(this.bank, options.initialPets);\n\n // 12. Mystery Loot Crates\n this.crates = new CrateManager(this.bank);\n\n // 13. Bank Vault Tiers & Compound Interest\n this.vault = new VaultManager(this.bank);\n\n // 14. Credit Score, Loans & Debt\n this.loans = new LoanManager(this.bank);\n\n // 15. Municipal Bills & Progressive Wealth Taxes\n this.taxes = new TaxManager(this.bank);\n\n // 16. Dynamic Package Router for Bridge Gateway\n this.router = new EcoBridgeRouter(this);\n\n // 17. Bridge integration\n if (options.bridge) {\n this.setBridge(options.bridge);\n }\n }\n\n /**\n * Universal router getter for @m3rcena/bridge mounting.\n */\n public toBridgeRouter(): EcoBridgeRouter {\n return this.router;\n }\n\n /**\n * Connects this economy instance with an M3rcenaBridge controller.\n * Enables: eco.connectBridge(bridge) or bridge.use(eco).\n */\n public connectBridge(bridge: any): this {\n return this.setBridge(bridge);\n }\n\n /**\n * Connects this economy instance with @m3rcena/weky minigames engine.\n * Enables automated coin payouts, streak bonuses, solo score multipliers, PvP wager bets, and tournament prize pools.\n */\n public connectWeky(weky: any, options?: EcoWekyConnectorOptions): EcoWekyConnector {\n return new EcoWekyConnector(this, weky, options);\n }\n\n /**\n * Connects this economy instance with @m3rcena/bridge for live web dashboard streaming.\n */\n public setBridge(bridge: any): this {\n this.bridge = bridge;\n\n if (this.bridge && typeof this.bridge.registerModule === \"function\") {\n this.bridge.registerModule(\"economy\", async (action: any) => {\n if (this.router && typeof this.router.handleAction === \"function\") {\n return this.router.handleAction(action);\n }\n return { success: true };\n });\n }\n\n if (this.bridge && typeof this.bridge.mountPackage === \"function\" && this.router) {\n this.bridge.mountPackage(this.router);\n }\n\n return this;\n }\n\n // --------------------------------------------------------------------------\n // Strongly Typed Event Emitter Overrides\n // --------------------------------------------------------------------------\n\n public override emit<K extends keyof EcoEvents>(event: K, ...args: EcoEvents[K]): boolean;\n public override emit(event: string | symbol, ...args: any[]): boolean;\n public override emit(event: string | symbol, ...args: any[]): boolean {\n return super.emit(event, ...args);\n }\n\n public override on<K extends keyof EcoEvents>(event: K, listener: (...args: EcoEvents[K]) => void): this;\n public override on(event: string | symbol, listener: (...args: any[]) => void): this;\n public override on(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.on(event, listener as any);\n }\n\n public override once<K extends keyof EcoEvents>(event: K, listener: (...args: EcoEvents[K]) => void): this;\n public override once(event: string | symbol, listener: (...args: any[]) => void): this;\n public override once(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.once(event, listener as any);\n }\n\n public override off<K extends keyof EcoEvents>(event: K, listener: (...args: EcoEvents[K]) => void): this;\n public override off(event: string | symbol, listener: (...args: any[]) => void): this;\n public override off(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.off(event, listener as any);\n }\n\n public override addListener<K extends keyof EcoEvents>(event: K, listener: (...args: EcoEvents[K]) => void): this;\n public override addListener(event: string | symbol, listener: (...args: any[]) => void): this;\n public override addListener(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.addListener(event, listener as any);\n }\n\n public override removeListener<K extends keyof EcoEvents>(event: K, listener: (...args: EcoEvents[K]) => void): this;\n public override removeListener(event: string | symbol, listener: (...args: any[]) => void): this;\n public override removeListener(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.removeListener(event, listener as any);\n }\n\n public override prependListener<K extends keyof EcoEvents>(event: K, listener: (...args: EcoEvents[K]) => void): this;\n public override prependListener(event: string | symbol, listener: (...args: any[]) => void): this;\n public override prependListener(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.prependListener(event, listener as any);\n }\n\n public override prependOnceListener<K extends keyof EcoEvents>(event: K, listener: (...args: EcoEvents[K]) => void): this;\n public override prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;\n public override prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this {\n return super.prependOnceListener(event, listener as any);\n }\n\n /**\n * Dispatches an event to the bridge if connected.\n */\n private dispatchBridgeAction(\n actionName: string,\n payload: Record<string, any>,\n userId?: string,\n audioCue?: { sound: string; volume?: number }\n ): void {\n this.emit(\"bridgeAction\", { module: \"economy\", action: actionName, playerId: userId ?? \"system\", payload });\n if (!this.bridge) return;\n\n if (typeof this.bridge.dispatchAction === \"function\") {\n this.bridge.dispatchAction({\n module: \"economy\",\n action: actionName,\n playerId: userId ?? \"system\",\n payload,\n sourcePlatform: \"discord\",\n }).catch?.(() => {});\n }\n\n if (audioCue) {\n if (typeof this.bridge.dispatchAudioCue === \"function\") {\n this.bridge.dispatchAudioCue({\n sound: audioCue.sound,\n volume: audioCue.volume ?? 0.8,\n userId,\n module: \"economy\",\n });\n } else if (typeof this.bridge.triggerAudioCue === \"function\") {\n this.bridge.triggerAudioCue({\n sound: audioCue.sound,\n volume: audioCue.volume ?? 0.8,\n userId,\n module: \"economy\",\n });\n }\n }\n }\n\n /* -------------------------------------------------------------------------- */\n /* ACCOUNT & BALANCE SHORTCUTS */\n /* -------------------------------------------------------------------------- */\n\n public async getAccount(userId: string, guildId?: string): Promise<UserAccount> {\n return this.bank.getAccount(userId, guildId);\n }\n\n public async getBalance(\n userId: string,\n guildId?: string\n ): Promise<{ wallet: number; bank: number; bankCapacity: number; netWorth: number }> {\n const acc = await this.bank.getAccount(userId, guildId);\n const netWorth = this.leaderboards.calculateNetWorth(acc);\n return {\n wallet: acc.wallet,\n bank: acc.bank,\n bankCapacity: acc.bankCapacity,\n netWorth,\n };\n }\n\n public async addWallet(userId: string, amount: number, guildId?: string): Promise<number> {\n const newBal = await this.bank.addWallet(userId, amount, guildId);\n this.dispatchBridgeAction(\"wallet:add\", { userId, amount, newWallet: newBal }, userId, { sound: \"coin_drop\" });\n this.emit(\"walletAdd\", { userId, amount, newWallet: newBal, guildId });\n return newBal;\n }\n\n public async removeWallet(userId: string, amount: number, guildId?: string): Promise<number> {\n const newBal = await this.bank.removeWallet(userId, amount, guildId);\n this.dispatchBridgeAction(\"wallet:remove\", { userId, amount, newWallet: newBal }, userId);\n this.emit(\"walletRemove\", { userId, amount, newWallet: newBal, guildId });\n return newBal;\n }\n\n public async deposit(userId: string, amount: number | \"all\", guildId?: string) {\n const result = await this.bank.deposit(userId, amount, guildId);\n if (result.success) {\n this.dispatchBridgeAction(\"bank:deposit\", { userId, deposited: result.deposited, wallet: result.wallet, bank: result.bank }, userId);\n this.emit(\"deposit\", { userId, deposited: result.deposited, wallet: result.wallet, bank: result.bank, guildId });\n }\n return result;\n }\n\n public async withdraw(userId: string, amount: number | \"all\", guildId?: string) {\n const result = await this.bank.withdraw(userId, amount, guildId);\n if (result.success) {\n this.dispatchBridgeAction(\"bank:withdraw\", { userId, withdrawn: result.withdrawn, wallet: result.wallet, bank: result.bank }, userId);\n this.emit(\"withdraw\", { userId, withdrawn: result.withdrawn, wallet: result.wallet, bank: result.bank, guildId });\n }\n return result;\n }\n\n public async transfer(fromUserId: string, toUserId: string, amount: number, guildId?: string): Promise<TransferResult> {\n const result = await this.bank.transfer(fromUserId, toUserId, amount, guildId);\n if (result.success) {\n this.dispatchBridgeAction(\"bank:transfer\", result, fromUserId, { sound: \"coin_drop\" });\n this.emit(\"transfer\", { ...result, guildId });\n }\n return result;\n }\n\n /* -------------------------------------------------------------------------- */\n /* REWARDS & EARNING */\n /* -------------------------------------------------------------------------- */\n\n public async daily(userId: string, guildId?: string) {\n const res = await this.rewards.claimDaily(userId, guildId);\n if (res.success) {\n this.dispatchBridgeAction(\"reward:daily\", res, userId, { sound: \"coin_drop\" });\n this.emit(\"dailyClaim\", { userId, amount: res.amount, streak: res.streak, isMilestone: res.isMilestone, guildId });\n }\n return res;\n }\n\n public async weekly(userId: string, guildId?: string) {\n const res = await this.rewards.claimWeekly(userId, guildId);\n if (res.success) {\n this.dispatchBridgeAction(\"reward:weekly\", res, userId, { sound: \"win\" });\n }\n return res;\n }\n\n public async monthly(userId: string, guildId?: string) {\n const res = await this.rewards.claimMonthly(userId, guildId);\n if (res.success) {\n this.dispatchBridgeAction(\"reward:monthly\", res, userId, { sound: \"win\" });\n }\n return res;\n }\n\n public async hourly(userId: string, guildId?: string) {\n const res = await this.rewards.claimHourly(userId, guildId);\n if (res.success) {\n this.dispatchBridgeAction(\"reward:hourly\", res, userId, { sound: \"coin_drop\" });\n }\n return res;\n }\n\n public async work(userId: string, guildId?: string) {\n // Check career salary if applicable\n const career = await this.careers.getCareer(userId, guildId);\n const careerSalary = this.careers.calculateSalary(career ?? undefined);\n\n const res = await this.rewards.work(userId, guildId, careerSalary);\n if (res.success) {\n // Record shift in career\n const shiftRes = await this.careers.recordShift(userId, guildId);\n this.dispatchBridgeAction(\"reward:work\", { ...res, careerShift: shiftRes }, userId, { sound: \"coin_drop\" });\n this.emit(\"work\", { userId, earned: res.earned, xp: res.xp, job: career ?? undefined, promoted: shiftRes.promoted, guildId });\n return { ...res, careerShift: shiftRes };\n }\n return res;\n }\n\n public async beg(userId: string, guildId?: string) {\n const res = await this.rewards.beg(userId, guildId);\n if (res.success && res.earned > 0) {\n this.dispatchBridgeAction(\"reward:beg\", res, userId, { sound: \"coin_drop\" });\n }\n return res;\n }\n\n public async crime(userId: string, guildId?: string) {\n const res = await this.rewards.crime(userId, guildId);\n this.dispatchBridgeAction(\"reward:crime\", res, userId, res.success ? { sound: \"coin_drop\" } : { sound: \"rob_siren\" });\n this.emit(\"crime\", { userId, success: res.success, earned: res.earned, fine: res.fine, crimeType: (res as any).crime, guildId });\n return res;\n }\n\n public async rob(robberId: string, victimId: string, guildId?: string): Promise<RobResult> {\n const res = await this.rewards.rob(robberId, victimId, guildId);\n this.dispatchBridgeAction(\n \"reward:rob\",\n res,\n robberId,\n res.success ? { sound: \"win\" } : { sound: \"rob_siren\" }\n );\n this.emit(\"robbery\", { ...res, guildId });\n return res;\n }\n\n /* -------------------------------------------------------------------------- */\n /* SHOP & INVENTORY */\n /* -------------------------------------------------------------------------- */\n\n public async buyItem(userId: string, itemId: string, quantity: number = 1, guildId?: string) {\n const res = await this.shop.buy(userId, itemId, quantity, guildId);\n if (res.success) {\n this.dispatchBridgeAction(\"shop:buy\", res, userId, { sound: \"purchase\" });\n }\n return res;\n }\n\n public async sellItem(userId: string, itemId: string, quantity: number = 1, guildId?: string) {\n const res = await this.shop.sell(userId, itemId, quantity, guildId);\n if (res.success) {\n this.dispatchBridgeAction(\"shop:sell\", res, userId, { sound: \"coin_drop\" });\n }\n return res;\n }\n\n public async useItem(userId: string, itemId: string, guildId?: string) {\n const res = await this.shop.use(userId, itemId, guildId);\n if (res.success) {\n this.dispatchBridgeAction(\"shop:use\", res, userId);\n }\n return res;\n }\n\n public async getInventory(userId: string, guildId?: string) {\n return this.shop.getInventory(userId, guildId);\n }\n\n /* -------------------------------------------------------------------------- */\n /* BUSINESSES */\n /* -------------------------------------------------------------------------- */\n\n public async buyBusiness(userId: string, businessId: string, guildId?: string) {\n const res = await this.businesses.buyBusiness(userId, businessId, guildId);\n if (res.success) {\n this.dispatchBridgeAction(\"business:buy\", res, userId, { sound: \"purchase\" });\n }\n return res;\n }\n\n public async upgradeBusiness(userId: string, businessId: string, guildId?: string) {\n const res = await this.businesses.upgradeBusiness(userId, businessId, guildId);\n if (res.success) {\n this.dispatchBridgeAction(\"business:upgrade\", res, userId, { sound: \"purchase\" });\n }\n return res;\n }\n\n public async hireEmployees(userId: string, businessId: string, count: number = 1, guildId?: string) {\n const res = await this.businesses.hireEmployees(userId, businessId, count, guildId);\n if (res.success) {\n this.dispatchBridgeAction(\"business:hire\", res, userId);\n }\n return res;\n }\n\n public async collectBusinessRevenue(userId: string, businessId?: string, guildId?: string) {\n const res = await this.businesses.collectRevenue(userId, businessId, guildId);\n if (res.success) {\n this.dispatchBridgeAction(\"business:collect\", res, userId, { sound: \"coin_drop\" });\n }\n return res;\n }\n\n /* -------------------------------------------------------------------------- */\n /* CASINO */\n /* -------------------------------------------------------------------------- */\n\n public async coinflip(userId: string, betAmount: number, choice: \"heads\" | \"tails\", guildId?: string) {\n const res = await this.casino.coinflip(userId, betAmount, choice, guildId);\n this.dispatchBridgeAction(\"casino:coinflip\", res, userId, res.outcome === \"win\" ? { sound: \"win\" } : undefined);\n this.emit(\"gamble\", { ...res, userId, game: \"coinflip\", betAmount, guildId });\n return res;\n }\n\n public async dice(userId: string, betAmount: number, prediction: \"high\" | \"low\" | number, guildId?: string) {\n const res = await this.casino.dice(userId, betAmount, prediction, guildId);\n this.dispatchBridgeAction(\"casino:dice\", res, userId, res.outcome === \"win\" ? { sound: \"win\" } : undefined);\n this.emit(\"gamble\", { ...res, userId, game: \"dice\", betAmount, guildId });\n return res;\n }\n\n public async slots(userId: string, betAmount: number, guildId?: string) {\n const res = await this.casino.slots(userId, betAmount, guildId);\n this.dispatchBridgeAction(\"casino:slots\", res, userId, res.outcome === \"win\" ? { sound: \"win\" } : undefined);\n this.emit(\"gamble\", { ...res, userId, game: \"slots\", betAmount, guildId });\n return res;\n }\n\n public async roulette(\n userId: string,\n betAmount: number,\n betType: \"red\" | \"black\" | \"green\" | \"even\" | \"odd\" | number,\n guildId?: string\n ) {\n const res = await this.casino.roulette(userId, betAmount, betType, guildId);\n this.dispatchBridgeAction(\"casino:roulette\", res, userId, res.outcome === \"win\" ? { sound: \"win\" } : undefined);\n this.emit(\"gamble\", { ...res, userId, game: \"roulette\", betAmount, guildId });\n return res;\n }\n\n public async crash(userId: string, betAmount: number, targetMultiplier: number, guildId?: string) {\n const res = await this.casino.crash(userId, betAmount, targetMultiplier, guildId);\n this.dispatchBridgeAction(\"casino:crash\", res, userId, res.outcome === \"win\" ? { sound: \"win\" } : undefined);\n this.emit(\"gamble\", { ...res, userId, game: \"crash\", betAmount, guildId });\n return res;\n }\n\n public async startBlackjack(userId: string, betAmount: number, guildId?: string): Promise<BlackjackState> {\n return this.casino.startBlackjackGame(userId, betAmount, guildId);\n }\n\n public async blackjackHit(gameId: string): Promise<BlackjackState> {\n return this.casino.blackjackHit(gameId);\n }\n\n public async blackjackStand(gameId: string): Promise<BlackjackState> {\n const state = await this.casino.blackjackStand(gameId);\n if (state.payout > 0) {\n this.dispatchBridgeAction(\"casino:blackjack_win\", state, state.userId, { sound: \"win\" });\n }\n return state;\n }\n\n public async blackjackDouble(gameId: string): Promise<BlackjackState> {\n const state = await this.casino.blackjackDouble(gameId);\n if (state.payout > 0) {\n this.dispatchBridgeAction(\"casino:blackjack_win\", state, state.userId, { sound: \"win\" });\n }\n return state;\n }\n\n /* -------------------------------------------------------------------------- */\n /* LEADERBOARDS */\n /* -------------------------------------------------------------------------- */\n\n public async getLeaderboard(\n metric: LeaderboardMetric = \"net_worth\",\n limit: number = 10,\n guildId?: string\n ): Promise<LeaderboardEntry[]> {\n return this.leaderboards.getLeaderboard(metric, limit, guildId);\n }\n\n public async formatLeaderboard(\n metric: LeaderboardMetric = \"net_worth\",\n limit: number = 10,\n guildId?: string\n ): Promise<string> {\n const entries = await this.getLeaderboard(metric, limit, guildId);\n return this.leaderboards.formatLeaderboard(entries, metric, this.currencySymbol);\n }\n\n /* -------------------------------------------------------------------------- */\n /* STOCK & CRYPTOCURRENCY EXCHANGE */\n /* -------------------------------------------------------------------------- */\n\n public getStocks(): StockConfig[] {\n return this.stocks.getStocks();\n }\n\n public getStock(symbol: string): StockConfig | undefined {\n return this.stocks.getStock(symbol);\n }\n\n public tickStockMarket(): void {\n this.stocks.tickMarket();\n this.dispatchBridgeAction(\"stocks:tick\", {\n trend: this.stocks.getMarketTrend(),\n stocks: this.stocks.getStocks().map((s) => ({ symbol: s.symbol, price: s.currentPrice, change: s.change24h })),\n });\n }\n\n public async buyStock(userId: string, symbol: string, shares: number, guildId?: string): Promise<StockTradeResult> {\n const result = await this.stocks.buyStock(userId, symbol, shares, guildId);\n this.dispatchBridgeAction(\"stocks:buy\", result, userId, { sound: \"purchase\" });\n return result;\n }\n\n public async sellStock(userId: string, symbol: string, shares: number, guildId?: string): Promise<StockTradeResult> {\n const result = await this.stocks.sellStock(userId, symbol, shares, guildId);\n this.dispatchBridgeAction(\"stocks:sell\", result, userId, { sound: \"coin_drop\" });\n return result;\n }\n\n public async getStockPortfolio(userId: string, guildId?: string): Promise<{\n userId: string;\n positions: {\n symbol: string;\n name: string;\n shares: number;\n averageBuyPrice: number;\n currentPrice: number;\n currentValue: number;\n profitOrLoss: number;\n profitOrLossPercentage: number;\n }[];\n totalPortfolioValue: number;\n }> {\n return this.stocks.getUserPortfolio(userId, guildId);\n }\n\n /* -------------------------------------------------------------------------- */\n /* MULTIPLAYER SYNDICATE HEISTS */\n /* -------------------------------------------------------------------------- */\n\n public getHeistTargets(): HeistTarget[] {\n return this.heist.getTargets();\n }\n\n public async createHeist(leaderId: string, targetId: string, guildId?: string): Promise<HeistSession> {\n const res = await this.heist.createLobby(leaderId, leaderId, targetId, guildId);\n if (!res.success || !res.session) {\n throw new Error(res.error || \"Failed to create heist lobby.\");\n }\n this.dispatchBridgeAction(\"heist:created\", { heistId: res.session.id, leaderId, targetId });\n return res.session;\n }\n\n public async joinHeist(\n heistId: string,\n userId: string,\n role: HeistRole,\n username?: string\n ): Promise<{ success: boolean; session: HeistSession; message?: string }> {\n const res = await this.heist.joinLobby(heistId, userId, username || userId, role);\n if (!res.success || !res.session) {\n throw new Error(res.error || \"Failed to join heist lobby.\");\n }\n this.dispatchBridgeAction(\"heist:joined\", { heistId, userId, role, username });\n return { success: true, session: res.session };\n }\n\n public async executeHeist(heistId: string): Promise<HeistResult> {\n const result = await this.heist.executeHeist(heistId);\n this.dispatchBridgeAction(\n \"heist:executed\",\n result,\n undefined,\n result.success ? { sound: \"win\" } : { sound: \"rob_siren\" }\n );\n this.emit(\"heist\", result);\n return result;\n }\n\n /* -------------------------------------------------------------------------- */\n /* PETS & COMPANIONS */\n /* -------------------------------------------------------------------------- */\n\n public getAvailablePets(): PetConfig[] {\n return this.pets.getCatalog();\n }\n\n public async getUserPets(userId: string, guildId?: string): Promise<UserPet[]> {\n const acc = await this.bank.getAccount(userId, guildId);\n return acc.pets || [];\n }\n\n public async adoptPet(userId: string, petId: string, customName?: string, guildId?: string): Promise<UserPet> {\n const res = await this.pets.adoptPet(userId, petId, customName, guildId);\n if (!res.success || !res.pet) {\n throw new Error(res.error || \"Failed to adopt pet.\");\n }\n this.dispatchBridgeAction(\"pet:adopted\", { userId, pet: res.pet }, userId, { sound: \"purchase\" });\n return res.pet;\n }\n\n public async feedPet(userId: string, petId: string, guildId?: string): Promise<{ success: boolean; pet: UserPet; cost: number }> {\n const res = await this.pets.feedPet(userId, petId, guildId);\n if (!res.success || !res.pet) {\n throw new Error(res.error || \"Failed to feed pet.\");\n }\n this.dispatchBridgeAction(\"pet:fed\", { userId, petId, cost: 250 });\n return { success: true, pet: res.pet, cost: 250 };\n }\n\n public async sendPetExpedition(userId: string, petId: string, guildId?: string): Promise<{ success: boolean; finishesAt: number }> {\n const res = await this.pets.sendExpedition(userId, petId, 2, guildId);\n if (!res.success || !res.returnsAt) {\n throw new Error(res.error || \"Failed to start expedition.\");\n }\n this.dispatchBridgeAction(\"pet:expedition_started\", { userId, petId, finishesAt: res.returnsAt });\n return { success: true, finishesAt: res.returnsAt };\n }\n\n public async claimPetExpedition(userId: string, petId: string, guildId?: string): Promise<PetExpeditionResult> {\n const res = await this.pets.claimExpedition(userId, petId, guildId);\n if (!res.success || !res.reward) {\n throw new Error(res.error || \"Failed to claim expedition.\");\n }\n this.dispatchBridgeAction(\"pet:expedition_claimed\", { userId, petId, result: res.reward }, userId, { sound: \"win\" });\n return res.reward;\n }\n\n /* -------------------------------------------------------------------------- */\n /* MYSTERY LOOT CRATES */\n /* -------------------------------------------------------------------------- */\n\n public getCratePrice(tier: CrateTier): number {\n return this.crates.getCratePrice(tier);\n }\n\n public async openCrate(userId: string, tier: CrateTier, guildId?: string): Promise<CrateReward> {\n const reward = await this.crates.openCrate(userId, tier, guildId);\n this.dispatchBridgeAction(\"crate:opened\", { userId, tier, reward }, userId, { sound: \"win\" });\n this.emit(\"crateOpened\", { userId, tier, rewards: [reward], guildId });\n return reward;\n }\n\n /* -------------------------------------------------------------------------- */\n /* REAL ECONOMY: BANK VAULT TIERS & COMPOUND INTEREST */\n /* -------------------------------------------------------------------------- */\n\n public async getUserVault(userId: string, guildId?: string) {\n return this.vault.getUserVault(userId, guildId);\n }\n\n public async upgradeVault(userId: string, guildId?: string) {\n const res = await this.vault.upgradeVault(userId, guildId);\n if (res.success && res.newTier) {\n this.dispatchBridgeAction(\"vault:upgraded\", res, userId, { sound: \"purchase\" });\n this.emit(\"vaultUpgraded\", { userId, newTier: res.newTier, cost: res.cost, guildId });\n }\n return res;\n }\n\n public async claimDailyInterest(userId: string, guildId?: string) {\n const res = await this.vault.claimDailyInterest(userId, guildId);\n if (res.success) {\n this.dispatchBridgeAction(\"vault:interest_claimed\", res, userId, { sound: \"coin_drop\" });\n }\n return res;\n }\n\n /* -------------------------------------------------------------------------- */\n /* REAL ECONOMY: CREDIT SCORE, LOANS & DEBT REPAYMENT */\n /* -------------------------------------------------------------------------- */\n\n public async getCreditScore(userId: string, guildId?: string): Promise<CreditScoreData> {\n return this.loans.getCreditScore(userId, guildId);\n }\n\n public async getUserLoans(userId: string, guildId?: string): Promise<UserLoan[]> {\n return this.loans.getUserLoans(userId, guildId);\n }\n\n public async applyLoan(userId: string, tier: LoanTier, guildId?: string) {\n const res = await this.loans.applyLoan(userId, tier, guildId);\n if (res.success && res.loan) {\n this.dispatchBridgeAction(\"loan:approved\", res, userId, { sound: \"coin_drop\" });\n this.emit(\"loanDisbursed\", { userId, loan: res.loan, guildId });\n }\n return res;\n }\n\n public async repayLoan(userId: string, loanId: string, amount: number | \"all\", guildId?: string) {\n const res = await this.loans.repayLoan(userId, loanId, amount, guildId);\n if (res.success) {\n this.dispatchBridgeAction(\"loan:repaid\", res, userId, res.isFullyPaid ? { sound: \"win\" } : undefined);\n this.emit(\"loanRepaid\", { userId, amountPaid: res.amountPaid, remainingDue: res.remainingDue, settled: res.isFullyPaid, newCreditScore: res.newCreditScore, guildId });\n }\n return res;\n }\n\n public async processLoanCollections(userId: string, guildId?: string) {\n const res = await this.loans.processCollections(userId, guildId);\n if (res.defaultedLoans.length > 0) {\n this.dispatchBridgeAction(\"loan:defaulted\", res, userId, { sound: \"rob_siren\" });\n }\n return res;\n }\n\n /* -------------------------------------------------------------------------- */\n /* REAL ECONOMY: MUNICIPAL BILLS & PROGRESSIVE WEALTH TAXES */\n /* -------------------------------------------------------------------------- */\n\n public async getPendingBills(userId: string, guildId?: string): Promise<MunicipalBill[]> {\n return this.taxes.getPendingBills(userId, guildId);\n }\n\n public async getAllBills(userId: string, guildId?: string): Promise<MunicipalBill[]> {\n return this.taxes.getAllBills(userId, guildId);\n }\n\n public async generateBillsIfDue(userId: string, guildId?: string) {\n return this.taxes.generateBillsIfDue(userId, guildId);\n }\n\n public async payBill(userId: string, billId: string, guildId?: string) {\n const res = await this.taxes.payBill(userId, billId, guildId);\n if (res.success) {\n this.dispatchBridgeAction(\"bill:paid\", res, userId, { sound: \"coin_drop\" });\n }\n return res;\n }\n\n public async payAllBills(userId: string, guildId?: string) {\n const res = await this.taxes.payAllBills(userId, guildId);\n if (res.success) {\n this.dispatchBridgeAction(\"bills:all_paid\", res, userId, { sound: \"win\" });\n this.emit(\"billsPaid\", { userId, totalAmountPaid: res.totalAmountPaid, paidCount: res.paidCount, newCreditScore: res.newCreditScore, guildId });\n }\n return res;\n }\n\n public async attemptTaxEvasion(userId: string, guildId?: string) {\n const res = await this.taxes.attemptTaxEvasion(userId, guildId);\n this.dispatchBridgeAction(\"tax:evasion_attempt\", res, userId, res.success ? { sound: \"win\" } : { sound: \"rob_siren\" });\n return res;\n }\n}\n","/**\n * @m3rcena/eco - Standalone Local Submodule Host Service\n *\n * Runs the Discord Economy Engine locally when cloned via Git submodules.\n * Starts a standalone HTTP REST service with SQLite / Prisma persistence\n * and Canvas Debit Card generation. Automatically connects to @m3rcena/bridge if detected.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport http from \"node:http\";\nimport { EcoManager } from \"./EcoManager.js\";\nimport { EcoBridgeRouter } from \"./bridge/EcoBridgeRouter.js\";\nimport { SqliteEcoStorage } from \"./storage/SqliteEcoStorage.js\";\nimport { RenderBankCard } from \"./canvas/RenderBankCard.js\";\nimport { getAllPackageResolutions, printResolutionSummary } from \"./resolver.js\";\nimport { ECO_VERSION } from \"./utils/Notifier.js\";\nimport type { BridgeRequest, BridgeResponse } from \"@m3rcena/bridge\";\n\nexport interface HostEcoOptions {\n port?: number;\n dbPath?: string;\n bridgeUrl?: string;\n}\n\nexport async function hostEco(options: HostEcoOptions = {}): Promise<{\n eco: EcoManager;\n router: EcoBridgeRouter;\n server: http.Server;\n port: number;\n}> {\n const port = options.port ?? parseInt(process.env.PORT || process.env.ECO_PORT || \"4002\", 10);\n const dbPath = options.dbPath ?? (process.env.ECO_DB_PATH || \"./eco.sqlite\");\n\n printResolutionSummary();\n\n const storage = new SqliteEcoStorage({ path: dbPath });\n const eco = new EcoManager({\n storage,\n currencySymbol: \"🪙\",\n currencyName: \"Coins\",\n });\n\n const router = new EcoBridgeRouter(eco);\n\n // Try auto-connecting to Bridge if bridge submodule/npm exists\n const resolutions = getAllPackageResolutions();\n if (resolutions[\"@m3rcena/bridge\"].status !== \"missing\") {\n try {\n const bridgeModule = await import(resolutions[\"@m3rcena/bridge\"].path);\n if (bridgeModule.M3rcenaBridge) {\n console.log(`[m3rcena-eco] 🌉 Found @m3rcena/bridge (${resolutions[\"@m3rcena/bridge\"].status}). Ready for bridge mount.`);\n }\n } catch {\n // Ignore\n }\n }\n\n const server = http.createServer(async (req, res) => {\n const url = new URL(req.url ?? \"/\", `http://${req.headers.host ?? \"localhost\"}`);\n const pathname = url.pathname;\n\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type, Authorization\");\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(204);\n res.end();\n return;\n }\n\n if (pathname === \"/health\" || pathname === \"/\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n status: \"healthy\",\n package: \"@m3rcena/eco\",\n mode: \"local-submodule-host\",\n version: ECO_VERSION,\n database: \"SQLite\",\n dbPath,\n uptime: process.uptime(),\n }, null, 2)\n );\n return;\n }\n\n if (pathname.startsWith(\"/account/\")) {\n const userId = pathname.replace(\"/account/\", \"\").trim();\n const account = await eco.getAccount(userId);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(account, null, 2));\n return;\n }\n\n if (pathname.startsWith(\"/cards/debit/\")) {\n const userId = pathname.replace(\"/cards/debit/\", \"\").trim();\n const account = await eco.getAccount(userId);\n try {\n const cardBuffer = await RenderBankCard.renderCard({\n username: `User_${userId.slice(0, 4)}`,\n wallet: account.wallet,\n bank: account.bank,\n netWorth: account.wallet + account.bank,\n });\n res.writeHead(200, { \"Content-Type\": \"image/png\" });\n res.end(cardBuffer);\n return;\n } catch (err: any) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: err.message }));\n return;\n }\n }\n\n if (pathname === \"/stocks\") {\n const stocks = eco.getStocks();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ stocks }, null, 2));\n return;\n }\n\n if (pathname === \"/leaderboard\") {\n const lb = await eco.getLeaderboard(\"net_worth\", 10);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ leaderboard: lb }, null, 2));\n return;\n }\n\n // Forward to EcoBridgeRouter if matched\n if (pathname.startsWith(\"/eco/\") || pathname.startsWith(\"/api/eco\")) {\n const bridgeReq: BridgeRequest = {\n method: (req.method as any) || \"GET\",\n url: req.url || \"/\",\n path: pathname,\n subPath: pathname.replace(/^\\/(?:api\\/)?eco/, \"\"),\n params: {},\n query: Object.fromEntries(url.searchParams.entries()),\n headers: req.headers as Record<string, string>,\n };\n const handled = await router.handleRequest(bridgeReq);\n if (handled) {\n res.writeHead(handled.status, {\n \"Content-Type\": handled.contentType || \"application/json\",\n ...(handled.headers || {}),\n });\n if (Buffer.isBuffer(handled.body)) {\n res.end(handled.body);\n } else if (typeof handled.body === \"string\") {\n res.end(handled.body);\n } else {\n res.end(JSON.stringify(handled.body));\n }\n return;\n }\n }\n\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Route not found\", path: pathname }));\n });\n\n await new Promise<void>((resolve) => {\n server.listen(port, () => resolve());\n });\n\n console.log(`\n┌────────────────────────────────────────────────────────────────────────┐\n│ 💰 M3RCENA ECO LOCAL HOST SERVICE │\n│ Economy Engine running on http://localhost:${port.toString().padEnd(25)}│\n│ - Database: SQLite (${dbPath.padEnd(41)})│\n│ - Health API: http://localhost:${port}/health │\n│ - User Account: http://localhost:${port}/account/:userId │\n│ - Debit Card: http://localhost:${port}/cards/debit/:userId │\n│ - Stock Market: http://localhost:${port}/stocks │\n│ - Leaderboard: http://localhost:${port}/leaderboard │\n│ Ready to host economy locally via Submodule! │\n└────────────────────────────────────────────────────────────────────────┘\n`);\n\n return { eco, router, server, port };\n}\n\nif (process.argv[1]?.endsWith(\"host.ts\") || process.argv[1]?.endsWith(\"host.js\")) {\n hostEco().catch((err) => {\n console.error(\"[m3rcena-eco host] Fatal error:\", err);\n process.exit(1);\n });\n}\n"],"mappings":"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"}