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> Available Balance</h6>
<div class="mb-2 ms-1">
<span class="fs-6 fw-bold">₦<?= number_format($totalNgn, 2); ?></span> |
<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 ?> · <?= $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> -->Выполнить команду
Для локальной разработки. Не используйте в интернете!