UNPKG

@opendatalabs/vana-sdk

Version:

A TypeScript library for interacting with Vana Network smart contracts.

100 lines 2.8 kB
import { getContract } from "viem"; import { getAbi } from "../generated/abi/index.js"; import { getContractAddress, CONTRACT_ADDRESSES } from "../generated/addresses.js"; import { createClient } from "../core/client.js"; import { vanaMainnet } from "../config/chains.js"; const contractCache = /* @__PURE__ */ new Map(); const contractCacheForTesting = contractCache; function createCacheKey(contract, chainId) { return `${contract}:${chainId}`; } function getContractController(contract, client = createClient()) { const chainId = client.chain?.id ?? vanaMainnet.id; const cacheKey = createCacheKey(contract, chainId); let controller = contractCache.get(cacheKey); if (!controller) { controller = getContract({ address: getContractAddress(chainId, contract), abi: getAbi(contract), client }); contractCache.set(cacheKey, controller); } return controller; } function getContractInfo(contract, chainId = vanaMainnet.id) { return { address: getContractAddress(chainId, contract), abi: getAbi(contract) }; } class ContractFactory { client; chainId; constructor(client) { this.client = client; try { this.chainId = client.chain?.id ?? vanaMainnet.id; } catch { this.chainId = vanaMainnet.id; } } /** * Creates a typed contract instance * * @param contract - Contract name (use const assertion for full typing) * @returns Fully typed contract instance */ create(contract) { return getContractController(contract, this.client); } /** * Gets contract information without creating an instance * * @param contract - Contract name * @returns Contract information with typed ABI */ getInfo(contract) { return getContractInfo(contract, this.chainId); } /** * Lists all available contracts for the current chain * * @returns Array of contract names available on this chain */ getAvailableContracts() { const chainAddresses = CONTRACT_ADDRESSES[this.chainId]; if (!chainAddresses) return []; return Object.keys(chainAddresses); } } function clearContractCache(contract, chainId) { if (contract && chainId) { const cacheKey = createCacheKey(contract, chainId); contractCache.delete(cacheKey); } else if (contract) { for (const key of contractCache.keys()) { if (key.startsWith(`${contract}:`)) { contractCache.delete(key); } } } else if (chainId) { for (const key of contractCache.keys()) { if (key.endsWith(`:${chainId}`)) { contractCache.delete(key); } } } else { contractCache.clear(); } } export { ContractFactory, clearContractCache, contractCacheForTesting, getContractController, getContractInfo }; //# sourceMappingURL=contractController.js.map