Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 105 additions & 0 deletions protocols/axs.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
import { manualCliff, manualLinear } from "../adapters/manual";
import { periodToSeconds } from "../utils/time";
import { Protocol } from "../types/adapters";

const tgeTimestamp = 1604448000;

const quarterEnd = (quarterNumber: number) => tgeTimestamp + periodToSeconds.day * 90 * quarterNumber;

const axs: Protocol = {
"Public Sale": [
manualCliff(tgeTimestamp, 29_700_000),
],
"Private Sale": [
manualCliff(tgeTimestamp, 2_160_000),
manualLinear(quarterEnd(1), quarterEnd(2), 2_160_000),
manualLinear(quarterEnd(3), quarterEnd(4), 2_160_000),
manualLinear(quarterEnd(5), quarterEnd(6), 2_160_000),
manualLinear(quarterEnd(7), quarterEnd(8), 2_160_000),
],
"Staking Reward": [
manualLinear(tgeTimestamp, quarterEnd(1), 4_725_000),
manualLinear(quarterEnd(1), quarterEnd(2), 2_283_750),
manualLinear(quarterEnd(2), quarterEnd(3), 6_851_250),
manualLinear(quarterEnd(3), quarterEnd(4), 6_851_250),
manualLinear(quarterEnd(4), quarterEnd(5), 6_851_250),
manualLinear(quarterEnd(5), quarterEnd(6), 6_198_750),
manualLinear(quarterEnd(6), quarterEnd(7), 4_893_750),
manualLinear(quarterEnd(7), quarterEnd(8), 4_893_750),
manualLinear(quarterEnd(8), quarterEnd(9), 4_893_750),
manualLinear(quarterEnd(9), quarterEnd(10), 4_404_375),
manualLinear(quarterEnd(10), quarterEnd(11), 3_425_625),
manualLinear(quarterEnd(11), quarterEnd(12), 3_425_625),
manualLinear(quarterEnd(12), quarterEnd(13), 3_425_625),
manualLinear(quarterEnd(13), quarterEnd(14), 3_099_375),
manualLinear(quarterEnd(14), quarterEnd(15), 2_446_875),
manualLinear(quarterEnd(15), quarterEnd(16), 2_446_875),
manualLinear(quarterEnd(16), quarterEnd(17), 2_446_875),
manualLinear(quarterEnd(17), quarterEnd(18), 2_283_750),
manualLinear(quarterEnd(18), quarterEnd(19), 1_957_500),
manualLinear(quarterEnd(19), quarterEnd(20), 1_957_500),
manualLinear(quarterEnd(20), quarterEnd(21), 1_957_500),
manualLinear(quarterEnd(21), quarterEnd(22), 1_305_000),
],
"Play to Earn": [
manualCliff(tgeTimestamp, 4_725_000),
manualLinear(quarterEnd(1), quarterEnd(2), 9_450_000),
manualLinear(quarterEnd(3), quarterEnd(4), 6_750_000),
manualLinear(quarterEnd(5), quarterEnd(6), 6_750_000),
manualLinear(quarterEnd(7), quarterEnd(8), 4_725_000),
manualLinear(quarterEnd(9), quarterEnd(10), 4_725_000),
manualLinear(quarterEnd(11), quarterEnd(12), 3_375_000),
manualLinear(quarterEnd(13), quarterEnd(14), 3_375_000),
manualLinear(quarterEnd(15), quarterEnd(16), 2_700_000),
manualLinear(quarterEnd(17), quarterEnd(18), 2_700_000),
],
"Advisors": [
manualCliff(tgeTimestamp, 4_500_000),
manualLinear(quarterEnd(1), quarterEnd(2), 1_800_000),
manualLinear(quarterEnd(3), quarterEnd(4), 2_700_000),
manualLinear(quarterEnd(5), quarterEnd(6), 2_700_000),
manualLinear(quarterEnd(7), quarterEnd(8), 2_700_000),
manualLinear(quarterEnd(9), quarterEnd(10), 2_700_000),
manualLinear(quarterEnd(11), quarterEnd(12), 900_000),
manualLinear(quarterEnd(13), quarterEnd(14), 900_000),
],
"Sky Mavis": [
manualCliff(tgeTimestamp, 10_800_000),
manualLinear(quarterEnd(3), quarterEnd(4), 5_737_500),
manualLinear(quarterEnd(5), quarterEnd(6), 5_737_500),
manualLinear(quarterEnd(7), quarterEnd(8), 5_737_500),
manualLinear(quarterEnd(9), quarterEnd(10), 5_737_500),
manualLinear(quarterEnd(11), quarterEnd(12), 5_737_500),
manualLinear(quarterEnd(13), quarterEnd(14), 5_737_500),
manualLinear(quarterEnd(15), quarterEnd(16), 5_737_500),
manualLinear(quarterEnd(17), quarterEnd(18), 5_737_500),
],
"Ecosystem Fund": [
manualCliff(tgeTimestamp, 8_100_000),
manualLinear(quarterEnd(1), quarterEnd(2), 1_687_500),
manualLinear(quarterEnd(3), quarterEnd(4), 1_687_500),
manualLinear(quarterEnd(5), quarterEnd(6), 1_687_500),
manualLinear(quarterEnd(7), quarterEnd(8), 1_687_500),
manualLinear(quarterEnd(9), quarterEnd(10), 1_687_500),
manualLinear(quarterEnd(11), quarterEnd(12), 1_687_500),
manualLinear(quarterEnd(13), quarterEnd(14), 1_687_500),
manualLinear(quarterEnd(15), quarterEnd(16), 1_687_500),
],
meta: {
notes: [
"The schedule is based on the provided table data from docs.",
"Subsequent amounts listed against '90 days after' rows are interpreted as the total amount released linearly over the 90-day period ending at that point in time.",
],
sources: ["https://whitepaper.axieinfinity.com/axs/allocations-and-unlock"],
token: `ethereum:0xBB0E17EF65F82Ab018d8EDd776e8DD940327B28b`,
protocolIds: ["6102"],
},
categories: {
insiders: ["Private Sale", "Advisors", "Sky Mavis"],
publicSale: ["Public Sale"],
farming: ["Staking Reward", "Play to Earn"],
noncirculating: ["Ecosystem Fund"],
}
};

export default axs;
91 changes: 91 additions & 0 deletions protocols/flow.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import { manualLinear, manualCliff } from "../adapters/manual";
import { LinearAdapterResult, Protocol } from "../types/adapters";
import { periodToSeconds } from "../utils/time";

const start = 1602633600; // Oct 14, 2020
const startMainnet = 1608633600; // Dec 22, 2020
const TARGET_WEEK = 520;

const emissions = (): LinearAdapterResult[] => {
const result: LinearAdapterResult[] = [];
let currentWeek = 0;

result.push({
type: "linear",
start: startMainnet,
end: startMainnet + periodToSeconds.weeks(1),
amount: 1_200_000
});
currentWeek++;

for (let week = 0; week < 5 && currentWeek < TARGET_WEEK; week++) {
result.push({
type: "linear",
start: startMainnet + periodToSeconds.weeks(currentWeek),
end: startMainnet + periodToSeconds.weeks(currentWeek + 1),
amount: 4_400_000
});
currentWeek++;
}

while (currentWeek < TARGET_WEEK) {
result.push({
type: "linear",
start: startMainnet + periodToSeconds.weeks(currentWeek),
end: startMainnet + periodToSeconds.weeks(currentWeek + 1),
amount: 1_300_000
});
currentWeek++;
}

return result;
};

const flow: Protocol = {
"Dapper Labs": manualCliff(start, 250_000_000),
"Ecosystem Reserve": manualCliff(start, 400_200_000),
"Staking Rewards": emissions(),

"Community Sale": [
manualCliff(start + periodToSeconds.year, 45_000_000),
manualLinear(start + periodToSeconds.year, start + periodToSeconds.years(2), 45_000_000)
],

"Auction": manualCliff(start + periodToSeconds.year, 25_000_000),

"Pre-launch Backers": manualCliff(start + periodToSeconds.years(2), 259_800_000), //from flow post about the circulating updates, where it combine pre launch backer and community sale

"Development Team": manualLinear(
start,
start + periodToSeconds.years(3),
225_000_000
),



meta: {
notes: [
"Initial token allocations totaling 1.25B FLOW:",
"- Pre-launch backers and community (374.8M FLOW) were fully unlocked in October 2022",
"- Development team (225M FLOW) vested over 3 years from October 2020, however these tokens will not be added to the publicly traded supply unless they are granted",
"- Dapper Labs holds 250M FLOW without transfer restrictions",
"- Ecosystem Reserve of 400.2M FLOW for ecosystem development",
"Staking rewards are modeled without taking transaction fees into account, in the real world the emission will be lower because it will first use transaction fees to pay for the staking rewards, and then the rest will be minted",
],
token: `coingecko:flow`,
sources: [
"https://developers.flow.com/networks/staking/schedule",
"https://flow.com/post/flow-token-circulating-supply-updates",
"https://blog.coinlist.co/flow-raises-18m-on-coinlist/"
],
protocolIds: ["6104"]
},
categories: {
farming: ["Staking Rewards"],
insiders: ["Development Team", "Dapper Labs", "Pre-launch Backers"],
publicSale: ["Community Sale", "Auction"],
noncirculating: ["Ecosystem Reserve"]
}
};

export default flow;
105 changes: 105 additions & 0 deletions protocols/helium.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
import { manualLinear } from "../adapters/manual";
import { periodToSeconds } from "../utils/time";
import { Protocol } from "../types/adapters";

const genesisTimestamp = 1564617600;

const yearsAfterGenesis = (years: number) => genesisTimestamp + periodToSeconds.year * years;

function calculateYearlyMinting(year: number): number {
if (year <= 2) {
return 103_000_000 / 2;
}
let baseAmount = 30_000_000;
const halvingPeriod = Math.floor((year - 3) / 2);
const amount = baseAmount / Math.pow(2, halvingPeriod);
return amount;
}

const totalMintedPerYear: { [year: number]: number } = {};
for (let year = 1; year <= 50; year++) {
totalMintedPerYear[year] = calculateYearlyMinting(year);
}

function calculatePercentages(year: number) {
const startingValues = {
founders: 0.35,
poc: 0.29,
data: 0.30,
consensus: 0.06
};

const yearlyChange = year - 1;
const founders = Math.max(0.15, startingValues.founders - (0.01 * yearlyChange));
const poc = Math.max(0, startingValues.poc - (0.015 * yearlyChange));
const data = Math.min(0.79, startingValues.data + (0.025 * yearlyChange));
const consensus = startingValues.consensus;

return { poc, data, founders, consensus };
}

const percentages: { [year: number]: { poc: number, data: number, founders: number, consensus: number } } = {};
for (let year = 1; year <= 50; year++) {
percentages[year] = calculatePercentages(year);
}

const consensusEmissions: any[] = [];
const foundersEmissions: any[] = [];
const pocEmissions: any[] = [];
const dataTransferEmissions: any[] = [];

for (let year = 1; year <= 50; year++) {
const totalMinted = totalMintedPerYear[year];
const yearPercents = percentages[Math.min(year, 21)];

if (!totalMinted || !yearPercents) {
console.warn(`Missing data for HNT year ${year}`);
continue;
}

const start = yearsAfterGenesis(year - 1);
const end = yearsAfterGenesis(year);

const consensusAmount = totalMinted * yearPercents.consensus;
const foundersAmount = totalMinted * yearPercents.founders;
const pocAmount = totalMinted * yearPercents.poc;
const dataTransferAmount = totalMinted * yearPercents.data;

if (consensusAmount > 0) {
consensusEmissions.push(manualLinear(start, end, consensusAmount));
}
if (foundersAmount > 0) {
foundersEmissions.push(manualLinear(start, end, foundersAmount));
}
if (pocAmount > 0) {
pocEmissions.push(manualLinear(start, end, pocAmount));
}
if (dataTransferAmount > 0) {
dataTransferEmissions.push(manualLinear(start, end, dataTransferAmount));
}
}

const helium: Protocol = {
"Founders and Investors": foundersEmissions,
"Proof of Coverage": pocEmissions,
"Data Transfer": dataTransferEmissions,
"Consensus": consensusEmissions,

meta: {
notes: [
"Schedule based on HIP-20, implementing halvings every 2 years starting from Genesis (Aug 1, 2019).",
"Emissions are modeled as linear releases over each year.",
"Percentages for years 21+ are assumed to remain constant as defined in Year 21 due to caps and zeroing out.",
],
sources: ["https://github.com/helium/HIP/blob/main/0020-hnt-max-supply.md"],
token: "coingecko:helium",
protocolIds: ["6099"],
},
categories: {
farming: ["Proof of Coverage", "Data Transfer"],
noncirculating: ["Consensus"],
insiders: ["Founders and Investors"],
}
};

export default helium;
Loading
Loading