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
<