UNPKG

@starknet-react/core

Version:

Starknet React is a collection of React hooks for Starknet.

1,511 lines (1,476 loc) 37.2 kB
// src/hooks/use-account.ts import { useCallback as useCallback2, useEffect as useEffect2, useState as useState2 } from "react"; // src/context/account.tsx import React, { useContext } from "react"; import { jsx } from "react/jsx-runtime"; var AccountContext = React.createContext({ account: void 0, address: void 0 }); function useStarknetAccount() { const { account, address } = useContext(AccountContext); return { account, address }; } // src/context/starknet.tsx import { mainnet, sepolia } from "@starknet-react/chains"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { createContext, useCallback, useContext as useContext2, useEffect, useRef, useState } from "react"; import { constants } from "starknet"; import { jsx as jsx2 } from "react/jsx-runtime"; var defaultQueryClient = new QueryClient(); var StarknetContext = createContext(void 0); function useStarknet() { const state = useContext2(StarknetContext); if (!state) { throw new Error( "useStarknet must be used within a StarknetProvider or StarknetConfig" ); } return state; } // src/utils.ts import { validateAndParseAddress } from "starknet"; function getAddress(address) { return validateAndParseAddress(address); } // src/hooks/use-provider.ts function useProvider() { const { provider } = useStarknet(); return { provider }; } // src/hooks/use-account.ts function useAccount() { const { connector, chain } = useStarknet(); const { provider } = useProvider(); const { address: connectedAddress } = useStarknetAccount(); const [state, setState] = useState2({ status: "disconnected" }); const refreshState = useCallback2(async () => { if (connector && provider && connectedAddress) { setState({ status: "connected", connector, chainId: chain.id, account: void 0, address: getAddress(connectedAddress), isConnected: true, isConnecting: false, isDisconnected: false, isReconnecting: false }); connector.account(provider).then( (connectedAccount) => setState((state2) => ({ ...state2, account: connectedAccount })) ); } else { return setState({ status: "disconnected", connector: void 0, chainId: void 0, account: void 0, address: void 0, isConnected: false, isConnecting: false, isDisconnected: true, isReconnecting: false }); } }, [provider, connector, chain.id, connectedAddress]); useEffect2(() => { refreshState(); }, [refreshState]); return state; } // src/hooks/use-wallet-request.ts import { useCallback as useCallback3 } from "react"; // src/query.ts import { useMutation as useMutation_, useQuery as useQuery_ } from "@tanstack/react-query"; function useQuery(args) { const base = useQuery_({ ...args, structuralSharing: false }); return { data: base.data, error: base.error, status: base.status, isSuccess: base.isSuccess, isError: base.isError, isPending: base.isPending, fetchStatus: base.fetchStatus, isFetching: base.isFetching, isLoading: base.isLoading, refetch: base.refetch }; } function useMutation(args) { const base = useMutation_(args); return { data: base.data, error: base.error, reset: base.reset, isError: base.isError, isIdle: base.isIdle, isPending: base.isPending, isSuccess: base.isSuccess, isPaused: base.isPaused, mutate: base.mutate, mutateAsync: base.mutateAsync, status: base.status, variables: base.variables }; } // src/hooks/use-wallet-request.ts function useWalletRequest(props) { const { connector } = useStarknet(); const { type, params, ...rest } = props; const { mutate, mutateAsync, ...result } = useMutation({ mutationKey: mutationKey({ type, params }), mutationFn: mutationFn({ connector }), ...rest }); const request = useCallback3( (args) => mutate(args ?? { type, params }), [mutate, type, params] ); const requestAsync = useCallback3( (args) => mutateAsync(args ?? { type, params }), [mutateAsync, type, params] ); return { request, requestAsync, ...result }; } function mutationKey({ type, params }) { return [{ entity: "walletRequest", type, params }]; } function mutationFn({ connector }) { return async ({ type, params }) => { if (!connector) throw new Error("No connector connected"); if (!type) throw new Error("Type is required"); return await connector.request({ type, params }); }; } // src/hooks/use-add-chain.ts function useAddChain(props) { const { params, ...rest } = props; const { request, requestAsync, ...result } = useWalletRequest({ type: "wallet_addStarknetChain", params, ...rest }); const addChain = (args) => { return request( args ? { params: args, type: "wallet_addStarknetChain" } : void 0 ); }; const addChainAsync = (args) => { return requestAsync( args ? { params: args, type: "wallet_addStarknetChain" } : void 0 ); }; return { addChain, addChainAsync, ...result }; } // src/hooks/use-balance.ts import { useMemo as useMemo2 } from "react"; import { BlockTag as BlockTag2, num, shortString } from "starknet"; import { formatUnits } from "viem"; // src/hooks/use-contract.ts import { useMemo } from "react"; import { Contract } from "starknet"; function useContract({ abi, address, provider: providedProvider }) { const { provider: currentProvider } = useStarknet(); const contract = useMemo(() => { const provider = providedProvider ? providedProvider : currentProvider; if (abi && address && provider) { return new Contract(abi, address, provider).typedv2( abi ); } return void 0; }, [abi, address, providedProvider, currentProvider]); return { contract }; } // src/hooks/use-invalidate-on-block.ts import { useQueryClient } from "@tanstack/react-query"; import { useEffect as useEffect3, useState as useState3 } from "react"; // src/hooks/use-block-number.ts import { BlockTag } from "starknet"; function useBlockNumber({ blockIdentifier = BlockTag.LATEST, ...props } = {}) { const { provider } = useStarknet(); return useQuery({ queryKey: queryKey({ blockIdentifier }), queryFn: queryFn({ provider, blockIdentifier }), ...props }); } function queryKey({ blockIdentifier }) { return [{ entity: "blockNumber", blockIdentifier }]; } function queryFn({ provider, blockIdentifier }) { return async () => { const block = await provider.getBlock(blockIdentifier); if (block.status !== "PENDING") { return block.block_number; } return void 0; }; } // src/hooks/use-invalidate-on-block.ts function useInvalidateOnBlock({ enabled = true, queryKey: queryKey11 }) { const queryClient = useQueryClient(); const [prevBlockNumber, setPrevBlockNumber] = useState3(); const { data: blockNumber } = useBlockNumber({ enabled }); useEffect3(() => { if (!prevBlockNumber) { return setPrevBlockNumber(blockNumber); } if (blockNumber !== prevBlockNumber) { queryClient.invalidateQueries({ queryKey: queryKey11 }, { cancelRefetch: false }); return setPrevBlockNumber(blockNumber); } }, [blockNumber, prevBlockNumber, queryKey11, queryClient]); } // src/hooks/use-network.ts function useNetwork() { const { chain, chains } = useStarknet(); return { chain, chains }; } // src/hooks/use-balance.ts var DEFAULT_FETCH_INTERVAL = 5e3; function useBalance({ token: token_, address, refetchInterval: refetchInterval_, watch = false, enabled: enabled_ = true, blockIdentifier = BlockTag2.LATEST, ...props }) { const { chain } = useNetwork(); const token = token_ ?? chain.nativeCurrency.address; const { contract } = useContract({ abi: balanceABIFragment, address: token }); const queryKey_ = useMemo2( () => queryKey2({ chain, token, address, blockIdentifier }), [chain, token, address, blockIdentifier] ); const enabled = useMemo2( () => Boolean(enabled_ && contract && address), [enabled_, contract, address] ); const refetchInterval = refetchInterval_ ?? (blockIdentifier === BlockTag2.PENDING && watch ? DEFAULT_FETCH_INTERVAL : void 0); useInvalidateOnBlock({ enabled: Boolean(enabled && watch), queryKey: queryKey_ }); return useQuery({ enabled, refetchInterval, queryKey: queryKey_, queryFn: queryFn2({ chain, contract, token, address, blockIdentifier }), ...props }); } function queryKey2({ chain, token, address, blockIdentifier }) { return [ { entity: "balance", chainId: chain?.name, token, address, blockIdentifier } ]; } function queryFn2({ chain, token, address, contract, blockIdentifier }) { return async () => { if (!address) throw new Error("address is required"); if (!contract) throw new Error("contract is required"); const options = { blockIdentifier }; const isNativeCurrency = token === chain.nativeCurrency.address; let symbol = chain.nativeCurrency.symbol; if (!isNativeCurrency) { const symbol_ = await contract.symbol(options); symbol = shortString.decodeShortString(num.toHex(symbol_)); } let decimals = chain.nativeCurrency.decimals; if (!isNativeCurrency) { const decimals_ = await contract.decimals(options); decimals = Number(decimals_); } const balanceOf = await contract.balanceOf(address, options); const formatted = formatUnits(balanceOf, decimals); return { value: balanceOf, decimals, symbol, formatted }; }; } var balanceABIFragment = [ { name: "core::integer::u256", type: "struct", members: [ { name: "low", type: "core::integer::u128" }, { name: "high", type: "core::integer::u128" } ] }, { name: "balanceOf", type: "function", inputs: [ { name: "account", type: "core::starknet::contract_address::ContractAddress" } ], outputs: [ { type: "core::integer::u256" } ], state_mutability: "view" }, { name: "symbol", type: "function", inputs: [], outputs: [ { type: "core::felt252" } ], state_mutability: "view" }, { name: "decimals", type: "function", inputs: [], outputs: [ { type: "core::integer::u8" } ], state_mutability: "view" } ]; // src/hooks/use-block.ts import { BlockTag as BlockTag3 } from "starknet"; function useBlock({ blockIdentifier = BlockTag3.LATEST, ...props } = {}) { const { provider } = useStarknet(); return useQuery({ queryKey: queryKey3({ blockIdentifier }), queryFn: queryFn3({ provider, blockIdentifier }), ...props }); } function queryKey3({ blockIdentifier }) { return [{ entity: "block", blockIdentifier }]; } function queryFn3({ provider, blockIdentifier }) { return async () => await provider.getBlock(blockIdentifier); } // src/hooks/use-call.ts import { useMemo as useMemo3 } from "react"; import { BlockTag as BlockTag4 } from "starknet"; var DEFAULT_FETCH_INTERVAL2 = 5e3; function useCall({ abi, address, functionName, args, blockIdentifier = BlockTag4.LATEST, refetchInterval: refetchInterval_, watch = false, enabled: enabled_ = true, parseArgs, parseResult, ...props }) { const { chain } = useNetwork(); const { contract } = useContract({ abi, address }); const queryKey_ = useMemo3( () => queryKey4({ chain, contract, functionName, args, blockIdentifier }), [chain, contract, functionName, args, blockIdentifier] ); const enabled = useMemo3( () => Boolean(enabled_ && contract && functionName && args), [enabled_, contract, functionName, args] ); const refetchInterval = refetchInterval_ ?? (blockIdentifier === BlockTag4.PENDING && watch ? DEFAULT_FETCH_INTERVAL2 : void 0); useInvalidateOnBlock({ enabled: Boolean(enabled && watch), queryKey: queryKey_ }); return useQuery({ queryKey: queryKey_, queryFn: queryFn4({ contract, functionName, args, blockIdentifier, parseArgs, parseResult }), refetchInterval, enabled, ...props }); } function queryKey4({ chain, contract, functionName, args, blockIdentifier }) { return [ { entity: "readContract", chainId: chain?.name, contract: contract?.address, functionName, args, blockIdentifier } ]; } function queryFn4({ contract, functionName, args, blockIdentifier, parseArgs = true, parseResult = true }) { return async () => { if (!contract) throw new Error("contract is required"); if (contract.functions[functionName] === void 0) { throw new Error(`function ${functionName} not found in contract`); } return contract.call(functionName, args, { parseRequest: parseArgs, parseResponse: parseResult, blockIdentifier }); }; } // src/hooks/use-connect.ts import { useCallback as useCallback4 } from "react"; function useConnect(props = {}) { const { connector, connectors, connect: connect_, chain } = useStarknet(); const { mutate, mutateAsync, variables, ...result } = useMutation({ mutationKey: [{ entity: "connect", chainId: chain.name }], mutationFn: connect_, ...props }); const connect = useCallback4( (args) => mutate(args ?? { connector }), [mutate, connector] ); const connectAsync = useCallback4( (args) => mutateAsync(args ?? { connector }), [mutateAsync, connector] ); return { connector, connectors, pendingConnector: variables?.connector, connect, connectAsync, variables, ...result }; } // src/hooks/use-contract-factory.ts import { useMemo as useMemo4 } from "react"; import { ContractFactory } from "starknet"; function useContractFactory({ compiledContract, classHash, abi }) { const { account } = useAccount(); const contractFactory = useMemo4(() => { if (compiledContract && account && classHash) { return new ContractFactory({ compiledContract, classHash, account, abi }); } return void 0; }, [compiledContract, classHash, account, abi]); return { contractFactory }; } // src/hooks/use-declare-contract.ts function useDeclareContract(props) { const { params, ...rest } = props; const { request, requestAsync, ...result } = useWalletRequest({ type: "wallet_addDeclareTransaction", params, ...rest }); const declare = (args) => { return request( args ? { params: args, type: "wallet_addDeclareTransaction" } : void 0 ); }; const declareAsync = (args) => { return requestAsync( args ? { params: args, type: "wallet_addDeclareTransaction" } : void 0 ); }; return { declare, declareAsync, ...result }; } // src/hooks/use-deploy-account.ts function useDeployAccount({ classHash, constructorCalldata, addressSalt, contractAddress, options, ...props }) { const { account } = useAccount(); const { mutate, mutateAsync, ...result } = useMutation({ mutationKey: mutationKey2({ account, classHash, constructorCalldata, addressSalt, contractAddress, options }), mutationFn: mutationFn2({ account, classHash, constructorCalldata, addressSalt, contractAddress, options }), ...props }); return { deployAccount: mutate, deployAccountAsync: mutateAsync, ...result }; } function mutationKey2(props) { return [{ entity: "deployAccount", ...props }]; } function mutationFn2({ account, classHash, constructorCalldata, addressSalt, contractAddress, options }) { return async () => { if (!account) throw new Error("account is required"); if (!classHash) throw new Error("classHash is required"); return await account.deployAccount( { classHash, constructorCalldata, addressSalt, contractAddress }, options ); }; } // src/hooks/use-disconnect.ts function useDisconnect(props = {}) { const { disconnect, chain } = useStarknet(); const { mutate, mutateAsync, ...result } = useMutation({ mutationKey: [{ entity: "disconnect", chainId: chain.name }], mutationFn: disconnect, ...props }); return { disconnect: mutate, disconnectAsync: mutateAsync, ...result }; } // src/hooks/use-estimate-fees.ts import { useMemo as useMemo5 } from "react"; function useEstimateFees({ calls, options, watch = false, enabled: enabled_ = true, ...props }) { const { account } = useAccount(); const queryKey_ = useMemo5( () => queryKey5({ calls, options }), [calls, options] ); const enabled = useMemo5(() => Boolean(enabled_ && calls), [enabled_, calls]); useInvalidateOnBlock({ enabled: Boolean(enabled && watch), queryKey: queryKey_ }); return useQuery({ queryKey: queryKey_, queryFn: queryFn5({ account, calls, options }), enabled, ...props }); } function queryKey5({ calls, options }) { return [ { entity: "estimateInvokeFee", calls, options } ]; } function queryFn5({ account, calls, options }) { return async () => { if (!account) throw new Error("account is required"); if (!calls || calls.length === 0) throw new Error("calls are required"); return account?.estimateInvokeFee(calls, options); }; } // src/hooks/use-explorer.ts function useExplorer() { const { explorer, chain } = useStarknet(); if (!explorer) throw Error("Explorer is undefined. Try adding it to StarknetConfig."); const explorerInstance = explorer(chain); if (!explorerInstance) throw Error("Explorer Instance is undefined"); return explorerInstance; } // src/hooks/use-nonce-for-address.ts import { BlockTag as BlockTag5 } from "starknet"; function useNonceForAddress({ address, blockIdentifier = BlockTag5.LATEST, ...props }) { const { provider } = useStarknet(); return useQuery({ queryKey: queryKey6({ address, blockIdentifier }), queryFn: queryFn6({ address, provider, blockIdentifier }), ...props }); } function queryKey6({ address, blockIdentifier }) { return [{ entity: "nonce", blockIdentifier, address }]; } function queryFn6({ provider, blockIdentifier, address }) { return async () => { const nonce = await provider.getNonceForAddress(address, blockIdentifier); return nonce; }; } // src/hooks/use-read-contract.ts function useReadContract(props) { return useCall(props); } // src/hooks/use-send-transaction.ts function useSendTransaction(props) { const { calls, ...rest } = props; const params = calls ? { calls: transformCalls(calls) } : void 0; const { request, requestAsync, ...result } = useWalletRequest({ type: "wallet_addInvokeTransaction", params, ...rest }); const send = (args) => { return request( args ? { params: { calls: transformCalls(args) }, type: "wallet_addInvokeTransaction" } : void 0 ); }; const sendAsync = (args) => { return requestAsync( args ? { params: { calls: transformCalls(args) }, type: "wallet_addInvokeTransaction" } : void 0 ); }; return { send, sendAsync, ...result }; } function transformCalls(calls) { return calls.map( (call) => ({ contract_address: call.contractAddress, entry_point: call.entrypoint, calldata: call.calldata }) ); } // src/hooks/use-sign.ts function useSignTypedData(props) { const { params, ...rest } = props; const { request, requestAsync, ...result } = useWalletRequest({ type: "wallet_signTypedData", params, ...rest }); const signTypedData = (args) => { return request( args ? { params: args, type: "wallet_signTypedData" } : void 0 ); }; const signTypedDataAsync = (args) => { return requestAsync( args ? { params: args, type: "wallet_signTypedData" } : void 0 ); }; return { signTypedData, signTypedDataAsync, ...result }; } // src/hooks/use-stark-address.ts import { useMemo as useMemo6 } from "react"; import { CallData, Provider, starknetId } from "starknet"; function useStarkAddress({ name, contract, enabled: enabled_ = true, ...props }) { const { provider } = useProvider(); const { chain } = useNetwork(); const enabled = useMemo6(() => Boolean(enabled_ && name), [enabled_, name]); return useQuery({ queryKey: queryKey7({ name, contract, network: chain.network }), queryFn: queryFn7({ name, contract, provider, network: chain.network }), enabled, ...props }); } function queryKey7({ name, contract, network }) { return [{ entity: "addressFromStarkName", name, contract, network }]; } function queryFn7({ name, contract, provider, network }) { return async () => { if (!name) throw new Error("name is required"); const namingContract = contract ?? StarknetIdNamingContract[network]; const p = new Provider(provider); const encodedDomain = encodeDomain(name); const result = await p.callContract({ contractAddress: namingContract, entrypoint: "domain_to_address", calldata: CallData.compile({ domain: encodedDomain, hint: [] }) }); if (BigInt(result[0]) === BigInt(0)) throw new Error("Address not found"); return result[0]; }; } var StarknetIdNamingContract = { sepolia: "0x154bc2e1af9260b9e66af0e9c46fc757ff893b3ff6a85718a810baf1474", mainnet: "0x6ac597f8116f886fa1c97a23fa4e08299975ecaf6b598873ca6792b9bbfb678" }; var encodeDomain = (domain) => { if (!domain) return ["0"]; const encoded = []; for (const subdomain of domain.replace(".stark", "").split(".")) encoded.push(starknetId.useEncoded(subdomain).toString(10)); return encoded; }; // src/hooks/use-stark-name.ts import { useMemo as useMemo7 } from "react"; import { Provider as Provider2 } from "starknet"; function useStarkName({ address, contract, enabled: enabled_ = true, ...props }) { const { provider } = useProvider(); const { chain } = useNetwork(); const enabled = useMemo7( () => Boolean(enabled_ && address), [enabled_, address] ); return useQuery({ queryKey: queryKey8({ address, contract, network: chain.network }), queryFn: queryFn8({ address, contract, provider, network: chain.network }), enabled, ...props }); } function queryKey8({ address, contract, network }) { return [{ entity: "starkName", address, contract, network }]; } function queryFn8({ address, contract, provider, network }) { return async () => { if (!address) throw new Error("address is required"); const namingContract = contract ?? StarknetIdNamingContract2[network]; const p = new Provider2(provider); return await p.getStarkName(address, namingContract); }; } var StarknetIdNamingContract2 = { sepolia: "0x154bc2e1af9260b9e66af0e9c46fc757ff893b3ff6a85718a810baf1474", mainnet: "0x6ac597f8116f886fa1c97a23fa4e08299975ecaf6b598873ca6792b9bbfb678" }; // src/hooks/use-stark-profile.ts import { useMemo as useMemo8 } from "react"; import { CairoCustomEnum, cairo, hash, shortString as shortString2, starknetId as starknetId3 } from "starknet"; function useStarkProfile({ address, useDefaultPfp = true, namingContract, identityContract, enabled: enabled_ = true, ...props }) { const { provider } = useProvider(); const { chain } = useNetwork(); if (!StarknetIdcontracts[chain.network]) throw new Error("Network not supported"); const { contract: multicallContract } = useContract({ abi: multicallABI, address: StarknetIdcontracts[chain.network]["multicall"] }); const enabled = useMemo8( () => Boolean(enabled_ && address), [enabled_, address] ); const { refetchInterval, ...rest } = props; return useQuery({ queryKey: queryKey9({ address, namingContract, identityContract, network: chain.network, useDefaultPfp }), queryFn: queryFn9({ address, useDefaultPfp, namingContract, network: chain.network, identityContract, multicallContract }), enabled, refetchInterval, ...rest }); } function queryKey9({ address, namingContract, identityContract, network, useDefaultPfp }) { return [ { entity: "starkprofile", address, namingContract, identityContract, network, useDefaultPfp } ]; } function queryFn9({ address, useDefaultPfp, namingContract, identityContract, network, multicallContract }) { return async () => { if (!address) throw new Error("address is required"); if (!multicallContract) throw new Error("multicallContract is required"); if (!network) throw new Error("network is required"); const contracts = StarknetIdcontracts[network]; const identity = identityContract ?? contracts["identity"]; const naming = namingContract ?? contracts["naming"]; const data = await multicallContract.call("aggregate", [ [ { execution: staticExecution(), to: hardcoded(naming), selector: hardcoded(hash.getSelectorFromName("address_to_domain")), calldata: [hardcoded(address), hardcoded(0)] }, { execution: staticExecution(), to: hardcoded(naming), selector: hardcoded(hash.getSelectorFromName("domain_to_id")), calldata: [arrayReference(0, 0)] }, { execution: staticExecution(), to: hardcoded(identity), selector: hardcoded(hash.getSelectorFromName("get_verifier_data")), calldata: [ reference(1, 0), hardcoded(shortString2.encodeShortString("twitter")), hardcoded(contracts["verifier"]), hardcoded("0") ] }, { execution: staticExecution(), to: hardcoded(identity), selector: hardcoded(hash.getSelectorFromName("get_verifier_data")), calldata: [ reference(1, 0), hardcoded(shortString2.encodeShortString("github")), hardcoded(contracts["verifier"]), hardcoded("0") ] }, { execution: staticExecution(), to: hardcoded(identity), selector: hardcoded(hash.getSelectorFromName("get_verifier_data")), calldata: [ reference(1, 0), hardcoded(shortString2.encodeShortString("discord")), hardcoded(contracts["verifier"]), hardcoded("0") ] }, { execution: staticExecution(), to: hardcoded(identity), selector: hardcoded(hash.getSelectorFromName("get_verifier_data")), calldata: [ reference(1, 0), hardcoded(shortString2.encodeShortString("proof_of_personhood")), hardcoded(contracts["verifier_pop"]), hardcoded("0") ] }, // PFP { execution: staticExecution(), to: hardcoded(identity), selector: hardcoded(hash.getSelectorFromName("get_verifier_data")), calldata: [ reference(1, 0), hardcoded(shortString2.encodeShortString("nft_pp_contract")), hardcoded(contracts["verifier_pfp"]), hardcoded("0") ] }, { execution: staticExecution(), to: hardcoded(identity), selector: hardcoded( hash.getSelectorFromName("get_extended_verifier_data") ), calldata: [ reference(1, 0), hardcoded(shortString2.encodeShortString("nft_pp_id")), hardcoded("2"), hardcoded(contracts["verifier_pfp"]), hardcoded("0") ] }, { execution: notEqual(6, 0, 0), to: reference(6, 0), selector: hardcoded(hash.getSelectorFromName("tokenURI")), calldata: [reference(7, 1), reference(7, 2)] } ] ]); if (Array.isArray(data)) { const name = data[0][0] !== BigInt(0) ? starknetId3.useDecoded(data[0].slice(1).map((val) => BigInt(val))) : void 0; const twitter = data[2][0] !== BigInt(0) ? data[2][0].toString() : void 0; const github = data[3][0] !== BigInt(0) ? data[3][0].toString() : void 0; const discord = data[4][0] !== BigInt(0) ? data[4][0].toString() : void 0; const proofOfPersonhood = data[5][0] === BigInt(1); const profile = data.length === 9 ? data[8].slice(1).map((val) => shortString2.decodeShortString(val.toString())).join("") : void 0; const profilePicture = profile ? profile.includes("base64") ? parseBase64Image(profile) : await fetchImageUrl(profile) : useDefaultPfp ? `https://starknet.id/api/identicons/${data[1][0].toString()}` : void 0; const res = { name, twitter, github, discord, proofOfPersonhood, profilePicture, profile }; return res; } throw new Error("Error while fetching data"); }; } var hardcoded = (arg) => { return new CairoCustomEnum({ Hardcoded: arg }); }; var reference = (call, pos) => { return new CairoCustomEnum({ Reference: cairo.tuple(call, pos) }); }; var arrayReference = (call, pos) => { return new CairoCustomEnum({ ArrayReference: cairo.tuple(call, pos) }); }; var staticExecution = () => { return new CairoCustomEnum({ Static: {} }); }; var notEqual = (call, pos, value) => { return new CairoCustomEnum({ IfNotEqual: cairo.tuple(call, pos, value) }); }; var parseBase64Image = (metadata) => { return JSON.parse(atob(metadata.split(",")[1].slice(0, -1))).image; }; var parseImageUrl = (url) => { return url.startsWith("ipfs://") ? url.replace("ipfs://", "https://ipfs.io/ipfs/") : url; }; var fetchImageUrl = async (url) => { try { const response = await fetch(parseImageUrl(url)); if (!response.ok) { throw new Error("Network response was not ok"); } const data = await response.json(); if (data.image) { return parseImageUrl(data.image); } return void 0; } catch (error) { console.error("There was a problem fetching the image URL:", error); return void 0; } }; var StarknetIdcontracts = { sepolia: { naming: "0x154bc2e1af9260b9e66af0e9c46fc757ff893b3ff6a85718a810baf1474", identity: "0x3697660a0981d734780731949ecb2b4a38d6a58fc41629ed611e8defda", verifier: "0x60B94fEDe525f815AE5E8377A463e121C787cCCf3a36358Aa9B18c12c4D566", verifier_pop: "0x15ae88ae054caa74090b89025c1595683f12edf7a4ed2ad0274de3e1d4a", verifier_pfp: "0x9e7bdb8dabd02ea8cfc23b1d1c5278e46490f193f87516ed5ff2dfec02", multicall: "0x07a9013697371ce40d0306b4c810c6a4db9bfda119dd9ae1e8701c8e288d734b" }, mainnet: { naming: "0x6ac597f8116f886fa1c97a23fa4e08299975ecaf6b598873ca6792b9bbfb678", identity: "0x05dbdedc203e92749e2e746e2d40a768d966bd243df04a6b712e222bc040a9af", verifier: "0x07d14dfd8ee95b41fce179170d88ba1f0d5a512e13aeb232f19cfeec0a88f8bf", verifier_pop: "0x0293eb2ba9862f762bd3036586d5755a782bd22e6f5028320f1d0405fd47bff4", verifier_pfp: "0x070aaa20ec4a46da57c932d9fd89ca5e6bb9ca3188d3df361a32306aff7d59c7", multicall: "0x034ffb8f4452df7a613a0210824d6414dbadcddce6c6e19bf4ddc9e22ce5f970" } }; var multicallABI = [ { name: "ComposableMulticallImpl", type: "impl", interface_name: "composable_multicall::IComposableMulticall" }, { name: "composable_multicall::Execution", type: "enum", variants: [ { name: "Static", type: "()" }, { name: "IfEqual", type: "(core::integer::u32, core::integer::u32, core::felt252)" }, { name: "IfNotEqual", type: "(core::integer::u32, core::integer::u32, core::felt252)" } ] }, { name: "composable_multicall::DynamicFelt", type: "enum", variants: [ { name: "Hardcoded", type: "core::felt252" }, { name: "Reference", type: "(core::integer::u32, core::integer::u32)" } ] }, { name: "composable_multicall::DynamicCalldata", type: "enum", variants: [ { name: "Hardcoded", type: "core::felt252" }, { name: "Reference", type: "(core::integer::u32, core::integer::u32)" }, { name: "ArrayReference", type: "(core::integer::u32, core::integer::u32)" } ] }, { name: "composable_multicall::DynamicCall", type: "struct", members: [ { name: "execution", type: "composable_multicall::Execution" }, { name: "to", type: "composable_multicall::DynamicFelt" }, { name: "selector", type: "composable_multicall::DynamicFelt" }, { name: "calldata", type: "core::array::Array::<composable_multicall::DynamicCalldata>" } ] }, { name: "core::array::Span::<core::felt252>", type: "struct", members: [ { name: "snapshot", type: "@core::array::Array::<core::felt252>" } ] }, { name: "composable_multicall::IComposableMulticall", type: "interface", items: [ { name: "aggregate", type: "function", inputs: [ { name: "calls", type: "core::array::Array::<composable_multicall::DynamicCall>" } ], outputs: [ { type: "core::array::Array::<core::array::Span::<core::felt252>>" } ], state_mutability: "view" } ] }, { kind: "enum", name: "composable_multicall::contract::ComposableMulticall::Event", type: "event", variants: [] } ]; // src/hooks/use-switch-chain.ts function useSwitchChain(props) { const { params, ...rest } = props; const { request, requestAsync, ...result } = useWalletRequest({ type: "wallet_switchStarknetChain", params, ...rest }); const switchChain = (args) => { return request( args ? { params: args, type: "wallet_switchStarknetChain" } : void 0 ); }; const switchChainAsync = (args) => { return requestAsync( args ? { params: args, type: "wallet_switchStarknetChain" } : void 0 ); }; return { switchChain, switchChainAsync, ...result }; } // src/hooks/use-transaction-receipt.ts import { useMemo as useMemo9 } from "react"; function useTransactionReceipt({ hash: hash2, watch, enabled: enabled_ = true, ...props }) { const { provider, chain } = useStarknet(); const queryKey_ = useMemo9(() => queryKey10({ chain, hash: hash2 }), [chain, hash2]); const enabled = useMemo9(() => Boolean(enabled_ && hash2), [enabled_, hash2]); useInvalidateOnBlock({ enabled: Boolean(enabled && watch), queryKey: queryKey_ }); return useQuery({ queryKey: queryKey_, queryFn: queryFn10({ provider, hash: hash2 }), enabled, ...props }); } function queryKey10({ chain, hash: hash2 }) { return [ { entity: "transactionReceipt", chainId: chain?.name, hash: hash2 } ]; } function queryFn10({ provider, hash: hash2 }) { return async () => { if (!hash2) throw new Error("hash is required"); return await provider.getTransactionReceipt(hash2); }; } // src/hooks/use-watch-asset.ts function useWatchAsset(props) { const { params, ...rest } = props; const { request, requestAsync, ...result } = useWalletRequest({ type: "wallet_watchAsset", params, ...rest }); const watchAsset = (args) => { return request( args ? { params: args, type: "wallet_watchAsset" } : void 0 ); }; const watchAssetAsync = (args) => { return requestAsync( args ? { params: args, type: "wallet_watchAsset" } : void 0 ); }; return { watchAsset, watchAssetAsync, ...result }; } export { useAccount, useAddChain, useBalance, useBlock, useBlockNumber, useCall, useConnect, useContract, useContractFactory, useDeclareContract, useDeployAccount, useDisconnect, useEstimateFees, useExplorer, useInvalidateOnBlock, useNetwork, useNonceForAddress, useProvider, useReadContract, useSendTransaction, useSignTypedData, useStarkAddress, useStarkName, useStarkProfile, useSwitchChain, useTransactionReceipt, useWalletRequest, useWatchAsset }; //# sourceMappingURL=index.js.map