mirror of
https://github.com/hanzonet/explore.git
synced 2026-10-30 18:16:57 +00:00
81 lines
2.8 KiB
TypeScript
81 lines
2.8 KiB
TypeScript
import type { TypedData } from 'abitype';
|
|
import { useCallback } from 'react';
|
|
import type { Account, SignTypedDataParameters } from 'viem';
|
|
import { useAccount, useSendTransaction, useSwitchChain, useSignMessage, useSignTypedData } from 'wagmi';
|
|
|
|
import config from 'configs/app';
|
|
import useRewardsActivity from 'lib/hooks/useRewardsActivity';
|
|
import * as mixpanel from 'lib/mixpanel/index';
|
|
|
|
type SendTransactionArgs = {
|
|
chainId?: number;
|
|
mode?: 'prepared';
|
|
to: `0x${ string }` | null;
|
|
};
|
|
|
|
export type SignTypedDataArgs<
|
|
TTypedData extends
|
|
| TypedData
|
|
| {
|
|
[key: string]: unknown;
|
|
} = TypedData,
|
|
TPrimaryType extends string = string,
|
|
> = SignTypedDataParameters<TTypedData, TPrimaryType, Account>;
|
|
|
|
export default function useMarketplaceWallet(appId: string) {
|
|
const { address, chainId } = useAccount();
|
|
const { sendTransactionAsync } = useSendTransaction();
|
|
const { signMessageAsync } = useSignMessage();
|
|
const { signTypedDataAsync } = useSignTypedData();
|
|
const { switchChainAsync } = useSwitchChain();
|
|
const { trackTransaction, trackTransactionConfirm } = useRewardsActivity();
|
|
|
|
const logEvent = useCallback((event: mixpanel.EventPayload<mixpanel.EventTypes.WALLET_ACTION>['Action']) => {
|
|
mixpanel.logEvent(
|
|
mixpanel.EventTypes.WALLET_ACTION,
|
|
{ Action: event, Address: address, AppId: appId },
|
|
);
|
|
}, [ address, appId ]);
|
|
|
|
const switchNetwork = useCallback(async() => {
|
|
if (Number(config.chain.id) !== chainId) {
|
|
await switchChainAsync?.({ chainId: Number(config.chain.id) });
|
|
}
|
|
}, [ chainId, switchChainAsync ]);
|
|
|
|
const sendTransaction = useCallback(async(transaction: SendTransactionArgs) => {
|
|
await switchNetwork();
|
|
const activityResponse = await trackTransaction(address ?? '', transaction.to ?? '');
|
|
const tx = await sendTransactionAsync(transaction);
|
|
if (activityResponse?.token) {
|
|
await trackTransactionConfirm(tx, activityResponse.token);
|
|
}
|
|
logEvent('Send Transaction');
|
|
return tx;
|
|
}, [ sendTransactionAsync, switchNetwork, logEvent, trackTransaction, trackTransactionConfirm, address ]);
|
|
|
|
const signMessage = useCallback(async(message: string) => {
|
|
await switchNetwork();
|
|
const signature = await signMessageAsync({ message });
|
|
logEvent('Sign Message');
|
|
return signature;
|
|
}, [ signMessageAsync, switchNetwork, logEvent ]);
|
|
|
|
const signTypedData = useCallback(async(typedData: SignTypedDataArgs) => {
|
|
await switchNetwork();
|
|
if (typedData.domain) {
|
|
typedData.domain.chainId = Number(typedData.domain.chainId);
|
|
}
|
|
const signature = await signTypedDataAsync(typedData);
|
|
logEvent('Sign Typed Data');
|
|
return signature;
|
|
}, [ signTypedDataAsync, switchNetwork, logEvent ]);
|
|
|
|
return {
|
|
address,
|
|
sendTransaction,
|
|
signMessage,
|
|
signTypedData,
|
|
};
|
|
}
|