Get Upshift Vault Status
This guide demonstrates how to retrieve information about an Upshift vault, including vault configuration, LP token info, user balances, and withdrawal epoch information.
The Upshift vault is an ERC-4626 style tokenized vault compatible with FAssets.
Prerequisites
- Flare Hardhat Starter Kit
- Flare Network Periphery Contracts
- Understanding of FAssets
Upshift Vault Status Script
The following script retrieves and displays information about the Upshift vault:
scripts/upshift/status.ts
/**
* Upshift Tokenized Vault Status Script
*
* This script displays the current status of the vault and user balances.
*
*/
import { web3 } from "hardhat";
import { formatUnits } from "ethers";
import type { ITokenizedVaultInstance } from "../../typechain-types/contracts/upshift/ITokenizedVault";
import type { IERC20Instance } from "../../typechain-types/@openzeppelin/contracts/token/ERC20/IERC20";
const VAULT_ADDRESS = "0x24c1a47cD5e8473b64EAB2a94515a196E10C7C81";
const ITokenizedVault = artifacts.require("ITokenizedVault");
const IERC20 = artifacts.require("IERC20");
const IFAsset = artifacts.require("IFAsset");
async function printReferenceAssetInfo(vault: ITokenizedVaultInstance) {
const referenceAsset = await vault.asset();
const refAsset = await IFAsset.at(referenceAsset);
const decimals = Number(await refAsset.decimals());
const symbol = await refAsset.symbol();
console.log("\nReference Asset");
console.log(`Address: ${referenceAsset}`);
console.log(`Symbol: ${symbol}`);
console.log(`Decimals: ${decimals}`);
return { referenceAsset, refAsset, decimals, symbol };
}
async function printLPTokenInfo(vault: ITokenizedVaultInstance) {
const lpTokenAddress = await vault.lpTokenAddress();
const lpToken: IERC20Instance = await IERC20.at(lpTokenAddress);
console.log("\nLP Token");
console.log(`Address: ${lpTokenAddress}`);
return { lpTokenAddress, lpToken };
}
async function printVaultConfiguration(
vault: ITokenizedVaultInstance,
decimals: number,
symbol: string,
) {
console.log("\nVault Configuration");
const withdrawalsPaused = await vault.withdrawalsPaused();
const lagDuration = await vault.lagDuration();
const withdrawalFee = await vault.withdrawalFee();
const instantRedemptionFee = await vault.instantRedemptionFee();
const maxWithdrawalAmount = await vault.maxWithdrawalAmount();
console.log(`Withdrawals Paused: ${withdrawalsPaused}`);
console.log(`Lag Duration: ${lagDuration.toString()} seconds`);
console.log(`Withdrawal Fee: ${formatUnits(withdrawalFee.toString(), 16)}%`);
console.log(
`Instant Redemption Fee: ${formatUnits(instantRedemptionFee.toString(), 16)}%`,
);
console.log(
`Max Withdrawal Amount: ${formatUnits(maxWithdrawalAmount.toString(), decimals)} ${symbol}`,
);
}
async function printWithdrawalEpoch(vault: ITokenizedVaultInstance) {
console.log("\nWithdrawal Epoch");
const epochInfo = await vault.getWithdrawalEpoch();
console.log(
`Year: ${epochInfo[0].toString()}, Month: ${epochInfo[1].toString()}, Day: ${epochInfo[2].toString()}`,
);
console.log(`Claimable Epoch: ${epochInfo[3].toString()}`);
}
async function printUserBalances(
userAddress: string,
refAsset: IERC20Instance,
lpToken: IERC20Instance,
decimals: number,
symbol: string,
) {
console.log("\nUser Balances");
const refBalance = await refAsset.balanceOf(userAddress);
const lpBalance = await lpToken.balanceOf(userAddress);
console.log(
`${symbol} Balance: ${formatUnits(refBalance.toString(), decimals)}`,
);
console.log(
`LP Token Balance: ${formatUnits(lpBalance.toString(), decimals)}`,
);
}
async function printAllowances(
userAddress: string,
refAsset: IERC20Instance,
lpToken: IERC20Instance,
decimals: number,
symbol: string,
) {
console.log("\nAllowances");
const refAllowance = await refAsset.allowance(userAddress, VAULT_ADDRESS);
const lpAllowance = await lpToken.allowance(userAddress, VAULT_ADDRESS);
console.log(
`${symbol} Allowance to Vault: ${formatUnits(refAllowance.toString(), decimals)}`,
);
console.log(
`LP Token Allowance to Vault: ${formatUnits(lpAllowance.toString(), decimals)}`,
);
}
async function main() {
// 1. Initialize: Get user account from Hardhat network
const accounts = await web3.eth.getAccounts();
const userAddress = accounts[0];
console.log("VAULT STATUS\n");
console.log("Vault Address:", VAULT_ADDRESS);
console.log("User Address:", userAddress);
// 2. Connect to the vault contract instance
const vault: ITokenizedVaultInstance =
await ITokenizedVault.at(VAULT_ADDRESS);
// 3. Get and print reference asset info
const { refAsset, decimals, symbol } = await printReferenceAssetInfo(vault);
// 4. Get and print LP token info
const { lpToken } = await printLPTokenInfo(vault);
// 5. Print vault configuration
await printVaultConfiguration(vault, decimals, symbol);
// 6. Print withdrawal epoch info
await printWithdrawalEpoch(vault);
// 7. Print user balances
await printUserBalances(userAddress, refAsset, lpToken, decimals, symbol);
// 8. Print allowances
await printAllowances(userAddress, refAsset, lpToken, decimals, symbol);
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
Script Breakdown
The main() function executes the following steps:
- Initialize: Gets the user account and logs the vault and user addresses.
- Connect to vault: Creates an instance of the Upshift vault contract.
- Get reference asset info: Retrieves the vault's reference asset (FXRP) address, symbol, and decimals.
- Get LP token info: Retrieves the vault's LP token address, which represents user shares.
- Get vault configuration: Fetches key vault parameters.
- Get withdrawal epoch info: Retrieves the current withdrawal epoch (year, month, day) and claimable epoch.
- Get user balances: Shows the user's reference asset balance and LP token balance.
- Check allowances: Displays the user's token allowances to the vault for both the reference asset and LP token.
Running the Script
To run the Upshift vault status script:
- Ensure you have the Flare Hardhat Starter Kit set up.
- Update the
VAULT_ADDRESSconstant with the correct vault address for your network. - Run the script using Hardhat:
npx hardhat run scripts/upshift/status.ts --network coston2
Output
The script outputs the following information about the Upshift vault:
VAULT STATUS
Vault Address: 0x24c1a47cD5e8473b64EAB2a94515a196E10C7C81
User Address: 0x0d09ff7630588E05E2449aBD3dDD1D8d146bc5c2
Reference Asset
Address: 0x0b6A3645c240605887a5532109323A3E12273dc7
Symbol: FTestXRP
Decimals: 6
LP Token
Address: 0x1234567890abcdef1234567890abcdef12345678
Vault Configuration
Withdrawals Paused: false
Lag Duration: 86400 seconds
Withdrawal Fee: 0.5%
Instant Redemption Fee: 1.0%
Max Withdrawal Amount: 1000000.0 FTestXRP
Withdrawal Epoch
Year: 2025, Month: 1, Day: 15
Claimable Epoch: 14
User Balances
FTestXRP Balance: 100.0
LP Token Balance: 95.5
Allowances
FTestXRP Allowance to Vault: 0.0
LP Token Allowance to Vault: 0.0
Summary
In this guide, you learned how to retrieve status information from an Upshift vault, including vault configuration, LP token details, user balances, and withdrawal epoch information.
What's next
To continue your Upshift development journey, you can:
- Learn more about FAssets and how the system works.
- Learn how to deposit assets into an Upshift vault.
- Learn how to instantly redeem from an Upshift vault for immediate liquidity.
- Learn how to request a redemption from an Upshift vault for delayed liquidity.
- Learn how to claim assets from an Upshift vault after your requested redemption is claimable.