So the name is Iko Ikang (Words of the Flame/Fire), add more advanced African styling and concepts, it must be engaing more than any chatbot ever developed, it must captivattes African youths and make them talk to it infifnitely.. the AI that will be manning it is acleed MoStar AI - Follow Up Deployment
Browse files- index.html +314 -754
index.html
CHANGED
@@ -3,809 +3,369 @@
|
|
3 |
<head>
|
4 |
<meta charset="UTF-8">
|
5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6 |
-
<title>
|
7 |
<script src="https://cdn.tailwindcss.com"></script>
|
8 |
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
9 |
<style>
|
10 |
-
.
|
11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
}
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
}
|
17 |
-
|
18 |
-
|
|
|
19 |
}
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
background-position: center;
|
24 |
-
background-size: contain;
|
25 |
}
|
26 |
-
|
|
|
27 |
0%, 100% {
|
28 |
-
|
29 |
}
|
30 |
50% {
|
31 |
-
|
32 |
}
|
33 |
}
|
34 |
-
|
35 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
}
|
37 |
</style>
|
38 |
</head>
|
39 |
-
<body class="bg-gray-100
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
<div class="flex items-center space-x-4">
|
49 |
-
<button id="connectWallet" class="px-3 py-1 bg-white text-orange-600 rounded-full text-sm font-medium hover:bg-opacity-100 transition-all">
|
50 |
-
<i class="fas fa-wallet mr-1"></i> Connect Wallet
|
51 |
-
</button>
|
52 |
-
<div class="relative group">
|
53 |
-
<span class="px-3 py-1 bg-white bg-opacity-20 rounded-full text-sm font-medium flex items-center">
|
54 |
-
<span class="w-2 h-2 rounded-full bg-green-400 mr-2 animate-pulse"></span>
|
55 |
-
Testnet LIVE
|
56 |
-
</span>
|
57 |
-
<div class="absolute hidden group-hover:block bg-gray-800 text-xs p-2 rounded shadow-lg z-10 w-48">
|
58 |
-
ChainID: 9818 (FlameBorn Testnet)<br>
|
59 |
-
RPC: https://rpc.flameborn.io<br>
|
60 |
-
Faucet: /faucet
|
61 |
-
</div>
|
62 |
-
</div>
|
63 |
-
<a href="#deploy" class="px-3 py-1 bg-white text-orange-600 rounded-full text-sm font-medium hover:bg-opacity-100 transition-all">
|
64 |
-
<i class="fas fa-rocket mr-1"></i> Quick Deploy
|
65 |
-
</a>
|
66 |
-
<a href="https://github.com/flameborn/testnet" target="_blank" class="px-3 py-1 bg-white bg-opacity-20 hover:bg-opacity-30 rounded-full text-sm font-medium transition-all">
|
67 |
-
<i class="fab fa-github mr-1"></i> GitHub
|
68 |
-
</a>
|
69 |
-
</div>
|
70 |
-
</div>
|
71 |
-
</div>
|
72 |
-
</header>
|
73 |
-
|
74 |
-
<!-- Main Content -->
|
75 |
-
<main class="container mx-auto px-4 py-8">
|
76 |
-
<!-- Network Status Section -->
|
77 |
-
<section class="mb-6 bg-white rounded-xl shadow-md p-6">
|
78 |
-
<h2 class="text-2xl font-bold text-gray-800 mb-4 flex items-center">
|
79 |
-
<i class="fas fa-network-wired mr-2 text-blue-500"></i> Network Status
|
80 |
-
</h2>
|
81 |
-
<div class="grid grid-cols-1 md:grid-cols-4 gap-4">
|
82 |
-
<div class="bg-gray-50 p-4 rounded-lg">
|
83 |
-
<p class="text-gray-500 text-sm">Current Block</p>
|
84 |
-
<p class="font-bold text-gray-800" id="currentBlock">Loading...</p>
|
85 |
-
</div>
|
86 |
-
<div class="bg-gray-50 p-4 rounded-lg">
|
87 |
-
<p class="text-gray-500 text-sm">Gas Price</p>
|
88 |
-
<p class="font-bold text-gray-800" id="gasPrice">Loading...</p>
|
89 |
-
</div>
|
90 |
-
<div class="bg-gray-50 p-4 rounded-lg">
|
91 |
-
<p class="text-gray-500 text-sm">Chain ID</p>
|
92 |
-
<p class="font-bold text-gray-800">9818</p>
|
93 |
-
</div>
|
94 |
-
<div class="bg-gray-50 p-4 rounded-lg">
|
95 |
-
<p class="text-gray-500 text-sm">Node Status</p>
|
96 |
-
<p class="font-bold text-gray-800 flex items-center">
|
97 |
-
<span class="w-2 h-2 rounded-full bg-green-500 mr-2 animate-pulse"></span>
|
98 |
-
Synced
|
99 |
-
</p>
|
100 |
-
</div>
|
101 |
</div>
|
102 |
-
</
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
<p class="text-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
<p class="font-bold text-gray-800">FLB</p>
|
117 |
-
</div>
|
118 |
-
<div class="bg-gray-50 p-4 rounded-lg">
|
119 |
-
<p class="text-gray-500 text-sm">Decimals</p>
|
120 |
-
<p class="font-bold text-gray-800">18</p>
|
121 |
-
</div>
|
122 |
-
<div class="bg-gray-50 p-4 rounded-lg">
|
123 |
-
<p class="text-gray-500 text-sm">Total Supply</p>
|
124 |
-
<p class="font-bold text-gray-800">1,000,000 FLB</p>
|
125 |
-
</div>
|
126 |
-
</div>
|
127 |
-
<div class="flex flex-col md:flex-row justify-between items-center bg-gradient-to-r from-orange-50 to-red-50 p-4 rounded-lg">
|
128 |
-
<div class="mb-4 md:mb-0">
|
129 |
-
<h3 class="font-semibold text-gray-800">Testnet Deployment Status</h3>
|
130 |
-
<p class="text-sm text-gray-600">Verify contract deployment across multiple networks</p>
|
131 |
-
</div>
|
132 |
-
<div class="flex space-x-2">
|
133 |
-
<button class="px-4 py-2 bg-orange-500 hover:bg-orange-600 text-white rounded-lg flex items-center">
|
134 |
-
<i class="fas fa-bolt mr-2"></i> Deploy
|
135 |
</button>
|
136 |
-
<button class="
|
137 |
-
<i class="fas fa-
|
138 |
</button>
|
139 |
</div>
|
140 |
</div>
|
141 |
-
</section>
|
142 |
-
|
143 |
-
<!-- Test Sections -->
|
144 |
-
<section class="mb-12">
|
145 |
-
<h2 class="text-2xl font-bold text-gray-800 mb-6 flex items-center">
|
146 |
-
<i class="fas fa-vial mr-2 text-blue-500"></i> Test Suite
|
147 |
-
</h2>
|
148 |
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
<span class="text-sm font-medium text-gray-700">Test Progress</span>
|
153 |
-
<span class="text-sm font-medium text-gray-700" id="progressPercentage">0%</span>
|
154 |
-
</div>
|
155 |
-
<div class="w-full bg-gray-200 rounded-full h-2.5">
|
156 |
-
<div class="progress-bar h-2.5 rounded-full bg-green-500" style="width: 0%"></div>
|
157 |
</div>
|
|
|
158 |
</div>
|
159 |
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
<p class="text-sm text-gray-600">Run tests across multiple EVM chains</p>
|
165 |
-
</div>
|
166 |
-
<div class="flex flex-wrap gap-2">
|
167 |
-
<button class="px-3 py-1 bg-orange-500 text-white rounded-full text-sm flex items-center">
|
168 |
-
<i class="fas fa-fire mr-1"></i> FlameBorn
|
169 |
</button>
|
170 |
-
<
|
171 |
-
<
|
172 |
-
|
173 |
-
|
174 |
-
<img src="https://cryptologos.cc/logos/polygon-matic-logo.png" class="w-4 h-4 mr-1"> Mumbai
|
175 |
-
</button>
|
176 |
-
<button class="px-3 py-1 bg-purple-100 text-purple-600 rounded-full text-sm flex items-center">
|
177 |
-
<img src="https://cryptologos.cc/logos/bnb-bnb-logo.png" class="w-4 h-4 mr-1"> BSC Testnet
|
178 |
-
</button>
|
179 |
-
</div>
|
180 |
-
</div>
|
181 |
-
|
182 |
-
<!-- Test Cards -->
|
183 |
-
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
184 |
-
<!-- Contract Metadata -->
|
185 |
-
<div class="test-card bg-white rounded-xl shadow-md p-6 transition-all duration-300">
|
186 |
-
<div class="flex items-center mb-4">
|
187 |
-
<div class="w-10 h-10 rounded-full bg-blue-100 flex items-center justify-center mr-3">
|
188 |
-
<i class="fas fa-file-contract text-blue-500"></i>
|
189 |
-
</div>
|
190 |
-
<h3 class="font-bold text-gray-800">I. Contract Metadata</h3>
|
191 |
-
</div>
|
192 |
-
<ul class="space-y-3 text-sm text-gray-600">
|
193 |
-
<li class="flex items-center">
|
194 |
-
<i class="fas fa-check-circle text-green-500 mr-2"></i>
|
195 |
-
<span>Name/Symbol/Decimals</span>
|
196 |
-
</li>
|
197 |
-
<li class="flex items-center">
|
198 |
-
<i class="fas fa-check-circle text-green-500 mr-2"></i>
|
199 |
-
<span>Total Supply</span>
|
200 |
-
</li>
|
201 |
-
<li class="flex items-center">
|
202 |
-
<i class="fas fa-check-circle text-green-500 mr-2"></i>
|
203 |
-
<span>Admin Roles</span>
|
204 |
-
</li>
|
205 |
-
<li class="flex items-center">
|
206 |
-
<i class="fas fa-check-circle text-green-500 mr-2"></i>
|
207 |
-
<span>African Identity Init</span>
|
208 |
-
</li>
|
209 |
-
</ul>
|
210 |
-
<button class="mt-4 w-full py-2 bg-blue-50 hover:bg-blue-100 text-blue-600 rounded-lg text-sm font-medium flex items-center justify-center">
|
211 |
-
<i class="fas fa-play mr-2"></i> Run Tests
|
212 |
-
</button>
|
213 |
-
</div>
|
214 |
-
|
215 |
-
<!-- ERC20 Functionality -->
|
216 |
-
<div class="test-card bg-white rounded-xl shadow-md p-6 transition-all duration-300">
|
217 |
-
<div class="flex items-center mb-4">
|
218 |
-
<div class="w-10 h-10 rounded-full bg-purple-100 flex items-center justify-center mr-3">
|
219 |
-
<i class="fas fa-exchange-alt text-purple-500"></i>
|
220 |
-
</div>
|
221 |
-
<h3 class="font-bold text-gray-800">II. ERC20 Functionality</h3>
|
222 |
-
</div>
|
223 |
-
<ul class="space-y-3 text-sm text-gray-600">
|
224 |
-
<li class="flex items-center">
|
225 |
-
<i class="fas fa-spinner animate-spin text-yellow-500 mr-2"></i>
|
226 |
-
<span>Transfer Basic</span>
|
227 |
-
</li>
|
228 |
-
<li class="flex items-center">
|
229 |
-
<i class="far fa-circle text-gray-300 mr-2"></i>
|
230 |
-
<span>Transfer All</span>
|
231 |
-
</li>
|
232 |
-
<li class="flex items-center">
|
233 |
-
<i class="far fa-circle text-gray-300 mr-2"></i>
|
234 |
-
<span>Over-Transfer</span>
|
235 |
-
</li>
|
236 |
-
<li class="flex items-center">
|
237 |
-
<i class="far fa-circle text-gray-300 mr-2"></i>
|
238 |
-
<span>Approve/Allowance</span>
|
239 |
-
</li>
|
240 |
-
</ul>
|
241 |
-
<button class="mt-4 w-full py-2 bg-purple-50 hover:bg-purple-100 text-purple-600 rounded-lg text-sm font-medium flex items-center justify-center">
|
242 |
-
<i class="fas fa-play mr-2"></i> Run Tests
|
243 |
-
</button>
|
244 |
-
</div>
|
245 |
-
|
246 |
-
<!-- Roles & Permissions -->
|
247 |
-
<div class="test-card bg-white rounded-xl shadow-md p-6 transition-all duration-300">
|
248 |
-
<div class="flex items-center mb-4">
|
249 |
-
<div class="w-10 h-10 rounded-full bg-red-100 flex items-center justify-center mr-3">
|
250 |
-
<i class="fas fa-user-shield text-red-500"></i>
|
251 |
-
</div>
|
252 |
-
<h3 class="font-bold text-gray-800">III. Roles & Permissions</h3>
|
253 |
-
</div>
|
254 |
-
<ul class="space-y-3 text-sm text-gray-600">
|
255 |
-
<li class="flex items-center">
|
256 |
-
<i class="far fa-circle text-gray-300 mr-2"></i>
|
257 |
-
<span>Role Assign/Revoke</span>
|
258 |
-
</li>
|
259 |
-
<li class="flex items-center">
|
260 |
-
<i class="far fa-circle text-gray-300 mr-2"></i>
|
261 |
-
<span>Unauthorized Grant</span>
|
262 |
-
</li>
|
263 |
-
<li class="flex items-center">
|
264 |
-
<i class="far fa-circle text-gray-300 mr-2"></i>
|
265 |
-
<span>Role-Protected Functions</span>
|
266 |
-
</li>
|
267 |
-
<li class="flex items-center">
|
268 |
-
<i class="far fa-circle text-gray-300 mr-2"></i>
|
269 |
-
<span>Event Logs</span>
|
270 |
-
</li>
|
271 |
-
</ul>
|
272 |
-
<button class="mt-4 w-full py-2 bg-red-50 hover:bg-red-100 text-red-600 rounded-lg text-sm font-medium flex items-center justify-center">
|
273 |
-
<i class="fas fa-play mr-2"></i> Run Tests
|
274 |
-
</button>
|
275 |
-
</div>
|
276 |
-
|
277 |
-
<!-- African Identity -->
|
278 |
-
<div class="test-card bg-white rounded-xl shadow-md p-6 transition-all duration-300">
|
279 |
-
<div class="flex items-center mb-4">
|
280 |
-
<div class="w-10 h-10 rounded-full bg-green-100 flex items-center justify-center mr-3">
|
281 |
-
<i class="fas fa-passport text-green-500"></i>
|
282 |
-
</div>
|
283 |
-
<h3 class="font-bold text-gray-800">IV. African Identity</h3>
|
284 |
-
</div>
|
285 |
-
<ul class="space-y-3 text-sm text-gray-600">
|
286 |
-
<li class="flex items-center">
|
287 |
-
<i class="far fa-circle text-gray-300 mr-2"></i>
|
288 |
-
<span>Identity Registration</span>
|
289 |
-
</li>
|
290 |
-
<li class="flex items-center">
|
291 |
-
<i class="far fa-circle text-gray-300 mr-2"></i>
|
292 |
-
<span>Re-Registration Prevention</span>
|
293 |
-
</li>
|
294 |
-
<li class="flex items-center">
|
295 |
-
<i class="far fa-circle text-gray-300 mr-2"></i>
|
296 |
-
<span>Admin Verification</span>
|
297 |
-
</li>
|
298 |
-
<li class="flex items-center">
|
299 |
-
<i class="far fa-circle text-gray-300 mr-2"></i>
|
300 |
-
<span>Edge-Case Countries</span>
|
301 |
-
</li>
|
302 |
-
</ul>
|
303 |
-
<button class="mt-4 w-full py-2 bg-green-50 hover:bg-green-100 text-green-600 rounded-lg text-sm font-medium flex items-center justify-center">
|
304 |
-
<i class="fas fa-play mr-2"></i> Run Tests
|
305 |
-
</button>
|
306 |
-
</div>
|
307 |
-
|
308 |
-
<!-- Security & Abuse -->
|
309 |
-
<div class="test-card bg-white rounded-xl shadow-md p-6 transition-all duration-300">
|
310 |
-
<div class="flex items-center mb-4">
|
311 |
-
<div class="w-10 h-10 rounded-full bg-yellow-100 flex items-center justify-center mr-3">
|
312 |
-
<i class="fas fa-shield-alt text-yellow-500"></i>
|
313 |
-
</div>
|
314 |
-
<h3 class="font-bold text-gray-800">V. Security & Abuse</h3>
|
315 |
-
</div>
|
316 |
-
<ul class="space-y-3 text-sm text-gray-600">
|
317 |
-
<li class="flex items-center">
|
318 |
-
<i class="far fa-circle text-gray-300 mr-2"></i>
|
319 |
-
<span>Reentrancy Protection</span>
|
320 |
-
</li>
|
321 |
-
<li class="flex items-center">
|
322 |
-
<i class="far fa-circle text-gray-300 mr-2"></i>
|
323 |
-
<span>Blacklist/Pause</span>
|
324 |
-
</li>
|
325 |
-
<li class="flex items-center">
|
326 |
-
<i class="far fa-circle text-gray-300 mr-2"></i>
|
327 |
-
<span>Large Transfer Handling</span>
|
328 |
-
</li>
|
329 |
-
<li class="flex items-center">
|
330 |
-
<i class="far fa-circle text-gray-300 mr-2"></i>
|
331 |
-
<span>Gas Limit Stress</span>
|
332 |
-
</li>
|
333 |
-
</ul>
|
334 |
-
<button class="mt-4 w-full py-2 bg-yellow-50 hover:bg-yellow-100 text-yellow-600 rounded-lg text-sm font-medium flex items-center justify-center">
|
335 |
-
<i class="fas fa-play mr-2"></i> Run Tests
|
336 |
-
</button>
|
337 |
-
</div>
|
338 |
-
|
339 |
-
<!-- Multichain & UX -->
|
340 |
-
<div class="test-card bg-white rounded-xl shadow-md p-6 transition-all duration-300">
|
341 |
-
<div class="flex items-center mb-4">
|
342 |
-
<div class="w-10 h-10 rounded-full bg-indigo-100 flex items-center justify-center mr-3">
|
343 |
-
<i class="fas fa-mobile-alt text-indigo-500"></i>
|
344 |
-
</div>
|
345 |
-
<h3 class="font-bold text-gray-800">VII. Multichain & UX</h3>
|
346 |
-
</div>
|
347 |
-
<ul class="space-y-3 text-sm text-gray-600">
|
348 |
-
<li class="flex items-center">
|
349 |
-
<i class="far fa-circle text-gray-300 mr-2"></i>
|
350 |
-
<span>Explorer Verification</span>
|
351 |
-
</li>
|
352 |
-
<li class="flex items-center">
|
353 |
-
<i class="far fa-circle text-gray-300 mr-2"></i>
|
354 |
-
<span>Wallet Display</span>
|
355 |
-
</li>
|
356 |
-
<li class="flex items-center">
|
357 |
-
<i class="far fa-circle text-gray-300 mr-2"></i>
|
358 |
-
<span>Explorer Events</span>
|
359 |
-
</li>
|
360 |
-
<li class="flex items-center">
|
361 |
-
<i class="far fa-circle text-gray-300 mr-2"></i>
|
362 |
-
<span>Wallet Integration</span>
|
363 |
-
</li>
|
364 |
-
</ul>
|
365 |
-
<button class="mt-4 w-full py-2 bg-indigo-50 hover:bg-indigo-100 text-indigo-600 rounded-lg text-sm font-medium flex items-center justify-center">
|
366 |
-
<i class="fas fa-play mr-2"></i> Run Tests
|
367 |
-
</button>
|
368 |
-
</div>
|
369 |
-
</div>
|
370 |
-
</section>
|
371 |
-
|
372 |
-
<!-- Contract Verification -->
|
373 |
-
<section class="mb-12 bg-white rounded-xl shadow-md p-6">
|
374 |
-
<h2 class="text-2xl font-bold text-gray-800 mb-6 flex items-center">
|
375 |
-
<i class="fas fa-check-circle mr-2 text-green-500"></i> Contract Verification
|
376 |
-
</h2>
|
377 |
-
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
378 |
-
<div class="bg-gray-50 p-6 rounded-lg">
|
379 |
-
<h3 class="font-semibold text-gray-700 mb-4">Verify Contract</h3>
|
380 |
-
<div class="space-y-4">
|
381 |
-
<div>
|
382 |
-
<label class="block text-sm font-medium text-gray-700 mb-1">Contract Address</label>
|
383 |
-
<input type="text" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-orange-500">
|
384 |
-
</div>
|
385 |
-
<div>
|
386 |
-
<label class="block text-sm font-medium text-gray-700 mb-1">Compiler Version</label>
|
387 |
-
<select class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-orange-500">
|
388 |
-
<option>0.8.19</option>
|
389 |
-
<option>0.8.20</option>
|
390 |
-
<option>0.8.21</option>
|
391 |
-
</select>
|
392 |
-
</div>
|
393 |
-
<button class="w-full py-2 bg-orange-500 hover:bg-orange-600 text-white rounded-md font-medium">
|
394 |
-
Verify & Publish
|
395 |
</button>
|
396 |
</div>
|
397 |
</div>
|
398 |
-
<div class="bg-gray-50 p-6 rounded-lg">
|
399 |
-
<h3 class="font-semibold text-gray-700 mb-4">Verified Contracts</h3>
|
400 |
-
<div class="overflow-x-auto">
|
401 |
-
<table class="min-w-full divide-y divide-gray-200">
|
402 |
-
<thead>
|
403 |
-
<tr>
|
404 |
-
<th class="px-4 py-2 text-left text-xs font-medium text-gray-500">Address</th>
|
405 |
-
<th class="px-4 py-2 text-left text-xs font-medium text-gray-500">Date</th>
|
406 |
-
</tr>
|
407 |
-
</thead>
|
408 |
-
<tbody class="divide-y divide-gray-200">
|
409 |
-
<tr>
|
410 |
-
<td class="px-4 py-2 text-sm text-gray-500">0x8f7a...3e4b</td>
|
411 |
-
<td class="px-4 py-2 text-sm text-gray-500">2023-11-15</td>
|
412 |
-
</tr>
|
413 |
-
<tr>
|
414 |
-
<td class="px-4 py-2 text-sm text-gray-500">0x5b32...9d1f</td>
|
415 |
-
<td class="px-4 py-2 text-sm text-gray-500">2023-11-14</td>
|
416 |
-
</tr>
|
417 |
-
</tbody>
|
418 |
-
</table>
|
419 |
-
</div>
|
420 |
-
</div>
|
421 |
-
</div>
|
422 |
-
</section>
|
423 |
-
|
424 |
-
<!-- Faucet Section -->
|
425 |
-
<section class="mb-12 bg-white rounded-xl shadow-md p-6" id="faucet">
|
426 |
-
<h2 class="text-2xl font-bold text-gray-800 mb-6 flex items-center">
|
427 |
-
<i class="fas fa-faucet mr-2 text-blue-500"></i> Testnet Faucet
|
428 |
-
</h2>
|
429 |
-
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
430 |
-
<div class="bg-gradient-to-br from-blue-50 to-indigo-50 p-6 rounded-lg">
|
431 |
-
<h3 class="font-semibold text-gray-700 mb-4">Request Test Tokens</h3>
|
432 |
-
<div class="space-y-4">
|
433 |
-
<div>
|
434 |
-
<label class="block text-sm font-medium text-gray-700 mb-1">Wallet Address</label>
|
435 |
-
<input type="text" id="faucetAddress" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
|
436 |
-
</div>
|
437 |
-
<div>
|
438 |
-
<label class="block text-sm font-medium text-gray-700 mb-1">Token Type</label>
|
439 |
-
<select class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
|
440 |
-
<option>FLB (Native Token)</option>
|
441 |
-
<option>Test USDT</option>
|
442 |
-
<option>Test USDC</option>
|
443 |
-
</select>
|
444 |
-
</div>
|
445 |
-
<button id="requestFaucet" class="w-full py-2 bg-blue-500 hover:bg-blue-600 text-white rounded-md font-medium">
|
446 |
-
Request 1000 FLB
|
447 |
-
</button>
|
448 |
-
</div>
|
449 |
-
</div>
|
450 |
-
<div class="bg-gray-50 p-6 rounded-lg">
|
451 |
-
<h3 class="font-semibold text-gray-700 mb-4">Faucet Stats</h3>
|
452 |
-
<div class="space-y-4">
|
453 |
-
<div class="flex justify-between">
|
454 |
-
<span class="text-sm text-gray-600">Total Distributed</span>
|
455 |
-
<span class="font-medium">5,420,000 FLB</span>
|
456 |
-
</div>
|
457 |
-
<div class="flex justify-between">
|
458 |
-
<span class="text-sm text-gray-600">Requests Today</span>
|
459 |
-
<span class="font-medium">142</span>
|
460 |
-
</div>
|
461 |
-
<div class="flex justify-between">
|
462 |
-
<span class="text-sm text-gray-600">Your Daily Limit</span>
|
463 |
-
<span class="font-medium">5,000 FLB</span>
|
464 |
-
</div>
|
465 |
-
</div>
|
466 |
-
</div>
|
467 |
-
</div>
|
468 |
-
</section>
|
469 |
-
|
470 |
-
<!-- Code Snippets -->
|
471 |
-
<section class="mb-12 bg-white rounded-xl shadow-md p-6">
|
472 |
-
<h2 class="text-2xl font-bold text-gray-800 mb-6 flex items-center">
|
473 |
-
<i class="fas fa-code mr-2 text-gray-500"></i> Test Code Examples
|
474 |
-
</h2>
|
475 |
-
|
476 |
-
<div class="space-y-6">
|
477 |
-
<!-- Contract Metadata Example -->
|
478 |
-
<div>
|
479 |
-
<h3 class="font-semibold text-gray-700 mb-2 flex items-center">
|
480 |
-
<i class="fas fa-file-contract mr-2 text-blue-500"></i> Contract Metadata Test
|
481 |
-
</h3>
|
482 |
-
<div class="bg-gray-800 rounded-lg p-4 overflow-x-auto">
|
483 |
-
<pre class="text-gray-300 text-sm"><code>describe("FlameBorn Token Metadata", () => {
|
484 |
-
it("Should have correct name, symbol and decimals", async () => {
|
485 |
-
expect(await token.name()).to.equal("FlameBorn");
|
486 |
-
expect(await token.symbol()).to.equal("FLB");
|
487 |
-
expect(await token.decimals()).to.equal(18);
|
488 |
-
});
|
489 |
-
|
490 |
-
it("Should have correct initial supply", async () => {
|
491 |
-
expect(await token.totalSupply())
|
492 |
-
.to.equal(ethers.utils.parseUnits("1000000", 18));
|
493 |
-
});
|
494 |
-
});</code></pre>
|
495 |
-
</div>
|
496 |
-
</div>
|
497 |
|
498 |
-
|
499 |
-
|
500 |
-
|
501 |
-
<
|
502 |
-
|
503 |
-
|
504 |
-
<
|
505 |
-
it("Should allow African identity registration", async () => {
|
506 |
-
await token.connect(user).registerAfricanID("NGA", "123456");
|
507 |
-
expect(await token.isAfrican(user.address)).to.be.true;
|
508 |
-
});
|
509 |
-
|
510 |
-
it("Should prevent re-registration", async () => {
|
511 |
-
await token.connect(user).registerAfricanID("KEN", "789012");
|
512 |
-
await expect(
|
513 |
-
token.connect(user).registerAfricanID("ZAF", "345678")
|
514 |
-
).to.be.revertedWith("Already registered");
|
515 |
-
});
|
516 |
-
|
517 |
-
it("Should allow admin verification", async () => {
|
518 |
-
await token.connect(admin).verifyAfricanIdentity(user.address, true);
|
519 |
-
expect(await token.isVerified(user.address)).to.be.true;
|
520 |
-
});
|
521 |
-
});</code></pre>
|
522 |
-
</div>
|
523 |
-
</div>
|
524 |
-
|
525 |
-
<!-- Transfer Example -->
|
526 |
-
<div>
|
527 |
-
<h3 class="font-semibold text-gray-700 mb-2 flex items-center">
|
528 |
-
<i class="fas fa-exchange-alt mr-2 text-purple-500"></i> Transfer Functionality Test
|
529 |
-
</h3>
|
530 |
-
<div class="bg-gray-800 rounded-lg p-4 overflow-x-auto">
|
531 |
-
<pre class="text-gray-300 text-sm"><code>describe("Token Transfers", () => {
|
532 |
-
it("Should transfer tokens between accounts", async () => {
|
533 |
-
await token.transfer(recipient.address, 100);
|
534 |
-
expect(await token.balanceOf(recipient.address)).to.equal(100);
|
535 |
-
});
|
536 |
-
|
537 |
-
it("Should fail when transferring more than balance", async () => {
|
538 |
-
await expect(
|
539 |
-
token.transfer(recipient.address, ethers.constants.MaxUint256)
|
540 |
-
).to.be.revertedWith("ERC20: transfer amount exceeds balance");
|
541 |
-
});
|
542 |
-
|
543 |
-
it("Should emit Transfer event", async () => {
|
544 |
-
await expect(token.transfer(recipient.address, 50))
|
545 |
-
.to.emit(token, "Transfer")
|
546 |
-
.withArgs(owner.address, recipient.address, 50);
|
547 |
-
});
|
548 |
-
});</code></pre>
|
549 |
</div>
|
|
|
550 |
</div>
|
551 |
</div>
|
552 |
-
</
|
553 |
|
554 |
-
|
555 |
-
|
556 |
-
|
557 |
-
|
558 |
-
</h2>
|
559 |
-
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
|
560 |
-
<div class="bg-gradient-to-br from-orange-50 to-red-50 p-4 rounded-lg">
|
561 |
-
<h3 class="font-semibold text-gray-800 mb-2">Top Developers</h3>
|
562 |
-
<ol class="space-y-2 text-sm">
|
563 |
-
<li class="flex justify-between">
|
564 |
-
<span>0x8f7a...3e4b</span>
|
565 |
-
<span class="font-medium">142 tests</span>
|
566 |
-
</li>
|
567 |
-
<li class="flex justify-between">
|
568 |
-
<span>0x5b32...9d1f</span>
|
569 |
-
<span class="font-medium">118 tests</span>
|
570 |
-
</li>
|
571 |
-
<li class="flex justify-between">
|
572 |
-
<span>0x1c7d...4a2e</span>
|
573 |
-
<span class="font-medium">97 tests</span>
|
574 |
-
</li>
|
575 |
-
</ol>
|
576 |
-
</div>
|
577 |
-
<div class="bg-gradient-to-br from-blue-50 to-indigo-50 p-4 rounded-lg">
|
578 |
-
<h3 class="font-semibold text-gray-800 mb-2">Bug Bounties</h3>
|
579 |
-
<ol class="space-y-2 text-sm">
|
580 |
-
<li class="flex justify-between">
|
581 |
-
<span>Critical</span>
|
582 |
-
<span class="font-medium">5,000 FLB</span>
|
583 |
-
</li>
|
584 |
-
<li class="flex justify-between">
|
585 |
-
<span>High</span>
|
586 |
-
<span class="font-medium">2,500 FLB</span>
|
587 |
-
</li>
|
588 |
-
<li class="flex justify-between">
|
589 |
-
<span>Medium</span>
|
590 |
-
<span class="font-medium">1,000 FLB</span>
|
591 |
-
</li>
|
592 |
-
</ol>
|
593 |
-
</div>
|
594 |
-
<div class="bg-gradient-to-br from-green-50 to-emerald-50 p-4 rounded-lg">
|
595 |
-
<h3 class="font-semibold text-gray-800 mb-2">Network Stats</h3>
|
596 |
-
<ul class="space-y-2 text-sm">
|
597 |
-
<li class="flex justify-between">
|
598 |
-
<span>Total Tests</span>
|
599 |
-
<span class="font-medium">1,842</span>
|
600 |
-
</li>
|
601 |
-
<li class="flex justify-between">
|
602 |
-
<span>Contracts Deployed</span>
|
603 |
-
<span class="font-medium">317</span>
|
604 |
-
</li>
|
605 |
-
<li class="flex justify-between">
|
606 |
-
<span>Unique Users</span>
|
607 |
-
<span class="font-medium">189</span>
|
608 |
-
</li>
|
609 |
-
</ul>
|
610 |
</div>
|
|
|
|
|
611 |
</div>
|
612 |
-
|
613 |
-
|
614 |
-
|
615 |
-
<section class="bg-white rounded-xl shadow-md p-6 mb-12">
|
616 |
-
<h2 class="text-2xl font-bold text-gray-800 mb-6 flex items-center">
|
617 |
-
<i class="fas fa-clipboard-check mr-2 text-orange-500"></i> Manual QA Checklist
|
618 |
-
</h2>
|
619 |
-
|
620 |
-
<div class="overflow-x-auto">
|
621 |
-
<table class="min-w-full divide-y divide-gray-200">
|
622 |
-
<thead class="bg-gray-50">
|
623 |
-
<tr>
|
624 |
-
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Step</th>
|
625 |
-
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Action</th>
|
626 |
-
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Expected</th>
|
627 |
-
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Status</th>
|
628 |
-
</tr>
|
629 |
-
</thead>
|
630 |
-
<tbody class="bg-white divide-y divide-gray-200">
|
631 |
-
<tr>
|
632 |
-
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">1</td>
|
633 |
-
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">Deploy</td>
|
634 |
-
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">Use testnet faucet, deploy contract</td>
|
635 |
-
<td class="px-6 py-4 whitespace-nowrap">
|
636 |
-
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">
|
637 |
-
Completed
|
638 |
-
</span>
|
639 |
-
</td>
|
640 |
-
</tr>
|
641 |
-
<tr>
|
642 |
-
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">2</td>
|
643 |
-
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">Role/ownership</td>
|
644 |
-
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">Query admin roles</td>
|
645 |
-
<td class="px-6 py-4 whitespace-nowrap">
|
646 |
-
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-yellow-100 text-yellow-800">
|
647 |
-
Pending
|
648 |
-
</span>
|
649 |
-
</td>
|
650 |
-
</tr>
|
651 |
-
<tr>
|
652 |
-
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">3</td>
|
653 |
-
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">Transfer</td>
|
654 |
-
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">Transfer tokens to 2–3 accounts</td>
|
655 |
-
<td class="px-6 py-4 whitespace-nowrap">
|
656 |
-
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800">
|
657 |
-
Not Started
|
658 |
-
</span>
|
659 |
-
</td>
|
660 |
-
</tr>
|
661 |
-
<tr>
|
662 |
-
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">4</td>
|
663 |
-
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">KYC/identity</td>
|
664 |
-
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">Register and verify African identity</td>
|
665 |
-
<td class="px-6 py-4 whitespace-nowrap">
|
666 |
-
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800">
|
667 |
-
Not Started
|
668 |
-
</span>
|
669 |
-
</td>
|
670 |
-
</tr>
|
671 |
-
<tr>
|
672 |
-
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">5</td>
|
673 |
-
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">Explorer check</td>
|
674 |
-
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">Confirm code/events on Blockscout/BscScan</td>
|
675 |
-
<td class="px-6 py-4 whitespace-nowrap">
|
676 |
-
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800">
|
677 |
-
Not Started
|
678 |
-
</span>
|
679 |
-
</td>
|
680 |
-
</tr>
|
681 |
-
</tbody>
|
682 |
-
</table>
|
683 |
-
</div>
|
684 |
-
</section>
|
685 |
-
</main>
|
686 |
-
|
687 |
-
<!-- Footer -->
|
688 |
-
<footer class="gradient-bg text-white py-8">
|
689 |
-
<div class="container mx-auto px-4">
|
690 |
-
<div class="flex flex-col md:flex-row justify-between items-center">
|
691 |
-
<div class="mb-4 md:mb-0">
|
692 |
-
<h2 class="text-xl font-bold flex items-center">
|
693 |
-
<div class="africa-map w-8 h-8 mr-2"></div>
|
694 |
-
FlameBorn Testnet Suite
|
695 |
-
</h2>
|
696 |
-
<p class="text-sm opacity-80 mt-1">ERC20 Token with African Identity Features</p>
|
697 |
-
</div>
|
698 |
-
<div class="flex space-x-4">
|
699 |
-
<a href="#" class="hover:opacity-75 transition-opacity">
|
700 |
-
<i class="fab fa-github text-xl"></i>
|
701 |
-
</a>
|
702 |
-
<a href="#" class="hover:opacity-75 transition-opacity">
|
703 |
-
<i class="fab fa-twitter text-xl"></i>
|
704 |
-
</a>
|
705 |
-
<a href="#" class="hover:opacity-75 transition-opacity">
|
706 |
-
<i class="fab fa-discord text-xl"></i>
|
707 |
-
</a>
|
708 |
-
<a href="#" class="hover:opacity-75 transition-opacity">
|
709 |
-
<i class="fab fa-medium text-xl"></i>
|
710 |
-
</a>
|
711 |
</div>
|
|
|
|
|
712 |
</div>
|
713 |
-
<div class="
|
714 |
-
<div class="
|
715 |
-
<
|
716 |
-
<p>© 2023 FlameBorn Project. All rights reserved.</p>
|
717 |
-
<p class="text-xs opacity-70 mt-1">Testnet tokens have no monetary value</p>
|
718 |
-
</div>
|
719 |
-
<div class="flex flex-wrap gap-x-4 gap-y-2 justify-center md:justify-end">
|
720 |
-
<a href="#" class="hover:underline">Terms</a>
|
721 |
-
<a href="#" class="hover:underline">Privacy</a>
|
722 |
-
<a href="#" class="hover:underline">Bug Bounty</a>
|
723 |
-
<a href="#" class="hover:underline">Documentation</a>
|
724 |
-
<a href="#" class="hover:underline">Audit Reports</a>
|
725 |
-
</div>
|
726 |
</div>
|
|
|
|
|
727 |
</div>
|
728 |
</div>
|
729 |
-
</
|
730 |
-
|
731 |
<script>
|
732 |
-
|
733 |
-
|
734 |
-
|
735 |
-
|
736 |
-
|
737 |
-
|
738 |
-
|
739 |
-
|
740 |
-
|
741 |
-
|
742 |
-
|
743 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
744 |
} else {
|
745 |
-
|
|
|
746 |
}
|
747 |
-
|
748 |
-
|
749 |
-
|
750 |
-
|
751 |
-
|
752 |
-
|
753 |
-
|
754 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
755 |
}
|
756 |
-
|
757 |
-
|
758 |
-
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
759 |
}
|
760 |
-
alert(`1000 FLB requested for ${address}. This is a simulation - on a real testnet, tokens would be sent.`);
|
761 |
-
});
|
762 |
-
|
763 |
-
// Simulate network status updates
|
764 |
-
function updateNetworkStatus() {
|
765 |
-
document.getElementById('currentBlock').textContent =
|
766 |
-
Math.floor(Math.random() * 1000000).toLocaleString();
|
767 |
-
document.getElementById('gasPrice').textContent =
|
768 |
-
`${(Math.random() * 50).toFixed(2)} Gwei`;
|
769 |
-
}
|
770 |
-
setInterval(updateNetworkStatus, 5000);
|
771 |
-
updateNetworkStatus();
|
772 |
-
|
773 |
-
// Simulate progress bar animation
|
774 |
-
document.addEventListener('DOMContentLoaded', function() {
|
775 |
-
const progressBar = document.querySelector('.progress-bar');
|
776 |
-
const progressPercentage = document.getElementById('progressPercentage');
|
777 |
|
778 |
-
|
779 |
-
|
780 |
-
|
781 |
-
|
782 |
-
|
783 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
784 |
} else {
|
785 |
-
|
786 |
-
progressPercentage.textContent = `${progress}%`;
|
787 |
}
|
788 |
-
}
|
789 |
|
790 |
-
|
791 |
-
|
792 |
-
|
793 |
-
const card = this.closest('.test-card');
|
794 |
-
const spinner = card.querySelector('.fa-spinner');
|
795 |
-
|
796 |
-
if (spinner) {
|
797 |
-
// Show loading state
|
798 |
-
spinner.classList.remove('fa-spinner', 'animate-spin', 'text-yellow-500');
|
799 |
-
spinner.classList.add('fa-check-circle', 'text-green-500');
|
800 |
-
|
801 |
-
// Update progress
|
802 |
-
progress += 10;
|
803 |
-
if (progress > 100) progress = 100;
|
804 |
-
progressBar.style.width = `${progress}%`;
|
805 |
-
progressPercentage.textContent = `${progress}%`;
|
806 |
-
}
|
807 |
-
});
|
808 |
-
});
|
809 |
});
|
810 |
</script>
|
811 |
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=MoShow/awert" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
|
|
|
3 |
<head>
|
4 |
<meta charset="UTF-8">
|
5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6 |
+
<title>Infinite Skills - African Voice Assistant</title>
|
7 |
<script src="https://cdn.tailwindcss.com"></script>
|
8 |
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
9 |
<style>
|
10 |
+
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@400;600;700&family=Poppins:wght@400;500;600&display=swap');
|
11 |
+
|
12 |
+
body {
|
13 |
+
font-family: 'Poppins', sans-serif;
|
14 |
+
background-color: #f5f5f5;
|
15 |
+
}
|
16 |
+
|
17 |
+
.african-pattern-bg {
|
18 |
+
background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiPjxkZWZzPjxwYXR0ZXJuIGlkPSJwYXR0ZXJuIiB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiIHBhdHRlcm5UcmFuc2Zvcm09InJvdGF0ZSg0NSkiPjxyZWN0IHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0iI2U5YzQwMCIvPjwvcGF0dGVybj48L2RlZnM+PHJlY3QgZmlsbD0idXJsKCNwYXR0ZXJuKSIgaGVpZ2h0PSIxMDAlIiB3aWR0aD0iMTAwJSIvPjwvc3ZnPg==');
|
19 |
+
opacity: 0.1;
|
20 |
+
position: absolute;
|
21 |
+
top: 0;
|
22 |
+
left: 0;
|
23 |
+
right: 0;
|
24 |
+
bottom: 0;
|
25 |
+
z-index: -1;
|
26 |
+
}
|
27 |
+
|
28 |
+
.voice-wave {
|
29 |
+
position: relative;
|
30 |
+
height: 60px;
|
31 |
+
display: flex;
|
32 |
+
justify-content: center;
|
33 |
+
align-items: center;
|
34 |
+
}
|
35 |
+
|
36 |
+
.voice-wave span {
|
37 |
+
display: block;
|
38 |
+
width: 4px;
|
39 |
+
height: 20px;
|
40 |
+
background: #e9c400;
|
41 |
+
margin: 0 2px;
|
42 |
+
border-radius: 10px;
|
43 |
+
animation: voice-wave 1.5s infinite ease-in-out;
|
44 |
+
}
|
45 |
+
|
46 |
+
.voice-wave span:nth-child(2) {
|
47 |
+
animation-delay: 0.2s;
|
48 |
}
|
49 |
+
|
50 |
+
.voice-wave span:nth-child(3) {
|
51 |
+
animation-delay: 0.4s;
|
52 |
}
|
53 |
+
|
54 |
+
.voice-wave span:nth-child(4) {
|
55 |
+
animation-delay: 0.6s;
|
56 |
}
|
57 |
+
|
58 |
+
.voice-wave span:nth-child(5) {
|
59 |
+
animation-delay: 0.8s;
|
|
|
|
|
60 |
}
|
61 |
+
|
62 |
+
@keyframes voice-wave {
|
63 |
0%, 100% {
|
64 |
+
transform: scaleY(0.5);
|
65 |
}
|
66 |
50% {
|
67 |
+
transform: scaleY(2);
|
68 |
}
|
69 |
}
|
70 |
+
|
71 |
+
.response-bubble {
|
72 |
+
position: relative;
|
73 |
+
background: #f8f9fa;
|
74 |
+
border-radius: 18px;
|
75 |
+
padding: 12px 16px;
|
76 |
+
margin: 8px 0;
|
77 |
+
max-width: 80%;
|
78 |
+
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
79 |
+
}
|
80 |
+
|
81 |
+
.response-bubble:after {
|
82 |
+
content: '';
|
83 |
+
position: absolute;
|
84 |
+
bottom: -10px;
|
85 |
+
left: 20px;
|
86 |
+
border-width: 10px 10px 0;
|
87 |
+
border-style: solid;
|
88 |
+
border-color: #f8f9fa transparent;
|
89 |
+
}
|
90 |
+
|
91 |
+
.user-bubble {
|
92 |
+
background: #e9c400;
|
93 |
+
color: white;
|
94 |
+
align-self: flex-end;
|
95 |
+
}
|
96 |
+
|
97 |
+
.user-bubble:after {
|
98 |
+
right: 20px;
|
99 |
+
left: auto;
|
100 |
+
border-width: 10px 10px 0;
|
101 |
+
border-style: solid;
|
102 |
+
border-color: #e9c400 transparent;
|
103 |
+
}
|
104 |
+
|
105 |
+
.typing-indicator {
|
106 |
+
display: flex;
|
107 |
+
padding: 8px 12px;
|
108 |
+
background: #f8f9fa;
|
109 |
+
border-radius: 18px;
|
110 |
+
align-self: flex-start;
|
111 |
+
margin: 8px 0;
|
112 |
+
}
|
113 |
+
|
114 |
+
.typing-indicator span {
|
115 |
+
width: 6px;
|
116 |
+
height: 6px;
|
117 |
+
background: #6c757d;
|
118 |
+
border-radius: 50%;
|
119 |
+
margin: 0 2px;
|
120 |
+
animation: typing 1s infinite ease-in-out;
|
121 |
+
}
|
122 |
+
|
123 |
+
.typing-indicator span:nth-child(2) {
|
124 |
+
animation-delay: 0.2s;
|
125 |
+
}
|
126 |
+
|
127 |
+
.typing-indicator span:nth-child(3) {
|
128 |
+
animation-delay: 0.4s;
|
129 |
+
}
|
130 |
+
|
131 |
+
@keyframes typing {
|
132 |
+
0%, 100% {
|
133 |
+
transform: translateY(0);
|
134 |
+
}
|
135 |
+
50% {
|
136 |
+
transform: translateY(-5px);
|
137 |
+
}
|
138 |
}
|
139 |
</style>
|
140 |
</head>
|
141 |
+
<body class="min-h-screen bg-gray-100">
|
142 |
+
<div class="african-pattern-bg"></div>
|
143 |
+
|
144 |
+
<div class="container mx-auto px-4 py-8 max-w-4xl">
|
145 |
+
<header class="text-center mb-8">
|
146 |
+
<h1 class="text-4xl font-bold text-yellow-700 mb-2">Infinite Skills</h1>
|
147 |
+
<p class="text-lg text-gray-600">African Context Voice Assistant</p>
|
148 |
+
<div class="mt-4 flex justify-center">
|
149 |
+
<div class="w-16 h-1 bg-yellow-600 rounded-full"></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
150 |
</div>
|
151 |
+
</header>
|
152 |
+
|
153 |
+
<div class="bg-white rounded-2xl shadow-xl overflow-hidden">
|
154 |
+
<div class="bg-yellow-600 py-4 px-6 flex items-center">
|
155 |
+
<div class="w-12 h-12 rounded-full bg-yellow-700 flex items-center justify-center text-white">
|
156 |
+
<i class="fas fa-headphones text-2xl"></i>
|
157 |
+
</div>
|
158 |
+
<div class="ml-4">
|
159 |
+
<h3 class="text-white font-semibold">African Voice Assistant</h3>
|
160 |
+
<p class="text-yellow-100 text-sm">Ready to assist you</p>
|
161 |
+
</div>
|
162 |
+
<div class="ml-auto flex space-x-2">
|
163 |
+
<button class="w-8 h-8 rounded-full bg-yellow-700 text-white flex items-center justify-center">
|
164 |
+
<i class="fas fa-cog"></i>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
165 |
</button>
|
166 |
+
<button class="w-8 h-8 rounded-full bg-yellow-700 text-white flex items-center justify-center">
|
167 |
+
<i class="fas fa-times"></i>
|
168 |
</button>
|
169 |
</div>
|
170 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
171 |
|
172 |
+
<div class="p-4 h-96 overflow-y-auto flex flex-col" id="chat-container">
|
173 |
+
<div class="response-bubble">
|
174 |
+
<p>Hello my brother/sister! How can I help you today? Remember I understand African context only.</p>
|
|
|
|
|
|
|
|
|
|
|
175 |
</div>
|
176 |
+
<!-- Chat messages will appear here -->
|
177 |
</div>
|
178 |
|
179 |
+
<div class="border-t border-gray-200 p-4 bg-gray-50">
|
180 |
+
<div class="flex items-center">
|
181 |
+
<button id="voice-btn" class="w-12 h-12 rounded-full bg-yellow-600 text-white flex items-center justify-center hover:bg-yellow-700 transition">
|
182 |
+
<i class="fas fa-microphone text-xl"></i>
|
|
|
|
|
|
|
|
|
|
|
183 |
</button>
|
184 |
+
<div class="ml-4 flex-1 relative">
|
185 |
+
<input type="text" id="user-input" placeholder="Speak or type your request..." class="w-full px-4 py-3 rounded-full border border-gray-300 focus:outline-none focus:ring-2 focus:ring-yellow-500 focus:border-transparent">
|
186 |
+
<button id="send-btn" class="absolute right-3 top-3 text-gray-400 hover:text-yellow-600">
|
187 |
+
<i class="fas fa-paper-plane"></i>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
188 |
</button>
|
189 |
</div>
|
190 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
191 |
|
192 |
+
<div class="mt-4 flex justify-center hidden" id="voice-wave">
|
193 |
+
<div class="voice-wave">
|
194 |
+
<span></span>
|
195 |
+
<span></span>
|
196 |
+
<span></span>
|
197 |
+
<span></span>
|
198 |
+
<span></span>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
199 |
</div>
|
200 |
+
<p class="ml-3 text-gray-600">Listening for African context...</p>
|
201 |
</div>
|
202 |
</div>
|
203 |
+
</div>
|
204 |
|
205 |
+
<div class="mt-8 grid grid-cols-1 md:grid-cols-3 gap-4">
|
206 |
+
<div class="bg-white p-4 rounded-lg shadow-md">
|
207 |
+
<div class="text-yellow-600 mb-2">
|
208 |
+
<i class="fas fa-globe-africa text-2xl"></i>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
209 |
</div>
|
210 |
+
<h3 class="font-semibold text-gray-800">African Context</h3>
|
211 |
+
<p class="text-gray-600 text-sm mt-1">Understands local dialects, proverbs and cultural references</p>
|
212 |
</div>
|
213 |
+
<div class="bg-white p-4 rounded-lg shadow-md">
|
214 |
+
<div class="text-yellow-600 mb-2">
|
215 |
+
<i class="fas fa-comments text-2xl"></i>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
216 |
</div>
|
217 |
+
<h3 class="font-semibold text-gray-800">Local Languages</h3>
|
218 |
+
<p class="text-gray-600 text-sm mt-1">Supports Pidgin, Swahili, Yoruba and more in English voice</p>
|
219 |
</div>
|
220 |
+
<div class="bg-white p-4 rounded-lg shadow-md">
|
221 |
+
<div class="text-yellow-600 mb-2">
|
222 |
+
<i class="fas fa-lightbulb text-2xl"></i>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
223 |
</div>
|
224 |
+
<h3 class="font-semibold text-gray-800">Smart Assistance</h3>
|
225 |
+
<p class="text-gray-600 text-sm mt-1">Provides solutions relevant to African lifestyle</p>
|
226 |
</div>
|
227 |
</div>
|
228 |
+
</div>
|
229 |
+
|
230 |
<script>
|
231 |
+
document.addEventListener('DOMContentLoaded', function() {
|
232 |
+
const voiceBtn = document.getElementById('voice-btn');
|
233 |
+
const sendBtn = document.getElementById('send-btn');
|
234 |
+
const userInput = document.getElementById('user-input');
|
235 |
+
const chatContainer = document.getElementById('chat-container');
|
236 |
+
const voiceWave = document.getElementById('voice-wave');
|
237 |
+
|
238 |
+
// African context responses
|
239 |
+
const africanResponses = {
|
240 |
+
"greeting": ["Nna, how you dey?", "Sawubona my brother/sister!", "Kedu! How far?", "Akwaba! How you dey do?"],
|
241 |
+
"help": ["I fit help you with African matters only o!", "Abeg, ask me anything about our African way.", "I sabi African matters pass, wetin you wan know?"],
|
242 |
+
"time": ["Time dey go like NEPA bill for Nigeria!", "E be like say time don dey for {current_time}. No waste am!"],
|
243 |
+
"joke": ["Why the chicken cross the road? To show the goat say road no be only for am!", "Wetin dey worry lion? Nothing, na just him nature!"],
|
244 |
+
"proverb": ["The child who is not embraced by the village will burn it down to feel its warmth.", "Until the lions have their own historians, the history of the hunt will always glorify the hunter."],
|
245 |
+
"food": ["You wan chop amala with ewedu? Or maybe fufu and egusi soup?", "Jollof rice na the real deal, no be small thing!"],
|
246 |
+
"weather": ["Sun dey bake like plantain for roadside!", "Rain dey fall like say heaven don open!"],
|
247 |
+
"default": ["Abeg, I no understand. Make you repeat am.", "Oga, na African matters I sabi. Try again."]
|
248 |
+
};
|
249 |
+
|
250 |
+
// Speech recognition setup
|
251 |
+
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
|
252 |
+
let recognition;
|
253 |
+
|
254 |
+
if (SpeechRecognition) {
|
255 |
+
recognition = new SpeechRecognition();
|
256 |
+
recognition.continuous = false;
|
257 |
+
recognition.interimResults = false;
|
258 |
+
recognition.lang = 'en-US';
|
259 |
+
|
260 |
+
recognition.onstart = function() {
|
261 |
+
voiceWave.classList.remove('hidden');
|
262 |
+
voiceBtn.innerHTML = '<i class="fas fa-microphone-slash text-xl"></i>';
|
263 |
+
};
|
264 |
+
|
265 |
+
recognition.onend = function() {
|
266 |
+
voiceWave.classList.add('hidden');
|
267 |
+
voiceBtn.innerHTML = '<i class="fas fa-microphone text-xl"></i>';
|
268 |
+
};
|
269 |
+
|
270 |
+
recognition.onresult = function(event) {
|
271 |
+
const transcript = event.results[0][0].transcript;
|
272 |
+
userInput.value = transcript;
|
273 |
+
processUserInput(transcript);
|
274 |
+
};
|
275 |
+
|
276 |
+
recognition.onerror = function(event) {
|
277 |
+
console.error('Speech recognition error', event.error);
|
278 |
+
addMessage("System", "Abeg, I no hear you well. Try again.", false);
|
279 |
+
voiceWave.classList.add('hidden');
|
280 |
+
voiceBtn.innerHTML = '<i class="fas fa-microphone text-xl"></i>';
|
281 |
+
};
|
282 |
} else {
|
283 |
+
voiceBtn.disabled = true;
|
284 |
+
voiceBtn.title = "Speech recognition not supported in your browser";
|
285 |
}
|
286 |
+
|
287 |
+
// Event listeners
|
288 |
+
voiceBtn.addEventListener('click', toggleVoiceRecognition);
|
289 |
+
sendBtn.addEventListener('click', () => processUserInput(userInput.value));
|
290 |
+
userInput.addEventListener('keypress', (e) => {
|
291 |
+
if (e.key === 'Enter') {
|
292 |
+
processUserInput(userInput.value);
|
293 |
+
}
|
294 |
+
});
|
295 |
+
|
296 |
+
function toggleVoiceRecognition() {
|
297 |
+
if (recognition) {
|
298 |
+
if (voiceWave.classList.contains('hidden')) {
|
299 |
+
recognition.start();
|
300 |
+
} else {
|
301 |
+
recognition.stop();
|
302 |
+
}
|
303 |
+
}
|
304 |
}
|
305 |
+
|
306 |
+
function processUserInput(input) {
|
307 |
+
if (!input.trim()) return;
|
308 |
+
|
309 |
+
// Add user message to chat
|
310 |
+
addMessage("You", input, true);
|
311 |
+
userInput.value = '';
|
312 |
+
|
313 |
+
// Show typing indicator
|
314 |
+
const typingIndicator = document.createElement('div');
|
315 |
+
typingIndicator.className = 'typing-indicator';
|
316 |
+
typingIndicator.innerHTML = '<span></span><span></span><span></span>';
|
317 |
+
chatContainer.appendChild(typingIndicator);
|
318 |
+
chatContainer.scrollTop = chatContainer.scrollHeight;
|
319 |
+
|
320 |
+
// Simulate processing delay
|
321 |
+
setTimeout(() => {
|
322 |
+
// Remove typing indicator
|
323 |
+
chatContainer.removeChild(typingIndicator);
|
324 |
+
|
325 |
+
// Generate response
|
326 |
+
const response = generateAfricanResponse(input);
|
327 |
+
addMessage("African Assistant", response, false);
|
328 |
+
}, 1500);
|
329 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
330 |
|
331 |
+
function addMessage(sender, message, isUser) {
|
332 |
+
const messageDiv = document.createElement('div');
|
333 |
+
messageDiv.className = isUser ? 'response-bubble user-bubble' : 'response-bubble';
|
334 |
+
messageDiv.innerHTML = `<p><strong>${sender}:</strong> ${message}</p>`;
|
335 |
+
chatContainer.appendChild(messageDiv);
|
336 |
+
chatContainer.scrollTop = chatContainer.scrollHeight;
|
337 |
+
}
|
338 |
+
|
339 |
+
function generateAfricanResponse(input) {
|
340 |
+
input = input.toLowerCase();
|
341 |
+
|
342 |
+
// Get current time for time-related responses
|
343 |
+
const now = new Date();
|
344 |
+
const currentTime = now.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' });
|
345 |
+
|
346 |
+
// Check for keywords and respond accordingly
|
347 |
+
if (input.includes('hello') || input.includes('hi') || input.includes('how you')) {
|
348 |
+
return getRandomResponse(africanResponses.greeting);
|
349 |
+
} else if (input.includes('help') || input.includes('assist')) {
|
350 |
+
return getRandomResponse(africanResponses.help);
|
351 |
+
} else if (input.includes('time') || input.includes('what time')) {
|
352 |
+
return africanResponses.time[0].replace('{current_time}', currentTime);
|
353 |
+
} else if (input.includes('joke') || input.includes('make me laugh')) {
|
354 |
+
return getRandomResponse(africanResponses.joke);
|
355 |
+
} else if (input.includes('proverb') || input.includes('wise word')) {
|
356 |
+
return getRandomResponse(africanResponses.proverb);
|
357 |
+
} else if (input.includes('food') || input.includes('chop') || input.includes('eat')) {
|
358 |
+
return getRandomResponse(africanResponses.food);
|
359 |
+
} else if (input.includes('weather') || input.includes('rain') || input.includes('sun')) {
|
360 |
+
return getRandomResponse(africanResponses.weather);
|
361 |
} else {
|
362 |
+
return getRandomResponse(africanResponses.default);
|
|
|
363 |
}
|
364 |
+
}
|
365 |
|
366 |
+
function getRandomResponse(responses) {
|
367 |
+
return responses[Math.floor(Math.random() * responses.length)];
|
368 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
369 |
});
|
370 |
</script>
|
371 |
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=MoShow/awert" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
|