@0xfacet/sdk
Version:
A toolkit for Facet blockchain integration.
65 lines (64 loc) • 2.56 kB
JavaScript
"use client";
import { useMutation, } from "@tanstack/react-query";
import { getConnectorClient, } from "@wagmi/core";
import { mainnet, sepolia } from "viem/chains";
import { useConfig } from "wagmi";
import { bridgeAndCall as viemBridgeAndCall } from "../viem/bridgeAndCall";
async function bridgeAndCall(config, parameters) {
const { account, chainId, connector, __mode, ethValue, bridgeAndCallConfig, ...rest } = parameters;
let client;
if (typeof account === "object" && account?.type === "local")
client = config.getClient({ chainId });
else
client = await getConnectorClient(config, {
account: account ?? undefined,
chainId,
connector,
});
if (client.chain.id !== mainnet.id && client.chain.id !== sepolia.id) {
throw new Error("Connect to mainnet or sepolia");
}
const hash = await viemBridgeAndCall(client, {
...rest,
...(account ? { account } : {}),
chain: chainId ? { id: chainId } : null,
}, ethValue, bridgeAndCallConfig);
return hash;
}
function bridgeAndCallMutationOptions(config) {
return {
mutationFn(variables) {
return bridgeAndCall(config, variables);
},
mutationKey: ["bridgeAndCall"],
};
}
/**
* React hook that provides functionality to bridge and write to a Facet contract.
*
* @template config - The wagmi Config type, defaults to ResolvedRegister["config"]
* @template context - The context type for the mutation, defaults to unknown
*
* @param {UseBridgeAndCallParameters<config, context>} parameters - Configuration options
* @param {Config | config | undefined} [parameters.config] - Optional wagmi configuration
* @param {UseMutationParameters} [parameters.mutation] - Optional react-query mutation parameters
*
* @returns {UseBridgeAndCallReturnType<config, context>} Object containing:
* - bridgeAndCall: Function to execute the contract write (non-async)
* - bridgeAndCallAsync: Function to execute the contract write (async)
* - Additional react-query mutation properties (isLoading, isSuccess, etc.)
*/
export function useBridgeAndCall(parameters = {}) {
const { mutation } = parameters;
const config = useConfig(parameters);
const mutationOptions = bridgeAndCallMutationOptions(config);
const { mutate, mutateAsync, ...result } = useMutation({
...mutation,
...mutationOptions,
});
return {
...result,
bridgeAndCall: mutate,
bridgeAndCallAsync: mutateAsync,
};
}