Public
Edited
Jan 30, 2023
2 forks
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
dailyNetNewPledge = projectedDays.map((x,idx) => {
return 0;
})
Insert cell
dailyNetRenewPledge = projectedDays.map((x,idx) => {
return 0;
})
Insert cell
dailyNetNewDealPledge = projectedDays.map((x,idx) => {
return 0;
})
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
totalPowerToCommit = totalPowerToCommitInput * 1.126 * 1e15
Insert cell
dailySealingCapacity = dailySealingCapacityInput * 1.1 * 1e12
Insert cell
Insert cell
daysForSealing = totalPowerToCommit / dailySealingCapacity
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
dailyMinerQAPCommitted = Array.from({length:daysForSealing},(_, i)=>(i))
Insert cell
dailyMinerRBPCommitted = Array.from({length:daysForSealing},(_, i)=>(i))
Insert cell
Insert cell
Insert cell
calculator = () =>{
let result = {
test: [] ,
epochInDay : epochInDay,
epochNetRBP : epochNetRBP,
epochNetQAP : epochNetQAP,
epochNetBasePower : epochNetBasePower,
epochNetStoragePledge : epochNetStoragePledge,
epochNetStorageConsensusPledge : epochNetStorageConsensusPledge,
epochNetInitialPledge : epochNetInitialPledge,
epochNetDealPledge : epochNetDealPledge,
epochCumSumRealized : Number(epochCumSumRealized),
epochNetNewReward : epochNetNewReward,
epochNetMinedFIL : Number(epochNetMinedFIL),
epochNetLockedFIL : Number(epochNetLockedFIL),
epochNetRewardLocked : Number(epochNetRewardLocked),
epochNetBurntFIL : Number(epochNetBurntFIL),
epochNetVestedFIL : Number(epochNetVestedFIL),
epochNetCircFIL : Number(epochNetCircFIL),
epochNetReserveDisbursed : Number(epochNetReserveDisbursed),
epochNetRewardFilter : new abFilter(epochNetRewardPosition, epochNetRewardVelocity),
epochNetPowerFilter : new abFilter(epochNetQAPowerPosition, epochNetQAPowerVelocity),
epochMinerRBP : epochMinerRBP,
epochMinerQAP : epochMinerQAP,
epochMinerStoragePledge : Number(epochMinerStoragePledge),
epochMinerConsensusPledge : Number(epochMinerConsensusPledge),
epochMinerInitialPledge : epochMinerInitialPledge,
epochMinerDealPledge : epochMinerDealPledge,
dailyMinerTotalPledge : Array.from({length:projectedDays.length},()=>(0)),
dailyMinerCumSumRewards : dailyMinerCumSumRewards.map(x=>x),
dailyMinerTotalCost : dailyMinerTotalCost.map(x=>x),
dailyMinerReleasedRewards : dailyMinerReleasedRewards.map(x=>x),
dailyMinerLockedRewards : dailyMinerLockedRewards.map(x=>x),
dailyMinerInvestment : dailyMinerInvestment.map(x=>x),
dailyMinerProfit : dailyMinerProfit.map(x=>x),
projectedVerifiedStoragePercent : projectedVerifiedStoragePercent,
dailyNetBurn : dailyNetBurn.map(x=>x),
dailyMinerDeals: dailyMinerDeals.map(x=>x),
cumMinerLockedReward: 0,
cumMinerReleasedReward: 0,
initial_pledge_lock_target: Number(initial_pledge_lock_target),
testmove: [],
dailyNetNewPledge : dailyNetNewPledge.map(x=>x),
dailyNetRenewPledge : dailyNetRenewPledge.map(x=>x),
dailyNetNewDealPledge: dailyNetNewDealPledge.map(x => x),
dailyMinerRBPCommitted: dailyMinerRBPCommitted.map(x => x),
dailyMinerQAPCommitted: dailyMinerQAPCommitted.map(x => x),
dailyMinerLockedPledge: dailyMinerLockedPledge.map(x=>x),
dailyMinerReleasedPledge: dailyMinerReleasedPledge.map(x=>x),
}
projectedDays.map((x,day)=>{
if(day == 0) return;
//grab daily power difference and compute epoch-based power growth
let epochNetRBPGrowth = (dailyNetRBP[day] - dailyNetRBP[day - 1]) / epochInDay
let epochNetQAPGrowth = (dailyNetQAP[day] - dailyNetQAP[day - 1]) / epochInDay


// ------------------------------------------------------- Power Update Starts Here ----------------------------------------------------//
// calculate the daily & epoch based scheduled expiration part
let dayKnownSERBP = (day < known_se_power.length) ? known_se_power[day] : 0

let dayModelSERBP_o = (day > projectedAvgSectorDurationDays) ? (dailyNetRBP[day - projectedAvgSectorDurationDays] - dailyNetRBP[day - projectedAvgSectorDurationDays - 1]) : 0
let dayModelSERBP_se = (day > projectedAvgSectorDurationDays) && (day - projectedAvgSectorDurationDays < known_se_power.length) ? projectedRenewalRate * known_se_power[day - projectedAvgSectorDurationDays] : 0

let daySERBP = dayKnownSERBP + dayModelSERBP_o + dayModelSERBP_se


// calculate today's renewal part
let dayRenewRBP = projectedRenewalRate * daySERBP

// do the same thing for QAP
let dayKnownSEQAP = (day < known_se_power.length) ? (9 * projectedVerifiedStoragePercent + 1) * known_se_power[day] : 0

let dayModelSEQAP_o = (day > projectedAvgSectorDurationDays) ? dailyNetQAP[day - projectedAvgSectorDurationDays] - dailyNetQAP[day - projectedAvgSectorDurationDays - 1] : 0

let dayModelSEQAP_r = (day > projectedAvgSectorDurationDays) && (day - projectedAvgSectorDurationDays < known_se_power.length) ? qualityNetPowerAvgMultiplier * projectedRenewalRate * known_se_power[day - projectedAvgSectorDurationDays] : 0

let daySEQAP = dayKnownSEQAP + dayModelSEQAP_o + dayModelSEQAP_r

// QAP: calculate the daily renewal part
let dayRenewQAP = projectedRenewalRate * daySEQAP

// make everything as epochs
let epochSERBP = daySERBP / epochInDay
let epochRenewRBP = dayRenewRBP / epochInDay

let epochSEQAP = daySEQAP / epochInDay
let epochRenewQAP = dayRenewQAP / epochInDay

// --------------------------------------------------------- Power Update Ends Here ----------------------------------------------------//
// ------------------------------------------------- Miner Power Update Starts Here ----------------------------------------------------//
// ------------------------------------------------- Miner Power Update Ends Here ------------------------------------------------------//

//start calculations epoch-wise
for(let index = 0; index < epochInDay; index++){
// update the current epoch
let epoch = Number(epochStart) + ((day - 1) * epochInDay) + index
// update the network for the current epoch

// update network power
result.epochNetRBP = Number(result.epochNetRBP) + epochNetRBPGrowth - epochSERBP + epochRenewRBP
result.epochNetQAP = Number(result.epochNetQAP) + epochNetQAPGrowth - epochSEQAP + epochRenewQAP
result.epochNetBasePower = getBaselineByEpoch(epoch)

// update network pledge terms
let epochPerRBPCircSupply = result.epochNetCircFIL / Math.max(result.epochNetRBP, result.epochNetBasePower)
let epochPerQAPCircSupply = result.epochNetCircFIL / Math.max(result.epochNetQAP, result.epochNetBasePower)

// -------------------------------------------------- Daily New Pledge Starts Here ----------------------------------------------------//
// initial storage pledge
result.epochNetStoragePledge = Math.max(epochNetQAPGrowth * extrapolateCumsumRatio(result.epochNetRewardFilter,
result.epochNetPowerFilter,
20 * epochInDay
), 0)
result.epochNetStorageConsensusPledge = Math.max(epochPerQAPCircSupply * initial_pledge_lock_target * epochNetQAPGrowth, 0)

result.epochNetInitialPledge = result.epochNetStoragePledge + result.epochNetStorageConsensusPledge

result.dailyNetNewPledge[day] += result.epochNetInitialPledge

// deal pledge
result.epochNetDealPledge = Math.max(result.projectedVerifiedStoragePercent * epochPerRBPCircSupply * 0.01 * epochNetRBPGrowth, 0)

result.dailyNetNewDealPledge[day] += result.epochNetDealPledge

// update it here
result.epochNetLockedFIL += (result.epochNetDealPledge + result.epochNetInitialPledge)
// -------------------------------------------------- Daily New Pledge Ends Here -------------------------------------------------------//

// ----------------------------------------- Known Scheduled Expiration Starts Here ----------------------------------------------------//
// deal effect omitted for now //
/////////////////////////////////////////////////////////// Leaves ///////////////////////////////////////////////////////////////////////
let dailyKnownSEOut = (day < known_se_pledge.length) ? (1 - projectedRenewalRate) * known_se_pledge[day]: 0
let epochKnownSEOut = dailyKnownSEOut / epochInDay
result.epochNetLockedFIL = result.epochNetLockedFIL - epochKnownSEOut
/////////////////////////////////////////////////////////// Repledges ////////////////////////////////////////////////////////////////////
let epochKnownSERBP = dayKnownSERBP / epochInDay
let dailyKnownSERepledged = (day < known_se_pledge.length) ? projectedRenewalRate * known_se_pledge[day] : 0

let epochKnownSERepledged = dailyKnownSERepledged / epochInDay
let epochKnownRenewStoragePledge = Math.max(qualityNetPowerAvgMultiplier * projectedRenewalRate * epochKnownSERBP *
extrapolateCumsumRatio(result.epochNetRewardFilter, result.epochNetPowerFilter, 20 * epochInDay), 0)
let epochKnownRenewConsensusPledge = Math.max(epochPerQAPCircSupply * initial_pledge_lock_target * qualityNetPowerAvgMultiplier * projectedRenewalRate * epochKnownSERBP, 0)
result.epochNetLockedFIL = result.epochNetLockedFIL + epochKnownRenewStoragePledge + epochKnownRenewConsensusPledge - epochKnownSERepledged
/////////////////////////////////////////////////////////// Save a Record ////////////////////////////////////////////////////////////////
result.dailyNetRenewPledge[day] += epochKnownRenewStoragePledge + epochKnownRenewConsensusPledge
// ------------------------------------------ Known Scheduled Expiration Ends Here ----------------------------------------------------//
// -------------------------------------- Modelled Scheduled Expiration Starts Here ----------------------------------------------------//
// deal effect omitted for now //
/////////////////////////////////////////////////////////// Leaves ///////////////////////////////////////////////////////////////////////
let epochNetNewPledgeOut = (day > projectedAvgSectorDurationDays) ? (1 - projectedRenewalRate) * result.dailyNetNewPledge[day - projectedAvgSectorDurationDays] / epochInDay : 0
let epochNetRenewPledgeOut = (day > projectedAvgSectorDurationDays) ? (1 - projectedRenewalRate) * result.dailyNetRenewPledge[day - projectedAvgSectorDurationDays] / epochInDay : 0

result.epochNetLockedFIL = result.epochNetLockedFIL - epochNetNewPledgeOut - epochNetRenewPledgeOut

/////////////////////////////////////////////////////////// Repledges ////////////////////////////////////////////////////////////////////
// step 1: get the re-pledged out part
let epochNetNewPledgeRe = (day > projectedAvgSectorDurationDays) ? projectedRenewalRate * result.dailyNetNewPledge[day - projectedAvgSectorDurationDays] / epochInDay: 0
let epochNetRenewPledgeRe = (day > projectedAvgSectorDurationDays) ? projectedRenewalRate * result.dailyNetRenewPledge[day - projectedAvgSectorDurationDays] / epochInDay: 0

result.epochNetLockedFIL = result.epochNetLockedFIL - epochNetNewPledgeRe - epochNetRenewPledgeRe

// step 2: construct up the re-pledges
//// Model out the newly onboarded part
let epochModelSERBP_o = dayModelSERBP_o / epochInDay
let epochModelSERBP_o_storage_pledge = Math.max(qualityNetPowerAvgMultiplier * projectedRenewalRate * epochModelSERBP_o *
extrapolateCumsumRatio(result.epochNetRewardFilter, result.epochNetPowerFilter, 20 * epochInDay), 0)
let epochModelSERBP_o_consensus_pledge = Math.max(epochPerQAPCircSupply * initial_pledge_lock_target * qualityNetPowerAvgMultiplier * projectedRenewalRate * epochModelSERBP_o, 0)

let epochModelSERBP_o_new = (day > projectedAvgSectorDurationDays) ? epochModelSERBP_o_storage_pledge + epochModelSERBP_o_consensus_pledge : 0

result.epochNetLockedFIL = result.epochNetLockedFIL + epochModelSERBP_o_new

//// model out the known expiration part
let epochModelSERBP_se = dayModelSERBP_se / epochInDay
let epochModelSERBP_se_storage_pledge = Math.max(qualityNetPowerAvgMultiplier * projectedRenewalRate * epochModelSERBP_se *
extrapolateCumsumRatio(result.epochNetRewardFilter, result.epochNetPowerFilter, 20 * epochInDay), 0)
let epochModelSERBP_se_consensus_pledge = Math.max(epochPerQAPCircSupply * initial_pledge_lock_target * qualityNetPowerAvgMultiplier * projectedRenewalRate * epochModelSERBP_se, 0)

let epochModelSERBP_se_new = (day > projectedAvgSectorDurationDays) ? epochModelSERBP_se_storage_pledge + epochModelSERBP_se_consensus_pledge : 0

result.epochNetLockedFIL = result.epochNetLockedFIL + epochModelSERBP_se_new

// --------------------------------------- Modelled Scheduled Expiration Ends Here ----------------------------------------------------//
// update new rewards & FIL Mined
let epochPrevNetTimeEpoch = derive_network_time(result.epochCumSumRealized)
result.epochCumSumRealized += Math.min(result.epochNetBasePower, result.epochNetRBP)
let epochCurrNetTimeEpoch = derive_network_time(result.epochCumSumRealized)
result.epochNetNewReward = computeBlockReward(epoch, epoch - 1, epochCurrNetTimeEpoch, epochPrevNetTimeEpoch)
result.epochNetMinedFIL += result.epochNetNewReward // keep mining
result.epochNetRewardLocked += 0.75 * result.epochNetNewReward // lock away new rewards
result.epochNetRewardLocked -= result.epochNetRewardLocked / 180 / epochInDay // release part of the rewards

// reward part
result.epochNetLockedFIL += 0.75 * result.epochNetNewReward

result.epochNetLockedFIL -= result.epochNetRewardLocked / 180 / epochInDay // release part of the rewards
result.epochNetBurntFIL += result.dailyNetBurn[day] / epochInDay
result.epochNetVestedFIL += getVestOnEpoch(epoch)

// update the total network circulating supply field
result.epochNetCircFIL = result.epochNetReserveDisbursed + result.epochNetMinedFIL + result.epochNetVestedFIL - result.epochNetLockedFIL - result.epochNetBurntFIL
// update ab filters for next round prediction
result.epochNetRewardFilter.update(result.epochNetNewReward, 1)
result.epochNetPowerFilter.update(result.epochNetQAP, 1)

// some pledge accounting
//accounting up
result.dailyMinerQAPCommitted[day] += epochMinerRBPGrowth
result.dailyMinerRBPCommitted[day] += epochMinerQAPGrowth

// more accounting
let dailyMinerRBPRetire = (day > projectedSPStorageDurationDays) && (day - projectedSPStorageDurationDays < daysForSealing) ? result.dailyMinerRBPCommitted[day - projectedSPStorageDurationDays] : 0
let dailyMinerQAPRetire = (day > projectedSPStorageDurationDays) && (day - projectedSPStorageDurationDays < daysForSealing) ? result.dailyMinerQAPCommitted[day - projectedSPStorageDurationDays] : 0

let epochMinerRBPRetire = dailyMinerRBPRetire / epochInDay
let epochMinerQAPRetire = dailyMinerQAPRetire / epochInDay

result.epochMinerRBP = epochMinerRBPRetire
result.epochMinerQAP -= epochMinerQAPRetire
// update the miners for this epoch
// if we're still sealing, then add up pledges
if (epoch <= daysForSealing * epochInDay + Number(epochStart)){
// onboarding storage power
result.epochMinerRBP += epochMinerRBPGrowth
result.epochMinerQAP += epochMinerQAPGrowth

// accumulate pledges
result.epochMinerStoragePledge = epochMinerQAPGrowth * extrapolateCumsumRatio(result.epochNetRewardFilter,
result.epochNetPowerFilter,
20 * epochInDay
)
result.epochMinerConsensusPledge = (epochMinerQAPGrowth / Math.max(result.epochNetQAP, result.epochNetBasePower)) * result.epochNetCircFIL * 0.3
result.epochMinerInitialPledge = result.epochMinerStoragePledge + result.epochMinerConsensusPledge
result.epochMinerDealPledge = (verifiedPercentage * epochMinerRBPGrowth / Math.max(result.epochNetRBP, result.epochNetBasePower)) * result.epochNetCircFIL * 0.01 / 100
// aggregate the pledges daily
result.dailyMinerTotalPledge[day] = result.dailyMinerTotalPledge[day] + result.epochMinerInitialPledge + result.epochMinerDealPledge
}
// mint and assign new rewards
result.dailyMinerCumSumRewards[day] = result.dailyMinerCumSumRewards[day] + (result.epochMinerQAP / result.epochNetQAP) * result.epochNetNewReward
}
// update EOD power
result.dailyMinerDeals[day] = result.epochMinerRBP * verifiedPercentage * 0.01
// update the daily balance sheet items
//// get the cumulative sum of the rewards
result.dailyMinerReleasedRewards[day] += 0.25 * result.dailyMinerCumSumRewards[day] + result.cumMinerLockedReward / 180
result.dailyMinerLockedRewards[day] += 0.75 * result.dailyMinerCumSumRewards[day] - result.cumMinerLockedReward / 180
result.cumMinerLockedReward += result.dailyMinerLockedRewards[day]
result.cumMinerReleasedReward += result.dailyMinerReleasedRewards[day]

// get the cumulative sum of the pledges
let dailyMinerPledgeRelease = (day > projectedSPStorageDurationDays) ? result.dailyMinerTotalPledge[day - projectedSPStorageDurationDays] : 0
result.dailyMinerReleasedPledge[day] = dailyMinerPledgeRelease

result.dailyMinerLockedPledge[day] = result.dailyMinerTotalPledge[day] - result.dailyMinerReleasedPledge[day]
result.dailyMinerInvestment[day] += result.dailyMinerTotalPledge[day]
result.dailyMinerProfit[day] += result.dailyMinerCumSumRewards[day] - result.dailyMinerTotalCost[day]
})
return result
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
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