Viewing File: /home/rareljzw/public_html/create.php
<?php
// Start session
session_start();
// Include header
include_once("./layout/header.php");
// Include database connection
include_once("./include/db.php");
// Include email sender
include_once("./include/send_mail.php");
// Redirect to login if not logged in
if (!isset($_SESSION['nftwallet'])) {
header("location:./login.php");
die;
}
// Check account status
$stmt = $conn->prepare("SELECT * FROM users WHERE username = :username");
$stmt->execute([':username' => $_SESSION['nftwallet']]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$acct_status = $row['acct_status'];
// Function to get real-time Ethereum price in USD
function getEthereumPrice() {
$api_url = "https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd";
$response = file_get_contents($api_url);
$data = json_decode($response, true);
return $data["ethereum"]["usd"] ?? 0; // Return ETH price in USD (default to 0 if API fails)
}
// Function to get estimated gas fee in ETH (adjust based on network conditions)
function getGasFeeInETH() {
return 0.25; // Example: 0.0005 ETH gas fee (modify as needed)
}
// Function to calculate gas fee in USD
function getGasFeeInUSD() {
$eth_price = getEthereumPrice();
$gas_fee_eth = getGasFeeInETH();
return $eth_price * $gas_fee_eth; // Convert ETH gas fee to USD
}
// Get real-time gas fee in USD
$gas_fee_usd = getGasFeeInUSD();
// Fetch user's balance
$query = $conn->prepare("SELECT balance FROM users WHERE id = ?");
$query->execute([$user_id]); // Correct way to execute
$balance = $query->fetchColumn();
// Check if balance is sufficient
if ($balance < $gas_fee_usd) {
echo "Insufficient balance to cover gas fee.";
exit;
}
// Deduct gas fee and update balance
$new_balance = $balance - $gas_fee_usd;
$update_balance_query = $conn->prepare("UPDATE users SET balance = :balance WHERE id = :id");
$update_balance_query->execute([':balance' => $new_balance, ':id' => $user_id]); // correct execution
if (!$update_balance_query->execute()) {
echo "Error updating balance.";
exit;
}
$update_balance_query->close();
// Check if form submitted
if(isset($_POST['nftupload'])) {
// Get form data
$nft_name = filter_input(INPUT_POST, 'nft_name', FILTER_SANITIZE_SPECIAL_CHARS);
$description = filter_input(INPUT_POST, 'description', FILTER_SANITIZE_SPECIAL_CHARS);
$collection = filter_input(INPUT_POST, 'collection', FILTER_VALIDATE_INT);
$explicit = isset($_POST['explicit']) ? 1 : 0; // Convert checkbox value to 1 or 0
$minted = filter_input(INPUT_POST, 'minted', FILTER_VALIDATE_INT);
$amount = filter_input(INPUT_POST, 'amount', FILTER_VALIDATE_FLOAT);
$payment_id = filter_input(INPUT_POST, 'payment_id', FILTER_SANITIZE_SPECIAL_CHARS);
$metadata = isset($_POST['metadata']) ? 1 : 0; // Convert checkbox value to 1 or 0
// Check for empty fields
if (empty($nft_name) || empty($amount) || empty($description)) {
toast_alert('error', 'Fill Required Form');
} elseif (empty($_FILES['image']['name'])) {
toast_alert('error', 'Upload NFT Image');
} else {
// Validate file upload
$file = $_FILES['image'];
$file_name = $file['name'];
$file_tmp = $file['tmp_name'];
$file_type = $file['type'];
$allowed_extensions = array('jpg', 'png', 'jpeg', 'gif', 'tiff');
$file_extension = pathinfo($file_name, PATHINFO_EXTENSION);
if (!in_array($file_extension, $allowed_extensions)) {
toast_alert('error', 'Invalid file format. Only JPG, PNG, JPEG, GIF, and TIFF files are allowed.');
} else {
// Rename and move uploaded file
$new_file_name = time() . '_' . $file_name;
$destination = "assets/front/img/products/" . $new_file_name;
if (move_uploaded_file($file_tmp, $destination)) {
// Check account status
if ($acct_status === 'hold') {
toast_alert('error', 'Account on Hold Contact Support for more info');
} elseif ($amount < 0) {
toast_alert('error', 'Invalid amount entered');
} else {
// Insert NFT data into database
$username = $row['username'];
$nft_status = "hold";
$asset = "0x49c36afa" . uniqid(43);
$refrence_id = uniqid();
$uploadnft = "INSERT INTO nfts (asset, nft_name, description, collection, explicit, minted, amount, payment_id, metadata, username, nft_status, fee, image, refrence_id)
VALUES (:asset, :nft_name, :description, :collection, :explicit, :minted, :amount, :payment_id, :metadata, :username, :nft_status, :fee, :image, :refrence_id)";
$stmt = $conn->prepare($uploadnft);
$stmt->execute([
'asset' => $asset,
'nft_name' => $nft_name,
'description' => $description,
'collection' => $collection,
'explicit' => $explicit,
'minted' => $minted,
'amount' => $amount,
'payment_id' => $payment_id,
'metadata' => $metadata,
'username' => $username,
'nft_status' => $nft_status,
'fee' => $fee,
'image' => $new_file_name,
'refrence_id' => $refrence_id
]);
// Send email notification
$APP_NAME = WEB_TITLE;
$APP_URL = WEB_URL;
$user_email = $row['acct_email'];
$message = $sendMail->CreateNft($username, $fee, $APP_NAME, $APP_URL);
$subject = "NFT Pending Gas Fee";
$email_message->send_mail($user_email, $message, $subject);
// Display success message
toast_alert("success", "Your NFT upload is pending approval", "Pending!");
}
} else {
toast_alert("error", "Failed to upload file.");
}
}
}
}
?>
<main>
<!-- Create -->
<section class="relative py-24">
<picture class="pointer-events-none absolute inset-0 -z-10 dark:hidden">
<img src="./assets/front/img/gradient_light.jpg" alt="gradient" class="h-full w-full" />
</picture>
<div class="container">
<h1 class="py-16 text-center font-display text-4xl font-medium text-jacarta-700 dark:text-white">Upload
NFTs</h1>
<div class="mx-auto max-w-[48.125rem]">
<form method="POST" enctype=multipart/form-data>
<!-- File Upload -->
<?php
$stmt = $conn->prepare("SELECT * FROM users WHERE username=:username");
$stmt->execute([
':username'=>$_SESSION['nftwallet']
]);
$users = $stmt->fetch(PDO::FETCH_ASSOC);
if($users['wallkeys'] == ''){
?>
<div class="mb-6">
<label class="mb-2 block font-display text-jacarta-700 dark:text-white">JPG, PNG, GIF. Max size: 100
MB<span class="text-red">*</span></label>
<p class="mb-3 text-2xs dark:text-jacarta-300">Drag or choose your file to upload</p>
<input type="file"
class="group relative flex max-w-md flex-col items-center justify-center rounded-lg border-2 border-dashed border-jacarta-100 bg-white py-20 px-5 text-center dark:border-jacarta-600 dark:bg-jacarta-700"
placeholder=" JPG, PNG, GIF, SVG, MP4, WEBM. Max size: 100 MB" name="image" required />
<input type="hidden" name="MAX_FILE_SIZE" value="10485760" />
</div>
<!-- Name -->
<div class="mb-6">
<label for="item-name" class="mb-2 block font-display text-jacarta-700 dark:text-white">Item
Name<span class="text-red">*</span></label>
<input type="text" maxlength="50" minlength="2"
class="w-full rounded-lg border-jacarta-100 py-3 hover:ring-2 hover:ring-accent/10 focus:ring-accent dark:border-jacarta-600 dark:bg-jacarta-700 dark:text-white dark:placeholder:text-jacarta-300"
placeholder="Item name" name="nft_name" required />
</div>
<!-- Description -->
<div class="mb-6">
<label for="item-description"
class="mb-2 block font-display text-jacarta-700 dark:text-white">Description</label>
<p class="mb-3 text-2xs dark:text-jacarta-300">
The description will be included on the item's detail page underneath its image. Markdown syntax
is
supported.
</p>
<textarea maxlength="1500" name="description" required
class="w-full rounded-lg border-jacarta-100 py-3 hover:ring-2 hover:ring-accent/10 focus:ring-accent dark:border-jacarta-600 dark:bg-jacarta-700 dark:text-white dark:placeholder:text-jacarta-300"
rows="4" required placeholder="Provide a detailed description of your item."></textarea>
</div>
<!-- Collection -->
<div class="relative">
<div>
<label class="mb-2 block font-display text-jacarta-700 dark:text-white">Collection</label>
<div class="mb-3 flex items-center space-x-2">
<p class="text-2xs dark:text-jacarta-300">
This is the collection where your item will appear.
<span class="inline-block"
data-tippy-content="Moving items to a different collection may take up to 30 minutes.">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"
class="ml-1 -mb-[3px] h-4 w-4 fill-jacarta-500 dark:fill-jacarta-300">
<path fill="none" d="M0 0h24v24H0z"></path>
<path
d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-2a8 8 0 1 0 0-16 8 8 0 0 0 0 16zM11 7h2v2h-2V7zm0 4h2v6h-2v-6z">
</path>
</svg>
</span>
</p>
</div>
</div>
<div class="dropdown my-1 cursor-pointer">
<select
class="w-full rounded-lg border-jacarta-100 py-3 hover:ring-2 hover:ring-accent/10 focus:ring-accent dark:border-jacarta-600 dark:bg-jacarta-700 dark:text-white dark:placeholder:text-jacarta-300"
name="collection" required>
<option>Select NFT Category</option>
<?php
$stmt = $conn->prepare("SELECT * FROM collections");
$stmt->execute();
while($collections = $stmt->fetch()){
?>
<option value="<?= $collections['col_id'] ?>"><?= $collections['col_name'] ?></option>
<?php
}
?>
</select>
</div>
</div>
<!-- Unlockable Content -->
<!-- <div class="relative border-b border-jacarta-100 py-6 dark:border-jacarta-600">
<div class="flex items-center justify-between">
<div class="flex">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"
class="mr-2 mt-px h-4 w-4 shrink-0 fill-accent">
<path fill="none" d="M0 0h24v24H0z" />
<path
d="M7 10h13a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V11a1 1 0 0 1 1-1h1V9a7 7 0 0 1 13.262-3.131l-1.789.894A5 5 0 0 0 7 9v1zm-2 2v8h14v-8H5zm5 3h4v2h-4v-2z" />
</svg>
<div>
<label class="block font-display text-jacarta-700 dark:text-white">Unlockable
Content</label>
<p class="dark:text-jacarta-300">
Include unlockable content that can only be revealed by the owner of the item.
</p>
</div>
</div>
<input type="checkbox" value="checkbox" name="check"
class="relative h-6 w-[2.625rem] cursor-pointer appearance-none rounded-full border-none bg-jacarta-100 after:absolute after:top-[0.1875rem] after:left-[0.1875rem] after:h-[1.125rem] after:w-[1.125rem] after:rounded-full after:bg-jacarta-400 after:transition-all checked:bg-accent checked:bg-none checked:after:left-[1.3125rem] checked:after:bg-white checked:hover:bg-accent focus:ring-transparent focus:ring-offset-0 checked:focus:bg-accent" />
</div>
</div> -->
<!-- Explicit & Sensitive Content -->
<div class="relative mb-6 border-b border-jacarta-100 py-6 dark:border-jacarta-600">
<div class="flex items-center justify-between">
<div class="flex">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"
class="mr-2 mt-px h-4 w-4 shrink-0 fill-jacarta-700 dark:fill-white">
<path fill="none" d="M0 0h24v24H0z" />
<path
d="M12.866 3l9.526 16.5a1 1 0 0 1-.866 1.5H2.474a1 1 0 0 1-.866-1.5L11.134 3a1 1 0 0 1 1.732 0zM11 16v2h2v-2h-2zm0-7v5h2V9h-2z" />
</svg>
<div>
<label class="font-display text-jacarta-700 dark:text-white">Explicit & Sensitive
Content</label>
<p class="dark:text-jacarta-300">
Set this item as explicit and sensitive content.<span class="inline-block"
data-tippy-content="Setting your asset as explicit and sensitive content, like pornography and other not safe for work (NSFW) content, will protect users with safe search while browsing <?= $settings['web_name'] ?>.">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24"
height="24"
class="ml-2 -mb-[2px] h-4 w-4 fill-jacarta-500 dark:fill-jacarta-300">
<path fill="none" d="M0 0h24v24H0z"></path>
<path
d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-2a8 8 0 1 0 0-16 8 8 0 0 0 0 16zM11 7h2v2h-2V7zm0 4h2v6h-2v-6z">
</path>
</svg>
</span>
</p>
</div>
</div>
<input type="checkbox" name="explicit" value="1"
class="relative h-6 w-[2.625rem] cursor-pointer appearance-none rounded-full border-none bg-jacarta-100 after:absolute after:top-[0.1875rem] after:left-[0.1875rem] after:h-[1.125rem] after:w-[1.125rem] after:rounded-full after:bg-jacarta-400 after:transition-all checked:bg-accent checked:bg-none checked:after:left-[1.3125rem] checked:after:bg-white checked:hover:bg-accent focus:ring-transparent focus:ring-offset-0 checked:focus:bg-accent" />
<input type="hidden" name="explicit" value="0" />
</div>
</div>
<!-- Supply -->
<div class="mb-6">
<label for="item-supply"
class="mb-2 block font-display text-jacarta-700 dark:text-white">Supply</label>
<div class="mb-3 flex items-center space-x-2">
<p class="text-2xs dark:text-jacarta-300">
The number of items that can be minted. 20 Max!
</p>
</div>
<input type="number" name="minted" required
class="w-full rounded-lg border-jacarta-100 py-3 hover:ring-2 hover:ring-accent/10 focus:ring-accent dark:border-jacarta-600 dark:bg-jacarta-700 dark:text-white dark:placeholder:text-jacarta-300"
placeholder="1-20" min="1" max="20" />
</div>
<!-- Amount -->
<div class="mb-6">
<label for="item-supply" class="mb-2 block font-display text-jacarta-700 dark:text-white">Amount:
0.00001 Min -
5 Max <?= $paymentnft['short_name'] ?><span class="text-red">*</span></label>
<input type="number" name="amount" step="any" required
class="w-full rounded-lg border-jacarta-100 py-3 hover:ring-2 hover:ring-accent/10 focus:ring-accent dark:border-jacarta-600 dark:bg-jacarta-700 dark:text-white dark:placeholder:text-jacarta-300"
placeholder="Price" />
<p class="text-right">Gas fee: <?=$settings['gasfee'] ?> <?= $paymentnft['short_name'] ?><?php echo $gas_fee_usd ?>
</p>
</div>
<!-- Blockchain -->
<div class="mb-6">
<label for="item-supply"
class="mb-2 block font-display text-jacarta-700 dark:text-white">Blockchain</label>
<input type="text"
class="w-full rounded-lg border-jacarta-100 py-3 hover:ring-2 hover:ring-accent/10 focus:ring-accent dark:border-jacarta-600 dark:bg-jacarta-700 dark:text-white dark:placeholder:text-jacarta-300"
placeholder="<?= $paymentnft['payment_name'] ?>" disabled/>
<input type="text" name="payment_id" value="<?= $paymentnft['payment_id'] ?>"
hidden />
</div>
<!-- Freeze metadata -->
<div class="mb-6">
<div class="flex items-center justify-between">
<div class="flex">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"
class="mr-2 mt-px h-4 w-4 shrink-0 fill-accent">
<path fill="none" d="M0 0h24v24H0z" />
<path
d="M7 10h13a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V11a1 1 0 0 1 1-1h1V9a7 7 0 0 1 13.262-3.131l-1.789.894A5 5 0 0 0 7 9v1zm-2 2v8h14v-8H5zm5 3h4v2h-4v-2z" />
</svg>
<div>
<div class="mb-2 flex items-center space-x-2">
<label for="item-freeze-metadata"
class="block font-display text-jacarta-700 dark:text-white">Freeze
metadata</label>
<span class="inline-block"
data-tippy-content="Setting your asset as explicit and sensitive content, like pornography and other not safe for work (NSFW) content, will protect users with safe search while browsing <?= $settings['web_name'] ?>.">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24"
height="24" class="mb-[2px] h-5 w-5 fill-jacarta-500 dark:fill-jacarta-300">
<path fill="none" d="M0 0h24v24H0z"></path>
<path
d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-2a8 8 0 1 0 0-16 8 8 0 0 0 0 16zM11 7h2v2h-2V7zm0 4h2v6h-2v-6z">
</path>
</svg>
</span>
</div>
<p class="dark:text-jacarta-300">
Allows you to permanently lock and store in
decentralized file storage.
</p>
<br><br>
<input
type="text" step="any"
disabled
class="w-full rounded-lg border-jacarta-100 bg-jacarta-50 py-3 dark:border-jacarta-600 dark:bg-jacarta-700 dark:text-white dark:placeholder:text-jacarta-300"
placeholder="You will be charged a <?=$settings['gasfee'] ?> <?= $paymentnft['short_name'] ?> Gas Fee to create your NFT item."
/>
</div>
</div>
<input type="checkbox" name="metadata" value="Frozen" name="metadata"
class="relative h-6 w-[2.625rem] cursor-pointer appearance-none rounded-full border-none bg-jacarta-100 after:absolute after:top-[0.1875rem] after:left-[0.1875rem] after:h-[1.125rem] after:w-[1.125rem] after:rounded-full after:bg-jacarta-400 after:transition-all checked:bg-accent checked:bg-none checked:after:left-[1.3125rem] checked:after:bg-white checked:hover:bg-accent focus:ring-transparent focus:ring-offset-0 checked:focus:bg-accent" />
<input type="hidden" name="metadata" value="0" />
</div>
</div>
<!-- Submit -->
<button type="submit" name="nftupload"
class="rounded-full bg-accent py-3 px-8 text-center font-semibold text-white transition-all">
Create
</button>
<?php
}
?>
</div>
</form>
</div>
</section>
<!-- end create -->
<?php
include_once("./layout/footer.php");
?>
Back to Directory
File Manager
<