Contract
0xc20DE37170B45774e6CD3d2304017fc962f27252
2
Contract Overview
My Name Tag:
Not Available
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x381a3d5333e70dade0fe1097d1b02661990ce179a2f567dd231799c7899741bc | 0x60806040 | 6253359 | 97 days 22 hrs ago | 0xb5af4138f0f33be0d6414eb25271b9c2dc245fb5 | IN | Create: Minter | 0 ETH | 0.015385125238 ETH |
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
Minter
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "./zeppelin/Pausable.sol"; abstract contract IController is Pausable { event SetContractInfo(bytes32 id, address contractAddress, bytes20 gitCommitHash); function setContractInfo( bytes32 _id, address _contractAddress, bytes20 _gitCommitHash ) external virtual; function updateController(bytes32 _id, address _controller) external virtual; function getContract(bytes32 _id) public view virtual returns (address); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface IManager { event SetController(address controller); event ParameterUpdate(string param); function setController(address _controller) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "./IManager.sol"; import "./IController.sol"; contract Manager is IManager { // Controller that contract is registered with IController public controller; // Check if sender is controller modifier onlyController() { _onlyController(); _; } // Check if sender is controller owner modifier onlyControllerOwner() { _onlyControllerOwner(); _; } // Check if controller is not paused modifier whenSystemNotPaused() { _whenSystemNotPaused(); _; } // Check if controller is paused modifier whenSystemPaused() { _whenSystemPaused(); _; } constructor(address _controller) { controller = IController(_controller); } /** * @notice Set controller. Only callable by current controller * @param _controller Controller contract address */ function setController(address _controller) external onlyController { controller = IController(_controller); emit SetController(_controller); } function _onlyController() private view { require(msg.sender == address(controller), "caller must be Controller"); } function _onlyControllerOwner() private view { require(msg.sender == controller.owner(), "caller must be Controller owner"); } function _whenSystemNotPaused() private view { require(!controller.paused(), "system is paused"); } function _whenSystemPaused() private view { require(controller.paused(), "system is not paused"); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; /** * @title Interface for BondingManager * TODO: switch to interface type */ interface IBondingManager { event TranscoderUpdate(address indexed transcoder, uint256 rewardCut, uint256 feeShare); event TranscoderActivated(address indexed transcoder, uint256 activationRound); event TranscoderDeactivated(address indexed transcoder, uint256 deactivationRound); event TranscoderSlashed(address indexed transcoder, address finder, uint256 penalty, uint256 finderReward); event Reward(address indexed transcoder, uint256 amount); event Bond( address indexed newDelegate, address indexed oldDelegate, address indexed delegator, uint256 additionalAmount, uint256 bondedAmount ); event Unbond( address indexed delegate, address indexed delegator, uint256 unbondingLockId, uint256 amount, uint256 withdrawRound ); event Rebond(address indexed delegate, address indexed delegator, uint256 unbondingLockId, uint256 amount); event TransferBond( address indexed oldDelegator, address indexed newDelegator, uint256 oldUnbondingLockId, uint256 newUnbondingLockId, uint256 amount ); event WithdrawStake(address indexed delegator, uint256 unbondingLockId, uint256 amount, uint256 withdrawRound); event WithdrawFees(address indexed delegator, address recipient, uint256 amount); event EarningsClaimed( address indexed delegate, address indexed delegator, uint256 rewards, uint256 fees, uint256 startRound, uint256 endRound ); // Deprecated events // These event signatures can be used to construct the appropriate topic hashes to filter for past logs corresponding // to these deprecated events. // event Bond(address indexed delegate, address indexed delegator); // event Unbond(address indexed delegate, address indexed delegator); // event WithdrawStake(address indexed delegator); // event TranscoderUpdate(address indexed transcoder, uint256 pendingRewardCut, uint256 pendingFeeShare, uint256 pendingPricePerSegment, bool registered); // event TranscoderEvicted(address indexed transcoder); // event TranscoderResigned(address indexed transcoder); // External functions function updateTranscoderWithFees( address _transcoder, uint256 _fees, uint256 _round ) external; function slashTranscoder( address _transcoder, address _finder, uint256 _slashAmount, uint256 _finderFee ) external; function setCurrentRoundTotalActiveStake() external; // Public functions function getTranscoderPoolSize() external view returns (uint256); function transcoderTotalStake(address _transcoder) external view returns (uint256); function isActiveTranscoder(address _transcoder) external view returns (bool); function getTotalBonded() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; library MathUtils { using SafeMath for uint256; // Divisor used for representing percentages uint256 public constant PERC_DIVISOR = 1000000000; /** * @dev Returns whether an amount is a valid percentage out of PERC_DIVISOR * @param _amount Amount that is supposed to be a percentage */ function validPerc(uint256 _amount) internal pure returns (bool) { return _amount <= PERC_DIVISOR; } /** * @dev Compute percentage of a value with the percentage represented by a fraction * @param _amount Amount to take the percentage of * @param _fracNum Numerator of fraction representing the percentage * @param _fracDenom Denominator of fraction representing the percentage */ function percOf( uint256 _amount, uint256 _fracNum, uint256 _fracDenom ) internal pure returns (uint256) { return _amount.mul(percPoints(_fracNum, _fracDenom)).div(PERC_DIVISOR); } /** * @dev Compute percentage of a value with the percentage represented by a fraction over PERC_DIVISOR * @param _amount Amount to take the percentage of * @param _fracNum Numerator of fraction representing the percentage with PERC_DIVISOR as the denominator */ function percOf(uint256 _amount, uint256 _fracNum) internal pure returns (uint256) { return _amount.mul(_fracNum).div(PERC_DIVISOR); } /** * @dev Compute percentage representation of a fraction * @param _fracNum Numerator of fraction represeting the percentage * @param _fracDenom Denominator of fraction represeting the percentage */ function percPoints(uint256 _fracNum, uint256 _fracDenom) internal pure returns (uint256) { return _fracNum.mul(PERC_DIVISOR).div(_fracDenom); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; /** * @title RoundsManager interface */ interface IRoundsManager { // Events event NewRound(uint256 indexed round, bytes32 blockHash); // Deprecated events // These event signatures can be used to construct the appropriate topic hashes to filter for past logs corresponding // to these deprecated events. // event NewRound(uint256 round) // External functions function initializeRound() external; function lipUpgradeRound(uint256 _lip) external view returns (uint256); // Public functions function blockNum() external view returns (uint256); function blockHash(uint256 _block) external view returns (bytes32); function blockHashForRound(uint256 _round) external view returns (bytes32); function currentRound() external view returns (uint256); function currentRoundStartBlock() external view returns (uint256); function currentRoundInitialized() external view returns (bool); function currentRoundLocked() external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface ILivepeerToken is IERC20 { function mint(address _to, uint256 _amount) external; function burn(uint256 _amount) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "../IController.sol"; /** * @title Minter interface */ interface IMinter { // Events event SetCurrentRewardTokens(uint256 currentMintableTokens, uint256 currentInflation); // External functions function createReward(uint256 _fracNum, uint256 _fracDenom) external returns (uint256); function trustedTransferTokens(address _to, uint256 _amount) external; function trustedBurnTokens(uint256 _amount) external; function trustedWithdrawETH(address payable _to, uint256 _amount) external; function depositETH() external payable returns (bool); function setCurrentRewardTokens() external; function currentMintableTokens() external view returns (uint256); function currentMintedTokens() external view returns (uint256); // Public functions function getController() external view returns (IController); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "../Manager.sol"; import "./IMinter.sol"; import "./ILivepeerToken.sol"; import "../rounds/IRoundsManager.sol"; import "../bonding/IBondingManager.sol"; import "../libraries/MathUtilsV2.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; interface IL2LPTDataCache { function l1CirculatingSupply() external view returns (uint256); } /** * @title Minter * @dev Manages inflation rate and the minting of new tokens for each round of the Livepeer protocol */ contract Minter is Manager, IMinter { using SafeMath for uint256; // Per round inflation rate uint256 public inflation; // Change in inflation rate per round until the target bonding rate is achieved uint256 public inflationChange; // Target bonding rate uint256 public targetBondingRate; // Current number of mintable tokens. Reset every round uint256 public currentMintableTokens; // Current number of minted tokens. Reset every round uint256 public currentMintedTokens; // Checks if caller is BondingManager modifier onlyBondingManager() { require(msg.sender == controller.getContract(keccak256("BondingManager")), "msg.sender not BondingManager"); _; } // Checks if caller is RoundsManager modifier onlyRoundsManager() { require(msg.sender == controller.getContract(keccak256("RoundsManager")), "msg.sender not RoundsManager"); _; } // Checks if caller is either BondingManager or JobsManager modifier onlyBondingManagerOrJobsManager() { require( msg.sender == controller.getContract(keccak256("BondingManager")) || msg.sender == controller.getContract(keccak256("JobsManager")), "msg.sender not BondingManager or JobsManager" ); _; } // Checks if caller is either the currently registered Minter or JobsManager modifier onlyMinterOrJobsManager() { require( msg.sender == controller.getContract(keccak256("Minter")) || msg.sender == controller.getContract(keccak256("JobsManager")), "msg.sender not Minter or JobsManager" ); _; } /** * @notice Minter constructor * @param _inflation Base inflation rate as a percentage of current total token supply * @param _inflationChange Change in inflation rate each round (increase or decrease) if target bonding rate is not achieved * @param _targetBondingRate Target bonding rate as a percentage of total bonded tokens / total token supply */ constructor( address _controller, uint256 _inflation, uint256 _inflationChange, uint256 _targetBondingRate ) Manager(_controller) { // Inflation must be valid percentage require(MathUtils.validPerc(_inflation), "_inflation is invalid percentage"); // Inflation change must be valid percentage require(MathUtils.validPerc(_inflationChange), "_inflationChange is invalid percentage"); // Target bonding rate must be valid percentage require(MathUtils.validPerc(_targetBondingRate), "_targetBondingRate is invalid percentage"); inflation = _inflation; inflationChange = _inflationChange; targetBondingRate = _targetBondingRate; } /** * @notice Set targetBondingRate. Only callable by Controller owner * @param _targetBondingRate Target bonding rate as a percentage of total bonded tokens / total token supply */ function setTargetBondingRate(uint256 _targetBondingRate) external onlyControllerOwner { // Must be valid percentage require(MathUtils.validPerc(_targetBondingRate), "_targetBondingRate is invalid percentage"); targetBondingRate = _targetBondingRate; emit ParameterUpdate("targetBondingRate"); } /** * @notice Set inflationChange. Only callable by Controller owner * @param _inflationChange Inflation change as a percentage of total token supply */ function setInflationChange(uint256 _inflationChange) external onlyControllerOwner { // Must be valid percentage require(MathUtils.validPerc(_inflationChange), "_inflationChange is invalid percentage"); inflationChange = _inflationChange; emit ParameterUpdate("inflationChange"); } /** * @notice Migrate to a new Minter by transferring the current Minter's LPT + ETH balance to the new Minter * @dev Only callable by Controller owner * @param _newMinter Address of new Minter */ function migrateToNewMinter(IMinter _newMinter) external onlyControllerOwner { // New Minter cannot be the current Minter require(_newMinter != this, "new Minter cannot be current Minter"); // Check for null address require(address(_newMinter) != address(0), "new Minter cannot be null address"); IController newMinterController = _newMinter.getController(); // New Minter must have same Controller as current Minter require(newMinterController == controller, "new Minter Controller must be current Controller"); // New Minter's Controller must have the current Minter registered require(newMinterController.getContract(keccak256("Minter")) == address(this), "new Minter must be registered"); // Transfer current Minter's token balance to new Minter livepeerToken().transfer(address(_newMinter), livepeerToken().balanceOf(address(this))); // Transfer current Minter's ETH balance to new Minter _newMinter.depositETH{ value: address(this).balance }(); } /** * @notice Create reward based on a fractional portion of the mintable tokens for the current round * @param _fracNum Numerator of fraction (active transcoder's stake) * @param _fracDenom Denominator of fraction (total active stake) */ function createReward(uint256 _fracNum, uint256 _fracDenom) external onlyBondingManager whenSystemNotPaused returns (uint256) { // Compute and mint fraction of mintable tokens to include in reward uint256 mintAmount = MathUtils.percOf(currentMintableTokens, _fracNum, _fracDenom); // Update amount of minted tokens for round currentMintedTokens = currentMintedTokens.add(mintAmount); // Minted tokens must not exceed mintable tokens require(currentMintedTokens <= currentMintableTokens, "minted tokens cannot exceed mintable tokens"); // Mint new tokens livepeerToken().mint(address(this), mintAmount); // Reward = minted tokens return mintAmount; } /** * @notice Transfer tokens to a receipient. Only callable by BondingManager - always trusts BondingManager * @param _to Recipient address * @param _amount Amount of tokens */ function trustedTransferTokens(address _to, uint256 _amount) external onlyBondingManager whenSystemNotPaused { livepeerToken().transfer(_to, _amount); } /** * @notice Burn tokens. Only callable by BondingManager - always trusts BondingManager * @param _amount Amount of tokens to burn */ function trustedBurnTokens(uint256 _amount) external onlyBondingManager whenSystemNotPaused { livepeerToken().burn(_amount); } /** * @notice Withdraw ETH to a recipient. Only callable by BondingManager or TicketBroker - always trusts these two contracts * @param _to Recipient address * @param _amount Amount of ETH */ function trustedWithdrawETH(address payable _to, uint256 _amount) external onlyBondingManagerOrJobsManager whenSystemNotPaused { _to.transfer(_amount); } /** * @notice Deposit ETH to this contract. Only callable by the currently registered Minter or JobsManager */ function depositETH() external payable onlyMinterOrJobsManager returns (bool) { return true; } /** * @notice Set inflation and mintable tokens for the round. Only callable by the RoundsManager */ function setCurrentRewardTokens() external onlyRoundsManager whenSystemNotPaused { setInflation(); // Set mintable tokens based upon current inflation and current total token supply currentMintableTokens = MathUtils.percOf(getGlobalTotalSupply(), inflation); currentMintedTokens = 0; emit SetCurrentRewardTokens(currentMintableTokens, inflation); } /** * @dev Returns Controller interface */ function getController() public view returns (IController) { return controller; } /** * @notice Calculate and return global LPT total supply * @return Global LPT total supply */ function getGlobalTotalSupply() public view returns (uint256) { // Global total supply = L2 total supply + L1 circulating supply return livepeerToken().totalSupply().add(l2LPTDataCache().l1CirculatingSupply()); } /** * @dev Set inflation based upon the current bonding rate and target bonding rate */ function setInflation() internal { uint256 currentBondingRate; uint256 totalSupply = getGlobalTotalSupply(); if (totalSupply > 0) { uint256 totalBonded = bondingManager().getTotalBonded(); currentBondingRate = MathUtils.percPoints(totalBonded, totalSupply); } if (currentBondingRate < targetBondingRate) { // Bonding rate is below the target - increase inflation inflation = inflation.add(inflationChange); } else if (currentBondingRate > targetBondingRate) { // Bonding rate is above the target - decrease inflation if (inflationChange > inflation) { inflation = 0; } else { inflation = inflation.sub(inflationChange); } } } /** * @dev Returns LivepeerToken interface */ function livepeerToken() internal view returns (ILivepeerToken) { return ILivepeerToken(controller.getContract(keccak256("LivepeerToken"))); } /** * @dev Returns BondingManager interface */ function bondingManager() internal view returns (IBondingManager) { return IBondingManager(controller.getContract(keccak256("BondingManager"))); } /** * @dev Returns L2LPTDataCache interface */ function l2LPTDataCache() internal view returns (IL2LPTDataCache) { return IL2LPTDataCache(controller.getContract(keccak256("L2LPTDataCache"))); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { require(newOwner != address(0)); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "./Ownable.sol"; /** * @title Pausable * @dev Base contract which allows children to implement an emergency stop mechanism. */ contract Pausable is Ownable { event Pause(); event Unpause(); bool public paused; /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!paused); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(paused); _; } /** * @dev called by the owner to pause, triggers stopped state */ function pause() public onlyOwner whenNotPaused { paused = true; emit Pause(); } /** * @dev called by the owner to unpause, returns to normal state */ function unpause() public onlyOwner whenPaused { paused = false; emit Unpause(); } }
{ "evmVersion": "london", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
[{"inputs":[{"internalType":"address","name":"_controller","type":"address"},{"internalType":"uint256","name":"_inflation","type":"uint256"},{"internalType":"uint256","name":"_inflationChange","type":"uint256"},{"internalType":"uint256","name":"_targetBondingRate","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"param","type":"string"}],"name":"ParameterUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"controller","type":"address"}],"name":"SetController","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"currentMintableTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentInflation","type":"uint256"}],"name":"SetCurrentRewardTokens","type":"event"},{"inputs":[],"name":"controller","outputs":[{"internalType":"contract IController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fracNum","type":"uint256"},{"internalType":"uint256","name":"_fracDenom","type":"uint256"}],"name":"createReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentMintableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentMintedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositETH","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getController","outputs":[{"internalType":"contract IController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGlobalTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inflation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inflationChange","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IMinter","name":"_newMinter","type":"address"}],"name":"migrateToNewMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setCurrentRewardTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_inflationChange","type":"uint256"}],"name":"setInflationChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_targetBondingRate","type":"uint256"}],"name":"setTargetBondingRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"targetBondingRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"trustedBurnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"trustedTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"trustedWithdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162001c8038038062001c808339810160408190526200003491620001bd565b600080546001600160a01b0319166001600160a01b0386161790556200006683620001b3602090811b620013ae17901c565b620000b85760405162461bcd60e51b815260206004820181905260248201527f5f696e666c6174696f6e20697320696e76616c69642070657263656e7461676560448201526064015b60405180910390fd5b620000ce82620001b360201b620013ae1760201c565b6200012b5760405162461bcd60e51b815260206004820152602660248201527f5f696e666c6174696f6e4368616e676520697320696e76616c69642070657263604482015265656e7461676560d01b6064820152608401620000af565b6200014181620001b360201b620013ae1760201c565b620001a05760405162461bcd60e51b815260206004820152602860248201527f5f746172676574426f6e64696e675261746520697320696e76616c69642070656044820152677263656e7461676560c01b6064820152608401620000af565b600192909255600255600355506200020a565b633b9aca00101590565b60008060008060808587031215620001d457600080fd5b84516001600160a01b0381168114620001ec57600080fd5b60208601516040870151606090970151919890975090945092505050565b611a66806200021a6000396000f3fe6080604052600436106101095760003560e01c806392eefe9b11610095578063c7ee98c211610064578063c7ee98c214610298578063e7a49c2b146102b8578063ece2064c146102d8578063f6326fb3146102ed578063f77c47911461030557600080fd5b806392eefe9b146102365780639ae6309a14610256578063a7c835141461026c578063be0522e01461028257600080fd5b80633018205f116100dc5780633018205f146101995780635507442d146101cb57806377bde142146101e05780637dbedad514610200578063821b771f1461022057600080fd5b8063010e3c1c1461010e57806318d217ad1461013057806320283da9146101505780632de22cdb14610170575b600080fd5b34801561011a57600080fd5b5061012e61012936600461185f565b610325565b005b34801561013c57600080fd5b5061012e61014b366004611890565b6103fd565b34801561015c57600080fd5b5061012e61016b3660046118ad565b610835565b34801561017c57600080fd5b5061018660055481565b6040519081526020015b60405180910390f35b3480156101a557600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610190565b3480156101d757600080fd5b50610186610a27565b3480156101ec57600080fd5b5061012e6101fb36600461185f565b610b27565b34801561020c57600080fd5b5061018661021b3660046118d9565b610bf3565b34801561022c57600080fd5b5061018660035481565b34801561024257600080fd5b5061012e610251366004611890565b610db0565b34801561026257600080fd5b5061018660045481565b34801561027857600080fd5b5061018660025481565b34801561028e57600080fd5b5061018660015481565b3480156102a457600080fd5b5061012e6102b336600461185f565b610e06565b3480156102c457600080fd5b5061012e6102d33660046118ad565b610f31565b3480156102e457600080fd5b5061012e61107e565b6102f56111ea565b6040519015158152602001610190565b34801561031157600080fd5b506000546101b3906001600160a01b031681565b61032d6113b8565b61033b81633b9aca00101590565b61039b5760405162461bcd60e51b815260206004820152602660248201527f5f696e666c6174696f6e4368616e676520697320696e76616c69642070657263604482015265656e7461676560d01b60648201526084015b60405180910390fd5b60028190556040517f9f5033568d78ae30f29f01e944f97b2216493bd19d1b46d429673acff3dcd674906103f2906020808252600f908201526e696e666c6174696f6e4368616e676560881b604082015260600190565b60405180910390a150565b6104056113b8565b6001600160a01b03811630141561046a5760405162461bcd60e51b815260206004820152602360248201527f6e6577204d696e7465722063616e6e6f742062652063757272656e74204d696e6044820152623a32b960e91b6064820152608401610392565b6001600160a01b0381166104ca5760405162461bcd60e51b815260206004820152602160248201527f6e6577204d696e7465722063616e6e6f74206265206e756c6c206164647265736044820152607360f81b6064820152608401610392565b6000816001600160a01b0316633018205f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561050557600080fd5b505afa158015610519573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053d91906118fb565b6000549091506001600160a01b038083169116146105b65760405162461bcd60e51b815260206004820152603060248201527f6e6577204d696e74657220436f6e74726f6c6c6572206d75737420626520637560448201526f393932b73a1021b7b73a3937b63632b960811b6064820152608401610392565b604051631c2d8fb360e31b81527f6e58ad548d72b425ea94c15f453bf26caddb061d82b2551db7fdd3cefe0e9940600482015230906001600160a01b0383169063e16c7d989060240160206040518083038186803b15801561061757600080fd5b505afa15801561062b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064f91906118fb565b6001600160a01b0316146106a55760405162461bcd60e51b815260206004820152601d60248201527f6e6577204d696e746572206d75737420626520726567697374657265640000006044820152606401610392565b6106ad61149e565b6001600160a01b031663a9059cbb836106c461149e565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a082319060240160206040518083038186803b15801561070557600080fd5b505afa158015610719573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073d9190611918565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561078357600080fd5b505af1158015610797573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107bb9190611931565b50816001600160a01b031663f6326fb3476040518263ffffffff1660e01b81526004016020604051808303818588803b1580156107f757600080fd5b505af115801561080b573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906108309190611931565b505050565b600054604051631c2d8fb360e31b8152600080516020611a1183398151915260048201526001600160a01b039091169063e16c7d989060240160206040518083038186803b15801561088657600080fd5b505afa15801561089a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108be91906118fb565b6001600160a01b0316336001600160a01b031614806109885750600054604051631c2d8fb360e31b81527f3d7456535a3155a46f15a2313c3915bd07137ffdc56464f4fc9a82bae7215c2d60048201526001600160a01b039091169063e16c7d989060240160206040518083038186803b15801561093b57600080fd5b505afa15801561094f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097391906118fb565b6001600160a01b0316336001600160a01b0316145b6109e95760405162461bcd60e51b815260206004820152602c60248201527f6d73672e73656e646572206e6f7420426f6e64696e674d616e61676572206f7260448201526b102537b139a6b0b730b3b2b960a11b6064820152608401610392565b6109f161153b565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610830573d6000803e3d6000fd5b6000610b22610a346115ff565b6001600160a01b031663fb1c5ee96040518163ffffffff1660e01b815260040160206040518083038186803b158015610a6c57600080fd5b505afa158015610a80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa49190611918565b610aac61149e565b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ae457600080fd5b505afa158015610af8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1c9190611918565b90611650565b905090565b610b2f6113b8565b610b3d81633b9aca00101590565b610b9a5760405162461bcd60e51b815260206004820152602860248201527f5f746172676574426f6e64696e675261746520697320696e76616c69642070656044820152677263656e7461676560c01b6064820152608401610392565b60038190556040517f9f5033568d78ae30f29f01e944f97b2216493bd19d1b46d429673acff3dcd674906103f290602080825260119082015270746172676574426f6e64696e675261746560781b604082015260600190565b60008054604051631c2d8fb360e31b8152600080516020611a1183398151915260048201526001600160a01b039091169063e16c7d989060240160206040518083038186803b158015610c4557600080fd5b505afa158015610c59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7d91906118fb565b6001600160a01b0316336001600160a01b031614610cad5760405162461bcd60e51b815260040161039290611953565b610cb561153b565b6000610cc46004548585611663565b600554909150610cd49082611650565b60058190556004541015610d3e5760405162461bcd60e51b815260206004820152602b60248201527f6d696e74656420746f6b656e732063616e6e6f7420657863656564206d696e7460448201526a61626c6520746f6b656e7360a81b6064820152608401610392565b610d4661149e565b6040516340c10f1960e01b8152306004820152602481018390526001600160a01b0391909116906340c10f1990604401600060405180830381600087803b158015610d9057600080fd5b505af1158015610da4573d6000803e3d6000fd5b50929695505050505050565b610db861168f565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527f4ff638452bbf33c012645d18ae6f05515ff5f2d1dfb0cece8cbf018c60903f70906020016103f2565b600054604051631c2d8fb360e31b8152600080516020611a1183398151915260048201526001600160a01b039091169063e16c7d989060240160206040518083038186803b158015610e5757600080fd5b505afa158015610e6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8f91906118fb565b6001600160a01b0316336001600160a01b031614610ebf5760405162461bcd60e51b815260040161039290611953565b610ec761153b565b610ecf61149e565b6001600160a01b03166342966c68826040518263ffffffff1660e01b8152600401610efc91815260200190565b600060405180830381600087803b158015610f1657600080fd5b505af1158015610f2a573d6000803e3d6000fd5b5050505050565b600054604051631c2d8fb360e31b8152600080516020611a1183398151915260048201526001600160a01b039091169063e16c7d989060240160206040518083038186803b158015610f8257600080fd5b505afa158015610f96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fba91906118fb565b6001600160a01b0316336001600160a01b031614610fea5760405162461bcd60e51b815260040161039290611953565b610ff261153b565b610ffa61149e565b60405163a9059cbb60e01b81526001600160a01b03848116600483015260248201849052919091169063a9059cbb90604401602060405180830381600087803b15801561104657600080fd5b505af115801561105a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108309190611931565b600054604051631c2d8fb360e31b81527fe8438ea868df48e3fc21f2f087b993c9b1837dc0f6135064161ce7d7a1701fe860048201526001600160a01b039091169063e16c7d989060240160206040518083038186803b1580156110e157600080fd5b505afa1580156110f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111991906118fb565b6001600160a01b0316336001600160a01b0316146111795760405162461bcd60e51b815260206004820152601c60248201527f6d73672e73656e646572206e6f7420526f756e64734d616e61676572000000006044820152606401610392565b61118161153b565b6111896116e9565b61119c611194610a27565b6001546117d8565b600481905560006005556001546040517f39567a366345edf17f50c1967a31b597745186c4632f34c4f8ebe06b6890784d926111e092908252602082015260400190565b60405180910390a1565b60008054604051631c2d8fb360e31b81527f6e58ad548d72b425ea94c15f453bf26caddb061d82b2551db7fdd3cefe0e994060048201526001600160a01b039091169063e16c7d989060240160206040518083038186803b15801561124e57600080fd5b505afa158015611262573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128691906118fb565b6001600160a01b0316336001600160a01b031614806113505750600054604051631c2d8fb360e31b81527f3d7456535a3155a46f15a2313c3915bd07137ffdc56464f4fc9a82bae7215c2d60048201526001600160a01b039091169063e16c7d989060240160206040518083038186803b15801561130357600080fd5b505afa158015611317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b91906118fb565b6001600160a01b0316336001600160a01b0316145b6113a85760405162461bcd60e51b8152602060048201526024808201527f6d73672e73656e646572206e6f74204d696e746572206f72204a6f62734d616e60448201526330b3b2b960e11b6064820152608401610392565b50600190565b633b9aca00101590565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561140457600080fd5b505afa158015611418573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143c91906118fb565b6001600160a01b0316336001600160a01b03161461149c5760405162461bcd60e51b815260206004820152601f60248201527f63616c6c6572206d75737420626520436f6e74726f6c6c6572206f776e6572006044820152606401610392565b565b60008054604051631c2d8fb360e31b81527f3443e257065fe41dd0e4d1f5a1b73a22a62e300962b57f30cddf41d0f8273ba760048201526001600160a01b039091169063e16c7d98906024015b60206040518083038186803b15801561150357600080fd5b505afa158015611517573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2291906118fb565b60008054906101000a90046001600160a01b03166001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561158757600080fd5b505afa15801561159b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bf9190611931565b1561149c5760405162461bcd60e51b815260206004820152601060248201526f1cde5cdd195b481a5cc81c185d5cd95960821b6044820152606401610392565b60008054604051631c2d8fb360e31b81527f8ecfba413a4e4715a264d70a55d3a35bf60b2954c56759310202f3928162320060048201526001600160a01b039091169063e16c7d98906024016114eb565b600061165c82846119a0565b9392505050565b6000611687633b9aca0061168161167a86866117ec565b87906117fc565b90611808565b949350505050565b6000546001600160a01b0316331461149c5760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206d75737420626520436f6e74726f6c6c6572000000000000006044820152606401610392565b6000806116f4610a27565b90508015611786576000611706611814565b6001600160a01b0316635c50c3566040518163ffffffff1660e01b815260040160206040518083038186803b15801561173e57600080fd5b505afa158015611752573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117769190611918565b905061178281836117ec565b9250505b6003548210156117a65760025460015461179f91611650565b6001555050565b6003548211156117d45760015460025411156117c55760006001555050565b60025460015461179f91611853565b5050565b600061165c633b9aca0061168185856117fc565b600061165c8261168185633b9aca005b600061165c82846119b8565b600061165c82846119d7565b60008054604051631c2d8fb360e31b8152600080516020611a1183398151915260048201526001600160a01b039091169063e16c7d98906024016114eb565b600061165c82846119f9565b60006020828403121561187157600080fd5b5035919050565b6001600160a01b038116811461188d57600080fd5b50565b6000602082840312156118a257600080fd5b813561165c81611878565b600080604083850312156118c057600080fd5b82356118cb81611878565b946020939093013593505050565b600080604083850312156118ec57600080fd5b50508035926020909101359150565b60006020828403121561190d57600080fd5b815161165c81611878565b60006020828403121561192a57600080fd5b5051919050565b60006020828403121561194357600080fd5b8151801515811461165c57600080fd5b6020808252601d908201527f6d73672e73656e646572206e6f7420426f6e64696e674d616e61676572000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156119b3576119b361198a565b500190565b60008160001904831182151516156119d2576119d261198a565b500290565b6000826119f457634e487b7160e01b600052601260045260246000fd5b500490565b600082821015611a0b57611a0b61198a565b50039056fe2517d59a36a86548e38734e8ab416f42afff4bca78706a66ad65750dae7f9e37a2646970667358221220db57b965514cfe4b52b46bdf103e3b470bfc74fa3aa90d88525bf052a4e3455164736f6c63430008090033000000000000000000000000d8e8328501e9645d16cf49539efc04f734606ee40000000000000000000000000000000000000000000000000000000000035d5400000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000001dcd6500
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d8e8328501e9645d16cf49539efc04f734606ee40000000000000000000000000000000000000000000000000000000000035d5400000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000001dcd6500
-----Decoded View---------------
Arg [0] : _controller (address): 0xd8e8328501e9645d16cf49539efc04f734606ee4
Arg [1] : _inflation (uint256): 220500
Arg [2] : _inflationChange (uint256): 500
Arg [3] : _targetBondingRate (uint256): 500000000
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000d8e8328501e9645d16cf49539efc04f734606ee4
Arg [1] : 0000000000000000000000000000000000000000000000000000000000035d54
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [3] : 000000000000000000000000000000000000000000000000000000001dcd6500
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.