From b3dbc93f86ecac9d727acd446b2ec16d9515a5be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Pradel?= Date: Mon, 12 Aug 2024 21:53:13 +0200 Subject: [PATCH 1/5] feat: migrate protocol definition to separate package --- .gitignore | 1 + packages/protocols/package.json | 12 ++++ packages/protocols/src/index.ts | 1 + packages/protocols/src/protocols.ts | 97 +++++++++++++++++++++++++++++ packages/protocols/tsconfig.json | 6 ++ pnpm-lock.yaml | 14 +++++ pnpm-workspace.yaml | 1 + 7 files changed, 132 insertions(+) create mode 100644 packages/protocols/package.json create mode 100644 packages/protocols/src/index.ts create mode 100644 packages/protocols/src/protocols.ts create mode 100644 packages/protocols/tsconfig.json diff --git a/.gitignore b/.gitignore index c98e3319..ab0378bd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules .turbo +dist diff --git a/packages/protocols/package.json b/packages/protocols/package.json new file mode 100644 index 00000000..cc1fa946 --- /dev/null +++ b/packages/protocols/package.json @@ -0,0 +1,12 @@ +{ + "name": "@stackspulse/protocols", + "version": "0.0.0", + "private": true, + "scripts": { + "build": "tsc" + }, + "devDependencies": { + "@tsconfig/node22": "22.0.0", + "typescript": "5.5.4" + } +} diff --git a/packages/protocols/src/index.ts b/packages/protocols/src/index.ts new file mode 100644 index 00000000..617dde53 --- /dev/null +++ b/packages/protocols/src/index.ts @@ -0,0 +1 @@ +export * from "./protocols.js"; diff --git a/packages/protocols/src/protocols.ts b/packages/protocols/src/protocols.ts new file mode 100644 index 00000000..c9503cca --- /dev/null +++ b/packages/protocols/src/protocols.ts @@ -0,0 +1,97 @@ +export const protocols = [ + "alex", + "arkadiko", + "stackswap", + "velar", + "bitflow", + "stackingdao", + "zest", +] as const; + +export type Protocol = (typeof protocols)[number]; + +export const isProtocol = (value: string): value is Protocol => + protocols.includes(value as Protocol); + +export const protocolsInfo = { + alex: { + name: "Alex", + description: + "Next Gen DeFi on Bitcoin via Stacks. Building Financial Infrastructure on Bitcoin through Stacks.", + website: "https://alexgo.io/", + x: "https://twitter.com/ALEXLabBTC", + contracts: [ + "SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01", + "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.amm-swap-pool-v1-1", + "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.swap-helper-v1-01", + "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.swap-helper-v1-02", + "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.swap-helper-v1-03", + ], + }, + arkadiko: { + name: "Arkadiko", + description: + "Arkadiko is a decentralized, non-custodial liquidity protocol where users can collateralize their assets and mint a stablecoin called USDA.", + website: "https://arkadiko.finance/", + x: "https://twitter.com/ArkadikoFinance", + contracts: [ + "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-swap-v2-1", + "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-multi-hop-swap-v1-1", + ], + }, + bitflow: { + name: "Bitflow", + description: "The Decentralized Exchange for Bitcoiners.", + website: "https://www.bitflow.finance/", + x: "https://twitter.com/Bitflow_Finance", + contracts: [ + "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-abtc-xbtc-v-1-2", + "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-aeusdc-susdt-v-1-2", + "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-stx-ststx-v-1-2", + "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-usda-aeusdc-v-1-2", + "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-usda-susdt-v-1-2", + ], + }, + stackingdao: { + name: "StackingDAO", + description: "Liquid stacking on Stacks.", + website: "https://www.stackingdao.com/", + x: "https://twitter.com/StackingDao", + contracts: [ + "SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.stacking-dao-core-v1", + ], + }, + stackswap: { + name: "StackSwap", + description: + "Stackswap is a combination of DEX and token launchpad on Stacks blockchain.", + website: "https://app.stackswap.org/", + x: "https://twitter.com/Stackswap_BTC", + contracts: ["SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275.stackswap-swap-v5k"], + }, + velar: { + name: "Velar", + description: "DeFi Liquidity Protocol on Bitcoin.", + website: "https://www.velar.co/", + x: "https://twitter.com/VelarBTC", + contracts: [ + "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-router", + "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-path2", + ], + }, + zest: { + name: "Zest", + description: "Zest Protocol is a BTC and Bitcoin L2 lending protocol.", + website: "https://www.zestprotocol.com/", + x: "https://twitter.com/ZestProtocol", + contracts: [ + "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.pool-borrow", + "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.borrow-helper-v1-0", + "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.borrow-helper-v1-1", + "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.borrow-helper-v2-1", + "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.borrow-helper-v2-2", + "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.borrow-helper-v1-2", + "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.borrow-helper-v1-3", + ], + }, +} as const; diff --git a/packages/protocols/tsconfig.json b/packages/protocols/tsconfig.json new file mode 100644 index 00000000..5b83fe80 --- /dev/null +++ b/packages/protocols/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "outDir": "dist" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0206dbe7..f15ad219 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -189,6 +189,15 @@ importers: specifier: 5.5.4 version: 5.5.4 + packages/protocols: + devDependencies: + '@tsconfig/node22': + specifier: 22.0.0 + version: 22.0.0 + typescript: + specifier: 5.5.4 + version: 5.5.4 + packages: '@alloc/quick-lru@5.2.0': @@ -2168,6 +2177,9 @@ packages: peerDependencies: react: ^18.0.0 + '@tsconfig/node22@22.0.0': + resolution: {integrity: sha512-twLQ77zevtxobBOD4ToAtVmuYrpeYUh3qh+TEp+08IWhpsrIflVHqQ1F1CiPxQGL7doCdBIOOCF+1Tm833faNg==} + '@types/better-sqlite3@7.6.11': resolution: {integrity: sha512-i8KcD3PgGtGBLl3+mMYA8PdKkButvPyARxA7IQAd6qeslht13qxb1zzO8dRCtE7U3IoJS782zDBAeoKiM695kg==} @@ -7940,6 +7952,8 @@ snapshots: '@tanstack/query-core': 5.51.21 react: 18.3.1 + '@tsconfig/node22@22.0.0': {} + '@types/better-sqlite3@7.6.11': dependencies: '@types/node': 22.2.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8ab3e17a..e9b0dad6 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,2 +1,3 @@ packages: - 'apps/*' + - 'packages/*' From f0b5e45513ec93338ebf0ef3d1049392e56b838c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Pradel?= Date: Mon, 12 Aug 2024 21:54:35 +0200 Subject: [PATCH 2/5] types --- packages/protocols/src/protocols.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/protocols/src/protocols.ts b/packages/protocols/src/protocols.ts index c9503cca..d7f6316b 100644 --- a/packages/protocols/src/protocols.ts +++ b/packages/protocols/src/protocols.ts @@ -13,7 +13,15 @@ export type Protocol = (typeof protocols)[number]; export const isProtocol = (value: string): value is Protocol => protocols.includes(value as Protocol); -export const protocolsInfo = { +export const protocolsInfo: { + [key in Protocol]: { + name: string; + description: string; + website: string; + x: string; + contracts: string[]; + }; +} = { alex: { name: "Alex", description: From 97661f5094fde5ab798ffc9e11d2ab75dcd764fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Pradel?= Date: Mon, 12 Aug 2024 22:00:09 +0200 Subject: [PATCH 3/5] migrate web --- apps/web/package.json | 1 + .../src/app/api/cron/weekly-users/route.ts | 2 +- .../protocols/[protocol]/contracts/page.tsx | 2 +- .../src/app/protocols/[protocol]/layout.tsx | 2 +- .../protocols/[protocol]/opengraph-image.tsx | 2 +- .../web/src/app/protocols/[protocol]/page.tsx | 2 +- apps/web/src/app/sitemap.ts | 2 +- apps/web/src/components/Layout/Header.tsx | 2 +- .../src/components/Protocol/ProtocolInfo.tsx | 2 +- .../src/components/Protocol/ProtocolMenu.tsx | 2 +- .../src/components/Protocol/ProtocolStats.tsx | 2 +- .../Protocol/ProtocolTransactions.tsx | 2 +- .../TopProtocolsBarListQuery.tsx | 2 +- .../UniqueUsersBarChartClient.tsx | 2 +- .../Stats/UniqueUsersBarChart/index.tsx | 2 +- apps/web/src/hooks/api/useGetTransactions.ts | 2 +- apps/web/src/lib/api.ts | 2 +- apps/web/src/lib/protocols.ts | 98 ------------------- packages/protocols/package.json | 3 + packages/protocols/tsconfig.json | 3 +- pnpm-lock.yaml | 10 +- 21 files changed, 28 insertions(+), 119 deletions(-) delete mode 100644 apps/web/src/lib/protocols.ts diff --git a/apps/web/package.json b/apps/web/package.json index f0864e30..8943fa40 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -16,6 +16,7 @@ "@sentry/nextjs": "8.25.0", "@stacks/stacks-blockchain-api-types": "7.13.2", "@stacks/transactions": "6.16.1", + "@stackspulse/protocols": "workspace:*", "@t3-oss/env-core": "0.11.0", "@t3-oss/env-nextjs": "0.11.0", "@tabler/icons-react": "3.12.0", diff --git a/apps/web/src/app/api/cron/weekly-users/route.ts b/apps/web/src/app/api/cron/weekly-users/route.ts index 11159532..5e603681 100644 --- a/apps/web/src/app/api/cron/weekly-users/route.ts +++ b/apps/web/src/app/api/cron/weekly-users/route.ts @@ -1,7 +1,7 @@ import { env } from "@/env"; import type { ProtocolUsersRouteResponse } from "@/lib/api"; -import { protocolsInfo } from "@/lib/protocols"; import { sendTweet } from "@/lib/twitter"; +import { protocolsInfo } from "@stackspulse/protocols"; export const dynamic = "force-dynamic"; diff --git a/apps/web/src/app/protocols/[protocol]/contracts/page.tsx b/apps/web/src/app/protocols/[protocol]/contracts/page.tsx index 933651e9..1270b20f 100644 --- a/apps/web/src/app/protocols/[protocol]/contracts/page.tsx +++ b/apps/web/src/app/protocols/[protocol]/contracts/page.tsx @@ -1,5 +1,5 @@ -import { isProtocol, protocolsInfo } from "@/lib/protocols"; import { Link, Table } from "@radix-ui/themes"; +import { isProtocol, protocolsInfo } from "@stackspulse/protocols"; import type { Metadata } from "next"; import { notFound } from "next/navigation"; diff --git a/apps/web/src/app/protocols/[protocol]/layout.tsx b/apps/web/src/app/protocols/[protocol]/layout.tsx index 587656a4..f7f30e2d 100644 --- a/apps/web/src/app/protocols/[protocol]/layout.tsx +++ b/apps/web/src/app/protocols/[protocol]/layout.tsx @@ -1,7 +1,7 @@ import { ProtocolInfo } from "@/components/Protocol/ProtocolInfo"; import { ProtocolMenu } from "@/components/Protocol/ProtocolMenu"; -import { isProtocol, protocolsInfo } from "@/lib/protocols"; import { Container } from "@radix-ui/themes"; +import { isProtocol, protocolsInfo } from "@stackspulse/protocols"; import type { Metadata } from "next"; import { notFound } from "next/navigation"; diff --git a/apps/web/src/app/protocols/[protocol]/opengraph-image.tsx b/apps/web/src/app/protocols/[protocol]/opengraph-image.tsx index b6682751..2e3cf80e 100644 --- a/apps/web/src/app/protocols/[protocol]/opengraph-image.tsx +++ b/apps/web/src/app/protocols/[protocol]/opengraph-image.tsx @@ -1,5 +1,5 @@ import { env } from "@/env"; -import { type Protocol, protocolsInfo } from "@/lib/protocols"; +import { type Protocol, protocolsInfo } from "@stackspulse/protocols"; import { ImageResponse } from "next/og"; export const runtime = "edge"; diff --git a/apps/web/src/app/protocols/[protocol]/page.tsx b/apps/web/src/app/protocols/[protocol]/page.tsx index 0c3b4d88..840a688b 100644 --- a/apps/web/src/app/protocols/[protocol]/page.tsx +++ b/apps/web/src/app/protocols/[protocol]/page.tsx @@ -3,7 +3,7 @@ import { ProtocolTransactions } from "@/components/Protocol/ProtocolTransactions import { StackingDAORef } from "@/components/Protocol/StackingDAO/StackingDAORef"; import { UniqueUsersBarChart } from "@/components/Stats/UniqueUsersBarChart"; import { DepositWithdrawBarChart } from "@/components/Stats/stackingdao/DepositsWithdrawBarChart"; -import { isProtocol, protocolsInfo } from "@/lib/protocols"; +import { isProtocol, protocolsInfo } from "@stackspulse/protocols"; import { notFound } from "next/navigation"; import { Suspense } from "react"; diff --git a/apps/web/src/app/sitemap.ts b/apps/web/src/app/sitemap.ts index 5146d241..acf4afb6 100644 --- a/apps/web/src/app/sitemap.ts +++ b/apps/web/src/app/sitemap.ts @@ -1,5 +1,5 @@ import { env } from "@/env"; -import { protocolsInfo } from "@/lib/protocols"; +import { protocolsInfo } from "@stackspulse/protocols"; import type { MetadataRoute } from "next"; export default function sitemap(): MetadataRoute.Sitemap { diff --git a/apps/web/src/components/Layout/Header.tsx b/apps/web/src/components/Layout/Header.tsx index ef8d6664..eaf8c629 100644 --- a/apps/web/src/components/Layout/Header.tsx +++ b/apps/web/src/components/Layout/Header.tsx @@ -1,6 +1,5 @@ "use client"; import { appConfig } from "@/appConfig"; -import { type Protocol, protocolsInfo } from "@/lib/protocols"; import { Container, DropdownMenu, @@ -8,6 +7,7 @@ import { Link, Separator, } from "@radix-ui/themes"; +import { type Protocol, protocolsInfo } from "@stackspulse/protocols"; import { IconBrandGithub, IconBrandX, diff --git a/apps/web/src/components/Protocol/ProtocolInfo.tsx b/apps/web/src/components/Protocol/ProtocolInfo.tsx index bdbbc50a..e33d33e2 100644 --- a/apps/web/src/components/Protocol/ProtocolInfo.tsx +++ b/apps/web/src/components/Protocol/ProtocolInfo.tsx @@ -1,5 +1,5 @@ -import { type Protocol, protocolsInfo } from "@/lib/protocols"; import { Heading, IconButton, Text } from "@radix-ui/themes"; +import { type Protocol, protocolsInfo } from "@stackspulse/protocols"; import { IconBrandX, IconWorld } from "@tabler/icons-react"; import Image from "next/image"; diff --git a/apps/web/src/components/Protocol/ProtocolMenu.tsx b/apps/web/src/components/Protocol/ProtocolMenu.tsx index 44001be1..da2b23c5 100644 --- a/apps/web/src/components/Protocol/ProtocolMenu.tsx +++ b/apps/web/src/components/Protocol/ProtocolMenu.tsx @@ -1,7 +1,7 @@ "use client"; -import type { Protocol } from "@/lib/protocols"; import { Button } from "@radix-ui/themes"; +import type { Protocol } from "@stackspulse/protocols"; import Link from "next/link"; import { useParams, usePathname } from "next/navigation"; diff --git a/apps/web/src/components/Protocol/ProtocolStats.tsx b/apps/web/src/components/Protocol/ProtocolStats.tsx index 67e25d04..ed8c8f98 100644 --- a/apps/web/src/components/Protocol/ProtocolStats.tsx +++ b/apps/web/src/components/Protocol/ProtocolStats.tsx @@ -1,7 +1,7 @@ import { env } from "@/env"; import type { TransactionStatsRouteResponse } from "@/lib/api"; -import type { Protocol } from "@/lib/protocols"; import { Card, Text } from "@radix-ui/themes"; +import type { Protocol } from "@stackspulse/protocols"; interface ProtocolStatsProps { protocol: Protocol; diff --git a/apps/web/src/components/Protocol/ProtocolTransactions.tsx b/apps/web/src/components/Protocol/ProtocolTransactions.tsx index b3068a70..f196207b 100644 --- a/apps/web/src/components/Protocol/ProtocolTransactions.tsx +++ b/apps/web/src/components/Protocol/ProtocolTransactions.tsx @@ -1,8 +1,8 @@ "use client"; import { useGetTransactions } from "@/hooks/api/useGetTransactions"; -import type { Protocol } from "@/lib/protocols"; import { Heading, Separator } from "@radix-ui/themes"; +import type { Protocol } from "@stackspulse/protocols"; import { Fragment } from "react"; import { TransactionRow } from "../Transaction/TransactionRow"; diff --git a/apps/web/src/components/Stats/TopProtocolsBarList/TopProtocolsBarListQuery.tsx b/apps/web/src/components/Stats/TopProtocolsBarList/TopProtocolsBarListQuery.tsx index ab605145..a3a584f4 100644 --- a/apps/web/src/components/Stats/TopProtocolsBarList/TopProtocolsBarListQuery.tsx +++ b/apps/web/src/components/Stats/TopProtocolsBarList/TopProtocolsBarListQuery.tsx @@ -1,7 +1,7 @@ import { BarList } from "@/components/ui/BarList"; import { useGetProtocolsUsers } from "@/hooks/api/useGetProtocolsUsers"; import type { ProtocolUsersRouteQuery } from "@/lib/api"; -import { protocolsInfo } from "@/lib/protocols"; +import { protocolsInfo } from "@stackspulse/protocols"; interface TopProtocolsBarListClientProps { dateFilter: ProtocolUsersRouteQuery["date"]; diff --git a/apps/web/src/components/Stats/UniqueUsersBarChart/UniqueUsersBarChartClient.tsx b/apps/web/src/components/Stats/UniqueUsersBarChart/UniqueUsersBarChartClient.tsx index 5784178c..e5d27050 100644 --- a/apps/web/src/components/Stats/UniqueUsersBarChart/UniqueUsersBarChartClient.tsx +++ b/apps/web/src/components/Stats/UniqueUsersBarChart/UniqueUsersBarChartClient.tsx @@ -1,8 +1,8 @@ "use client"; import { BarChart } from "@/components/ui/BarChart"; import { numberValueFormatter } from "@/components/ui/utils"; -import type { Protocol } from "@/lib/protocols"; import { Card, Inset, Separator, Text } from "@radix-ui/themes"; +import type { Protocol } from "@stackspulse/protocols"; interface UniqueUsersBarChartProps { protocol: Protocol; diff --git a/apps/web/src/components/Stats/UniqueUsersBarChart/index.tsx b/apps/web/src/components/Stats/UniqueUsersBarChart/index.tsx index d7e8341b..c0b48fd0 100644 --- a/apps/web/src/components/Stats/UniqueUsersBarChart/index.tsx +++ b/apps/web/src/components/Stats/UniqueUsersBarChart/index.tsx @@ -1,5 +1,5 @@ import { env } from "@/env"; -import type { Protocol } from "@/lib/protocols"; +import type { Protocol } from "@stackspulse/protocols"; import { UniqueUsersBarChartClient } from "./UniqueUsersBarChartClient"; export const UniqueUsersBarChart = async ({ diff --git a/apps/web/src/hooks/api/useGetTransactions.ts b/apps/web/src/hooks/api/useGetTransactions.ts index a1d99028..361521d0 100644 --- a/apps/web/src/hooks/api/useGetTransactions.ts +++ b/apps/web/src/hooks/api/useGetTransactions.ts @@ -1,6 +1,6 @@ import { env } from "@/env"; import type { TransactionsRouteResponse } from "@/lib/api"; -import type { Protocol } from "@/lib/protocols"; +import type { Protocol } from "@stackspulse/protocols"; import { useSuspenseQuery } from "@tanstack/react-query"; export const useGetTransactions = ( diff --git a/apps/web/src/lib/api.ts b/apps/web/src/lib/api.ts index adebc509..f8aeb1a5 100644 --- a/apps/web/src/lib/api.ts +++ b/apps/web/src/lib/api.ts @@ -1,5 +1,5 @@ import type { ContractCallTransaction } from "@stacks/stacks-blockchain-api-types"; -import type { Protocol } from "./protocols"; +import type { Protocol } from "@stackspulse/protocols"; /** * `/api/protocols/users` diff --git a/apps/web/src/lib/protocols.ts b/apps/web/src/lib/protocols.ts deleted file mode 100644 index c22e8bda..00000000 --- a/apps/web/src/lib/protocols.ts +++ /dev/null @@ -1,98 +0,0 @@ -export const protocols = [ - "alex", - "arkadiko", - "stackswap", - "velar", - "bitflow", - "stackingdao", - "zest", -] as const; - -export type Protocol = (typeof protocols)[number]; - -export const isProtocol = (value: string): value is Protocol => - protocols.includes(value as Protocol); - -export const protocolsInfo = { - alex: { - name: "Alex", - description: - "Next Gen DeFi on Bitcoin via Stacks. Building Financial Infrastructure on Bitcoin through Stacks.", - website: "https://alexgo.io/", - x: "https://twitter.com/ALEXLabBTC", - contracts: [ - "SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01", - // Contracts before hack - "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.amm-swap-pool-v1-1", - "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.swap-helper-v1-01", - "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.swap-helper-v1-02", - "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.swap-helper-v1-03", - ], - }, - arkadiko: { - name: "Arkadiko", - description: - "Arkadiko is a decentralized, non-custodial liquidity protocol where users can collateralize their assets and mint a stablecoin called USDA.", - website: "https://arkadiko.finance/", - x: "https://twitter.com/ArkadikoFinance", - contracts: [ - "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-swap-v2-1", - "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-multi-hop-swap-v1-1", - ], - }, - bitflow: { - name: "Bitflow", - description: "The Decentralized Exchange for Bitcoiners.", - website: "https://www.bitflow.finance/", - x: "https://twitter.com/Bitflow_Finance", - contracts: [ - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-abtc-xbtc-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-aeusdc-susdt-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-stx-ststx-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-usda-aeusdc-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-usda-susdt-v-1-2", - ], - }, - stackingdao: { - name: "StackingDAO", - description: "Liquid stacking on Stacks.", - website: "https://www.stackingdao.com/", - x: "https://twitter.com/StackingDao", - contracts: [ - "SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.stacking-dao-core-v1", - ], - }, - stackswap: { - name: "StackSwap", - description: - "Stackswap is a combination of DEX and token launchpad on Stacks blockchain.", - website: "https://app.stackswap.org/", - x: "https://twitter.com/Stackswap_BTC", - contracts: ["SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275.stackswap-swap-v5k"], - }, - velar: { - name: "Velar", - description: "DeFi Liquidity Protocol on Bitcoin.", - website: "https://www.velar.co/", - x: "https://twitter.com/VelarBTC", - contracts: [ - "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-router", - "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-path2", - ], - }, - zest: { - name: "Zest", - description: "Zest Protocol is a BTC and Bitcoin L2 lending protocol.", - website: "https://www.zestprotocol.com/", - x: "https://twitter.com/ZestProtocol", - contracts: [ - "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.pool-borrow", - "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.borrow-helper-v1-0", - "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.borrow-helper-v1-1", - "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.borrow-helper-v2-1", - "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.borrow-helper-v2-2", - "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.borrow-helper-v1-2", - "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.borrow-helper-v1-3", - ], - }, -} as const; diff --git a/packages/protocols/package.json b/packages/protocols/package.json index cc1fa946..3522a9d0 100644 --- a/packages/protocols/package.json +++ b/packages/protocols/package.json @@ -2,6 +2,9 @@ "name": "@stackspulse/protocols", "version": "0.0.0", "private": true, + "files": ["dist"], + "main": "./dist/index.js", + "types": "./dist/index.d.ts", "scripts": { "build": "tsc" }, diff --git a/packages/protocols/tsconfig.json b/packages/protocols/tsconfig.json index 5b83fe80..1c3dcfb8 100644 --- a/packages/protocols/tsconfig.json +++ b/packages/protocols/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "@tsconfig/node22/tsconfig.json", "compilerOptions": { - "outDir": "dist" + "outDir": "dist", + "declaration": true } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f15ad219..19ed03e5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -94,6 +94,9 @@ importers: '@stacks/transactions': specifier: 6.16.1 version: 6.16.1 + '@stackspulse/protocols': + specifier: workspace:* + version: link:../../packages/protocols '@t3-oss/env-core': specifier: 0.11.0 version: 0.11.0(typescript@5.5.4)(zod@3.23.8) @@ -4069,7 +4072,6 @@ packages: libsql@0.3.19: resolution: {integrity: sha512-Aj5cQ5uk/6fHdmeW0TiXK42FqUlwx7ytmMLPSaUQPin5HKKKuUPD62MAbN4OEweGBBI7q1BekoEN4gPUEL6MZA==} - cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lilconfig@2.1.0: @@ -9081,7 +9083,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.34.3(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) @@ -9105,7 +9107,7 @@ snapshots: enhanced-resolve: 5.17.1 eslint: 8.57.0 eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.6 is-core-module: 2.14.0 @@ -9127,7 +9129,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 From 189b0fde42432ecaeccd3c0ab2f9aea57d088489 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Pradel?= Date: Mon, 12 Aug 2024 22:02:27 +0200 Subject: [PATCH 4/5] migrate server --- apps/server/package.json | 1 + apps/server/src/api/protocols/users/index.ts | 2 +- .../server/src/api/root/upsert-dapps/index.ts | 2 +- apps/server/src/api/transactions/index.get.ts | 2 +- .../src/api/transactions/stats/index.ts | 2 +- .../api/transactions/unique-senders/index.ts | 2 +- apps/server/src/lib/protocols.ts | 98 ------------------- pnpm-lock.yaml | 3 + 8 files changed, 9 insertions(+), 103 deletions(-) delete mode 100644 apps/server/src/lib/protocols.ts diff --git a/apps/server/package.json b/apps/server/package.json index 75457450..e4abb43f 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -15,6 +15,7 @@ "@sentry/node": "8.25.0", "@stacks/blockchain-api-client": "7.13.2", "@stacks/stacks-blockchain-api-types": "7.13.2", + "@stackspulse/protocols": "workspace:*", "@t3-oss/env-core": "0.11.0", "drizzle-orm": "0.33.0", "h3": "1.12.0", diff --git a/apps/server/src/api/protocols/users/index.ts b/apps/server/src/api/protocols/users/index.ts index 3839d762..28d60c1e 100644 --- a/apps/server/src/api/protocols/users/index.ts +++ b/apps/server/src/api/protocols/users/index.ts @@ -1,8 +1,8 @@ +import type { Protocol } from "@stackspulse/protocols"; import { z } from "zod"; import { sql } from "~/db/db"; import { apiCacheConfig } from "~/lib/api"; import { getValidatedQueryZod } from "~/lib/nitro"; -import type { Protocol } from "~/lib/protocols"; const protocolUsersRouteSchema = z.object({ date: z.enum(["7d", "30d", "all"]), diff --git a/apps/server/src/api/root/upsert-dapps/index.ts b/apps/server/src/api/root/upsert-dapps/index.ts index b3fb691f..8554232e 100644 --- a/apps/server/src/api/root/upsert-dapps/index.ts +++ b/apps/server/src/api/root/upsert-dapps/index.ts @@ -1,7 +1,7 @@ +import { protocols, protocolsInfo } from "@stackspulse/protocols"; import { db } from "~/db/db"; import { dapps } from "~/db/schema"; import { conflictUpdateSetAllColumns } from "~/db/utils"; -import { protocols, protocolsInfo } from "~/lib/protocols"; /** * Keep the DB up to date with the latest protocols diff --git a/apps/server/src/api/transactions/index.get.ts b/apps/server/src/api/transactions/index.get.ts index 05026d19..f7427597 100644 --- a/apps/server/src/api/transactions/index.get.ts +++ b/apps/server/src/api/transactions/index.get.ts @@ -1,9 +1,9 @@ import type { ContractCallTransaction } from "@stacks/stacks-blockchain-api-types"; +import { type Protocol, protocols } from "@stackspulse/protocols"; import { z } from "zod"; import { sql } from "~/db/db"; import { apiCacheConfig } from "~/lib/api"; import { getValidatedQueryZod } from "~/lib/nitro"; -import { type Protocol, protocols } from "~/lib/protocols"; import { stacksApi } from "~/lib/stacks-api"; const transactionsRouteSchema = z.object({ diff --git a/apps/server/src/api/transactions/stats/index.ts b/apps/server/src/api/transactions/stats/index.ts index ffe486b7..5ae32d24 100644 --- a/apps/server/src/api/transactions/stats/index.ts +++ b/apps/server/src/api/transactions/stats/index.ts @@ -1,8 +1,8 @@ +import { protocols } from "@stackspulse/protocols"; import { z } from "zod"; import { sql } from "~/db/db"; import { apiCacheConfig } from "~/lib/api"; import { getValidatedQueryZod } from "~/lib/nitro"; -import { protocols } from "~/lib/protocols"; const transactionStatsRouteSchema = z.object({ protocol: z.enum(protocols).optional(), diff --git a/apps/server/src/api/transactions/unique-senders/index.ts b/apps/server/src/api/transactions/unique-senders/index.ts index 2ccd2cf7..1289ba54 100644 --- a/apps/server/src/api/transactions/unique-senders/index.ts +++ b/apps/server/src/api/transactions/unique-senders/index.ts @@ -1,8 +1,8 @@ +import { protocols } from "@stackspulse/protocols"; import { z } from "zod"; import { sql } from "~/db/db"; import { apiCacheConfig } from "~/lib/api"; import { getValidatedQueryZod } from "~/lib/nitro"; -import { protocols } from "~/lib/protocols"; const transactionUniqueSendersRouteSchema = z.object({ protocol: z.enum(protocols), diff --git a/apps/server/src/lib/protocols.ts b/apps/server/src/lib/protocols.ts deleted file mode 100644 index c22e8bda..00000000 --- a/apps/server/src/lib/protocols.ts +++ /dev/null @@ -1,98 +0,0 @@ -export const protocols = [ - "alex", - "arkadiko", - "stackswap", - "velar", - "bitflow", - "stackingdao", - "zest", -] as const; - -export type Protocol = (typeof protocols)[number]; - -export const isProtocol = (value: string): value is Protocol => - protocols.includes(value as Protocol); - -export const protocolsInfo = { - alex: { - name: "Alex", - description: - "Next Gen DeFi on Bitcoin via Stacks. Building Financial Infrastructure on Bitcoin through Stacks.", - website: "https://alexgo.io/", - x: "https://twitter.com/ALEXLabBTC", - contracts: [ - "SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01", - // Contracts before hack - "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.amm-swap-pool-v1-1", - "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.swap-helper-v1-01", - "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.swap-helper-v1-02", - "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.swap-helper-v1-03", - ], - }, - arkadiko: { - name: "Arkadiko", - description: - "Arkadiko is a decentralized, non-custodial liquidity protocol where users can collateralize their assets and mint a stablecoin called USDA.", - website: "https://arkadiko.finance/", - x: "https://twitter.com/ArkadikoFinance", - contracts: [ - "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-swap-v2-1", - "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-multi-hop-swap-v1-1", - ], - }, - bitflow: { - name: "Bitflow", - description: "The Decentralized Exchange for Bitcoiners.", - website: "https://www.bitflow.finance/", - x: "https://twitter.com/Bitflow_Finance", - contracts: [ - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-abtc-xbtc-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-aeusdc-susdt-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-stx-ststx-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-usda-aeusdc-v-1-2", - "SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-usda-susdt-v-1-2", - ], - }, - stackingdao: { - name: "StackingDAO", - description: "Liquid stacking on Stacks.", - website: "https://www.stackingdao.com/", - x: "https://twitter.com/StackingDao", - contracts: [ - "SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.stacking-dao-core-v1", - ], - }, - stackswap: { - name: "StackSwap", - description: - "Stackswap is a combination of DEX and token launchpad on Stacks blockchain.", - website: "https://app.stackswap.org/", - x: "https://twitter.com/Stackswap_BTC", - contracts: ["SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275.stackswap-swap-v5k"], - }, - velar: { - name: "Velar", - description: "DeFi Liquidity Protocol on Bitcoin.", - website: "https://www.velar.co/", - x: "https://twitter.com/VelarBTC", - contracts: [ - "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-router", - "SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-path2", - ], - }, - zest: { - name: "Zest", - description: "Zest Protocol is a BTC and Bitcoin L2 lending protocol.", - website: "https://www.zestprotocol.com/", - x: "https://twitter.com/ZestProtocol", - contracts: [ - "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.pool-borrow", - "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.borrow-helper-v1-0", - "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.borrow-helper-v1-1", - "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.borrow-helper-v2-1", - "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.borrow-helper-v2-2", - "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.borrow-helper-v1-2", - "SP2VCQJGH7PHP2DJK7Z0V48AGBHQAW3R3ZW1QF4N.borrow-helper-v1-3", - ], - }, -} as const; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 19ed03e5..2be452a4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,6 +42,9 @@ importers: '@stacks/stacks-blockchain-api-types': specifier: 7.13.2 version: 7.13.2 + '@stackspulse/protocols': + specifier: workspace:* + version: link:../../packages/protocols '@t3-oss/env-core': specifier: 0.11.0 version: 0.11.0(typescript@5.5.4)(zod@3.23.8) From cae3bc22c71cb3e530b49b8a48de7354a90cc3b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Pradel?= Date: Mon, 12 Aug 2024 22:06:54 +0200 Subject: [PATCH 5/5] changeset --- .changeset/forty-cheetahs-dress.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/forty-cheetahs-dress.md diff --git a/.changeset/forty-cheetahs-dress.md b/.changeset/forty-cheetahs-dress.md new file mode 100644 index 00000000..8a499fb4 --- /dev/null +++ b/.changeset/forty-cheetahs-dress.md @@ -0,0 +1,6 @@ +--- +"@stackspulse/server": patch +"stackspulse": patch +--- + +Migrate protocols list to a separate package.