UNPKG

@byzantine/vault-sdk

Version:

Byzantine Vault SDK for creating and managing vaults on Ethereum for restaking strategies

235 lines (234 loc) 9.93 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ContractProvider = void 0; const ethers_1 = require("ethers"); const VaultType_1 = require("../clients/staker/VaultType"); const abis_1 = require("../constants/abis"); const contractErrorHandler_1 = require("./contractErrorHandler"); /** * Contract Provider for handling contract instances with caching */ class ContractProvider { /** * Creates a new ContractProvider instance * @param provider Ethereum provider * @param signer Optional signer for transactions */ constructor(provider, signer) { this.provider = provider; this.signer = signer; this.vaultTypeClient = new VaultType_1.VaultTypeClient(provider); this.vaultCache = new Map(); } /** * Clear the cache for a specific vault or all vaults * @param vaultAddress Optional address of the vault to clear from cache */ clearCache(vaultAddress) { if (vaultAddress) { this.vaultCache.delete(vaultAddress); } else { this.vaultCache.clear(); } } /** * Get the ERC20 Byzantine vault contract instance * @param vaultAddress The address of the ERC20 vault * @returns The ERC20 contract instance */ getByzVaultContract(vaultAddress) { return new ethers_1.ethers.Contract(vaultAddress, abis_1.SYM_ERC20_ABI, this.signer || this.provider); } /** * Get the SuperVault contract instance * @param vaultAddress The address of the SuperVault * @returns The SuperVault contract instance */ getSuperVaultContract(vaultAddress) { return new ethers_1.ethers.Contract(vaultAddress, abis_1.SUPER_ERC20_ABI, this.signer || this.provider); } /** * Get the Symbiotic Vault contract instance * @param vaultAddress The address of the Symbiotic vault or SuperVault * @returns The Vault contract instance */ async getSymVaultContract(vaultAddress) { // Check if we have cached information for this vault let cacheEntry = this.vaultCache.get(vaultAddress); if (!cacheEntry) { cacheEntry = {}; this.vaultCache.set(vaultAddress, cacheEntry); } // If we don't know if it's a SuperVault yet, check it if (cacheEntry.isSupervault === undefined) { cacheEntry.isSupervault = await this.vaultTypeClient.isSupervault(vaultAddress); } let symVaultAdd; // If we've already determined the symVault address, use it if (cacheEntry.symVaultAddress) { symVaultAdd = cacheEntry.symVaultAddress; } else { // Otherwise, retrieve it based on the vault type if (cacheEntry.isSupervault) { // For SuperVaults, we need to get the symVault from the SuperVault contract const superVaultContract = this.getSuperVaultContract(vaultAddress); const [symVaultAddress, eigenVaultAddress] = await (0, contractErrorHandler_1.callContractMethod)(superVaultContract, "getUnderlyingVaults"); const byzVaultContract = this.getByzVaultContract(symVaultAddress); symVaultAdd = await (0, contractErrorHandler_1.callContractMethod)(byzVaultContract, "symVault"); } else { // For regular Symbiotic vaults, proceed as before const byzVaultContract = this.getByzVaultContract(vaultAddress); symVaultAdd = await (0, contractErrorHandler_1.callContractMethod)(byzVaultContract, "symVault"); } // Cache the result cacheEntry.symVaultAddress = symVaultAdd; } return new ethers_1.ethers.Contract(symVaultAdd, abis_1.SYM_VAULT_ABI, this.signer || this.provider); } /** * Get the sym vault address of a Symbiotic vault * @param vaultAddress The address of the vault * @returns The sym vault address */ async getSymVaultAddress(vaultAddress) { const symVaultContract = await this.getSymVaultContract(vaultAddress); return await symVaultContract.getAddress(); } /** * Get the Delegator contract instance * @param vaultAddress The address of the vault * @returns The Delegator contract instance */ async getDelegatorContract(vaultAddress) { // Check if we have the delegator address in cache const cache = this.vaultCache.get(vaultAddress); if (cache?.delegatorAddress) { return new ethers_1.ethers.Contract(cache.delegatorAddress, abis_1.DELEGATOR_ABI, this.signer || this.provider); } // First get the symVault contract const symVaultContract = await this.getSymVaultContract(vaultAddress); // Get the delegator address from the symVault contract const delegatorAddress = await (0, contractErrorHandler_1.callContractMethod)(symVaultContract, "delegator"); // Update cache this.vaultCache.set(vaultAddress, { ...cache, delegatorAddress, }); return new ethers_1.ethers.Contract(delegatorAddress, abis_1.DELEGATOR_ABI, this.signer || this.provider); } /** * Get the delegator address for a vault * @param vaultAddress The address of the vault * @returns The delegator address */ async getDelegatorAddress(vaultAddress) { const cache = this.vaultCache.get(vaultAddress); if (cache?.delegatorAddress) { return cache.delegatorAddress; } // First get the symVault contract const symVaultContract = await this.getSymVaultContract(vaultAddress); // Get the delegator address from the symVault contract const delegatorAddress = await (0, contractErrorHandler_1.callContractMethod)(symVaultContract, "delegator"); // Update cache this.vaultCache.set(vaultAddress, { ...cache, delegatorAddress, }); return delegatorAddress; } /** * Get the Burner contract instance * @param vaultAddress The address of the vault * @returns The Burner contract instance */ async getBurnerContract(vaultAddress) { // Check if we have the burner address in cache const cache = this.vaultCache.get(vaultAddress); if (cache?.burnerAddress) { return new ethers_1.ethers.Contract(cache.burnerAddress, abis_1.BURNER_ABI, // Use appropriate ABI for burner this.signer || this.provider); } // First get the symVault contract const symVaultContract = await this.getSymVaultContract(vaultAddress); // Get the burner address from the symVault contract const burnerAddress = await (0, contractErrorHandler_1.callContractMethod)(symVaultContract, "burner"); // Update cache this.vaultCache.set(vaultAddress, { ...cache, burnerAddress, }); return new ethers_1.ethers.Contract(burnerAddress, abis_1.BURNER_ABI, // Use appropriate ABI for burner this.signer || this.provider); } /** * Get the burner address for a vault * @param vaultAddress The address of the vault * @returns The burner address */ async getBurnerAddress(vaultAddress) { const cache = this.vaultCache.get(vaultAddress); if (cache?.burnerAddress) { return cache.burnerAddress; } // First get the symVault contract const symVaultContract = await this.getSymVaultContract(vaultAddress); // Get the burner address from the symVault contract const burnerAddress = await (0, contractErrorHandler_1.callContractMethod)(symVaultContract, "burner"); // Update cache this.vaultCache.set(vaultAddress, { ...cache, burnerAddress, }); return burnerAddress; } /** * Get the Slasher contract instance * @param vaultAddress The address of the vault * @returns The Slasher contract instance */ async getSlasherContract(vaultAddress) { // Check if we have the burner address in cache const cache = this.vaultCache.get(vaultAddress); if (cache?.slasherAddress) { return new ethers_1.ethers.Contract(cache.slasherAddress, abis_1.SLASHER_ABI, // Use appropriate ABI for slasher this.signer || this.provider); } // First get the symVault contract const symVaultContract = await this.getSymVaultContract(vaultAddress); // Get the burner address from the symVault contract const slasherAddress = await (0, contractErrorHandler_1.callContractMethod)(symVaultContract, "slasher"); // Update cache this.vaultCache.set(vaultAddress, { ...cache, slasherAddress, }); return new ethers_1.ethers.Contract(slasherAddress, abis_1.SLASHER_ABI, // Use appropriate ABI for slasher this.signer || this.provider); } /** * Get the slasher address for a vault * @param vaultAddress The address of the vault * @returns The slasher address */ async getSlasherAddress(vaultAddress) { const cache = this.vaultCache.get(vaultAddress); if (cache?.slasherAddress) { return cache.slasherAddress; } // First get the symVault contract const symVaultContract = await this.getSymVaultContract(vaultAddress); // Get the burner address from the symVault contract const slasherAddress = await (0, contractErrorHandler_1.callContractMethod)(symVaultContract, "slasher"); // Update cache this.vaultCache.set(vaultAddress, { ...cache, slasherAddress, }); return slasherAddress; } } exports.ContractProvider = ContractProvider;