diff --git a/packages/starkweb/src/core/actions/executeTransaction.ts b/packages/starkweb/src/core/actions/executeTransaction.ts new file mode 100644 index 0000000..cbc52e5 --- /dev/null +++ b/packages/starkweb/src/core/actions/executeTransaction.ts @@ -0,0 +1,39 @@ +import { + type ExecuteTransactionErrorType as strkjs_ExecuteTransactionErrorType, + type ExecuteTransactionParameters as strkjs_ExecuteTransactionParameters, + type ExecuteTransactionReturnType as strkjs_ExecuteTransactionReturnType, + executeTransaction as strkjs_executeTransaction, + } from "../../actions/paymaster/executeTransaction.js"; + import type { Hex } from "../../types/misc.js"; + + import type { Config } from "../createConfig.js"; + import type { ChainIdParameter } from "../types/properties.js"; + import type { Evaluate } from "../types/utils.js"; + import { getAction } from "../utils/getAction.js"; + + export type ExecuteTransactionParameters = Evaluate< + strkjs_ExecuteTransactionParameters & ChainIdParameter + >; + + export type ExecuteTransactionReturnType = Evaluate< + strkjs_ExecuteTransactionReturnType & { + chainId: Hex; + } + >; + + export type ExecuteTransactionErrorType = + strkjs_ExecuteTransactionErrorType; + + export async function executeTransaction( + config: Config, + parameters: ExecuteTransactionParameters + ): Promise { + const { chainId, ...rest } = parameters; + const client = config.getClient({ chainId }); + const action = getAction( + client, + strkjs_executeTransaction, + "executeTransaction" + ); + return action(rest) as Promise; + } \ No newline at end of file diff --git a/packages/starkweb/src/core/actions/getGasTokenPrices.ts b/packages/starkweb/src/core/actions/getGasTokenPrices.ts new file mode 100644 index 0000000..71dfd02 --- /dev/null +++ b/packages/starkweb/src/core/actions/getGasTokenPrices.ts @@ -0,0 +1,39 @@ +import { + type GetGasTokenPricesErrorType as strkjs_GetGasTokenPricesErrorType, + type GetGasTokenPricesParameters as strkjs_GetGasTokenPricesParameters, + type GetGasTokenPricesReturnType as strkjs_GetGasTokenPricesReturnType, + getGasTokenPrices as strkjs_getGasTokenPrices, + } from "../../actions/paymaster/getGasTokenPrices.js"; + import type { Hex } from "../../types/misc.js"; + + import type { Config } from "../createConfig.js"; + import type { ChainIdParameter } from "../types/properties.js"; + import type { Evaluate } from "../types/utils.js"; + import { getAction } from "../utils/getAction.js"; + + export type GetGasTokenPricesParameters = Evaluate< + strkjs_GetGasTokenPricesParameters & ChainIdParameter + >; + + export type GetGasTokenPricesReturnType = Evaluate< + strkjs_GetGasTokenPricesReturnType & { + chainId: Hex; + } + >; + + export type GetGasTokenPricesErrorType = + strkjs_GetGasTokenPricesErrorType; + + export async function getGasTokenPrices( + config: Config, + parameters: GetGasTokenPricesParameters & Record + ): Promise { + const { chainId } = parameters; + const client = config.getClient({ chainId }); + const action = getAction( + client, + strkjs_getGasTokenPrices, + "getGasTokenPrices" + ); + return action(chainId) as Promise; + } \ No newline at end of file diff --git a/packages/starkweb/src/core/actions/getPaymasterStatus.ts b/packages/starkweb/src/core/actions/getPaymasterStatus.ts index a22dc7d..b4523f7 100644 --- a/packages/starkweb/src/core/actions/getPaymasterStatus.ts +++ b/packages/starkweb/src/core/actions/getPaymasterStatus.ts @@ -1,36 +1,39 @@ -import { useState } from 'react'; -import { createPaymasterClient } from '../../exports/starkweb.js'; -import { http } from '../../exports/starkweb.js'; -import { mainnet, sepolia } from '../../exports/chains.js'; -import type { GaslessStatus } from '../../types/paymaster.js'; +import { + type GetPaymasterStatusErrorType as strkjs_GetPaymasterStatusErrorType, + type GetPaymasterStatusParameters as strkjs_GetPaymasterStatusParameters, + type GetPaymasterStatusReturnType as strkjs_GetPaymasterStatusReturnType, + getPaymasterStatus as strkjs_getPaymasterStatus, +} from "../../actions/paymaster/getPaymasterStatus.js"; +import type { Hex } from "../../types/misc.js"; -/** - * Fetches the current status of the Paymaster. - * - * @param {('mainnet' | 'sepolia')} network - The network to connect to, either 'mainnet' or 'sepolia'. - * @param {string} [url='http://localhost:3003/paymaster'] - Optional URL for the Paymaster service. Defaults to 'http://localhost:3003/paymaster. - * @returns {Object} An object containing the status, loading state, and error message. - */ -export const fetchPaymasterStatus = async (network: 'mainnet' | 'sepolia', url: string = 'http://localhost:3003/paymaster') => { - const [status, setStatus] = useState(null); - const [loading, setLoading] = useState(false); - const [error, setError] = useState(null); +import type { Config } from "../createConfig.js"; +import type { ChainIdParameter } from "../types/properties.js"; +import type { Evaluate } from "../types/utils.js"; +import { getAction } from "../utils/getAction.js"; - const chain = network === 'mainnet' ? mainnet : sepolia; - const paymasterClient = createPaymasterClient({ - chain, - transport: http(`${url}/paymaster/${network}`), - }); +export type GetPaymasterStatusParameters = Evaluate< + strkjs_GetPaymasterStatusParameters & ChainIdParameter +>; - setLoading(true); - try { - const paymasterStatus = await paymasterClient.getPaymasterStatus(); - setStatus(paymasterStatus); - } catch (err) { - setError('Failed to fetch paymaster status'); - } finally { - setLoading(false); +export type GetPaymasterStatusReturnType = Evaluate< + strkjs_GetPaymasterStatusReturnType & { + chainId: Hex; } +>; - return { status, loading, error }; -}; \ No newline at end of file +export type GetPaymasterStatusErrorType = + strkjs_GetPaymasterStatusErrorType; + +export async function getPaymasterStatus( + config: Config, + parameters: GetPaymasterStatusParameters +): Promise { + const { chainId } = parameters; + const client = config.getClient({ chainId }); + const action = getAction( + client, + strkjs_getPaymasterStatus, + "getPaymasterStatus" + ); + return action(undefined) as Promise; +} \ No newline at end of file diff --git a/packages/starkweb/src/core/exports/query.ts b/packages/starkweb/src/core/exports/query.ts index 83633b8..d6aa052 100644 --- a/packages/starkweb/src/core/exports/query.ts +++ b/packages/starkweb/src/core/exports/query.ts @@ -137,7 +137,6 @@ export { getWalletClientQueryOptions, } from "../query/getWalletClient.js"; - // Starknet ID Queries export { @@ -309,4 +308,49 @@ export { verifyTypedDataQueryOptions, } from "../query/verifyTypedData.js"; -export { hashFn, structuralSharing } from '../query/utils.js' +export { hashFn, structuralSharing } from "../query/utils.js"; + + + + +// PAYMASTER QUERIES // + +export { + type GetPaymasterStatusQueryKey, + type GetPaymasterStatusReturnType, + type GetPaymasterStatusErrorType, + getPaymasterStatusQueryKey, + getPaymasterStatusQueryOptions, +} from "../query/getPaymasterStatus.js"; + +export { + type CheckAccountCompatibilityQueryKey, + type CheckAccountCompatibilityReturnType, + type CheckAccountCompatibilityErrorType, + checkAccountCompatibilityQueryKey, + checkAccountCompatibilityQueryOptions, +} from "../query/checkAccountCompatibility.js"; + +export { + type GetAccountRewardsQueryKey, + type GetAccountRewardsReturnType, + type GetAccountRewardsErrorType, + getAccountRewardsQueryKey, + getAccountRewardsQueryOptions, +} from "../query/getAccountRewards.js"; + +export { + type GetGasTokenPricesQueryKey, + type GetGasTokenPricesReturnType, + type GetGasTokenPricesErrorType, + getGasTokenPricesQueryKey, + getGasTokenPricesQueryOptions, +} from "../query/getGasTokenPrices.js"; + +export { + type ExecuteTransactionQueryKey, + type ExecuteTransactionReturnType, + type ExecuteTransactionErrorType, + executeTransactionQueryKey, + executeTransactionQueryOptions, +} from "../query/executeTransaction.js"; diff --git a/packages/starkweb/src/core/query/buildTypedData.ts b/packages/starkweb/src/core/query/buildTypedData.ts index 27a6698..6f3eeac 100644 --- a/packages/starkweb/src/core/query/buildTypedData.ts +++ b/packages/starkweb/src/core/query/buildTypedData.ts @@ -2,13 +2,19 @@ import type { QueryOptions } from '@tanstack/query-core' import { - type BuildTypedDataErrorType, + type BuildTypedDataErrorType as strkjs_BuildTypedDataErrorType, type BuildTypedDataParameters, type BuildTypedDataReturnType, buildTypedData, } from "../actions/buildTypedData.js"; import type { Config } from "../createConfig.js"; import { filterQueryOptions } from "./utils.js"; +import type { Evaluate, ExactPartial } from '../types/utils.js'; + + +export type BuildTypedDataOptions = Evaluate< + ExactPartial +>; export function buildTypedDataQueryOptions( config: Config, @@ -25,3 +31,5 @@ export function buildTypedDataQueryKey(parameters: BuildTypedDataParameters) { } export type BuildTypedDataQueryKey = ReturnType +export type BuildTypedDataData = BuildTypedDataReturnType +export type BuildTypedDataErrorType = strkjs_BuildTypedDataErrorType diff --git a/packages/starkweb/src/core/query/checkAccountCompatibility.ts b/packages/starkweb/src/core/query/checkAccountCompatibility.ts new file mode 100644 index 0000000..7d91535 --- /dev/null +++ b/packages/starkweb/src/core/query/checkAccountCompatibility.ts @@ -0,0 +1,32 @@ +import type { QueryOptions } from '@tanstack/query-core'; +import { + type CheckAccountCompatibilityErrorType as strkjs_CheckAccountCompatibilityErrorType, + type CheckAccountCompatibilityParameters, + type CheckAccountCompatibilityReturnType, + checkAccountCompatibility, +} from "../actions/checkAccountCompatibility.js"; +import type { Config } from "../createConfig.js"; +import type { Evaluate, ExactPartial } from '../types/utils.js'; + + +export type CheckAccountCompatibilityOptions = Evaluate< + ExactPartial +>; + +export function checkAccountCompatibilityQueryOptions( + config: Config, + parameters: CheckAccountCompatibilityParameters +): QueryOptions { + return { + queryKey: checkAccountCompatibilityQueryKey(parameters), + queryFn: () => checkAccountCompatibility(config, parameters), + }; +} + +export function checkAccountCompatibilityQueryKey(parameters: CheckAccountCompatibilityParameters) { + return ['checkAccountCompatibility', parameters] as const; +} + +export type CheckAccountCompatibilityQueryKey = ReturnType; +export type checkAccountCompatibilityData = CheckAccountCompatibilityReturnType; +export type CheckAccountCompatibilityErrorType = strkjs_CheckAccountCompatibilityErrorType \ No newline at end of file diff --git a/packages/starkweb/src/core/query/executeTransaction.ts b/packages/starkweb/src/core/query/executeTransaction.ts new file mode 100644 index 0000000..7264106 --- /dev/null +++ b/packages/starkweb/src/core/query/executeTransaction.ts @@ -0,0 +1,37 @@ +import type { QueryOptions } from '@tanstack/query-core'; +import { + type ExecuteTransactionErrorType as strkjs_ExecuteTransactionErrorType, + type ExecuteTransactionParameters, + type ExecuteTransactionReturnType, + executeTransaction, +} from "../actions/executeTransaction.js"; +import type { Evaluate, ExactPartial } from '../types/utils.js'; +import type { ScopeKeyParameter } from '../types/properties.js' + +import type { Config } from "../createConfig.js"; + +export type ExecuteTransactionOptions = Evaluate< + ExactPartial & ScopeKeyParameter +>; +// Placeholder for executeTransactionQueryKey function +function executeTransactionQueryKey(parameters: ExecuteTransactionParameters) { + return ['executeTransaction', parameters] as const; +} + +export function executeTransactionQueryOptions( + config: Config, + parameters: ExecuteTransactionParameters +): QueryOptions { + return { + queryKey: executeTransactionQueryKey(parameters), + queryFn: () => executeTransaction(config, parameters), + }; +} + +export function GetExecuteTransactionData(parameters: ExecuteTransactionParameters) { + return ['executeTransaction', parameters] as const; +} + +export type ExecuteTransactionQueryKey = ReturnType; +export type ExecuteTransactionData = ExecuteTransactionReturnType; +export type ExecuteTransactionErrorType = strkjs_ExecuteTransactionErrorType; \ No newline at end of file diff --git a/packages/starkweb/src/core/query/getAccountRewards.ts b/packages/starkweb/src/core/query/getAccountRewards.ts new file mode 100644 index 0000000..3b44251 --- /dev/null +++ b/packages/starkweb/src/core/query/getAccountRewards.ts @@ -0,0 +1,34 @@ +import type { QueryOptions } from '@tanstack/query-core'; +import { + type GetAccountRewardsErrorType as strkjs_GetAccountRewardsErrorType, + type GetAccountRewardsParameters, + type GetAccountRewardsReturnType, + getAccountRewards, + +} from "../actions/getAccountRewards.js"; +import type { Config } from "../createConfig.js"; +import type { Evaluate, ExactPartial } from '../types/utils.js'; +import type { ScopeKeyParameter } from '../types/properties.js' + + +export type GetAccountRewardsOptions = Evaluate< + ExactPartial & ScopeKeyParameter +>; + +export function getAccountRewardsQueryOptions( + config: Config, + parameters: GetAccountRewardsParameters +): QueryOptions { + return { + queryKey: getAccountRewardsQueryKey(parameters), + queryFn: () => getAccountRewards(config, parameters), + }; +} + +export function getAccountRewardsQueryKey(parameters: GetAccountRewardsParameters) { + return ['getAccountRewards', parameters] as const; +} + +export type GetAccountRewardsQueryKey = ReturnType; +export type GetAccountRewardsErrorType = strkjs_GetAccountRewardsErrorType +export type GetAccountRewardsData = GetAccountRewardsReturnType; \ No newline at end of file diff --git a/packages/starkweb/src/core/query/getGasTokenPrices.ts b/packages/starkweb/src/core/query/getGasTokenPrices.ts new file mode 100644 index 0000000..950b758 --- /dev/null +++ b/packages/starkweb/src/core/query/getGasTokenPrices.ts @@ -0,0 +1,32 @@ +import type { QueryOptions } from '@tanstack/query-core'; +import { + type GetGasTokenPricesErrorType as strkjs_GetGasTokenPricesErrorType, + type GetGasTokenPricesParameters, + type GetGasTokenPricesReturnType, + getGasTokenPrices, +} from "../actions/getGasTokenPrices.js"; +import type { Config } from "../createConfig.js"; +import type { Evaluate, ExactPartial } from '../types/utils.js'; +import type { ScopeKeyParameter } from '../types/properties.js' + + +export type GetGasTokenPricesOptions = Evaluate< + ExactPartial & ScopeKeyParameter +>; +export function getGasTokenPricesQueryOptions( + config: Config, + parameters: GetGasTokenPricesParameters +): QueryOptions { + return { + queryKey: getGasTokenPricesQueryKey(parameters), + queryFn: () => getGasTokenPrices(config, parameters), + }; +} + +export function getGasTokenPricesQueryKey(parameters: GetGasTokenPricesParameters) { + return ['getGasTokenPrices', parameters] as const; +} + +export type GetGasTokenPricesQueryKey = ReturnType; +export type GetGasTokenPricesData = GetGasTokenPricesReturnType; +export type GetGasTokenPricesErrorType = strkjs_GetGasTokenPricesErrorType \ No newline at end of file diff --git a/packages/starkweb/src/core/query/getPaymasterStatus.ts b/packages/starkweb/src/core/query/getPaymasterStatus.ts new file mode 100644 index 0000000..c993c80 --- /dev/null +++ b/packages/starkweb/src/core/query/getPaymasterStatus.ts @@ -0,0 +1,30 @@ +import type { QueryOptions } from '@tanstack/query-core'; +import { + type GetPaymasterStatusErrorType as strkjs_GetPaymasterStatusErrorType, + type GetPaymasterStatusParameters, + type GetPaymasterStatusReturnType, + getPaymasterStatus, +} from "../actions/getPaymasterStatus.js"; +import type { Config } from "../createConfig.js"; +import type { Evaluate, ExactPartial } from 'src/types/utils.js'; + +export type GetPaymasterStatusOptions = Evaluate< + ExactPartial +>; +export function getPaymasterStatusQueryOptions( + config: Config, + parameters: GetPaymasterStatusParameters +): QueryOptions { + return { + queryKey: getPaymasterStatusQueryKey(parameters), + queryFn: () => getPaymasterStatus(config, parameters), + }; +} + +export function getPaymasterStatusQueryKey(parameters: GetPaymasterStatusParameters) { + return ['getPaymasterStatus', parameters] as const; +} + +export type GetPaymasterStatusQueryKey = ReturnType; +export type GetPaymasterStatusData = GetPaymasterStatusReturnType; +export type GetPaymasterStatusErrorType = strkjs_GetPaymasterStatusErrorType; diff --git a/packages/starkweb/src/react/exports/index.ts b/packages/starkweb/src/react/exports/index.ts index dee5b9b..17c6254 100644 --- a/packages/starkweb/src/react/exports/index.ts +++ b/packages/starkweb/src/react/exports/index.ts @@ -381,17 +381,35 @@ export { //////////////////////////////////////////////////////////////////////////////// export { - type UsePaymasterProps, - type UsePaymasterReturn, - usePaymaster -} from '../hooks/usePaymaster.js' + type UseGetPaymasterStatusParameters, + type UseGetPaymasterStatusReturnType, + useGetPaymasterStatus +} from '../hooks/useGetPaymasterStatus.js' export { - type UseExecuteTransactionProps, - type UseExecuteTransactionReturn, + type UseExecuteTransactionParameters, + type UseExecuteTransactionReturnType, useExecuteTransaction, } from '../hooks/useExecuteTransaction.js' +export { + type UseFetchAccountRewardsParameters, + type UseGetAccountRewardsReturnType, + useFetchAccountRewards, +} from '../hooks/useGetAccountRewards.js' + +export { + type UseGetGasTokenParameters, + type UseGetGasTokenReturnType, + useGetGasTokenPrices, +} from '../hooks/useGetGasTokenPrices.js' + + +export { + type UseBuildTypedDataParameters, + type UseBuildTypedDataReturnType, + useBuildTypedData, +} from '../hooks/useBuildTypedData.js' //////////////////////////////////////////////////////////////////////////////// // @wagmi/core //////////////////////////////////////////////////////////////////////////////// diff --git a/packages/starkweb/src/react/hooks/useBuildTypedData.ts b/packages/starkweb/src/react/hooks/useBuildTypedData.ts new file mode 100644 index 0000000..4c8bceb --- /dev/null +++ b/packages/starkweb/src/react/hooks/useBuildTypedData.ts @@ -0,0 +1,50 @@ + +import type { Evaluate } from "../../types/utils.js"; +import type { ConfigParameter, QueryParameter } from "../types/properties.js"; +import type { Config } from "src/core/createConfig.js"; + +import { + type BuildTypedDataData, + type BuildTypedDataErrorType, + type BuildTypedDataOptions, + type BuildTypedDataQueryKey, + buildTypedDataQueryOptions, + } from "../../core/query/buildTypedData.js"; + +import { useConfig } from "./useConfig.js"; +import { type UseQueryReturnType, useQuery } from "../utils/query.js"; + + + export type UseBuildTypedDataParameters< + config extends Config = Config, + selectData = BuildTypedDataData +> = Evaluate< +BuildTypedDataOptions & + ConfigParameter & + QueryParameter< + BuildTypedDataData, + BuildTypedDataErrorType, + selectData, + BuildTypedDataQueryKey + > +>; + +export type UseBuildTypedDataReturnType = UseQueryReturnType; + +export function useBuildTypedData( + parameters: UseBuildTypedDataParameters +): UseBuildTypedDataReturnType { + const { query = {} } = parameters; + + const config = useConfig(parameters); + + + const options = buildTypedDataQueryOptions(config, { + ...parameters, + userAddress: parameters.userAddress!, + calls: parameters.calls!, + + }); + + return useQuery({ ...(query as any), ...options }) as UseBuildTypedDataReturnType; +} diff --git a/packages/starkweb/src/react/hooks/useCheckAccountCompatibility.ts b/packages/starkweb/src/react/hooks/useCheckAccountCompatibility.ts new file mode 100644 index 0000000..c55da3d --- /dev/null +++ b/packages/starkweb/src/react/hooks/useCheckAccountCompatibility.ts @@ -0,0 +1,53 @@ +import { type UseQueryReturnType, useQuery } from "../utils/query.js"; +import type { Hex } from "../../types/misc.js"; +import { useChainId } from "./useChainId.js"; +import { useConfig } from "./useConfig.js"; +import type { Config } from "src/core/createConfig.js"; +import { + type CheckAccountCompatibilityErrorType, + type CheckAccountCompatibilityQueryKey, + checkAccountCompatibilityQueryOptions, + type checkAccountCompatibilityData, + type CheckAccountCompatibilityOptions, + } from "../../core/query/checkAccountCompatibility.js"; +import type { Evaluate } from "../../types/utils.js"; +import type { ConfigParameter, QueryParameter } from "../types/properties.js"; + + + + + +export type UseCheckAccountCompatibilityParameters< + config extends Config = Config, + selectData = checkAccountCompatibilityData +> = Evaluate< + CheckAccountCompatibilityOptions & + ConfigParameter & { + accountAddress: string; + chainId?: Hex; + } & QueryParameter< + checkAccountCompatibilityData, + CheckAccountCompatibilityErrorType, + selectData, + CheckAccountCompatibilityQueryKey + > +>; + +export type UseCheckAccountCompatibilityReturnType = UseQueryReturnType; +export function useCheckAccountCompatibility( + parameters: UseCheckAccountCompatibilityParameters +): UseCheckAccountCompatibilityReturnType { + const { query = {}, accountAddress } = parameters; + + const config = useConfig(parameters); + const chainId = useChainId({ config }); + + const options = checkAccountCompatibilityQueryOptions(config, { + accountAddress, + chainId: parameters.chainId ?? chainId, + }); + + + return useQuery({ ...(query as any), ...options}) as UseCheckAccountCompatibilityReturnType; + +} diff --git a/packages/starkweb/src/react/hooks/useExecuteTransaction.ts b/packages/starkweb/src/react/hooks/useExecuteTransaction.ts index e505c29..c132a51 100644 --- a/packages/starkweb/src/react/hooks/useExecuteTransaction.ts +++ b/packages/starkweb/src/react/hooks/useExecuteTransaction.ts @@ -1,58 +1,58 @@ -import { useState } from 'react'; -import { createPaymasterClient } from '../../exports/starkweb.js'; -import { http } from '../../exports/starkweb.js'; -import { mainnet, sepolia } from '../../exports/chains.js'; -import type { InvokeResponse } from '../../types/paymaster.js'; -import type { ADDRESS, SIGNATURE } from '../../types/components.js'; - -export type UseExecuteTransactionProps = { - network: 'mainnet' | 'sepolia'; - userAddress: ADDRESS; - typedData: string; - signature: SIGNATURE; - clientUrl?: string; -}; - -export type UseExecuteTransactionReturn = { - loading: boolean; - error: string | null; - executeTransaction: () => Promise; -}; - -export const useExecuteTransaction = ({ - network, - userAddress, - typedData, - signature, - clientUrl, -}: UseExecuteTransactionProps): UseExecuteTransactionReturn => { - const [loading, setLoading] = useState(false); - const [error, setError] = useState(null); - - const executeTransaction = async (): Promise => { - setLoading(true); - setError(null); - const chain = network === 'mainnet' ? mainnet : sepolia; - const paymasterClient = createPaymasterClient({ - chain, - transport: http(clientUrl || `http://localhost:3003/paymaster/${network}`), - }); - - try { - const response = await paymasterClient.executeTransaction({ - userAddress, - typedData, - signature, - }); - return response; - } catch (err) { - setError('Failed to execute transaction'); - console.error(err); - return null; - } finally { - setLoading(false); - } - }; - - return { loading, error, executeTransaction }; -}; \ No newline at end of file +"use client"; + +import { useConfig } from "./useConfig.js"; +import { useChainId } from "./useChainId.js"; +import { + executeTransactionQueryOptions, + type ExecuteTransactionQueryKey, + type ExecuteTransactionData, + type ExecuteTransactionErrorType, + type ExecuteTransactionOptions, +} from "../../core/query/executeTransaction.js"; +import type { Config } from "../../core/createConfig.js"; +import { type UseQueryReturnType, useQuery } from '../utils/query.js' +import type { Hex } from "../../types/misc.js"; +import type { ConfigParameter, QueryParameter } from '../types/properties.js' +import type { Evaluate } from '../../core/types/utils.js' + +export type UseExecuteTransactionParameters< + config extends Config = Config, + selectData = ExecuteTransactionData +> = Evaluate< +ExecuteTransactionOptions & + ConfigParameter & { + chainId?: Hex; + } & QueryParameter< + ExecuteTransactionData, + ExecuteTransactionErrorType, + selectData, + ExecuteTransactionQueryKey + > +>; + +export type UseExecuteTransactionReturnType = UseQueryReturnType; + +export function useExecuteTransaction( + parameters: UseExecuteTransactionParameters +): UseExecuteTransactionReturnType { + const {userAddress, signature, typedData, query={}} = parameters; + const config = useConfig(parameters); + const chainId = useChainId({ config }); + + const options = executeTransactionQueryOptions(config, { + ...parameters, + userAddress: userAddress!, + signature: signature!, + typedData: typedData!, + chainId: parameters.chainId ?? chainId, + }); + + const queryOptions = { + ...(query as any), + ...options, + queryKey: options.queryKey + } + return useQuery(queryOptions) as UseExecuteTransactionReturnType + + +} \ No newline at end of file diff --git a/packages/starkweb/src/react/hooks/useGetAccountRewards.ts b/packages/starkweb/src/react/hooks/useGetAccountRewards.ts new file mode 100644 index 0000000..5283516 --- /dev/null +++ b/packages/starkweb/src/react/hooks/useGetAccountRewards.ts @@ -0,0 +1,46 @@ +import { + type GetAccountRewardsData, + type GetAccountRewardsErrorType, + type GetAccountRewardsOptions, + type GetAccountRewardsQueryKey, + getAccountRewardsQueryOptions, +} from "../../core/query/getAccountRewards.js"; +import { type UseQueryReturnType, useQuery } from "../utils/query.js"; +import type { Hex } from "../../types/misc.js"; +import { useConfig } from "./useConfig.js"; +import type { Config } from "src/core/createConfig.js"; +import type { Evaluate } from "../../types/utils.js"; +import type { ConfigParameter, QueryParameter } from "../types/properties.js"; + +export type UseFetchAccountRewardsParameters< + config extends Config = Config, + selectData = GetAccountRewardsData +> = Evaluate< +GetAccountRewardsOptions & + ConfigParameter & { + accountAddress: string; + chainId?: Hex; + } & QueryParameter< + GetAccountRewardsData, + GetAccountRewardsErrorType, + selectData, + GetAccountRewardsQueryKey + > +>; + +export type UseGetAccountRewardsReturnType = UseQueryReturnType +export function useFetchAccountRewards( + parameters: UseFetchAccountRewardsParameters +): UseGetAccountRewardsReturnType{ + const { query = {} } = parameters; + + const config = useConfig(parameters); + + const options = getAccountRewardsQueryOptions(config, { + ...parameters + }); + + + return useQuery({...(query as any), ...options, queryKey: options.queryKey}) as UseGetAccountRewardsReturnType; + +} \ No newline at end of file diff --git a/packages/starkweb/src/react/hooks/useGetGasTokenPrices.ts b/packages/starkweb/src/react/hooks/useGetGasTokenPrices.ts new file mode 100644 index 0000000..db89a80 --- /dev/null +++ b/packages/starkweb/src/react/hooks/useGetGasTokenPrices.ts @@ -0,0 +1,49 @@ + +import { + type GetGasTokenPricesData, + type GetGasTokenPricesErrorType, + type GetGasTokenPricesOptions, + type GetGasTokenPricesQueryKey, + getGasTokenPricesQueryOptions, + } from "../../core/query/getGasTokenPrices.js"; + + import { type UseQueryReturnType, useQuery } from "../utils/query.js"; + + + import { useConfig } from "./useConfig.js"; + import type { Config } from "src/core/createConfig.js"; + import type { Evaluate } from "../../types/utils.js"; + import type { ConfigParameter, QueryParameter } from "../types/properties.js"; + + + + export type UseGetGasTokenParameters< + config extends Config = Config, + selectData = GetGasTokenPricesData +> = Evaluate< +GetGasTokenPricesOptions & + ConfigParameter + & QueryParameter< + GetGasTokenPricesData, + GetGasTokenPricesErrorType, + selectData, + GetGasTokenPricesQueryKey + > +>; + +export type UseGetGasTokenReturnType = UseQueryReturnType; + + +export function useGetGasTokenPrices( + parameters: UseGetGasTokenParameters +): UseGetGasTokenReturnType { + const { query = {} } = parameters; + + const config = useConfig(parameters); + + const options = getGasTokenPricesQueryOptions(config, parameters); + + + + return useQuery({ ...(query as any), ...options,}) as UseGetGasTokenReturnType; +} \ No newline at end of file diff --git a/packages/starkweb/src/react/hooks/useGetPaymasterStatus.ts b/packages/starkweb/src/react/hooks/useGetPaymasterStatus.ts new file mode 100644 index 0000000..fbeadf7 --- /dev/null +++ b/packages/starkweb/src/react/hooks/useGetPaymasterStatus.ts @@ -0,0 +1,45 @@ +"use client"; + +import type { Config } from "../../core/createConfig.js"; +import type { Evaluate } from "../../types/utils.js"; +import { + type GetPaymasterStatusErrorType, + type GetPaymasterStatusQueryKey, + getPaymasterStatusQueryOptions, + type GetPaymasterStatusOptions, + type GetPaymasterStatusData, +} from "../../core/query/getPaymasterStatus.js"; + +import type { ConfigParameter, QueryParameter } from "../types/properties.js"; +import { type UseQueryReturnType, useQuery } from "../utils/query.js"; +import { useConfig } from "./useConfig.js"; +// Paymaster Types +export type UseGetPaymasterStatusParameters< + config extends Config = Config, + selectData = GetPaymasterStatusData +> = Evaluate< + GetPaymasterStatusOptions & + ConfigParameter & + QueryParameter< + GetPaymasterStatusData, + GetPaymasterStatusErrorType, + selectData, + GetPaymasterStatusQueryKey + > +>; + +export type UseGetPaymasterStatusReturnType = UseQueryReturnType< + GetPaymasterStatusData, + GetPaymasterStatusErrorType +>; + +export function useGetPaymasterStatus( + parameters: UseGetPaymasterStatusParameters +): UseGetPaymasterStatusReturnType { + const { query = {} } = parameters; + + const config = useConfig(parameters); + + const options = getPaymasterStatusQueryOptions(config, parameters); + return useQuery({ ...(query as any), ...options}) as UseGetPaymasterStatusReturnType; +} diff --git a/packages/starkweb/src/react/hooks/usePaymaster.ts b/packages/starkweb/src/react/hooks/usePaymaster.ts deleted file mode 100644 index f4ac4ac..0000000 --- a/packages/starkweb/src/react/hooks/usePaymaster.ts +++ /dev/null @@ -1,117 +0,0 @@ -"use client"; -import { useState, useEffect, useCallback } from "react"; -import { - fetchAccountRewards, - checkAccountCompatibility, - fetchPaymasterStatus, - getGasTokenPrices, - buildTypedData, - executeTransaction, -} from "../../core/exports/actions.js"; -import type { - GaslessStatus, - GaslessCompatibility, - PaymasterReward, -} from "../../types/paymaster.js"; -import type { ADDRESS } from "../../types/components.js"; -import { createPaymasterClient } from "../../clients/createPaymasterClient.js"; -import { http } from "../../clients/transports/http.js"; -import { mainnet } from "../../chains/definitions/mainnet.js"; -import { sepolia } from "../../chains/definitions/sepolia.js"; -import { type BuildTypedDataParameters } from "../../actions/paymaster/buildTypedData.js"; -import { type ExecuteTransactionParameters } from "../../actions/paymaster/executeTransaction.js"; - -export type UsePaymasterProps = { - network: "mainnet" | "sepolia"; - accountAddress?: ADDRESS; - clientUrl?: string; -}; - - -export type UsePaymasterReturn = { - status: GaslessStatus | null; - compatibility: GaslessCompatibility | null; - rewards: PaymasterReward[]; - loading: boolean; - error: string | null; - refetch: { - fetchPaymasterStatus: () => Promise; - checkAccountCompatibility: () => Promise; - fetchAccountRewards: () => Promise; - getGasTokenPrices: () => Promise; - buildTypedData: (params: BuildTypedDataParameters) => Promise; - executeTransaction: (params: ExecuteTransactionParameters) => Promise; - }; -}; - -export const usePaymaster = ({ network, accountAddress, clientUrl }: UsePaymasterProps): UsePaymasterReturn => { - const [status, setStatus] = useState(null); - const [compatibility, setCompatibility] = useState(null); - const [rewards, setRewards] = useState([]); - const [loading, setLoading] = useState(false); - const [error, setError] = useState(null); - - const paymasterClient = createPaymasterClient({ - chain: network === "mainnet" ? mainnet : sepolia, - transport: http(clientUrl || `http://localhost:3003/paymaster/${network}`), - }); - - const fetchData = useCallback(async () => { - setLoading(true); - setError(null); - try { - const { status, error: statusError } = await fetchPaymasterStatus(network); - setStatus(status); - setError(statusError); - - - if (accountAddress) { - const { compatibility, error: compatibilityError } = await checkAccountCompatibility(network, accountAddress); - setCompatibility(compatibility); - setError(compatibilityError); - - const { rewards, error: rewardsError } = await fetchAccountRewards(network, accountAddress); - setRewards(rewards); - setError(rewardsError); - - } - } catch (err: any) { - setError(err.message || "An error occurred while fetching data"); - } finally { - setLoading(false); - } - }, [network, accountAddress]); - - useEffect(() => { - fetchData(); - }, [fetchData]); - - const handleAsyncRequest = async (asyncFunc: () => Promise, setState: (data: any) => void) => { - setLoading(true); - setError(null); - try { - const response = await asyncFunc(); - setState(response); - } catch (err: any) { - setError(err.message || "An error occurred during request"); - } finally { - setLoading(false); - } - }; - - return { - status, - compatibility, - rewards, - loading, - error, - refetch: { - fetchPaymasterStatus: () => handleAsyncRequest(() => fetchPaymasterStatus(network), setStatus), - checkAccountCompatibility: () => handleAsyncRequest(() => checkAccountCompatibility(network, accountAddress!), setCompatibility), - fetchAccountRewards: () => handleAsyncRequest(() => fetchAccountRewards(network, accountAddress!), setRewards), - getGasTokenPrices: () => handleAsyncRequest(() => getGasTokenPrices(paymasterClient, undefined), () => {}), - buildTypedData: (params) => handleAsyncRequest(() => buildTypedData(paymasterClient, params), () => {}), - executeTransaction: (params) => handleAsyncRequest(() => executeTransaction(paymasterClient, params), () => {}), - }, - }; -}; \ No newline at end of file