-
- }>
+ }
+ >
);
-}
\ No newline at end of file
+}
diff --git a/app/components/FAQ.tsx b/app/components/FAQ.tsx
index d2a33b5..4b9dd14 100644
--- a/app/components/FAQ.tsx
+++ b/app/components/FAQ.tsx
@@ -1,58 +1,61 @@
-'use client'
-import { useRef, useEffect } from 'react';
+"use client";
+import { useRef, useEffect } from "react";
// Combine all cards into one array
const allCards = [
{
- id: '01',
+ id: "01",
question: "What fees do I pay to use BitSave?",
- answer: "You pay a $1 fee per savings plan, split evenly between the CryptoSmart wallet (for operational costs) and the Buy Back Wallet (for $BTS buybacks).",
- color: 'bg-[#81D7B4]/10',
- pinColor: 'bg-[#81D7B4]',
- hoverColor: 'hover:bg-[#81D7B4]/20'
+ answer:
+ "You pay a $1 fee per savings plan, split evenly between the CryptoSmart wallet (for operational costs) and the Buy Back Wallet (for $BTS buybacks).",
+ color: "bg-[#81D7B4]/10",
+ pinColor: "bg-[#81D7B4]",
+ hoverColor: "hover:bg-[#81D7B4]/20",
},
{
- id: '02',
+ id: "02",
question: "Can I create multiple savings plans?",
- answer: "Yes, users can create multiple savings plans, each with its own principal, lock period, and penalty settings (10%β30%).",
- color: 'bg-[#81D7B4]/5',
- pinColor: 'bg-[#81D7B4]',
- hoverColor: 'hover:bg-[#81D7B4]/15'
+ answer:
+ "Yes, users can create multiple savings plans, each with its own principal, lock period, and penalty settings (10%β30%).",
+ color: "bg-[#81D7B4]/5",
+ pinColor: "bg-[#81D7B4]",
+ hoverColor: "hover:bg-[#81D7B4]/15",
},
{
- id: '03',
+ id: "03",
question: "What is the penalty for breaking a savings plan?",
- answer: "You set the penalty (10%β30% of your savings) when creating the plan. If you break it early, this penalty is deducted and sent to the CryptoSmart wallet.",
- color: 'bg-[#81D7B4]/8',
- pinColor: 'bg-[#81D7B4]',
- hoverColor: 'hover:bg-[#81D7B4]/18'
+ answer:
+ "You set the penalty (10%β30% of your savings) when creating the plan. If you break it early, this penalty is deducted and sent to the CryptoSmart wallet.",
+ color: "bg-[#81D7B4]/8",
+ pinColor: "bg-[#81D7B4]",
+ hoverColor: "hover:bg-[#81D7B4]/18",
},
{
- id: '04',
+ id: "04",
question: "Still have questions?",
- answer: "Our team is available 24/7 to help you with any questions about BitSave. We're here to support your crypto savings journey.",
- color: 'bg-[#81D7B4]/5',
- pinColor: 'bg-[#81D7B4]',
- hoverColor: 'hover:bg-[#81D7B4]/15',
- isContact: true
- }
+ answer:
+ "Our team is available 24/7 to help you with any questions about BitSave. We're here to support your crypto savings journey.",
+ color: "bg-[#81D7B4]/5",
+ pinColor: "bg-[#81D7B4]",
+ hoverColor: "hover:bg-[#81D7B4]/15",
+ isContact: true,
+ },
];
export default function FAQ() {
const sectionRef = useRef(null);
-
+
// Handle mouse movement for interactive background elements
useEffect(() => {
const handleMouseMove = (e: MouseEvent) => {
if (!sectionRef.current) return;
-
-
- const glowElements = sectionRef.current.querySelectorAll('.glow-element');
+
+ const glowElements = sectionRef.current.querySelectorAll(".glow-element");
const { left, top, width, height } = sectionRef.current.getBoundingClientRect();
-
+
const x = (e.clientX - left) / width;
const y = (e.clientY - top) / height;
-
+
glowElements.forEach((glow, index) => {
const glowElement = glow as HTMLElement;
const offsetX = (x - 0.5) * (20 + index * 5);
@@ -60,17 +63,21 @@ export default function FAQ() {
glowElement.style.transform = `translate(${offsetX}px, ${offsetY}px)`;
});
};
-
- document.addEventListener('mousemove', handleMouseMove);
- return () => document.removeEventListener('mousemove', handleMouseMove);
+
+ document.addEventListener("mousemove", handleMouseMove);
+ return () => document.removeEventListener("mousemove", handleMouseMove);
}, []);
return (
-
+
{/* Background Elements */}
-
+
{/* Floating Elements */}
@@ -79,38 +86,39 @@ export default function FAQ() {
{/* Section Header */}
-
-
-
+
+
+
- Common Questions
+
+ Common Questions
+
-
+
Frequently Asked Questions
-
+
Everything you need to know about savings with BitSave's innovative crypto platform
-
+
{/* FAQ Grid */}
{allCards.map((card) => (
-
-
+
+
{/* Background Effects */}
-
-
+
+
{/* Content */}
{/* Question Number & Pin */}
@@ -120,7 +128,7 @@ export default function FAQ() {
{card.id}
-
))}
-
+
-
+
{/* Decorative elements */}
-
+
{/* styles for the security-card class */}
);
-}
\ No newline at end of file
+}
diff --git a/app/components/Features.tsx b/app/components/Features.tsx
index ffd2f25..ad10976 100644
--- a/app/components/Features.tsx
+++ b/app/components/Features.tsx
@@ -1,54 +1,106 @@
-'use client'
+"use client";
export default function Features() {
const featureItems = [
{
title: "Designed for Secure Savings",
- description: "Bitsave provides goal-based savings plans with non-custodial smart contracts; you own your funds, withdraw your savings at any time.",
- detail: "Stable & Secure SavingsEnables recurring stablecoin savings, no risks of market volatility on your stable coin savings.",
+ description:
+ "Bitsave provides goal-based savings plans with non-custodial smart contracts; you own your funds, withdraw your savings at any time.",
+ detail:
+ "Stable & Secure SavingsEnables recurring stablecoin savings, no risks of market volatility on your stable coin savings.",
icon: (
-
-
-
-
+
+
+
+
),
- color: "primary"
+ color: "primary",
},
{
title: "Designed for Simplicity",
- description: "Experience a clean and intuitive savings experience, on-chain savings easier than saving in a traditional account.",
- detail: "No DeFi Jargon, Just Simple Savings,No complex staking, yield farming, or tradingβjust secure, goal-based savings with a user-friendly interface",
+ description:
+ "Experience a clean and intuitive savings experience, on-chain savings easier than saving in a traditional account.",
+ detail:
+ "No DeFi Jargon, Just Simple Savings,No complex staking, yield farming, or tradingβjust secure, goal-based savings with a user-friendly interface",
icon: (
-
-
+
+
),
- color: "secondary"
+ color: "secondary",
},
{
title: "Designed for Security & Control",
- description: "Peace of mind with a non-custodial savings model, users have full control of their savings.",
- detail: "Parent-child Smart Contracts structure for Security Each savings plan is stored in a user-owned smart contract (child contract), reducing risks of hacks or centralized failures. No pooled funds. Just secure, private savings.",
+ description:
+ "Peace of mind with a non-custodial savings model, users have full control of their savings.",
+ detail:
+ "Parent-child Smart Contracts structure for Security Each savings plan is stored in a user-owned smart contract (child contract), reducing risks of hacks or centralized failures. No pooled funds. Just secure, private savings.",
icon: (
-
-
+
+
),
- color: "accent"
- }
+ color: "accent",
+ },
];
return (
-
+
{/* Enhanced background elements */}
-
+
{/* Decorative elements */}
-
+
{/* Enhanced title with decorative elements - Centered and more stunning */}
@@ -57,57 +109,64 @@ export default function Features() {
{/* Holographic shimmer effect */}
-
+
- Powerful Features
+
+ Powerful Features
+
-
+
Key Features
-
+
- Designed for growth, ease, and peace of mind - everything you need for successful crypto savings
+ Designed for growth, ease, and peace of mind - everything you need for successful crypto
+ savings
-
+
{featureItems.map((feature, index) => (
-
-
+
-
+
{feature.icon.props.children}
-
+
{feature.title}
-
-
- {feature.description}
-
-
+
+
{feature.description}
+
Strategy: {feature.detail}
-
+
{/* Add glowing dot indicator */}
-
+
{/* Decorative corner accent */}
@@ -115,11 +174,12 @@ export default function Features() {
))}
@@ -78,7 +76,9 @@ export default function Footer() {
@@ -312,23 +380,27 @@ export default function Hero() {
{/* Enhanced background with geometric patterns */}
-
+ backgroundSize: "100px 100px",
+ }}
+ >
-
+
Supported Ecosystems
- Seamlessly save and earn across multiple blockchain networks with our unified platform
+ Seamlessly save and earn across multiple blockchain networks with our unified
+ platform
-
+
{/* Enhanced ecosystem cards */}
{/* Celo Card */}
@@ -336,24 +408,25 @@ export default function Hero() {
{/* Enhanced background effects */}
-
+
{/* Larger logo container */}
-
-
+
Celo Network
- Mobile-first blockchain platform focused on financial inclusion and accessibility
+ Mobile-first blockchain platform focused on financial inclusion and
+ accessibility
Ethereum L2 solution built by Coinbase for secure, low-cost transactions
-
+
{/* Modern status indicator */}
@@ -406,22 +479,40 @@ export default function Hero() {
);
-}
\ No newline at end of file
+}
diff --git a/app/components/HowItWorks.tsx b/app/components/HowItWorks.tsx
index 6c97b82..d91cc50 100644
--- a/app/components/HowItWorks.tsx
+++ b/app/components/HowItWorks.tsx
@@ -1,66 +1,106 @@
-'use client'
+"use client";
-import { useRef, useState } from 'react';
+import { useRef, useState } from "react";
export default function HowItWorks() {
const sectionRef = useRef(null);
const [activeStep, setActiveStep] = useState(0);
-
+
// Step data with updated content
const steps = [
{
number: "01",
title: "Connect Wallet",
- description: "Compatible with Coinbase wallet, MetaMask, WalletConnect, and other popular wallets.",
+ description:
+ "Compatible with Coinbase wallet, MetaMask, WalletConnect, and other popular wallets.",
icon: (
-
-
+
+
- )
+ ),
},
{
number: "02",
title: "Fund Your Wallet",
- description: "Deposit any stable coin like USDC into your connected wallet. We support a wide range of stable coins.",
+ description:
+ "Deposit any stable coin like USDC into your connected wallet. We support a wide range of stable coins.",
icon: (
-
-
+
+
- )
+ ),
},
{
number: "03",
title: "Create Your Savings",
- description: "With just a few clicks; choose your assets, set your savings goals, and save for your rent, schoolfees, vacation etc.",
+ description:
+ "With just a few clicks; choose your assets, set your savings goals, and save for your rent, schoolfees, vacation etc.",
icon: (
-
-
+
+
- )
- }
+ ),
+ },
];
return (
-
+
{/* Enhanced background elements */}
-
+
{/* Decorative blobs */}
-
+
{/* Enhanced floating particles */}
{Array.from({ length: 20 }).map((_, i) => {
const top = (i * 7) % 100;
const left = (i * 6) % 100;
const size = 1 + (i % 4);
-
+
return (
-
-
+
{/* Enhanced title section */}
-
+
{/* Enhanced badge */}
{/* Holographic shimmer effect */}
-
+
- Simple Process
+
+ Simple Process
+
-
-
- How It Works
-
+
+
+
+ How It Works
+
+
-
-
+
+
Start your crypto savings journey in three simple steps
-
+
{/* Enhanced steps with modern cards */}
{/* Connecting line with animation */}
-
+
{/* Steps in a responsive row/column layout */}
{steps.map((step, index) => (
-
setActiveStep(index)}
@@ -119,50 +175,57 @@ export default function HowItWorks() {
{step.number}
-
+
{/* Card with enhanced glassmorphism and hover effects */}
{/* Problem Number */}
@@ -220,25 +272,38 @@ export default function Security() {
-
-
+
+
Problem {num}
-
-
-
+
+
+
{/* Problem Text */}
- {num === 1 && "Ifeanyi earns from his Web3 job and wants to save onchain, but there aren't any savings protocolsβonly investments protocols (DeFi)."}
- {num === 2 && "If Ifeanyi saves with a DeFi protocol, he'll have to deal with complex DeFi UX and also lose his savings to market volatility."}
- {num === 3 && "Ifeanyi also doesn't want to get tempted to touch his rent savings, by risking it in a degen trade to make a quick 2x."}
+ {num === 1 &&
+ "Ifeanyi earns from his Web3 job and wants to save onchain, but there aren't any savings protocolsβonly investments protocols (DeFi)."}
+ {num === 2 &&
+ "If Ifeanyi saves with a DeFi protocol, he'll have to deal with complex DeFi UX and also lose his savings to market volatility."}
+ {num === 3 &&
+ "Ifeanyi also doesn't want to get tempted to touch his rent savings, by risking it in a degen trade to make a quick 2x."}
-
-
+
+
))}
@@ -250,14 +315,16 @@ export default function Security() {
-
-
-
Rukevwe
+
+
+ Rukevwe
+
saves with banks
@@ -266,7 +333,7 @@ export default function Security() {
{/* Problem Number */}
@@ -288,8 +355,18 @@ export default function Security() {
-
-
+
+
@@ -298,15 +375,18 @@ export default function Security() {
-
+
{/* Problem Text */}
- {num === 1 && "Rukevwe wants to avoid the Inflation on her local currency and the devaluation that affects her savings"}
- {num === 2 && "She tried to save in dollars through her banks but she needed to have at least $100 to begin, and the fees were expensive."}
- {num === 3 && "Her friend told her about using DeFi protocols, but she couldn't understand the UX."}
+ {num === 1 &&
+ "Rukevwe wants to avoid the Inflation on her local currency and the devaluation that affects her savings"}
+ {num === 2 &&
+ "She tried to save in dollars through her banks but she needed to have at least $100 to begin, and the fees were expensive."}
+ {num === 3 &&
+ "Her friend told her about using DeFi protocols, but she couldn't understand the UX."}
-
-
+
+
))}
@@ -317,18 +397,18 @@ export default function Security() {
{/* Solutions Section */}
-
+
{/* Enhanced badge with glow effect */}
-
+
- The Solution
+
+ The Solution
+
-
+
The Bitsave Solution
@@ -349,43 +429,79 @@ export default function Security() {
{/* Decorative SVG Elements */}
@@ -510,19 +664,19 @@ export default function Security() {
{/* Market Opportunity Section */}
-
+
{/* Enhanced badge with glow effect */}
-
+
- Market Opportunity
+
+ Market Opportunity
+
-
+
The SaveFi Market Opportunity
@@ -535,11 +689,14 @@ export default function Security() {
{/* Neomorphic Background with Web3 Elements */}
-
+
{/* Floating Elements */}
-
-
+
+
{/* Content Grid */}
{/* Left Column - Main Text */}
@@ -548,7 +705,9 @@ export default function Security() {
- Web3 already has DeFi, Bitsave introduces SaveFi, a trend that normalizes onchain savings rather than onchain investments.
+ Web3 already has DeFi, Bitsave introduces{" "}
+ SaveFi, a trend that
+ normalizes onchain savings rather than onchain investments.
@@ -559,7 +718,10 @@ export default function Security() {
70%+
-
of onchain users engage in frequent trading, with no structured savings behavior.
+
+ of onchain users engage in frequent trading, with no structured savings
+ behavior.
+
@@ -568,7 +730,10 @@ export default function Security() {
60%+
-
of Web3 income earners admit to dipping into savings meant for essentials like rent, tuition, or bills.
+
+ of Web3 income earners admit to dipping into savings meant for essentials
+ like rent, tuition, or bills.
+
@@ -582,32 +747,59 @@ export default function Security() {
-
-
+
+
Market Size
- 190,000+ people currently earn from web3 jobs, but no onchain Savings protocol exists in web3 to serve them.
+ 190,000+ people currently
+ earn from web3 jobs, but no onchain Savings protocol exists in web3 to serve
+ them.
-
+
{/* Adoption Card */}
-
-
-
+
+
+
Stablecoin Adoption
- Stable coins are getting increased adoption in web2 spaces and African regions like Shopify enabling USDC payments. The next urgent need is not spending tools, but savings tools.
+ Stable coins are getting increased adoption in web2 spaces and African regions
+ like Shopify enabling USDC payments. The next urgent need is not spending
+ tools, but savings tools
+ .
@@ -619,11 +811,11 @@ export default function Security() {
Bitsave fills this gap by offering SaveFi
-
Earn More Points
-
- Complete these tasks to earn points and unlock exclusive rewards in the BitSave ecosystem
+ Complete these tasks to earn points and unlock exclusive rewards in the BitSave
+ ecosystem
)}
@@ -1280,23 +1130,31 @@ export default function CreateSavingsPage() {
{/* Title and Message */}
{success ? (
<>
-
Savings Plan Created!
+
+ Savings Plan Created!
+
- Your Transaction to create your savings plan has been processed and is successful.
+ Your Transaction to create your savings plan has been processed and is
+ successful.
You cancelled the transaction in your wallet. No changes were made.
>
) : (
<>
-
Savings Plan Creation Failed
+
+ Savings Plan Creation Failed
+
- Your savings plan creation failed. Please try again or contact our support team for assistance.
+ Your savings plan creation failed. Please try again or contact our support team
+ for assistance.
{error && (
Error Details:
@@ -1304,23 +1162,44 @@ export default function CreateSavingsPage() {
{(() => {
// Enhanced error extraction and user-friendly messages
const lowerError = error.toLowerCase();
- if (error.includes("missing revert data") || lowerError.includes("call_exception")) {
+ if (
+ error.includes("missing revert data") ||
+ lowerError.includes("call_exception")
+ ) {
return "πΈ Transaction failed - This usually means insufficient funds for gas fees or the contract couldn't process your request. Please check your wallet balance and ensure you have enough ETH/native tokens for gas fees, then try again.";
- } else if (error.includes("INVALID_ARGUMENT") || lowerError.includes("invalid argument")) {
+ } else if (
+ error.includes("INVALID_ARGUMENT") ||
+ lowerError.includes("invalid argument")
+ ) {
return "β Invalid savings plan parameters. Please check your inputs and try again.";
- } else if (lowerError.includes("insufficient funds") || lowerError.includes("insufficient balance")) {
+ } else if (
+ lowerError.includes("insufficient funds") ||
+ lowerError.includes("insufficient balance")
+ ) {
return "π° Insufficient funds. Please check your wallet balance and ensure you have enough for both the savings amount and gas fees.";
- } else if (lowerError.includes("user rejected") || lowerError.includes("user denied")) {
+ } else if (
+ lowerError.includes("user rejected") ||
+ lowerError.includes("user denied")
+ ) {
return "π« Transaction was cancelled by user. No savings plan was created.";
- } else if (lowerError.includes("network") || lowerError.includes("connection")) {
+ } else if (
+ lowerError.includes("network") ||
+ lowerError.includes("connection")
+ ) {
return "π Network connection issue. Please check your internet connection and try again.";
} else if (lowerError.includes("gas")) {
return "β½ Gas estimation failed. Try increasing gas limit or check network congestion.";
} else if (lowerError.includes("nonce")) {
return "π Transaction nonce error. Please reset your wallet or try again.";
- } else if (lowerError.includes("allowance") || lowerError.includes("approval")) {
+ } else if (
+ lowerError.includes("allowance") ||
+ lowerError.includes("approval")
+ ) {
return "π Token allowance issue. Please approve the token spending and try again.";
- } else if (lowerError.includes("plan name") || lowerError.includes("name already exists")) {
+ } else if (
+ lowerError.includes("plan name") ||
+ lowerError.includes("name already exists")
+ ) {
return "π Plan name already exists. Please choose a different name for your savings plan.";
} else if (error.includes("code=")) {
const codeMatch = error.match(/code=([A-Z_]+)/);
@@ -1333,16 +1212,17 @@ export default function CreateSavingsPage() {
})()}
- Original Error:{error}
+ Original Error:{" "}
+ {error}
- Your savings will start today and end on your selected date. Choose an end date at least 30 days from now.
+ Your savings will start today and end on your selected date. Choose an
+ end date at least 30 days from now.
- Setting a penalty helps you stay committed to your savings goal. If you withdraw funds before the end date, this percentage will be deducted.
+ Setting a penalty helps you stay committed to your savings goal. If you
+ withdraw funds before the end date, this percentage will be deducted.
@@ -329,22 +377,22 @@ export default function LeaderboardPage() {
)}
-
+
{/* Your Position Card */}
-
+
Your Position
- {currentUserPosition
- ? `You're ranked #${currentUserPosition.rank} on the leaderboard!`
+ {currentUserPosition
+ ? `You're ranked #${currentUserPosition.rank} on the leaderboard!`
: "Start saving to appear on the leaderboard!"}
{/* Savings plan cards with empty states */}
- {activeTab === 'current' && (
+ {activeTab === "current" && (
{isLoading ? (
@@ -1274,7 +1372,10 @@ export default function Dashboard() {
<>
{/* Show only first 3 plans on dashboard */}
{savingsData.currentPlans.slice(0, 3).map((plan) => (
-
@@ -1379,13 +1561,19 @@ export default function Dashboard() {
{/* Info Icon and Label */}
-
+
i
- Withdrawing before the set completion date will forfeit your $BTS rewards and incur a penalty on your savings.
+ Withdrawing before the set completion date will forfeit your $BTS rewards
+ and incur a penalty on your savings.
- Early withdrawal results in loss of rewards and a penalty fee.
+
+ Early withdrawal results in loss of rewards and a penalty fee.
+
@@ -1425,7 +1631,10 @@ export default function Dashboard() {
<>
{/* Show only first 3 completed plans on dashboard */}
{savingsData.completedPlans.slice(0, 3).map((plan) => (
-
@@ -1530,13 +1820,19 @@ export default function Dashboard() {
{/* Info Icon and Label */}
-
+
i
- Withdrawing before the set completion date will forfeit your $BTS rewards and incur a penalty on your savings.
+ Withdrawing before the set completion date will forfeit your $BTS rewards
+ and incur a penalty on your savings.
- Early withdrawal results in loss of rewards and a penalty fee.
+
+ Early withdrawal results in loss of rewards and a penalty fee.
+
@@ -585,8 +746,19 @@ export default function PlansPage() {
-
-
+
+
Total Saved
@@ -594,8 +766,19 @@ export default function PlansPage() {
${savingsData.totalLocked}
-
-
+
+
Across all savings plans
@@ -608,19 +791,45 @@ export default function PlansPage() {
-
-
+
+
Active Goals
-
{savingsData.currentPlans.length}
+
+ {savingsData.currentPlans.length}
+
-
-
+
+
- {savingsData.currentPlans.length > 0 ? `${savingsData.currentPlans.length} active plans` : 'No active plans'}
+ {savingsData.currentPlans.length > 0
+ ? `${savingsData.currentPlans.length} active plans`
+ : "No active plans"}
@@ -631,8 +840,19 @@ export default function PlansPage() {
-
-
+
+
Total Deposits
@@ -640,10 +860,23 @@ export default function PlansPage() {
{savingsData.deposits}
-
-
+
+
- {savingsData.deposits > 0 ? `${savingsData.deposits} total deposits` : 'No deposits yet'}
+ {savingsData.deposits > 0
+ ? `${savingsData.deposits} total deposits`
+ : "No deposits yet"}
@@ -655,25 +888,58 @@ export default function PlansPage() {
-
-
+
+
-
Build Your Financial Safety Net
-
Every dollar saved today is peace of mind for tomorrow. Consistent saving creates a buffer against life's uncertainties while helping you achieve your most important goals.
+
+ Build Your Financial Safety Net
+
+
+ Every dollar saved today is peace of mind for tomorrow. Consistent saving creates
+ a buffer against life's uncertainties while helping you achieve your most
+ important goals.
+
-
-
+
+
-
Spread Your Financial Wings
-
Diversifying across assets and networks reduces risk while maximizing potential returns. A balanced savings portfolio protects you against market volatility.
+
+ Spread Your Financial Wings
+
+
+ Diversifying across assets and networks reduces risk while maximizing potential
+ returns. A balanced savings portfolio protects you against market volatility.
+
+
+ Account Settings
+
+
+
+
+ Settings
+
+
+
+ Customize your BitSave experience,
+ connect social accounts, and manage your preferences with our modern, intuitive
+ interface.
+
+
+
+
+
+ {/* Modern Layout */}
+
+ {/* Profile Settings Card - Full Width */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Profile Settings
+
+
+ Manage your identity and social connections
+
+
+
+
+
+ Live
+
+
+
+ {/* Display Name from Social Connections */}
+
+
+
+
+
+
+
+
Display Name
+
+
+
+
+
+
+
+ Your display name is automatically pulled from your connected social accounts.
+
+ Connect your social accounts below
+ {" "}
+ to set your display name.
+
+ Connect your social accounts to automatically set your display name and
+ enhance your profile with verified social presence.
+
+
+
+
+
+
+
+ {/* ENS Option - Coming Soon */}
+
+
+
+
+
+
+
-
- Not Connected
-
-
+
ENS Domain
+
+
+ COMING SOON
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
π‘ Pro Tip
-
- Connect your social accounts to automatically set your display name and enhance your profile with verified social presence.
+
+
+ Ethereum Name Service Integration
+
+
+ Soon you'll be able to use your{" "}
+ .eth domain as your
+ display name, making your identity more memorable and professional across
+ the decentralized web.
+
-
-
-
-
-
-
- {/* ENS Option - Coming Soon */}
-
-
-
-
-
-
-
-
-
ENS Domain
-
- COMING SOON
-
-
-
-
-
-
-
-
-
-
-
-
-
Ethereum Name Service Integration
-
- Soon you'll be able to use your .eth domain as your display name,
- making your identity more memorable and professional across the decentralized web.
-
);
};
-export default TwitterFeed;
\ No newline at end of file
+export default TwitterFeed;
diff --git a/app/dashboard/social/page.tsx b/app/dashboard/social/page.tsx
index 71e832c..559ba98 100644
--- a/app/dashboard/social/page.tsx
+++ b/app/dashboard/social/page.tsx
@@ -1,14 +1,14 @@
-"use client"
-import { useState, ReactNode, lazy, Suspense, memo, useMemo, useEffect } from 'react'
-import { motion } from 'framer-motion'
-import { Space_Grotesk } from 'next/font/google'
-import Link from 'next/link'
-import { useReferrals } from '@/lib/useReferrals'
+"use client";
+import { useState, ReactNode, lazy, Suspense, memo, useMemo, useEffect } from "react";
+import { motion } from "framer-motion";
+import { Space_Grotesk } from "next/font/google";
+import Link from "next/link";
+import { useReferrals } from "@/lib/useReferrals";
// Lazy load heavy components
-const TwitterFeed = lazy(() => import('./components/TwitterFeed'))
-const SavvyFinanceVideos = lazy(() => import('./components/SavvyFinanceVideos'))
-const LoadingSpinner = lazy(() => import('./components/LoadingSpinner'))
+const TwitterFeed = lazy(() => import("./components/TwitterFeed"));
+const SavvyFinanceVideos = lazy(() => import("./components/SavvyFinanceVideos"));
+const LoadingSpinner = lazy(() => import("./components/LoadingSpinner"));
// Declare Twitter widgets for TypeScript
declare global {
@@ -16,16 +16,20 @@ declare global {
twttr: {
widgets: {
load: () => void;
- createTweet: (tweetId: string, container: HTMLElement, options?: object) => Promise;
+ createTweet: (
+ tweetId: string,
+ container: HTMLElement,
+ options?: object,
+ ) => Promise;
};
};
}
}
const spaceGrotesk = Space_Grotesk({
- subsets: ['latin'],
- display: 'swap',
-})
+ subsets: ["latin"],
+ display: "swap",
+});
// Mock data for demonstration
const MOCK_USER_DATA = {
@@ -34,53 +38,53 @@ const MOCK_USER_DATA = {
hasConnectedFarcaster: true,
hasEmail: true,
userPoints: 0, // Start with 0 points, will be updated based on actual activity
-}
+};
const twitterLinks = [
- 'https://x.com/bitsaveprotocol/status/1937769440806076921?s=46',
- 'https://x.com/benedictfrank_/status/1923176035505344973?s=46',
- 'https://x.com/mamin_xyz/status/1933100118766416048?s=46',
- 'https://x.com/thedesign_dr/status/1928114921230803107?s=46',
- 'https://x.com/lighter_defi/status/1935946790240489699?s=46',
- 'https://x.com/sapphsparkles/status/1934659049544667648?s=46',
- 'https://x.com/mamin_xyz/status/1904884465320472905?s=46',
- 'https://x.com/alamzy001/status/1922675320861212679?s=46',
-]
+ "https://x.com/bitsaveprotocol/status/1937769440806076921?s=46",
+ "https://x.com/benedictfrank_/status/1923176035505344973?s=46",
+ "https://x.com/mamin_xyz/status/1933100118766416048?s=46",
+ "https://x.com/thedesign_dr/status/1928114921230803107?s=46",
+ "https://x.com/lighter_defi/status/1935946790240489699?s=46",
+ "https://x.com/sapphsparkles/status/1934659049544667648?s=46",
+ "https://x.com/mamin_xyz/status/1904884465320472905?s=46",
+ "https://x.com/alamzy001/status/1922675320861212679?s=46",
+];
const savvyFinanceVideos = [
{
- id: 'PdwOltnBznE',
- title: 'Video Title',
- thumbnail: 'https://img.youtube.com/vi/PdwOltnBznE/maxresdefault.jpg',
- creator: 'Savvy Finance',
- embedUrl: 'https://www.youtube.com/embed/PdwOltnBznE',
- url: 'https://youtu.be/PdwOltnBznE?si=UK15zqZUVEid9qt4',
+ id: "PdwOltnBznE",
+ title: "Video Title",
+ thumbnail: "https://img.youtube.com/vi/PdwOltnBznE/maxresdefault.jpg",
+ creator: "Savvy Finance",
+ embedUrl: "https://www.youtube.com/embed/PdwOltnBznE",
+ url: "https://youtu.be/PdwOltnBznE?si=UK15zqZUVEid9qt4",
},
{
- id: 'z1zvOmhfA0k',
- title: 'Video Title',
- thumbnail: 'https://img.youtube.com/vi/z1zvOmhfA0k/maxresdefault.jpg',
- creator: 'Savvy Finance',
- embedUrl: 'https://www.youtube.com/embed/z1zvOmhfA0k',
- url: 'https://youtube.com/shorts/z1zvOmhfA0k?feature=share',
+ id: "z1zvOmhfA0k",
+ title: "Video Title",
+ thumbnail: "https://img.youtube.com/vi/z1zvOmhfA0k/maxresdefault.jpg",
+ creator: "Savvy Finance",
+ embedUrl: "https://www.youtube.com/embed/z1zvOmhfA0k",
+ url: "https://youtube.com/shorts/z1zvOmhfA0k?feature=share",
},
{
- id: 'CWRQ7rgtHzU',
- title: 'Video Title',
- thumbnail: 'https://img.youtube.com/vi/CWRQ7rgtHzU/maxresdefault.jpg',
- creator: 'Savvy Finance',
- embedUrl: 'https://www.youtube.com/embed/CWRQ7rgtHzU',
- url: 'https://youtube.com/shorts/CWRQ7rgtHzU?feature=share',
+ id: "CWRQ7rgtHzU",
+ title: "Video Title",
+ thumbnail: "https://img.youtube.com/vi/CWRQ7rgtHzU/maxresdefault.jpg",
+ creator: "Savvy Finance",
+ embedUrl: "https://www.youtube.com/embed/CWRQ7rgtHzU",
+ url: "https://youtube.com/shorts/CWRQ7rgtHzU?feature=share",
},
{
- id: '2QzgDb-27BQ',
- title: 'Video Title',
- thumbnail: 'https://img.youtube.com/vi/2QzgDb-27BQ/maxresdefault.jpg',
- creator: 'Savvy Finance',
- embedUrl: 'https://www.youtube.com/embed/2QzgDb-27BQ',
- url: 'https://youtube.com/shorts/2QzgDb-27BQ?si=zcTRpALVASP_WcSl',
+ id: "2QzgDb-27BQ",
+ title: "Video Title",
+ thumbnail: "https://img.youtube.com/vi/2QzgDb-27BQ/maxresdefault.jpg",
+ creator: "Savvy Finance",
+ embedUrl: "https://www.youtube.com/embed/2QzgDb-27BQ",
+ url: "https://youtube.com/shorts/2QzgDb-27BQ?si=zcTRpALVASP_WcSl",
},
-]
+];
interface Task {
id: string;
@@ -93,130 +97,256 @@ interface Task {
}
export default function SavvySpacePage() {
- const [userData] = useState(MOCK_USER_DATA)
- const [showModal, setShowModal] = useState(false)
- const { referralData, loading: referralLoading, generateReferralCode } = useReferrals()
-
+ const [userData] = useState(MOCK_USER_DATA);
+ const [showModal, setShowModal] = useState(false);
+ const { referralData, loading: referralLoading, generateReferralCode } = useReferrals();
+
const copyToClipboard = async (text: string) => {
try {
- await navigator.clipboard.writeText(text)
- setShowModal(true)
+ await navigator.clipboard.writeText(text);
+ setShowModal(true);
// Auto-hide modal after 2 seconds
- setTimeout(() => setShowModal(false), 2000)
+ setTimeout(() => setShowModal(false), 2000);
} catch (err) {
- console.error('Failed to copy text: ', err)
+ console.error("Failed to copy text: ", err);
}
- }
-
+ };
+
// Generate referral code on component mount if user doesn't have one
useEffect(() => {
if (!referralData && !referralLoading) {
- generateReferralCode()
+ generateReferralCode();
}
- }, [referralData, referralLoading, generateReferralCode])
-
- const referralLink = referralData?.referralLink || 'https://bitsave.io'
-
- const tasks: Task[] = useMemo(() => [
- {
- id: 'tweet_after_saving',
- title: 'Tweet after Saving',
- description: 'Get 1 point for the tweet you send after creating a new savings plan.',
- points: 1,
- isCompleted: false, // This would be tracked via backend
- href: '/dashboard/create-savings',
- icon: 'tweet',
- },
- {
- id: 'connect_x',
- title: 'Connect X (Twitter)',
- description: 'Link your X account to earn points and unlock social features.',
- points: 1,
- isCompleted: false,
- href: '/dashboard/settings',
- icon: 'twitter',
- },
- {
- id: 'connect_farcaster',
- title: 'Connect Farcaster',
- description: 'Link your Farcaster account for onchain perks and rewards.',
- points: 1,
- isCompleted: false,
- href: '/dashboard/settings',
- icon: 'farcaster',
- },
- {
- id: 'add_email',
- title: 'Add Email Address',
- description: 'Secure your account and get important notifications.',
- points: 1,
- isCompleted: false,
- href: '/dashboard/settings',
- icon: 'email',
- },
- {
- id: 'tweet_about_bitsave',
- title: 'Tweet about BitSave',
- description: 'Share your experience with BitSave on X.',
- points: 5,
- isCompleted: false, // This would be tracked via backend
- href: `https://twitter.com/intent/tweet?text=Just%20started%20my%20crypto%20savings%20journey%20with%20@BitSaveApp!%20%F0%9F%9A%80%20Secure,%20transparent,%20and%20rewarding.%20Join%20me%20in%20building%20better%20financial%20habits!%20%23SaveFi%20%23Web3&url=${encodeURIComponent(referralLink)}`,
- icon: 'tweet',
- },
- {
- id: 'cast_about_bitsave',
- title: 'Cast about BitSave',
- description: 'Post about BitSave on Farcaster.',
- points: 5,
- isCompleted: false, // This would be tracked via backend
- href: `https://warpcast.com/~/compose?text=Just%20started%20my%20crypto%20savings%20journey%20with%20BitSave!%20%F0%9F%9A%80%20Secure,%20transparent,%20and%20rewarding.%20Join%20me%20in%20building%20better%20financial%20habits!%20%23SaveFi%20%23Web3&embeds[]=${encodeURIComponent(referralLink)}`,
- icon: 'cast',
- },
- {
- id: 'referral_signup',
- title: 'Refer a Friend',
- description: 'Earn points for every friend who signs up using your link.',
- points: 5,
- isCompleted: false, // This is an ongoing task
- href: '/dashboard/settings', // a dedicated referral page could be better
- icon: 'referral',
- },
- {
- id: 'complete_plan',
- title: 'Complete a Savings Plan',
- description: 'Reach your savings goal to earn a streak bonus.',
- points: 10,
- isCompleted: false, // Depends on plan completion
- href: '/dashboard/plans',
- icon: 'streak',
- },
- {
- id: 'weekly_saving',
- title: '4-Week Saving Streak',
- description: 'Save consistently every week for a month.',
- points: 10,
- isCompleted: false, // Depends on saving history
- href: '/dashboard/plans',
- icon: 'calendar',
- },
- ], [referralLink])
+ }, [referralData, referralLoading, generateReferralCode]);
+
+ const referralLink = referralData?.referralLink || "https://bitsave.io";
+
+ const tasks: Task[] = useMemo(
+ () => [
+ {
+ id: "tweet_after_saving",
+ title: "Tweet after Saving",
+ description: "Get 1 point for the tweet you send after creating a new savings plan.",
+ points: 1,
+ isCompleted: false, // This would be tracked via backend
+ href: "/dashboard/create-savings",
+ icon: "tweet",
+ },
+ {
+ id: "connect_x",
+ title: "Connect X (Twitter)",
+ description: "Link your X account to earn points and unlock social features.",
+ points: 1,
+ isCompleted: false,
+ href: "/dashboard/settings",
+ icon: "twitter",
+ },
+ {
+ id: "connect_farcaster",
+ title: "Connect Farcaster",
+ description: "Link your Farcaster account for onchain perks and rewards.",
+ points: 1,
+ isCompleted: false,
+ href: "/dashboard/settings",
+ icon: "farcaster",
+ },
+ {
+ id: "add_email",
+ title: "Add Email Address",
+ description: "Secure your account and get important notifications.",
+ points: 1,
+ isCompleted: false,
+ href: "/dashboard/settings",
+ icon: "email",
+ },
+ {
+ id: "tweet_about_bitsave",
+ title: "Tweet about BitSave",
+ description: "Share your experience with BitSave on X.",
+ points: 5,
+ isCompleted: false, // This would be tracked via backend
+ href: `https://twitter.com/intent/tweet?text=Just%20started%20my%20crypto%20savings%20journey%20with%20@BitSaveApp!%20%F0%9F%9A%80%20Secure,%20transparent,%20and%20rewarding.%20Join%20me%20in%20building%20better%20financial%20habits!%20%23SaveFi%20%23Web3&url=${encodeURIComponent(referralLink)}`,
+ icon: "tweet",
+ },
+ {
+ id: "cast_about_bitsave",
+ title: "Cast about BitSave",
+ description: "Post about BitSave on Farcaster.",
+ points: 5,
+ isCompleted: false, // This would be tracked via backend
+ href: `https://warpcast.com/~/compose?text=Just%20started%20my%20crypto%20savings%20journey%20with%20BitSave!%20%F0%9F%9A%80%20Secure,%20transparent,%20and%20rewarding.%20Join%20me%20in%20building%20better%20financial%20habits!%20%23SaveFi%20%23Web3&embeds[]=${encodeURIComponent(referralLink)}`,
+ icon: "cast",
+ },
+ {
+ id: "referral_signup",
+ title: "Refer a Friend",
+ description: "Earn points for every friend who signs up using your link.",
+ points: 5,
+ isCompleted: false, // This is an ongoing task
+ href: "/dashboard/settings", // a dedicated referral page could be better
+ icon: "referral",
+ },
+ {
+ id: "complete_plan",
+ title: "Complete a Savings Plan",
+ description: "Reach your savings goal to earn a streak bonus.",
+ points: 10,
+ isCompleted: false, // Depends on plan completion
+ href: "/dashboard/plans",
+ icon: "streak",
+ },
+ {
+ id: "weekly_saving",
+ title: "4-Week Saving Streak",
+ description: "Save consistently every week for a month.",
+ points: 10,
+ isCompleted: false, // Depends on saving history
+ href: "/dashboard/plans",
+ icon: "calendar",
+ },
+ ],
+ [referralLink],
+ );
const TaskIcon = memo(({ icon }: { icon: string }) => {
const icons: { [key: string]: ReactNode } = {
- twitter: ,
- farcaster: ,
- email: ,
- tweet: ,
- cast: ,
- referral: ,
- streak: ,
- calendar: ,
- saturn: ,
- }
- return icons[icon] || null
- })
+ twitter: (
+
+
+
+ ),
+ farcaster: (
+
+
+
+
+ ),
+ email: (
+
+
+
+ ),
+ tweet: (
+
+
+
+ ),
+ cast: (
+
+
+
+
+ ),
+ referral: (
+
+
+
+ ),
+ streak: (
+
+
+
+ ),
+ calendar: (
+
+
+
+ ),
+ saturn: (
+
+
+
+
+
+ ),
+ };
+ return icons[icon] || null;
+ });
- TaskIcon.displayName = 'TaskIcon'
+ TaskIcon.displayName = "TaskIcon";
// TwitterCard component moved to separate file for lazy loading
@@ -232,7 +362,9 @@ export default function SavvySpacePage() {
Your Points
-
{userData.userPoints.toLocaleString()}
+
+ {userData.userPoints.toLocaleString()}
+
{userData.userPoints} $BTS
@@ -254,7 +386,9 @@ export default function SavvySpacePage() {
Copy
-
Share this link to earn 5 points for every sign-up!
+
+ Share this link to earn 5 points for every sign-up!
+
@@ -263,12 +397,12 @@ export default function SavvySpacePage() {
Savvy Finance Videos
}>
-
-
+
+
{/* Earn More Points Section */}
-
-
+
{/* Inner shadow for neomorphism */}
-
+
-
Earn More Points
-
- Complete these tasks to earn points and unlock exclusive rewards in the BitSave ecosystem
+ Complete these tasks to earn points and unlock exclusive rewards in the BitSave
+ ecosystem
Your funds are protected by smart contracts and decentralized protocols.
+
+ Your funds are protected by smart contracts and decentralized protocols.
+
-
-
+
+
Earn Interest
-
Grow your savings with competitive interest rates on stablecoins.
+
+ Grow your savings with competitive interest rates on stablecoins.
+
-
-
+
+
Goal-Based
-
Set savings goals and track your progress with our intuitive dashboard.
+
+ Set savings goals and track your progress with our intuitive dashboard.
+
@@ -130,10 +168,15 @@ export default function ReferralPage() {
>
Get Started
-
+
-
+
- π You're joining through a referral! Both you and your friend will earn rewards when you create your first savings plan.
+ π You're joining through a referral! Both you and your friend will earn
+ rewards when you create your first savings plan.
- Message: {parseErrorMessage(((interaction.data as Record)?.error as string) || 'Unknown error')}
+ Message:{" "}
+ {parseErrorMessage(
+ ((interaction.data as Record)
+ ?.error as string) || "Unknown error",
+ )}
-
+
{(interaction.data as Record)?.context ? (
- Context:
- {((interaction.data as Record).context as Record).planName ? (
- Plan: {String(((interaction.data as Record).context as Record).planName)}
+ Context:
+ {(
+ (interaction.data as Record).context as Record<
+ string,
+ unknown
+ >
+ ).planName ? (
+
+ Plan:{" "}
+ {String(
+ (
+ (interaction.data as Record)
+ .context as Record
+ ).planName,
+ )}
+
) : null}
- {((interaction.data as Record).context as Record).chain ? (
- Chain: {String(((interaction.data as Record).context as Record).chain)}
+ {(
+ (interaction.data as Record).context as Record<
+ string,
+ unknown
+ >
+ ).chain ? (
+
+ Chain:{" "}
+ {String(
+ (
+ (interaction.data as Record)
+ .context as Record
+ ).chain,
+ )}
+
) : null}
- {((interaction.data as Record).context as Record).amount ? (
- Amount: {String(((interaction.data as Record).context as Record).amount)}
+ {(
+ (interaction.data as Record).context as Record<
+ string,
+ unknown
+ >
+ ).amount ? (
+
+ Amount:{" "}
+ {String(
+ (
+ (interaction.data as Record)
+ .context as Record
+ ).amount,
+ )}
+
) : null}
) : null}
-
+
{/* Base Savings Specific Error Help */}
- {(((interaction.data as Record)?.context as Record | undefined)?.planName === 'house rent' ||
- ((interaction.data as Record)?.context as Record | undefined)?.chain === 'base' ||
- (((interaction.data as Record)?.error as string) && ((interaction.data as Record).error as string).includes('estimateGas'))) && (
+ {((
+ (interaction.data as Record)?.context as
+ | Record
+ | undefined
+ )?.planName === "house rent" ||
+ (
+ (interaction.data as Record)?.context as
+ | Record
+ | undefined
+ )?.chain === "base" ||
+ (((interaction.data as Record)?.error as string) &&
+ (
+ (interaction.data as Record).error as string
+ ).includes("estimateGas"))) && (
Base Savings Issue Detected
- This appears to be related to Base network savings. Common fixes:
+ This appears to be related to Base network savings. Common
+ fixes:
Ensure wallet is connected to Base network
Check ETH balance for gas fees
@@ -1914,9 +2215,10 @@ export default function UserInteractionsPage() {
Plan:
- {String((interaction.data as Record).planName)}
+
+ {String(
+ (interaction.data as Record).planName,
+ )}
+
) : null}
{(interaction.data as Record)?.amount ? (
Amount:
- {String((interaction.data as Record).amount)} {String((interaction.data as Record)?.currency || 'USDC')}
+
+ {String(
+ (interaction.data as Record).amount,
+ )}{" "}
+ {String(
+ (interaction.data as Record)
+ ?.currency || "USDC",
+ )}
+
) : null}
{(interaction.data as Record)?.chain ? (
Chain:
- {String((interaction.data as Record).chain)}
+
+ {String(
+ (interaction.data as Record).chain,
+ )}
+
) : null}
{(interaction.data as Record)?.penalty ? (
Penalty:
- {String((interaction.data as Record).penalty)}
+
+ {String(
+ (interaction.data as Record).penalty,
+ )}
+
) : null}
) : null}
) : null}
-
+
{!(interaction.data as Record)?.txHash && (
- β οΈ No Transaction Hash: This transaction may have failed or is still pending.
+ β οΈ No Transaction Hash: This transaction may have
+ failed or is still pending.
- {success
+ {success
? `Great! Your savings plan "${planName}" has been topped up successfully. Keep building towards your goal! πͺ`
- : 'Your top-up transaction failed. Please try again or contact our support team for assistance.'}
+ : "Your top-up transaction failed. Please try again or contact our support team for assistance."}
{!success && error && (
Error Details:
@@ -577,21 +576,39 @@ export default function TopUpModal({ isOpen, onClose, planName, isEth = false, t
{(() => {
// Enhanced error extraction and user-friendly messages
const lowerError = error.toLowerCase();
- if (error.includes("missing revert data") || lowerError.includes("call_exception")) {
+ if (
+ error.includes("missing revert data") ||
+ lowerError.includes("call_exception")
+ ) {
return "πΈ Transaction failed - This usually means insufficient funds for gas fees or the contract couldn't process your request. Please check your wallet balance and ensure you have enough ETH/native tokens for gas fees, then try again.";
- } else if (error.includes("INVALID_ARGUMENT") || lowerError.includes("invalid argument")) {
+ } else if (
+ error.includes("INVALID_ARGUMENT") ||
+ lowerError.includes("invalid argument")
+ ) {
return "β Invalid transaction parameters. Please check your top-up amount and try again.";
- } else if (lowerError.includes("insufficient funds") || lowerError.includes("insufficient balance")) {
+ } else if (
+ lowerError.includes("insufficient funds") ||
+ lowerError.includes("insufficient balance")
+ ) {
return "π° Insufficient funds. Please check your wallet balance and ensure you have enough for both the top-up amount and gas fees.";
- } else if (lowerError.includes("user rejected") || lowerError.includes("user denied")) {
+ } else if (
+ lowerError.includes("user rejected") ||
+ lowerError.includes("user denied")
+ ) {
return "π« Transaction was cancelled by user. No funds were transferred.";
- } else if (lowerError.includes("network") || lowerError.includes("connection")) {
+ } else if (
+ lowerError.includes("network") ||
+ lowerError.includes("connection")
+ ) {
return "π Network connection issue. Please check your internet connection and try again.";
} else if (lowerError.includes("gas")) {
return "β½ Gas estimation failed. Try increasing gas limit or check network congestion.";
} else if (lowerError.includes("nonce")) {
return "π Transaction nonce error. Please reset your wallet or try again.";
- } else if (lowerError.includes("allowance") || lowerError.includes("approval")) {
+ } else if (
+ lowerError.includes("allowance") ||
+ lowerError.includes("approval")
+ ) {
return "π Token allowance issue. Please approve the token spending and try again.";
} else if (error.includes("code=")) {
const codeMatch = error.match(/code=([A-Z_]+)/);
@@ -607,12 +624,12 @@ export default function TopUpModal({ isOpen, onClose, planName, isEth = false, t
Original Error: {error}
- txHash && window.open(`${getExplorerUrl()}${txHash}`, '_blank')}
+ onClick={() => txHash && window.open(`${getExplorerUrl()}${txHash}`, "_blank")}
disabled={!txHash}
>
Go To Explorer
-
+
-
@@ -654,13 +676,13 @@ export default function TopUpModal({ isOpen, onClose, planName, isEth = false, t
) : (
-
-
+
Top Up Savings
-
-
-
+
+
-
+
-
+
-
+
-
{planName}
+
+ {planName}
+
{isEth ? (
<>
- ETH on {getNetworkName()}
+
+ ETH on {getNetworkName()}
+
>
) : (
<>
-
- {getTokenNameDisplay()} on {getNetworkName()}
+
+
+ {getTokenNameDisplay()} on {getNetworkName()}
+
>
)}
@@ -713,17 +767,21 @@ export default function TopUpModal({ isOpen, onClose, planName, isEth = false, t
-
+
{/* Inspirational quote */}
- “The habit of saving is itself an education; it fosters every virtue, teaches self-denial, cultivates the sense of order, trains to forethought.”
+ “The habit of saving is itself an education; it fosters every virtue, teaches
+ self-denial, cultivates the sense of order, trains to forethought.”