Skip to content

Commit

Permalink
Add hook to fetch delegation outputs
Browse files Browse the repository at this point in the history
  • Loading branch information
brancoder committed Feb 26, 2024
1 parent a0e1aeb commit 77a72d8
Show file tree
Hide file tree
Showing 7 changed files with 135 additions and 2 deletions.
13 changes: 13 additions & 0 deletions client/src/helpers/nova/hooks/useAccountAddressState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { useAccountControlledFoundries } from "./useAccountControlledFoundries";
import { useAccountCongestion } from "./useAccountCongestion";
import { useAddressNftOutputs } from "~/helpers/nova/hooks/useAddressNftOutputs";
import { useAccountValidatorDetails } from "./useAccountValidatorDetails";
import { useAddressDelegationOutputs } from "./useAddressDelegationOutputs";

export interface IAccountAddressState {
addressDetails: IAddressDetails | null;
Expand All @@ -32,12 +33,14 @@ export interface IAccountAddressState {
validatorDetails: ValidatorResponse | null;
addressBasicOutputs: OutputResponse[] | null;
addressNftOutputs: OutputResponse[] | null;
addressDelegationOutputs: OutputResponse[] | null;
foundries: string[] | null;
congestion: CongestionResponse | null;
isAccountDetailsLoading: boolean;
isAssociatedOutputsLoading: boolean;
isBasicOutputsLoading: boolean;
isNftOutputsLoading: boolean;
isDelegationOutputsLoading: boolean;
isFoundriesLoading: boolean;
isCongestionLoading: boolean;
isValidatorDetailsLoading: boolean;
Expand All @@ -53,12 +56,14 @@ const initialState = {
validatorDetails: null,
addressBasicOutputs: null,
addressNftOutputs: null,
addressDelegationOutputs: null,
foundries: null,
congestion: null,
isAccountDetailsLoading: true,
isAssociatedOutputsLoading: false,
isBasicOutputsLoading: false,
isNftOutputsLoading: false,
isDelegationOutputsLoading: false,
isFoundriesLoading: false,
isCongestionLoading: false,
isValidatorDetailsLoading: false,
Expand All @@ -85,6 +90,10 @@ export const useAccountAddressState = (address: AccountAddress): [IAccountAddres
const { totalBalance, availableBalance } = useAddressBalance(network, state.addressDetails, accountOutput);
const [addressBasicOutputs, isBasicOutputsLoading] = useAddressBasicOutputs(network, state.addressDetails?.bech32 ?? null);
const [addressNftOutputs, isNftOutputsLoading] = useAddressNftOutputs(network, state.addressDetails?.bech32 ?? null);
const [addressDelegationOutputs, isDelegationOutputsLoading] = useAddressDelegationOutputs(
network,
state.addressDetails?.bech32 ?? null,
);
const [foundries, isFoundriesLoading] = useAccountControlledFoundries(network, state.addressDetails);
const { congestion, isLoading: isCongestionLoading } = useAccountCongestion(network, state.addressDetails?.hex ?? null);
const { validatorDetails, isLoading: isValidatorDetailsLoading } = useAccountValidatorDetails(
Expand Down Expand Up @@ -115,8 +124,10 @@ export const useAccountAddressState = (address: AccountAddress): [IAccountAddres
validatorDetails,
addressBasicOutputs,
addressNftOutputs,
addressDelegationOutputs,
isBasicOutputsLoading,
isNftOutputsLoading,
isDelegationOutputsLoading,
isFoundriesLoading,
isCongestionLoading,
isValidatorDetailsLoading,
Expand Down Expand Up @@ -152,11 +163,13 @@ export const useAccountAddressState = (address: AccountAddress): [IAccountAddres
availableBalance,
addressBasicOutputs,
addressNftOutputs,
addressDelegationOutputs,
congestion,
validatorDetails,
isAccountDetailsLoading,
isBasicOutputsLoading,
isNftOutputsLoading,
isDelegationOutputsLoading,
isCongestionLoading,
isValidatorDetailsLoading,
]);
Expand Down
43 changes: 43 additions & 0 deletions client/src/helpers/nova/hooks/useAddressDelegationOutputs.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { OutputResponse } from "@iota/sdk-wasm-nova/web";
import { useEffect, useState } from "react";
import { useIsMounted } from "~helpers/hooks/useIsMounted";
import { ServiceFactory } from "~factories/serviceFactory";
import { NOVA } from "~models/config/protocolVersion";
import { NovaApiClient } from "~/services/nova/novaApiClient";

/**
* Fetch Address delegation UTXOs
* @param network The Network in context
* @param addressBech32 The address in bech32 format
* @returns The output responses and loading bool.
*/
export function useAddressDelegationOutputs(network: string, addressBech32: string | null): [OutputResponse[] | null, boolean] {
const isMounted = useIsMounted();
const [apiClient] = useState(ServiceFactory.get<NovaApiClient>(`api-client-${NOVA}`));
const [outputs, setOutputs] = useState<OutputResponse[] | null>(null);
const [isLoading, setIsLoading] = useState<boolean>(true);

useEffect(() => {
setIsLoading(true);
setOutputs(null);
if (addressBech32) {
// eslint-disable-next-line no-void
void (async () => {
apiClient
.delegationOutputsDetails({ network, address: addressBech32 })
.then((response) => {
if (!response?.error && response.outputs && isMounted) {
setOutputs(response.outputs);
}
})
.finally(() => {
setIsLoading(false);
});
})();
} else {
setIsLoading(false);
}
}, [network, addressBech32]);

return [outputs, isLoading];
}
12 changes: 12 additions & 0 deletions client/src/helpers/nova/hooks/useAnchorAddressState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,10 @@ export interface IAnchorAddressState {
totalBalance: number | null;
addressBasicOutputs: OutputResponse[] | null;
addressNftOutputs: OutputResponse[] | null;
addressDelegationOutputs: OutputResponse[] | null;
isBasicOutputsLoading: boolean;
isNftOutputsLoading: boolean;
isDelegationOutputsLoading: boolean;
isAnchorDetailsLoading: boolean;
isAssociatedOutputsLoading: boolean;
}
Expand All @@ -30,8 +32,10 @@ const initialState = {
availableBalance: null,
addressBasicOutputs: null,
addressNftOutputs: null,
addressDelegationOutputs: null,
isBasicOutputsLoading: false,
isNftOutputsLoading: false,
isDelegationOutputsLoading: false,
isAnchorDetailsLoading: true,
isAssociatedOutputsLoading: false,
};
Expand All @@ -56,6 +60,10 @@ export const useAnchorAddressState = (address: AnchorAddress): [IAnchorAddressSt
const { totalBalance, availableBalance } = useAddressBalance(network, state.addressDetails, anchorOutput);
const [addressBasicOutputs, isBasicOutputsLoading] = useAddressBasicOutputs(network, state.addressDetails?.bech32 ?? null);
const [addressNftOutputs, isNftOutputsLoading] = useAddressNftOutputs(network, state.addressDetails?.bech32 ?? null);
const [addressDelegationOutputs, isDelegationOutputsLoading] = useAddressDelegationOutputs(
network,
state.addressDetails?.bech32 ?? null,
);

useEffect(() => {
const locationState = location.state as IAddressPageLocationProps;
Expand All @@ -76,8 +84,10 @@ export const useAnchorAddressState = (address: AnchorAddress): [IAnchorAddressSt
availableBalance,
addressBasicOutputs,
addressNftOutputs,
addressDelegationOutputs,
isBasicOutputsLoading,
isNftOutputsLoading,
isDelegationOutputsLoading,
isAnchorDetailsLoading,
});
}, [
Expand All @@ -86,8 +96,10 @@ export const useAnchorAddressState = (address: AnchorAddress): [IAnchorAddressSt
availableBalance,
addressBasicOutputs,
addressNftOutputs,
addressDelegationOutputs,
isBasicOutputsLoading,
isNftOutputsLoading,
isDelegationOutputsLoading,
isAnchorDetailsLoading,
]);

Expand Down
22 changes: 21 additions & 1 deletion client/src/helpers/nova/hooks/useEd25519AddressState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,18 @@ import { AddressHelper } from "~/helpers/nova/addressHelper";
import { useAddressBalance } from "./useAddressBalance";
import { useAddressBasicOutputs } from "~/helpers/nova/hooks/useAddressBasicOutputs";
import { useAddressNftOutputs } from "~/helpers/nova/hooks/useAddressNftOutputs";
import { useAddressDelegationOutputs } from "./useAddressDelegationOutputs";

export interface IEd25519AddressState {
addressDetails: IAddressDetails | null;
totalBalance: number | null;
availableBalance: number | null;
addressBasicOutputs: OutputResponse[] | null;
addressNftOutputs: OutputResponse[] | null;
addressDelegationOutputs: OutputResponse[] | null;
isBasicOutputsLoading: boolean;
isNftOutputsLoading: boolean;
isDelegationOutputsLoading: boolean;
isAssociatedOutputsLoading: boolean;
}

Expand All @@ -25,8 +28,10 @@ const initialState = {
availableBalance: null,
addressBasicOutputs: null,
addressNftOutputs: null,
addressDelegationOutputs: null,
isBasicOutputsLoading: false,
isNftOutputsLoading: false,
isDelegationOutputsLoading: false,
isAssociatedOutputsLoading: false,
};

Expand All @@ -48,6 +53,10 @@ export const useEd25519AddressState = (address: Ed25519Address): [IEd25519Addres
const { totalBalance, availableBalance } = useAddressBalance(network, state.addressDetails, null);
const [addressBasicOutputs, isBasicOutputsLoading] = useAddressBasicOutputs(network, state.addressDetails?.bech32 ?? null);
const [addressNftOutputs, isNftOutputsLoading] = useAddressNftOutputs(network, state.addressDetails?.bech32 ?? null);
const [addressDelegationOutputs, isDelegationOutputsLoading] = useAddressDelegationOutputs(
network,
state.addressDetails?.bech32 ?? null,
);

useEffect(() => {
const locationState = location.state as IAddressPageLocationProps;
Expand All @@ -66,10 +75,21 @@ export const useEd25519AddressState = (address: Ed25519Address): [IEd25519Addres
availableBalance,
addressBasicOutputs,
addressNftOutputs,
addressDelegationOutputs,
isBasicOutputsLoading,
isNftOutputsLoading,
isDelegationOutputsLoading,
});
}, [totalBalance, availableBalance, addressBasicOutputs, addressNftOutputs, isBasicOutputsLoading, isNftOutputsLoading]);
}, [
totalBalance,
availableBalance,
addressBasicOutputs,
addressNftOutputs,
addressDelegationOutputs,
isBasicOutputsLoading,
isNftOutputsLoading,
isDelegationOutputsLoading,
]);

return [state, setState];
};
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,18 @@ import { AddressHelper } from "~/helpers/nova/addressHelper";
import { useAddressBalance } from "./useAddressBalance";
import { useAddressBasicOutputs } from "~/helpers/nova/hooks/useAddressBasicOutputs";
import { useAddressNftOutputs } from "~/helpers/nova/hooks/useAddressNftOutputs";
import { useAddressDelegationOutputs } from "./useAddressDelegationOutputs";

export interface IImplicitAccountCreationAddressState {
addressDetails: IAddressDetails | null;
totalBalance: number | null;
availableBalance: number | null;
addressBasicOutputs: OutputResponse[] | null;
addressNftOutputs: OutputResponse[] | null;
addressDelegationOutputs: OutputResponse[] | null;
isBasicOutputsLoading: boolean;
isNftOutputsLoading: boolean;
isDelegationOutputsLoading: boolean;
isAssociatedOutputsLoading: boolean;
}

Expand All @@ -26,8 +29,10 @@ const initialState = {
availableBalance: null,
addressBasicOutputs: null,
addressNftOutputs: null,
addressDelegationOutputs: null,
isBasicOutputsLoading: false,
isNftOutputsLoading: false,
isDelegationOutputsLoading: false,
isAssociatedOutputsLoading: false,
};

Expand All @@ -52,6 +57,10 @@ export const useImplicitAccountCreationAddressState = (
const { totalBalance, availableBalance } = useAddressBalance(network, state.addressDetails, null);
const [addressBasicOutputs, isBasicOutputsLoading] = useAddressBasicOutputs(network, state.addressDetails?.bech32 ?? null);
const [addressNftOutputs, isNftOutputsLoading] = useAddressNftOutputs(network, state.addressDetails?.bech32 ?? null);
const [addressDelegationOutputs, isDelegationOutputsLoading] = useAddressDelegationOutputs(
network,
state.addressDetails?.bech32 ?? null,
);

useEffect(() => {
const locationState = location.state as IAddressPageLocationProps;
Expand All @@ -71,10 +80,21 @@ export const useImplicitAccountCreationAddressState = (
availableBalance,
addressBasicOutputs,
addressNftOutputs,
addressDelegationOutputs,
isBasicOutputsLoading,
isNftOutputsLoading,
isDelegationOutputsLoading,
});
}, [totalBalance, availableBalance, addressBasicOutputs, addressNftOutputs, isBasicOutputsLoading, isBasicOutputsLoading]);
}, [
totalBalance,
availableBalance,
addressBasicOutputs,
addressNftOutputs,
addressDelegationOutputs,
isBasicOutputsLoading,
isNftOutputsLoading,
isDelegationOutputsLoading,
]);

return [state, setState];
};
13 changes: 13 additions & 0 deletions client/src/helpers/nova/hooks/useNftAddressState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { AddressHelper } from "~/helpers/nova/addressHelper";
import { useAddressBalance } from "./useAddressBalance";
import { useAddressBasicOutputs } from "~/helpers/nova/hooks/useAddressBasicOutputs";
import { useAddressNftOutputs } from "~/helpers/nova/hooks/useAddressNftOutputs";
import { useAddressDelegationOutputs } from "./useAddressDelegationOutputs";

export interface INftAddressState {
addressDetails: IAddressDetails | null;
Expand All @@ -17,8 +18,10 @@ export interface INftAddressState {
availableBalance: number | null;
addressBasicOutputs: OutputResponse[] | null;
addressNftOutputs: OutputResponse[] | null;
addressDelegationOutputs: OutputResponse[] | null;
isBasicOutputsLoading: boolean;
isNftOutputsLoading: boolean;
isDelegationOutputsLoading: boolean;
isNftDetailsLoading: boolean;
isAssociatedOutputsLoading: boolean;
}
Expand All @@ -31,8 +34,10 @@ const initialState = {
availableBalance: null,
addressBasicOutputs: null,
addressNftOutputs: null,
addressDelegationOutputs: null,
isBasicOutputsLoading: false,
isNftOutputsLoading: false,
isDelegationOutputsLoading: false,
isAssociatedOutputsLoading: false,
};

Expand All @@ -56,6 +61,10 @@ export const useNftAddressState = (address: NftAddress): [INftAddressState, Reac
const { totalBalance, availableBalance } = useAddressBalance(network, state.addressDetails, nftOutput);
const [addressBasicOutputs, isBasicOutputsLoading] = useAddressBasicOutputs(network, state.addressDetails?.bech32 ?? null);
const [addressNftOutputs, isNftOutputsLoading] = useAddressNftOutputs(network, state.addressDetails?.bech32 ?? null);
const [addressDelegationOutputs, isDelegationOutputsLoading] = useAddressDelegationOutputs(
network,
state.addressDetails?.bech32 ?? null,
);

useEffect(() => {
const locationState = location.state as IAddressPageLocationProps;
Expand All @@ -77,8 +86,10 @@ export const useNftAddressState = (address: NftAddress): [INftAddressState, Reac
isNftDetailsLoading,
addressBasicOutputs,
addressNftOutputs,
addressDelegationOutputs,
isBasicOutputsLoading,
isNftOutputsLoading,
isDelegationOutputsLoading,
});
}, [
nftOutput,
Expand All @@ -87,8 +98,10 @@ export const useNftAddressState = (address: NftAddress): [INftAddressState, Reac
isNftDetailsLoading,
addressBasicOutputs,
addressNftOutputs,
addressDelegationOutputs,
isBasicOutputsLoading,
isNftOutputsLoading,
isDelegationOutputsLoading,
]);

return [state, setState];
Expand Down
12 changes: 12 additions & 0 deletions client/src/services/nova/novaApiClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,18 @@ export class NovaApiClient extends ApiClient {
return this.callApi<unknown, IAddressDetailsResponse>(`nova/address/outputs/nft/${request.network}/${request.address}`, "get");
}

/**
* Get the delegation outputs details of an address.
* @param request The Address Delegation outputs request.
* @returns The Address outputs response
*/
public async delegationOutputsDetails(request: IAddressDetailsRequest): Promise<IAddressDetailsResponse> {
return this.callApi<unknown, IAddressDetailsResponse>(
`nova/address/outputs/delegation/${request.network}/${request.address}`,
"get",
);
}

/**
* Get the associated outputs.
* @param request The request to send.
Expand Down

0 comments on commit 77a72d8

Please sign in to comment.