From af7653bc3ff8e70e880513d8518aeafba614a803 Mon Sep 17 00:00:00 2001 From: sheykei <47207681+clmntsnr@users.noreply.github.com> Date: Mon, 16 Dec 2024 15:04:18 +0100 Subject: [PATCH] sync: merkl app changes (#46) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: some type errors * add: services model draft * change: more opportunity types * fix: lint * add: themes and theme switcher in dev mode (#4) * add: theme selector when in dev mode * add: theme switcher in dev mode * fix: protocol empty tag * fix: lint error * Tabs sync (#5) * tabs, capitalize, socials * fix lint * change links to terms & priuvacy * lint * move edit address to breadcrumbs * user edit in component * footer issue ok * show bg-main color instead of banner outside of home and opportunities * add link to protocol header * implement zkSync colors/fonts as default * commit hash * lint * remove comments * lint * feat: re add CI (#6) * Feat/leaderboard display (#7) * Update the display of daily rewards * refactor: update CampaignTableRow to use Dropdown for blacklist and whitelist, and improve layout with Divider * wip handling rewards * update: dashboard styling (#8) * tweak: dashboard * tweak: dappkit * fix: no user warning * remove: input from description * fix: lint * add(front): modal, hero, select, tabs/tags, pagination (#9) * pagination wip * review Hero cpt gp * change pagination * change modal * change Hero + connect wallet and search results modals * lint * commit hash * comit hash * commit * update: opportunity campaigns/leaderboard view (#11) * update: campaign information collapsible * update: campaign information * add: campaign rules * update: leaderboard * fixes * fix: lint * tweaks * fix: aggregate * feat: add APR modal and table components for opportunity details on h… (#10) * feat: add APR modal and table components for opportunity details on hover opportunities table * lint * Apr tvl modal end * Feat Hero campaign and protocol (#13) * Feat Hero campaign and protocol * fix api call on subpage * lint and request can't be undefinable on service * feat(opportunity): new hero, tableRow, OpportunityFilters (#15) * working on table row + new hero image * add fitlers * add todos * lint * lint * :sparkles: sum daily rewards fora protocol (#16) * Fix/campaign page (#17) * wording * fix hero link default home * lint * wording * wording * show icon * :sparkles: redirect to Etherscan on TOken tooltip * :bug: change Time zone UTC * update: opportunities pages (#14) * add: metrics badges * update: opportunity list * fix: rewardsRecord sometimes being missing * add: apply button * add: loading bar * rm: log & lint * add: protocols filter * fix: search params * fix: * fix: lint * add: missing chains * fixes * update: dappkit * fix: lint * remove: comment * add: constant * apr (#18) * apr done * hide forwards if none + change border * lint * replace content null * Fix/campaign page (#20) * wording * fix lint error * fix time when live * wording * link to dashboard on leaderboard addresses * Leaderboard campaign selector display * lint * add lastSnapshot * add lastSnapshot (#21) * fixes: feedback, mainly opportunities & dashboard (#22) * fix: search & filters * update: descriptions * add: rewards siorting * add: tvl filter * fix * fix: redirect * fix: whitelist * add: selective claim * add: selective token * add: global claim * fix * lint * typo * fix: explorer * caching * add caching test * lint * update * add: cache on static resoruces (#23) * Enhance opportunity data retrieval with APR and daily rewards metrics (#24) * fix: pagination defaulting & cache (#25) * fix: bugs in selectors * fix: dappkit * clean wip: comment out static sideDatas for dynamic implementation (#26) * fix: protocl filter (#27) * fix: protocol desc (#28) * fix: protocol: description * rm: log * token stats + cleaning (#29) * Small APR Fix (#19) * lint * commit hash * commit hash * commit hash * Fixes on protocol, chain, token and campaign pages (#30) * Fixes on protocol, chain, token and campaign pages * lint * fix tooltip * add: depositor (#31) * update: dappkit (#33) * remove: workflwos --------- Co-authored-by: sheykei <47207681+clement4saunier@users.noreply.github.com> Co-authored-by: Viande <33333630+indaviande@users.noreply.github.com> Co-authored-by: Picodes <41673773+Picodes@users.noreply.github.com> Co-authored-by: hugolxt <87241914+hugolxt@users.noreply.github.com> Co-authored-by: Hugo Lextrait --- bun.lockb | Bin 827766 -> 896370 bytes merkl.config.ts | 118 +++++---- package.json | 9 +- src/api/services/cache.service.ts | 42 ++++ src/api/services/campaigns/campaign.model.ts | 6 + .../{ => campaigns}/campaign.service.ts | 26 +- .../services/opportunity/opportunity.model.ts | 6 + .../{ => opportunity}/opportunity.service.ts | 137 +++++------ src/api/services/protocol.service.ts | 32 ++- src/api/services/reward.service.ts | 57 ++++- src/api/types.ts | 7 + src/api/utils.ts | 6 +- src/components/composite/Hero.tsx | 156 ++++++------ src/components/element/AddressEdit.tsx | 22 ++ src/components/element/Socials.tsx | 5 + src/components/element/SwitchMode.tsx | 29 ++- src/components/element/Tag.tsx | 143 +++++------ src/components/element/apr/AprModal.tsx | 33 +++ src/components/element/apr/AprSection.tsx | 73 ++++++ .../element/campaign/CampaignLibrary.tsx | 28 ++- .../element/campaign/CampaignTable.tsx | 22 +- .../element/campaign/CampaignTableRow.tsx | 218 ++++++++++------- .../element/campaign/CampaignTooltipDates.tsx | 33 +++ .../element/campaign/CampaignTooltipToken.tsx | 40 ++++ .../campaign/rules/AddressListRule.tsx | 35 +++ .../element/campaign/rules/BooleanRule.tsx | 14 ++ .../element/campaign/rules/LiquidityRule.tsx | 18 ++ .../campaign/rules/LiquidityTokenRule.tsx | 37 +++ .../element/campaign/rules/Rule.tsx | 33 +++ .../tableCollumns/RestrictionsCollumn.tsx | 2 +- src/components/element/chain/Chain.tsx | 1 - src/components/element/chain/ChainLibrary.tsx | 2 +- src/components/element/chain/ChainTable.tsx | 2 +- src/components/element/chain/ChainTooltip.tsx | 0 .../element/functions/SearchBar.tsx | 16 +- .../leaderboard/LeaderboardLibrary.tsx | 31 ++- .../element/leaderboard/LeaderboardTable.tsx | 6 +- .../leaderboard/LeaderboardTableRow.tsx | 43 +++- .../element/opportunity/OpportunityButton.tsx | 5 +- .../opportunity/OpportunityFilters.tsx | 225 +++++++++++++++--- .../opportunity/OpportunityLibrary.tsx | 50 ++-- .../opportunity/OpportunityPagination.tsx | 44 ++-- .../element/opportunity/OpportunityTable.tsx | 16 +- .../opportunity/OpportunityTableRow.tsx | 101 ++++---- .../participate/Participate.client.tsx | 74 ++++++ .../element/participate/Participate.tsx | 32 --- .../participate/ParticipateTester.client.tsx | 2 +- .../element/protocol/ProtocolTable.tsx | 2 +- .../element/protocol/ProtocolTableRow.tsx | 4 +- .../rewards/ClaimRewardsChainTable.tsx | 22 +- .../rewards/ClaimRewardsChainTableRow.tsx | 121 ++++------ .../element/rewards/ClaimRewardsLibrary.tsx | 2 +- .../rewards/ClaimRewardsTokenTable.tsx | 18 +- .../rewards/ClaimRewardsTokenTablePrice.tsx | 34 +-- .../rewards/ClaimRewardsTokenTableRow.tsx | 34 +-- src/components/element/token/Token.tsx | 64 ++++- .../element/token/TokenAmountModal.tsx | 20 ++ src/components/element/token/TokenTable.tsx | 4 +- src/components/element/token/TokenTooltip.tsx | 62 +++-- src/components/element/tvl/TvlLibrary.tsx | 50 ++++ .../element/tvl/TvlRowAllocation.tsx | 80 +++++++ src/components/element/tvl/TvlSection.tsx | 114 +++++++++ src/components/element/tvl/TvlTable.tsx | 23 ++ src/components/element/tvl/TvlTableRow.tsx | 61 +++++ src/components/element/user/User.tsx | 55 +++++ src/components/layout/Footer.tsx | 13 +- src/components/layout/Header.tsx | 21 +- src/components/layout/LayerMenu.tsx | 25 +- src/components/layout/LoadingIndicator.tsx | 44 ++++ src/config/actions.ts | 13 +- src/config/status.ts | 26 +- src/config/type.ts | 5 +- src/customer/assets/fonts/Obviously_Bold.otf | Bin 0 -> 96156 bytes src/customer/assets/fonts/Obviously_Bold.woff | Bin 0 -> 48552 bytes .../assets/fonts/Obviously_Bold.woff2 | Bin 0 -> 41156 bytes .../assets/fonts/Obviously_Bold_Italic.otf | Bin 0 -> 99680 bytes .../assets/fonts/Obviously_Bold_Italic.woff | Bin 0 -> 52132 bytes .../assets/fonts/Obviously_Bold_Italic.woff2 | Bin 0 -> 43644 bytes src/customer/assets/fonts/Obviously_Semi.otf | Bin 0 -> 94384 bytes src/customer/assets/fonts/Obviously_Semi.woff | Bin 0 -> 47788 bytes .../assets/fonts/Obviously_Semi.woff2 | Bin 0 -> 40512 bytes .../assets/fonts/Obviously_Semi_Italic.otf | Bin 0 -> 96744 bytes .../assets/fonts/Obviously_Semi_Italic.woff | Bin 0 -> 51340 bytes .../assets/fonts/Obviously_Semi_Italic.woff2 | Bin 0 -> 42952 bytes src/customer/assets/images/hero.jpg | Bin 17571 -> 14214 bytes src/customer/assets/style/fonts.css | 43 +++- src/hooks/resources/useCampaign.tsx | 187 +++++++++++++-- src/hooks/resources/useOpportunity.tsx | 96 ++++++-- src/hooks/resources/useReward.tsx | 28 +++ src/hooks/resources/useRewards.tsx | 37 +++ src/hooks/useParticipate.tsx | 56 ++--- src/root.tsx | 53 ++++- src/routes/_merkl.(home).(opportunities).tsx | 18 +- src/routes/_merkl.(home).tsx | 2 +- ..._merkl.actions.$action.(opportunities).tsx | 34 --- src/routes/_merkl.actions.$action.tsx | 33 --- .../_merkl.chains.$id.(opportunities).tsx | 5 +- src/routes/_merkl.chains.$id.tsx | 50 ++-- src/routes/_merkl.chains.(all).(chains).tsx | 5 +- src/routes/_merkl.chains.(all).tsx | 13 +- ...ortunities.$chain.$type.$id.(overview).tsx | 25 +- ...rtunities.$chain.$type.$id.leaderboard.tsx | 171 +++++++++---- .../_merkl.opportunities.$chain.$type.$id.tsx | 44 +++- .../_merkl.protocols.$id.(opportunities).tsx | 19 +- src/routes/_merkl.protocols.$id.tsx | 62 +++-- .../_merkl.protocols.(all).(protocols).tsx | 5 +- src/routes/_merkl.protocols.(all).tsx | 13 +- .../_merkl.status.$status.(opportunities).tsx | 28 --- src/routes/_merkl.status.$status.tsx | 44 ---- .../_merkl.tokens.$symbol.(opportunities).tsx | 9 +- src/routes/_merkl.tokens.$symbol.tsx | 29 ++- src/routes/_merkl.tokens.(all).(tokens).tsx | 5 +- src/routes/_merkl.tokens.(all).tsx | 13 +- src/routes/_merkl.tsx | 16 +- .../_merkl.users.$address.(rewards).tsx | 13 +- src/routes/_merkl.users.$address.tsx | 114 ++++----- src/routes/_merkl.users.(none).(connect).tsx | 37 +++ src/routes/_merkl.users.(none).tsx | 20 +- vite.config.ts | 8 +- 119 files changed, 3033 insertions(+), 1256 deletions(-) create mode 100644 src/api/services/cache.service.ts create mode 100644 src/api/services/campaigns/campaign.model.ts rename src/api/services/{ => campaigns}/campaign.service.ts (65%) create mode 100644 src/api/services/opportunity/opportunity.model.ts rename src/api/services/{ => opportunity}/opportunity.service.ts (54%) create mode 100644 src/components/element/AddressEdit.tsx create mode 100644 src/components/element/apr/AprModal.tsx create mode 100644 src/components/element/apr/AprSection.tsx create mode 100644 src/components/element/campaign/CampaignTooltipDates.tsx create mode 100644 src/components/element/campaign/CampaignTooltipToken.tsx create mode 100644 src/components/element/campaign/rules/AddressListRule.tsx create mode 100644 src/components/element/campaign/rules/BooleanRule.tsx create mode 100644 src/components/element/campaign/rules/LiquidityRule.tsx create mode 100644 src/components/element/campaign/rules/LiquidityTokenRule.tsx create mode 100644 src/components/element/campaign/rules/Rule.tsx delete mode 100644 src/components/element/chain/ChainTooltip.tsx create mode 100644 src/components/element/participate/Participate.client.tsx delete mode 100644 src/components/element/participate/Participate.tsx create mode 100644 src/components/element/token/TokenAmountModal.tsx create mode 100644 src/components/element/tvl/TvlLibrary.tsx create mode 100644 src/components/element/tvl/TvlRowAllocation.tsx create mode 100644 src/components/element/tvl/TvlSection.tsx create mode 100644 src/components/element/tvl/TvlTable.tsx create mode 100644 src/components/element/tvl/TvlTableRow.tsx create mode 100644 src/components/element/user/User.tsx create mode 100644 src/components/layout/LoadingIndicator.tsx create mode 100644 src/customer/assets/fonts/Obviously_Bold.otf create mode 100644 src/customer/assets/fonts/Obviously_Bold.woff create mode 100644 src/customer/assets/fonts/Obviously_Bold.woff2 create mode 100644 src/customer/assets/fonts/Obviously_Bold_Italic.otf create mode 100644 src/customer/assets/fonts/Obviously_Bold_Italic.woff create mode 100644 src/customer/assets/fonts/Obviously_Bold_Italic.woff2 create mode 100644 src/customer/assets/fonts/Obviously_Semi.otf create mode 100644 src/customer/assets/fonts/Obviously_Semi.woff create mode 100644 src/customer/assets/fonts/Obviously_Semi.woff2 create mode 100644 src/customer/assets/fonts/Obviously_Semi_Italic.otf create mode 100644 src/customer/assets/fonts/Obviously_Semi_Italic.woff create mode 100644 src/customer/assets/fonts/Obviously_Semi_Italic.woff2 create mode 100644 src/hooks/resources/useReward.tsx create mode 100644 src/hooks/resources/useRewards.tsx delete mode 100644 src/routes/_merkl.actions.$action.(opportunities).tsx delete mode 100644 src/routes/_merkl.actions.$action.tsx delete mode 100644 src/routes/_merkl.status.$status.(opportunities).tsx delete mode 100644 src/routes/_merkl.status.$status.tsx create mode 100644 src/routes/_merkl.users.(none).(connect).tsx diff --git a/bun.lockb b/bun.lockb index c62d379d3f296f956cdb6e7eff47e35ddafb932b..b48ba0fe5f2da5eab1455c6c52882c250d52be4c 100755 GIT binary patch delta 194546 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

CMmpda7Q!2$+d>XGK}4 zL5RVO0E5*acXK1~=msJZvM^sC1$bsg!bb~k!iUICYAg(GXp| zr5HDndDy-Fq7tKkWdOx#lTKU-RT)OCq}1!zk9B~W%-HH>8UhxTE0`*5~hWDTPl$WID0`#4P4L~6@qYlavMN_JRNsLEkYi|rA} z^W+c(al`T}Fl%7;bKd{c8qqXuiTSwpWyXQ(u;+jmpBWZY|nYwy3S~A4beE! z=_;hwBanr1#@CMfDJ9|rI!q$I!3kS1QB7*8S!P657Xm~lvaF3m(%Ym?8h^#!RSG^4 z_jIhwr5O=m#hUcXf!ZLdIEjUX8jAu#;vd3W`mJ^F`%dYz9ajVFsaA z&>>*)()56ib0eB@3%mbCCZXzHE2sj1S z*bR>ED`>f3%REb?|i_BC*>DiG3%kBH}%G^Z- zUGm%>_R;{qU^{K8HMhFDUxY;95{4i)W~Oy7np+F~1jkx@Vw&W zl@jnmFHz)B&=Y+~Kl9v$ZVx%k78_SruIRv*exL*!{V)%_#liFe>=6qzF*NCc%gz%y zQiopJd(y0~=C)VM{eoEpv2ie%^LbSuC9In#(rM*(Ckhq=Eg9X}-~+c%IRaWZ81C7* zGLXv@oG>Im7i7q3H``hSE_r$hUZ7af|BonEaPHDGQh$Nm2uPP`rQyd^@xl=aC9*I> ze9=PvQ?0V_VT3z1bdC#-H?QgOmRN97A7sEcG@&%+9|{3G!6Z953spxBy*c{Dippa_ zC`t4?asn*i6PfB3#|AmjvWNm= zlEYAxsDiM$1e6$IF1*MzKo!N`Fib36!Ya`Al0qZALhiP4T8jlX7D2^WwJY<%3Rsp_ zv6C!HG32P_@HgDju!+1;1P1Cq8fme#7j0>RFK&xnZCSev!ZTOCqyPZzS|cD^i|h_+ zg3A6K0FZnIdGW7Z>|86Td42vu7>C_iTIwt>(XR5!{Vr$V3IW{}xIm+E@mD zaVHqv1I0Sp-QC)zMc|UV9>9X%(8xuIOg!3s^_)XXg9gk)n}rSn;~imdlf0Zk>FMLH zzzgJTkq{_x8X@9#IL8PJQzcX*WLaFbXVI)<@DIajT-9j}uvJUA+!2~niLSoGT9&I; zqFBdGbz(tKK+CEvt=k4J?Iq4qVR5=U_O9eujmI!NpGK&P3)BYk@@*k(z?~v6#o8cp zbRtvg2-8;Obpy7lr5-hfR`QLAgcSM(r9fc1Mz7iNoB>AOv{REJ6)7WxSC1o%@Z^IE z!7^ae5%^f2V4^YNt6IW4AK?=P9wS`b4ex4ieXn>qB3G3Lq6Zs6#SzRLy6dUrtEWT; zG_)o`A)xY`BPhtHQAPx03-=>DCSjrAp)K1jtwb)+oG($<1qJn=UF^IXjK+~X@x(0j zfte9=9f;6o!1xF0dm$gx8PJgpj2%9ki2Jl)9IA5s>^7xKfP%unt`pS%J^8pe>34d5 zye2_?%7CG2VUBp`#vt)Tnk34G{J^8k?=A{Fpia6@-^7*`aSxRF6Abyz1jmq3M#9O5 zpi$(LjVz*;B+4l^`1DlFHm!o!AQZen*2mki(t^h^-5Lg7^|aQAy?l<#yro(9Id4g< z>C)XgDmFblK}Y>0?4^vC#;RrKRa_Y4;w{K)|AJmlw_tYOD^PU^sd0(?6gW}abVRQE z4dt~E-q#4U`s;WhDCyh{RRvX@3aN?8$M-zaqUT&~Q9z>b64vu3&5T}b2w~O3sP}4~ zi`Jymiy;X$`xueXW}px$a{sNmT?m1o48h`4#Q5r(blu1e$Qp#xDku5{XAKe-(V-{xK5sGC%z%C5P)!kX2AI-IjKGdZ$oav5H7 V!h2A2=~%Ay1`*O}-ZJa4{|9Vhwe|o2 delta 149785 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 SbywY5(key: string, ttl: number, value: T) { + this.cache.set(key, value, ttl); + + return value; + } + + get(key: string): T | undefined { + const cached = this.cache.get(key); + + return cached; + } + + reset(key: string) { + this.cache.del(key); + } + + wrap(resource: string, ttl: number): ClientLoaderFunction { + const loader = async ({ request, serverLoader }: ClientLoaderFunctionArgs) => { + const key = `${resource}:${request.url}`; + const cache = Cache.get(key); + + if (cache) return cache; + + const data = await serverLoader(); + + Cache.set(key, ttl, data); + + return data; + }; + + loader.hydrate = true; + return loader; + } +} + +export const Cache = new CacheService(); diff --git a/src/api/services/campaigns/campaign.model.ts b/src/api/services/campaigns/campaign.model.ts new file mode 100644 index 00000000..16db1222 --- /dev/null +++ b/src/api/services/campaigns/campaign.model.ts @@ -0,0 +1,6 @@ +import type { Campaign as CampaignFromApi } from "@merkl/api"; +import type { Fetched } from "src/api/types"; + +export type Campaign = Fetched> & { + params: CampaignFromApi["params"]; +}; diff --git a/src/api/services/campaign.service.ts b/src/api/services/campaigns/campaign.service.ts similarity index 65% rename from src/api/services/campaign.service.ts rename to src/api/services/campaigns/campaign.service.ts index 00604e36..7ebaf94c 100644 --- a/src/api/services/campaign.service.ts +++ b/src/api/services/campaigns/campaign.service.ts @@ -1,7 +1,20 @@ -import type { Campaign } from "@angleprotocol/merkl-api"; -import { api } from "../index.server"; +import type { Campaign } from "@merkl/api"; +import { fetchWithLogs } from "src/api/utils"; +import { api } from "../../index.server"; export abstract class CampaignService { + static async #fetch( + call: () => Promise, + resource = "Opportunity", + ): Promise> { + const { data, status } = await fetchWithLogs(call); + + if (status === 404) throw new Response(`${resource} not found`, { status }); + if (status === 500) throw new Response(`${resource} unavailable`, { status }); + if (data == null) throw new Response(`${resource} unavailable`, { status }); + return data; + } + /** * Retrieves opportunities query params from page request * @param request request containing query params such as chains, status, pagination... @@ -36,19 +49,18 @@ export abstract class CampaignService { } // ------ Fetch all campaigns - static async get(): Promise { + static async get() { const { data } = await api.v4.campaigns.index.get({ query: {} }); return data; } - static async getByParams(query: Parameters[0]["query"]): Promise { - const { data } = await api.v4.campaigns.index.get({ query }); - return data; + static async getByParams(query: Parameters[0]["query"]) { + return await CampaignService.#fetch(async () => api.v4.campaigns.index.get({ query })); } // ------ Fetch a campaign by ID - static async getByID(Id: string): Promise { + static async getByID(_Id: string): Promise { return null; } } diff --git a/src/api/services/opportunity/opportunity.model.ts b/src/api/services/opportunity/opportunity.model.ts new file mode 100644 index 00000000..84e4bef7 --- /dev/null +++ b/src/api/services/opportunity/opportunity.model.ts @@ -0,0 +1,6 @@ +import type { Opportunity as OpportunityFromApi } from "@merkl/api"; +import type { Fetched } from "src/api/types"; +import type { Campaign } from "../campaigns/campaign.model"; + +export type Opportunity = Fetched; +export type OpportunityWithCampaigns = Fetched; diff --git a/src/api/services/opportunity.service.ts b/src/api/services/opportunity/opportunity.service.ts similarity index 54% rename from src/api/services/opportunity.service.ts rename to src/api/services/opportunity/opportunity.service.ts index 974f5623..14516a00 100644 --- a/src/api/services/opportunity.service.ts +++ b/src/api/services/opportunity/opportunity.service.ts @@ -1,69 +1,16 @@ import type { Opportunity } from "@merkl/api"; import config from "merkl.config"; -import { api } from "../index.server"; -import { fetchWithLogs } from "../utils"; +import { api } from "../../index.server"; +import { fetchWithLogs } from "../../utils"; export abstract class OpportunityService { - static async #fetch( - call: () => Promise, - resource = "Opportunity", - ): Promise> { - const { data, status } = await fetchWithLogs(call); - - if (status === 404) throw new Response(`${resource} not found`, { status }); - if (status === 500) throw new Response(`${resource} unavailable`, { status }); - if (data == null) throw new Response(`${resource} unavailable`, { status }); - return data; - } - - /** - * Retrieves opportunities query params from page request - * @param request request containing query params such as chains, status, pagination... - * @param override params for which to override value - * @returns query - */ - static #getQueryFromRequest( - request: Request, - override?: Parameters[0]["query"], - ) { - const status = new URL(request.url).searchParams.get("status"); - const action = new URL(request.url).searchParams.get("action"); - const chainId = new URL(request.url).searchParams.get("chain"); - const page = new URL(request.url).searchParams.get("page"); - - const items = new URL(request.url).searchParams.get("items"); - const search = new URL(request.url).searchParams.get("search"); - const [sort, order] = new URL(request.url).searchParams.get("sort")?.split("-") ?? []; - - const filters = Object.assign( - { - status, - action, - chainId: chainId !== "" ? chainId : undefined, - items: items ?? 50, - sort, - order, - name: search, - page, - }, - override ?? {}, - page !== null && { page: Number(page) - 1 }, - ); - - const query = Object.entries(filters).reduce( - (_query, [key, filter]) => Object.assign(_query, filter == null ? {} : { [key]: filter }), - {}, - ); - - return query; - } - static async getManyFromRequest( request: Request, overrides?: Parameters[0]["query"], ) { return OpportunityService.getMany(Object.assign(OpportunityService.#getQueryFromRequest(request), overrides ?? {})); } + // ─── Get Many Opportunities ────────────────────────────────────────────── static async getMany( query: Parameters[0]["query"], @@ -79,22 +26,7 @@ export abstract class OpportunityService { return { opportunities: opportunities.filter(o => o !== null), count }; } - static async get(query: { - chainId: number; - type: string; - identifier: string; - }): Promise { - const { chainId, type, identifier } = query; - const opportunity = await OpportunityService.#fetch(async () => - api.v4.opportunities({ id: `${chainId}-${type}-${identifier}` }).get(), - ); - - //TODO: updates tags to take an array - if (config.tags && !opportunity.tags.includes(config.tags?.[0])) - throw new Response("Opportunity inacessible", { status: 403 }); - - return opportunity; - } + // ─── Get Opportunities with campaign ────────────────────────────────────────────── static async getCampaignsByParams(query: { chainId: number; @@ -112,4 +44,65 @@ export abstract class OpportunityService { return opportunityWithCampaigns; } + + // ─── Get Aggregate ────────────────────────────────────────────── + + static async getAggregate( + query: Parameters[0]["query"], + params: "dailyRewards", + ) { + return await OpportunityService.#fetch(async () => + api.v4.opportunities.aggregate({ field: params }).get({ query }), + ); + } + + static async #fetch( + call: () => Promise, + resource = "Opportunity", + ): Promise> { + const { data, status } = await fetchWithLogs(call); + + if (status === 404) throw new Response(`${resource} not found`, { status }); + if (status === 500) throw new Response(`${resource} unavailable`, { status }); + if (data == null) throw new Response(`${resource} unavailable`, { status }); + return data; + } + + /** + * Retrieves opportunities query params from page request + * @param request request containing query params such as chains, status, pagination... + * @param override params for which to override value + * @returns query + */ + /** + * Retrieves opportunities query params from page request + * @param request request containing query params such as chains, status, pagination... + * @param override params for which to override value + * @returns query + */ + static #getQueryFromRequest( + request: Request, + override?: Parameters[0]["query"], + ) { + const url = new URL(request.url); + + const filters = { + status: url.searchParams.get("status") ?? undefined, + mainProtocolId: url.searchParams.get("protocol") ?? url.searchParams.get("mainProtocolId") ?? undefined, + action: url.searchParams.get("action") ?? undefined, + chainId: url.searchParams.get("chain") ?? undefined, + minimumTvl: url.searchParams.get("tvl") ?? undefined, + items: url.searchParams.get("items") ? Number(url.searchParams.get("items")) : 50, + sort: url.searchParams.get("sort")?.split("-")[0], + order: url.searchParams.get("sort")?.split("-")[1], + name: url.searchParams.get("search") ?? undefined, + page: url.searchParams.get("page") ? Math.max(Number(url.searchParams.get("page")) - 1, 0) : undefined, + ...override, + }; + + // Remove null/undefined values + const query = Object.fromEntries(Object.entries(filters).filter(([, value]) => value != null)); + + return query; + } } diff --git a/src/api/services/protocol.service.ts b/src/api/services/protocol.service.ts index 8d405643..61d613a4 100644 --- a/src/api/services/protocol.service.ts +++ b/src/api/services/protocol.service.ts @@ -1,8 +1,23 @@ -import type { Protocol } from "@merkl/api"; import { api } from "../index.server"; import { fetchWithLogs } from "../utils"; export abstract class ProtocolService { + // ─── Get Many Protocols ────────────────────────────────────────────── + + static async get(query: Parameters[0]["query"]) { + return await ProtocolService.#fetch(async () => api.v4.protocols.index.get({ query })); + } + + // ─── Get Many Protocols from request ────────────────────────────────── + + static async getManyFromRequest(request: Request) { + const query = ProtocolService.#getQueryFromRequest(request); + const protocols = await ProtocolService.#fetch(async () => api.v4.protocols.index.get({ query })); + const count = await ProtocolService.#fetch(async () => api.v4.protocols.count.get({ query })); + + return { protocols, count }; + } + static async #fetch( call: () => Promise, resource = "Protocol", @@ -45,17 +60,10 @@ export abstract class ProtocolService { return query; } - static async get(query: { id: string }): Promise { - const protocol = await ProtocolService.#fetch(async () => api.v4.protocols(query).get({ query })); + static async getAll() { + const protocols = await ProtocolService.#fetch(async () => api.v4.protocols.index.get({ query: { items: 10000 } })); - return protocol; - } - - static async getManyFromRequest(request: Request): Promise<{ protocols: Protocol[]; count: number }> { - const query = ProtocolService.#getQueryFromRequest(request); - const protocols = await ProtocolService.#fetch(async () => api.v4.protocols.index.get({ query })); - const count = await ProtocolService.#fetch(async () => api.v4.protocols.count.get({ query })); - - return { protocols, count }; + //TODO: add some cache here + return protocols; } } diff --git a/src/api/services/reward.service.ts b/src/api/services/reward.service.ts index d671bacc..d72d2e2b 100644 --- a/src/api/services/reward.service.ts +++ b/src/api/services/reward.service.ts @@ -50,6 +50,35 @@ export abstract class RewardService { return data; } + /** + * Retrieves opportunities query params from page request + * @param request request containing query params such as chains, status, pagination... + * @param override params for which to override value + * @returns query + */ + static #getQueryFromRequest(request: Request, override?: Parameters[0]["query"]) { + const campaignId = new URL(request.url).searchParams.get("campaignId"); + const page = new URL(request.url).searchParams.get("page"); + const items = new URL(request.url).searchParams.get("items"); + + const filters = Object.assign( + { + campaignId, + items: items ?? 50, + page, + }, + override ?? {}, + page !== null && { page: Number(page) - 1 }, + ); + + const query = Object.entries(filters).reduce( + (_query, [key, filter]) => Object.assign(_query, filter == null ? {} : { [key]: filter }), + {}, + ); + + return query; + } + static async getForUser(address: string): Promise { const rewards = await RewardService.#fetch(async () => api.v4.users({ address }).rewards.full.get()); @@ -57,33 +86,35 @@ export abstract class RewardService { return rewards; } - static async getByParams(query: { - items?: number; - page?: number; - chainId: number; - campaignIds: string[]; - }) { + static async getManyFromRequest( + request: Request, + overrides?: Parameters[0]["query"], + ) { + return RewardService.getByParams(Object.assign(RewardService.#getQueryFromRequest(request), overrides ?? {})); + } + + static async getByParams(query: Parameters[0]["query"]) { const rewards = await RewardService.#fetch(async () => api.v4.rewards.index.get({ - query: { - ...query, - campaignIds: query.campaignIds.join(","), - }, + query, }), ); - return rewards as unknown as IRewards[]; + const count = await RewardService.#fetch(async () => api.v4.rewards.count.get({ query })); + const { amount } = await RewardService.#fetch(async () => api.v4.rewards.total.get({ query })); + + return { count, rewards, total: amount }; } static async total(query: { chainId: number; - campaignIds: string[]; + campaignId: string; }): Promise { const total = await RewardService.#fetch(async () => api.v4.rewards.total.get({ query: { ...query, - campaignIds: query.campaignIds.join(","), + campaignId: query.campaignId, }, }), ); diff --git a/src/api/types.ts b/src/api/types.ts index 6b369f0a..61557367 100644 --- a/src/api/types.ts +++ b/src/api/types.ts @@ -1,3 +1,10 @@ import type { MerklApi } from "@merkl/api"; +import type { SerializeFrom, TypedResponse } from "@remix-run/node"; export type Api = ReturnType; + +/** + * Type returned through a loader + * @description helps with inconsistencies of the implicit type when returned through the remix json() loader + */ +export type Fetched = SerializeFrom<() => TypedResponse>; diff --git a/src/api/utils.ts b/src/api/utils.ts index 44e02cff..d0d93984 100644 --- a/src/api/utils.ts +++ b/src/api/utils.ts @@ -26,8 +26,10 @@ export async function fetchWithLogs; -export default function Hero({ navigation, breadcrumbs, icons, title, description, tags, tabs, children }: HeroProps) { - const location = useLocation(); +export type HeroInformations = { + data: React.ReactNode; + label: string; + key: string; +}; +export default function Hero({ + navigation, + breadcrumbs, + icons, + title, + description, + tags, + sideDatas, + tabs, + children, +}: HeroProps) { + const location = useLocation(); return ( <> + {/* TODO: Align lines & descriptions on all pages */} + {/* TODO: On sub-pages (all pages except Opportunities): Replace the banner by a color */} + className={`${ + location?.pathname === "/" || location?.pathname === "/opportunities" ? "bg-cover" : "bg-main-6" + } flex-row justify-between bg-no-repeat xl:aspect-auto xl:min-h-[350px] aspect-[1440/300]`} + style={{ + backgroundImage: + location?.pathname === "/" || location?.pathname === "/opportunities" + ? `url('${config.images.hero}')` + : "none", + }}> - - {/* TODO: Build dynamic breadcrumbs */} - {/** Disabled and set invisible when undefined to preserve layout height */} - {breadcrumbs?.map(breadcrumb => { - if (breadcrumb.component) return breadcrumb.component; + if (breadcrumb.component) return <>{breadcrumb.component}; return ( - ))} - - )} - + + {!!tabs && } +

{children}
); } + +export function defaultHeroSideDatas(count: number, maxApr: number, dailyRewards: number) { + return [ + !!count && { + data: ( + + {count} + + ), + label: "Live opportunities", + key: crypto.randomUUID(), + }, + !!dailyRewards && { + data: ( + + {dailyRewards} + + ), + label: "Daily rewards", + key: crypto.randomUUID(), + }, + !!maxApr && { + data: ( + + {maxApr / 100} + + ), + label: "Max APR", + key: crypto.randomUUID(), + }, + ].filter(data => !!data); +} diff --git a/src/components/element/AddressEdit.tsx b/src/components/element/AddressEdit.tsx new file mode 100644 index 00000000..90af014e --- /dev/null +++ b/src/components/element/AddressEdit.tsx @@ -0,0 +1,22 @@ +import { useNavigate } from "@remix-run/react"; +import { Button, Group, Icon, Input } from "packages/dappkit/src"; +import { useState } from "react"; + +export default function AddressEdit() { + const navigate = useNavigate(); + const [inputAddress, setInputAddress] = useState(); + const [_isEditingAddress, setIsEditingAddress] = useState(false); + + return ( + + + + + ); +} diff --git a/src/components/element/Socials.tsx b/src/components/element/Socials.tsx index 2ea6204c..b045d7d5 100644 --- a/src/components/element/Socials.tsx +++ b/src/components/element/Socials.tsx @@ -24,6 +24,11 @@ export default function Socials() { )} + {!!config.socials.medium && ( + + )} ); } diff --git a/src/components/element/SwitchMode.tsx b/src/components/element/SwitchMode.tsx index 1379ae9d..2ad8e7a3 100644 --- a/src/components/element/SwitchMode.tsx +++ b/src/components/element/SwitchMode.tsx @@ -1,16 +1,31 @@ +import { Button, Icon, Select, useTheme } from "dappkit"; import config from "merkl.config"; -import { Button, Icon, useTheme } from "packages/dappkit/src"; import { useMemo } from "react"; export default function SwitchMode() { - const { mode, toggleMode } = useTheme(); + const { mode, toggleMode, themes, theme, setTheme } = useTheme(); const canSwitchModes = useMemo(() => !(!config.modes || config.modes?.length === 1), []); + const themeOptions = useMemo(() => { + return Object.keys(themes).reduce( + (obj, name) => + Object.assign(obj, { + [name]: name, + }), + {}, + ); + }, [themes]); + return ( - canSwitchModes && ( - - ) + <> + {process.env.NODE_ENV !== "production" && Object.keys(themeOptions)?.length > 1 && ( + setInnerSearch(v)]} suffix={} onClick={onSearchSubmit} + size="sm" placeholder="Search" /> )} {fields.includes("action") && ( setStatus(s as string[])]} + state={[statusInput, setStatusInput]} allOption={"All status"} multiple options={statusOptions} - look="bold" + look="tint" placeholder="Status" /> )} {fields.includes("chain") && ( setProtocolInput(n)]} + allOption={"All protocols"} + multiple + search + options={protocolOptions} + look="tint" + placeholder="Protocols" + /> + )} + {fields.includes("tvl") && ( +
+ (/^\d+$/.test(n) || !n) && setTvlInput(n)]} + look="soft" + name="tvl" + value={tvlInput} + className="min-w-[4ch]" + suffix={} + placeholder="Minimum TVL" + /> + + )} + {((canApply && !clearing && navigation.state === "idle") || + (applying && !clearing && navigation.state === "loading")) && ( + + )} + ); } diff --git a/src/components/element/opportunity/OpportunityLibrary.tsx b/src/components/element/opportunity/OpportunityLibrary.tsx index 72eef6e6..9e6c484b 100644 --- a/src/components/element/opportunity/OpportunityLibrary.tsx +++ b/src/components/element/opportunity/OpportunityLibrary.tsx @@ -1,6 +1,7 @@ -import type { Chain, Opportunity } from "@merkl/api"; -import { Group, type Order } from "dappkit"; +import type { Chain } from "@merkl/api"; +import { Box, Group, type Order, Title } from "dappkit"; import { useMemo } from "react"; +import type { Opportunity } from "src/api/services/opportunity/opportunity.model"; import useSearchParamState from "src/hooks/filtering/useSearchParamState"; import OpportunityFilters, { type OpportunityFilterProps } from "./OpportunityFilters"; import OpportunityPagination from "./OpportunityPagination"; @@ -13,12 +14,17 @@ export type OpportunityLibrary = { chains?: Chain[]; } & OpportunityFilterProps; -export default function OpportunityLibrary({ opportunities, count, only, exclude, chains }: OpportunityLibrary) { +export default function OpportunityLibrary({ + opportunities, + count, + only, + exclude, + chains, + protocols, +}: OpportunityLibrary) { const rows = useMemo( () => - opportunities?.map(o => ( - - )), + opportunities?.map(o => ), [opportunities], ); @@ -37,18 +43,24 @@ export default function OpportunityLibrary({ opportunities, count, only, exclude } return ( - } - header={ - - - - }> - {rows} - + + + + + + Opportunities + + } + dividerClassName={index => (index < 2 ? "bg-accent-8" : "bg-main-8")} + sortable={sortable} + order={(sortIdAndOrder ?? [])?.[1]} + sort={(sortIdAndOrder ?? [])?.[0] ?? "rewards"} + onSort={onSort} + footer={count !== undefined && }> + {rows} + + ); } diff --git a/src/components/element/opportunity/OpportunityPagination.tsx b/src/components/element/opportunity/OpportunityPagination.tsx index dfd6f471..d5a39e3b 100644 --- a/src/components/element/opportunity/OpportunityPagination.tsx +++ b/src/components/element/opportunity/OpportunityPagination.tsx @@ -1,4 +1,4 @@ -import { Button, Group, Icon, List, Select } from "dappkit/src"; +import { Button, Group, Icon, Select } from "dappkit/src"; import { useMemo } from "react"; import useSearchParamState from "src/hooks/filtering/useSearchParamState"; @@ -19,7 +19,7 @@ export default function OpportunityPagination({ count }: OpportunityPaginationPr v => Number.parseInt(v), ); - const pages = useMemo(() => Math.round((count ?? 0) / (itemsFilter ?? 20)) - 1, [count, itemsFilter]); + const pages = useMemo(() => Math.ceil((count ?? 0) / (itemsFilter ?? 20)), [count, itemsFilter]); const pageOptions = useMemo(() => { return [...Array(Math.max(Math.round(pages ?? 0), 1)).fill(0)] .map((_, index) => index + 1) @@ -28,30 +28,42 @@ export default function OpportunityPagination({ count }: OpportunityPaginationPr return ( - + + + + - - + ); } diff --git a/src/components/element/opportunity/OpportunityTable.tsx b/src/components/element/opportunity/OpportunityTable.tsx index 704d99c3..93a5cf0d 100644 --- a/src/components/element/opportunity/OpportunityTable.tsx +++ b/src/components/element/opportunity/OpportunityTable.tsx @@ -1,20 +1,18 @@ -import { createTable } from "dappkit"; +import { Title, createTable } from "dappkit"; export const [OpportunityTable, OpportunityRow, opportunityColumns] = createTable({ opportunity: { - name: "Opportunities", + name: ( + + Opportunities + + ), size: "minmax(350px,1fr)", compact: "1fr", className: "justify-start", main: true, }, - actions: { - name: "Actions", - size: "minmax(min-content,150px)", - compactSize: "minmax(min-content,1fr)", - className: "justify-center", - }, - apy: { + apr: { name: "APR", size: "minmax(min-content,150px)", compactSize: "minmax(min-content,1fr)", diff --git a/src/components/element/opportunity/OpportunityTableRow.tsx b/src/components/element/opportunity/OpportunityTableRow.tsx index 1b6960d0..44a874ef 100644 --- a/src/components/element/opportunity/OpportunityTableRow.tsx +++ b/src/components/element/opportunity/OpportunityTableRow.tsx @@ -1,14 +1,13 @@ import type { Opportunity } from "@merkl/api"; import { Link } from "@remix-run/react"; -import { Group } from "dappkit"; -import { Icons } from "dappkit"; import type { BoxProps } from "dappkit"; -import { Title } from "dappkit"; -import { Value } from "dappkit"; -import { Button } from "dappkit"; +import { Dropdown, Group, Icon, Icons, PrimitiveTag, Text, Title, Value } from "dappkit"; import { mergeClass } from "dappkit"; +import { useOverflowingRef } from "packages/dappkit/src/hooks/events/useOverflowing"; import useOpportunity from "src/hooks/resources/useOpportunity"; import Tag, { type TagTypes } from "../Tag"; +import AprModal from "../apr/AprModal"; +import TokenAmountModal from "../token/TokenAmountModal"; import { OpportunityRow } from "./OpportunityTable"; export type OpportunityTableRowProps = { @@ -17,67 +16,89 @@ export type OpportunityTableRowProps = { } & BoxProps; export default function OpportunityTableRow({ hideTags, opportunity, className, ...props }: OpportunityTableRowProps) { - const { tags, link, icons } = useOpportunity(opportunity); + const { tags, link, icons, rewardsBreakdown } = useOpportunity(opportunity); + + const { ref, overflowing } = useOverflowingRef(); return ( - + - {tags - ?.filter(({ type }) => !hideTags || hideTags.includes(type)) - .map(tag => { - return ; - })} - - } - apyColumn={ - - - + + } tvlColumn={ - - - + + } rewardsColumn={ - - - + + {rewardsBreakdown.map(({ token: { icon } }) => ( + + ))} + + + } opportunityColumn={ - - - {icons} - - {opportunity.name} - + + + + {icons} + + {/* TODO: embed the ellipsis scroll behavior in the Text component as an ellipsis prop */} + + + <span className="overflow-visible">{opportunity.name}</span> + + {tags + ?.filter(a => a !== undefined) ?.filter(({ type }) => !hideTags || !hideTags.includes(type)) .map(tag => ( - + ))} diff --git a/src/components/element/participate/Participate.client.tsx b/src/components/element/participate/Participate.client.tsx new file mode 100644 index 00000000..7113912b --- /dev/null +++ b/src/components/element/participate/Participate.client.tsx @@ -0,0 +1,74 @@ +import type { Opportunity } from "@merkl/api"; +import { Box, Button, Group, Input, Select, Space, Text } from "dappkit"; +import TransactionButton from "packages/dappkit/src/components/dapp/TransactionButton"; +import { useMemo, useState } from "react"; +import useParticipate from "src/hooks/useParticipate"; +import { formatUnits } from "viem"; +import Token from "../token/Token"; + +export type ParticipateProps = { + opportunity: Opportunity; +}; + +export default function Participate({ opportunity }: ParticipateProps) { + const [tokenAddress, setTokenAddress] = useState(); + const [amount, setAmount] = useState(0n); + const { + target, + targets, + balance, + token: inputToken, + approve, + deposit, + transaction, + } = useParticipate(opportunity.chainId, opportunity.protocol?.id, opportunity.identifier, tokenAddress, amount); + + console.log("tx", transaction, opportunity.identifier, target); + + const balanceOptions = useMemo( + () => + balance?.reduce( + (obj, token) => + Object.assign(obj, { + [token.address]: ( + <> + ({formatUnits(token?.balance, token?.decimals)}) + + ), + }), + {}, + ) ?? {}, + [balance], + ); + return ( + <> + + + + + + + + token0} /> + token1} /> + Approve + Participate + + + + Warning about the fiability of the feature + + + ); +} diff --git a/src/components/element/participate/Participate.tsx b/src/components/element/participate/Participate.tsx deleted file mode 100644 index 68740daf..00000000 --- a/src/components/element/participate/Participate.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import type { Opportunity } from "@merkl/api"; -import { Box, Button, Input, Space, Text } from "dappkit"; - -export type ParticipateProps = { - opportunity: Opportunity; -}; - -export default function Participate(_props: ParticipateProps) { - return ( - <> - - - - - - token0} /> - token1} /> - - - - - Warning about the fiability of the feature - - - ); -} diff --git a/src/components/element/participate/ParticipateTester.client.tsx b/src/components/element/participate/ParticipateTester.client.tsx index eb6ebb53..9ec55b20 100644 --- a/src/components/element/participate/ParticipateTester.client.tsx +++ b/src/components/element/participate/ParticipateTester.client.tsx @@ -75,7 +75,7 @@ export default function ParticipateTester({ chains }: ParticipateTesterProps) { {/* */} {/* {target.name} */} {target?.tokens.map(tkn => ( - + ))} ), diff --git a/src/components/element/protocol/ProtocolTable.tsx b/src/components/element/protocol/ProtocolTable.tsx index 400c39b5..6df71742 100644 --- a/src/components/element/protocol/ProtocolTable.tsx +++ b/src/components/element/protocol/ProtocolTable.tsx @@ -2,7 +2,7 @@ import { createTable } from "dappkit"; export const [ProtocolTable, ProtocolRow, protocolColumns] = createTable({ protocol: { - name: "PROTOCOL", + name: "Protocol", size: "minmax(350px,1fr)", compact: "1fr", className: "justify-start", diff --git a/src/components/element/protocol/ProtocolTableRow.tsx b/src/components/element/protocol/ProtocolTableRow.tsx index 84560370..0ec45eb2 100644 --- a/src/components/element/protocol/ProtocolTableRow.tsx +++ b/src/components/element/protocol/ProtocolTableRow.tsx @@ -12,9 +12,9 @@ export type ProtocolTableRowProps = { protocol: Protocol; } & BoxProps; -export default function ProtocolTableRow({ hideTags, protocol, className, ...props }: OpportunityTableRowProps) { +export default function ProtocolTableRow({ hideTags, protocol, className, ...props }: ProtocolTableRowProps) { return ( - + reward.chain.id === chainId, [reward, chainId]); - const claimTransaction = useMemo(() => { - const abi = parseAbi(["function claim(address[],address[],uint256[],bytes32[][]) view returns (uint256)"]); - - const tokenAddresses = reward.rewards.map(({ token }) => token.address as `0x${string}`); - const accumulatedRewards = reward.rewards.map(({ amount }) => amount); - const proofs = reward.rewards.map(({ proofs }) => proofs as `0x${string}`[]); + const { claimTransaction } = useReward( + reward, + !isUserRewards ? undefined : user, + selectedTokens?.size > 0 ? selectedTokens : undefined, + ); - if (!reward || !user || !isUserRewards) return; - return { - to: reward.distributor, - data: encodeFunctionData({ - abi, - functionName: "claim", - args: [tokenAddresses.map(() => user as `0x${string}`), tokenAddresses, accumulatedRewards, proofs], - }), - }; - }, [user, reward, isUserRewards]); + const unclaimed = useMemo( + () => reward.rewards.reduce((sum, { amount, claimed, token }) => sum + Fmt.toPrice(amount - claimed, token), 0), + [reward], + ); - const unclaimed = useMemo(() => { - return reward.rewards.reduce( - (sum, { amount, claimed, token: { decimals, price } }) => - sum + Number.parseFloat(formatUnits(amount - claimed, decimals)) * price, - 0, - ); - }, [reward]); + const renderTokenRewards = useMemo(() => { + return reward.rewards + .sort((a, b) => { + const priceA = Fmt.toPrice(a.amount - a.claimed, a.token); + const priceB = Fmt.toPrice(b.amount - b.claimed, b.token); - const claimed = useMemo(() => { - return reward.rewards.reduce( - (sum, { claimed, token: { decimals, price } }) => sum + Number.parseFloat(formatUnits(claimed, decimals)) * price, - 0, - ); - }, [reward]); + if (b.amount === b.claimed && a.amount === a.claimed) + return Fmt.toPrice(b.amount, b.token) - Fmt.toPrice(a.amount, a.token); + return priceB - priceA; + }) + .map(_reward => ( + { + setSelectedTokens(t => { + if (!t.has(_reward.token.address)) t.add(_reward.token.address); + else t.delete(_reward.token.address); - const renderTokenRewards = useMemo( - () => - reward.rewards - .sort((a, b) => Number(b.amount - b.claimed - (a.amount - a.claimed))) - .map(_reward => ( - { - setSelectedTokens(t => { - if (checked) t.add(_reward.token.address); - else t.delete(_reward.token.address); - - return new Set(t); - }); - }, - ]} - key={_reward.token.address} - reward={_reward} - /> - )), - [reward, selectedTokens], - ); + return new Set(t); + }); + }, + ]} + reward={_reward} + /> + )); + }, [reward, selectedTokens.size, selectedTokens, isOnCorrectChain, isAbleToClaim]); return ( ) : ( - + ))} } unclaimedColumn={ - - {unclaimed} - - } - claimedColumn={ - - {claimed} - + unclaimed === 0 ? undefined : ( + + {unclaimed} + + ) }> - - TOKEN - - } - size="sm" - look="soft"> + "!bg-main-8"} className="[&>*]:bg-main-4" look="soft"> {renderTokenRewards} diff --git a/src/components/element/rewards/ClaimRewardsLibrary.tsx b/src/components/element/rewards/ClaimRewardsLibrary.tsx index 17af919a..61a82f3d 100644 --- a/src/components/element/rewards/ClaimRewardsLibrary.tsx +++ b/src/components/element/rewards/ClaimRewardsLibrary.tsx @@ -11,7 +11,7 @@ export type ClaimRewardsLibraryProps = { export default function ClaimRewardsLibrary({ from, rewards }: ClaimRewardsLibraryProps) { return ( - + (index === 1 ? "bg-accent-10" : "bg-main-7")}> {rewards?.map((reward, index) => ( ))} diff --git a/src/components/element/rewards/ClaimRewardsTokenTable.tsx b/src/components/element/rewards/ClaimRewardsTokenTable.tsx index 9d2cbdea..2ecedfe8 100644 --- a/src/components/element/rewards/ClaimRewardsTokenTable.tsx +++ b/src/components/element/rewards/ClaimRewardsTokenTable.tsx @@ -2,27 +2,27 @@ import { createTable } from "dappkit"; export const [ClaimRewardsTokenTable, ClaimRewardsTokenRow, claimRewardsTokenColumns] = createTable({ token: { - name: "TOKEN", + name: "Token", size: "minmax(100px,1fr)", compact: "1fr", className: "justify-start", main: true, }, - pending: { - name: "PENDING", - size: "minmax(min-content,150px)", + amount: { + name: "Claimable Now", + size: "minmax(min-content,200px)", compactSize: "minmax(min-content,200px)", className: "justify-end", }, - amount: { - name: "UNCLAIMED", - size: "minmax(min-content,150px)", + pending: { + name: "Claimable Soon", + size: "minmax(min-content,200px)", compactSize: "minmax(min-content,200px)", className: "justify-end", }, claimed: { - name: "CLAIMED", - size: "minmax(min-content,150px)", + name: "Claimed", + size: "minmax(min-content,200px)", compactSize: "minmax(min-content,200px)", className: "justify-end", }, diff --git a/src/components/element/rewards/ClaimRewardsTokenTablePrice.tsx b/src/components/element/rewards/ClaimRewardsTokenTablePrice.tsx index 9a0e8fa3..89fb87bc 100644 --- a/src/components/element/rewards/ClaimRewardsTokenTablePrice.tsx +++ b/src/components/element/rewards/ClaimRewardsTokenTablePrice.tsx @@ -1,9 +1,9 @@ -import { Group, Value } from "dappkit"; +import { Group, PrimitiveTag, Value } from "dappkit"; import type { PropsWithChildren } from "react"; import { formatUnits } from "viem"; export type ClaimRewardsTokenTablePriceProps = PropsWithChildren & { - price: number; + price: number | null; amount: bigint; decimals: number; }; @@ -11,25 +11,29 @@ export type ClaimRewardsTokenTablePriceProps = PropsWithChildren & { export default function ClaimRewardsTokenTablePrice({ amount, price, decimals }: ClaimRewardsTokenTablePriceProps) { const value = formatUnits(amount, decimals); + if (value === "0") return; return ( - + (v as string).includes("0.000") && "<0.001"} - className="text-right" + fallback={v => (v as string).includes("0.000") && "< 0.001"} + className="text-right items-center flex font-title" look={"bold"} format="0,0.###"> {value} - { - if (price === 0) return "-"; - return (v.toString() as string).includes("0.0") && "$<0.1"; - }} - className="text-right" - look={"soft"} - format="$0,0.#"> - {Number.parseFloat(value) * price} - + + { + if (price === 0) return "-"; + return (v.toString() as string).includes("0.0") && "< $0.1"; + }} + size="xs" + className="text-right items-center flex font-title" + look={"bold"} + format="$0,0.#a"> + {Number.parseFloat(value) * (price ?? 0)} + + ); } diff --git a/src/components/element/rewards/ClaimRewardsTokenTableRow.tsx b/src/components/element/rewards/ClaimRewardsTokenTableRow.tsx index cf53310c..e9bfa2e5 100644 --- a/src/components/element/rewards/ClaimRewardsTokenTableRow.tsx +++ b/src/components/element/rewards/ClaimRewardsTokenTableRow.tsx @@ -1,29 +1,36 @@ import type { Reward } from "@merkl/api"; -import { Checkbox, Divider, type GetSet, Group, Icon, Space } from "dappkit"; +import { Checkbox, type Component, Divider, type GetSet, Group, Icon, Space } from "dappkit"; import Collapsible from "packages/dappkit/src/components/primitives/Collapsible"; -import { type PropsWithChildren, useMemo, useState } from "react"; +import { Fmt } from "packages/dappkit/src/utils/formatter.service"; +import { useMemo, useState } from "react"; import Tag from "../Tag"; import OpportuntiyButton from "../opportunity/OpportunityButton"; import { ClaimRewardsTokenRow } from "./ClaimRewardsTokenTable"; import ClaimRewardsTokenTablePrice from "./ClaimRewardsTokenTablePrice"; -export type ClaimRewardsTokenTableRowProps = PropsWithChildren & { +export type ClaimRewardsTokenTableRowProps = Component<{ reward: Reward["rewards"][number]; checkedState?: GetSet; -}; + showCheckbox?: boolean; +}>; -export default function ClaimRewardsTokenTableRow({ reward, checkedState, ...props }: ClaimRewardsTokenTableRowProps) { +export default function ClaimRewardsTokenTableRow({ + reward, + checkedState, + showCheckbox, + ...props +}: ClaimRewardsTokenTableRowProps) { const [open, setOpen] = useState(false); const unclaimed = useMemo(() => BigInt(reward.amount) - BigInt(reward.claimed), [reward]); return ( setOpen(o => !o)} tokenColumn={ - + + {showCheckbox && } - } - claimColumn={ - - - }> {reward.breakdowns - .sort((a, b) => Number(b.amount - b.claimed - (a.amount - a.claimed))) + .sort( + (a, b) => Fmt.toPrice(b.amount - b.claimed, reward.token) - Fmt.toPrice(a.amount - a.claimed, reward.token), + ) + .filter(b => b.opportunity !== null) .map(b => { return ( <> @@ -66,7 +71,7 @@ export default function ClaimRewardsTokenTableRow({ reward, checkedState, ...pro {...props} key={b.opportunity.identifier} data-look={props?.look ?? "none"} - className="!px-0 !m-0 border-none" + className="!px-0 py-xl !m-0 border-none bg-main-0" onClick={() => setOpen(o => !o)} tokenColumn={ @@ -94,7 +99,6 @@ export default function ClaimRewardsTokenTableRow({ reward, checkedState, ...pro decimals={reward.token.decimals} /> } - claimColumn={null} /> ); diff --git a/src/components/element/token/Token.tsx b/src/components/element/token/Token.tsx index 7bcfc26e..7c996585 100644 --- a/src/components/element/token/Token.tsx +++ b/src/components/element/token/Token.tsx @@ -1,29 +1,75 @@ -import type { Token as TokenType } from "@merkl/api"; -import { Button, Dropdown, Icon, Value } from "packages/dappkit/src"; +import type { Chain, Token as TokenType } from "@merkl/api"; +import { Button, Dropdown, Group, Icon, type IconProps, PrimitiveTag, Value, sizeScale } from "packages/dappkit/src"; import { useMemo } from "react"; +import { formatUnits } from "viem"; import TokenTooltip from "./TokenTooltip"; export type TokenProps = { token: TokenType; + format?: "amount" | "price" | "amount_price"; + amount?: bigint; value?: boolean; - amount?: number; + symbol?: boolean; + icon?: boolean; + size?: IconProps["size"]; + chain?: Chain; }; -export default function Token({ token, amount, value }: TokenProps) { +export default function Token({ + size, + token, + amount, + format = "amount", + value, + icon = true, + symbol = true, + chain, +}: TokenProps) { + const amoutFormated = amount ? formatUnits(amount, token.decimals) : undefined; + const amountUSD = !amount ? 0 : (token.price ?? 0) * Number.parseFloat(amoutFormated ?? "0"); + const display = useMemo( () => ( <> - {amount && {amount}} - {token.symbol} + {format === "amount" || + (format === "amount_price" && !!amount && ( + (v as string).includes("0.000") && "< 0.001"} + className="text-right items-center flex font-title" + look={"bold"} + size={size} + format="0,0.###a"> + {amoutFormated} + + ))}{" "} + {icon && } + {symbol && token.symbol} + {format === "price" || + (format === "amount_price" && !!amount && ( + + + + {amountUSD} + + + + ))} ), - [token, amount], + [token, format, amoutFormated, amountUSD, amount, symbol, icon, size], ); if (value) return display; + return ( - }> - + }> + ); } diff --git a/src/components/element/token/TokenAmountModal.tsx b/src/components/element/token/TokenAmountModal.tsx new file mode 100644 index 00000000..7cba27f2 --- /dev/null +++ b/src/components/element/token/TokenAmountModal.tsx @@ -0,0 +1,20 @@ +import type { Token as TokenType } from "@merkl/api"; +import { Divider, Group } from "packages/dappkit/src"; +import type { ReactNode } from "react"; +import Token from "./Token"; + +export type TokenAmountModalProps = { tokens: { token: TokenType; amount: bigint }[]; label: ReactNode }; + +export default function TokenAmountModal({ label, tokens }: TokenAmountModalProps) { + return ( + + + {label} + + + {tokens.map(({ token, amount }) => ( + + ))} + + ); +} diff --git a/src/components/element/token/TokenTable.tsx b/src/components/element/token/TokenTable.tsx index c79a5dc2..421c32ec 100644 --- a/src/components/element/token/TokenTable.tsx +++ b/src/components/element/token/TokenTable.tsx @@ -2,14 +2,14 @@ import { createTable } from "dappkit"; export const [TokenTable, TokenRow, tokenColumns] = createTable({ token: { - name: "TOKEN", + name: "Token", size: "minmax(350px,1fr)", compact: "1fr", className: "justify-start", main: true, }, price: { - name: "PRICE", + name: "Price", size: "minmax(min-content,150px)", compactSize: "minmax(min-content,1fr)", className: "justify-end", diff --git a/src/components/element/token/TokenTooltip.tsx b/src/components/element/token/TokenTooltip.tsx index b688b087..103401e4 100644 --- a/src/components/element/token/TokenTooltip.tsx +++ b/src/components/element/token/TokenTooltip.tsx @@ -1,38 +1,50 @@ -import type { Token } from "@merkl/api"; -import { Button, Divider, Group, Hash, Icon, Text, Title } from "packages/dappkit/src"; +import type { Chain, Explorer, Token } from "@merkl/api"; +import { Button, Divider, Group, Hash, Icon, Text } from "packages/dappkit/src"; export type TokenTooltipProps = { token: Token; - amount?: number; + size?: "sm" | "md" | "lg" | "xl" | "xs"; + chain?: Chain & { explorers: Explorer[] }; }; -export default function TokenTooltip({ token }: TokenTooltipProps) { +export default function TokenTooltip({ token, size, chain }: TokenTooltipProps) { return ( <> - - - Token - - {token.address} - + + + + + + {token?.name} + + + + + {token.address} + + - - - - {token?.name} - + + + + {chain?.explorers?.map(explorer => { + return ( + + ); + })} - - {/* {token?.description} */} - - - - ); } diff --git a/src/components/element/tvl/TvlLibrary.tsx b/src/components/element/tvl/TvlLibrary.tsx new file mode 100644 index 00000000..989a1e05 --- /dev/null +++ b/src/components/element/tvl/TvlLibrary.tsx @@ -0,0 +1,50 @@ +import type { Opportunity } from "@merkl/api"; +import { Button, Icon } from "packages/dappkit/src"; +import { useMemo, useState } from "react"; +import { TvlTable } from "./TvlTable"; +import TvlTableRow from "./TvlTableRow"; + +type IProps = { + opportunity: Opportunity; +}; + +const DEFAULT_ARRAY_SIZE = 3; + +export default function TvlLibrary({ opportunity }: IProps) { + const [isShowingMore, setIsShowingMore] = useState(false); + const aprFiltered = useMemo(() => { + return opportunity.aprRecord.breakdowns.filter(breakdown => breakdown.type === "PROTOCOL"); + }, [opportunity]); + + const tvlFiltered = useMemo(() => { + return opportunity.tvlRecord.breakdowns + .filter(breakdown => breakdown.type === "PROTOCOL") + .sort((a, b) => b.value - a.value) + .slice(0, isShowingMore ? opportunity.tvlRecord.breakdowns.length : DEFAULT_ARRAY_SIZE); + }, [opportunity, isShowingMore]); + + const rows = useMemo( + () => + tvlFiltered?.map(breakdown => { + const aprBreakdown = aprFiltered.find(b => b.identifier === breakdown.identifier); + + return ; + }), + [aprFiltered, tvlFiltered], + ); + + const toggleShowMore = () => setIsShowingMore(prev => !prev); + + if (!rows.length) return null; + return ( + + {rows} + {rows.length >= DEFAULT_ARRAY_SIZE && ( + + )} + + ); +} diff --git a/src/components/element/tvl/TvlRowAllocation.tsx b/src/components/element/tvl/TvlRowAllocation.tsx new file mode 100644 index 00000000..2e018d53 --- /dev/null +++ b/src/components/element/tvl/TvlRowAllocation.tsx @@ -0,0 +1,80 @@ +import type { Opportunity } from "@merkl/api"; +import { Divider, Group, Icon, Text, Value } from "packages/dappkit/src"; + +type IProps = { + opportunity: Opportunity; +}; + +export default function TvlRowAllocation({ opportunity }: IProps) { + let content: React.ReactNode = null; + switch (opportunity.type) { + case "CLAMM": { + const tokenTvl = opportunity.tvlRecord.breakdowns.filter(b => b.type === "TOKEN"); + const token0 = opportunity.tokens[0]; + const token1 = opportunity.tokens[1]; + const tvlBreakdownToken0 = tokenTvl?.find(b => b.identifier === opportunity?.tokens[0]?.address); + const tvlBreakdownToken1 = tokenTvl?.find(b => b.identifier === opportunity?.tokens[1]?.address); + + content = ( + + + + + {tvlBreakdownToken0?.value} + + + {token0.name} + + + {!!tvlBreakdownToken0?.value && !!token0?.price && ( + + + {tvlBreakdownToken0.value * token0.price} + + {" ~ "} + + {(tvlBreakdownToken0?.value * token0.price) / opportunity.tvlRecord.total} + + {" of TVL"} + + )} + + + + + {tvlBreakdownToken1?.value} + + + {token1.name} + + + {!!tvlBreakdownToken1?.value && !!token1?.price && ( + + + {tvlBreakdownToken1.value * token1.price} + + {" ~ "} + + {(tvlBreakdownToken1?.value * token1.price) / opportunity.tvlRecord.total} + + {" of TVL"} + + )} + + + ); + break; + } + default: + content = null; + } + if (!content) return null; + return ( + <> + + TVL allocation + + {content} + + ); +} diff --git a/src/components/element/tvl/TvlSection.tsx b/src/components/element/tvl/TvlSection.tsx new file mode 100644 index 00000000..12ef148e --- /dev/null +++ b/src/components/element/tvl/TvlSection.tsx @@ -0,0 +1,114 @@ +import type { Opportunity } from "@merkl/api"; +import { Button, Divider, Group, Hash, Icon, PrimitiveTag, Text, Value } from "packages/dappkit/src"; +import { Fragment, useMemo, useState } from "react"; + +interface TvlSectionProps { + opportunity: Opportunity; +} + +const DEFAULT_ARRAY_SIZE = 3; + +export default function TvlSection({ opportunity }: TvlSectionProps) { + const [isShowingMore, setIsShowingMore] = useState(false); + + const tvlFiltered = useMemo(() => { + return opportunity.tvlRecord.breakdowns + .filter(breakdown => breakdown.type === "PROTOCOL") + .sort((a, b) => b.value - a.value) + .slice(0, isShowingMore ? opportunity.tvlRecord.breakdowns.length : 3); + }, [opportunity, isShowingMore]); + + const aprFiltered = useMemo(() => { + return opportunity.aprRecord.breakdowns.filter(breakdown => breakdown.type === "PROTOCOL"); + }, [opportunity]); + + const getTvlName = (breakdown: Opportunity["tvlRecord"]["breakdowns"][number]) => { + if (!breakdown?.identifier) return null; + + switch (breakdown?.type) { + case "PROTOCOL": + return ( + + + {breakdown.identifier.split(" ")[0]} + + + {breakdown.identifier.split(" ")[1]} + + + ); + default: + return ( + + {breakdown.identifier} + + ); + } + }; + + const hasForwarders = tvlFiltered.length > 0; + + return ( + <> + {hasForwarders && ( + <> + + + Forwarder details + + APR + + + TVL + + + + + )} + + {tvlFiltered.map(breakdown => { + const aprBreakdown = aprFiltered.find(b => b.identifier === breakdown.identifier); + return ( + + + + {getTvlName(breakdown)} + + + {aprBreakdown && ( + + + {aprBreakdown.value / 100} + + + )} + + + {breakdown.value} + + + + + + ); + })} + + + {tvlFiltered.length >= DEFAULT_ARRAY_SIZE && ( + + )} + + ); +} diff --git a/src/components/element/tvl/TvlTable.tsx b/src/components/element/tvl/TvlTable.tsx new file mode 100644 index 00000000..b9867407 --- /dev/null +++ b/src/components/element/tvl/TvlTable.tsx @@ -0,0 +1,23 @@ +import { createTable } from "dappkit"; + +export const [TvlTable, TvlRow, tvlColumns] = createTable({ + name: { + name: "TVL DETAILS", + size: "minmax(350px,1fr)", + compact: "1fr", + className: "justify-start", + main: true, + }, + apr: { + name: "APR", + size: "minmax(min-content,150px)", + compactSize: "minmax(min-content,1fr)", + className: "justify-center", + }, + tvl: { + name: "TVL", + size: "minmax(min-content,150px)", + compactSize: "minmax(min-content,1fr)", + className: "justify-center", + }, +}); diff --git a/src/components/element/tvl/TvlTableRow.tsx b/src/components/element/tvl/TvlTableRow.tsx new file mode 100644 index 00000000..f59a2c5c --- /dev/null +++ b/src/components/element/tvl/TvlTableRow.tsx @@ -0,0 +1,61 @@ +import type { Opportunity } from "@merkl/api"; +import { Button, Group, Hash, Value } from "packages/dappkit/src"; +import { useMemo } from "react"; +import { TvlRow } from "./TvlTable"; + +type IProps = { + aprBreakdown?: Opportunity["aprRecord"]["breakdowns"][number]; + tvlBreakdown: Opportunity["tvlRecord"]["breakdowns"][number]; +}; + +export default function TvlTableRow({ aprBreakdown, tvlBreakdown }: IProps) { + const breakdownName = useMemo(() => { + switch (aprBreakdown?.type) { + case "CAMPAIGN": + return ( + + Campaign{" "} + + {aprBreakdown?.identifier} + + + ); + case "PROTOCOL": + return ( + + {aprBreakdown?.identifier.split(" ")[0]} + + {aprBreakdown?.identifier.split(" ")[1]} + + + ); + case "TOKEN": + return aprBreakdown?.identifier; + default: + return ( + + {aprBreakdown?.identifier} + + ); + } + }, [aprBreakdown]); + + return ( + + + {(aprBreakdown?.value ?? 0) / 100} + + + } + tvlColumn={ + + {tvlBreakdown?.value} + + } + /> + ); +} diff --git a/src/components/element/user/User.tsx b/src/components/element/user/User.tsx new file mode 100644 index 00000000..410a81b3 --- /dev/null +++ b/src/components/element/user/User.tsx @@ -0,0 +1,55 @@ +import type { Chain } from "@merkl/api"; +import { Button, Divider, Dropdown, Group, Hash, Icon, PrimitiveTag } from "packages/dappkit/src"; +import { useWalletContext } from "packages/dappkit/src/context/Wallet.context"; +import { useMemo } from "react"; + +export type UserProps = { address: string; chain?: Chain }; + +export default function User({ address, chain: raw }: UserProps) { + const { chains } = useWalletContext(); + + const chain = useMemo(() => { + return chains?.find(c => c.id === raw?.id) ?? raw; + }, [raw, chains]); + + return ( + + + + + {address} + + + + {/* {token?.description} */} + + + {chain?.explorers?.map(explorer => { + return ( + + ); + })} + + + }> + + {address} + + + ); +} diff --git a/src/components/layout/Footer.tsx b/src/components/layout/Footer.tsx index c6d18a47..f1de1c29 100644 --- a/src/components/layout/Footer.tsx +++ b/src/components/layout/Footer.tsx @@ -31,16 +31,23 @@ export default function Footer() { ©{new Date().getFullYear()} Merkl. All rights reserved. - - + {config.footerLinks.length > 0 && + config.footerLinks.map(link => ( + + ))} + diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx index e8f854ad..773e26b8 100644 --- a/src/components/layout/Header.tsx +++ b/src/components/layout/Header.tsx @@ -31,16 +31,20 @@ const item = { export default function Header() { const { mode } = useTheme(); - const { address: user } = useWalletContext(); + const { chainId, address: user, chains } = useWalletContext(); const [open, setOpen] = useState(false); + const chain = useMemo(() => { + return chains?.find(c => c.id === chainId); + }, [chains, chainId]); + const routes = useMemo(() => { const { homepage, ...rest } = config.routes; return Object.assign( { homepage }, { - dashboard: { + claims: { icon: "RiPlanetFill", route: user ? `/users/${user}` : "/users", key: crypto.randomUUID(), @@ -86,7 +90,7 @@ export default function Header() { {Object.entries(routes) - .filter(([key]) => !["homepage", "privacy", "terms"].includes(key)) + .filter(([key]) => !["homepage"].includes(key)) .map(([key, { route }]) => { return ( + {chain?.explorers?.map(explorer => ( + + ))} + diff --git a/src/components/layout/LayerMenu.tsx b/src/components/layout/LayerMenu.tsx index 9d2581ac..af905ed9 100644 --- a/src/components/layout/LayerMenu.tsx +++ b/src/components/layout/LayerMenu.tsx @@ -14,21 +14,16 @@ export const LayerMenu: FC<{
    - {Object.entries(nav) - .filter(([key]) => !["privacy", "terms"].includes(key)) - .map(([key, value]) => ( -
  • - setOpen(false)} - to={value.route} - className="flex items-center gap-md capitalize"> - - - {key} - - -
  • - ))} + {Object.entries(nav).map(([key, value]) => ( +
  • + setOpen(false)} to={value.route} className="flex items-center gap-md capitalize"> + + + {key} + + +
  • + ))}