Skip to content

Instantly share code, notes, and snippets.

@ice09
Last active June 23, 2022 14:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ice09/cf3e69d44f3bd953050c42c6597de2de to your computer and use it in GitHub Desktop.
Save ice09/cf3e69d44f3bd953050c42c6597de2de to your computer and use it in GitHub Desktop.
CirclesUBI Timecircles to Circles Converter
// 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);
}
}
// 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