cardanowallet/index.html

523 lines
20 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Cardano Wallet - RanchiMall</title>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"
/>
<link rel="stylesheet" href="./src/style.css" />
</head>
<body>
<!-- Loading Screen -->
<div id="loadingScreen" class="loading-screen">
<div class="loading-content">
<div class="loading-spinner"></div>
<h2>Loading Cardano Wallet...</h2>
</div>
</div>
<!-- Notification Drawer -->
<div id="notificationDrawer" class="notification-drawer"></div>
<header class="header">
<div class="header-content">
<div id="logo" class="app-brand">
<svg id="main_logo" class="icon" viewBox="0 0 27.25 32">
<title>RanchiMall</title>
<path
d="M27.14,30.86c-.74-2.48-3-4.36-8.25-6.94a20,20,0,0,1-4.2-2.49,6,6,0,0,1-1.25-1.67,4,4,0,0,1,0-2.26c.37-1.08.79-1.57,3.89-4.55a11.66,11.66,0,0,0,3.34-4.67,6.54,6.54,0,0,0,.05-2.82C20,3.6,18.58,2,16.16.49c-.89-.56-1.29-.64-1.3-.24a3,3,0,0,1-.3.72l-.3.55L13.42.94C13,.62,12.4.26,12.19.15c-.4-.2-.73-.18-.72.05a9.39,9.39,0,0,1-.61,1.33s-.14,0-.27-.13C8.76.09,8-.27,8,.23A11.73,11.73,0,0,1,6.76,2.6C4.81,5.87,2.83,7.49.77,7.49c-.89,0-.88,0-.61,1,.22.85.33.92,1.09.69A5.29,5.29,0,0,0,3,8.33c.23-.17.45-.29.49-.26a2,2,0,0,1,.22.63A1.31,1.31,0,0,0,4,9.34a5.62,5.62,0,0,0,2.27-.87L7,8l.13.55c.19.74.32.82,1,.65a7.06,7.06,0,0,0,3.46-2.47l.6-.71-.06.64c-.17,1.63-1.3,3.42-3.39,5.42L6.73,14c-3.21,3.06-3,5.59.6,8a46.77,46.77,0,0,0,4.6,2.41c.28.13,1,.52,1.59.87,3.31,2,4.95,3.92,4.95,5.93a2.49,2.49,0,0,0,.07.77h0c.09.09,0,.1.9-.14a2.61,2.61,0,0,0,.83-.32,3.69,3.69,0,0,0-.55-1.83A11.14,11.14,0,0,0,17,26.81a35.7,35.7,0,0,0-5.1-2.91C9.37,22.64,8.38,22,7.52,21.17a3.53,3.53,0,0,1-1.18-2.48c0-1.38.71-2.58,2.5-4.23,2.84-2.6,3.92-3.91,4.67-5.65a3.64,3.64,0,0,0,.42-2A3.37,3.37,0,0,0,13.61,5l-.32-.74.29-.48c.17-.27.37-.63.46-.8l.15-.3.44.64a5.92,5.92,0,0,1,1,2.81,5.86,5.86,0,0,1-.42,1.94c0,.12-.12.3-.15.4a9.49,9.49,0,0,1-.67,1.1,28,28,0,0,1-4,4.29C8.62,15.49,8.05,16.44,8,17.78a3.28,3.28,0,0,0,1.11,2.76c.95,1,2.07,1.74,5.25,3.32,3.64,1.82,5.22,2.9,6.41,4.38A4.78,4.78,0,0,1,21.94,31a3.21,3.21,0,0,0,.14.92,1.06,1.06,0,0,0,.43-.05l.83-.22.46-.12-.06-.46c-.21-1.53-1.62-3.25-3.94-4.8a37.57,37.57,0,0,0-5.22-2.82A13.36,13.36,0,0,1,11,21.19a3.36,3.36,0,0,1-.8-4.19c.41-.85.83-1.31,3.77-4.15,2.39-2.31,3.43-4.13,3.43-6a5.85,5.85,0,0,0-2.08-4.29c-.23-.21-.44-.43-.65-.65A2.5,2.5,0,0,1,15.27.69a10.6,10.6,0,0,1,2.91,2.78A4.16,4.16,0,0,1,19,6.16a4.91,4.91,0,0,1-.87,3c-.71,1.22-1.26,1.82-4.27,4.67a9.47,9.47,0,0,0-2.07,2.6,2.76,2.76,0,0,0-.33,1.54,2.76,2.76,0,0,0,.29,1.47c.57,1.21,2.23,2.55,4.65,3.73a32.41,32.41,0,0,1,5.82,3.24c2.16,1.6,3.2,3.16,3.2,4.8a1.94,1.94,0,0,0,.09.76,4.54,4.54,0,0,0,1.66-.4C27.29,31.42,27.29,31.37,27.14,30.86ZM6.1,7h0a3.77,3.77,0,0,1-1.46.45L4,7.51l.68-.83a25.09,25.09,0,0,0,3-4.82A12,12,0,0,1,8.28.76c.11-.12.77.32,1.53,1l.63.58-.57.84A10.34,10.34,0,0,1,6.1,7Zm5.71-1.78A9.77,9.77,0,0,1,9.24,7.18h0a5.25,5.25,0,0,1-1.17.28l-.58,0,.65-.78a21.29,21.29,0,0,0,2.1-3.12c.22-.41.42-.76.44-.79s.5.43.9,1.24L12,5ZM13.41,3a2.84,2.84,0,0,1-.45.64,11,11,0,0,1-.9-.91l-.84-.9.19-.45c.34-.79.39-.8,1-.31A9.4,9.4,0,0,1,13.80,2.33q-.18.34-.39.69Z"
/>
</svg>
<div class="app-name">
<div class="app-name__company">RanchiMall</div>
<h4 class="app-name__title">Cardano Wallet</h4>
</div>
</div>
<div class="header-actions">
<button class="theme-toggle" id="themeToggle" title="Toggle theme">
<i class="fas fa-moon" id="themeIcon"></i>
</button>
</div>
</div>
</header>
<div id="sidebarOverlay" class="sidebar-overlay"></div>
<aside id="sidebar" class="sidebar">
<ul class="sidebar-menu">
<li>
<a href="#" class="nav-link active" data-page="generate">
<i class="fas fa-plus-circle"></i>
<span>Generate</span>
</a>
</li>
<li>
<a href="#" class="nav-link" data-page="send">
<i class="fas fa-paper-plane"></i>
<span>Send</span>
</a>
</li>
<li>
<a href="#" class="nav-link" data-page="transactions">
<i class="fas fa-history"></i>
<span>Transactions</span>
</a>
</li>
<li>
<a href="#" class="nav-link" data-page="recover">
<i class="fas fa-key"></i>
<span>Recover</span>
</a>
</li>
</ul>
</aside>
<div class="container">
<main class="main-content">
<!-- Generate Page -->
<div id="generatePage" class="page">
<div class="page-header">
<h2>
<i class="fas fa-wallet"></i> Generate Multi-Blockchain Addresses
</h2>
<p>
Generate addresses for ADA, FLO, BTC from a single private key
</p>
</div>
<div class="generate-wallet-intro">
<div class="intro-icon">
<i class="fas fa-wallet"></i>
</div>
<div class="intro-content">
<h3>One Key, Multiple Blockchains</h3>
<p>
Generate a single private key that works across ADA, FLO, BTC networks. This creates a unified experience across multiple blockchains.
</p>
</div>
</div>
<div class="card generate-actions">
<button
id="generateBtn"
class="btn btn-primary btn-block"
>
<i class="fas fa-wallet"></i>
Generate
</button>
</div>
<div id="walletOutput" class="output"></div>
<div class="wallet-security-notice">
<div class="notice-icon">
<i class="fas fa-shield-alt"></i>
</div>
<div class="notice-content">
<h4>Security Notice</h4>
<p>
Your private keys are generated locally and never leave your
device. Make sure to backup your keys securely before using.
</p>
</div>
</div>
</div>
<!-- Send ADA Page -->
<div id="sendPage" class="page hidden">
<div class="page-header">
<h2><i class="fas fa-paper-plane"></i> Send ADA</h2>
<p>Send ADA to another Cardano address</p>
</div>
<div class="card">
<form id="sendForm">
<div class="form-group">
<label for="sendPrivateKey">
<i class="fas fa-key"></i> Private Key
</label>
<div class="input-with-actions">
<input
type="password"
id="sendPrivateKey"
class="form-input"
placeholder="Enter ADA/FLO/BTC private key"
required
/>
<button
type="button"
class="input-action-btn password-toggle"
onclick="togglePasswordVisibility('sendPrivateKey')"
title="Show/Hide Password"
>
<i class="fas fa-eye"></i>
</button>
<button
type="button"
class="input-action-btn clear-btn"
onclick="clearInput('sendPrivateKey')"
title="Clear"
>
<i class="fas fa-times"></i>
</button>
</div>
</div>
<div
id="balanceDisplay"
class="balance-info card"
style="display: none; margin-bottom: 1.5rem"
>
<div class="balance-header">
<h3><i class="fas fa-wallet"></i> Sender Balance</h3>
</div>
<div class="balance-display">
<div class="balance-amount" id="availableBalance">
0 <span class="currency">ADA</span>
</div>
</div>
<div
class="address-display"
style="display: block; margin-top: 0.5rem"
>
<span class="address-label">Address:</span>
<span class="address-value" id="senderAddress">-</span>
</div>
</div>
<div class="form-group">
<label for="recipientAddress">
<i class="fas fa-user"></i> To Address
</label>
<div class="input-with-actions">
<input
type="text"
id="recipientAddress"
class="form-input"
placeholder="Enter recipient address (addr1...)"
required
/>
<button
type="button"
class="input-action-btn clear-btn"
onclick="clearInput('recipientAddress')"
title="Clear"
>
<i class="fas fa-times"></i>
</button>
</div>
</div>
<div class="form-group">
<label for="sendAmount">
<i class="fas fa-coins"></i> Amount (ADA)
</label>
<div class="input-with-actions">
<input
type="number"
id="sendAmount"
class="form-input"
placeholder="Enter the amount to send"
min="0.000001"
step="0.000001"
required
/>
<button
type="button"
class="input-action-btn clear-btn"
onclick="clearInput('sendAmount')"
title="Clear"
>
<i class="fas fa-times"></i>
</button>
</div>
</div>
<button type="submit" id="sendBtn" class="btn btn-primary btn-block">
<i class="fas fa-paper-plane"></i>
Send Transaction
</button>
</form>
</div>
<div id="sendOutput" class="output"></div>
</div>
<!-- Transactions Page -->
<div id="transactionsPage" class="page hidden">
<div class="page-header">
<h2><i class="fas fa-exchange-alt"></i> Cardano Transactions</h2>
<p>Check balance and transaction history for any Cardano address</p>
</div>
<div class="card">
<!-- Search Type Selector -->
<div class="search-type-selector">
<div class="search-type-label">Search Type</div>
<div class="search-type-options">
<label class="radio-button-container active" id="addressSearchType">
<input type="radio" name="searchType" value="address" checked />
<div class="radio-icon"><i class="fas fa-wallet"></i></div>
<span>Cardano Address</span>
</label>
<label class="radio-button-container" id="hashSearchType">
<input type="radio" name="searchType" value="hash" />
<div class="radio-icon"><i class="fas fa-fingerprint"></i></div>
<span>Transaction Hash</span>
</label>
</div>
</div>
<div class="form-group">
<label for="searchInput">ADA Address or ADA/FLO/BTC Private Key</label>
<div class="input-with-actions">
<input
type="text"
id="searchInput"
class="form-input"
placeholder="Enter ADA address or ADA/FLO/BTC private key"
/>
<button
type="button"
class="input-action-btn clear-btn"
onclick="clearInput('searchInput')"
title="Clear"
>
<i class="fas fa-times"></i>
</button>
</div>
<div class="form-text">
Enter ADA address or ADA/FLO/BTC private key to view transactions
</div>
</div>
<button
class="btn btn-primary btn-block"
onclick="searchTransactions()"
id="searchBtn"
>
<i class="fas fa-search"></i>
Search
</button>
</div>
<div
id="transactionBalance"
class="balance-info card"
style="display: none"
>
<div class="balance-header">
<h3><i class="fas fa-wallet"></i> Balance</h3>
</div>
<div class="balance-display">
<div class="balance-amount" id="adaBalance">
0 <span class="currency">ADA</span>
</div>
</div>
<div
class="address-display"
id="transactionAddressDisplay"
style="display: none"
>
<span class="address-label">Address:</span>
<span class="address-value" id="displayedAddress"></span>
</div>
</div>
<div
id="transactionFilterSection"
class="transaction-section"
style="display: none"
>
<div class="transaction-header">
<h3><i class="fas fa-history"></i> Transactions</h3>
<div class="filter-buttons">
<button class="filter-btn active" data-filter="all">All</button>
<button class="filter-btn" data-filter="received">Received</button>
<button class="filter-btn" data-filter="sent">Sent</button>
</div>
</div>
</div>
<div id="transactionList" class="transaction-list"></div>
<div
id="paginationSection"
class="pagination-section"
style="display: none"
>
<div class="pagination-info">
<span id="paginationInfo">Showing 1-10 of 0 transactions</span>
</div>
<div class="pagination-controls">
<button
class="pagination-btn"
id="prevPageBtn"
disabled
>
<i class="fas fa-chevron-left"></i>
<span class="btn-text">Prev</span>
</button>
<div class="page-numbers" id="pageNumbers"></div>
<button class="pagination-btn" id="nextPageBtn">
<span class="btn-text">Next</span>
<i class="fas fa-chevron-right"></i>
</button>
</div>
</div>
<!-- Searched Addresses History -->
<div id="searchedAddressesSection" class="card" style="margin-top: 1.5rem; display: none;">
<div class="search-history-header">
<h3><i class="fas fa-sync-alt"></i> Recent Addresses</h3>
<button class="btn btn-secondary btn-sm" onclick="clearSearchHistory()" title="Clear all history">
<i class="fas fa-trash-alt"></i> Clear All
</button>
</div>
<div id="searchedAddressesList" class="searched-addresses-list"></div>
</div>
</div>
<!-- Recover Page -->
<div id="recoverPage" class="page hidden">
<div class="page-header">
<h2>
<i class="fas fa-sync-alt"></i> Recover Multi-Blockchain Addresses
</h2>
<p>
Recover all blockchain addresses (ADA, FLO, BTC) from a single private key
</p>
</div>
<div class="card">
<div class="form-group">
<label for="recoverPrivateKey"
><i class="fas fa-key"></i> Private Key (ADA/FLO/BTC)</label
>
<div class="input-with-actions">
<input
type="password"
id="recoverPrivateKey"
class="form-input"
placeholder="Enter ADA/FLO/BTC private key"
/>
<button
type="button"
class="input-action-btn password-toggle"
onclick="togglePasswordVisibility('recoverPrivateKey')"
title="Show/Hide Password"
>
<i class="fas fa-eye"></i>
</button>
<button
type="button"
class="input-action-btn clear-btn"
onclick="clearInput('recoverPrivateKey')"
title="Clear"
>
<i class="fas fa-times"></i>
</button>
</div>
<div class="form-text">
Only private keys accepted
</div>
</div>
<button id="recoverBtn" class="btn btn-primary btn-block">
<i class="fas fa-sync-alt"></i>
Recover
</button>
<div id="recoverOutput" class="output"></div>
</div>
<div class="wallet-security-notice">
<div class="notice-icon">
<i class="fas fa-shield-alt"></i>
</div>
<div class="notice-content">
<h4>Privacy Notice</h4>
<p>
Your private key is processed locally and never transmitted to
any server. All recovery operations happen in your browser.
</p>
</div>
</div>
</div>
</main>
</div>
<!-- Bottom Navigation (Mobile) -->
<nav class="nav-box">
<button class="nav-btn active" data-page="generate">
<i class="fas fa-plus-circle"></i>
<span>Generate</span>
</button>
<button class="nav-btn" data-page="send">
<i class="fas fa-paper-plane"></i>
<span>Send</span>
</button>
<button class="nav-btn" data-page="transactions">
<i class="fas fa-history"></i>
<span>Transactions</span>
</button>
<button class="nav-btn" data-page="recover">
<i class="fas fa-key"></i>
<span>Recover</span>
</button>
</nav>
<!-- Transaction Confirmation Modal -->
<div id="confirmModal" class="modal">
<div class="modal-content">
<div class="modal-header">
<h3><i class="fas fa-shield-alt"></i> Confirm Transaction</h3>
<span class="modal-close" id="closeModal">&times;</span>
</div>
<div class="modal-body">
<div class="confirm-details">
<div class="detail-group">
<label><i class="fas fa-coins"></i> Amount</label>
<div class="confirm-value" id="confirmAmount">0 ADA</div>
</div>
<div class="detail-group">
<label><i class="fas fa-gas-pump"></i> Network Fee</label>
<div class="confirm-value" id="confirmFee">0 ADA</div>
</div>
<div class="detail-group">
<label><i class="fas fa-arrow-right"></i> Total Cost</label>
<div class="confirm-value" id="confirmTotal">0 ADA</div>
</div>
<div class="detail-group">
<label><i class="fas fa-user"></i> Recipient</label>
<div class="confirm-value address-value" id="confirmRecipient">addr1...</div>
</div>
<div class="detail-group warning">
<i class="fas fa-exclamation-triangle"></i>
<span>Transactions are irreversible. Please verify the recipient address carefully.</span>
</div>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-secondary" id="cancelTxBtn">Cancel</button>
<button class="btn btn-primary" id="confirmTxBtn">
<i class="fas fa-check"></i> Confirm & Send
</button>
</div>
</div>
</div>
<script src="./public/lib.cardano.js"></script>
<script type="module" src="./src/lib/cardanoCrypto.js"></script>
<script type="module" src="./src/lib/cardanoBlockchainAPI.js"></script>
<script type="module" src="./src/main.js"></script>
</body>
</html>