Skip to content

Commit

Permalink
Added multi mint and redeem to mBTC snap
Browse files Browse the repository at this point in the history
  • Loading branch information
naddison36 committed Feb 15, 2021
1 parent d44cbf4 commit 616013c
Showing 1 changed file with 132 additions and 47 deletions.
179 changes: 132 additions & 47 deletions tasks/mBTC.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
/* eslint-disable no-await-in-loop */
/* eslint-disable no-restricted-syntax */
/* eslint-disable no-console */
import { btcBassets, capFactor, contracts, getBassetFromAddress, startingCap } from "@utils/btcConstants"
import { fullScale, ONE_DAY } from "@utils/constants"
import { Bassets, btcBassets, capFactor, contracts, getBassetFromAddress, startingCap } from "@utils/btcConstants"
import { fullScale, ONE_YEAR } from "@utils/constants"
import { applyDecimals, applyRatio, BN, simpleToExactAmount } from "@utils/math"
import { Signer } from "ethers"
import { formatUnits } from "ethers/lib/utils"
import { task } from "hardhat/config"
import { task, types } from "hardhat/config"
import { InvariantValidator__factory, Masset, Masset__factory } from "types/generated"

// This is a rough approximation
const ONE_DAY_BLOCKS = 6500
interface TxSummary {
total: BN
fees: BN
Expand Down Expand Up @@ -91,17 +93,17 @@ const getBalances = async (mBTC: Masset) => {
console.log(`Others ${formatUnits(otherBalances).padEnd(20)} ${otherBalances.mul(100).div(mBtcBalance)}%`)
}

const getMints = async (mBTC: Masset, currentBlock: number): Promise<TxSummary> => {
const getMints = async (mBTC: Masset, fromBlock: number, startTime: Date): Promise<TxSummary> => {
const filter = await mBTC.filters.Minted(null, null, null, null, null)
const logs = await mBTC.queryFilter(filter, currentBlock - ONE_DAY.toNumber())
const logs = await mBTC.queryFilter(filter, fromBlock)

console.log("\nMints in last 24 hours")
console.log("Block#\t Minter\t\t\t\t\t bAsset Masset Quantity")
console.log(`\nMints since block ${fromBlock} at ${startTime.toUTCString()}`)
console.log("Block#\t Tx hash\t\t\t\t\t\t\t bAsset Masset Quantity")
let total = BN.from(0)
let count = 0
logs.forEach((log) => {
const inputBasset = getBassetFromAddress(log.args.input)
console.log(`${log.blockNumber} ${log.args.minter} ${inputBasset.symbol.padEnd(6)} ${formatUnits(log.args.mAssetQuantity)}`)
console.log(`${log.blockNumber} ${log.transactionHash} ${inputBasset.symbol.padEnd(6)} ${formatUnits(log.args.mAssetQuantity)}`)
total = total.add(log.args.mAssetQuantity)
count += 1
})
Expand All @@ -112,21 +114,47 @@ const getMints = async (mBTC: Masset, currentBlock: number): Promise<TxSummary>
}
}

const getRedemptions = async (mBTC: Masset, currentBlock: number): Promise<TxSummary> => {
const getMultiMints = async (mBTC: Masset, fromBlock: number, startTime: Date): Promise<TxSummary> => {
const filter = await mBTC.filters.MintedMulti(null, null, null, null, null)
const logs = await mBTC.queryFilter(filter, fromBlock)

console.log(`\nMulti Mints since block ${fromBlock} at ${startTime.toUTCString()}`)
console.log("Block#\t Tx hash\t\t\t\t\t\t\t bAsset Masset Quantity")
let total = BN.from(0)
let count = 0
logs.forEach((log) => {
// Ignore nMintMulti events from collectInterest and collectPlatformInterest
if (!log.args.inputs.length) return
const inputBassets: Bassets[] = log.args.inputs.map((input) => getBassetFromAddress(input))
console.log(`${log.blockNumber} ${log.transactionHash} ${formatUnits(log.args.mAssetQuantity)}`)
inputBassets.forEach((bAsset, i) => {
console.log(` ${bAsset.symbol.padEnd(6)} ${formatUnits(log.args.inputQuantities[i], bAsset.decimals).padEnd(21)}`)
})
total = total.add(log.args.mAssetQuantity)
count += 1
})
console.log(`Count ${count}, Total ${formatUnits(total)}`)
return {
total,
fees: BN.from(0),
}
}

const getRedemptions = async (mBTC: Masset, fromBlock: number, startTime: Date): Promise<TxSummary> => {
const filter = await mBTC.filters.Redeemed(null, null, null, null, null, null)
const logs = await mBTC.queryFilter(filter, currentBlock - ONE_DAY.toNumber())
const logs = await mBTC.queryFilter(filter, fromBlock)

console.log("\nRedemptions in last 24 hours")
console.log("Block#\t Redeemer\t\t\t\t bAsset Masset Quantity\tFee")
console.log(`\nRedemptions since block ${fromBlock} at ${startTime.toUTCString()}`)
console.log("Block#\t Tx hash\t\t\t\t\t\t\t bAsset Masset Quantity\tFee")
let total = BN.from(0)
let fees = BN.from(0)
let count = 0
logs.forEach((log) => {
const outputBasset = getBassetFromAddress(log.args.output)
console.log(
`${log.blockNumber} ${log.args.redeemer} ${outputBasset.symbol.padEnd(6)} ${formatUnits(log.args.mAssetQuantity)} ${formatUnits(
log.args.scaledFee,
)}`,
`${log.blockNumber} ${log.transactionHash} ${outputBasset.symbol.padEnd(6)} ${formatUnits(
log.args.mAssetQuantity,
)} ${formatUnits(log.args.scaledFee)}`,
)
total = total.add(log.args.mAssetQuantity)
fees = fees.add(log.args.scaledFee)
Expand All @@ -140,12 +168,39 @@ const getRedemptions = async (mBTC: Masset, currentBlock: number): Promise<TxSum
}
}

const getSwaps = async (mBTC: Masset, currentBlock: number): Promise<TxSummary> => {
const getMultiRedemptions = async (mBTC: Masset, fromBlock: number, startTime: Date): Promise<TxSummary> => {
const filter = await mBTC.filters.RedeemedMulti(null, null, null, null, null, null)
const logs = await mBTC.queryFilter(filter, fromBlock)

console.log(`\nMulti Redemptions since block ${fromBlock} at ${startTime.toUTCString()}`)
console.log("Block#\t Tx hash\t\t\t\t\t\t\t bAsset Masset Quantity\tFee")
let total = BN.from(0)
let fees = BN.from(0)
let count = 0
logs.forEach((log) => {
const outputBassets: Bassets[] = log.args.outputs.map((output) => getBassetFromAddress(output))
console.log(`${log.blockNumber} ${log.transactionHash} ${formatUnits(log.args.mAssetQuantity)} ${formatUnits(log.args.scaledFee)}`)
outputBassets.forEach((bAsset, i) => {
console.log(` ${bAsset.symbol.padEnd(6)} ${formatUnits(log.args.outputQuantity[i], bAsset.decimals).padEnd(21)}`)
})
total = total.add(log.args.mAssetQuantity)
fees = fees.add(log.args.scaledFee)
count += 1
})
console.log(`Count ${count}, Total ${formatUnits(total)}`)

return {
total,
fees,
}
}

const getSwaps = async (mBTC: Masset, fromBlock: number, startTime: Date): Promise<TxSummary> => {
const filter = await mBTC.filters.Swapped(null, null, null, null, null, null)
const logs = await mBTC.queryFilter(filter, currentBlock - ONE_DAY.toNumber())
const logs = await mBTC.queryFilter(filter, fromBlock)

console.log("\nSwaps in last 24 hours")
console.log("Block#\t Swapper\t\t\t\t Input Output Output Quantity\tFee")
console.log(`\nSwaps since block ${fromBlock} at ${startTime.toUTCString()}`)
console.log("Block#\t Tx hash\t\t\t\t\t\t\t Input Output Output Quantity\tFee")
// Scaled bAsset quantities
let total = BN.from(0)
let fees = BN.from(0)
Expand All @@ -154,7 +209,7 @@ const getSwaps = async (mBTC: Masset, currentBlock: number): Promise<TxSummary>
const inputBasset = getBassetFromAddress(log.args.input)
const outputBasset = getBassetFromAddress(log.args.output)
console.log(
`${log.blockNumber} ${log.args.swapper} ${inputBasset.symbol.padEnd(6)} ${outputBasset.symbol.padEnd(6)} ${formatUnits(
`${log.blockNumber} ${log.transactionHash} ${inputBasset.symbol.padEnd(6)} ${outputBasset.symbol.padEnd(6)} ${formatUnits(
log.args.outputAmount,
outputBasset.decimals,
).padEnd(21)} ${formatUnits(log.args.scaledFee)}`,
Expand All @@ -171,47 +226,77 @@ const getSwaps = async (mBTC: Masset, currentBlock: number): Promise<TxSummary>
}
}

const outputFees = (mints: TxSummary, swaps: TxSummary, redeems: TxSummary, totalSupply: BN) => {
const totalFees = redeems.fees.add(swaps.fees)
const totalTotals = mints.total.add(redeems.total).add(swaps.total)
console.log("\nFees in the last 24 hours")
const outputFees = (
mints: TxSummary,
multiMints: TxSummary,
swaps: TxSummary,
redeems: TxSummary,
multiRedeems: TxSummary,
totalSupply: BN,
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)
console.log(`\nFees since ${startTime.toUTCString()}`)
console.log(" mBTC Volume\t Fees\t\t Fee %")
console.log(
`Mints ${formatUnits(mints.total).padEnd(22)} ${formatUnits(mints.fees).padEnd(20)} ${mints.fees.mul(100).div(totalFees)}%`,
`Mints ${formatUnits(mints.total).padEnd(22)} ${formatUnits(mints.fees).padEnd(20)} ${mints.fees.mul(100).div(totalFees)}%`,
)
console.log(
`Redeem ${formatUnits(redeems.total).padEnd(22)} ${formatUnits(redeems.fees).padEnd(20)} ${redeems.fees.mul(100).div(totalFees)}%`,
`Multi Mints ${formatUnits(multiMints.total).padEnd(22)} ${formatUnits(multiMints.fees).padEnd(20)} ${multiMints.fees
.mul(100)
.div(totalFees)}%`,
)
console.log(
`Swap ${formatUnits(swaps.total).padEnd(22)} ${formatUnits(swaps.fees).padEnd(20)} ${swaps.fees.mul(100).div(totalFees)}%`,
`Redeems ${formatUnits(redeems.total).padEnd(22)} ${formatUnits(redeems.fees).padEnd(20)} ${redeems.fees
.mul(100)
.div(totalFees)}%`,
)
const totalApy = totalFees.mul(36500).div(totalSupply)
console.log(`Total ${formatUnits(totalTotals).padEnd(22)} ${formatUnits(totalFees).padEnd(20)} APY ${totalApy}%`)
console.log(
`Multi Redeems ${formatUnits(multiRedeems.total).padEnd(22)} ${formatUnits(multiRedeems.fees).padEnd(20)} ${multiRedeems.fees
.mul(100)
.div(totalFees)}%`,
)
console.log(
`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}%`)
}

task("mBTC-snap", "Get the latest data from the mBTC contracts").setAction(async (_, hre) => {
const { ethers } = hre
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)
.setAction(async (taskArgs, hre) => {
const { ethers } = hre

const [signer] = await ethers.getSigners()
const [signer] = await ethers.getSigners()

const linkedAddress = {
__$1a38b0db2bd175b310a9a3f8697d44eb75$__: contracts.mainnet.Manager,
}
const mBtc = await new Masset__factory(linkedAddress, signer).attach(contracts.mainnet.mBTC)
const linkedAddress = {
__$1a38b0db2bd175b310a9a3f8697d44eb75$__: contracts.mainnet.Manager,
}
const mBtc = await new Masset__factory(linkedAddress, signer).attach(contracts.mainnet.mBTC)

const currentBlock = await hre.ethers.provider.getBlockNumber()
console.log(`Latest block ${currentBlock}, ${new Date().toUTCString()}`)
const currentBlock = await hre.ethers.provider.getBlockNumber()
const currentTime = new Date()
const { fromBlock } = taskArgs
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)
await getSwapRates(mBtc)
await getBasket(mBtc, signer)
await getBalances(mBtc)
await getSwapRates(mBtc)

const mintSummary = await getMints(mBtc, currentBlock)
const redeemSummary = await getRedemptions(mBtc, currentBlock)
const swapSummary = await getSwaps(mBtc, currentBlock)
const mintSummary = await getMints(mBtc, fromBlock, startTime)
const mintMultiSummary = await getMultiMints(mBtc, fromBlock, startTime)
const redeemSummary = await getRedemptions(mBtc, fromBlock, startTime)
const redeemMultiSummary = await getMultiRedemptions(mBtc, fromBlock, startTime)
const swapSummary = await getSwaps(mBtc, fromBlock, startTime)

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

module.exports = {}

0 comments on commit 616013c

Please sign in to comment.