Contract Overview
Latest 25 from a total of 1574 transactions
Contract Name:
LiquidityMiningMaster
Compiler Version
v0.7.6+commit.7338295f
// Sources flattened with hardhat v2.6.8 https://hardhat.org // File @openzeppelin/contracts/math/[email protected] // SPDX-License-Identifier: MIT pragma solidity ^0.7.6; pragma experimental ABIEncoderV2; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ 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) { 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) { 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) { // 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) { 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) { 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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); 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) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @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. 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) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); 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) { require(b > 0, "SafeMath: modulo by zero"); 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) { 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. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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) { 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) { require(b > 0, errorMessage); return a % b; } } // File @openzeppelin/contracts/utils/[email protected] /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/token/ERC20/[email protected] /** * @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); } // File @openzeppelin/contracts/utils/[email protected] /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/[email protected] /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/interfaces/ILiquidityMiningMaster.sol interface ILiquidityMiningMaster { // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. // // We do some fancy math here. Basically, any point in time, the amount of MAX // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accMAXPerShare) - user.rewardDebt // // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens: // 1. The pool's `accMAXPerShare` (and `lastRewardBlock`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. MAX to distribute per block. uint256 lastRewardBlock; // Last block number that MAX distribution occurs. uint256 accMAXPerShare; // Accumulated MAX per share, times 1e12. See below. bool locked; } // ----------- Events ----------- event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw( address indexed user, uint256 indexed pid, uint256 amount ); event UpdateEmissionRate(address indexed user, uint256 maxPerBlock); event UpdateEndBlock(address indexed user, uint256 endBlock); event UpdateVestingMaster(address indexed user, address vestingMaster); // ----------- State changing api ----------- function massUpdatePools() external; function updatePool(uint256 pid) external; function deposit(uint256 pid, uint256 amount) external; function withdraw(uint256 pid, uint256 amount) external; function emergencyWithdraw(uint256 pid) external; // ----------- Governor only state changing API ----------- function addPool( uint256 allocPoint, IERC20 lpToken, bool locked, bool withUpdate ) external; function setPool( uint256 pid, uint256 allocPoint, bool locked, bool withUpdate ) external; function updateMaxPerBlock(uint256 _maxPerBlock) external; function updateEndBlock(uint256 _endBlock) external; function updateVestingMaster(address _vestingMaster) external; // ----------- Getters ----------- function pair2Pid(address pair) external view returns (uint256); function pendingMAX(uint256 pid, address user) external view returns (uint256); function poolInfo(uint256 pid) external view returns ( IERC20 lpToken, uint256 allocPoint, uint256 lastRewardBlock, uint256 accMAXPerShare, bool locked ); function userInfo(uint256 pid, address user) external view returns (uint256 amount, uint256 rewardDebt); function poolExistence(IERC20 lp) external view returns (bool); function maxPerBlock() external view returns (uint256); function BONUS_MULTIPLIER() external view returns (uint256); function totalAllocPoint() external view returns (uint256); function startBlock() external view returns (uint256); function endBlock() external view returns (uint256); function poolLength() external view returns (uint256); function getMultiplier(uint256 from, uint256 to) external pure returns (uint256); function rewardToken() external view returns (IERC20); } // File contracts/interfaces/IVestingMaster.sol interface IVestingMaster { struct LockedReward { uint256 locked; uint256 timestamp; } // ----------- Events ----------- event Lock(address indexed user, uint256 amount); event Claim(address indexed user, uint256 amount); // ----------- Farms only State changing api ----------- function lock(address, uint256) external; // ----------- state changing API ----------- function claim() external; // ----------- Getters ----------- function period() external view returns (uint256); function lockedPeriodAmount() external view returns (uint256); function vestingToken() external view returns (IERC20); function userLockedRewards(address account, uint256 idx) external view returns (uint256, uint256); function totalLockedRewards() external view returns (uint256); function getVestingAmount() external view returns (uint256, uint256); } // File contracts/interfaces/IPermissions.sol /// @title Permissions interface /// @author USDM Protocol interface IPermissions { // ----------- Governor only state changing api ----------- function createRole(bytes32 role, bytes32 adminRole) external; function grantMinter(address minter) external; function grantBurner(address burner) external; function grantPCVController(address pcvController) external; function grantGovernor(address governor) external; function grantGuardian(address guardian) external; function revokeMinter(address minter) external; function revokeBurner(address burner) external; function revokePCVController(address pcvController) external; function revokeGovernor(address governor) external; function revokeGuardian(address guardian) external; // ----------- Revoker only state changing api ----------- function revokeOverride(bytes32 role, address account) external; // ----------- Getters ----------- function isBurner(address _address) external view returns (bool); function isMinter(address _address) external view returns (bool); function isGovernor(address _address) external view returns (bool); function isGuardian(address _address) external view returns (bool); function isPCVController(address _address) external view returns (bool); } // File contracts/interfaces/ICore.sol /// @title Core Interface /// @author USDM Protocol interface ICore is IPermissions { } // File contracts/interfaces/ICoreRef.sol /// @title CoreRef interface /// @author USDM Protocol interface ICoreRef { // ----------- Events ----------- event CoreUpdate(address indexed _core); // ----------- Governor only state changing api ----------- function setCore(address core_) external; function pause() external; function unpause() external; // ----------- Getters ----------- function core() external view returns (ICore); } // File @openzeppelin/contracts/utils/[email protected] /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File contracts/refs/CoreRef.sol /// @title A Reference to Core /// @author USDM Protocol /// @notice Defines some modifiers and utilities around interacting with Core abstract contract CoreRef is ICoreRef, Pausable { using SafeMath for uint256; ICore private _core; /// @notice CoreRef constructor /// @param core_ USDM Core to reference constructor(address core_) { _core = ICore(core_); } modifier ifMinterSelf() { if (_core.isMinter(address(this))) { _; } } modifier ifBurnerSelf() { if (_core.isBurner(address(this))) { _; } } modifier onlyGovernor() { require( _core.isGovernor(msg.sender), "CoreRef::onlyGovernor: Caller is not a governor" ); _; } modifier onlyGuardianOrGovernor() { require( _core.isGovernor(msg.sender) || _core.isGuardian(msg.sender), "CoreRef::onlyGuardianOrGovernor: Caller is not a guardian or governor" ); _; } /// @notice Set new Core reference address /// @param core_ The new core address function setCore(address core_) external override onlyGovernor { _core = ICore(core_); emit CoreUpdate(core_); } /// @notice Set pausable methods to paused function pause() public override onlyGuardianOrGovernor { _pause(); } /// @notice Set pausable methods to unpaused function unpause() public override onlyGuardianOrGovernor { _unpause(); } /// @notice Address of the Core contract referenced /// @return ICore implementation address function core() public view override returns (ICore) { return _core; } } // File contracts/protocol/LiquidityMiningMaster.sol // Earn Token contract LiquidityMiningMaster is ILiquidityMiningMaster, ReentrancyGuard, CoreRef { using SafeMath for uint256; using SafeERC20 for IERC20; IVestingMaster public vestingMaster; // Info of each pool. PoolInfo[] public override poolInfo; // Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public override userInfo; // Pair corresponding pid mapping(address => uint256) public override pair2Pid; mapping(IERC20 => bool) public override poolExistence; // Reward tokens created per block. uint256 public override maxPerBlock; // Bonus muliplier for early reward makers. uint256 public constant override BONUS_MULTIPLIER = 1; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public override totalAllocPoint = 0; // The block number when mining starts. uint256 public override startBlock; // The block number when mining ends. uint256 public override endBlock; IERC20 public override rewardToken; constructor( address _core, address _vestingMaster, address _rewardToken, uint256 _maxPerBlock, uint256 _startBlock, uint256 _endBlock ) CoreRef(_core) { require( _startBlock < _endBlock, "LiquidityMiningMaster::constructor: End less than start" ); vestingMaster = IVestingMaster(_vestingMaster); rewardToken = IERC20(_rewardToken); maxPerBlock = _maxPerBlock; startBlock = _startBlock; endBlock = _endBlock; } modifier nonDuplicated(IERC20 _lpToken) { require( !poolExistence[_lpToken], "LiquidityMiningMaster::nonDuplicated: Duplicated lp" ); require( _lpToken != rewardToken, "LiquidityMiningMaster::nonDuplicated: Duplicated reward and lp" ); _; } modifier validatePid(uint256 _pid) { require( _pid < poolInfo.length, "LiquidityMiningMaster::validatePid: Not exist" ); _; } function poolLength() public view override returns (uint256) { return poolInfo.length; } // Add a new lp to the pool. Can only be called by the governor. function addPool( uint256 _allocPoint, IERC20 _lpToken, bool _locked, bool _withUpdate ) public override onlyGuardianOrGovernor nonDuplicated(_lpToken) { require( block.number < endBlock, "LiquidityMiningMaster::addPool: Exceed endblock" ); if (_withUpdate) { massUpdatePools(); } uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolExistence[_lpToken] = true; poolInfo.push( PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, lastRewardBlock: lastRewardBlock, accMAXPerShare: 0, locked: _locked }) ); pair2Pid[address(_lpToken)] = poolLength() - 1; } // Update the given pool's allocation point and deposit fee. Can only be called by the governor. function setPool( uint256 _pid, uint256 _allocPoint, bool _locked, bool _withUpdate ) public override validatePid(_pid) onlyGuardianOrGovernor { if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add( _allocPoint ); poolInfo[_pid].allocPoint = _allocPoint; poolInfo[_pid].locked = _locked; } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public pure override returns (uint256) { return _to.sub(_from).mul(BONUS_MULTIPLIER); } function getMAXReward(uint256 _pid) internal view returns (uint256 maxReward) { PoolInfo storage pool = poolInfo[_pid]; require( pool.lastRewardBlock < block.number, "LiquidityMiningMaster::getMAXReward: Must little than the current block number" ); uint256 multiplier = getMultiplier( pool.lastRewardBlock, block.number >= endBlock ? endBlock : block.number ); maxReward = multiplier.mul(maxPerBlock).mul(pool.allocPoint).div( totalAllocPoint ); } // View function to see pending reward on frontend. function pendingMAX(uint256 _pid, address _user) external view override validatePid(_pid) returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accMAXPerShare = pool.accMAXPerShare; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 shareReward = getMAXReward(_pid); accMAXPerShare = accMAXPerShare.add( shareReward.mul(1e12).div(lpSupply) ); } return user.amount.mul(accMAXPerShare).div(1e12).sub(user.rewardDebt); } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public override { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public override validatePid(_pid) { PoolInfo storage pool = poolInfo[_pid]; if (block.number <= pool.lastRewardBlock) { return; } if (pool.lastRewardBlock >= endBlock) { return; } uint256 lpSupply = pool.lpToken.balanceOf(address(this)); uint256 lastRewardBlock = block.number >= endBlock ? endBlock : block.number; if (lpSupply == 0 || pool.allocPoint == 0) { pool.lastRewardBlock = lastRewardBlock; return; } uint256 shareReward = getMAXReward(_pid); pool.accMAXPerShare = pool.accMAXPerShare.add( shareReward.mul(1e12).div(lpSupply) ); pool.lastRewardBlock = lastRewardBlock; } // Deposit LP tokens to LiquidityMiningMaster for allocation. function deposit(uint256 _pid, uint256 _amount) public override validatePid(_pid) nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); if (user.amount > 0) { uint256 pending = user .amount .mul(pool.accMAXPerShare) .div(1e12) .sub(user.rewardDebt); if (pending > 0) { uint256 locked; if (pool.locked && address(vestingMaster) != address(0)) { locked = pending .div(vestingMaster.lockedPeriodAmount() + 1) .mul(vestingMaster.lockedPeriodAmount()); } safeTokenTransfer(msg.sender, pending.sub(locked)); if (locked > 0) { uint256 actualAmount = safeTokenTransfer( address(vestingMaster), locked ); vestingMaster.lock(msg.sender, actualAmount); } } } if (_amount > 0) { pool.lpToken.safeTransferFrom( address(msg.sender), address(this), _amount ); user.amount = user.amount.add(_amount); } user.rewardDebt = user.amount.mul(pool.accMAXPerShare).div(1e12); emit Deposit(msg.sender, _pid, _amount); } // Withdraw LP tokens from LiquidityMiningMaster. function withdraw(uint256 _pid, uint256 _amount) public override validatePid(_pid) nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require( user.amount >= _amount, "LiquidityMiningMaster::withdraw: Not good" ); updatePool(_pid); if (user.amount > 0) { uint256 pending = user .amount .mul(pool.accMAXPerShare) .div(1e12) .sub(user.rewardDebt); if (pending > 0) { uint256 locked; if (pool.locked && address(vestingMaster) != address(0)) { locked = pending .div(vestingMaster.lockedPeriodAmount() + 1) .mul(vestingMaster.lockedPeriodAmount()); } safeTokenTransfer(msg.sender, pending.sub(locked)); if (locked > 0) { uint256 actualAmount = safeTokenTransfer( address(vestingMaster), locked ); vestingMaster.lock(msg.sender, actualAmount); } } } if (_amount > 0) { user.amount = user.amount.sub(_amount); pool.lpToken.safeTransfer(address(msg.sender), _amount); } user.rewardDebt = user.amount.mul(pool.accMAXPerShare).div(1e12); emit Withdraw(msg.sender, _pid, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public override validatePid(_pid) nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 amount = user.amount; user.amount = 0; user.rewardDebt = 0; pool.lpToken.safeTransfer(address(msg.sender), amount); emit EmergencyWithdraw(msg.sender, _pid, amount); } // Safe token transfer function, just in case if rounding error causes pool to not have enough token. function safeTokenTransfer(address _to, uint256 _amount) internal virtual returns (uint256) { uint256 balance = rewardToken.balanceOf(address(this)); uint256 amount; uint256 floorAmount = 0; if (balance > floorAmount) { if (_amount > balance.sub(floorAmount)) { amount = balance.sub(floorAmount); } else { amount = _amount; } } require( rewardToken.transfer(_to, amount), "LiquidityMiningMaster::safeMAXTransfer: Transfer failed" ); return amount; } function updateMaxPerBlock(uint256 _maxPerBlock) public override onlyGuardianOrGovernor { massUpdatePools(); maxPerBlock = _maxPerBlock; emit UpdateEmissionRate(msg.sender, _maxPerBlock); } function updateEndBlock(uint256 _endBlock) public override onlyGuardianOrGovernor { require( _endBlock > startBlock, "LiquidityMiningMaster::updateEndBlock: Less" ); for (uint256 pid = 0; pid < poolInfo.length; ++pid) { require( _endBlock > poolInfo[pid].lastRewardBlock, "LiquidityMiningMaster::updateEndBlock: Less" ); } massUpdatePools(); endBlock = _endBlock; emit UpdateEndBlock(msg.sender, _endBlock); } function updateVestingMaster(address _vestingMaster) public override onlyGovernor { vestingMaster = IVestingMaster(_vestingMaster); emit UpdateVestingMaster(msg.sender, _vestingMaster); } }
[{"inputs":[{"internalType":"address","name":"_core","type":"address"},{"internalType":"address","name":"_vestingMaster","type":"address"},{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_maxPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_endBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_core","type":"address"}],"name":"CoreUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"maxPerBlock","type":"uint256"}],"name":"UpdateEmissionRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"UpdateEndBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"vestingMaster","type":"address"}],"name":"UpdateVestingMaster","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BONUS_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_locked","type":"bool"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"core","outputs":[{"internalType":"contract ICore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pair2Pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingMAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"name":"poolExistence","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accMAXPerShare","type":"uint256"},{"internalType":"bool","name":"locked","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"core_","type":"address"}],"name":"setCore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_locked","type":"bool"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_endBlock","type":"uint256"}],"name":"updateEndBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerBlock","type":"uint256"}],"name":"updateMaxPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vestingMaster","type":"address"}],"name":"updateVestingMaster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingMaster","outputs":[{"internalType":"contract IVestingMaster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50600436106101ce5760003560e01c80635c975abb1161010457806393f1a40b116100a2578063cd271d2d11610071578063cd271d2d14610386578063e2bbb15814610399578063f2f4eb26146103ac578063f7c618c1146103b4576101ce565b806393f1a40b14610337578063944603c814610358578063c811658514610360578063cbd258b514610373576101ce565b806380009630116100de57806380009630146103015780638456cb59146103145780638aa285501461031c5780638dbb1e3a14610324576101ce565b80635c975abb146102d1578063630b5ba1146102e65780637ce52bfc146102ee576101ce565b80632124ca4411610171578063441a3e701161014b578063441a3e701461029057806348cd4cb1146102a357806351eb05a6146102ab5780635312ea8e146102be576101ce565b80632124ca441461026257806323ddfa33146102755780633f4ba83a14610288576101ce565b80630a0ee036116101ad5780630a0ee0361461020e5780631526fe271461022157806317caf6f1146102455780631eccdf071461024d576101ce565b80626f0231146101d3578063081e3eda146101e8578063083c632314610206575b600080fd5b6101e66101e136600461210a565b6103bc565b005b6101f06105ad565b6040516101fd919061288c565b60405180910390f35b6101f06105b3565b6101e661021c366004612169565b6105b9565b61023461022f36600461210a565b610910565b6040516101fd959493929190612282565b6101f061095e565b610255610964565b6040516101fd9190612226565b6101e66102703660046120d2565b610973565b6101e66102833660046121dc565b610a60565b6101e6610c58565b6101e661029e3660046121bb565b610d8c565b6101f06110e7565b6101e66102b936600461210a565b6110ed565b6101e66102cc36600461210a565b611253565b6102d9611338565b6040516101fd9190612277565b6101e6611341565b6101f06102fc36600461213a565b611360565b6101e661030f3660046120d2565b6114c2565b6101e66115b4565b6101f06116e6565b6101f06103323660046121bb565b6116eb565b61034a61034536600461213a565b611705565b6040516101fd929190612895565b6101f0611729565b6101f061036e3660046120d2565b61172f565b6102d96103813660046120d2565b611741565b6101e661039436600461210a565b611756565b6101e66103a73660046121bb565b6118bf565b610255611b10565b610255611b24565b600154604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b8906103f0903390600401612226565b60206040518083038186803b15801561040857600080fd5b505afa15801561041c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061044091906120ee565b806104ca5750600154604051630c68ba2160e01b81526101009091046001600160a01b031690630c68ba219061047a903390600401612226565b60206040518083038186803b15801561049257600080fd5b505afa1580156104a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ca91906120ee565b6104ef5760405162461bcd60e51b81526004016104e690612639565b60405180910390fd5b60095481116105105760405162461bcd60e51b81526004016104e6906127bb565b60005b600354811015610562576003818154811061052a57fe5b906000526020600020906005020160020154821161055a5760405162461bcd60e51b81526004016104e6906127bb565b600101610513565b5061056b611341565b600a81905560405133907f316ee89ca026e5355cff2b64939ee0e5af49bde19b755b42bbde0f5bea039825906105a290849061288c565b60405180910390a250565b60035490565b600a5481565b600154604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b8906105ed903390600401612226565b60206040518083038186803b15801561060557600080fd5b505afa158015610619573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063d91906120ee565b806106c75750600154604051630c68ba2160e01b81526101009091046001600160a01b031690630c68ba2190610677903390600401612226565b60206040518083038186803b15801561068f57600080fd5b505afa1580156106a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c791906120ee565b6106e35760405162461bcd60e51b81526004016104e690612639565b6001600160a01b038316600090815260066020526040902054839060ff161561071e5760405162461bcd60e51b81526004016104e6906125a5565b600b546001600160a01b038281169116141561074c5760405162461bcd60e51b81526004016104e6906123be565b600a54431061076d5760405162461bcd60e51b81526004016104e690612806565b811561077b5761077b611341565b6000600954431161078e57600954610790565b435b6008549091506107a09087611b33565b6008556001600160a01b0385811660008181526006602090815260408083208054600160ff199182168117909255825160a0810184529586529285018c8152918501878152606086018581528b151560808801908152600380548086018255975296517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b600590970296870180546001600160a01b031916919099161790975591517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c85015590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d84015593517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e83015591517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85f90910180549092169015151790556108eb6105ad565b6001600160a01b03909616600090815260056020526040902095039094555050505050565b6003818154811061092057600080fd5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909160ff1685565b60085481565b6002546001600160a01b031681565b600154604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b8906109a7903390600401612226565b60206040518083038186803b1580156109bf57600080fd5b505afa1580156109d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f791906120ee565b610a135760405162461bcd60e51b81526004016104e69061241b565b600280546001600160a01b0319166001600160a01b03831617905560405133907fedd017b4981fb4d0d4df1c48baed994ce8b4dc47ba89a2010ce592b7df5c6dc4906105a2908490612226565b60035484908110610a835760405162461bcd60e51b81526004016104e6906126a4565b600154604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b890610ab7903390600401612226565b60206040518083038186803b158015610acf57600080fd5b505afa158015610ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0791906120ee565b80610b915750600154604051630c68ba2160e01b81526101009091046001600160a01b031690630c68ba2190610b41903390600401612226565b60206040518083038186803b158015610b5957600080fd5b505afa158015610b6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9191906120ee565b610bad5760405162461bcd60e51b81526004016104e690612639565b8115610bbb57610bbb611341565b610bf884610bf260038881548110610bcf57fe5b906000526020600020906005020160010154600854611b5890919063ffffffff16565b90611b33565b6008819055508360038681548110610c0c57fe5b9060005260206000209060050201600101819055508260038681548110610c2f57fe5b60009182526020909120600590910201600401805460ff19169115159190911790555050505050565b600154604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b890610c8c903390600401612226565b60206040518083038186803b158015610ca457600080fd5b505afa158015610cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdc91906120ee565b80610d665750600154604051630c68ba2160e01b81526101009091046001600160a01b031690630c68ba2190610d16903390600401612226565b60206040518083038186803b158015610d2e57600080fd5b505afa158015610d42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6691906120ee565b610d825760405162461bcd60e51b81526004016104e690612639565b610d8a611b80565b565b60035482908110610daf5760405162461bcd60e51b81526004016104e6906126a4565b60026000541415610dd25760405162461bcd60e51b81526004016104e690612855565b600260009081556003805485908110610de757fe5b600091825260208083208784526004825260408085203386529092529220805460059092029092019250841115610e305760405162461bcd60e51b81526004016104e690612728565b610e39856110ed565b805415611055576000610e7a8260010154610e7464e8d4a51000610e6e87600301548760000154611bee90919063ffffffff16565b90611c28565b90611b58565b9050801561105357600483015460009060ff168015610ea357506002546001600160a01b031615155b15610fb757600254604080516302f4bde360e11b81529051610fb4926001600160a01b0316916305e97bc6916004808301926020929190829003018186803b158015610eee57600080fd5b505afa158015610f02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f269190612122565b600254604080516302f4bde360e11b81529051610fae926001600160a01b0316916305e97bc6916004808301926020929190829003018186803b158015610f6c57600080fd5b505afa158015610f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa49190612122565b8590600101611c28565b90611bee565b90505b610fca33610fc58484611b58565b611c5a565b50801561105157600254600090610fea906001600160a01b031683611c5a565b60025460405163282d3fdf60e01b81529192506001600160a01b03169063282d3fdf9061101d903390859060040161223a565b600060405180830381600087803b15801561103757600080fd5b505af115801561104b573d6000803e3d6000fd5b50505050505b505b505b831561107f5780546110679085611b58565b8155815461107f906001600160a01b03163386611db9565b6003820154815461109a9164e8d4a5100091610e6e91611bee565b6001820155604051859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568906110d390889061288c565b60405180910390a350506001600055505050565b60095481565b600354819081106111105760405162461bcd60e51b81526004016104e6906126a4565b60006003838154811061111f57fe5b9060005260206000209060050201905080600201544311611140575061124f565b600a54816002015410611153575061124f565b80546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611183903090600401612226565b60206040518083038186803b15801561119b57600080fd5b505afa1580156111af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d39190612122565b90506000600a544310156111e757436111eb565b600a545b90508115806111fc57506001830154155b15611210576002909201919091555061124f565b600061121b86611e14565b905061123e61123384610e6e8464e8d4a51000611bee565b600386015490611b33565b600385015550600290920191909155505b5050565b600354819081106112765760405162461bcd60e51b81526004016104e6906126a4565b600260005414156112995760405162461bcd60e51b81526004016104e690612855565b6002600090815560038054849081106112ae57fe5b6000918252602080832086845260048252604080852033808752935284208054858255600182019590955560059093020180549094509192916112fe916001600160a01b03919091169083611db9565b84336001600160a01b03167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae0595836040516110d3919061288c565b60015460ff1690565b60035460005b8181101561124f57611358816110ed565b600101611347565b600354600090839081106113865760405162461bcd60e51b81526004016104e6906126a4565b60006003858154811061139557fe5b60009182526020808320888452600480835260408086206001600160a01b03808c16885294528086206003600590960290930194850154855491516370a0823160e01b815295975092959294929316916370a08231916113f791309101612226565b60206040518083038186803b15801561140f57600080fd5b505afa158015611423573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114479190612122565b905083600201544311801561145b57508015155b1561148e57600061146b89611e14565b905061148a61148383610e6e8464e8d4a51000611bee565b8490611b33565b9250505b6114b68360010154610e7464e8d4a51000610e6e868860000154611bee90919063ffffffff16565b98975050505050505050565b600154604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b8906114f6903390600401612226565b60206040518083038186803b15801561150e57600080fd5b505afa158015611522573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154691906120ee565b6115625760405162461bcd60e51b81526004016104e69061241b565b60018054610100600160a81b0319166101006001600160a01b038416908102919091179091556040517fad9400e618eb1344fde53db22397a1b82c765527ecbba3a5c86bcac15090828b90600090a250565b600154604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b8906115e8903390600401612226565b60206040518083038186803b15801561160057600080fd5b505afa158015611614573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163891906120ee565b806116c25750600154604051630c68ba2160e01b81526101009091046001600160a01b031690630c68ba2190611672903390600401612226565b60206040518083038186803b15801561168a57600080fd5b505afa15801561169e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c291906120ee565b6116de5760405162461bcd60e51b81526004016104e690612639565b610d8a611ea6565b600181565b60006116fc6001610fae8486611b58565b90505b92915050565b60046020908152600092835260408084209091529082529020805460019091015482565b60075481565b60056020526000908152604090205481565b60066020526000908152604090205460ff1681565b600154604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b89061178a903390600401612226565b60206040518083038186803b1580156117a257600080fd5b505afa1580156117b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117da91906120ee565b806118645750600154604051630c68ba2160e01b81526101009091046001600160a01b031690630c68ba2190611814903390600401612226565b60206040518083038186803b15801561182c57600080fd5b505afa158015611840573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186491906120ee565b6118805760405162461bcd60e51b81526004016104e690612639565b611888611341565b600781905560405133907fe2492e003bbe8afa53088b406f0c1cb5d9e280370fc72a74cf116ffd343c4053906105a290849061288c565b600354829081106118e25760405162461bcd60e51b81526004016104e6906126a4565b600260005414156119055760405162461bcd60e51b81526004016104e690612855565b60026000908155600380548590811061191a57fe5b6000918252602080832087845260048252604080852033865290925292206005909102909101915061194b856110ed565b805415611a905760006119808260010154610e7464e8d4a51000610e6e87600301548760000154611bee90919063ffffffff16565b90508015611a8e57600483015460009060ff1680156119a957506002546001600160a01b031615155b156119f757600254604080516302f4bde360e11b815290516119f4926001600160a01b0316916305e97bc6916004808301926020929190829003018186803b158015610eee57600080fd5b90505b611a0533610fc58484611b58565b508015611a8c57600254600090611a25906001600160a01b031683611c5a565b60025460405163282d3fdf60e01b81529192506001600160a01b03169063282d3fdf90611a58903390859060040161223a565b600060405180830381600087803b158015611a7257600080fd5b505af1158015611a86573d6000803e3d6000fd5b50505050505b505b505b8315611abc578154611aad906001600160a01b0316333087611f00565b8054611ab99085611b33565b81555b60038201548154611ad79164e8d4a5100091610e6e91611bee565b6001820155604051859033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15906110d390889061288c565b60015461010090046001600160a01b031690565b600b546001600160a01b031681565b6000828201838110156116fc5760405162461bcd60e51b81526004016104e690612313565b600082821115611b7a5760405162461bcd60e51b81526004016104e69061246a565b50900390565b611b88611338565b611ba45760405162461bcd60e51b81526004016104e6906122e5565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611bd7611f27565b604051611be49190612226565b60405180910390a1565b600082611bfd575060006116ff565b82820282848281611c0a57fe5b04146116fc5760405162461bcd60e51b81526004016104e6906125f8565b6000808211611c495760405162461bcd60e51b81526004016104e6906124e7565b818381611c5257fe5b049392505050565b600b546040516370a0823160e01b815260009182916001600160a01b03909116906370a0823190611c8f903090600401612226565b60206040518083038186803b158015611ca757600080fd5b505afa158015611cbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cdf9190612122565b90506000808215611d1057611cf48382611b58565b851115611d0c57611d058382611b58565b9150611d10565b8491505b600b5460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611d42908990869060040161223a565b602060405180830381600087803b158015611d5c57600080fd5b505af1158015611d70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9491906120ee565b611db05760405162461bcd60e51b81526004016104e69061251e565b50949350505050565b611e0f8363a9059cbb60e01b8484604051602401611dd892919061223a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611f2b565b505050565b60008060038381548110611e2457fe5b9060005260206000209060050201905043816002015410611e575760405162461bcd60e51b81526004016104e69061234a565b6000611e798260020154600a54431015611e715743610332565b600a546116eb565b9050611e9e600854610e6e8460010154610fae60075486611bee90919063ffffffff16565b949350505050565b611eae611338565b15611ecb5760405162461bcd60e51b81526004016104e69061257b565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611bd7611f27565b611f21846323b872dd60e01b858585604051602401611dd893929190612253565b50505050565b3390565b6000611f80826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611fba9092919063ffffffff16565b805190915015611e0f5780806020019051810190611f9e91906120ee565b611e0f5760405162461bcd60e51b81526004016104e690612771565b6060611fc98484600085611fd3565b90505b9392505050565b606082471015611ff55760405162461bcd60e51b81526004016104e6906124a1565b611ffe85612093565b61201a5760405162461bcd60e51b81526004016104e6906126f1565b600080866001600160a01b03168587604051612036919061220a565b60006040518083038185875af1925050503d8060008114612073576040519150601f19603f3d011682016040523d82523d6000602084013e612078565b606091505b5091509150612088828286612099565b979650505050505050565b3b151590565b606083156120a8575081611fcc565b8251156120b85782518084602001fd5b8160405162461bcd60e51b81526004016104e691906122b2565b6000602082840312156120e3578081fd5b81356116fc816128cf565b6000602082840312156120ff578081fd5b81516116fc816128e7565b60006020828403121561211b578081fd5b5035919050565b600060208284031215612133578081fd5b5051919050565b6000806040838503121561214c578081fd5b82359150602083013561215e816128cf565b809150509250929050565b6000806000806080858703121561217e578182fd5b843593506020850135612190816128cf565b925060408501356121a0816128e7565b915060608501356121b0816128e7565b939692955090935050565b600080604083850312156121cd578182fd5b50508035926020909101359150565b600080600080608085870312156121f1578384fd5b843593506020850135925060408501356121a0816128e7565b6000825161221c8184602087016128a3565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b901515815260200190565b6001600160a01b039590951685526020850193909352604084019190915260608301521515608082015260a00190565b60006020825282518060208401526122d18160408501602087016128a3565b601f01601f19169190910160400192915050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252604e908201527f4c69717569646974794d696e696e674d61737465723a3a6765744d415852657760408201527f6172643a204d757374206c6974746c65207468616e207468652063757272656e60608201526d3a10313637b1b590373ab6b132b960911b608082015260a00190565b6020808252603e908201527f4c69717569646974794d696e696e674d61737465723a3a6e6f6e4475706c696360408201527f617465643a204475706c6963617465642072657761726420616e64206c700000606082015260800190565b6020808252602f908201527f436f72655265663a3a6f6e6c79476f7665726e6f723a2043616c6c657220697360408201526e103737ba10309033b7bb32b93737b960891b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526037908201527f4c69717569646974794d696e696e674d61737465723a3a736166654d4158547260408201527f616e736665723a205472616e73666572206661696c6564000000000000000000606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526033908201527f4c69717569646974794d696e696e674d61737465723a3a6e6f6e4475706c69636040820152720617465643a204475706c696361746564206c7606c1b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526045908201527f436f72655265663a3a6f6e6c79477561726469616e4f72476f7665726e6f723a60408201527f2043616c6c6572206973206e6f74206120677561726469616e206f7220676f7660608201526432b93737b960d91b608082015260a00190565b6020808252602d908201527f4c69717569646974794d696e696e674d61737465723a3a76616c69646174655060408201526c1a590e88139bdd08195e1a5cdd609a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526029908201527f4c69717569646974794d696e696e674d61737465723a3a77697468647261773a60408201526808139bdd0819dbdbd960ba1b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252602b908201527f4c69717569646974794d696e696e674d61737465723a3a757064617465456e6460408201526a426c6f636b3a204c65737360a81b606082015260800190565b6020808252602f908201527f4c69717569646974794d696e696e674d61737465723a3a616464506f6f6c3a2060408201526e45786365656420656e64626c6f636b60881b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b90815260200190565b918252602082015260400190565b60005b838110156128be5781810151838201526020016128a6565b83811115611f215750506000910152565b6001600160a01b03811681146128e457600080fd5b50565b80151581146128e457600080fdfea26469706673582212209a1d066cf0621bc5eccf2fcfb898b0037337ead1f535520eda204110741b797364736f6c63430007060033
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.