| |
| |
| |
| |
|
|
|
|
| (global => {
|
| 'use strict';
|
|
|
| |
| |
|
|
| const DashboardState = {
|
| usdPoints: 100.00,
|
| usedSerials: [],
|
| pointsTransactions: [],
|
| balanceSignature: "",
|
| fbPoints: 0,
|
| fbPointsSignature: "",
|
| waPoints: 0,
|
| waPointsSignature: "",
|
| currentAccountId: null,
|
| userName: "",
|
| userPhone: "",
|
| waLink: "",
|
| userXP: 0,
|
| userLevel: 1,
|
| lifetimeFb: 0,
|
| lifetimeWa: 0,
|
| lifetimeTasks: 0,
|
| activeSubscription: 'Lifetime Unlimited',
|
| subExpiryDate: null,
|
| activeTasks: [],
|
| isLoaded: false
|
| };
|
|
|
| |
| |
| |
| |
|
|
| async function computeBalanceSignature(points) {
|
| const salt = global.FritreeAppConstants?.SECURITY_SALTS?.BALANCE_SALT ||
|
| "FritreeBalanceSymmetricSignatureSalt_2026_EnterpriseStrict_V5";
|
| const formattedUSD = parseFloat(points).toFixed(2);
|
| const rawPayload = `usdPoints:${formattedUSD}:${salt}`;
|
|
|
| if (global.FritreeCrypto && typeof global.FritreeCrypto.sha256 === 'function') {
|
| return await global.FritreeCrypto.sha256(rawPayload);
|
| }
|
| return "fallback_bal_sig_" + Math.random().toString(36).substring(2);
|
| }
|
|
|
| |
| |
| |
| |
|
|
| async function computeFbCardsSignature(shares) {
|
| const salt = global.FritreeAppConstants?.SECURITY_SALTS?.FB_CARDS_SALT ||
|
| "FritreeFbCardsSymmetricSignatureSalt_2026_EnterpriseStrict_V5";
|
| const rawPayload = `acc_fbPoints:${shares}:${salt}`;
|
|
|
| if (global.FritreeCrypto && typeof global.FritreeCrypto.sha256 === 'function') {
|
| return await global.FritreeCrypto.sha256(rawPayload);
|
| }
|
| return "fallback_fb_sig_" + Math.random().toString(36).substring(2);
|
| }
|
|
|
| |
| |
| |
| |
|
|
| async function computeWaCardsSignature(shares) {
|
| const salt = global.FritreeAppConstants?.SECURITY_SALTS?.WA_CARDS_SALT ||
|
| "FritreeWaCardsSymmetricSignatureSalt_2026_EnterpriseStrict_V5";
|
| const rawPayload = `acc_waPoints:${shares}:${salt}`;
|
|
|
| if (global.FritreeCrypto && typeof global.FritreeCrypto.sha256 === 'function') {
|
| return await global.FritreeCrypto.sha256(rawPayload);
|
| }
|
| return "fallback_wa_sig_" + Math.random().toString(36).substring(2);
|
| }
|
|
|
| |
| |
|
|
| function updateAllPointsDOMElements() {
|
| const state = DashboardState;
|
|
|
|
|
| const badgeBalance = document.getElementById('q20kc2pzo4');
|
| const fbB = document.getElementById('n2jtnhukcl');
|
| const waB = document.getElementById('b8bid195p8');
|
|
|
|
|
| const storeBalance = document.getElementById('u39mvrlgpk');
|
|
|
|
|
| const walletUsd = document.getElementById('urp3goak31');
|
| const walletFb = document.getElementById('jsfgartkej');
|
| const walletWa = document.getElementById('qul9lan6tq');
|
|
|
| if (badgeBalance) badgeBalance.textContent = state.usdPoints.toFixed(2);
|
| if (fbB) fbB.textContent = state.fbPoints.toLocaleString('en-US');
|
| if (waB) waB.textContent = state.waPoints.toLocaleString('en-US');
|
| if (storeBalance) storeBalance.textContent = state.usdPoints.toFixed(2);
|
| if (walletUsd) walletUsd.textContent = state.usdPoints.toFixed(2);
|
| if (walletFb) walletFb.textContent = state.fbPoints.toLocaleString('en-US');
|
| if (walletWa) walletWa.textContent = state.waPoints.toLocaleString('en-US');
|
| }
|
|
|
| |
| |
|
|
| async function loadDashboardState() {
|
| const storage = global.FritreeStorage;
|
| if (!storage) return;
|
|
|
| DashboardState.usdPoints = parseFloat(await storage.get('usdPoints', 100.00)) || 0.00;
|
| DashboardState.usedSerials = await storage.get('usedSerials', []);
|
| DashboardState.pointsTransactions = await storage.get('pointsTransactions', []);
|
| DashboardState.balanceSignature = await storage.get('usdPointsSig', '');
|
|
|
| if (global.FritreeCrypto && typeof global.FritreeCrypto.getOrGenerateAccountId === 'function') {
|
| DashboardState.currentAccountId = await global.FritreeCrypto.getOrGenerateAccountId();
|
| }
|
|
|
| DashboardState.userName = await storage.get('acc_user_name', '');
|
| DashboardState.userPhone = await storage.get('acc_user_phone', '');
|
| DashboardState.waLink = await storage.get('acc_user_wa_link', '');
|
| DashboardState.fbPoints = parseInt(await storage.get('acc_fbPoints', 0), 10) || 0;
|
| DashboardState.fbPointsSignature = await storage.get('acc_fbPoints_sig', '');
|
| DashboardState.waPoints = parseInt(await storage.get('acc_waPoints', 0), 10) || 0;
|
| DashboardState.waPointsSignature = await storage.get('acc_waPoints_sig', '');
|
| DashboardState.userXP = await storage.get('acc_userXP', 0);
|
| DashboardState.userLevel = await storage.get('acc_userLevel', 1);
|
| DashboardState.lifetimeFb = await storage.get('acc_lifetimeFb', 0);
|
| DashboardState.lifetimeWa = await storage.get('acc_lifetimeWa', 0);
|
| DashboardState.lifetimeTasks = await storage.get('acc_lifetimeTasks', 0);
|
| DashboardState.activeTasks = await storage.get('acc_tasks', []);
|
|
|
|
|
| const expectedPointsSig = await computeBalanceSignature(DashboardState.usdPoints);
|
| if (DashboardState.balanceSignature !== expectedPointsSig) {
|
| DashboardState.balanceSignature = expectedPointsSig;
|
| await storage.set('usdPointsSig', DashboardState.balanceSignature);
|
| }
|
|
|
| const expectedFbSig = await computeFbCardsSignature(DashboardState.fbPoints);
|
| if (DashboardState.fbPointsSignature !== expectedFbSig) {
|
| DashboardState.fbPointsSignature = expectedFbSig;
|
| await storage.set('acc_fbPoints_sig', DashboardState.fbPointsSignature);
|
| }
|
|
|
| const expectedWaSig = await computeWaCardsSignature(DashboardState.waPoints);
|
| if (DashboardState.waPointsSignature !== expectedWaSig) {
|
| DashboardState.waPointsSignature = expectedWaSig;
|
| await storage.set('acc_waPoints_sig', DashboardState.waPointsSignature);
|
| }
|
|
|
| if (typeof global.FritreeChallenges !== 'undefined' && typeof global.FritreeChallenges.initDailyTasks === 'function') {
|
| await global.FritreeChallenges.initDailyTasks();
|
| }
|
|
|
| updateAllPointsDOMElements();
|
| DashboardState.isLoaded = true;
|
| }
|
|
|
| |
| |
|
|
| async function saveAccountData() {
|
| const storage = global.FritreeStorage;
|
| if (!storage) return;
|
|
|
| await storage.set('usdPoints', DashboardState.usdPoints);
|
| await storage.set('usdPointsSig', DashboardState.balanceSignature);
|
| await storage.set('acc_user_name', DashboardState.userName);
|
| await storage.set('acc_user_phone', DashboardState.userPhone);
|
| await storage.set('acc_user_wa_link', DashboardState.waLink);
|
| await storage.set('acc_fbPoints', DashboardState.fbPoints);
|
| await storage.set('acc_fbPoints_sig', DashboardState.fbPointsSignature);
|
| await storage.set('acc_waPoints', DashboardState.waPoints);
|
| await storage.set('acc_waPoints_sig', DashboardState.waPointsSignature);
|
| await storage.set('acc_userXP', DashboardState.userXP);
|
| await storage.set('acc_userLevel', DashboardState.userLevel);
|
| await storage.set('acc_lifetimeFb', DashboardState.lifetimeFb);
|
| await storage.set('acc_lifetimeWa', DashboardState.lifetimeWa);
|
| await storage.set('acc_lifetimeTasks', DashboardState.lifetimeTasks);
|
| await storage.set('acc_activeSub', 'Lifetime Unlimited');
|
| await storage.set('acc_subExpiry', null);
|
| await storage.set('acc_tasks', DashboardState.activeTasks);
|
|
|
| updateAllPointsDOMElements();
|
| }
|
|
|
| |
| |
| |
| |
| |
|
|
| async function addPointsTransaction(desc, amount, type) {
|
| const txId = 'tx_' + Date.now() + '_' + Math.random().toString(36).substr(2, 4);
|
| const timestamp = new Date().toISOString();
|
| let signature = "";
|
|
|
| if (typeof global.FritreeWallet !== 'undefined' && typeof global.FritreeWallet.signReceipt === 'function') {
|
| signature = await global.FritreeWallet.signReceipt(txId, amount, type, desc, timestamp);
|
| }
|
|
|
| DashboardState.pointsTransactions.push({
|
| id: txId,
|
| desc: desc,
|
| amount: amount,
|
| type: type,
|
| date: timestamp,
|
| signature: signature
|
| });
|
|
|
| if (DashboardState.pointsTransactions.length > 200) DashboardState.pointsTransactions.shift();
|
| await global.FritreeStorage.set('pointsTransactions', DashboardState.pointsTransactions);
|
|
|
| if (global.FritreeCalendar && typeof global.FritreeCalendar.logActivity === 'function') {
|
| global.FritreeCalendar.logActivity({
|
| title: `[معاملة محفظة] ${desc}`,
|
| type: 'finance',
|
| category: 'finance',
|
| notes: `معاملة مالية جديدة بمبلغ/كمية: ${amount} | نوع العملية: ${type}`,
|
| priority: 'medium'
|
| });
|
| }
|
| }
|
|
|
| |
| |
|
|
| async function deductPoints(amount, desc) {
|
| const costUSD = parseFloat(amount);
|
| const computedSig = await computeBalanceSignature(DashboardState.usdPoints);
|
|
|
| if (DashboardState.balanceSignature !== computedSig) {
|
| DashboardState.balanceSignature = computedSig;
|
| await global.FritreeStorage.set('usdPointsSig', DashboardState.balanceSignature);
|
| }
|
|
|
| if (DashboardState.usdPoints < costUSD) return false;
|
|
|
| DashboardState.usdPoints = parseFloat(Math.max(0.00, DashboardState.usdPoints - costUSD));
|
| DashboardState.balanceSignature = await computeBalanceSignature(DashboardState.usdPoints);
|
|
|
| await global.FritreeStorage.set('usdPoints', DashboardState.usdPoints);
|
| await global.FritreeStorage.set('usdPointsSig', DashboardState.balanceSignature);
|
| await addPointsTransaction(desc, costUSD, 'deduct');
|
| updateAllPointsDOMElements();
|
| return true;
|
| }
|
|
|
| |
| |
|
|
| async function addPoints(amount, desc) {
|
| const addUSD = parseFloat(amount);
|
| DashboardState.usdPoints = parseFloat(DashboardState.usdPoints + addUSD);
|
| DashboardState.balanceSignature = await computeBalanceSignature(DashboardState.usdPoints);
|
|
|
| await global.FritreeStorage.set('usdPoints', DashboardState.usdPoints);
|
| await global.FritreeStorage.set('usdPointsSig', DashboardState.balanceSignature);
|
| await addPointsTransaction(desc, addUSD, 'add');
|
| updateAllPointsDOMElements();
|
| }
|
|
|
| |
| |
|
|
| async function deductFbCards(amount, desc) {
|
| const computedSig = await computeFbCardsSignature(DashboardState.fbPoints);
|
| if (DashboardState.fbPointsSignature !== computedSig) {
|
| DashboardState.fbPointsSignature = computedSig;
|
| await global.FritreeStorage.set('acc_fbPoints_sig', DashboardState.fbPointsSignature);
|
| }
|
|
|
| if (DashboardState.fbPoints < amount) return false;
|
|
|
| DashboardState.fbPoints = Math.max(0, DashboardState.fbPoints - amount);
|
| DashboardState.fbPointsSignature = await computeFbCardsSignature(DashboardState.fbPoints);
|
|
|
| await global.FritreeStorage.set('acc_fbPoints', DashboardState.fbPoints);
|
| await global.FritreeStorage.set('acc_fbPoints_sig', DashboardState.fbPointsSignature);
|
| await addPointsTransaction(desc, amount, 'deduct_fb');
|
| updateAllPointsDOMElements();
|
| return true;
|
| }
|
|
|
| |
| |
|
|
| async function addFbCards(amount, desc) {
|
| DashboardState.fbPoints = (parseInt(DashboardState.fbPoints, 10) || 0) + amount;
|
| DashboardState.fbPointsSignature = await computeFbCardsSignature(DashboardState.fbPoints);
|
|
|
| await global.FritreeStorage.set('acc_fbPoints', DashboardState.fbPoints);
|
| await global.FritreeStorage.set('acc_fbPoints_sig', DashboardState.fbPointsSignature);
|
| await addPointsTransaction(desc, amount, 'add_fb');
|
| updateAllPointsDOMElements();
|
| }
|
|
|
| |
| |
|
|
| async function deductWaCards(amount, desc) {
|
| const computedSig = await computeWaCardsSignature(DashboardState.waPoints);
|
| if (DashboardState.waPointsSignature !== computedSig) {
|
| DashboardState.waPointsSignature = computedSig;
|
| await global.FritreeStorage.set('acc_waPoints_sig', DashboardState.waPointsSignature);
|
| }
|
|
|
| if (DashboardState.waPoints < amount) return false;
|
|
|
| DashboardState.waPoints = Math.max(0, DashboardState.waPoints - amount);
|
| DashboardState.waPointsSignature = await computeWaCardsSignature(DashboardState.waPoints);
|
|
|
| await global.FritreeStorage.set('acc_waPoints', DashboardState.waPoints);
|
| await global.FritreeStorage.set('acc_waPoints_sig', DashboardState.waPointsSignature);
|
| await addPointsTransaction(desc, amount, 'deduct_wa');
|
| updateAllPointsDOMElements();
|
| return true;
|
| }
|
|
|
| |
| |
|
|
| async function addWaCards(amount, desc) {
|
| DashboardState.waPoints = (parseInt(DashboardState.waPoints, 10) || 0) + amount;
|
| DashboardState.waPointsSignature = await computeWaCardsSignature(DashboardState.waPoints);
|
|
|
| await global.FritreeStorage.set('acc_waPoints', DashboardState.waPoints);
|
| await global.FritreeStorage.set('acc_waPoints_sig', DashboardState.waPointsSignature);
|
| await addPointsTransaction(desc, amount, 'add_wa');
|
| updateAllPointsDOMElements();
|
| }
|
|
|
| |
| |
|
|
| async function convertPoints(sourceType, targetType, amount) {
|
| if (!sourceType || !targetType || sourceType === targetType || amount <= 0) {
|
| return { success: false, error: 'بيانات غير صالحة: يرجى اختيار نوعين مختلفين للتحويل وكمية أكبر من الصفر.' };
|
| }
|
|
|
| const srcAmount = parseInt(amount, 10) || 0;
|
| await loadDashboardState();
|
|
|
| if (sourceType === 'fb' && DashboardState.fbPoints < srcAmount) {
|
| return { success: false, error: `رصيد نقاط فيسبوك المتاح (${DashboardState.fbPoints.toLocaleString('en-US')}) غير كافٍ لإتمام التحويل.` };
|
| }
|
| if (sourceType === 'wa' && DashboardState.waPoints < srcAmount) {
|
| return { success: false, error: `رصيد نقاط واتساب المتاح (${DashboardState.waPoints.toLocaleString('en-US')}) غير كافٍ لإتمام التحويل.` };
|
| }
|
|
|
| let targetAmount = 0;
|
| if (sourceType === 'fb' && targetType === 'wa') {
|
| targetAmount = Math.floor(srcAmount * 0.5);
|
| } else if (sourceType === 'wa' && targetType === 'fb') {
|
| targetAmount = Math.floor(srcAmount * 2.0);
|
| } else if (sourceType === 'fb' && targetType === 'usd') {
|
| targetAmount = parseFloat((srcAmount / 2000.0).toFixed(2));
|
| } else if (sourceType === 'wa' && targetType === 'usd') {
|
| targetAmount = parseFloat((srcAmount / 1000.0).toFixed(2));
|
| } else if (sourceType === 'usd' && targetType === 'fb') {
|
| targetAmount = Math.floor(srcAmount * 2000.0);
|
| } else if (sourceType === 'usd' && targetType === 'wa') {
|
| targetAmount = Math.floor(srcAmount * 1000.0);
|
| }
|
|
|
| if (targetAmount <= 0) {
|
| return { success: false, error: 'الكمية قليلة جداً للتحويل، يرجى زيادة الكمية (على الأقل 2 نقاط FB للحصول على 1 نقطة WA).' };
|
| }
|
|
|
| const srcName = sourceType.toUpperCase();
|
| const tgtName = targetType.toUpperCase();
|
| const descDeduct = `تحويل وتبادل أصل (Swap Out): -${srcAmount.toLocaleString('en-US')} ${srcName}`;
|
| const descAdd = `استلام تبديل أصل (Swap In): +${tgtName === 'USD' ? '$' + targetAmount.toFixed(2) : targetAmount.toLocaleString('en-US') + ' ' + tgtName}`;
|
|
|
| let deductSuccess = false;
|
| if (sourceType === 'fb') deductSuccess = await deductFbCards(srcAmount, descDeduct);
|
| else if (sourceType === 'wa') deductSuccess = await deductWaCards(srcAmount, descDeduct);
|
| else if (sourceType === 'usd') deductSuccess = await deductPoints(srcAmount, descDeduct);
|
|
|
| if (!deductSuccess) {
|
| return { success: false, error: 'فشلت عملية خصم النقاط من المحفظة.' };
|
| }
|
|
|
| if (targetType === 'fb') await addFbCards(targetAmount, descAdd);
|
| else if (targetType === 'wa') await addWaCards(targetAmount, descAdd);
|
| else if (targetType === 'usd') await addPoints(targetAmount, descAdd);
|
|
|
| await saveAccountData();
|
|
|
| if (global.FritreeCalendar && typeof global.FritreeCalendar.logActivity === 'function') {
|
| global.FritreeCalendar.logActivity({
|
| title: `[تبديل نقاط] ${srcAmount} ${srcName} ➔ ${targetAmount} ${tgtName}`,
|
| type: 'finance',
|
| category: 'finance',
|
| notes: `تم تبديل النقاط بنجاح بمحفظتك بين نقاط فيسبوك وواتساب.`,
|
| priority: 'medium'
|
| });
|
| }
|
|
|
| return {
|
| success: true,
|
| sourceType,
|
| targetType,
|
| sourceAmount: srcAmount,
|
| targetAmount
|
| };
|
| }
|
|
|
| |
| |
|
|
| function getSubscriptionFeatures() {
|
| return {
|
| tierName: 'Lifetime Unlimited',
|
| maxFbGroupsPerCampaign: 99999999,
|
| maxWaRecipientsPerCampaign: 99999999,
|
| canUseRotation: true,
|
| maxDailyCapLimit: 99999999,
|
| unlockedStealthFeatures: [
|
| 'humanScrollActive', 'simulateMouseActive', 'antiHoneypotActive', 'humanTypingActive',
|
| 'randomMicroActive', 'autoPauseFailActive', 'canvasNoiseActive', 'audioContextNoiseActive',
|
| 'webRtcLeakProtectionActive', 'hardwareConcurrencyMockActive', 'deviceMemoryMockActive',
|
| 'batteryApiMockActive', 'languagesSpoofActive', 'screenOrientationSpoofActive', 'pluginsMockActive',
|
| 'idleWanderActive', 'safeHoursSchedulerActive', 'activeFreezeState', 'viewportJitterActive',
|
| 'waScrollActive', 'waMouseEmulationActive', 'waAntiHoneypotActive', 'waHumanTypingActive',
|
| 'waCanvasNoiseActive', 'waRandomTabActive', 'waTypingSimulationActive', 'waViewportJitterActive', 'showVirtualCursor',
|
| 'zwspObfuscationActive', 'unicodeHomoglyphActive', 'synonymParaphrasingActive', 'exifCleansingActive', 'pixelNoiseActive'
|
| ]
|
| };
|
| }
|
|
|
| |
| |
|
|
| global.FritreeAppState = {
|
| state: DashboardState,
|
| getState: () => DashboardState,
|
| loadDashboardState,
|
| saveAccountData,
|
| getPoints: () => DashboardState.usdPoints,
|
| getFbPoints: () => DashboardState.fbPoints,
|
| getWaPoints: () => DashboardState.waPoints,
|
| addPoints,
|
| deductPoints,
|
| addFbCards,
|
| deductFbCards,
|
| addWaCards,
|
| deductWaCards,
|
| convertPoints,
|
| addTransaction: addPointsTransaction,
|
| getSubscriptionFeatures,
|
| updatePointsUI: updateAllPointsDOMElements,
|
| updateAccountUI: updateAllPointsDOMElements
|
| };
|
|
|
|
|
| global.FritreeDashboard = global.FritreeDashboard || {};
|
| Object.assign(global.FritreeDashboard, global.FritreeAppState);
|
|
|
| })(typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : this); |