Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enhancements to mBTC snap reporting #130

Merged
merged 1 commit into from
Feb 24, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 30 additions & 12 deletions tasks/mBTC.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@ interface TxSummary {
fees: BN
}

interface Balances {
total: BN
save: BN
earn: BN
}

const getTvlCap = async (signer: Signer): Promise<BN> => {
const validator = await new InvariantValidator__factory(signer).attach(contracts.mainnet.InvariantValidator)
const tvlStartTime = await validator.startTime()
Expand Down Expand Up @@ -45,8 +51,9 @@ const getBasket = async (mBtc: Masset, signer: Signer) => {
const surplus = await mBtc.surplus()
console.log(`Surplus ${formatUnits(surplus)}`)
const tvlCapPercentage = totalBassets.mul(100).div(tvlCap)
console.log(`Total ${formatUnits(totalBassets).padStart(21)}`)
console.log(`TVL cap ${formatUnits(tvlCap).padStart(21)} ${tvlCapPercentage}%`)
console.log(`Total BTC ${formatUnits(totalBassets)}`)
console.log(`mBTC ${formatUnits(await mBtc.totalSupply())}`)
console.log(`TVL cap ${formatUnits(tvlCap).padStart(21)} ${tvlCapPercentage}%`)
}

const getSwapRates = async (mBTC: Masset) => {
Expand Down Expand Up @@ -77,7 +84,7 @@ const getSwapRates = async (mBTC: Masset) => {
}
}

const getBalances = async (mBTC: Masset) => {
const getBalances = async (mBTC: Masset): Promise<Balances> => {
const mBtcBalance = await mBTC.totalSupply()
const savingBalance = await mBTC.balanceOf(contracts.mainnet.imBTC)
const sushiPoolBalance = await mBTC.balanceOf(contracts.mainnet.sushiPool)
Expand All @@ -91,6 +98,12 @@ const getBalances = async (mBTC: Masset) => {
`mStable Fund Manager ${formatUnits(mStableFundManagerBalance).padEnd(20)} ${mStableFundManagerBalance.mul(100).div(mBtcBalance)}%`,
)
console.log(`Others ${formatUnits(otherBalances).padEnd(20)} ${otherBalances.mul(100).div(mBtcBalance)}%`)

return {
total: mBtcBalance,
save: savingBalance,
earn: sushiPoolBalance,
}
}

const getMints = async (mBTC: Masset, fromBlock: number, startTime: Date): Promise<TxSummary> => {
Expand Down Expand Up @@ -232,12 +245,13 @@ const outputFees = (
swaps: TxSummary,
redeems: TxSummary,
multiRedeems: TxSummary,
totalSupply: BN,
balances: Balances,
startTime: Date,
currentTime: Date,
) => {
const totalFees = redeems.fees.add(multiRedeems.fees).add(swaps.fees)
const totalTotals = mints.total.add(multiMints.total).add(redeems.total).add(multiRedeems.total).add(swaps.total)
const totalTransactions = mints.total.add(multiMints.total).add(redeems.total).add(multiRedeems.total).add(swaps.total)
const totalFeeTransactions = redeems.total.add(multiRedeems.total).add(swaps.total)
console.log(`\nFees since ${startTime.toUTCString()}`)
console.log(" mBTC Volume\t Fees\t\t Fee %")
console.log(
Expand All @@ -262,12 +276,17 @@ const outputFees = (
`Swaps ${formatUnits(swaps.total).padEnd(22)} ${formatUnits(swaps.fees).padEnd(20)} ${swaps.fees.mul(100).div(totalFees)}%`,
)
const periodSeconds = BN.from(currentTime.valueOf() - startTime.valueOf()).div(1000)
const totalApy = totalFees.mul(100).mul(ONE_YEAR).div(totalSupply).div(periodSeconds)
console.log(`Total ${formatUnits(totalTotals).padEnd(22)} ${formatUnits(totalFees).padEnd(20)} APY ${totalApy}%`)
const liquidityUtilization = totalFeeTransactions.mul(100).div(balances.total)
const totalApy = totalFees.mul(100).mul(ONE_YEAR).div(balances.save).div(periodSeconds)
console.log(`Total Txs ${formatUnits(totalTransactions).padEnd(22)}`)
console.log(`Savings ${formatUnits(balances.save).padEnd(22)} ${formatUnits(totalFees).padEnd(20)} APY ${totalApy}%`)
console.log(
`${liquidityUtilization}% liquidity utilization (${formatUnits(totalFeeTransactions)} of ${formatUnits(balances.total)} mBTC)`,
)
}

task("mBTC-snap", "Get the latest data from the mBTC contracts")
.addOptionalParam("fromBlock", "Block to query transaction events from. (default: deployment block)", 11840520, types.int)
.addOptionalParam("from", "Block to query transaction events from. (default: deployment block)", 11840520, types.int)
.setAction(async (taskArgs, hre) => {
const { ethers } = hre

Expand All @@ -280,13 +299,13 @@ task("mBTC-snap", "Get the latest data from the mBTC contracts")

const currentBlock = await hre.ethers.provider.getBlockNumber()
const currentTime = new Date()
const { fromBlock } = taskArgs
const fromBlock = taskArgs.from
console.log(`Latest block ${currentBlock}, ${currentTime.toUTCString()}`)
const startBlock = await hre.ethers.provider.getBlock(fromBlock)
const startTime = new Date(startBlock.timestamp * 1000)

await getBasket(mBtc, signer)
await getBalances(mBtc)
const balances = await getBalances(mBtc)
await getSwapRates(mBtc)

const mintSummary = await getMints(mBtc, fromBlock, startTime)
Expand All @@ -295,8 +314,7 @@ task("mBTC-snap", "Get the latest data from the mBTC contracts")
const redeemMultiSummary = await getMultiRedemptions(mBtc, fromBlock, startTime)
const swapSummary = await getSwaps(mBtc, fromBlock, startTime)

const totalSupply = await mBtc.totalSupply()
outputFees(mintSummary, mintMultiSummary, swapSummary, redeemSummary, redeemMultiSummary, totalSupply, startTime, currentTime)
outputFees(mintSummary, mintMultiSummary, swapSummary, redeemSummary, redeemMultiSummary, balances, startTime, currentTime)
})

module.exports = {}