Stakedllc / robo-advisor-yield

The Robo-Advisor for Yield
https://staking.staked.us/ray
Other
45 stars 15 forks source link

Jare's Proposal Ten for Yield Generating Opportunity: Arbitrage Supply and Borrow on Stables (aka. Free Money #2) #12

Open staccDOTsol opened 4 years ago

staccDOTsol commented 4 years ago

Why

How often are borrow %s less than supply %s on stables?

image

image

Solution

  1. I lend 100000 DAI
  2. I borrow 75 000 USDC
  3. I repeat 2 dozen times, your principal is now $400k
  4. the difference on supply vs borrow is 14.7% APR
  5. whenever supply vs borrow interest isn't net positive, the system repays all the loans, returning the capital (and interest) originally deposited

image

Considerations

More DeFi, bigger rewards! The above table was calculated using RAY vs compound borrow USDC.

Additional Info

For fun and profit...

staccDOTsol commented 4 years ago

@dpurhar27 the best part of this one is that it's just a new checkbox for DAI/SAI RAYs

staccDOTsol commented 4 years ago

Here's some good theorizing:


C:\freeMoney>node app2s.js
{
  lendwinner: { USD: 'PersonalCapital' },
  borrowwinner: { USD: 'Robinhood' },
  lows: { USD: 1.55 },
  highs: { USD: 1.8 }
}
{
  lendwinner: { DAI: 'Nuo' },
  borrowwinner: { DAI: 'Ray' },
  lows: { DAI: 2.085 },
  highs: { DAI: 9.649 }
}
{
  lendwinner: { BTC: 'Bitfinex' },
  borrowwinner: { BTC: 'Hodlonaut' },
  lows: { BTC: 1.103 },
  highs: { BTC: 6.2 }
}
{
  lendwinner: { SAI: 'Compound' },
  borrowwinner: { SAI: 'Fulcrum' },
  lows: { SAI: 0.5012 },
  highs: { SAI: 8.084 }
}
{ lendwinner: {}, borrowwinner: {}, lows: {}, highs: {} }
{
  lendwinner: { ALGORAND: 'Ray' },
  borrowwinner: {},
  lows: { ALGORAND: 12.87 },
  highs: {}
}
{
  lendwinner: { SNX: 'Nuo' },
  borrowwinner: {},
  lows: { SNX: 23.26 },
  highs: {}
}
{
  lendwinner: { ZRX: 'Compound' },
  borrowwinner: { ZRX: 'CoinList' },
  lows: { ZRX: 0.1911 },
  highs: { ZRX: 5.11 }
}
{
  lendwinner: { WBTC: 'Nuo' },
  borrowwinner: { WBTC: 'Fulcrum' },
  lows: { WBTC: 0.5896 },
  highs: { WBTC: 0.8468 }
}

const express = require('express');
var cors = require('cors');
var app = express();
app.use(cors());
var request = require("request")
var bodyParser = require('body-parser')
app.set('view engine', 'ejs');

var request = require('request')
var winners = []
var providers = []
var lowestLend = 99999999
var borrowsArr = []
var toReturn= {}

var suppliesArr = []
var highestSupply = 0
function getRatesByCoin(search, borrow, cb) {
    request({
        headers: {
            'x-api-key': process.env.key
        },
        uri: 'https://api.loanscan.io/v1/interest-rates',
        method: 'GET'
    }, function(err, res, body) {
        //console.log(err)
        cat = JSON.parse(body)
          for (var idea in cat){
            provider = cat[idea]['provider']
            providers.push(cat[idea]['provider'])
            borrow = cat[idea]['borrow']
            supply = cat[idea]['supply']
            var lowest = 9999999;
            var winner;
            for (var s in borrow){
                if (borrow[s].symbol == search && provider != 'AaveVariable' && provider != 'AaveStable' ){
            borrowsArr.push({'provider': provider,'rate': borrow[s].rate, symbol: borrow[s].symbol})

                if (borrow[s].symbol == 'DAI' || borrow[s].symbol == 'SAI' || borrow[s].symbol == 'USDC'){
                    if (borrow[s].rate < lowest){
                        lowest = borrow[s].rate
                        if (lowestLend < lowest){
                        lowestLend = lowest 
                        }
                        winner = borrow[s].symbol
                    }
                }
                }   
            }

            var t = 0;
            var c = 0;
            var symbols = []
            for (var s in supply){
                    if (supply[s].symbol == search&& provider != 'AaveVariable' && provider != 'AaveStable'){
                                    suppliesArr.push({'provider': provider,'rate': supply[s].rate, symbol: supply[s].symbol})

                if (supply[s].symbol != winner){
                        symbols.push(supply[s].symbol)
                        t += supply[s].rate
                        if (supply[s].rate > highestSupply){
                            highestSupply = supply[s].rate
                        }

                        c++

                }
                }
            }
            var avg = t / c
            ////console.log(winner + ' wins with: ' + (lowest * 100).toPrecision(4)+ '%')
            ////console.log('average supply % APR: ' + (avg * 100).toPrecision(4)+ ' %')
            var equity = 1000
            var ratio = avg / lowest
            var supplied =  equity * ratio

            }

            var stables = ['SAI', 'DAI', 'USDC']
            var toReturn = {}
            if (borrow){

            for (var b in suppliesArr){
                if (suppliesArr[b].symbol == search){
                    if (toReturn[search] == undefined){
                        toReturn[search] = []
                    }
                    toReturn[search].push({'type': 'lend', 'rate': (suppliesArr[b].rate * 100).toPrecision(4), provider: suppliesArr[b].provider})
            }
            }

            } else {
                for (var b in borrowsArr){
                if (borrowsArr[b].symbol == search){
                    if (toReturn[search] == undefined){
                        toReturn[search] = []
                    }
                                        toReturn[search].push({'type': 'borrow', 'rate': (borrowsArr[b].rate * 100).toPrecision(4), provider: borrowsArr[b].provider})

            }
            }
            }
            lendRates = {}

    borrowRates = {}
    var winner1 = ""
    var winRate=0

    var winRate2=999999999999
    var winner2 = ""
    //console.log(suppliesArr)
    //console.log(borrowsArr)

    var lendwinner = {}
    var borrowwinner = {}
    var lows = {}
    var highs = {}
            for (var entry in toReturn){
    low = 99999999
    high = 0
        for (var e in toReturn[entry]){
                if (toReturn[entry][e].type == 'lend'){

                        if (parseFloat(toReturn[entry][e].rate) < low){
                            low = parseFloat(toReturn[entry][e].rate)
                            lendwinner[entry] = toReturn[entry][e].provider
                            lows[entry] = low
                        } else {

                        if (parseFloat(toReturn[entry][e].rate) > high){
                            high = parseFloat(toReturn[entry][e].rate)
                            borrowwinner[entry] = toReturn[entry][e].provider
                            highs[entry] = high
                        }
                        }
                    }
                    }
            }
            toReturn = {lendwinner, borrowwinner, lows, highs}
            console.log(toReturn)
            })

}

async function doIt(){
getRatesByCoin("DAI", true)
getRatesByCoin("ALGORAND")
getRatesByCoin("SAI", true)
getRatesByCoin("ZRX", true)
getRatesByCoin("BTC", true)
getRatesByCoin("WBTC", true)
getRatesByCoin("SNX", true)
getRatesByCoin("STX", true)
getRatesByCoin("USD", true)

}
doIt()