Nutbox更新:增加计算APY

apy.jpg

APY是一项重要的投资回报的数据,如果很高就会有足够的吸引力,甚至于很多人根本就不会去查考项目本身,比如之前的YAM、YFII。

Nutbox已经稳定地运行了十多天了,资金池也慢慢地涨起来,计算和呈现APY还是很有必要的。

要计算年化主要是要实时获取Pnut 和 Steem 的价格,年化大约等于Pnut的年产量除以代理SP的总价值,以公式表示:APY = 28800 * rewardsPerBlock * 365 * pnutPrice * tronPrice / (totalDepositedSP * steemPrice) 如果要顺利地计算出来,有两个重要的数据pnutPrice、steemPrice。

async getSteemPrice(){
    let res = await this.axios.request({
        method:"get",
        url:'https://api.coingecko.com/api/v3/coins/steem',
        headers: {
        "accept": "application/json",
        }
    })
    // console.log(111,res.data.tickers)
    let arr = res.data.tickers
    for(let i = 0; i < arr.length; i++){
        if(arr[i].target === "USDT"){
        return arr[i].last
        }
    }
    },
async getTronPrice(){
    let res = await this.axios.request({
        method:"get",
        url:'https://api.coingecko.com/api/v3/coins/tron',
        headers: {
        "accept": "application/json",
        }
    })
    // console.log(111,res.data.tickers)
    let arr = res.data.tickers
    for(let i = 0; i < arr.length; i++){
        if(arr[i].target === "USDT"){
        return arr[i].last
        }
    }
    },
async getPnutPrice(){
    let res = await this.axios.request({
        method:"get",
        url:'https://api.justswap.io/v2/allpairs',
        headers: {
        "accept": "application/json",
        },
        params: {
        page_size : 1500,
        page_num: 1
        }
    })
    let price = res.data.data["0_TPZddNpQJHu8UtKPY1PYDBv2J5p5QpJ6XW"].price
    res = null
    return price
    },
async calPnutApy(){
    let steemPrice = await this.getSteemPrice()
    let tronPrice = await this.getTronPrice()
    let pnutPrice = await this.getPnutPrice()
    let apy = 28800 * this.rewardsPerBlock * 365 * pnutPrice * tronPrice / (this.totalDepositedSP2 * steemPrice)
    this.apy = (apy * 100).toFixed(3)
    localStorage.setItem('apy', this.apy)
    },

pnutPrice、steemPrice要从两个不同的API中获取,特别是justswap中获取数据,速度很慢,目测要十几秒!那怎么解决这个速度的问题呢?

想到的办法是初始化年化数据:将本次的数据保存下来,下次访问时可以优先展示,而实时的数据可以在后台慢慢查,查到了再显示并且保存下来!

//初始化年化收益率
if(localStorage.getItem("apy") == null){
   this.apy = 52.786
}else{
  this.apy = localStorage.getItem("apy")
}

用localStorage来实现,比较简单。这有点类似缓存的意思:先从缓存中读数据,然后再慢慢更新缓存。这样就可以有效地显示和更新年化数据啰!