@byzantine/vault-sdk
Version:
Byzantine Vault SDK for creating and managing vaults on Ethereum for restaking strategies
235 lines (234 loc) • 9.93 kB
JavaScript
"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;