strade-stx 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/.activity_counter +1 -0
  2. package/.gitattributes +3 -0
  3. package/.vscode/settings.json +4 -0
  4. package/.vscode/tasks.json +19 -0
  5. package/CHANGELOG.md +1 -0
  6. package/Clarinet.toml +56 -0
  7. package/Clarinet.toml.backup +174 -0
  8. package/Clarinet.toml.old +146 -0
  9. package/DEPLOYMENT_RESULTS.md +160 -0
  10. package/README.md +344 -0
  11. package/TODO.md +34 -0
  12. package/contracts/CoreMarketPlace.clar +227 -0
  13. package/contracts/DisputeResolution_clar.clar +265 -0
  14. package/contracts/EscrowService.clar +171 -0
  15. package/contracts/UserProfile.clar +280 -0
  16. package/contracts/ft-trait.clar +24 -0
  17. package/contracts/token.clar +178 -0
  18. package/costs-reports.json +76026 -0
  19. package/deployments/default.mainnet-plan.yaml +67 -0
  20. package/deployments/default.simnet-plan.yaml +105 -0
  21. package/deployments/default.testnet-plan.yaml +67 -0
  22. package/deployments/new-contracts.testnet-plan.yaml +32 -0
  23. package/frontend/README.md +10 -0
  24. package/frontend/components.json +22 -0
  25. package/frontend/dist/assets/index-BacuuL66.css +1 -0
  26. package/frontend/dist/assets/index-jryypd5B.js +194 -0
  27. package/frontend/dist/favicon.png +0 -0
  28. package/frontend/dist/index.html +15 -0
  29. package/frontend/dist/manifest.json +15 -0
  30. package/frontend/dist/vite.svg +1 -0
  31. package/frontend/empty-mock.js +1 -0
  32. package/frontend/eslint.config.js +23 -0
  33. package/frontend/eslint.config.mjs +25 -0
  34. package/frontend/index.html +14 -0
  35. package/frontend/next.config.ts +17 -0
  36. package/frontend/package-lock.json +14740 -0
  37. package/frontend/package.json +56 -0
  38. package/frontend/postcss.config.js +5 -0
  39. package/frontend/postcss.config.mjs +5 -0
  40. package/frontend/public/favicon.png +0 -0
  41. package/frontend/public/file.svg +1 -0
  42. package/frontend/public/globe.svg +1 -0
  43. package/frontend/public/manifest.json +15 -0
  44. package/frontend/public/next.svg +1 -0
  45. package/frontend/public/vercel.svg +1 -0
  46. package/frontend/public/vite.svg +1 -0
  47. package/frontend/public/window.svg +1 -0
  48. package/frontend/src/App.css +42 -0
  49. package/frontend/src/App.tsx +177 -0
  50. package/frontend/src/app/about/page.tsx +208 -0
  51. package/frontend/src/app/favicon.ico +0 -0
  52. package/frontend/src/app/globals.css +129 -0
  53. package/frontend/src/app/help/page.tsx +167 -0
  54. package/frontend/src/app/how-it-works/page.tsx +274 -0
  55. package/frontend/src/app/layout.tsx +55 -0
  56. package/frontend/src/app/marketplace/page.tsx +324 -0
  57. package/frontend/src/app/my-listings/page.tsx +318 -0
  58. package/frontend/src/app/page.tsx +15 -0
  59. package/frontend/src/assets/react.svg +1 -0
  60. package/frontend/src/components/ConfirmDialog.tsx +54 -0
  61. package/frontend/src/components/CreateListingForm.tsx +231 -0
  62. package/frontend/src/components/ErrorBoundary.tsx +73 -0
  63. package/frontend/src/components/FilterPanel.tsx +10 -0
  64. package/frontend/src/components/Footer.tsx +100 -0
  65. package/frontend/src/components/Header.tsx +268 -0
  66. package/frontend/src/components/ImageUpload.tsx +147 -0
  67. package/frontend/src/components/LandingPage.tsx +322 -0
  68. package/frontend/src/components/ListingCard.tsx +154 -0
  69. package/frontend/src/components/LoadingSkeleton.tsx +44 -0
  70. package/frontend/src/components/MobileNav.tsx +89 -0
  71. package/frontend/src/components/NotificationBell.tsx +8 -0
  72. package/frontend/src/components/NotificationPanel.tsx +14 -0
  73. package/frontend/src/components/README.md +14 -0
  74. package/frontend/src/components/SearchBar.tsx +10 -0
  75. package/frontend/src/components/TestnetBanner.tsx +29 -0
  76. package/frontend/src/components/ThemeToggle.tsx +32 -0
  77. package/frontend/src/components/__tests__/Header.test.tsx +70 -0
  78. package/frontend/src/components/__tests__/ListingCard.test.tsx +86 -0
  79. package/frontend/src/components/providers/ThemeProvider.tsx +9 -0
  80. package/frontend/src/components/ui/alert-dialog.tsx +141 -0
  81. package/frontend/src/components/ui/avatar.tsx +53 -0
  82. package/frontend/src/components/ui/badge.tsx +46 -0
  83. package/frontend/src/components/ui/button.tsx +60 -0
  84. package/frontend/src/components/ui/card.tsx +92 -0
  85. package/frontend/src/components/ui/dialog.tsx +143 -0
  86. package/frontend/src/components/ui/dropdown-menu.tsx +257 -0
  87. package/frontend/src/components/ui/input.tsx +21 -0
  88. package/frontend/src/components/ui/label.tsx +24 -0
  89. package/frontend/src/components/ui/select.tsx +187 -0
  90. package/frontend/src/components/ui/sonner.tsx +40 -0
  91. package/frontend/src/components/ui/textarea.tsx +18 -0
  92. package/frontend/src/context/README.md +27 -0
  93. package/frontend/src/index.css +166 -0
  94. package/frontend/src/lib/notificationEvents.ts +10 -0
  95. package/frontend/src/lib/notificationStore.ts +13 -0
  96. package/frontend/src/lib/notifications.ts +13 -0
  97. package/frontend/src/lib/search.ts +28 -0
  98. package/frontend/src/lib/stacks.ts +189 -0
  99. package/frontend/src/lib/utils.ts +6 -0
  100. package/frontend/src/main.tsx +10 -0
  101. package/frontend/src/test/setup.ts +23 -0
  102. package/frontend/src/types.d.ts +9 -0
  103. package/frontend/tsconfig.app.json +28 -0
  104. package/frontend/tsconfig.json +41 -0
  105. package/frontend/tsconfig.node.json +26 -0
  106. package/frontend/vercel.json +4 -0
  107. package/frontend/vite.config.ts +6 -0
  108. package/frontend/vitest.config.ts +17 -0
  109. package/lcov.info +31338 -0
  110. package/mainnetcontracts.md +16 -0
  111. package/package.json +53 -0
  112. package/scripts/auto-activity.sh +9 -0
  113. package/scripts/cancel-pending.ts +67 -0
  114. package/scripts/check-balances.ts +23 -0
  115. package/scripts/distribute-evenly.ts +56 -0
  116. package/scripts/drain-accounts.ts +70 -0
  117. package/scripts/fund-accounts.ts +88 -0
  118. package/scripts/fund-active.ts +59 -0
  119. package/scripts/fund-unfunded.ts +88 -0
  120. package/scripts/generate-activity.ts +181 -0
  121. package/scripts/git-activity-generator.ts +154 -0
  122. package/scripts/mobile-server.ts +123 -0
  123. package/settings/Devnet.toml +155 -0
  124. package/settings/Mainnet.toml +7 -0
  125. package/settings/Testnet.toml +9 -0
  126. package/tests/CoreMarketPlace.fuzz.test.ts +435 -0
  127. package/tests/CoreMarketPlace.test.ts +564 -0
  128. package/tsconfig.json +26 -0
  129. package/vitest.config.js +49 -0
@@ -0,0 +1,167 @@
1
+ 'use client';
2
+
3
+ import Header from '@/components/Header';
4
+ import Footer from '@/components/Footer';
5
+ import TestnetBanner from '@/components/TestnetBanner';
6
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
7
+ import { HelpCircle, Shield, Wallet, ShoppingCart, AlertTriangle } from 'lucide-react';
8
+
9
+ export default function HelpPage() {
10
+ const faqs = [
11
+ {
12
+ question: 'What is Strade?',
13
+ answer: 'Strade is a decentralized marketplace built on the Stacks blockchain. It allows users to buy and sell goods securely using smart contracts, without the need for intermediaries.',
14
+ },
15
+ {
16
+ question: 'How do I connect my wallet?',
17
+ answer: 'Click the "Connect Wallet" button in the header. You\'ll need a Stacks wallet like Hiro Wallet or Leather to interact with the marketplace.',
18
+ },
19
+ {
20
+ question: 'How do I create a listing?',
21
+ answer: 'Once your wallet is connected, click the "Create Listing" button on the marketplace page. Fill in the item details including name, description, price (in STX), and duration (in days). You can also upload an image to make your listing more attractive.',
22
+ },
23
+ {
24
+ question: 'How do purchases work?',
25
+ answer: 'When you click "Purchase" on a listing, a transaction will be initiated through your wallet. The STX amount will be transferred directly from your wallet to the seller. Once confirmed on the blockchain, the listing status will update to "sold".',
26
+ },
27
+ {
28
+ question: 'Can I cancel my listing?',
29
+ answer: 'Yes! If you\'re the seller and your listing is still active, you can cancel it from the "My Listings" page. Click the "Cancel Listing" button and confirm the transaction in your wallet.',
30
+ },
31
+ {
32
+ question: 'What happens when a listing expires?',
33
+ answer: 'Listings have a duration set by the seller. When this time passes, the listing automatically expires and can no longer be purchased. Expired listings can be viewed in the seller\'s "My Listings" page.',
34
+ },
35
+ {
36
+ question: 'Is this real money?',
37
+ answer: 'Currently, Strade is running on the Stacks testnet. The STX tokens used have no real value and are only for testing purposes. DO NOT use real assets on the testnet.',
38
+ },
39
+ {
40
+ question: 'What are gas fees?',
41
+ answer: 'Gas fees are transaction costs paid to process your transaction on the blockchain. These fees go to network miners, not to Strade. Your wallet will show you the estimated fee before you confirm any transaction.',
42
+ },
43
+ ];
44
+
45
+ const safetyTips = [
46
+ 'Always verify the seller\'s address before making a purchase',
47
+ 'Check the listing expiration date to ensure sufficient time for transaction',
48
+ 'Make sure you have enough STX balance including gas fees',
49
+ 'Never share your private keys or seed phrase with anyone',
50
+ 'Double-check all transaction details before confirming in your wallet',
51
+ 'This is a testnet - never send real STX or valuable assets',
52
+ ];
53
+
54
+ return (
55
+ <div className="min-h-screen bg-slate-50 flex flex-col">
56
+ <TestnetBanner />
57
+ <Header />
58
+
59
+ <main className="flex-1 max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-8 w-full">
60
+ <div className="mb-8">
61
+ <div className="flex items-center gap-3 mb-2">
62
+ <HelpCircle className="h-8 w-8 text-slate-900" />
63
+ <h1 className="text-3xl font-bold text-slate-900">Help & FAQ</h1>
64
+ </div>
65
+ <p className="text-slate-600">
66
+ Everything you need to know about using Strade marketplace
67
+ </p>
68
+ </div>
69
+
70
+ {/* Safety Tips */}
71
+ <Card className="mb-8 border-orange-200 bg-orange-50">
72
+ <CardHeader>
73
+ <div className="flex items-center gap-2">
74
+ <AlertTriangle className="h-5 w-5 text-orange-600" />
75
+ <CardTitle className="text-orange-900">Safety Tips</CardTitle>
76
+ </div>
77
+ <CardDescription className="text-orange-700">
78
+ Important reminders for safe marketplace usage
79
+ </CardDescription>
80
+ </CardHeader>
81
+ <CardContent>
82
+ <ul className="space-y-2">
83
+ {safetyTips.map((tip, index) => (
84
+ <li key={index} className="flex items-start gap-2 text-sm text-orange-800">
85
+ <Shield className="h-4 w-4 mt-0.5 flex-shrink-0" />
86
+ <span>{tip}</span>
87
+ </li>
88
+ ))}
89
+ </ul>
90
+ </CardContent>
91
+ </Card>
92
+
93
+ {/* Quick Guides */}
94
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-6 mb-8">
95
+ <Card>
96
+ <CardHeader>
97
+ <div className="flex items-center gap-2">
98
+ <Wallet className="h-5 w-5 text-blue-600" />
99
+ <CardTitle>For Sellers</CardTitle>
100
+ </div>
101
+ </CardHeader>
102
+ <CardContent className="space-y-2 text-sm text-slate-600">
103
+ <p><strong>1.</strong> Connect your Stacks wallet</p>
104
+ <p><strong>2.</strong> Click "Create Listing"</p>
105
+ <p><strong>3.</strong> Fill in item details and set price</p>
106
+ <p><strong>4.</strong> Confirm transaction in wallet</p>
107
+ <p><strong>5.</strong> Manage listings in "My Listings"</p>
108
+ </CardContent>
109
+ </Card>
110
+
111
+ <Card>
112
+ <CardHeader>
113
+ <div className="flex items-center gap-2">
114
+ <ShoppingCart className="h-5 w-5 text-green-600" />
115
+ <CardTitle>For Buyers</CardTitle>
116
+ </div>
117
+ </CardHeader>
118
+ <CardContent className="space-y-2 text-sm text-slate-600">
119
+ <p><strong>1.</strong> Connect your Stacks wallet</p>
120
+ <p><strong>2.</strong> Browse available listings</p>
121
+ <p><strong>3.</strong> Check price and seller details</p>
122
+ <p><strong>4.</strong> Click "Purchase" and confirm</p>
123
+ <p><strong>5.</strong> Wait for blockchain confirmation</p>
124
+ </CardContent>
125
+ </Card>
126
+ </div>
127
+
128
+ {/* FAQs */}
129
+ <div className="space-y-4">
130
+ <h2 className="text-2xl font-bold text-slate-900 mb-4">
131
+ Frequently Asked Questions
132
+ </h2>
133
+ {faqs.map((faq, index) => (
134
+ <Card key={index}>
135
+ <CardHeader>
136
+ <CardTitle className="text-lg">{faq.question}</CardTitle>
137
+ </CardHeader>
138
+ <CardContent>
139
+ <p className="text-slate-600">{faq.answer}</p>
140
+ </CardContent>
141
+ </Card>
142
+ ))}
143
+ </div>
144
+
145
+ {/* Contact */}
146
+ <Card className="mt-8">
147
+ <CardHeader>
148
+ <CardTitle>Still need help?</CardTitle>
149
+ <CardDescription>
150
+ We're here to help you get the most out of Strade
151
+ </CardDescription>
152
+ </CardHeader>
153
+ <CardContent className="space-y-2 text-sm text-slate-600">
154
+ <p>For technical issues or questions not covered here:</p>
155
+ <ul className="list-disc list-inside space-y-1 ml-2">
156
+ <li>Check the Stacks blockchain explorer for transaction status</li>
157
+ <li>Visit our GitHub repository for technical documentation</li>
158
+ <li>Join our community Discord for support</li>
159
+ </ul>
160
+ </CardContent>
161
+ </Card>
162
+ </main>
163
+
164
+ <Footer />
165
+ </div>
166
+ );
167
+ }
@@ -0,0 +1,274 @@
1
+ 'use client';
2
+
3
+ import { motion } from 'framer-motion';
4
+ import Header from '@/components/Header';
5
+ import Footer from '@/components/Footer';
6
+ import TestnetBanner from '@/components/TestnetBanner';
7
+ import {
8
+ Wallet,
9
+ List,
10
+ ShoppingCart,
11
+ Shield,
12
+ MessageSquare,
13
+ CheckCircle,
14
+ ArrowRight
15
+ } from 'lucide-react';
16
+ import { Button } from '@/components/ui/button';
17
+ import Link from 'next/link';
18
+
19
+ const fadeInUp = {
20
+ initial: { opacity: 0, y: 20 },
21
+ animate: { opacity: 1, y: 0 },
22
+ transition: { duration: 0.5 }
23
+ };
24
+
25
+ const steps = [
26
+ {
27
+ icon: Wallet,
28
+ title: 'Connect Your Wallet',
29
+ description: 'Connect your Leather wallet or any Stacks-compatible wallet to get started. No sign-up required.',
30
+ details: [
31
+ 'Install Leather wallet extension',
32
+ 'Create or import your wallet',
33
+ 'Connect to Strade with one click',
34
+ 'Your wallet, your keys, your control'
35
+ ]
36
+ },
37
+ {
38
+ icon: List,
39
+ title: 'Create a Listing',
40
+ description: 'List your items with detailed descriptions, prices, and durations. All transactions are protected by smart contracts.',
41
+ details: [
42
+ 'Add item name and description',
43
+ 'Set your price in STX',
44
+ 'Choose listing duration',
45
+ 'Submit transaction to blockchain'
46
+ ]
47
+ },
48
+ {
49
+ icon: ShoppingCart,
50
+ title: 'Browse & Purchase',
51
+ description: 'Discover items from sellers worldwide. Purchase securely with automatic escrow protection.',
52
+ details: [
53
+ 'Search and filter listings',
54
+ 'Review seller reputation',
55
+ 'Purchase with one transaction',
56
+ 'Funds held in smart contract escrow'
57
+ ]
58
+ },
59
+ {
60
+ icon: Shield,
61
+ title: 'Escrow Protection',
62
+ description: 'All purchases are protected by automatic escrow. Funds are only released when conditions are met.',
63
+ details: [
64
+ 'Buyer sends STX to escrow',
65
+ 'Seller ships the item',
66
+ 'Buyer confirms receipt',
67
+ 'Funds automatically released to seller'
68
+ ]
69
+ },
70
+ {
71
+ icon: MessageSquare,
72
+ title: 'Dispute Resolution',
73
+ description: 'If issues arise, our community arbitration system ensures fair resolution for all parties.',
74
+ details: [
75
+ 'Raise a dispute if needed',
76
+ 'Community arbitrators review',
77
+ 'Vote on fair resolution',
78
+ 'Automated execution of decision'
79
+ ]
80
+ },
81
+ {
82
+ icon: CheckCircle,
83
+ title: 'Build Reputation',
84
+ description: 'Rate transactions and build your on-chain reputation. Trust is earned and transparent.',
85
+ details: [
86
+ 'Rate each transaction',
87
+ 'Receive ratings from others',
88
+ 'Reputation stored on-chain',
89
+ 'Build trust with the community'
90
+ ]
91
+ }
92
+ ];
93
+
94
+ export default function HowItWorksPage() {
95
+ return (
96
+ <div className="min-h-screen flex flex-col bg-white dark:bg-black">
97
+ <TestnetBanner />
98
+ <Header />
99
+
100
+ <main className="flex-1">
101
+ {/* Hero Section */}
102
+ <section className="py-24 border-b border-gray-200 dark:border-gray-800">
103
+ <div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
104
+ <motion.div
105
+ initial="initial"
106
+ animate="animate"
107
+ variants={fadeInUp}
108
+ >
109
+ <h1 className="text-4xl sm:text-5xl font-bold text-black dark:text-white mb-6">
110
+ How Strade Works
111
+ </h1>
112
+ <p className="text-lg text-gray-600 dark:text-gray-400 max-w-2xl mx-auto">
113
+ Trading on Strade is simple, secure, and completely decentralized.
114
+ Here's everything you need to know.
115
+ </p>
116
+ </motion.div>
117
+ </div>
118
+ </section>
119
+
120
+ {/* Steps Section */}
121
+ <section className="py-24">
122
+ <div className="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8">
123
+ <div className="space-y-24">
124
+ {steps.map((step, index) => (
125
+ <motion.div
126
+ key={index}
127
+ initial={{ opacity: 0, y: 20 }}
128
+ whileInView={{ opacity: 1, y: 0 }}
129
+ viewport={{ once: true }}
130
+ transition={{ duration: 0.5, delay: index * 0.1 }}
131
+ className="relative"
132
+ >
133
+ <div className="flex flex-col md:flex-row gap-8 items-start">
134
+ {/* Step Number & Icon */}
135
+ <div className="flex-shrink-0">
136
+ <div className="flex items-center gap-4">
137
+ <div className="text-6xl font-bold text-gray-200 dark:text-gray-800">
138
+ {String(index + 1).padStart(2, '0')}
139
+ </div>
140
+ <div className="w-16 h-16 rounded-full bg-black dark:bg-white flex items-center justify-center">
141
+ <step.icon className="h-8 w-8 text-white dark:text-black" />
142
+ </div>
143
+ </div>
144
+ </div>
145
+
146
+ {/* Content */}
147
+ <div className="flex-1">
148
+ <h3 className="text-2xl font-bold text-black dark:text-white mb-3">
149
+ {step.title}
150
+ </h3>
151
+ <p className="text-gray-600 dark:text-gray-400 mb-6">
152
+ {step.description}
153
+ </p>
154
+
155
+ {/* Details List */}
156
+ <ul className="space-y-3">
157
+ {step.details.map((detail, detailIndex) => (
158
+ <li
159
+ key={detailIndex}
160
+ className="flex items-start gap-3 text-gray-700 dark:text-gray-300"
161
+ >
162
+ <ArrowRight className="h-5 w-5 flex-shrink-0 mt-0.5" />
163
+ <span>{detail}</span>
164
+ </li>
165
+ ))}
166
+ </ul>
167
+ </div>
168
+ </div>
169
+
170
+ {/* Connector Line */}
171
+ {index < steps.length - 1 && (
172
+ <div className="hidden md:block absolute left-8 top-24 bottom-0 w-px bg-gray-200 dark:bg-gray-800 -mb-24" />
173
+ )}
174
+ </motion.div>
175
+ ))}
176
+ </div>
177
+ </div>
178
+ </section>
179
+
180
+ {/* Smart Contract Benefits */}
181
+ <section className="py-24 bg-gray-50 dark:bg-gray-950 border-y border-gray-200 dark:border-gray-800">
182
+ <div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8">
183
+ <motion.div
184
+ initial={{ opacity: 0, y: 20 }}
185
+ whileInView={{ opacity: 1, y: 0 }}
186
+ viewport={{ once: true }}
187
+ transition={{ duration: 0.5 }}
188
+ className="text-center mb-12"
189
+ >
190
+ <h2 className="text-3xl font-bold text-black dark:text-white mb-4">
191
+ Why Smart Contracts Matter
192
+ </h2>
193
+ <p className="text-gray-600 dark:text-gray-400">
194
+ Traditional marketplaces require you to trust a middleman.
195
+ Strade eliminates this need entirely.
196
+ </p>
197
+ </motion.div>
198
+
199
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-8">
200
+ {[
201
+ {
202
+ title: 'Automated Escrow',
203
+ description: 'No need to trust the other party. Smart contracts hold funds until conditions are met.'
204
+ },
205
+ {
206
+ title: 'No Middlemen',
207
+ description: 'Trade directly with other users. No platform fees, no censorship, no data collection.'
208
+ },
209
+ {
210
+ title: 'Transparent Rules',
211
+ description: 'All contract logic is visible on-chain. Everyone plays by the same rules.'
212
+ },
213
+ {
214
+ title: 'Immutable Records',
215
+ description: 'All transactions are permanently recorded on the blockchain. Complete audit trail.'
216
+ }
217
+ ].map((benefit, index) => (
218
+ <motion.div
219
+ key={index}
220
+ initial={{ opacity: 0, y: 20 }}
221
+ whileInView={{ opacity: 1, y: 0 }}
222
+ viewport={{ once: true }}
223
+ transition={{ duration: 0.5, delay: index * 0.1 }}
224
+ className="p-6 bg-white dark:bg-black border border-gray-200 dark:border-gray-800 rounded-lg"
225
+ >
226
+ <h3 className="text-xl font-semibold text-black dark:text-white mb-2">
227
+ {benefit.title}
228
+ </h3>
229
+ <p className="text-gray-600 dark:text-gray-400">
230
+ {benefit.description}
231
+ </p>
232
+ </motion.div>
233
+ ))}
234
+ </div>
235
+ </div>
236
+ </section>
237
+
238
+ {/* CTA Section */}
239
+ <section className="py-24">
240
+ <div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
241
+ <motion.div
242
+ initial={{ opacity: 0, y: 20 }}
243
+ whileInView={{ opacity: 1, y: 0 }}
244
+ viewport={{ once: true }}
245
+ transition={{ duration: 0.5 }}
246
+ >
247
+ <h2 className="text-3xl font-bold text-black dark:text-white mb-4">
248
+ Ready to Get Started?
249
+ </h2>
250
+ <p className="text-gray-600 dark:text-gray-400 mb-8">
251
+ Join the decentralized marketplace revolution today
252
+ </p>
253
+ <div className="flex flex-col sm:flex-row gap-4 justify-center">
254
+ <Link href="/marketplace">
255
+ <Button size="lg" className="bg-black hover:bg-gray-800 dark:bg-white dark:hover:bg-gray-200 text-white dark:text-black px-8">
256
+ Start Trading
257
+ <ArrowRight className="ml-2 h-4 w-4" />
258
+ </Button>
259
+ </Link>
260
+ <Link href="/about">
261
+ <Button size="lg" variant="outline" className="border-black dark:border-white text-black dark:text-white hover:bg-gray-100 dark:hover:bg-gray-900 px-8">
262
+ Learn More
263
+ </Button>
264
+ </Link>
265
+ </div>
266
+ </motion.div>
267
+ </div>
268
+ </section>
269
+ </main>
270
+
271
+ <Footer />
272
+ </div>
273
+ );
274
+ }
@@ -0,0 +1,55 @@
1
+ import type { Metadata } from "next";
2
+ import { Geist, Geist_Mono } from "next/font/google";
3
+ import "./globals.css";
4
+ import { Toaster } from "@/components/ui/sonner";
5
+ import { ThemeProvider } from "@/components/providers/ThemeProvider";
6
+
7
+ const geistSans = Geist({
8
+ variable: "--font-geist-sans",
9
+ subsets: ["latin"],
10
+ });
11
+
12
+ const geistMono = Geist_Mono({
13
+ variable: "--font-geist-mono",
14
+ subsets: ["latin"],
15
+ });
16
+
17
+ export const metadata: Metadata = {
18
+ title: "Strade - Decentralized Marketplace on Stacks",
19
+ description: "Buy and sell goods securely on the blockchain. A decentralized marketplace with escrow, dispute resolution, and reputation system built on Stacks.",
20
+ keywords: ["blockchain", "marketplace", "stacks", "bitcoin", "decentralized", "web3", "crypto"],
21
+ authors: [{ name: "Strade Team" }],
22
+ openGraph: {
23
+ title: "Strade - Decentralized Marketplace",
24
+ description: "Buy and sell goods securely on the blockchain",
25
+ type: "website",
26
+ },
27
+ other: {
28
+ "talentapp:project_verification": "66a114e9792693ac64380fd0db52b2aaaf7f519b7ef40f198de9954371a889f410db07108ca9f99b923094c081c3a30a6ae887a5eca5b6f152d84c9442cea343"
29
+ },
30
+ };
31
+
32
+ export default function RootLayout({
33
+ children,
34
+ }: Readonly<{
35
+ children: React.ReactNode;
36
+ }>) {
37
+ return (
38
+ <html lang="en" className="h-full" suppressHydrationWarning>
39
+ <body
40
+ className={`${geistSans.variable} ${geistMono.variable} antialiased h-full`}
41
+ >
42
+ <ThemeProvider
43
+ attribute="class"
44
+ defaultTheme="system"
45
+ enableSystem
46
+ disableTransitionOnChange
47
+ >
48
+ {children}
49
+ <Toaster position="top-right" richColors />
50
+ </ThemeProvider>
51
+ </body>
52
+ </html>
53
+ );
54
+ }
55
+ // NotificationPanel