@opendatalabs/vana-sdk
Version:
A TypeScript library for interacting with Vana Network smart contracts.
100 lines • 2.8 kB
JavaScript
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