Last active
June 23, 2022 14:25
-
-
Save ice09/cf3e69d44f3bd953050c42c6597de2de to your computer and use it in GitHub Desktop.
CirclesUBI Timecircles to Circles Converter
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: AGPL | |
pragma solidity ^0.8.0; | |
import "./CRCTCConverterLib.sol"; | |
contract CRCTCConverter { | |
function crcToTc(uint timestamp, uint amount) external pure returns (uint) { | |
uint precision = 10 ** 18; | |
uint payoutAtTimestamp = CRCTCConverterLib.getCrcPayoutAt(timestamp); | |
return amount * precision * 24 / payoutAtTimestamp; | |
} | |
function tcToCrc(uint timestamp, uint amount) external pure returns (uint) { | |
uint precision = 10 ** 18; | |
uint payoutAtTimestamp = CRCTCConverterLib.getCrcPayoutAt(timestamp); | |
return amount * payoutAtTimestamp / (24 * precision); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: AGPL | |
pragma solidity ^0.8.0; | |
library CRCTCConverterLib { | |
function getCrcPayoutAt(uint timestamp) external pure returns (uint) { | |
uint circlesInceptionTimestampMs = 1602720000000; | |
uint timestampMs = timestamp * 1000; | |
require(timestampMs >= circlesInceptionTimestampMs, "timestamp must be after or at Circles inception"); | |
// Use scale to avoid division rounding errors | |
uint scalefixed = 10 ** 18; | |
// Convert floating point to integer by using hours instead of days | |
uint oneCirclesYearInHours = 8776; | |
uint oneHourInMilliSeconds = 3600 * 1000; | |
uint oneCirclesYearInMilliSeconds = oneCirclesYearInHours * 60 * 60 * 1000; | |
uint hoursSinceCirclesInception = (timestampMs - circlesInceptionTimestampMs) / oneHourInMilliSeconds; | |
uint hoursInCurrentCirclesYear = (hoursSinceCirclesInception % oneCirclesYearInHours); | |
uint circlesYearsSince = (timestampMs - circlesInceptionTimestampMs) * scalefixed / oneCirclesYearInMilliSeconds; | |
// Everyone got 8 CRC per day in the first year | |
uint initialDailyCrcPayout = 8 * scalefixed; | |
uint circlesPayoutInCurrentYear = initialDailyCrcPayout; | |
uint previousCirclesPerDayValue = initialDailyCrcPayout; | |
// Add the yearly inflation to the initial payout and keep track | |
// of the previous and current year's value | |
for (uint index = 0; index < circlesYearsSince; index = index + scalefixed) { | |
previousCirclesPerDayValue = circlesPayoutInCurrentYear; | |
circlesPayoutInCurrentYear = (circlesPayoutInCurrentYear * 107) / 100; | |
} | |
uint hoursInYear = hoursInCurrentCirclesYear * scalefixed / oneCirclesYearInHours; | |
uint interpolatedPayout = previousCirclesPerDayValue * (scalefixed - hoursInYear) + circlesPayoutInCurrentYear * hoursInYear; | |
return interpolatedPayout / scalefixed; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment