Skip to content

Commit

Permalink
chore: new changes (AngleProtocol#52)
Browse files Browse the repository at this point in the history
* fix: some type errors

* add: services model draft

* change: more opportunity types

* fix: lint

* add: themes and theme switcher in dev mode (AngleProtocol#4)

* add: theme selector when in dev mode

* add: theme switcher in dev mode

* fix: protocol empty tag

* fix: lint error

* Tabs sync (AngleProtocol#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 (AngleProtocol#6)

* Feat/leaderboard display (AngleProtocol#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 (AngleProtocol#8)

* tweak: dashboard

* tweak: dappkit

* fix: no user warning

* remove: input from description

* fix: lint

* add(front): modal, hero, select, tabs/tags, pagination (AngleProtocol#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 (AngleProtocol#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… (AngleProtocol#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 (AngleProtocol#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 (AngleProtocol#15)

* working on table row + new hero image

* add fitlers

* add todos

* lint

* lint

* ✨ sum daily rewards fora  protocol (AngleProtocol#16)

* Fix/campaign page (AngleProtocol#17)

* wording

* fix hero link default home

* lint

* wording

* wording

* show icon

* ✨ redirect to Etherscan on TOken tooltip

* 🐛 change Time zone UTC

* update: opportunities pages (AngleProtocol#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 (AngleProtocol#18)

* apr done

* hide forwards if none + change border

* lint

* replace content null

* Fix/campaign page (AngleProtocol#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 (AngleProtocol#21)

* fixes: feedback, mainly opportunities & dashboard (AngleProtocol#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 (AngleProtocol#23)

* Enhance opportunity data retrieval with APR and daily rewards metrics (AngleProtocol#24)

* fix: pagination defaulting  & cache (AngleProtocol#25)

* fix: bugs in selectors

* fix: dappkit

* clean wip: comment out static sideDatas for dynamic implementation (AngleProtocol#26)

* fix: protocl filter (AngleProtocol#27)

* fix: protocol desc (AngleProtocol#28)

* fix: protocol: description

* rm: log

* token stats + cleaning (AngleProtocol#29)

* Small APR Fix (AngleProtocol#19)

* lint

* commit hash

* commit hash

* commit hash

* Fixes on protocol, chain, token and campaign pages (AngleProtocol#30)

* Fixes on protocol, chain, token and campaign pages

* lint

* fix tooltip

* add: depositor (AngleProtocol#31)

* update: dappkit (AngleProtocol#33)

* feat(front): apr modal, layermenu, issues !!! (AngleProtocol#32)

* redesign APR

* responsive

* layermenu

* lint

* change title

* remove comment

* lint

* rename homepage to home (AngleProtocol#34)

* feat(front): change header logo & selects (AngleProtocol#35)

* change logo size

* commiut hash

* fix: update Dropdown component to use onHover for APR and TVL columns (AngleProtocol#36)

* add: fonts config (AngleProtocol#37)

* add: fonts config

* lint

---------

Co-authored-by: indaviande <[email protected]>

* feat: icons & uuid (AngleProtocol#41)

* icon on protocols

* replace import { v4 as uuidv4 } from uuid;
uuidv4();

* lint

* chore: add test filter (AngleProtocol#38)

* chore: add test filter

* chore: remove isTest

* fix: lint

* add: deposit modal (AngleProtocol#42)

* update: token

* add: hooks

* add: supply modal

* wip display zk rewards (AngleProtocol#39)

* wip display zk rewards

* wip

* refactor: clean up reward components and end single line rewards display

* lint

* feat(api): enhance ProtocolService to include tags from config in API queries (AngleProtocol#43)

* update: dappkit

* fix(campaign): update chain reference in CampaignTableRow component (AngleProtocol#44)

* fix(campaign): update chain reference in CampaignTableRow component

* refactor(leaderboard): remove campaign ID display from leaderboard component

* lint

* feat(rewards): add rewards navigation mode configuration and update C… (AngleProtocol#45)

* feat(rewards): add rewards navigation mode configuration and update ClaimRewardsLibrary component accordingly

* lint

* chore: historical claim tab

* chore: historical claims

* chore: lint

* fix: add auto linting

* chore: remove useless type

* fix: lint

* feat: position route (AngleProtocol#47)

* feat: position route

* fix: issue

* chore: position page

* lint

* rmv workflows

---------

Co-authored-by: sheykei <[email protected]>
Co-authored-by: sheykei <[email protected]>
Co-authored-by: Viande <[email protected]>
Co-authored-by: hugolxt <[email protected]>
Co-authored-by: Hugo Lextrait <[email protected]>
Co-authored-by: sheykei <[email protected]>
Co-authored-by: indaviande <[email protected]>
  • Loading branch information
8 people authored Dec 19, 2024
1 parent e055253 commit 9920a89
Show file tree
Hide file tree
Showing 57 changed files with 1,206 additions and 394 deletions.
4 changes: 4 additions & 0 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"recommendations": [],
"unwantedRecommendations": []
}
18 changes: 18 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"editor.codeActionsOnSave": {
"source.organizeImports.biome": "explicit"
},
"editor.defaultFormatter": "biomejs.biome",
"[typescript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[javascript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"editor.formatOnSave": true,
"editor.formatOnType": false,
"editor.foldingImportsByDefault": true,
"editor.foldingHighlight": true,
"editor.foldingStrategy": "auto",
"files.eol": "\n"
}
Binary file modified bun.lockb
Binary file not shown.
23 changes: 14 additions & 9 deletions merkl.config.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { createColoring } from "dappkit";
import { createConfig } from "src/config/type";
import hero from "src/customer/assets/images/hero.jpg?url";
import { v4 as uuidv4 } from "uuid";
import { http, createClient, custom } from "viem";

import {
arbitrum,
astar,
Expand Down Expand Up @@ -45,7 +47,10 @@ export default createConfig({
appName: "Merkl",
modes: ["dark", "light"],
defaultTheme: "ignite",
deposit: false,
tags: [],
opportunityNavigationMode: "direct",
rewardsNavigationMode: "chain",
deposit: true,
themes: {
ignite: {
base: createColoring(["#1755F4", "#FF7900", "#0D1530"], ["#1755F4", "#FF7900", "#FFFFFF"]),
Expand Down Expand Up @@ -88,43 +93,43 @@ export default createConfig({
home: {
icon: "RiHomeFill",
route: "/",
key: crypto.randomUUID(),
key: uuidv4(),
},
opportunities: {
icon: "RiPlanetFill",
route: "/opportunities",
key: crypto.randomUUID(),
key: uuidv4(),
},
// protocols: {
// icon: "RiVipCrown2Fill",
// route: "/protocols",
// key: crypto.randomUUID(),
// key: uuidv4(),
// },
// bridge: {
// icon: "RiCompassesLine",
// route: "/bridge",
// key: crypto.randomUUID(),
// key: uuidv4(),
// },
docs: {
icon: "RiFile4Fill",
external: true,
route: "https://docs.merkl.xyz/",
key: crypto.randomUUID(),
key: uuidv4(),
},
faq: {
icon: "RiQuestionFill",
route: "/faq",
key: crypto.randomUUID(),
key: uuidv4(),
},
// terms: {
// icon: "RiCompassesLine",
// route: "/terms",
// key: crypto.randomUUID(),
// key: uuidv4(),
// },
// privacy: {
// icon: "RiInformationFill",
// route: "/privacy",
// key: crypto.randomUUID(),
// key: uuidv4(),
// },
},
socials: {
Expand Down
7 changes: 3 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,13 @@
"serve": "remix-serve ./build/server/index.js",
"typecheck": "tsc"
},
"workspaces": [
"packages/*"
],
"workspaces": ["packages/*"],
"dependencies": {
"@acab/ecsstatic": "^0.8.0",
"@ariakit/react": "^0.4.12",
"@elysiajs/eden": "^1.1.3",
"@emotion/css": "^11.13.4",
"@merkl/api": "0.10.156",
"@merkl/api": "0.10.188",
"@radix-ui/react-accordion": "^1.2.1",
"@radix-ui/react-scroll-area": "^1.2.0",
"@remix-run/dev": "^2.11.2",
Expand Down Expand Up @@ -49,6 +47,7 @@
"tailwindcss": "^3.4.12",
"tailwindcss-animate": "^1.0.7",
"typedoc": "^0.26.7",
"uuid": "^11.0.3",
"viem": "2.21.54",
"vite-plugin-dts": "^4.2.1",
"wagmi": "^2.12.29",
Expand Down
43 changes: 0 additions & 43 deletions src/api/opportunity/opportunity.ts

This file was deleted.

4 changes: 2 additions & 2 deletions src/api/services/campaigns/campaign.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,13 @@ export abstract class CampaignService {
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 test = new URL(request.url).searchParams.get("test") ?? undefined;
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, items, sort, order, name: search, page },
{ status, action, chainId, items, sort, order, name: search, page, test },
override ?? {},
page !== null && { page: Number(page) - 1 },
);
Expand Down
20 changes: 20 additions & 0 deletions src/api/services/claims.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { api } from "../index.server";
import { fetchWithLogs } from "../utils";

export abstract class ClaimsService {
static async #fetch<R, T extends { data: R; status: number; response: Response }>(
call: () => Promise<T>,
resource = "Claims",
): Promise<NonNullable<T["data"]>> {
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;
}

static async getForUser(address: string) {
return await ClaimsService.#fetch(async () => api.v4.claims({ address }).get());
}
}
56 changes: 56 additions & 0 deletions src/api/services/interaction.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import { api as clientApi } from "src/api/index.client";
import { fetchWithLogs } from "../utils";

export abstract class InteractionService {
static async #fetch<R, T extends { data: R; status: number; response: Response }>(
call: () => Promise<T>,
resource = "Chain",
): Promise<NonNullable<T["data"]>> {
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;
}

/**
* Client side
* @param chainId
* @param protocolId
* @param identifier
*/
static async getTarget(chainId: number, protocolId: string, identifier: string) {
const targets = await InteractionService.#fetch(() =>
clientApi.v4.interaction.targets.get({
query: { chainId, protocolId, identifier },
}),
);

//TODO: opportunity/:id/target instead of taking the first result and expecting unique
return targets?.[0];
}

/**
* Client side
*/
static async getTransaction(payload: Parameters<typeof clientApi.v4.interaction.transaction.get>[0]["query"]) {
const transaction = await InteractionService.#fetch(() =>
clientApi.v4.interaction.transaction.get({
query: payload,
}),
);

return transaction;
}

static async getBalances(chainId: number, address: string) {
const tokens = await InteractionService.#fetch(() =>
clientApi.v4.tokens.balances.get({
query: { chainId: chainId, userAddress: address },
}),
);

return tokens;
}
}
20 changes: 20 additions & 0 deletions src/api/services/liquidity.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { api } from "../index.server";
import { fetchWithLogs } from "../utils";

export abstract class LiquidityService {
static async #fetch<R, T extends { data: R; status: number; response: Response }>(
call: () => Promise<T>,
resource = "Positions",
): Promise<NonNullable<T["data"]>> {
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;
}

static async getForUser(query: Parameters<typeof api.v4.liquidity.index.get>["0"]["query"]) {
return await LiquidityService.#fetch(async () => api.v4.liquidity.index.get({ query }));
}
}
3 changes: 2 additions & 1 deletion src/api/services/opportunity/opportunity.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ export abstract class OpportunityService {

//TODO: updates tags to take an array
if (config.tags && !opportunityWithCampaigns.tags.includes(config.tags?.[0]))
throw new Response("Opportunity inacessible", { status: 403 });
throw new Response("Opportunity inaccessible", { status: 403 });

return opportunityWithCampaigns;
}
Expand Down Expand Up @@ -96,6 +96,7 @@ export abstract class OpportunityService {
sort: url.searchParams.get("sort")?.split("-")[0],
order: url.searchParams.get("sort")?.split("-")[1],
name: url.searchParams.get("search") ?? undefined,
test: url.searchParams.get("test") ?? undefined,
page: url.searchParams.get("page") ? Math.max(Number(url.searchParams.get("page")) - 1, 0) : undefined,
...override,
};
Expand Down
22 changes: 18 additions & 4 deletions src/api/services/protocol.service.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,33 @@
import config from "merkl.config";
import { api } from "../index.server";
import { fetchWithLogs } from "../utils";

export abstract class ProtocolService {
// ─── Get Many Protocols ──────────────────────────────────────────────

static async get(query: Parameters<typeof api.v4.protocols.index.get>[0]["query"]) {
return await ProtocolService.#fetch(async () => api.v4.protocols.index.get({ query }));
return await ProtocolService.#fetch(async () =>
api.v4.protocols.index.get({
query: Object.assign({ ...query }, config.tags?.[0] ? { tags: config.tags?.[0] } : {}),
}),
);
}

// ─── 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 }));
const query: Parameters<typeof api.v4.protocols.index.get>[0]["query"] =
ProtocolService.#getQueryFromRequest(request);
const protocols = await ProtocolService.#fetch(async () =>
api.v4.protocols.index.get({
query: Object.assign({ ...query }, config.tags?.[0] ? { tags: config.tags?.[0] } : {}),
}),
);
const count = await ProtocolService.#fetch(async () =>
api.v4.protocols.count.get({
query: Object.assign({ ...query }, config.tags?.[0] ? { tags: config.tags?.[0] } : {}),
}),
);

return { protocols, count };
}
Expand Down
Loading

0 comments on commit 9920a89

Please sign in to comment.