Source Code
Overview
S Balance
More Info
ContractCreator
Loading...
Loading
Contract Name:
LinearDistributionIntervalDecrease
Compiler Version
v0.8.22+commit.4fc1097e
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.22; /** * This is the library that calculates the reward for the period with linear distribution and interval decrease. * Supports the constant reward amount (decreaseAmount_ = 0) */ library LinearDistributionIntervalDecrease { /** * The function to calculate the reward for the period. * @param initialAmount_ The initial reward amount. * @param decreaseAmount_ The reward decrease amount. * @param payoutStart_ The timestamp when the period starts to pay out rewards. * @param interval_ The interval in seconds between reward decreases. * @param startTime_ The timestamp when the period starts. * @param endTime_ The timestamp when the period ends. * @return The reward amount. */ function getPeriodReward( uint256 initialAmount_, uint256 decreaseAmount_, uint128 payoutStart_, uint128 interval_, uint128 startTime_, uint128 endTime_ ) external pure returns (uint256) { if (interval_ == 0) { return 0; } // 'startTime_' can't be less than 'payoutStart_' if (startTime_ < payoutStart_) { startTime_ = payoutStart_; } uint128 maxEndTime_ = _calculateMaxEndTime(payoutStart_, interval_, initialAmount_, decreaseAmount_); if (endTime_ > maxEndTime_) { endTime_ = maxEndTime_; } // Return 0 when calculation 'startTime_' is bigger then 'endTime_'... if (startTime_ >= endTime_) { return 0; } // Calculate interval that less then 'interval_' range uint256 timePassedBefore_ = startTime_ - payoutStart_; if ((timePassedBefore_ / interval_) == ((endTime_ - payoutStart_) / interval_)) { uint256 intervalsPassed_ = timePassedBefore_ / interval_; uint256 intervalFullReward_ = initialAmount_ - intervalsPassed_ * decreaseAmount_; return (intervalFullReward_ * (endTime_ - startTime_)) / interval_; } // Calculate interval that more then 'interval_' range uint256 firstPeriodReward_ = _calculatePartPeriodReward( payoutStart_, startTime_, interval_, initialAmount_, decreaseAmount_, true ); uint256 secondPeriodReward_ = _calculateFullPeriodReward( payoutStart_, startTime_, endTime_, interval_, initialAmount_, decreaseAmount_ ); uint256 thirdPeriodReward_ = _calculatePartPeriodReward( payoutStart_, endTime_, interval_, initialAmount_, decreaseAmount_, false ); return firstPeriodReward_ + secondPeriodReward_ + thirdPeriodReward_; } function _calculateMaxEndTime( uint128 payoutStart_, uint128 interval_, uint256 initialAmount_, uint256 decreaseAmount_ ) private pure returns (uint128) { if (decreaseAmount_ == 0) { return type(uint128).max; } uint256 maxIntervals_ = _divideCeil(initialAmount_, decreaseAmount_); return uint128(payoutStart_ + maxIntervals_ * interval_); } function _calculatePartPeriodReward( uint128 payoutStart_, uint128 startTime_, uint128 interval_, uint256 initialAmount_, uint256 decreaseAmount_, bool toEnd_ ) private pure returns (uint256) { uint256 intervalsPassed_ = (startTime_ - payoutStart_) / interval_; uint256 decreaseRewardAmount_ = intervalsPassed_ * decreaseAmount_; if (decreaseRewardAmount_ >= initialAmount_) { return 0; } uint256 intervalFullReward_ = initialAmount_ - decreaseRewardAmount_; uint256 intervalPart_; if (toEnd_) { intervalPart_ = interval_ * (intervalsPassed_ + 1) + payoutStart_ - startTime_; } else { intervalPart_ = startTime_ - interval_ * intervalsPassed_ - payoutStart_; } if (intervalPart_ == interval_) { return 0; } return (intervalFullReward_ * intervalPart_) / interval_; } function _calculateFullPeriodReward( uint128 payoutStart_, uint128 startTime_, uint128 endTime_, uint128 interval_, uint256 initialAmount_, uint256 decreaseAmount_ ) private pure returns (uint256) { // START calculate initial reward when period start uint256 timePassedBefore_ = startTime_ - payoutStart_; uint256 intervalsPassedBefore_ = _divideCeil(timePassedBefore_, interval_); uint256 decreaseRewardAmount_ = intervalsPassedBefore_ * decreaseAmount_; if (decreaseRewardAmount_ >= initialAmount_) { return 0; } uint256 initialReward_ = initialAmount_ - decreaseRewardAmount_; // END // Intervals passed uint256 ip_ = ((endTime_ - payoutStart_ - intervalsPassedBefore_ * interval_) / interval_); if (ip_ == 0) { return 0; } return initialReward_ * ip_ - (decreaseAmount_ * (ip_ * (ip_ - 1))) / 2; } function _divideCeil(uint256 a_, uint256 b_) private pure returns (uint256) { return (a_ + b_ - 1) / b_; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
[{"inputs":[{"internalType":"uint256","name":"initialAmount_","type":"uint256"},{"internalType":"uint256","name":"decreaseAmount_","type":"uint256"},{"internalType":"uint128","name":"payoutStart_","type":"uint128"},{"internalType":"uint128","name":"interval_","type":"uint128"},{"internalType":"uint128","name":"startTime_","type":"uint128"},{"internalType":"uint128","name":"endTime_","type":"uint128"}],"name":"getPeriodReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
61062361003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80638ef1035b1461003a575b600080fd5b61004d6100483660046104bd565b61005f565b60405190815260200160405180910390f35b6000836001600160801b031660000361007a575060006101f8565b846001600160801b0316836001600160801b03161015610098578492505b60006100a686868a8a610202565b9050806001600160801b0316836001600160801b031611156100c6578092505b826001600160801b0316846001600160801b0316106100e95760009150506101f8565b60006100f58786610539565b6001600160801b031690508561010b8886610539565b6101159190610576565b6001600160801b0316866001600160801b031682610133919061059c565b036101a357600061014d6001600160801b0388168361059c565b9050600061015b8a836105b0565b610165908c6105c7565b90506001600160801b03881661017b8888610539565b61018e906001600160801b0316836105b0565b610198919061059c565b9450505050506101f8565b60006101b48887898d8d600161025a565b905060006101c68988888b8f8f610383565b905060006101d98a888b8f8f600061025a565b9050806101e683856105da565b6101f091906105da565b955050505050505b9695505050505050565b60008160000361021a57506001600160801b03610252565b60006102268484610475565b905061023b6001600160801b038616826105b0565b61024e906001600160801b0388166105da565b9150505b949350505050565b600080856102688989610539565b6102729190610576565b6001600160801b03169050600061028985836105b0565b905085811061029d576000925050506101f8565b60006102a982886105c7565b9050600085156102fa576001600160801b03808b16908c166102cc8660016105da565b6102df906001600160801b038d166105b0565b6102e991906105da565b6102f391906105c7565b9050610339565b8a6001600160801b0316848a6001600160801b031661031991906105b0565b61032c906001600160801b038d166105c7565b61033691906105c7565b90505b886001600160801b031681036103565760009450505050506101f8565b6001600160801b03891661036a82846105b0565b610374919061059c565b9b9a5050505050505050505050565b6000806103908888610539565b6001600160801b0316905060006103b082876001600160801b0316610475565b905060006103be85836105b0565b90508581106103d357600093505050506101f8565b60006103df82886105c7565b905060006001600160801b0389166103f781866105b0565b6104018e8d610539565b6001600160801b031661041491906105c7565b61041e919061059c565b905080600003610436576000955050505050506101f8565b60026104436001836105c7565b61044d90836105b0565b61045790896105b0565b610461919061059c565b61046b82846105b0565b6101f091906105c7565b600081600161048482866105da565b61048e91906105c7565b610498919061059c565b90505b92915050565b80356001600160801b03811681146104b857600080fd5b919050565b60008060008060008060c087890312156104d657600080fd5b86359550602087013594506104ed604088016104a1565b93506104fb606088016104a1565b9250610509608088016104a1565b915061051760a088016104a1565b90509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6001600160801b0382811682821603908082111561055957610559610523565b5092915050565b634e487b7160e01b600052601260045260246000fd5b60006001600160801b038084168061059057610590610560565b92169190910492915050565b6000826105ab576105ab610560565b500490565b808202811582820484141761049b5761049b610523565b8181038181111561049b5761049b610523565b8082018082111561049b5761049b61052356fea2646970667358221220671bd0dc858fbf147b74f11442f6ad73d10ea6e32e65250cc340a4f101065b8864736f6c63430008160033
Deployed Bytecode
0x73da4170622a6083139e412bddad39ebd921d4979d30146080604052600436106100355760003560e01c80638ef1035b1461003a575b600080fd5b61004d6100483660046104bd565b61005f565b60405190815260200160405180910390f35b6000836001600160801b031660000361007a575060006101f8565b846001600160801b0316836001600160801b03161015610098578492505b60006100a686868a8a610202565b9050806001600160801b0316836001600160801b031611156100c6578092505b826001600160801b0316846001600160801b0316106100e95760009150506101f8565b60006100f58786610539565b6001600160801b031690508561010b8886610539565b6101159190610576565b6001600160801b0316866001600160801b031682610133919061059c565b036101a357600061014d6001600160801b0388168361059c565b9050600061015b8a836105b0565b610165908c6105c7565b90506001600160801b03881661017b8888610539565b61018e906001600160801b0316836105b0565b610198919061059c565b9450505050506101f8565b60006101b48887898d8d600161025a565b905060006101c68988888b8f8f610383565b905060006101d98a888b8f8f600061025a565b9050806101e683856105da565b6101f091906105da565b955050505050505b9695505050505050565b60008160000361021a57506001600160801b03610252565b60006102268484610475565b905061023b6001600160801b038616826105b0565b61024e906001600160801b0388166105da565b9150505b949350505050565b600080856102688989610539565b6102729190610576565b6001600160801b03169050600061028985836105b0565b905085811061029d576000925050506101f8565b60006102a982886105c7565b9050600085156102fa576001600160801b03808b16908c166102cc8660016105da565b6102df906001600160801b038d166105b0565b6102e991906105da565b6102f391906105c7565b9050610339565b8a6001600160801b0316848a6001600160801b031661031991906105b0565b61032c906001600160801b038d166105c7565b61033691906105c7565b90505b886001600160801b031681036103565760009450505050506101f8565b6001600160801b03891661036a82846105b0565b610374919061059c565b9b9a5050505050505050505050565b6000806103908888610539565b6001600160801b0316905060006103b082876001600160801b0316610475565b905060006103be85836105b0565b90508581106103d357600093505050506101f8565b60006103df82886105c7565b905060006001600160801b0389166103f781866105b0565b6104018e8d610539565b6001600160801b031661041491906105c7565b61041e919061059c565b905080600003610436576000955050505050506101f8565b60026104436001836105c7565b61044d90836105b0565b61045790896105b0565b610461919061059c565b61046b82846105b0565b6101f091906105c7565b600081600161048482866105da565b61048e91906105c7565b610498919061059c565b90505b92915050565b80356001600160801b03811681146104b857600080fd5b919050565b60008060008060008060c087890312156104d657600080fd5b86359550602087013594506104ed604088016104a1565b93506104fb606088016104a1565b9250610509608088016104a1565b915061051760a088016104a1565b90509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6001600160801b0382811682821603908082111561055957610559610523565b5092915050565b634e487b7160e01b600052601260045260246000fd5b60006001600160801b038084168061059057610590610560565b92169190910492915050565b6000826105ab576105ab610560565b500490565b808202811582820484141761049b5761049b610523565b8181038181111561049b5761049b610523565b8082018082111561049b5761049b61052356fea2646970667358221220671bd0dc858fbf147b74f11442f6ad73d10ea6e32e65250cc340a4f101065b8864736f6c63430008160033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.