diff --git a/apps/evm/src/constants/prime.ts b/apps/evm/src/constants/prime.ts index 07bd84f38f..a701cfa6e1 100644 --- a/apps/evm/src/constants/prime.ts +++ b/apps/evm/src/constants/prime.ts @@ -1,6 +1,9 @@ import BigNumber from 'bignumber.js'; import { ChainId } from 'types'; +// Maximum rank that qualifies for Prime during a cycle +export const PRIME_RANK_LIMIT = 500; + const bscTestnetPrimeMarketsAddresses = { vBTCB: '0xb6e9322C49FD75a367Fcb17B0Fcd62C5070EbCBe', vUSDT: '0xb7526572FFE56AB9D7489838Bf2E18e3323b441A', diff --git a/apps/evm/src/libs/translations/translations/en.json b/apps/evm/src/libs/translations/translations/en.json index 64379d0776..230ce85faa 100644 --- a/apps/evm/src/libs/translations/translations/en.json +++ b/apps/evm/src/libs/translations/translations/en.json @@ -1261,6 +1261,15 @@ "sec": "Sec", "title": "End of cycle" }, + "lastCycleSummary": { + "primeScoreLabel": "Prime score", + "rankLabel": "Your rank", + "rankMissed": "Almost there! You weren't in last cycle's top 500. Boost your stake to qualify this cycle.", + "rankNoStake": "You didn't stake XVS last cycle. Stake now to qualify for Prime and earn extra rewards.", + "rankQualified": "Congrats! You're in the Top 500 during last cycle and qualified for Prime Rewards.", + "title": "Last Cycle Prime Summary", + "userRewardsTitle": "Your Prime rewards last cycle" + }, "rankTable": { "columns": { "primeScore": "Prime score", diff --git a/apps/evm/src/libs/translations/translations/ja.json b/apps/evm/src/libs/translations/translations/ja.json index b84490625f..1bbf1ec6c2 100644 --- a/apps/evm/src/libs/translations/translations/ja.json +++ b/apps/evm/src/libs/translations/translations/ja.json @@ -1261,6 +1261,15 @@ "sec": "秒", "title": "サイクル終了" }, + "lastCycleSummary": { + "primeScoreLabel": "Prime スコア", + "rankLabel": "あなたのランク", + "rankMissed": "あと一歩です!前サイクルでは上位 500 に入りませんでした。ステーク量を増やして今サイクルでの対象を目指しましょう。", + "rankNoStake": "前サイクルでは XVS をステークしていませんでした。今すぐステークして Prime の対象になり、追加報酬を獲得しましょう。", + "rankQualified": "おめでとうございます!前サイクルで上位 500 に入り、Prime 報酬の対象になりました。", + "title": "前サイクルの Prime サマリー", + "userRewardsTitle": "前サイクルのあなたの Prime 報酬" + }, "rankTable": { "columns": { "primeScore": "Prime スコア", diff --git a/apps/evm/src/libs/translations/translations/th.json b/apps/evm/src/libs/translations/translations/th.json index bc8c044c7d..e7cf3da91c 100644 --- a/apps/evm/src/libs/translations/translations/th.json +++ b/apps/evm/src/libs/translations/translations/th.json @@ -1261,6 +1261,15 @@ "sec": "วินาที", "title": "สิ้นสุดรอบ" }, + "lastCycleSummary": { + "primeScoreLabel": "คะแนน Prime", + "rankLabel": "อันดับของคุณ", + "rankMissed": "ใกล้แล้ว! คุณไม่ได้อยู่ใน Top 500 ของรอบที่แล้ว เพิ่ม stake ของคุณเพื่อให้มีสิทธิ์ในรอบนี้", + "rankNoStake": "คุณไม่ได้ stake XVS ในรอบที่แล้ว Stake ตอนนี้เพื่อมีสิทธิ์รับ Prime และรับรางวัลเพิ่มเติม", + "rankQualified": "ยินดีด้วย! คุณอยู่ใน Top 500 ในรอบที่แล้วและมีสิทธิ์รับรางวัล Prime", + "title": "สรุป Prime รอบที่แล้ว", + "userRewardsTitle": "รางวัล Prime ของคุณในรอบที่แล้ว" + }, "rankTable": { "columns": { "primeScore": "คะแนน Prime", diff --git a/apps/evm/src/libs/translations/translations/tr.json b/apps/evm/src/libs/translations/translations/tr.json index 8ec3ddcfe6..0b157b1932 100644 --- a/apps/evm/src/libs/translations/translations/tr.json +++ b/apps/evm/src/libs/translations/translations/tr.json @@ -1261,6 +1261,15 @@ "sec": "Sn.", "title": "Döngü sonu" }, + "lastCycleSummary": { + "primeScoreLabel": "Prime puanı", + "rankLabel": "Sıralaman", + "rankMissed": "Az kaldı! Son döngüde ilk 500 içinde değildin. Bu döngüde uygun olmak için stake'ini artır.", + "rankNoStake": "Son döngüde XVS stake etmedin. Prime için uygun olmak ve ek ödül kazanmak için şimdi stake et.", + "rankQualified": "Tebrikler! Son döngüde ilk 500 içindeydin ve Prime ödülleri için uygun oldun.", + "title": "Son Döngü Prime Özeti", + "userRewardsTitle": "Son döngüdeki Prime ödülleriniz" + }, "rankTable": { "columns": { "primeScore": "Prime puanı", diff --git a/apps/evm/src/libs/translations/translations/vi.json b/apps/evm/src/libs/translations/translations/vi.json index 41f0a45ec2..7aae924f8a 100644 --- a/apps/evm/src/libs/translations/translations/vi.json +++ b/apps/evm/src/libs/translations/translations/vi.json @@ -1261,6 +1261,15 @@ "sec": "Giây", "title": "Kết thúc chu kỳ" }, + "lastCycleSummary": { + "primeScoreLabel": "Điểm Prime", + "rankLabel": "Hạng của bạn", + "rankMissed": "Sắp được rồi! Bạn không nằm trong Top 500 của chu kỳ trước. Hãy tăng mức stake để đủ điều kiện trong chu kỳ này.", + "rankNoStake": "Bạn chưa stake XVS ở chu kỳ trước. Hãy stake ngay để đủ điều kiện nhận Prime và kiếm thêm phần thưởng.", + "rankQualified": "Chúc mừng! Bạn nằm trong Top 500 ở chu kỳ trước và đủ điều kiện nhận phần thưởng Prime.", + "title": "Tóm tắt Prime chu kỳ trước", + "userRewardsTitle": "Phần thưởng Prime của bạn trong chu kỳ trước" + }, "rankTable": { "columns": { "primeScore": "Điểm Prime", diff --git a/apps/evm/src/libs/translations/translations/zh-Hans.json b/apps/evm/src/libs/translations/translations/zh-Hans.json index f2202cf3c1..536160983d 100644 --- a/apps/evm/src/libs/translations/translations/zh-Hans.json +++ b/apps/evm/src/libs/translations/translations/zh-Hans.json @@ -1261,6 +1261,15 @@ "sec": "秒", "title": "周期结束" }, + "lastCycleSummary": { + "primeScoreLabel": "Prime 分数", + "rankLabel": "你的排名", + "rankMissed": "就差一点!你未进入上一周期前 500。提升质押以在本周期获得资格。", + "rankNoStake": "你在上一周期未质押 XVS。立即质押以获得 Prime 资格并赚取额外奖励。", + "rankQualified": "恭喜!你在上一周期位列前 500,已获得 Prime 奖励资格。", + "title": "上一周期 Prime 汇总", + "userRewardsTitle": "你上一周期的 Prime 奖励" + }, "rankTable": { "columns": { "primeScore": "Prime 分数", diff --git a/apps/evm/src/libs/translations/translations/zh-Hant.json b/apps/evm/src/libs/translations/translations/zh-Hant.json index b790ec678f..ee09b0ed3d 100644 --- a/apps/evm/src/libs/translations/translations/zh-Hant.json +++ b/apps/evm/src/libs/translations/translations/zh-Hant.json @@ -1261,6 +1261,15 @@ "sec": "秒", "title": "週期結束" }, + "lastCycleSummary": { + "primeScoreLabel": "Prime 分數", + "rankLabel": "你的排名", + "rankMissed": "就差一點!你未進入上一週期前 500。提升質押以在本週期獲得資格。", + "rankNoStake": "你在上一週期未質押 XVS。立即質押以獲得 Prime 資格並賺取額外獎勵。", + "rankQualified": "恭喜!你在上一週期位列前 500,已獲得 Prime 獎勵資格。", + "title": "上一週期 Prime 彙總", + "userRewardsTitle": "你上一週期的 Prime 獎勵" + }, "rankTable": { "columns": { "primeScore": "Prime 分數", diff --git a/apps/evm/src/pages/PrimeLeaderboard/EndOfCycle/__tests__/index.spec.tsx b/apps/evm/src/pages/PrimeLeaderboard/EndOfCycle/__tests__/index.spec.tsx index 68dfd408ca..70929892ee 100644 --- a/apps/evm/src/pages/PrimeLeaderboard/EndOfCycle/__tests__/index.spec.tsx +++ b/apps/evm/src/pages/PrimeLeaderboard/EndOfCycle/__tests__/index.spec.tsx @@ -1,4 +1,4 @@ -import { screen } from '@testing-library/react'; +import { fireEvent, screen } from '@testing-library/react'; import { renderComponent } from 'testUtils/render'; import { EndOfCycle } from '..'; @@ -13,6 +13,14 @@ describe('pages/PrimeLeaderboard/EndOfCycle', () => { expect(screen.getByText("See last cycle's Prime summary")).toBeInTheDocument(); }); + it('opens the last cycle summary modal from the helper link', async () => { + renderComponent(); + + fireEvent.click(screen.getByText("See last cycle's Prime summary")); + + expect(await screen.findByText('Last Cycle Prime Summary')).toBeInTheDocument(); + }); + it('renders the ended state for a past end date', () => { renderComponent(); diff --git a/apps/evm/src/pages/PrimeLeaderboard/EndOfCycle/index.tsx b/apps/evm/src/pages/PrimeLeaderboard/EndOfCycle/index.tsx index 445b3bc665..db4ff4b1ae 100644 --- a/apps/evm/src/pages/PrimeLeaderboard/EndOfCycle/index.tsx +++ b/apps/evm/src/pages/PrimeLeaderboard/EndOfCycle/index.tsx @@ -1,9 +1,11 @@ import { Button, cn } from '@venusprotocol/ui'; +import { useState } from 'react'; import ReactCountdown from 'react-countdown'; import { Card } from 'components'; import { useTranslation } from 'libs/translations'; +import { LastCycleSummaryModal } from '../LastCycleSummaryModal'; import { Timer } from './Timer'; export interface EndOfCycleProps { @@ -21,6 +23,7 @@ interface CountdownState { export const EndOfCycle: React.FC = ({ endDate, className }) => { const { t, Trans } = useTranslation(); + const [isSummaryModalOpen, setIsSummaryModalOpen] = useState(false); const deadline = t('primeLeaderboard.endOfCycle.deadline', { date: endDate }); @@ -49,9 +52,12 @@ export const EndOfCycle: React.FC = ({ endDate, className }) => values={{ deadline }} components={{ bold: , - // TODO: open the last cycle summary modal once it's available summaryLink: ( -