Skip to content

Commit

Permalink
Merge pull request #454 from elsoul/addFrontend
Browse files Browse the repository at this point in the history
add SOL staking
  • Loading branch information
KishiTheMechanic authored Oct 17, 2024
2 parents 6699539 + b5b849b commit 374673d
Show file tree
Hide file tree
Showing 57 changed files with 11,766 additions and 5,201 deletions.
5 changes: 5 additions & 0 deletions .github/workflows/skeet-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ jobs:
- name: Install dependencies
run: pnpm install

- name: Create .env.local file
run: |
echo "NEXT_PUBLIC_SOLANA_ENDPOINT=${{ secrets.NEXT_PUBLIC_SOLANA_ENDPOINT }}" > .env.local
echo "NEXT_PUBLIC_SOLANA_PRICE_ENDPOINT=${{ secrets.NEXT_PUBLIC_SOLANA_PRICE_ENDPOINT }}" >> .env.local
- name: Deploy to Cloudflare
run: pnpm run -F skeet-dev deploy
env:
Expand Down
14,915 changes: 9,715 additions & 5,200 deletions pnpm-lock.yaml

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions website/skeet-dev/.env.local.sample
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
NEXT_PUBLIC_SOLANA_ENDPOINT=https://rpc.validators.solutions/rpc?api-key=<your-api-key>
# NEXT_PUBLIC_SOLANA_PRICE_ENDPOINT=
24 changes: 24 additions & 0 deletions website/skeet-dev/messages/en/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,29 @@
"toPrevious": "Previous",
"joinUs": "Join Us",
"demo": "Demo App",
"balance": "Balance",
"updated": "Updated!",
"priceDataFromCoingecko": "※ Price data is retrieved from CoinGecko",
"connectYourWallet": "Connect your wallet",
"CTARow": {
"title": "Join Our Discord Community",
"body": "Stay informed with the latest updates, news, and exclusive insights by joining our official Discord server.",
"button": "Join Us on Discord"
},
"EpochTime": {
"currentEpoch": "Current Epoch",
"remainingTime": "Remaining Time (approx)"
},
"ElsolAPY": {
"currentAPY": "Current APY",
"30daysCalculate": "※ Calculated based on pure staking rewards over the past 30 days. Additional incentives are not included."
},
"InstantLiquidityRow": {
"title1": "Boost Your Rewards",
"title2": "with Instant Liquidity.",
"body": "By holding elSOL, you can earn staking rewards, but adding it to Orca's liquidity pool opens up even more opportunities for earning. No complicated setup is required—you can provide liquidity instantly and start earning trading fee rewards right away. By adopting the new 'Bundle Position' technology, fees are reduced by approximately 70% compared to the traditional method of minting Position NFTs.",
"closeOrca": "Redeem"
},
"ProductsSolvRow": {
"title": "solv: Open-Source Solana Validator Tool",
"body": "solv is an open-source tool designed to simplify the setup and operation of Solana validators and RPC nodes. By using solv, essential tasks such as setting up, operating, monitoring, alerting, and upgrading Solana validators and RPC nodes can be performed easily and without hassle.",
Expand All @@ -43,6 +61,12 @@
"body": "Fastest Transactions from Anywhere, Anytime. ERPC offers a global proxy supported by more than 300 edge servers around the world. Every time users access the network, the closest server is automatically selected, ensuring low-latency and stable connections. This guarantees fast access from any region, maximizing performance.",
"button1": "Get Started - Free",
"button2": "ERPC"
},
"VLDAirdropRow": {
"title": "$VLD Airdrop Coming Soon...",
"body": "An airdrop of $VLD tokens is planned primarily for $elSOL holders, Solana Validators using Validators Solutions, and holders of Epics DAO's NFTs and tokens ($EPCT). For more details, please check the official Discord of Validators DAO.",
"button1": "Learn more",
"button2": "Get elSOL"
}
}
}
20 changes: 20 additions & 0 deletions website/skeet-dev/messages/en/mechanism.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"mechanism": {
"title": "How it Works",
"description": "elSOL is a Liquid Staking Token (LST) created using the official Solana Foundation Stake Pool Program.",
"Why1SOLnot1elSOLRow": {
"title": "Why is 1 SOL not 1 elSOL?",
"summary": "elSOL is a reward-bearing token that increases in value over time as staking rewards accumulate.",
"description": "When you stake your SOL, you receive elSOL in return. elSOL represents your staked SOL and the rights to earn staking rewards as a Liquid Staking Token (LST). The staked SOL is then distributed among high-quality validators through the elSOL stake pool, designed to achieve optimal yields. The rewards earned by these validators are added back into the pool, increasing the value of elSOL over time. This is why 1 SOL is not equal to 1 elSOL. By holding elSOL, you continue to accumulate rewards and can benefit more the longer you hold.",
"button1": "Get elSOL",
"button2": "What is elSOL?"
},
"HavingLiquidityRow": {
"title": "What is a Liquid Staking Token (LST)?",
"summary": "Unlike traditional staking, LSTs can be swapped at any time and offer opportunities for additional yield.",
"description": "A Liquid Staking Token (LST) represents the ownership of your staked tokens and the rewards they earn, while maintaining liquidity. As an LST, elSOL allows you to freely swap it for other tokens without locking them, unlike traditional staking. Additionally, you can provide elSOL to Liquidity Pools on DeFi platforms like Orca to potentially earn higher yields compared to regular staking. This allows you to earn staking rewards while also leveraging the DeFi ecosystem to maximize your assets' efficiency.",
"button1": "Get elSOL",
"button2": "DeFi"
}
}
}
28 changes: 28 additions & 0 deletions website/skeet-dev/messages/en/staking.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"staking": {
"title": "SOL Staking",
"staking": "Staking",
"unstaking": "Unstaking",
"swap": "Swap",
"balance": "Balance",
"updated": "Updated!",
"stakeSOL": "Stake SOL",
"stakingInfo": "If you already have a stake account, you can convert it to elSOL with no fees.",
"stakingFromAccount": "Convert Stake Account",
"unstakingToAccount": "Unstake to Account",
"unstakingCaution": "※ When you unstake, the SOL accumulated after rewards are added will be distributed to your wallet's stake account. By deactivating the stake account, the SOL will be unlocked in the next epoch. (Up to approximately 2 days)",
"instantUnstaking": "Use Swap to unstake your SOL instantly.",
"StakingHeroRow": {
"title1": "Stake SOL to Earn",
"title2": "Additional Incentives",
"subtitle1": "Stake your SOL in the elSOL pool (created with Solana Foundation official Stake Pool Program) to earn staking rewards and additional incentives.",
"subtitle2": "As an elSOL holder, you contribute to the decentralization and security enhancement of the Solana blockchain."
},
"DirectStakingRow": {
"title1": "Stake SOL",
"title2": "for Max TrueAPY",
"subtitle1": "To enhance the decentralization and security of the Solana network, we constantly operate and update high-performance, top-tier validators with zero downtime.",
"subtitle2": "By minimizing downtime and selecting optimal regions for operation, we aim to maximize returns. With all fees set to 0%, we provide the highest TrueAPY among Solana validators."
}
}
}
22 changes: 22 additions & 0 deletions website/skeet-dev/messages/ja/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,27 @@
"toPrevious": "前へ",
"joinUs": "仲間になる",
"demo": "デモアプリ",
"priceDataFromCoingecko": "※ 価格データは CoinGecko より取得",
"connectYourWallet": "ウォレットを接続してください",
"CTARow": {
"title": "Discord コミュニティに参加しましょう",
"body": "最新のアップデート、ニュース、限定情報等を公式 Discord サーバーでチェックしてください。",
"button": "公式 Discord に参加"
},
"EpochTime": {
"currentEpoch": "現在のエポック",
"remainingTime": "残り時間(約)"
},
"ElsolAPY": {
"currentAPY": "現在の APY",
"30daysCalculate": "※ 過去30日間の純粋なステーキング報酬に基づいた計算です。追加インセンティブは含まれていません。"
},
"InstantLiquidityRow": {
"title1": "Boost Your Rewards",
"title2": "with Instant Liquidity.",
"body": "elSOLを保有するだけでステーキング報酬が得られますが、Orcaの流動性プールに追加することで、さらなる報酬獲得のチャンスが広がります。設定は不要で、インスタントに流動性を提供し、すぐにトレード手数料の報酬を開始できます。新技術『Bundle Position』を採用し、従来のPosition NFTをミントする方法に比べて、約70%の手数料削減を実現しました。",
"closeOrca": "報酬を獲得"
},
"ProductsSolvRow": {
"title": "solv: オープンソースの Solana バリデータツール",
"body": "solv は Solana バリデータ及びRPCノードのセットアップと運用を簡略化するためのオープンソースツールです。solv を使うことで、SolanaバリデータやRPCノードのセットアップ、運用、モニタリング、アラート、アップグレード等、必須とされている業務を簡単に手間なく行うことができます。",
Expand All @@ -43,6 +59,12 @@
"body": "最速のトランザクションをいつでも、どこからでも。ERPCは、世界中に配置された300以上のエッジサーバーによって支えられたグローバルプロキシを提供しています。ユーザーがアクセスするたびに、最短距離のサーバーが自動で選ばれ、低遅延で安定した接続を実現します。これにより、どの地域からでも迅速なアクセスが保証され、パフォーマンスの最大化を図ります。",
"button1": "無料でスタート",
"button2": "ERPC"
},
"VLDAirdropRow": {
"title": "$VLD Airdrop Coming Soon...",
"body": "主に $elSOL ホルダー、Validators Solutions を利用しているバリデーター、Epics DAO の NFT 及びトークン ($EPCT) ホルダーを対象とした $VLD トークンのエアドロップが予定されています。詳しくは Validators DAO の公式 Discord をご確認ください。",
"button1": "最新情報を入手",
"button2": "Get elSOL"
}
}
}
20 changes: 20 additions & 0 deletions website/skeet-dev/messages/ja/mechanism.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"mechanism": {
"title": "elSOL の仕組み",
"description": "elSOL は Solana Foundation 公式の Stake Pool Program で作成された Liquid Staking Token (LST) です。",
"Why1SOLnot1elSOLRow": {
"title": "なぜ 1SOL は 1 elSOL ではないの?",
"summary": "elSOLは時間の経過とともに報酬が蓄積され、その価値が増加するリワードベアリング型のトークンです。",
"description": "あなたがSOLをステークする際、その対価としてelSOLを受け取ります。elSOLはステークされたSOLと、その報酬を受け取る権利を表すLiquid Staking Token (LST) です。その後、ステークされたSOLはelSOLステークプールを通じて高品質なバリデータに分散ステーキングされ、最適な利回りを得るように設計されています。バリデータから得られた報酬はプールに蓄積されるため、時間の経過とともにelSOLの価値が増加します。これが、1 SOLが1 elSOLと等価ではなくなる理由です。長期保有することでelSOLは報酬を蓄積し、より多くの利益を得ることが可能です。",
"button1": "Get elSOL",
"button2": "elSOL とは?"
},
"HavingLiquidityRow": {
"title": "Liquid Staking Token (LST) とは?",
"summary": "通常のステーキングとは異なり、いつでもトークンスワップが可能であり、追加の利回りを狙うこともできます。",
"description": "Liquid Staking Token (LST) とは、ステーキングされたトークンの所有権と報酬を表す、流動性のあるトークンです。elSOLはLSTであるため、通常のステーキングのようにトークンをロックする必要がなく、いつでも自由に他のトークンと交換可能です。また、elSOLをOrca等のDeFiプラットフォームのLiquidity Poolに提供することで、通常のステーキングよりも高い利回りを狙うことができます。これにより、ステーキング報酬を受け取りつつ、DeFiエコシステムで資産を効率的に運用することが可能となります。",
"button1": "Get elSOL",
"button2": "DeFi"
}
}
}
28 changes: 28 additions & 0 deletions website/skeet-dev/messages/ja/staking.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"staking": {
"title": "SOL ステーキング",
"staking": "ステーク",
"unstaking": "アンステーク",
"swap": "スワップ",
"balance": "残高",
"updated": "更新完了!",
"stakeSOL": "SOLをステーク",
"stakingInfo": "すでにステークアカウントをお持ちの方は手数料無料でelSOLと交換することができます。",
"stakingFromAccount": "ステークアカウントを交換",
"unstakingToAccount": "アカウントにアンステーク",
"unstakingCaution": "※ アンステークを行うと、報酬追加後のSOLがステークアカウントとしてご利用のウォレットに払い出されます。ステークアカウントを解除することで次のエポックにSOLがアンロックされます。(最大約2日)",
"instantUnstaking": "即時アンステークにはスワップをご利用ください",
"StakingHeroRow": {
"title1": "Stake SOL to Earn",
"title2": "Additional Incentives",
"subtitle1": "SOLをelSOLプール(Solana Foundation 公式の Stake Pool Program で作成)にステークし、ステーキング報酬と追加インセンティブを獲得しましょう。",
"subtitle2": "elSOL ホルダーとして、Solanaブロックチェーンの分散化とセキュリティ向上に貢献できます。"
},
"DirectStakingRow": {
"title1": "Stake SOL",
"title2": "for Max TrueAPY",
"subtitle1": "Solana ネットワークの分散化とセキュリティ強化のため、私たちは常に高性能かつハイスコアのバリデータをノーダウンタイムで運用・アップデートしています。",
"subtitle2": "ダウンタイムを最小化し、最適なエリアで運用することで、より高いリターンを追求します。すべての手数料は 0% に設定されており、Solana バリデータ最大の TrueAPY を実現しています。"
}
}
}
12 changes: 12 additions & 0 deletions website/skeet-dev/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,33 @@
"ui:add": "pnpm dlx shadcn@latest add"
},
"dependencies": {
"@dialectlabs/blinks": "0.10.1",
"@fortawesome/fontawesome-svg-core": "6.5.2",
"@fortawesome/free-brands-svg-icons": "6.5.2",
"@fortawesome/free-solid-svg-icons": "6.5.2",
"@fortawesome/react-fontawesome": "0.2.2",
"@glitchful-dev/sol-apy-sdk": "3.0.8",
"@radix-ui/react-aspect-ratio": "1.1.0",
"@radix-ui/react-avatar": "1.0.4",
"@radix-ui/react-dialog": "1.0.5",
"@radix-ui/react-dropdown-menu": "2.0.6",
"@radix-ui/react-icons": "1.3.0",
"@radix-ui/react-label": "2.0.2",
"@radix-ui/react-progress": "^1.1.0",
"@radix-ui/react-slot": "1.0.2",
"@radix-ui/react-tabs": "1.1.1",
"@radix-ui/react-toast": "1.1.5",
"@react-spring/web": "9.7.4",
"@solana/spl-stake-pool": "1.1.0",
"@solana/wallet-adapter-base": "0.9.23",
"@solana/wallet-adapter-react": "0.15.35",
"@solana/wallet-adapter-react-ui": "0.9.35",
"@solana/wallet-standard-features": "1.2.0",
"@solana/wallet-standard-util": "1.1.1",
"@solana/web3.js": "1.95.3",
"class-variance-authority": "0.7.0",
"clsx": "2.1.1",
"date-fns": "4.1.0",
"embla-carousel-autoplay": "8.3.0",
"embla-carousel-react": "8.3.0",
"github-slugger": "2.0.0",
Expand Down
9 changes: 9 additions & 0 deletions website/skeet-dev/src/app/[locale]/(default)/defaultNavs.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
export enum DEFAULT_PATHS {
home = '/',
doc = '/doc/general/getting-started',
staking = '/staking',
news = '/news',
privacy = '/legal/privacy-policy',
}
Expand All @@ -10,6 +11,10 @@ export const defaultHeaderNav = [
path: DEFAULT_PATHS.doc,
label: 'doc.title',
},
{
path: DEFAULT_PATHS.staking,
label: 'staking.title',
},
{
path: DEFAULT_PATHS.news,
label: 'news.title',
Expand All @@ -21,6 +26,10 @@ export const defaultFooterNav = [
path: DEFAULT_PATHS.doc,
label: 'doc.title',
},
{
path: DEFAULT_PATHS.staking,
label: 'staking.title',
},
{
path: DEFAULT_PATHS.news,
label: 'news.title',
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
'use client'

import {
OPOSOpenCube,
SolanaFoundationLogoHorizontal,
SolanaFoundationLogoInvertHorizontal
} from '@/assets/img'
import { mainShardGradation } from '@/lib/decoration'
import { cn } from '@/lib/utils'
import { Link } from '@/navigation'
import { useLocale, useTranslations } from 'next-intl'
import Image from 'next/image'
import { useTheme } from '@/hooks/utils/useTheme'
import { SOLANA_VALIDATOR_LINK } from '@/constants/links'
import DirectStakingTabs from './DirectStakingTabs'

const logos = [
{
title: 'SolanaFoundation',
logo: SolanaFoundationLogoHorizontal,
logoInvert: SolanaFoundationLogoInvertHorizontal,
href: SOLANA_VALIDATOR_LINK
}
]

export default function DirectStakingRow() {
const t = useTranslations()
const locale = useLocale()
const { theme, mounted } = useTheme()
if (!mounted) return null

return (
<>
<div className="relative mx-auto max-w-7xl p-3">
<div className="absolute left-0 top-0 -z-10 opacity-10 dark:opacity-20">
<Image
src={OPOSOpenCube}
alt="Background"
className="h-48 w-48 sm:h-64 sm:w-64 md:h-96 md:w-96 lg:h-[440px] lg:w-[440px]"
unoptimized
width={256}
height={256}
/>
</div>

<div className="relative mx-auto grid items-center gap-24 py-24 md:grid-cols-2 md:py-48">
<div className="grid w-full gap-4 p-4">
<h2
className={cn(
'py-2 text-5xl font-bold tracking-tighter sm:text-7xl lg:text-8xl',
mainShardGradation
)}
>
{t('staking.DirectStakingRow.title1')} <br />
{t('staking.DirectStakingRow.title2')}
</h2>
<p
className={cn(
'max-w-96 text-sm font-medium sm:max-w-lg sm:text-lg lg:-mt-2 lg:max-w-xl lg:text-xl',
'text-zinc-500 dark:text-zinc-300'
)}
>
{t('staking.DirectStakingRow.subtitle1')} <br />
{t('staking.DirectStakingRow.subtitle2')}
</p>

<div className="mt-3 flex flex-wrap items-center justify-start gap-4">
{logos.map((logo) => (
<Link
key={logo.title}
href={logo.href}
className="hover:opacity-80"
target="_blank"
rel="noopener noreferrer"
>
<Image
src={theme === 'light' ? logo.logo : logo.logoInvert}
alt="Background"
className="w-20 sm:w-24 md:w-28"
unoptimized
width={256}
/>
</Link>
))}
</div>
</div>
<div className="mx-auto w-full max-w-xl p-4">
<DirectStakingTabs />
</div>
</div>
</div>
</>
)
}
Loading

0 comments on commit 374673d

Please sign in to comment.