|
| 1 | +import { manualLinear } from "../adapters/manual"; |
| 2 | +import { LinearAdapterResult, Protocol } from "../types/adapters"; |
| 3 | + |
| 4 | +// Block 145000 occurred at UTC: 17.03.2014, 22:17:59 |
| 5 | +const block145000Timestamp = new Date("2014-03-17T22:17:59Z").getTime() / 1000; |
| 6 | +const blockTime = 60; |
| 7 | + |
| 8 | +function getTimestampForBlock(blockNumber: number): number { |
| 9 | + const blockDiff = blockNumber - 145000; |
| 10 | + return block145000Timestamp + (blockDiff * blockTime); |
| 11 | +} |
| 12 | + |
| 13 | +interface BlockScheduleEntry { |
| 14 | + startBlock: number; |
| 15 | + endBlock: number; |
| 16 | + maxReward?: number; |
| 17 | + reward?: number; |
| 18 | +} |
| 19 | + |
| 20 | +const blockSchedule: BlockScheduleEntry[] = [ |
| 21 | + { startBlock: 1, endBlock: 99999, maxReward: 1000000 }, |
| 22 | + { startBlock: 100000, endBlock: 144999, maxReward: 500000 }, |
| 23 | + { startBlock: 145000, endBlock: 199999, reward: 250000 }, |
| 24 | + { startBlock: 200000, endBlock: 299999, reward: 125000 }, |
| 25 | + { startBlock: 300000, endBlock: 399999, reward: 62500 }, |
| 26 | + { startBlock: 400000, endBlock: 499999, reward: 31250 }, |
| 27 | + { startBlock: 500000, endBlock: 599999, reward: 15625 }, |
| 28 | + { startBlock: 600000, endBlock: 12500000, reward: 10000 } |
| 29 | +]; |
| 30 | + |
| 31 | +function rewards(): LinearAdapterResult[] { |
| 32 | + const sections: LinearAdapterResult[] = []; |
| 33 | + |
| 34 | + for (let i = 0; i < blockSchedule.length; i++) { |
| 35 | + const schedule = blockSchedule[i]; |
| 36 | + const startTimestamp = getTimestampForBlock(schedule.startBlock); |
| 37 | + const endTimestamp = getTimestampForBlock(schedule.endBlock); |
| 38 | + |
| 39 | + const blockCount = schedule.endBlock - schedule.startBlock + 1; |
| 40 | + let reward: number; |
| 41 | + if (schedule.reward !== undefined) { |
| 42 | + reward = schedule.reward; |
| 43 | + } else if (schedule.maxReward !== undefined) { |
| 44 | + reward = schedule.maxReward / 2; |
| 45 | + } else { |
| 46 | + throw new Error(`Missing reward info for block range ${schedule.startBlock}-${schedule.endBlock}`); |
| 47 | + } |
| 48 | + const totalEmission = blockCount * reward; |
| 49 | + |
| 50 | + sections.push(manualLinear( |
| 51 | + startTimestamp, |
| 52 | + endTimestamp, |
| 53 | + totalEmission |
| 54 | + )); |
| 55 | + } |
| 56 | + |
| 57 | + return sections; |
| 58 | +} |
| 59 | + |
| 60 | +const doge: Protocol = { |
| 61 | + "Mining rewards": rewards(), |
| 62 | + meta: { |
| 63 | + sources: [ |
| 64 | + "https://github.com/dogecoin/dogecoin/blob/master/doc/FAQ.md", |
| 65 | + "https://github.com/dogecoin/dogecoin/blob/master/src/chainparams.cpp", |
| 66 | + ], |
| 67 | + token: "coingecko:dogecoin", |
| 68 | + protocolIds: [], |
| 69 | + notes: [ |
| 70 | + "Block rewards were initially random between 0-1,000,000 DOGE for blocks 1-99,999", |
| 71 | + "Block rewards were random between 0-500,000 DOGE for blocks 100,000-144,999", |
| 72 | + "Fixed block rewards were implemented from block 145,000 onwards", |
| 73 | + "Projected until block 12.5M" |
| 74 | + ], |
| 75 | + }, |
| 76 | + categories: { |
| 77 | + farming: ["Mining rewards"], |
| 78 | + }, |
| 79 | +}; |
| 80 | + |
| 81 | +export default doge; |
0 commit comments