diff --git a/README.md b/README.md
index fb588ac3..821b02e5 100644
--- a/README.md
+++ b/README.md
@@ -11,6 +11,7 @@ Built with Next.js 15, React 19, TypeScript, and the Stellar Wallets Kit, Predic
## Features
- **Decentralized & Transparent**: All predictions are recorded on-chain with complete transparency. No central authority controls the outcomes.
+- **Shareable Prediction Receipts**: Completed predictions can now be shared with a polished receipt summary for campaigns such as GrantFox FWC26.
- **Instant Payouts**: Smart contracts automatically distribute winnings immediately after event resolution. No waiting periods.
- **Multi-Wallet Support**: Connect with your preferred Stellar wallet (Freighter, LOBSTR, XBull, Albedo, Rabet).
- **Real-Time Markets**: Access live prediction markets with real-time updates on odds, stakes, and participant activity.
diff --git a/app/components/ReceiptShare.tsx b/app/components/ReceiptShare.tsx
new file mode 100644
index 00000000..89301421
--- /dev/null
+++ b/app/components/ReceiptShare.tsx
@@ -0,0 +1,157 @@
+"use client"
+
+import { useMemo, useState } from "react"
+import { Check, Copy, Download, ExternalLink, Share2 } from "lucide-react"
+import { Button } from "@/components/ui/button"
+import {
+ Dialog,
+ DialogContent,
+ DialogDescription,
+ DialogHeader,
+ DialogTitle,
+ DialogTrigger,
+} from "@/components/ui/dialog"
+import { cn } from "@/lib/utils"
+
+interface ReceiptShareProps {
+ receiptId: string
+ marketTitle: string
+ outcome: string
+ amount: string
+ timestamp: string
+ campaign?: string
+ className?: string
+}
+
+function formatTimestamp(timestamp: string) {
+ const date = new Date(timestamp)
+
+ if (Number.isNaN(date.getTime())) {
+ return "Pending confirmation"
+ }
+
+ return date.toLocaleString("en-US", {
+ month: "short",
+ day: "numeric",
+ year: "numeric",
+ hour: "numeric",
+ minute: "2-digit",
+ })
+}
+
+export function ReceiptShare({
+ receiptId,
+ marketTitle,
+ outcome,
+ amount,
+ timestamp,
+ campaign = "GrantFox FWC26",
+ className,
+}: ReceiptShareProps) {
+ const [open, setOpen] = useState(false)
+ const [copied, setCopied] = useState(false)
+
+ const shareUrl = useMemo(
+ () => `https://predictify.app/receipts/${receiptId}`,
+ [receiptId],
+ )
+
+ const handleCopy = async () => {
+ if (typeof navigator === "undefined" || !navigator.clipboard?.writeText) {
+ return
+ }
+
+ await navigator.clipboard.writeText(shareUrl)
+ setCopied(true)
+ window.setTimeout(() => setCopied(false), 1800)
+ }
+
+ const handleDownload = () => {
+ const payload = [
+ `Receipt: ${receiptId}`,
+ `Market: ${marketTitle}`,
+ `Outcome: ${outcome}`,
+ `Amount: ${amount}`,
+ `Confirmed: ${formatTimestamp(timestamp)}`,
+ `Campaign: ${campaign}`,
+ ].join("\n")
+
+ const blob = new Blob([payload], { type: "text/plain;charset=utf-8" })
+ const url = URL.createObjectURL(blob)
+ const link = document.createElement("a")
+ link.href = url
+ link.download = `receipt-${receiptId}.txt`
+ link.click()
+ URL.revokeObjectURL(url)
+ }
+
+ return (
+
+ )
+}
diff --git a/app/components/__tests__/ReceiptShare.test.tsx b/app/components/__tests__/ReceiptShare.test.tsx
new file mode 100644
index 00000000..1cc4d9e6
--- /dev/null
+++ b/app/components/__tests__/ReceiptShare.test.tsx
@@ -0,0 +1,44 @@
+import React from "react"
+import { render, screen, fireEvent, waitFor } from "@testing-library/react"
+import { ReceiptShare } from "../ReceiptShare"
+
+const defaultProps = {
+ receiptId: "RCP-2026-001",
+ marketTitle: "Will the GrantFox campaign hit 10k signups?",
+ outcome: "Yes",
+ amount: "12.50 XLM",
+ timestamp: "2026-07-23T17:30:00.000Z",
+ campaign: "GrantFox FWC26",
+}
+
+describe("ReceiptShare", () => {
+ it("opens the share preview and renders the receipt details", async () => {
+ render(
Social preview layouts (1200x630)
+Social preview layouts and shareable prediction receipts (1200x630)