From c8603007bae205a87864c6eab37d7935629fe274 Mon Sep 17 00:00:00 2001 From: jeremy-babylonchain Date: Mon, 13 Jan 2025 11:30:39 +0700 Subject: [PATCH] support phase 1 fp name --- src/app/api/getFinalityProviders.ts | 9 +- src/app/api/getFinalityProvidersV2.ts | 99 +++++++++ .../FinalityProviderColumns.tsx | 16 +- .../FinalityProviderFilter.tsx | 4 +- .../FinalityProviderSearch.tsx | 4 +- .../FinalityProviderTable.tsx | 4 +- .../FinalityProviders/FinalityProviders.tsx | 31 ++- .../hooks/client/api/useFinalityProviders.ts | 2 +- .../client/api/useFinalityProvidersV2.ts | 67 ++++++ src/app/state/FinalityProviderState.tsx | 160 +------------- src/app/state/FinalityProviderV2State.tsx | 195 ++++++++++++++++++ src/app/state/index.tsx | 2 + src/app/types/finalityProviders.ts | 19 +- src/app/types/finalityProvidersV2.ts | 35 ++++ .../components/FinalityProviderMoniker.tsx | 6 +- src/components/staking/StakingModal/index.tsx | 4 +- 16 files changed, 452 insertions(+), 205 deletions(-) create mode 100644 src/app/api/getFinalityProvidersV2.ts create mode 100644 src/app/hooks/client/api/useFinalityProvidersV2.ts create mode 100644 src/app/state/FinalityProviderV2State.tsx create mode 100644 src/app/types/finalityProvidersV2.ts diff --git a/src/app/api/getFinalityProviders.ts b/src/app/api/getFinalityProviders.ts index 2b67b778..ac8b1bde 100644 --- a/src/app/api/getFinalityProviders.ts +++ b/src/app/api/getFinalityProviders.ts @@ -1,10 +1,7 @@ import { isValidUrl } from "@/utils/url"; import { Pagination } from "../types/api"; -import { - FinalityProvider, - FinalityProviderState, -} from "../types/finalityProviders"; +import { FinalityProvider } from "../types/finalityProviders"; import { apiWrapper } from "./apiWrapper"; @@ -20,7 +17,7 @@ interface FinalityProvidersAPIResponse { interface FinalityProviderAPI { description: DescriptionAPI; - state: FinalityProviderState; + state: "active" | "standby"; commission: string; btc_pk: string; active_tvl: number; @@ -60,7 +57,7 @@ export const getFinalityProviders = async ({ const response = await apiWrapper( "GET", - "/v2/finality-providers", + "/v1/finality-providers", "Error getting finality providers", { query: params }, ); diff --git a/src/app/api/getFinalityProvidersV2.ts b/src/app/api/getFinalityProvidersV2.ts new file mode 100644 index 00000000..f229b77f --- /dev/null +++ b/src/app/api/getFinalityProvidersV2.ts @@ -0,0 +1,99 @@ +import { isValidUrl } from "@/utils/url"; + +import { Pagination } from "../types/api"; +import { + FinalityProviderState, + FinalityProviderV2, +} from "../types/finalityProvidersV2"; + +import { apiWrapper } from "./apiWrapper"; + +export interface PaginatedFinalityProviders { + finalityProviders: FinalityProviderV2[]; + pagination: Pagination; +} + +interface FinalityProvidersAPIResponse { + data: FinalityProviderAPI[]; + pagination: Pagination; +} + +interface FinalityProviderAPI { + description: DescriptionAPI; + state: FinalityProviderState; + commission: string; + btc_pk: string; + active_tvl: number; + total_tvl: number; + active_delegations: number; + total_delegations: number; +} + +interface DescriptionAPI { + moniker: string; + identity: string; + website: string; + security_contact: string; + details: string; +} + +export const getFinalityProvidersV2 = async ({ + key, + pk, + sortBy, + order, + name, +}: { + key: string; + name?: string; + sortBy?: string; + order?: "asc" | "desc"; + pk?: string; +}): Promise => { + const params = { + pagination_key: key, + finality_provider_pk: pk, + sort_by: sortBy, + order, + name, + }; + + const response = await apiWrapper( + "GET", + "/v2/finality-providers", + "Error getting finality providers", + { query: params }, + ); + + const finalityProvidersAPIResponse: FinalityProvidersAPIResponse = + response.data; + const finalityProvidersAPI: FinalityProviderAPI[] = + finalityProvidersAPIResponse.data; + + const finalityProviders = finalityProvidersAPI.map( + (fp: FinalityProviderAPI): FinalityProviderV2 => ({ + description: { + moniker: fp.description.moniker, + identity: fp.description.identity, + website: isValidUrl(fp.description.website) + ? fp.description.website + : "", + securityContact: fp.description.security_contact, + details: fp.description.details, + }, + state: fp.state, + commission: fp.commission, + btcPk: fp.btc_pk, + activeTVLSat: fp.active_tvl, + totalTVLSat: fp.total_tvl, + activeDelegations: fp.active_delegations, + totalDelegations: fp.total_delegations, + }), + ); + + const pagination: Pagination = { + next_key: finalityProvidersAPIResponse.pagination.next_key, + }; + + return { finalityProviders, pagination }; +}; diff --git a/src/app/components/Staking/FinalityProviders/FinalityProviderColumns.tsx b/src/app/components/Staking/FinalityProviders/FinalityProviderColumns.tsx index e40408e7..e1bf5461 100644 --- a/src/app/components/Staking/FinalityProviders/FinalityProviderColumns.tsx +++ b/src/app/components/Staking/FinalityProviders/FinalityProviderColumns.tsx @@ -2,10 +2,10 @@ import { Hash } from "@/app/components/Hash/Hash"; import { - FinalityProvider, FinalityProviderState, FinalityProviderStateLabels, -} from "@/app/types/finalityProviders"; + FinalityProviderV2, +} from "@/app/types/finalityProvidersV2"; import { getNetworkConfigBTC } from "@/config/network/btc"; import { satoshiToBtc } from "@/utils/btc"; import { maxDecimals } from "@/utils/maxDecimals"; @@ -20,7 +20,7 @@ export const finalityProviderColumns = [ { key: "moniker", header: "Finality Provider", - render: (_: unknown, row?: FinalityProvider) => { + render: (_: unknown, row?: FinalityProviderV2) => { if (!row) return null; return (
@@ -37,7 +37,7 @@ export const finalityProviderColumns = [
); }, - sorter: (a?: FinalityProvider, b?: FinalityProvider) => { + sorter: (a?: FinalityProviderV2, b?: FinalityProviderV2) => { const monikerA = a?.description?.moniker || ""; const monikerB = b?.description?.moniker || ""; return monikerA.localeCompare(monikerB); @@ -50,7 +50,7 @@ export const finalityProviderColumns = [ if (value == null) return "Unknown"; return mapStatus(value as FinalityProviderState); }, - sorter: (a?: FinalityProvider, b?: FinalityProvider) => { + sorter: (a?: FinalityProviderV2, b?: FinalityProviderV2) => { const stateA = a?.state || "unknown"; const stateB = b?.state || "unknown"; return stateA.localeCompare(stateB); @@ -59,7 +59,7 @@ export const finalityProviderColumns = [ { key: "btcPk", header: `${coinSymbol} PK`, - render: (_: unknown, row?: FinalityProvider) => { + render: (_: unknown, row?: FinalityProviderV2) => { if (!row?.btcPk) return null; return ; }, @@ -72,7 +72,7 @@ export const finalityProviderColumns = [ if (isNaN(amount)) return "-"; return `${maxDecimals(satoshiToBtc(amount), 8)} ${coinSymbol}`; }, - sorter: (a?: FinalityProvider, b?: FinalityProvider) => { + sorter: (a?: FinalityProviderV2, b?: FinalityProviderV2) => { const valueA = a?.activeTVLSat ?? 0; const valueB = b?.activeTVLSat ?? 0; return valueA - valueB; @@ -86,7 +86,7 @@ export const finalityProviderColumns = [ if (isNaN(commission)) return "-"; return `${maxDecimals(commission * 100, 2)}%`; }, - sorter: (a?: FinalityProvider, b?: FinalityProvider) => { + sorter: (a?: FinalityProviderV2, b?: FinalityProviderV2) => { const commissionA = Number(a?.commission) || 0; const commissionB = Number(b?.commission) || 0; return commissionA - commissionB; diff --git a/src/app/components/Staking/FinalityProviders/FinalityProviderFilter.tsx b/src/app/components/Staking/FinalityProviders/FinalityProviderFilter.tsx index ed4abb4c..0b48fd8f 100644 --- a/src/app/components/Staking/FinalityProviders/FinalityProviderFilter.tsx +++ b/src/app/components/Staking/FinalityProviders/FinalityProviderFilter.tsx @@ -1,6 +1,6 @@ import { Select } from "@babylonlabs-io/bbn-core-ui"; -import { useFinalityProviderState } from "@/app/state/FinalityProviderState"; +import { useFinalityProviderV2State } from "@/app/state/FinalityProviderV2State"; const options = [ { value: "active", label: "Active" }, @@ -8,7 +8,7 @@ const options = [ ]; export const FinalityProviderFilter = () => { - const { filterValue, handleFilter } = useFinalityProviderState(); + const { filterValue, handleFilter } = useFinalityProviderV2State(); return (