Sonic Blaze Testnet

Contract

0x79c625eE0D09BB4db6F46eb0b4D019De56883e89

Overview

S Balance

Sonic Blaze LogoSonic Blaze LogoSonic Blaze Logo0 S

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LinearDistributionIntervalDecrease

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 1 : LinearDistributionIntervalDecrease.sol
// 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_;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "paris",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract ABI

[{"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"}]

61062361003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80638ef1035b1461003a575b600080fd5b61004d6100483660046104bd565b61005f565b60405190815260200160405180910390f35b6000836001600160801b031660000361007a575060006101f8565b846001600160801b0316836001600160801b03161015610098578492505b60006100a686868a8a610202565b9050806001600160801b0316836001600160801b031611156100c6578092505b826001600160801b0316846001600160801b0316106100e95760009150506101f8565b60006100f58786610539565b6001600160801b031690508561010b8886610539565b6101159190610576565b6001600160801b0316866001600160801b031682610133919061059c565b036101a357600061014d6001600160801b0388168361059c565b9050600061015b8a836105b0565b610165908c6105c7565b90506001600160801b03881661017b8888610539565b61018e906001600160801b0316836105b0565b610198919061059c565b9450505050506101f8565b60006101b48887898d8d600161025a565b905060006101c68988888b8f8f610383565b905060006101d98a888b8f8f600061025a565b9050806101e683856105da565b6101f091906105da565b955050505050505b9695505050505050565b60008160000361021a57506001600160801b03610252565b60006102268484610475565b905061023b6001600160801b038616826105b0565b61024e906001600160801b0388166105da565b9150505b949350505050565b600080856102688989610539565b6102729190610576565b6001600160801b03169050600061028985836105b0565b905085811061029d576000925050506101f8565b60006102a982886105c7565b9050600085156102fa576001600160801b03808b16908c166102cc8660016105da565b6102df906001600160801b038d166105b0565b6102e991906105da565b6102f391906105c7565b9050610339565b8a6001600160801b0316848a6001600160801b031661031991906105b0565b61032c906001600160801b038d166105c7565b61033691906105c7565b90505b886001600160801b031681036103565760009450505050506101f8565b6001600160801b03891661036a82846105b0565b610374919061059c565b9b9a5050505050505050505050565b6000806103908888610539565b6001600160801b0316905060006103b082876001600160801b0316610475565b905060006103be85836105b0565b90508581106103d357600093505050506101f8565b60006103df82886105c7565b905060006001600160801b0389166103f781866105b0565b6104018e8d610539565b6001600160801b031661041491906105c7565b61041e919061059c565b905080600003610436576000955050505050506101f8565b60026104436001836105c7565b61044d90836105b0565b61045790896105b0565b610461919061059c565b61046b82846105b0565b6101f091906105c7565b600081600161048482866105da565b61048e91906105c7565b610498919061059c565b90505b92915050565b80356001600160801b03811681146104b857600080fd5b919050565b60008060008060008060c087890312156104d657600080fd5b86359550602087013594506104ed604088016104a1565b93506104fb606088016104a1565b9250610509608088016104a1565b915061051760a088016104a1565b90509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6001600160801b0382811682821603908082111561055957610559610523565b5092915050565b634e487b7160e01b600052601260045260246000fd5b60006001600160801b038084168061059057610590610560565b92169190910492915050565b6000826105ab576105ab610560565b500490565b808202811582820484141761049b5761049b610523565b8181038181111561049b5761049b610523565b8082018082111561049b5761049b61052356fea26469706673582212201ca6405430e3dead47f522aaa6ac076ad53e22c876c54074d59e1228e2e3943564736f6c63430008170033

Deployed Bytecode

0x7379c625ee0d09bb4db6f46eb0b4d019de56883e8930146080604052600436106100355760003560e01c80638ef1035b1461003a575b600080fd5b61004d6100483660046104bd565b61005f565b60405190815260200160405180910390f35b6000836001600160801b031660000361007a575060006101f8565b846001600160801b0316836001600160801b03161015610098578492505b60006100a686868a8a610202565b9050806001600160801b0316836001600160801b031611156100c6578092505b826001600160801b0316846001600160801b0316106100e95760009150506101f8565b60006100f58786610539565b6001600160801b031690508561010b8886610539565b6101159190610576565b6001600160801b0316866001600160801b031682610133919061059c565b036101a357600061014d6001600160801b0388168361059c565b9050600061015b8a836105b0565b610165908c6105c7565b90506001600160801b03881661017b8888610539565b61018e906001600160801b0316836105b0565b610198919061059c565b9450505050506101f8565b60006101b48887898d8d600161025a565b905060006101c68988888b8f8f610383565b905060006101d98a888b8f8f600061025a565b9050806101e683856105da565b6101f091906105da565b955050505050505b9695505050505050565b60008160000361021a57506001600160801b03610252565b60006102268484610475565b905061023b6001600160801b038616826105b0565b61024e906001600160801b0388166105da565b9150505b949350505050565b600080856102688989610539565b6102729190610576565b6001600160801b03169050600061028985836105b0565b905085811061029d576000925050506101f8565b60006102a982886105c7565b9050600085156102fa576001600160801b03808b16908c166102cc8660016105da565b6102df906001600160801b038d166105b0565b6102e991906105da565b6102f391906105c7565b9050610339565b8a6001600160801b0316848a6001600160801b031661031991906105b0565b61032c906001600160801b038d166105c7565b61033691906105c7565b90505b886001600160801b031681036103565760009450505050506101f8565b6001600160801b03891661036a82846105b0565b610374919061059c565b9b9a5050505050505050505050565b6000806103908888610539565b6001600160801b0316905060006103b082876001600160801b0316610475565b905060006103be85836105b0565b90508581106103d357600093505050506101f8565b60006103df82886105c7565b905060006001600160801b0389166103f781866105b0565b6104018e8d610539565b6001600160801b031661041491906105c7565b61041e919061059c565b905080600003610436576000955050505050506101f8565b60026104436001836105c7565b61044d90836105b0565b61045790896105b0565b610461919061059c565b61046b82846105b0565b6101f091906105c7565b600081600161048482866105da565b61048e91906105c7565b610498919061059c565b90505b92915050565b80356001600160801b03811681146104b857600080fd5b919050565b60008060008060008060c087890312156104d657600080fd5b86359550602087013594506104ed604088016104a1565b93506104fb606088016104a1565b9250610509608088016104a1565b915061051760a088016104a1565b90509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6001600160801b0382811682821603908082111561055957610559610523565b5092915050565b634e487b7160e01b600052601260045260246000fd5b60006001600160801b038084168061059057610590610560565b92169190910492915050565b6000826105ab576105ab610560565b500490565b808202811582820484141761049b5761049b610523565b8181038181111561049b5761049b610523565b8082018082111561049b5761049b61052356fea26469706673582212201ca6405430e3dead47f522aaa6ac076ad53e22c876c54074d59e1228e2e3943564736f6c63430008170033

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits

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.