PHP WebShell

Текущая директория: /var/www/bitcardoApp/user/dashboard

Просмотр файла: index.php

<?php 
    include '../common/header.php';
    $user_id = $_SESSION['user_id'];
    
    $query = "
    SELECT t.*,
        w_sender.user_id AS sender_uid, w_receiver.user_id AS receiver_uid,
        w_sender.label AS sender_label, w_sender.wallet_add AS sender_wallet,
        w_receiver.label AS receiver_label, w_receiver.wallet_add AS receiver_wallet,
        u_sender.first_name AS sender_first, u_sender.last_name AS sender_last,
        u_receiver.first_name AS receiver_first, u_receiver.last_name AS receiver_last
    FROM transactions t
    LEFT JOIN user_wallets w_sender   ON t.sender_address   = w_sender.wallet_add
    LEFT JOIN users       u_sender    ON w_sender.user_id   = u_sender.user_id
    LEFT JOIN user_wallets w_receiver ON t.receiver_address = w_receiver.wallet_add
    LEFT JOIN users       u_receiver  ON w_receiver.user_id = u_receiver.user_id
    WHERE
        (
            (t.type IN ('send','withdrawal')   AND w_sender.user_id   = ?)
            OR (t.type IN ('receive','deposit','giftcard_payout')   AND w_receiver.user_id = ?)
            OR (t.type = 'swap'                   AND (w_sender.user_id = ? OR w_receiver.user_id = ?))
            OR (t.type = 'fee'                    AND (w_sender.user_id = ? OR w_receiver.user_id = ?))
        )
    ORDER BY t.created_at DESC
    LIMIT 5
    ";

    $stmt = $conn->prepare($query);
    $stmt->bind_param("iiiiii", $user_id, $user_id, $user_id, $user_id, $user_id, $user_id);
    $stmt->execute();
    $result = $stmt->get_result();
    $recent_transactions = [];
    while ($row = $result->fetch_assoc()) $recent_transactions[] = $row;
    $stmt->close();

    function truncate_left($string, $length = 30, $ellipsis = '...') {
        if (!$string) return '';
        $string = strval($string);
        if (strlen($string) > $length) {
            return $ellipsis . substr($string, -$length);
        } else {
            return $string;
        }
    }

// $conn is your mysqli connection; $user_id is the current user ID
$user_id = $user_id ?? ($_SESSION['user_id']);

$walletOptions = [
    'BTC' => ['label' => 'Create BTC Wallet', 'name' => 'create_btc_address'],
    'TRX' => ['label' => 'Create TRX & USDT Wallet', 'name' => 'create_trx_address'],
    //'SOL' => ['label' => 'Create SOL Wallet', 'name' => 'create_sol_address'],
    // 'ETH' => ['label' => 'Create ETH Wallet', 'name' => 'create_eth_address'],
];

// Fetch user's existing coins
$existingCoins = [];
$sql  = "SELECT UPPER(coin) AS coin FROM user_wallets WHERE user_id = ?";
$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, "i", $user_id);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_assoc($result)) {
    $existingCoins[] = $row['coin'];
}
mysqli_free_result($result);
mysqli_stmt_close($stmt);

// Remove options for coins the user already has
foreach ($existingCoins as $coin) {
    if (isset($walletOptions[$coin])) {
        unset($walletOptions[$coin]);
    }
}


include_once '../../models/crypto/create_address_helper.php';
include_once '../../models/crypto/create_btc_user_address.php';
include_once '../../models/crypto/create_eth_user_address.php';
include_once '../../models/crypto/create_sol_user_address.php';
include_once '../../models/crypto/create_tron_wallet.php';

// Handle Create TRX & USDT wallet request
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['create_trx_address'])) {
    try {
        // Use the namespaced class from models/crypto/create_tron_wallet.php
        $creator = new \Models\Crypto\CreateTronWallet($conn);
        $result  = $creator->create((int)$user_id);

        if ($result['success']) {
            $_SESSION['flash_success'] = $result['message'] . ' Address: ' . $result['address'];
        } else {
            $_SESSION['flash_error'] = $result['message'];
        }
    } catch (\Throwable $e) {
        $_SESSION['flash_error'] = 'Error creating TRX wallet: ' . $e->getMessage();
    }

    // Always redirect after POST to avoid resubmission
    header('Location: index.php');
    exit;
}


function coin_decimals_ui(string $coin): int {
    $coin = strtoupper($coin);
    return match ($coin) {
        'BTC' => 8,
        'ETH' => 10,
        'SOL' => 9,
        'TRX' => 6,
        'USDT', 'USDC' => 6,
        'NGN', 'USD' => 2,
        default => 8, // sensible crypto default
    };
}

/**
 * Format a numeric/decimal string without losing precision.
 * Keeps fixed decimals for consistency (no trailing-zero trimming).
 */
function fmt_coin_amount($amount, string $coin): string {
    $scale = coin_decimals_ui($coin);
    // number_format needs float; DECIMAL(30,10) fits fine for these scales.
    // If you prefer exact strings, you can swap in BCMath later.
    return number_format((float)$amount, $scale, '.', '');
}
?>
<!-- Main Container -->
<div class="container mt-3">
  <div class="row">

    <? include '../common/nav.php'; ?>
   
    <main class="col-md-9 col-lg-10 px-md-5 mb-5">
        
        <? include '../common/page-header.php'; ?>

        <?php if (!empty($_SESSION['flash_success'])): ?>
        <div class="alert alert-success text-break">
            <?= htmlspecialchars($_SESSION['flash_success']) ?>
        </div>
        <?php unset($_SESSION['flash_success']); ?>
        <?php endif; ?>


        <?php if (!empty($_SESSION['flash_error'])): ?>
        <div class="alert alert-danger text-break">
            <?= htmlspecialchars($_SESSION['flash_error']) ?>
        </div>
        <?php unset($_SESSION['flash_error']); ?>
        <?php endif; ?>





        <!-- WALLETS CARD-->
        <section class="px-md-5">

            <div class="py-3">
                <h6> &nbsp;Available Balance</h6>
                <div class="mb-2 ms-1">
                    <span class="fs-6 fw-bold">₦<?= number_format($totalNgn, 2); ?></span> &nbsp; | &nbsp;  
                    <span class="fs-6 fw-bold">$<?= number_format($totalUsd, 2); ?></span>
                </div>
                <?php if (!empty($wallets)) : ?>
                <div class="align-content-start">
                
                    <!-- Deposit Dropdown -->
                    <div class="btn-group me-1">
                        <button type="button" class="btn btn-primary btn-sm rounded-5 px-3 dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
                            Deposit
                        </button>
                        <ul class="dropdown-menu">
                            <?php foreach ($wallets as $coin => $wallet): ?>
                            <li>
                                <a class="dropdown-item d-flex align-items-center" href="../wallets/single-wallet.php?ussgwt=<?php echo $wallet['wallet_id']; ?>&coin=<?php echo $wallet['coin']; ?>">
                                <span><?php echo htmlspecialchars($wallet['label'] ?: $coin); ?></span>
                                </a>
                            </li>
                            <?php endforeach; ?>
                        </ul>
                    </div>

                    <!-- Transfer Dropdown -->
                    <div class="btn-group me-1">
                        <button type="button" class="btn btn-outline-secondary btn-sm rounded-5 px-3 dropdown-toggle my-1" data-bs-toggle="dropdown" aria-expanded="false">
                            Withdraw
                        </button>
                        <ul class="dropdown-menu">
                        <?php foreach ($wallets as $coin => $wallet): 
                            // Decide link based on wallet type
                            $link = ($wallet['type'] === 'fiat') 
                                ? "../fiat/send_fiat.php?wallet_id=" . urlencode($wallet['wallet_id']) 
                                : "../crypto/send_crypto.php?coin=" . urlencode($wallet['coin']);
                        ?>
                            <li>
                                <a class="dropdown-item d-flex align-items-center" href="<?php echo $link; ?>">
                                    <span><?php echo htmlspecialchars($wallet['label'] ?: $wallet['coin']); ?></span>
                                </a>
                            </li>
                        <?php endforeach; ?>
                        </ul>
                    </div>

                    <div class="btn-group me-1">
                        <button type="button" class="btn btn-outline-secondary btn-sm rounded-5 px-3 dropdown-toggle my-1" data-bs-toggle="dropdown" aria-expanded="false">
                            Giftcards
                        </button>
                        <ul class="dropdown-menu">
                            <li>
                                <a href="../giftcards/submit_card.php" class="dropdown-item d-flex align-items-center">Sell Gift Card</a>
                            </li>
                            <li>
                                <a href="../giftcards/card_transactions.php" class="dropdown-item d-flex align-items-center">Transactions</a>
                            </li>
                        </ul>
                    </div>
                    <?php if (!empty($walletOptions)): ?>
                    <form method="post" class="d-inline">
                        <div class="btn-group">
                            <button type="button" class="btn btn-primary rounded-5 dropdown-toggle py-1 my-1" data-bs-toggle="dropdown" aria-expanded="false">
                                Create Wallet
                            </button>
                            <ul class="dropdown-menu">
                                <?php foreach ($walletOptions as $symbol => $opt): ?>
                                <li>
                                    <button type="submit"
                                            class="dropdown-item"
                                            id="<?php echo htmlspecialchars($symbol); ?>"
                                            name="<?php echo htmlspecialchars($opt['name']); ?>"
                                            value="1">
                                        <?php echo htmlspecialchars($opt['label']); ?>
                                    </button>
                                </li>
                                <?php endforeach; ?>
                            </ul>
                        </div>
                    </form>
                    <?php endif; ?>

                </div>
                <?php endif; ?>
                <!-- Add more content here -->
                 
            </div>

            <!-- Owl Carousel -->
            <div class="owl-carousel owl-theme">

                <!-- Card -->
                <?php foreach ($wallets as $wallet) { ?>
                <div class="item shadow-sm">
                    <div class="card rounded-1 bg-white">
                        <!-- Card Header with Nigerian flag and NGN text aligned to the left -->
                        <div class="card-header bg-white d-flex d-flex">
                        <img src="../../assets/icons/<?= $wallet['icon'] ?>" class="bg-white flag"></img>
                        <div class="ngn-text"><?= $wallet['coin']; ?></div>
                        </div>

                        <!-- Card Body with wallet info and amount, aligned at the bottom -->
                        <div class="card-body">
                        <!-- Wallet Info -->
                        <div class="wallet-info">
                            <i class="fas fa-wallet"></i>
                            <span>
                            <?= '...' . substr($wallet['wallet_add'], -10); ?>

                            </span> <!-- Display last 10 characters of wallet -->
                        </div>

                        <!-- Amount -->
                        <div class="amount text-end"><?= fmt_coin_amount($wallet['balance'], $wallet['coin']); ?></div>

                        </div>
                    </div>
                </div>
                <?php } ?>

            </div>
            <!-- Owl Carousel -->

        </section>

        <!-- EXCHANGE -->
        <!-- <section class="px-md-5 mt-5" id="">
            
            <div class="bg-white currency-box  p-4 shadow-none border-0 row">
                <h5 class="mb-3">Market Watch</h5>
                <div class="col-md-6 d-md-block">
                    
                    <ul class="nav nav-tabs" id="cryptoTabs" role="tablist">
                        <li class="nav-item" role="presentation">
                        <button class="nav-link active text-dark" id="btc-tab" data-bs-toggle="tab" data-bs-target="#btc" type="button" role="tab" aria-controls="btc" aria-selected="true">BTC</button>
                        </li>
                        <li class="nav-item" role="presentation">
                        <button class="nav-link text-dark" id="eth-tab" data-bs-toggle="tab" data-bs-target="#eth" type="button" role="tab" aria-controls="eth" aria-selected="false">ETH</button>
                        </li>
                        <li class="nav-item" role="presentation">
                        <button class="nav-link text-dark" id="sol-tab" data-bs-toggle="tab" data-bs-target="#sol" type="button" role="tab" aria-controls="sol" aria-selected="false">SOL</button>
                        </li>
                    </ul>

                    <div class="tab-content">
                        <div class="tab-pane fade show active" id="btc" role="tabpanel" aria-labelledby="btc-tab">
                            <div id="tradingview_btcusdt"></div>
                        </div>
                        <div class="tab-pane fade" id="eth" role="tabpanel" aria-labelledby="eth-tab">
                            <div id="tradingview_ethusdt"></div>
                        </div>
                        <div class="tab-pane fade" id="sol" role="tabpanel" aria-labelledby="sol-tab">
                            <div id="tradingview_solusdt"></div>
                        </div>
                    </div>
                </div>
                <div id="convert" class="d-md-none" style="height: 50px"></div>
                <div class="col-md-6" id="">
                    <div class="d-none d-md-block mt-5"></div>
                    <div class="currency-box border shadow-sm">
                        <? 
                        include '../crypto/swap.php'; 
                        ?>
                    </div>
                </div>
            </div>

            <div class="d-flex align-items-center mb-4 justify-content-center mt-4">
                <a href="" class="btn btn-outline-primary rounded-5 text-decoration-none">
                <span class="me-2"><i class="bi bi-bell"></i></span>
                <span class="fw-bold">Get exchange rate updates</span>
                </a>
            </div>

        </section> -->
        
        <!-- TRANSACTIONS -->
        <section class="px-md-4 mt-5">
            <div class="bg-white p-4 currency-box shadow-none border-0">
                <div class="d-flex justify-content-between align-items-center mb-3">
                    <h5 class="mb-0">Transactions</h5>
                    <a href="../data/transactions.php" class="text-decoration-none text-primary fw-semibold">See all</a>
                </div>
                <?php if (empty($recent_transactions)): ?>
                    <div class="text-center text-muted py-4">No recent transactions</div>
                <?php else: ?>
                    <?php foreach ($recent_transactions as $t):
                        $coin = htmlspecialchars($t['coin']);
                        $amount_val = ($coin === 'NGN')
                            ? number_format((float)$t['amount'], 2, '.', '')
                            : fmt_coin_amount($t['amount'], $coin);
                        $amount = $amount_val . ' ' . $coin;

                        $type = $t['type']; // send, receive, swap, deposit, withdrawal
                        $amountShow = $amount;
                        $amountClass = 'text-secondary';
                        $icon = '<i class="bi bi-question-circle"></i>';
                        $counterparty = '';

                        switch ($type) {
                            case 'send':
                                $amountShow = '-' . $amount;
                                $amountClass = 'text-danger';
                                $icon = '<i class="text-danger bi bi-box-arrow-in-up-right"></i>';
                                $counterparty = trim($t['receiver_first'] . ' ' . $t['receiver_last'])
                                    ?: truncate_left($t['receiver_address']);
                                break;

                            case 'receive':
                                $amountShow = '+' . $amount;
                                $amountClass = 'text-success';
                                $icon = '<i class="text-success bi bi-box-arrow-in-down-right"></i>';
                                $counterparty = trim($t['sender_first'] . ' ' . $t['sender_last'])
                                    ?: truncate_left($t['sender_address']);
                                break;

                            case 'swap':
                                $amountClass = 'text-info';
                                $icon = '<i class="text-info bi bi-shuffle"></i>';
                                $address = $t['receiver_address'] ?: $t['sender_address'];
                                $counterparty = truncate_left($address, 15);
                                break;

                            case 'deposit':
                                $amountShow = '+' . $amount;
                                $amountClass = 'text-success';
                                $icon = '<i class="text-success bi bi-box-arrow-in-down-right"></i>';
                                $counterparty = 'Deposit Wallet';
                                break;

                            case 'withdrawal':
                                $amountShow = '-' . $amount;
                                $amountClass = 'text-danger';
                                $icon = '<i class="text-danger bi bi-box-arrow-in-up-right"></i>';
                                $counterparty = 'Withdrawal Wallet';
                                break;

                            case 'fee':
                                $isDebit = ((int)$t['sender_uid'] === (int)$user_id);
                                if ($isDebit) {
                                    $amountShow = '-' . $amount;
                                    $amountClass = 'text-danger';
                                    $icon = '<i class="text-warning bi bi-receipt"></i>';
                                    $counterparty = 'Fee';
                                } else {
                                    $amountShow = '+' . $amount;
                                    $amountClass = 'text-success';
                                    $icon = '<i class="text-success bi bi-receipt"></i>';
                                    $counterparty = 'Fee Rebate';
                                }
                                break;
                            
                            case 'giftcard_payout':
                                $amountShow = '+' . $amount;
                                $amountClass = 'text-success';
                                // Bootstrap Icons has a gift icon
                                $icon = '<i class="text-success bi bi-gift"></i>';
                                $counterparty = 'Giftcard Payout';
                                break;
                        
                                
                        }

                        $typeText = match ($type) {
                            'giftcard_payout' => 'Giftcard Payout',
                            default           => ucfirst($type),
                        };
                        $dateText = date('D, M j', strtotime($t['created_at']));
                    ?>
                    <a href="../data/transaction_detail.php?id=<?= $t['trans_id'] ?>" class="text-decoration-none text-dark">
                        <div class="transaction-item d-flex justify-content-between align-items-center py-2 border-0 border-bottom">
                            <div class="d-flex align-items-start gap-3">
                                <div class="transaction-icon">
                                    <?= $icon ?>
                                </div>
                                <div>
                                    <div class="fw-semibold"><?= htmlspecialchars($counterparty) ?></div>
                                    <small class="text-muted"><?= $typeText ?> &middot; <?= $dateText ?></small>
                                </div>
                            </div>
                            <div class="text-end">
                                <div class="amount-lg <?= $amountClass ?>"><?= $amountShow ?></div>
                            </div>
                        </div>
                    </a>
                    <?php endforeach; ?>
                <?php endif; ?>
            </div>
        </section>

        <section class="px-md-5 mt-5">
    

            <!-- <h5 class="mb-3">Recent Beneficiaries</h5>
            <div class="d-flex gap-4 mb-5">
            <div class="text-center">
                <div class="circle-avatar">
                EB
                <img src="../../assets/icons/ngn.png" class="flag-icon" alt="Nigeria Flag">
                </div>
                <div class="contact-name mt-2">Elijah<br>Oluwatobi</div>
            </div>
            <div class="text-center">
                <div class="circle-avatar">
                DA
                <img src="../../assets/icons/ngn.png" class="flag-icon" alt="EU Flag">
                </div>
                <div class="contact-name mt-2">Deutsche<br>Bank AG</div>
            </div>
            <div class="text-center">
                <div class="circle-avatar">
                AA
                <img src="../../assets/icons/usdt.png" class="flag-icon" alt="UK Flag">
                </div>
                <div class="contact-name mt-2">Adebusola<br>Ashaye</div>
            </div>
            <div class="text-center">
                <div class="circle-avatar">
                FO
                <img src="../../assets/icons/btc.png" class="flag-icon" alt="UK Flag">
                </div>
                <div class="contact-name mt-2">Festus<br>Osayande</div>
            </div>
            <div class="text-center">
                <div class="circle-avatar">
                OA
                <img src="../../assets/icons/eth.jpg" class="flag-icon" alt="UK Flag">
                </div>
                <div class="contact-name mt-2">Opeyemi<br>Akindele</div>
            </div>
            </div> -->

            <!-- Do More With Wise -->
            <!-- <h5 class="mb-3">Do more with Bitcardo</h5>
            <div class="row g-3">
                <div class="col-md-3">
                    <div class="card-feature shadow">
                        <div class="fw-bold">Schedule your<br>transfer</div>
                    </div>
                </div>
                <div class="col-md-3">
                    <div class="card-feature shadow">
                        <div class="fw-bold">Lock<br>Wallet</div>
                    </div>
                </div>
                <div class="col-md-3">
                    <div class="card-feature shadow">
                        <div class="fw-bold">Set up Direct<br>Debits</div>
                    </div>
                </div>
                <div class="col-md-3">
                    <div class="card-feature shadow">
                    <div class="fw-bold">Auto<br>Convert</div>
                    </div>
                </div>
            </div> -->
        </section>
    </main>
  </div>
</div>

<? include '../common/footer.php'; ?>
<!-- <script type="text/javascript" src="https://s3.tradingview.com/tv.js"></script>

<script type="text/javascript">
    new TradingView.widget({
    "container_id": "tradingview_btcusdt",
    "symbol": "BINANCE:BTCUSDT",
    "interval": "H",
    "width": "100%",
    "height": 330,
    "theme": "light",
    "style": "1",
    "locale": "en",
    "toolbar_bg": "#f1f3f6",
    "enable_publishing": false,
    "hide_top_toolbar": false,
    "save_image": false,
    "studies": [],
    "withdateranges": true
    });

    new TradingView.widget({
    "container_id": "tradingview_ethusdt",
    "symbol": "BINANCE:ETHUSDT",
    "interval": "H",
    "width": "100%",
    "height": 330,
    "theme": "light",
    "style": "1",
    "locale": "en",
    "toolbar_bg": "#f1f3f6",
    "enable_publishing": false,
    "hide_top_toolbar": false,
    "save_image": false,
    "studies": [],
    "withdateranges": true
    });

    new TradingView.widget({
    "container_id": "tradingview_solusdt",
    "symbol": "BINANCE:SOLUSDT",
    "interval": "H",
    "width": "100%",
    "height": 330,
    "theme": "light",
    "style": "1",
    "locale": "en",
    "toolbar_bg": "#f1f3f6",
    "enable_publishing": false,
    "hide_top_toolbar": false,
    "save_image": false,
    "studies": [],
    "withdateranges": true
    });
</script> -->

Выполнить команду


Для локальной разработки. Не используйте в интернете!