import { QUARRY_ADDRESSES, QuarrySDK } from "@quarryprotocol/quarry-sdk"; import { useNativeAccount } from "@saberhq/sail"; import { SignerWallet, SolanaProvider } from "@saberhq/solana-contrib"; import type { Token, TokenAmount } from "@saberhq/token-utils"; import { useConnectedWallet, useConnectionContext } from "@saberhq/use-solana"; import type { PublicKey } from "@solana/web3.js"; import { Keypair } from "@solana/web3.js"; import { useMemo } from "react"; import { createContainer } from "unstated-next"; const useQuarrySDKInternal = ({ tokenMap = {}, }: { tokenMap?: Record; } = {}): { tokenMap: Record; sdk: QuarrySDK; sdkMut: QuarrySDK | null; owner: PublicKey | null; nativeBalance?: TokenAmount; } => { const { connection, sendConnection } = useConnectionContext(); const wallet = useConnectedWallet(); const { quarry: sdk } = useMemo(() => { const provider = SolanaProvider.load({ connection, sendConnection, wallet: new SignerWallet(Keypair.generate()), opts: { commitment: "recent", }, }); return { quarry: QuarrySDK.load({ provider, addresses: { ...QUARRY_ADDRESSES, }, }), }; }, [connection, sendConnection]); const { quarryMut: sdkMut } = useMemo(() => { if (!wallet) { return { quarryMut: null }; } const provider = SolanaProvider.load({ connection, sendConnection, wallet, opts: { commitment: "recent", }, }); return { quarryMut: QuarrySDK.load({ provider, addresses: { ...QUARRY_ADDRESSES, }, }), }; }, [connection, sendConnection, wallet]); const owner = useMemo( () => sdkMut?.provider.wallet.publicKey ?? null, [sdkMut?.provider.wallet.publicKey] ); const { nativeBalance } = useNativeAccount(); return { owner, nativeBalance, sdk, sdkMut: sdkMut ?? null, tokenMap, }; }; export const { useContainer: useQuarrySDK, Provider: QuarrySDKProvider } = createContainer(useQuarrySDKInternal);