schedule.hoon 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. |%
  2. ++ bmonth 4.383
  3. ++ byear ^~((mul 12 4.383))
  4. ++ atoms-per-nock ^~((bex 16))
  5. ::
  6. ++ schedule
  7. |= block-num=@
  8. ^- @ :: emission is number of atoms
  9. ?: =(0 block-num) 0 :: no coins in genesis block
  10. :: least inconvenient offset to deal with coinless
  11. :: genesis block
  12. =. block-num (dec block-num)
  13. =; emit=@
  14. ?: (gte block-num (add 2 (mul byear 191)))
  15. :: rate goes to 0 at 191 years and 2 blocks. not strictly
  16. :: necessary since the algorithm would do so anyways, but
  17. :: it makes it clear exactly when emissions stop.
  18. ?> =(0 emit) 0
  19. ?> !=(0 emit) emit
  20. =/ rate ^~((mul (bex 16) atoms-per-nock))
  21. =? rate (gth block-num (mul bmonth 3))
  22. (div rate 2)
  23. =? rate (gth block-num (mul bmonth 9))
  24. (div rate 2)
  25. =? rate (gth block-num (mul bmonth 18))
  26. (div rate 2)
  27. =? rate (gth block-num (mul byear 3))
  28. (div rate 2)
  29. =? rate (gth block-num (mul byear 5))
  30. (div rate 2)
  31. =? rate (gth block-num (mul byear 8))
  32. (div rate 2)
  33. =? rate (gth block-num (mul byear 12))
  34. (div rate 2)
  35. =? rate (gth block-num (mul byear 17))
  36. (div rate 2)
  37. =? rate (gth block-num (mul byear 23))
  38. (div rate 2)
  39. ?. (gth block-num (mul byear 30))
  40. rate
  41. =: rate (div rate 2)
  42. block-num (sub block-num (mul byear 30))
  43. ==
  44. |-
  45. ?: (gth block-num (mul byear 7))
  46. $(rate (div rate 2), block-num (sub block-num (mul byear 7)))
  47. rate
  48. ::
  49. ++ total-supply
  50. |= max-block=@
  51. ^- @
  52. =/ cur-block 0
  53. =/ sum-atoms 0
  54. |-
  55. ?: =(cur-block max-block)
  56. sum-atoms
  57. %_ $
  58. cur-block +(cur-block)
  59. sum-atoms (add sum-atoms (schedule cur-block))
  60. ==
  61. ::
  62. ++ supply-evolution
  63. |= max-block=@
  64. ^- (list @)
  65. =/ cur-block 0
  66. =/ sum-atoms 0
  67. =/ lis=(list @) ~[0]
  68. |-
  69. ?: =(cur-block max-block)
  70. (flop lis)
  71. =: cur-block +(cur-block)
  72. sum-atoms (add sum-atoms (schedule cur-block))
  73. ==
  74. =. lis [sum-atoms lis]
  75. $
  76. --