This guide provides developers with the information needed to integrate with the Vaultinator Facet, the core component of the Vaultinator Protocol. It covers the basic interaction patterns, contract interfaces, and best practices for building applications that leverage vault functionality.
Interface Overview
The Vaultinator Facet exposes a comprehensive set of functions through the IVaultinatorFacet interface:
// Create a vault
const vaultId = await createVault(signer, "My Personal Vault");
// Get vault information
const vaultInfo = await vaultinator.getVault(vaultId);
console.log(`Vault Name: ${vaultInfo.name}`);
console.log(`Vault Owner: ${vaultInfo.owner}`);
console.log(`Vault Type: ${vaultInfo.vaultType === 0 ? "Personal" : vaultInfo.vaultType === 1 ? "Shared" : "Institutional"}`);
// Get user's vaults
const userVaults = await vaultinator.getUserVaults(await signer.getAddress());
console.log(`User has ${userVaults.length} vaults`);
// Deposit assets to a vault
const daiToken = "0x6B175474E89094C44Da98b954EedeAC495271d0F"; // DAI address
const depositAmount = ethers.utils.parseEther("100"); // 100 DAI
await depositToVault(signer, vaultId, daiToken, depositAmount);
// Check vault balance
const balance = await vaultinator.getVaultBalance(vaultId, daiToken);
console.log(`Vault DAI Balance: ${ethers.utils.formatEther(balance)}`);
// Withdraw assets from a vault
const withdrawAmount = ethers.utils.parseEther("50"); // 50 DAI
await vaultinator.withdraw(vaultId, daiToken, withdrawAmount);
// Transfer assets between vaults
const otherVaultId = 2; // Another vault ID
await vaultinator.transferBetweenVaults(vaultId, otherVaultId, daiToken, ethers.utils.parseEther("25"));
// Define roles
const MANAGER_ROLE = ethers.utils.keccak256(ethers.utils.toUtf8Bytes("MANAGER_ROLE"));
const DEPOSITOR_ROLE = ethers.utils.keccak256(ethers.utils.toUtf8Bytes("DEPOSITOR_ROLE"));
// Grant access to another user
const otherUser = "0x..."; // Address of another user
await vaultinator.grantAccess(vaultId, otherUser, MANAGER_ROLE);
// Check if user has role
const hasRole = await vaultinator.hasRole(vaultId, otherUser, MANAGER_ROLE);
console.log(`User has MANAGER_ROLE: ${hasRole}`);
// Revoke access
await vaultinator.revokeAccess(vaultId, otherUser, MANAGER_ROLE);
// Deploy vault assets to yield protocol via Yieldinator
const aaveAdapter = "0x..."; // Aave adapter address
// First, get the Yieldinator facet through the Diamond
const yieldinatorABI = require("./abis/IYieldinatorFacet.json");
const yieldinator = new ethers.Contract(vaultinatorAddress, yieldinatorABI, signer);
// Deploy assets from vault to yield protocol
await vaultinator.deployToYieldProtocol(vaultId, daiToken, depositAmount, aaveAdapter);
// Check deployed balance
const deployedBalance = await yieldinator.getUserBalance(await signer.getAddress(), aaveAdapter, daiToken);
console.log(`Deployed Balance: ${ethers.utils.formatEther(deployedBalance)}`);
// Create collateralized position via Collatinator
const skyMoneyAdapter = "0x..."; // Sky.money (formerly MakerDAO) adapter address
const ethToken = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"; // WETH address
// Get the Collatinator facet through the Diamond
const collatinatorABI = require("./abis/ICollatinatorFacet.json");
const collatinator = new ethers.Contract(vaultinatorAddress, collatinatorABI, signer);
// Create position from vault
const positionId = await vaultinator.createCollateralizedPosition(
vaultId,
ethToken,
ethers.utils.parseEther("10"), // 10 ETH collateral
daiToken,
ethers.utils.parseEther("15000"), // 15,000 DAI debt
skyMoneyAdapter
);
// Check position details
const position = await collatinator.getPosition(positionId);
console.log(`Health Factor: ${ethers.utils.formatUnits(position.healthFactor, 2)}`);
// Set up event listener for vault creation
vaultinator.on("VaultCreated", (vaultId, owner, name, vaultType, event) => {
console.log(`New vault created: ${vaultId}`);
console.log(`Owner: ${owner}`);
console.log(`Name: ${name}`);
console.log(`Type: ${vaultType === 0 ? "Personal" : vaultType === 1 ? "Shared" : "Institutional"}`);
// Update UI or database
});
// Set up event listener for deposits
vaultinator.on("Deposited", (vaultId, asset, amount, depositor, event) => {
console.log(`Deposit to vault ${vaultId}: ${ethers.utils.formatEther(amount)} tokens`);
// Update UI or database
});
try {
await vaultinator.withdraw(vaultId, daiToken, withdrawAmount);
} catch (error) {
// Extract error message
const errorMessage = error.message;
if (errorMessage.includes("Insufficient balance")) {
console.error("Vault doesn't have enough balance to withdraw this amount");
} else if (errorMessage.includes("Not authorized")) {
console.error("You don't have permission to withdraw from this vault");
} else {
console.error("Unknown error:", errorMessage);
}
}
// Create a custom vault strategy
const strategyAddress = "0x..."; // Address of your strategy contract
// Set vault strategy
await vaultinator.setVaultStrategy(vaultId, strategyAddress);
// Update vault configuration for the strategy
const configData = ethers.utils.defaultAbiCoder.encode(
["uint256", "uint256", "bool"],
[
ethers.utils.parseEther("0.5"), // 50% allocation
86400, // 1 day rebalance period
true // Auto-compound enabled
]
);
await vaultinator.updateVaultConfig(vaultId, configData);
// For vaults requiring multiple signatures, use a multi-sig wallet
const multiSigWallet = new ethers.Contract(multiSigAddress, MultiSigABI, signer);
// Create transaction data for vault operation
const data = vaultinator.interface.encodeFunctionData("withdraw", [
vaultId,
daiToken,
withdrawAmount
]);
// Submit transaction to multi-sig
await multiSigWallet.submitTransaction(vaultinatorAddress, 0, data);
// Other signers can confirm the transaction
await multiSigWallet.confirmTransaction(transactionId);
// Once enough confirmations are received, the transaction can be executed
await multiSigWallet.executeTransaction(transactionId);
// Get all vault assets
const assets = await vaultinator.getVaultAssets(vaultId);
// Calculate total value
let totalValueUSD = ethers.BigNumber.from(0);
for (const asset of assets) {
// Get asset price from oracle
const assetPrice = await priceOracle.getPrice(asset.token);
// Calculate value
const assetValue = asset.balance.mul(assetPrice).div(ethers.utils.parseEther("1"));
totalValueUSD = totalValueUSD.add(assetValue);
console.log(`Asset: ${asset.token}`);
console.log(`Balance: ${ethers.utils.formatUnits(asset.balance, asset.decimals)}`);
console.log(`Value (USD): ${ethers.utils.formatUnits(assetValue, 18)}`);
}
console.log(`Total Vault Value (USD): ${ethers.utils.formatUnits(totalValueUSD, 18)}`);