Skip to content

Commit 667b29b

Browse files
authored
Merge pull request #3169 from IntersectMBO/develop
feat(#3155): add integration of ada handles
2 parents 0154ff5 + a2bffb8 commit 667b29b

File tree

29 files changed

+576
-107
lines changed

29 files changed

+576
-107
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ changes.
1212

1313
### Added
1414

15+
- Add support for ada handle in drep payment address [Issue 3155](https://github.com/IntersectMBO/govtool/issues/3155)
16+
- Improve numerical data formatting in drep directory [Issue 3148](https://github.com/IntersectMBO/govtool/issues/3148)
17+
1518
### Fixed
1619

1720
### Changed

govtool/frontend/.storybook/preview.tsx

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { ModalProvider } from "../src/context/modal";
1111
import { CardanoProvider } from "../src/context/wallet";
1212
import i18n from "../src/i18n";
1313
import { theme } from "../src/theme";
14+
import { AdaHandleProvider } from "../src/context/adaHandle";
1415

1516
const queryClient = new QueryClient();
1617

@@ -29,32 +30,34 @@ const preview: Preview = {
2930
<QueryClientProvider client={queryClient}>
3031
<AppContextProvider>
3132
<FeatureFlagProvider>
32-
<ThemeProvider theme={theme}>
33-
<CardanoProvider>
34-
<ModalProvider>
35-
<I18nextProvider i18n={i18n}>
36-
<MemoryRouter>
37-
<Routes>
38-
<Route
39-
path="/*"
40-
element={
41-
<div
42-
style={{
43-
margin: "0px",
44-
padding: "0px",
45-
position: "relative",
46-
}}
47-
>
48-
<Story />
49-
</div>
50-
}
51-
/>
52-
</Routes>
53-
</MemoryRouter>
54-
</I18nextProvider>
55-
</ModalProvider>
56-
</CardanoProvider>
57-
</ThemeProvider>
33+
<AdaHandleProvider>
34+
<ThemeProvider theme={theme}>
35+
<CardanoProvider>
36+
<ModalProvider>
37+
<I18nextProvider i18n={i18n}>
38+
<MemoryRouter>
39+
<Routes>
40+
<Route
41+
path="/*"
42+
element={
43+
<div
44+
style={{
45+
margin: "0px",
46+
padding: "0px",
47+
position: "relative",
48+
}}
49+
>
50+
<Story />
51+
</div>
52+
}
53+
/>
54+
</Routes>
55+
</MemoryRouter>
56+
</I18nextProvider>
57+
</ModalProvider>
58+
</CardanoProvider>
59+
</ThemeProvider>
60+
</AdaHandleProvider>
5861
</FeatureFlagProvider>
5962
</AppContextProvider>
6063
</QueryClientProvider>

govtool/frontend/src/components/organisms/AutomatedVotingOptions.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { ICONS } from "@consts";
1111
import { PendingTransaction } from "@context";
1212
import { useGetNetworkMetrics, useTranslation } from "@hooks";
1313
import { AutomatedVotingCard } from "@molecules";
14-
import { correctVoteAdaFormat, openInNewTab } from "@/utils";
14+
import { correctDRepDirectoryFormat, openInNewTab } from "@/utils";
1515
import {
1616
AutomatedVotingOptionCurrentDelegation,
1717
AutomatedVotingOptionDelegationId,
@@ -129,7 +129,9 @@ export const AutomatedVotingOptions = ({
129129
}
130130
votingPower={
131131
networkMetrics
132-
? correctVoteAdaFormat(networkMetrics?.alwaysAbstainVotingPower)
132+
? correctDRepDirectoryFormat(
133+
networkMetrics?.alwaysAbstainVotingPower,
134+
)
133135
: ""
134136
}
135137
transactionId={
@@ -170,7 +172,7 @@ export const AutomatedVotingOptions = ({
170172
}
171173
votingPower={
172174
networkMetrics
173-
? correctVoteAdaFormat(
175+
? correctDRepDirectoryFormat(
174176
networkMetrics?.alwaysNoConfidenceVotingPower,
175177
)
176178
: ""

govtool/frontend/src/components/organisms/DRepCard.tsx

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { useTranslation } from "@hooks";
88
import { DRepData, DRepStatus } from "@models";
99
import { Card } from "@molecules";
1010
import {
11-
correctVoteAdaFormat,
11+
correctDRepDirectoryFormat,
1212
ellipsizeText,
1313
encodeCIP129Identifier,
1414
getBase64ImageDetails,
@@ -218,8 +218,21 @@ export const DRepCard = ({
218218
</Box>
219219
</Box>
220220

221-
<Box sx={{ display: "flex", flex: { xl: 1 }, gap: 3 }}>
222-
<Box sx={{ width: { lg: "128px" } }}>
221+
<Box
222+
sx={{
223+
display: "flex",
224+
flex: { xl: 1 },
225+
gap: 3,
226+
}}
227+
>
228+
<Box
229+
sx={{
230+
width: { lg: "128px" },
231+
display: "flex",
232+
alignItems: "flex-end",
233+
flexDirection: "column",
234+
}}
235+
>
223236
<Typography
224237
data-testid={`${view}-voting-power-label`}
225238
variant="caption"
@@ -232,7 +245,7 @@ export const DRepCard = ({
232245
data-testid={`${view}-voting-power`}
233246
sx={{ whiteSpace: "nowrap" }}
234247
>
235-
{correctVoteAdaFormat(votingPower)}
248+
{correctDRepDirectoryFormat(votingPower)}
236249
</Typography>
237250
</Box>
238251
<Divider

govtool/frontend/src/components/organisms/DRepDetailsCard.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { useCardano, useModal } from "@context";
77
import { useDelegateTodRep, useScreenDimension, useTranslation } from "@hooks";
88
import { Card, DataMissingInfoBox } from "@molecules";
99
import {
10-
correctVoteAdaFormat,
10+
correctDRepDirectoryFormat,
1111
encodeCIP129Identifier,
1212
testIdFromLabel,
1313
} from "@utils";
@@ -146,7 +146,7 @@ export const DRepDetailsCard = ({
146146
sx={{ display: "flex", flexDirection: "row", mt: 0.5 }}
147147
>
148148
{"₳ "}
149-
{correctVoteAdaFormat(votingPower)}
149+
{correctDRepDirectoryFormat(votingPower)}
150150
</Typography>
151151
</DRepDetailsInfoItem>
152152
</Box>
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { createContext, useContext, PropsWithChildren, useMemo } from "react";
2+
import { HandleObject } from "@/models/adaHandle";
3+
import { adaHandleService } from "@/services/AdaHandle";
4+
5+
type AdaHandleContextType = {
6+
isValidAdaHandle: (handle: string) => Promise<boolean>;
7+
getAdaHandleCIP105DRepId: (handle: string) => Promise<string>;
8+
getAdaHandleCIP129DRepId: (handle: string) => Promise<string>;
9+
getHandleDetails: (handle: string) => Promise<HandleObject | null>;
10+
};
11+
12+
const AdaHandleContext = createContext<AdaHandleContextType | null>(null);
13+
14+
/**
15+
* Provides the AdaHandle context to its children components.
16+
*/
17+
export const AdaHandleProvider = ({ children }: PropsWithChildren) => {
18+
const value = useMemo<AdaHandleContextType>(
19+
() => ({
20+
isValidAdaHandle: adaHandleService.isValidAdaHandle,
21+
getAdaHandleCIP105DRepId: adaHandleService.getAdaHandleCIP105DRepId,
22+
getAdaHandleCIP129DRepId: adaHandleService.getAdaHandleCIP129DRepId,
23+
getHandleDetails: adaHandleService.getHandleDetails,
24+
}),
25+
[adaHandleService],
26+
);
27+
28+
return (
29+
<AdaHandleContext.Provider value={value}>
30+
{children}
31+
</AdaHandleContext.Provider>
32+
);
33+
};
34+
35+
/**
36+
* Custom hook that provides access to the AdaHandle context.
37+
* Throws an error if used outside of an AdaHandleProvider.
38+
*/
39+
export const useAdaHandleContext = () => {
40+
const context = useContext(AdaHandleContext);
41+
42+
if (!context) {
43+
throw new Error(
44+
"useAdaHandleContext must be used within an AdaHandleProvider",
45+
);
46+
}
47+
48+
return context;
49+
};

govtool/frontend/src/context/appContext.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ import {
1515
PROTOCOL_PARAMS_KEY,
1616
setItemToLocalStorage,
1717
} from "@/utils";
18-
import { EpochParams, NetworkMetrics } from "@/models";
18+
import { EpochParams, NetworkMetrics, Network } from "@/models";
19+
import { adaHandleService } from "@/services/AdaHandle";
1920

2021
const BOOTSTRAPPING_PHASE_MAJOR = 9;
2122

@@ -25,7 +26,7 @@ type AppContextType = {
2526
isInBootstrapPhase: boolean;
2627
isFullGovernance: boolean;
2728
networkName: string;
28-
network: string;
29+
network: Network;
2930
cExplorerBaseUrl: string;
3031
epochParams?: EpochParams;
3132
networkMetrics?: NetworkMetrics;
@@ -58,6 +59,9 @@ const AppContextProvider = ({ children }: PropsWithChildren) => {
5859
const { data: networkMetricsData } = await fetchNetworkMetrics();
5960
if (networkMetricsData) {
6061
setItemToLocalStorage(NETWORK_METRICS_KEY, networkMetricsData);
62+
63+
// Initialize ada handle service
64+
adaHandleService.initialize(networkMetricsData.networkName);
6165
}
6266

6367
setIsAppInitializing(false);
@@ -81,7 +85,7 @@ const AppContextProvider = ({ children }: PropsWithChildren) => {
8185
(networkMetrics?.networkName as keyof typeof NETWORK_NAMES) ||
8286
"preview"
8387
],
84-
network: networkMetrics?.networkName || "preview",
88+
network: networkMetrics?.networkName ?? Network.preview,
8589
cExplorerBaseUrl:
8690
CEXPLORER_BASE_URLS[
8791
(networkMetrics?.networkName as keyof typeof NETWORK_NAMES) ||

govtool/frontend/src/context/contextProviders.tsx

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { SnackbarProvider, useSnackbar } from "./snackbar";
55
import { DataActionsBarProvider } from "./dataActionsBar";
66
import { FeatureFlagProvider } from "./featureFlag";
77
import { GovernanceActionProvider } from "./governanceAction";
8+
import { AdaHandleProvider } from "./adaHandle";
89

910
interface Props {
1011
children: React.ReactNode;
@@ -14,13 +15,15 @@ const ContextProviders = ({ children }: Props) => (
1415
<AppContextProvider>
1516
<GovernanceActionProvider>
1617
<FeatureFlagProvider>
17-
<ModalProvider>
18-
<SnackbarProvider>
19-
<DataActionsBarProvider>
20-
<CardanoProvider>{children}</CardanoProvider>
21-
</DataActionsBarProvider>
22-
</SnackbarProvider>
23-
</ModalProvider>
18+
<AdaHandleProvider>
19+
<ModalProvider>
20+
<SnackbarProvider>
21+
<DataActionsBarProvider>
22+
<CardanoProvider>{children}</CardanoProvider>
23+
</DataActionsBarProvider>
24+
</SnackbarProvider>
25+
</ModalProvider>
26+
</AdaHandleProvider>
2427
</FeatureFlagProvider>
2528
</GovernanceActionProvider>
2629
</AppContextProvider>

govtool/frontend/src/context/featureFlag.test.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { renderHook } from "@testing-library/react";
33
import { FeatureFlagProvider, useFeatureFlag } from "./featureFlag";
44
import { GovernanceActionType } from "@/types/governanceAction";
55
import { useAppContext } from "./appContext";
6+
import { Network } from "@/models";
67

78
vi.mock("./appContext");
89

@@ -13,7 +14,7 @@ const mockUseAppContextReturnValue = {
1314
isAppInitializing: false,
1415
isInBootstrapPhase: false,
1516
isFullGovernance: true,
16-
network: "preview",
17+
network: Network.preview,
1718
networkName: "preview",
1819
isMainnet: false,
1920
};
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
export type ResolvedAddresses = {
2+
ada?: string;
3+
eth?: string;
4+
btc?: string;
5+
};
6+
7+
export type Virtual = {
8+
expires_time: number;
9+
public_mint: boolean;
10+
};
11+
12+
export type HandleObject = {
13+
hex: string;
14+
name: string;
15+
handle_type?: "handle" | "nft_subhandle";
16+
virtual?: Virtual;
17+
holder: string;
18+
holder_type: "wallet" | "drep";
19+
image: string;
20+
standard_image: string;
21+
image_hash: string;
22+
standard_image_hash: string;
23+
length: number;
24+
og?: number;
25+
og_number: number;
26+
rarity: string;
27+
characters: string;
28+
numeric_modifiers: string;
29+
sub_length: number;
30+
sub_rarity: string;
31+
sub_characters: string;
32+
sub_numeric_modifiers: string;
33+
payment_key_hash: string;
34+
default_in_wallet: string;
35+
pfp_image: string;
36+
bg_image: string;
37+
pfp_asset?: string;
38+
bg_asset?: string;
39+
resolved_addresses: ResolvedAddresses;
40+
original_address?: string;
41+
version: number;
42+
svg_version: string;
43+
utxo: string;
44+
lovelace?: number;
45+
has_datum: boolean;
46+
created_slot_number: number;
47+
updated_slot_number: number;
48+
last_update_address?: string;
49+
pz_enabled?: boolean;
50+
last_edited_time?: number;
51+
drep?: {
52+
type: "drep";
53+
cred: string;
54+
hex: string;
55+
cip_105: string;
56+
cip_129: string;
57+
};
58+
};

0 commit comments

Comments
 (0)