Published
Edited
Apr 29, 2019
1 fork
Importers
Insert cell
md`# Basic Attention Token (BAT) utility value exploration`
Insert cell
slide`An exploration into the potential utility value of advertising spend on Basic Attention Token`
Insert cell
viewof numberBraveUsers = slider({
min: 1000,
max: 1000000000,
step: 500000,
value: 6000000,
title: "Number of current Brave users",
description: "Increments in 1/2 million users"
})
Insert cell
viewof userGrowthRate = slider({
min: 0,
max: 10,
step: 0.1,
value: 0.9,
title: "Annual user growth rate",
description: "Increments in 10 percents"
})
Insert cell
viewof userChurnRate = slider({
min: .01,
max: 1,
step: .01,
value: .10,
title: "User churn rate per annum (percent)",
description: "percentages from 1% through 100%"
})
Insert cell
viewof percentUsersViewAds = slider({
min: 0,
max: 1,
step: 0.1,
value: 0.9,
title: "Percent of users the opt for ads",
description: "Increments in 10 percents. Brave default is opt in to ads"
})
Insert cell
viewof adSpendPerUserYear = slider({
min: 1,
max: 300,
step: 1,
value: 50,
title: "Annual ad spend per brave user",
description: "Increments in 1's"
})
Insert cell
viewof adSpendGrowth = slider({
min: 0,
max: 1,
step: 0.01,
value: 0.03,
title: "Annual growth of adspend per user",
description: "Increments in 1 percents"
})
Insert cell
md`### Users over the next 10 years`
Insert cell
users = {
let usersArr = [numberBraveUsers];
for(let i=1; i < 10; i++) {
let newUsers = usersArr[i-1] * userGrowthRate;
let lostUsers = usersArr[i-1] * userChurnRate;
usersArr[i] = Math.round(usersArr[i-1] + (newUsers - lostUsers));
}
return usersArr;
}
Insert cell
adSpend = {
let spendArr = [adSpendPerUserYear];
for(let i=1; i < 10; i++) {
let newSpend = spendArr[i-1] * adSpendGrowth;
spendArr[i] = Math.round(spendArr[i-1] + newSpend);
}
return spendArr;
}
Insert cell
md`### Total = Users X adSpend over 10 years`
Insert cell
grossValues = users.map((usersInYear, idx) => usersInYear * adSpend[idx])
Insert cell
grossProduct = grossValues.map((gross, idx) => {
if (!idx) return gross
return gross - grossValues[idx-1]
})
Insert cell
viewof velocity = slider({
min: 6,
max: 100,
step: 0.5,
value: 12,
title: "Token velocity for this use case",
description: "Increments in 0.5 up to 300. Default is choosen based on velocity for cryptocommodities cited here: https://medium.com/@cburniske/cryptoasset-valuations-ac83479ffca7"
})
Insert cell
monetaryValue = grossProduct.map(year => year / velocity)
Insert cell
viewof discountRate = slider({
min: 0,
max: 1,
step: .01,
value: 0.21,
title: "Discount Rate",
description: "The rate at which future utility needs to be discounted (higher discounts indicate more uncertainty)"
})
Insert cell
md`## Probability of failure`
Insert cell
viewof milestones = createMilestones(1)
Insert cell
viewof qualifiers = createQualifers(0)
Insert cell
viewof economicMechanic = createTokenModel(1)
Insert cell
viewof decentralization = createDecentralization(0)
Insert cell
viewof probabilityOfFailure = slider({
min: 0,
max: 1,
step: .01,
value: calculateProbabilityFailure(milestones, economicMechanic, qualifiers, decentralization),
title: "Probability of failure",
description: "The probabilty that this project in isolation will fail"
})
Insert cell
discountedMonetaryValue = getNPV(monetaryValue)
Insert cell
viewof terminalGrowthRate = slider({
min: .01,
max: 1,
step: .01,
value: 0.02,
title: "Terminal growth rate per annum (percent)",
description: "percentages from 1% through 100%"
})
Insert cell
terminalValue = {
let lastYearFees = monetaryValue.slice(-1)[0]
return lastYearFees / (discountRate - terminalGrowthRate)
}
Insert cell
discountedTerminalValue = terminalValue / ((1+discountRate)**(monetaryValue.length + 1))
Insert cell
currentUtilityValue = (discountedMonetaryValue + discountedTerminalValue) * (1 - probabilityOfFailure)
Insert cell
slide`Net Present Utility Value: ${currentUtilityValue.toLocaleString(undefined, { style: 'currency', currency: 'USD'})}`
Insert cell
md`$50 per user per year estimated ad spend

https://www.emarketer.com/Chart/US-Average-Ad-Revenue-per-User-AARPU-by-Company-2016-2020/217029`
Insert cell
md`User growth from Q4 2018 - Q1 2019 1.5M users, or 37% percent.

https://www.cryptoglobe.com/latest/2018/09/brave-browser-reaches-4-million-monthly-active-users-26000-publisher-accounts/

https://brave.com/2018-highlights/`
Insert cell
getNPV = (aggregateDollarDemandPerYear) => Math.floor(NPVaggregate(discountRate, ...aggregateDollarDemandPerYear))
Insert cell
NPVaggregate = function (rate) {
var npv = arguments[1];
for (var i = 2; i < arguments.length; i++) {
npv +=(arguments[i] / Math.pow((1 + rate), i - 1));
}
return Math.round(npv * 100) / 100;
}
Insert cell
import {createMilestones, createQualifers, createTokenModel, createDecentralization, calculateProbabilityFailure} from '@bgits/cryptonetwork-probability-of-failure'
Insert cell
import {slide, slide_style} from "@mbostock/slide"

Insert cell

slide_style
Insert cell
import {slider} from "@jashkenas/inputs"
Insert cell
import {getSymbolPrices} from '@bgits/crypto-networks-cost-of-capital-exploration'
Insert cell
batSupply = 1500000000
Insert cell
batPrice = getSymbolPrices('BAT').slice(-1)[0].close
Insert cell
batMarketCap = batPrice * batSupply
Insert cell
batExpectedReturn = currentUtilityValue / batMarketCap
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more