Files
P2Pix-Front-End/src/blockchain/provider.ts
2025-10-11 22:07:32 -03:00

64 lines
1.6 KiB
TypeScript

import { p2PixAbi } from "./abi";
import { updateWalletStatus } from "./wallet";
import {
createPublicClient,
createWalletClient,
custom,
http,
PublicClient,
WalletClient,
} from "viem";
import { useUser } from "@/composables/useUser";
import type { NetworkConfig } from "@/model/NetworkEnum";
import type { ChainContract } from "viem";
let walletClient: WalletClient | null = null;
const getPublicClient = (): PublicClient => {
const user = useUser();
const rpcUrl = (user.network.value as NetworkConfig).rpcUrls.default.http[0];
const chain = user.network.value;
return createPublicClient({
chain,
transport: http(rpcUrl),
});
};
const getWalletClient = (): WalletClient | null => {
return walletClient;
};
const getContract = async (onlyRpcProvider = false) => {
const client = getPublicClient();
const user = useUser();
const address = (user.network.value.contracts?.p2pix as ChainContract).address;
const abi = p2PixAbi;
const wallet = onlyRpcProvider ? null : getWalletClient();
if (!client) {
throw new Error("Public client not initialized");
}
const [account] = wallet ? await wallet.getAddresses() : [null];
return { address, abi, client, wallet, account };
};
const connectProvider = async (p: any): Promise<void> => {
const user = useUser();
const chain = user.network.value;
const [account] = await p!.request({ method: "eth_requestAccounts" });
walletClient = createWalletClient({
account,
chain,
transport: custom(p),
});
await updateWalletStatus();
};
export { getPublicClient, getWalletClient, getContract, connectProvider };