Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 145 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Reward | 17770145 | 494 days ago | IN | 0 ETH | 0.00391533 | ||||
Claim Reward | 12131264 | 1342 days ago | IN | 0 ETH | 0.00596994 | ||||
Claim Reward | 12101144 | 1347 days ago | IN | 0 ETH | 0.01870788 | ||||
Claim Reward | 12097182 | 1348 days ago | IN | 0 ETH | 0.02374972 | ||||
Claim Reward | 12078747 | 1351 days ago | IN | 0 ETH | 0.0126046 | ||||
Claim Reward | 12078501 | 1351 days ago | IN | 0 ETH | 0.0155064 | ||||
Claim Reward | 12078299 | 1351 days ago | IN | 0 ETH | 0.0067078 | ||||
Claim Reward | 12078120 | 1351 days ago | IN | 0 ETH | 0.00900564 | ||||
Claim And Reinve... | 12057394 | 1354 days ago | IN | 0 ETH | 0.08742716 | ||||
Claim Reward | 12055534 | 1354 days ago | IN | 0 ETH | 0.02282096 | ||||
Claim Reward | 12053035 | 1354 days ago | IN | 0 ETH | 0.01622302 | ||||
Claim Reward | 12049765 | 1355 days ago | IN | 0 ETH | 0.01207625 | ||||
Claim Reward | 12048372 | 1355 days ago | IN | 0 ETH | 0.01514276 | ||||
Claim Reward | 12047245 | 1355 days ago | IN | 0 ETH | 0.0127955 | ||||
Claim And Reinve... | 12046263 | 1356 days ago | IN | 0 ETH | 0.07872794 | ||||
Claim Reward | 12045703 | 1356 days ago | IN | 0 ETH | 0.01513971 | ||||
Claim Reward | 12045497 | 1356 days ago | IN | 0 ETH | 0.029536 | ||||
Claim Reward | 12045415 | 1356 days ago | IN | 0 ETH | 0.01602946 | ||||
Claim Reward | 12044581 | 1356 days ago | IN | 0 ETH | 0.0116994 | ||||
Claim Reward | 12043890 | 1356 days ago | IN | 0 ETH | 0.01731522 | ||||
Claim Reward | 12042914 | 1356 days ago | IN | 0 ETH | 0.01388568 | ||||
Claim Reward | 12042810 | 1356 days ago | IN | 0 ETH | 0.026536 | ||||
Claim Reward | 12042024 | 1356 days ago | IN | 0 ETH | 0.01633846 | ||||
Claim Reward | 12040362 | 1356 days ago | IN | 0 ETH | 0.01189866 | ||||
Claim Reward | 12040185 | 1356 days ago | IN | 0 ETH | 0.00924163 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
VaultBoardroom
Compiler Version
v0.8.0+commit.c7dfd78e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IERC20} from '@openzeppelin/contracts/contracts/token/ERC20/IERC20.sol'; import {IVault} from '../../interfaces/IVault.sol'; import {SafeMath} from '@openzeppelin/contracts/contracts/math/SafeMath.sol'; import {ContractGuard} from '../../utils/ContractGuard.sol'; import {BaseBoardroom} from './BaseBoardroom.sol'; // import 'hardhat/console.sol'; contract VaultBoardroom is ContractGuard, BaseBoardroom { using SafeMath for uint256; // The vault which has state of the stakes. IVault public vault; uint256 public currentEpoch = 1; mapping(address => mapping(uint256 => BondingSnapshot)) public bondingHistory; mapping(address => mapping(uint256 => uint256)) directorBalanceForEpoch; mapping(address => uint256) balanceCurrentEpoch; mapping(address => uint256) balanceLastEpoch; mapping(address => uint256) balanceBeforeLaunch; modifier directorExists { require( vault.balanceOf(msg.sender) > 0, 'Boardroom: The director does not exist' ); _; } modifier onlyVault { require(msg.sender == address(vault), 'Boardroom: not vault'); _; } constructor( IERC20 token_, IVault vault_, address owner, address operator ) BaseBoardroom(token_) { vault = vault_; BoardSnapshot memory genesisSnapshot = BoardSnapshot({ number: block.number, time: 0, rewardReceived: 0, rewardPerShare: 0 }); boardHistory.push(genesisSnapshot); transferOperator(operator); transferOwnership(owner); } function getBoardhistory(uint256 i) public view returns (BoardSnapshot memory) { return boardHistory[i]; } function getBondingHistory(address who, uint256 epoch) public view returns (BondingSnapshot memory) { return bondingHistory[who][epoch]; } // returns the balance as per the last epoch; if the user deposits/withdraws // in the current epoch, this value will not change unless another epoch passes function getBalanceFromLastEpoch(address who) public view returns (uint256) { // console.log('getBalanceFromLastEpoch who %s', who); // console.log('getBalanceFromLastEpoch currentEpoch %s', currentEpoch); if (currentEpoch == 1) return 0; // console.log( // 'getBalanceFromLastEpoch balanceLastEpoch[who] %s', // balanceLastEpoch[who] // ); // console.log( // 'getBalanceFromLastEpoch balanceCurrentEpoch[who] %s', // balanceCurrentEpoch[who] // ); if (balanceCurrentEpoch[who] == 0) { // console.log( // 'getBalanceFromLastEpoch balanceOf(who) %s', // balanceOf(who) // ); return balanceOf(who); } uint256 currentBalance = getBondingHistory(who, balanceCurrentEpoch[who]).balance; if (balanceCurrentEpoch[who] == currentEpoch) { // if boardroom was disconnected before then just return the old balance if (balanceLastEpoch[who] == 0) return balanceBeforeLaunch[who]; return getBondingHistory(who, balanceLastEpoch[who]).balance; } if (balanceCurrentEpoch[who] < currentEpoch) { return currentBalance; } return 0; } function claimAndReinvestReward(IVault _vault) external virtual { uint256 reward = _claimReward(msg.sender); _vault.bondFor(msg.sender, reward); } function rewardPerShare() public view override returns (uint256) { return getLatestSnapshot().rewardPerShare; } function balanceOf(address who) public view returns (uint256) { uint256 unbondingAmount = vault.getStakedAmount(who); return vault.balanceOf(who).sub(unbondingAmount); } function earned(address director) public view virtual override returns (uint256) { uint256 latestRPS = getLatestSnapshot().rewardPerShare; uint256 storedRPS = getLastSnapshotOf(director).rewardPerShare; return getBalanceFromLastEpoch(director) .mul(latestRPS.sub(storedRPS)) .div(1e18) .add(directors[director].rewardEarnedCurrEpoch); } function claimReward() public virtual override directorExists returns (uint256) { return _claimReward(msg.sender); } function allocateSeigniorage(uint256 amount) external override onlyOneBlock onlyOperator { require(amount > 0, 'Boardroom: Cannot allocate 0'); uint256 totalSupply = vault.totalBondedSupply(); // 'Boardroom: Cannot allocate when totalSupply is 0' if (totalSupply == 0) return; // Create & add new snapshot uint256 prevRPS = getLatestSnapshot().rewardPerShare; uint256 nextRPS = prevRPS.add(amount.mul(1e18).div(totalSupply)); BoardSnapshot memory snap = BoardSnapshot({ number: block.number, time: block.timestamp, rewardReceived: amount, rewardPerShare: nextRPS }); boardHistory.push(snap); // console.log('allocateSeigniorage totalSupply: %s', totalSupply); // console.log('allocateSeigniorage time: %s', block.timestamp); // console.log('allocateSeigniorage rewardReceived: %s', amount); // console.log('allocateSeigniorage rewardPerShare: %s', nextRPS); token.transferFrom(msg.sender, address(this), amount); currentEpoch = currentEpoch.add(1); emit RewardAdded(msg.sender, amount); } function updateReward(address director) external virtual override onlyVault { _updateBalance(director); } function _claimReward(address who) internal returns (uint256) { _updateReward(who); uint256 reward = directors[who].rewardEarnedCurrEpoch; if (reward > 0) { directors[who].rewardEarnedCurrEpoch = 0; token.transfer(who, reward); emit RewardPaid(who, reward); if (balanceLastEpoch[who] == 0) { balanceBeforeLaunch[who] = balanceOf(who); } } return reward; } function setVault(IVault _vault) external onlyOwner { vault = _vault; } function _updateReward(address director) internal { Boardseat memory seat = directors[director]; seat.rewardEarnedCurrEpoch = earned(director); seat.lastSnapshotIndex = latestSnapshotIndex(); directors[director] = seat; } function _updateBalance(address who) internal { // console.log('updating balance for director at epoch: %s', currentEpoch); BondingSnapshot memory snap = BondingSnapshot({ epoch: currentEpoch, when: block.timestamp, balance: balanceOf(who) }); bondingHistory[who][currentEpoch] = snap; // update epoch counters if they need updating if (balanceCurrentEpoch[who] != currentEpoch) { balanceLastEpoch[who] = balanceCurrentEpoch[who]; balanceCurrentEpoch[who] = currentEpoch; } // if (balanceLastEpoch[who] == 0) { // require( // earned(who) == 0, // 'Claim rewards once before depositing again' // ); // } if (balanceLastEpoch[who] == 0) { balanceLastEpoch[who] = 1; } _updateReward(who); } }
// SPDX-License-Identifier: MIT 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 pragma solidity ^0.8.0; interface IVault { function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function totalBondedSupply() external view returns (uint256); function balanceWithoutBonded(address who) external view returns (uint256); function bond(uint256 amount) external; function bondFor(address who, uint256 amount) external; function unbond(uint256 amount) external; function withdraw() external; function getStakedAmount(address who) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations. */ 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. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * 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.0; contract ContractGuard { mapping(uint256 => mapping(address => bool)) private _status; function checkSameOriginReentranted() internal view returns (bool) { return _status[block.number][tx.origin]; } function checkSameSenderReentranted() internal view returns (bool) { return _status[block.number][msg.sender]; } modifier onlyOneBlock() { require( !checkSameOriginReentranted(), 'ContractGuard: one block, one function' ); require( !checkSameSenderReentranted(), 'ContractGuard: one block, one function' ); _; _status[block.number][tx.origin] = true; _status[block.number][msg.sender] = true; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IERC20} from '@openzeppelin/contracts/contracts/token/ERC20/IERC20.sol'; import {IVault} from '../../interfaces/IVault.sol'; import {SafeMath} from '@openzeppelin/contracts/contracts/math/SafeMath.sol'; import {Safe112} from '../../lib/Safe112.sol'; import {ContractGuard} from '../../utils/ContractGuard.sol'; import {Operator} from '../../owner/Operator.sol'; import {IBoardroom} from '../../interfaces/IBoardroom.sol'; import {IBasisAsset} from '../../interfaces/IBasisAsset.sol'; import {IVaultBoardroom} from '../../interfaces/IVaultBoardroom.sol'; abstract contract BaseBoardroom is Operator, IBoardroom { using Safe112 for uint112; using SafeMath for uint256; IERC20 public token; BoardSnapshot[] public boardHistory; mapping(address => Boardseat) public directors; event RewardPaid(address indexed user, uint256 reward); event RewardAdded(address indexed user, uint256 reward); constructor(IERC20 token_) { token = token_; } function getDirector(address who) external view override returns (Boardseat memory) { return directors[who]; } function getLastSnapshotIndexOf(address director) external view override returns (uint256) { return directors[director].lastSnapshotIndex; } function getLastSnapshotOf(address director) public view returns (BoardSnapshot memory) { return boardHistory[directors[director].lastSnapshotIndex]; } function latestSnapshotIndex() public view returns (uint256) { return boardHistory.length.sub(1); } function getLatestSnapshot() public view returns (BoardSnapshot memory) { return boardHistory[latestSnapshotIndex()]; } function rewardPerShare() public view virtual returns (uint256) { return getLatestSnapshot().rewardPerShare; } function refundReward() external onlyOwner { token.transfer(msg.sender, token.balanceOf(address(this))); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library Safe112 { function add(uint112 a, uint112 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, 'Safe112: addition overflow'); return c; } function sub(uint112 a, uint112 b) internal pure returns (uint256) { return sub(a, b, 'Safe112: subtraction overflow'); } function sub( uint112 a, uint112 b, string memory errorMessage ) internal pure returns (uint112) { require(b <= a, errorMessage); uint112 c = a - b; return c; } function mul(uint112 a, uint112 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, 'Safe112: multiplication overflow'); return c; } function div(uint112 a, uint112 b) internal pure returns (uint256) { return div(a, b, 'Safe112: division by zero'); } function div( uint112 a, uint112 b, string memory errorMessage ) internal pure returns (uint112) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint112 c = a / b; return c; } function mod(uint112 a, uint112 b) internal pure returns (uint256) { return mod(a, b, 'Safe112: modulo by zero'); } function mod( uint112 a, uint112 b, string memory errorMessage ) internal pure returns (uint112) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/contracts/GSN/Context.sol'; import '@openzeppelin/contracts/contracts/access/Ownable.sol'; import {IOperator} from '../interfaces/IOperator.sol'; abstract contract Operator is Context, Ownable, IOperator { address private _operator; event OperatorTransferred( address indexed previousOperator, address indexed newOperator ); constructor() { _operator = _msgSender(); emit OperatorTransferred(address(0), _operator); } function operator() public view override returns (address) { return _operator; } modifier onlyOperator() { require( _operator == msg.sender, 'operator: caller is not the operator' ); _; } function isOperator() public view override returns (bool) { return _msgSender() == _operator; } function transferOperator(address newOperator_) public override onlyOwner { _transferOperator(newOperator_); } function _transferOperator(address newOperator_) internal { require( newOperator_ != address(0), 'operator: zero address given for new operator' ); emit OperatorTransferred(address(0), newOperator_); _operator = newOperator_; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IOperator} from './IOperator.sol'; interface IBoardroom is IOperator { struct Boardseat { uint256 rewardClaimed; uint256 lastRPS; uint256 firstRPS; uint256 lastBoardSnapshotIndex; // // Pending reward from the previous epochs. // uint256 rewardPending; // Total reward earned in this epoch. uint256 rewardEarnedCurrEpoch; // Last time reward was claimed(not bound by current epoch). uint256 lastClaimedOn; // // The reward claimed in vesting period of this epoch. // uint256 rewardClaimedCurrEpoch; // // Snapshot of boardroom state when last epoch claimed. uint256 lastSnapshotIndex; // // Rewards claimable now in the current/next claim. // uint256 rewardClaimableNow; // // keep track of the current rps // uint256 claimedRPS; bool isFirstVaultActivityBeforeFirstEpoch; uint256 firstEpochWhenDoingVaultActivity; } struct BoardSnapshot { // Block number when recording a snapshot. uint256 number; // Block timestamp when recording a snapshot. uint256 time; // Amount of funds received. uint256 rewardReceived; // Equivalent amount per share staked. uint256 rewardPerShare; } struct BondingSnapshot { uint256 epoch; // Time when first bonding was made. uint256 when; // The snapshot index of when first bonded. uint256 balance; } // function updateReward(address director) external; function allocateSeigniorage(uint256 amount) external; function getDirector(address who) external view returns (Boardseat memory); function getLastSnapshotIndexOf(address director) external view returns (uint256); function earned(address director) external view returns (uint256); function claimReward() external returns (uint256); function updateReward(address director) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IERC20} from '@openzeppelin/contracts/contracts/token/ERC20/IERC20.sol'; interface IBasisAsset is IERC20 { function mint(address recipient, uint256 amount) external returns (bool); function burn(uint256 amount) external; function burnFrom(address from, uint256 amount) external; function isOperator() external returns (bool); function operator() external view returns (address); function transferOperator(address newOperator_) external; function transferOwnership(address newOwner) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IBoardroom} from './IBoardroom.sol'; interface IVaultBoardroom is IBoardroom { function bondingHistory(address who, uint256 epoch) external view returns (BondingSnapshot memory); function directors(address who) external view returns (Boardseat memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol";
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IEpoch} from './IEpoch.sol'; interface IOperator { function operator() external view returns (address); function isOperator() external view returns (bool); function transferOperator(address newOperator_) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @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) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IEpoch { function callable() external view returns (bool); function getLastEpoch() external view returns (uint256); function getCurrentEpoch() external view returns (uint256); function getNextEpoch() external view returns (uint256); function nextEpochPoint() external view returns (uint256); function getPeriod() external view returns (uint256); function getStartTime() external view returns (uint256); function setPeriod(uint256 _period) external; }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"token_","type":"address"},{"internalType":"contract IVault","name":"vault_","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"allocateSeigniorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boardHistory","outputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"},{"internalType":"uint256","name":"rewardReceived","type":"uint256"},{"internalType":"uint256","name":"rewardPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"bondingHistory","outputs":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"uint256","name":"when","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IVault","name":"_vault","type":"address"}],"name":"claimAndReinvestReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"directors","outputs":[{"internalType":"uint256","name":"rewardClaimed","type":"uint256"},{"internalType":"uint256","name":"lastRPS","type":"uint256"},{"internalType":"uint256","name":"firstRPS","type":"uint256"},{"internalType":"uint256","name":"lastBoardSnapshotIndex","type":"uint256"},{"internalType":"uint256","name":"rewardEarnedCurrEpoch","type":"uint256"},{"internalType":"uint256","name":"lastClaimedOn","type":"uint256"},{"internalType":"uint256","name":"lastSnapshotIndex","type":"uint256"},{"internalType":"bool","name":"isFirstVaultActivityBeforeFirstEpoch","type":"bool"},{"internalType":"uint256","name":"firstEpochWhenDoingVaultActivity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"director","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"getBalanceFromLastEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"getBoardhistory","outputs":[{"components":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"},{"internalType":"uint256","name":"rewardReceived","type":"uint256"},{"internalType":"uint256","name":"rewardPerShare","type":"uint256"}],"internalType":"struct IBoardroom.BoardSnapshot","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"getBondingHistory","outputs":[{"components":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"uint256","name":"when","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"}],"internalType":"struct IBoardroom.BondingSnapshot","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"getDirector","outputs":[{"components":[{"internalType":"uint256","name":"rewardClaimed","type":"uint256"},{"internalType":"uint256","name":"lastRPS","type":"uint256"},{"internalType":"uint256","name":"firstRPS","type":"uint256"},{"internalType":"uint256","name":"lastBoardSnapshotIndex","type":"uint256"},{"internalType":"uint256","name":"rewardEarnedCurrEpoch","type":"uint256"},{"internalType":"uint256","name":"lastClaimedOn","type":"uint256"},{"internalType":"uint256","name":"lastSnapshotIndex","type":"uint256"},{"internalType":"bool","name":"isFirstVaultActivityBeforeFirstEpoch","type":"bool"},{"internalType":"uint256","name":"firstEpochWhenDoingVaultActivity","type":"uint256"}],"internalType":"struct IBoardroom.Boardseat","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"director","type":"address"}],"name":"getLastSnapshotIndexOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"director","type":"address"}],"name":"getLastSnapshotOf","outputs":[{"components":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"},{"internalType":"uint256","name":"rewardReceived","type":"uint256"},{"internalType":"uint256","name":"rewardPerShare","type":"uint256"}],"internalType":"struct IBoardroom.BoardSnapshot","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestSnapshot","outputs":[{"components":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"},{"internalType":"uint256","name":"rewardReceived","type":"uint256"},{"internalType":"uint256","name":"rewardPerShare","type":"uint256"}],"internalType":"struct IBoardroom.BoardSnapshot","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestSnapshotIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IVault","name":"_vault","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator_","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"director","type":"address"}],"name":"updateReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract IVault","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405260016007553480156200001657600080fd5b50604051620020e6380380620020e6833981016040819052620000399162000383565b83600062000046620001e9565b600180546001600160a01b0319166001600160a01b03831690811790915560405191925090600090600080516020620020a6833981519152908290a3506200008d620001e9565b600280546001600160a01b0319166001600160a01b039283161790819055604051911690600090600080516020620020c6833981519152908290a3600380546001600160a01b03199081166001600160a01b0393841617909155600680549091169185169190911790556040805160808101825243815260006020820181815292820181815260608301828152600480546001810182559381905284517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b949091029384015593517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c830155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d82015591517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e90920191909155620001d382620001ed565b620001de836200024a565b5050505050620004c8565b3390565b620001f7620001e9565b6001600160a01b03166200020a62000304565b6001600160a01b0316146200023c5760405162461bcd60e51b815260040162000233906200047d565b60405180910390fd5b620002478162000313565b50565b62000254620001e9565b6001600160a01b03166200026762000304565b6001600160a01b031614620002905760405162461bcd60e51b815260040162000233906200047d565b6001600160a01b038116620002b95760405162461bcd60e51b81526004016200023390620003ea565b6001546040516001600160a01b03808416921690600080516020620020a683398151915290600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031690565b6001600160a01b0381166200033c5760405162461bcd60e51b8152600401620002339062000430565b6040516001600160a01b03821690600090600080516020620020c6833981519152908290a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000806000806080858703121562000399578384fd5b8451620003a681620004b2565b6020860151909450620003b981620004b2565b6040860151909350620003cc81620004b2565b6060860151909250620003df81620004b2565b939692955090935050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602d908201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260408201526c103732bb9037b832b930ba37b960991b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6001600160a01b03811681146200024757600080fd5b611bce80620004d86000396000f3fe608060405234801561001057600080fd5b50600436106101ce5760003560e01c80638da5cb5b11610104578063c291818b116100a2578063f2fde38b11610071578063f2fde38b146103bd578063fbfa77cf146103d0578063fc0c546a146103d8578063fd147b7f146103e0576101ce565b8063c291818b14610367578063d518f2431461037a578063d7603ef714610382578063f0ec943014610395576101ce565b80639b2d6194116100de5780639b2d61941461030a578063b54076571461032c578063b6f3c6c01461033f578063b88a802f1461035f576101ce565b80638da5cb5b146102e757806396c86cfc146102ef57806397ffe1d7146102f7576101ce565b8063570ca7351161017157806370a082311161014b57806370a08231146102b1578063714b4658146102c4578063715018a6146102d757806376671808146102df576101ce565b8063570ca73514610276578063632447c91461028b5780636817031b1461029e576101ce565b806339344d9d116101ad57806339344d9d146102315780633f9e3f04146102515780634456eda214610259578063446a2ec81461026e576101ce565b80628cc262146101d357806304ab80fc146101fc57806329605e771461021c575b600080fd5b6101e66101e13660046116e1565b610403565b6040516101f39190611a84565b60405180910390f35b61020f61020a3660046116e1565b610484565b6040516101f391906119fc565b61022f61022a3660046116e1565b610512565b005b61024461023f3660046116fd565b610566565b6040516101f39190611a63565b6101e66105bc565b6102616105d2565b6040516101f391906117c9565b6101e66105f8565b61027e61060b565b6040516101f39190611778565b61022f6102993660046116e1565b61061a565b61022f6102ac3660046116e1565b61064d565b6101e66102bf3660046116e1565b6106ae565b6101e66102d23660046116e1565b6107c7565b61022f6107e5565b6101e661086e565b61027e610874565b61022f610883565b61022f610305366004611748565b6109bb565b61031d6103183660046116fd565b610cf0565b6040516101f393929190611a8d565b6101e661033a3660046116e1565b610d1c565b61035261034d3660046116e1565b610e4c565b6040516101f391906119d1565b6101e6610edb565b61022f6103753660046116e1565b610f86565b610352610ff8565b610352610390366004611748565b61106e565b6103a86103a33660046116e1565b611097565b6040516101f399989796959493929190611abe565b61022f6103cb3660046116e1565b6110e6565b61027e6111a7565b61027e6111b6565b6103f36103ee366004611748565b6111c5565b6040516101f39493929190611aa3565b60008061040e610ff8565b606001519050600061041f84610e4c565b606001516001600160a01b03851660009081526005602052604090206004015490915061047a90610474670de0b6b3a764000061046e61045f87876111ff565b6104688a610d1c565b9061120b565b90611217565b90611223565b925050505b919050565b61048c61164a565b506001600160a01b03166000908152600560208181526040928390208351610120810185528154815260018201549281019290925260028101549382019390935260038301546060820152600483015460808201529082015460a0820152600682015460c0820152600782015460ff16151560e082015260089091015461010082015290565b61051a61122f565b6001600160a01b031661052b610874565b6001600160a01b03161461055a5760405162461bcd60e51b81526004016105519061189e565b60405180910390fd5b61056381611233565b50565b61056e611698565b506001600160a01b0382166000908152600860209081526040808320848452825291829020825160608101845281548152600182015492810192909252600201549181019190915292915050565b6004546000906105cd9060016111ff565b905090565b6002546000906001600160a01b03166105e961122f565b6001600160a01b031614905090565b6000610602610ff8565b60600151905090565b6002546001600160a01b031690565b6006546001600160a01b031633146106445760405162461bcd60e51b81526004016105519061195d565b610563816112b1565b61065561122f565b6001600160a01b0316610666610874565b6001600160a01b03161461068c5760405162461bcd60e51b81526004016105519061189e565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6006546040516326d352ab60e11b815260009182916001600160a01b0390911690634da6a556906106e3908690600401611778565b60206040518083038186803b1580156106fb57600080fd5b505afa15801561070f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107339190611760565b6006546040516370a0823160e01b81529192506107c09183916001600160a01b0316906370a082319061076a908890600401611778565b60206040518083038186803b15801561078257600080fd5b505afa158015610796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ba9190611760565b906111ff565b9392505050565b6001600160a01b031660009081526005602052604090206006015490565b6107ed61122f565b6001600160a01b03166107fe610874565b6001600160a01b0316146108245760405162461bcd60e51b81526004016105519061189e565b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b60075481565b6001546001600160a01b031690565b61088b61122f565b6001600160a01b031661089c610874565b6001600160a01b0316146108c25760405162461bcd60e51b81526004016105519061189e565b6003546040516370a0823160e01b81526001600160a01b039091169063a9059cbb90339083906370a08231906108fc903090600401611778565b60206040518083038186803b15801561091457600080fd5b505afa158015610928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094c9190611760565b6040518363ffffffff1660e01b81526004016109699291906117b0565b602060405180830381600087803b15801561098357600080fd5b505af1158015610997573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105639190611728565b6109c361139f565b156109e05760405162461bcd60e51b81526004016105519061198b565b6109e86113be565b15610a055760405162461bcd60e51b81526004016105519061198b565b6002546001600160a01b03163314610a2f5760405162461bcd60e51b8152600401610551906118d3565b60008111610a4f5760405162461bcd60e51b815260040161055190611867565b60065460408051633422f27b60e21b815290516000926001600160a01b03169163d08bc9ec916004808301926020929190829003018186803b158015610a9457600080fd5b505afa158015610aa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acc9190611760565b905080610ad95750610cb4565b6000610ae3610ff8565b6060015190506000610b0b610b048461046e87670de0b6b3a764000061120b565b8390611223565b6040805160808101825243815242602082019081528183018881526060830185815260048054600181018255600082905285517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b9183029182015593517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c85015591517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d840155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e9092019190915560035492516323b872dd60e01b815293945090926001600160a01b03909216916323b872dd91610c1191339130918b910161178c565b602060405180830381600087803b158015610c2b57600080fd5b505af1158015610c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c639190611728565b50600754610c72906001611223565b60075560405133907fac24935fd910bc682b5ccb1a07b718cadf8cf2f6d1404c4f3ddc3662dae40e2990610ca7908890611a84565b60405180910390a2505050505b50436000908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b600860209081526000928352604080842090915290825290208054600182015460029092015490919083565b600060075460011415610d315750600061047f565b6001600160a01b0382166000908152600a6020526040902054610d5e57610d57826106ae565b905061047f565b6001600160a01b0382166000908152600a6020526040812054610d82908490610566565b6040908101516007546001600160a01b0386166000908152600a60205292909220549092501415610e1a576001600160a01b0383166000908152600b6020526040902054610dea5750506001600160a01b0381166000908152600c602052604090205461047f565b6001600160a01b0383166000908152600b6020526040902054610e0e908490610566565b6040015191505061047f565b6007546001600160a01b0384166000908152600a60205260409020541015610e4357905061047f565b50600092915050565b610e546116b9565b6001600160a01b038216600090815260056020526040902060060154600480549091908110610e9357634e487b7160e01b600052603260045260246000fd5b90600052602060002090600402016040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050919050565b6006546040516370a0823160e01b815260009182916001600160a01b03909116906370a0823190610f10903390600401611778565b60206040518083038186803b158015610f2857600080fd5b505afa158015610f3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f609190611760565b11610f7d5760405162461bcd60e51b815260040161055190611917565b6105cd336113dd565b6000610f91336113dd565b604051636082d19960e11b81529091506001600160a01b0383169063c105a33290610fc290339085906004016117b0565b600060405180830381600087803b158015610fdc57600080fd5b505af1158015610ff0573d6000803e3d6000fd5b505050505050565b6110006116b9565b600461100a6105bc565b8154811061102857634e487b7160e01b600052603260045260246000fd5b9060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905090565b6110766116b9565b60048281548110610e9357634e487b7160e01b600052603260045260246000fd5b60056020819052600091825260409091208054600182015460028301546003840154600485015495850154600686015460078701546008909701549597949693959294939192909160ff169089565b6110ee61122f565b6001600160a01b03166110ff610874565b6001600160a01b0316146111255760405162461bcd60e51b81526004016105519061189e565b6001600160a01b03811661114b5760405162461bcd60e51b8152600401610551906117d4565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031681565b6003546001600160a01b031681565b600481815481106111d557600080fd5b60009182526020909120600490910201805460018201546002830154600390930154919350919084565b60006107c08284611b56565b60006107c08284611b37565b60006107c08284611b17565b60006107c08284611aff565b3390565b6001600160a01b0381166112595760405162461bcd60e51b81526004016105519061181a565b6040516001600160a01b038216906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000604051806060016040528060075481526020014281526020016112d5846106ae565b90526001600160a01b0383166000818152600860209081526040808320600780548552908352818420865181558387015160018201558287015160029091015554938352600a90915290205491925014611358576001600160a01b0382166000908152600a602081815260408084208054600b8452919094205560075491905290555b6001600160a01b0382166000908152600b6020526040902054611392576001600160a01b0382166000908152600b60205260409020600190555b61139b8261152d565b5050565b4360009081526020818152604080832032845290915290205460ff1690565b4360009081526020818152604080832033845290915290205460ff1690565b60006113e88261152d565b6001600160a01b0382166000908152600560205260409020600401548015611527576001600160a01b03808416600090815260056020526040808220600490810192909255600354905163a9059cbb60e01b815292169163a9059cbb916114539187918691016117b0565b602060405180830381600087803b15801561146d57600080fd5b505af1158015611481573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a59190611728565b50826001600160a01b03167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486826040516114df9190611a84565b60405180910390a26001600160a01b0383166000908152600b60205260409020546115275761150d836106ae565b6001600160a01b0384166000908152600c60205260409020555b92915050565b6001600160a01b0381166000908152600560208181526040928390208351610120810185528154815260018201549281019290925260028101549382019390935260038301546060820152600483015460808201529082015460a0820152600682015460c0820152600782015460ff16151560e08201526008909101546101008201526115b982610403565b60808201526115c66105bc565b60c082019081526001600160a01b039290921660009081526005602081815260409283902084518155908401516001820155918301516002830155606083015160038301556080830151600483015560a0830151908201559151600683015560e081015160078301805460ff19169115159190911790556101000151600890910155565b60405180610120016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600015158152602001600081525090565b60405180606001604052806000815260200160008152602001600081525090565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000602082840312156116f2578081fd5b81356107c081611b83565b6000806040838503121561170f578081fd5b823561171a81611b83565b946020939093013593505050565b600060208284031215611739578081fd5b815180151581146107c0578182fd5b600060208284031215611759578081fd5b5035919050565b600060208284031215611771578081fd5b5051919050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602d908201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260408201526c103732bb9037b832b930ba37b960991b606082015260800190565b6020808252601c908201527f426f617264726f6f6d3a2043616e6e6f7420616c6c6f63617465203000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b60208082526026908201527f426f617264726f6f6d3a20546865206469726563746f7220646f6573206e6f7460408201526508195e1a5cdd60d21b606082015260800190565b602080825260149082015273109bd85c991c9bdbdb4e881b9bdd081d985d5b1d60621b604082015260600190565b60208082526026908201527f436f6e747261637447756172643a206f6e6520626c6f636b2c206f6e652066756040820152653731ba34b7b760d11b606082015260800190565b8151815260208083015190820152604080830151908201526060918201519181019190915260800190565b600061012082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e0830151151560e083015261010080840151818401525092915050565b81518152602080830151908201526040918201519181019190915260600190565b90815260200190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b988952602089019790975260408801959095526060870193909352608086019190915260a085015260c0840152151560e08301526101008201526101200190565b60008219821115611b1257611b12611b6d565b500190565b600082611b3257634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611b5157611b51611b6d565b500290565b600082821015611b6857611b68611b6d565b500390565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461056357600080fdfea264697066735822122047972c8b13898f8ae6c4f9a7defafddbc9a56f966fde3a6ab039cc758b1092ef64736f6c634300080000338be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e074da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed0000000000000000000000000e3cc2c4fb9252d17d07c67135e48536071735d900000000000000000000000044811eff0f4dd2d7cb093a6d33bb6202eb2edf06000000000000000000000000ecce08c2636820a81fc0c805dbdc7d846636bbc40000000000000000000000002806e2e25480856432edb151e2975b6a49a5e079
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101ce5760003560e01c80638da5cb5b11610104578063c291818b116100a2578063f2fde38b11610071578063f2fde38b146103bd578063fbfa77cf146103d0578063fc0c546a146103d8578063fd147b7f146103e0576101ce565b8063c291818b14610367578063d518f2431461037a578063d7603ef714610382578063f0ec943014610395576101ce565b80639b2d6194116100de5780639b2d61941461030a578063b54076571461032c578063b6f3c6c01461033f578063b88a802f1461035f576101ce565b80638da5cb5b146102e757806396c86cfc146102ef57806397ffe1d7146102f7576101ce565b8063570ca7351161017157806370a082311161014b57806370a08231146102b1578063714b4658146102c4578063715018a6146102d757806376671808146102df576101ce565b8063570ca73514610276578063632447c91461028b5780636817031b1461029e576101ce565b806339344d9d116101ad57806339344d9d146102315780633f9e3f04146102515780634456eda214610259578063446a2ec81461026e576101ce565b80628cc262146101d357806304ab80fc146101fc57806329605e771461021c575b600080fd5b6101e66101e13660046116e1565b610403565b6040516101f39190611a84565b60405180910390f35b61020f61020a3660046116e1565b610484565b6040516101f391906119fc565b61022f61022a3660046116e1565b610512565b005b61024461023f3660046116fd565b610566565b6040516101f39190611a63565b6101e66105bc565b6102616105d2565b6040516101f391906117c9565b6101e66105f8565b61027e61060b565b6040516101f39190611778565b61022f6102993660046116e1565b61061a565b61022f6102ac3660046116e1565b61064d565b6101e66102bf3660046116e1565b6106ae565b6101e66102d23660046116e1565b6107c7565b61022f6107e5565b6101e661086e565b61027e610874565b61022f610883565b61022f610305366004611748565b6109bb565b61031d6103183660046116fd565b610cf0565b6040516101f393929190611a8d565b6101e661033a3660046116e1565b610d1c565b61035261034d3660046116e1565b610e4c565b6040516101f391906119d1565b6101e6610edb565b61022f6103753660046116e1565b610f86565b610352610ff8565b610352610390366004611748565b61106e565b6103a86103a33660046116e1565b611097565b6040516101f399989796959493929190611abe565b61022f6103cb3660046116e1565b6110e6565b61027e6111a7565b61027e6111b6565b6103f36103ee366004611748565b6111c5565b6040516101f39493929190611aa3565b60008061040e610ff8565b606001519050600061041f84610e4c565b606001516001600160a01b03851660009081526005602052604090206004015490915061047a90610474670de0b6b3a764000061046e61045f87876111ff565b6104688a610d1c565b9061120b565b90611217565b90611223565b925050505b919050565b61048c61164a565b506001600160a01b03166000908152600560208181526040928390208351610120810185528154815260018201549281019290925260028101549382019390935260038301546060820152600483015460808201529082015460a0820152600682015460c0820152600782015460ff16151560e082015260089091015461010082015290565b61051a61122f565b6001600160a01b031661052b610874565b6001600160a01b03161461055a5760405162461bcd60e51b81526004016105519061189e565b60405180910390fd5b61056381611233565b50565b61056e611698565b506001600160a01b0382166000908152600860209081526040808320848452825291829020825160608101845281548152600182015492810192909252600201549181019190915292915050565b6004546000906105cd9060016111ff565b905090565b6002546000906001600160a01b03166105e961122f565b6001600160a01b031614905090565b6000610602610ff8565b60600151905090565b6002546001600160a01b031690565b6006546001600160a01b031633146106445760405162461bcd60e51b81526004016105519061195d565b610563816112b1565b61065561122f565b6001600160a01b0316610666610874565b6001600160a01b03161461068c5760405162461bcd60e51b81526004016105519061189e565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6006546040516326d352ab60e11b815260009182916001600160a01b0390911690634da6a556906106e3908690600401611778565b60206040518083038186803b1580156106fb57600080fd5b505afa15801561070f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107339190611760565b6006546040516370a0823160e01b81529192506107c09183916001600160a01b0316906370a082319061076a908890600401611778565b60206040518083038186803b15801561078257600080fd5b505afa158015610796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ba9190611760565b906111ff565b9392505050565b6001600160a01b031660009081526005602052604090206006015490565b6107ed61122f565b6001600160a01b03166107fe610874565b6001600160a01b0316146108245760405162461bcd60e51b81526004016105519061189e565b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b60075481565b6001546001600160a01b031690565b61088b61122f565b6001600160a01b031661089c610874565b6001600160a01b0316146108c25760405162461bcd60e51b81526004016105519061189e565b6003546040516370a0823160e01b81526001600160a01b039091169063a9059cbb90339083906370a08231906108fc903090600401611778565b60206040518083038186803b15801561091457600080fd5b505afa158015610928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094c9190611760565b6040518363ffffffff1660e01b81526004016109699291906117b0565b602060405180830381600087803b15801561098357600080fd5b505af1158015610997573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105639190611728565b6109c361139f565b156109e05760405162461bcd60e51b81526004016105519061198b565b6109e86113be565b15610a055760405162461bcd60e51b81526004016105519061198b565b6002546001600160a01b03163314610a2f5760405162461bcd60e51b8152600401610551906118d3565b60008111610a4f5760405162461bcd60e51b815260040161055190611867565b60065460408051633422f27b60e21b815290516000926001600160a01b03169163d08bc9ec916004808301926020929190829003018186803b158015610a9457600080fd5b505afa158015610aa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acc9190611760565b905080610ad95750610cb4565b6000610ae3610ff8565b6060015190506000610b0b610b048461046e87670de0b6b3a764000061120b565b8390611223565b6040805160808101825243815242602082019081528183018881526060830185815260048054600181018255600082905285517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b9183029182015593517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c85015591517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d840155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e9092019190915560035492516323b872dd60e01b815293945090926001600160a01b03909216916323b872dd91610c1191339130918b910161178c565b602060405180830381600087803b158015610c2b57600080fd5b505af1158015610c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c639190611728565b50600754610c72906001611223565b60075560405133907fac24935fd910bc682b5ccb1a07b718cadf8cf2f6d1404c4f3ddc3662dae40e2990610ca7908890611a84565b60405180910390a2505050505b50436000908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b600860209081526000928352604080842090915290825290208054600182015460029092015490919083565b600060075460011415610d315750600061047f565b6001600160a01b0382166000908152600a6020526040902054610d5e57610d57826106ae565b905061047f565b6001600160a01b0382166000908152600a6020526040812054610d82908490610566565b6040908101516007546001600160a01b0386166000908152600a60205292909220549092501415610e1a576001600160a01b0383166000908152600b6020526040902054610dea5750506001600160a01b0381166000908152600c602052604090205461047f565b6001600160a01b0383166000908152600b6020526040902054610e0e908490610566565b6040015191505061047f565b6007546001600160a01b0384166000908152600a60205260409020541015610e4357905061047f565b50600092915050565b610e546116b9565b6001600160a01b038216600090815260056020526040902060060154600480549091908110610e9357634e487b7160e01b600052603260045260246000fd5b90600052602060002090600402016040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050919050565b6006546040516370a0823160e01b815260009182916001600160a01b03909116906370a0823190610f10903390600401611778565b60206040518083038186803b158015610f2857600080fd5b505afa158015610f3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f609190611760565b11610f7d5760405162461bcd60e51b815260040161055190611917565b6105cd336113dd565b6000610f91336113dd565b604051636082d19960e11b81529091506001600160a01b0383169063c105a33290610fc290339085906004016117b0565b600060405180830381600087803b158015610fdc57600080fd5b505af1158015610ff0573d6000803e3d6000fd5b505050505050565b6110006116b9565b600461100a6105bc565b8154811061102857634e487b7160e01b600052603260045260246000fd5b9060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905090565b6110766116b9565b60048281548110610e9357634e487b7160e01b600052603260045260246000fd5b60056020819052600091825260409091208054600182015460028301546003840154600485015495850154600686015460078701546008909701549597949693959294939192909160ff169089565b6110ee61122f565b6001600160a01b03166110ff610874565b6001600160a01b0316146111255760405162461bcd60e51b81526004016105519061189e565b6001600160a01b03811661114b5760405162461bcd60e51b8152600401610551906117d4565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031681565b6003546001600160a01b031681565b600481815481106111d557600080fd5b60009182526020909120600490910201805460018201546002830154600390930154919350919084565b60006107c08284611b56565b60006107c08284611b37565b60006107c08284611b17565b60006107c08284611aff565b3390565b6001600160a01b0381166112595760405162461bcd60e51b81526004016105519061181a565b6040516001600160a01b038216906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000604051806060016040528060075481526020014281526020016112d5846106ae565b90526001600160a01b0383166000818152600860209081526040808320600780548552908352818420865181558387015160018201558287015160029091015554938352600a90915290205491925014611358576001600160a01b0382166000908152600a602081815260408084208054600b8452919094205560075491905290555b6001600160a01b0382166000908152600b6020526040902054611392576001600160a01b0382166000908152600b60205260409020600190555b61139b8261152d565b5050565b4360009081526020818152604080832032845290915290205460ff1690565b4360009081526020818152604080832033845290915290205460ff1690565b60006113e88261152d565b6001600160a01b0382166000908152600560205260409020600401548015611527576001600160a01b03808416600090815260056020526040808220600490810192909255600354905163a9059cbb60e01b815292169163a9059cbb916114539187918691016117b0565b602060405180830381600087803b15801561146d57600080fd5b505af1158015611481573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a59190611728565b50826001600160a01b03167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486826040516114df9190611a84565b60405180910390a26001600160a01b0383166000908152600b60205260409020546115275761150d836106ae565b6001600160a01b0384166000908152600c60205260409020555b92915050565b6001600160a01b0381166000908152600560208181526040928390208351610120810185528154815260018201549281019290925260028101549382019390935260038301546060820152600483015460808201529082015460a0820152600682015460c0820152600782015460ff16151560e08201526008909101546101008201526115b982610403565b60808201526115c66105bc565b60c082019081526001600160a01b039290921660009081526005602081815260409283902084518155908401516001820155918301516002830155606083015160038301556080830151600483015560a0830151908201559151600683015560e081015160078301805460ff19169115159190911790556101000151600890910155565b60405180610120016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600015158152602001600081525090565b60405180606001604052806000815260200160008152602001600081525090565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6000602082840312156116f2578081fd5b81356107c081611b83565b6000806040838503121561170f578081fd5b823561171a81611b83565b946020939093013593505050565b600060208284031215611739578081fd5b815180151581146107c0578182fd5b600060208284031215611759578081fd5b5035919050565b600060208284031215611771578081fd5b5051919050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602d908201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260408201526c103732bb9037b832b930ba37b960991b606082015260800190565b6020808252601c908201527f426f617264726f6f6d3a2043616e6e6f7420616c6c6f63617465203000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b60208082526026908201527f426f617264726f6f6d3a20546865206469726563746f7220646f6573206e6f7460408201526508195e1a5cdd60d21b606082015260800190565b602080825260149082015273109bd85c991c9bdbdb4e881b9bdd081d985d5b1d60621b604082015260600190565b60208082526026908201527f436f6e747261637447756172643a206f6e6520626c6f636b2c206f6e652066756040820152653731ba34b7b760d11b606082015260800190565b8151815260208083015190820152604080830151908201526060918201519181019190915260800190565b600061012082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e0830151151560e083015261010080840151818401525092915050565b81518152602080830151908201526040918201519181019190915260600190565b90815260200190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b988952602089019790975260408801959095526060870193909352608086019190915260a085015260c0840152151560e08301526101008201526101200190565b60008219821115611b1257611b12611b6d565b500190565b600082611b3257634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611b5157611b51611b6d565b500290565b600082821015611b6857611b68611b6d565b500390565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461056357600080fdfea264697066735822122047972c8b13898f8ae6c4f9a7defafddbc9a56f966fde3a6ab039cc758b1092ef64736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000e3cc2c4fb9252d17d07c67135e48536071735d900000000000000000000000044811eff0f4dd2d7cb093a6d33bb6202eb2edf06000000000000000000000000ecce08c2636820a81fc0c805dbdc7d846636bbc40000000000000000000000002806e2e25480856432edb151e2975b6a49a5e079
-----Decoded View---------------
Arg [0] : token_ (address): 0x0E3cC2c4FB9252d17d07C67135E48536071735D9
Arg [1] : vault_ (address): 0x44811EfF0f4dD2d7cB093A6d33bB6202Eb2eDF06
Arg [2] : owner (address): 0xeccE08c2636820a81FC0c805dBDC7D846636bbc4
Arg [3] : operator (address): 0x2806e2e25480856432edB151e2975b6A49a5E079
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000e3cc2c4fb9252d17d07c67135e48536071735d9
Arg [1] : 00000000000000000000000044811eff0f4dd2d7cb093a6d33bb6202eb2edf06
Arg [2] : 000000000000000000000000ecce08c2636820a81fc0c805dbdc7d846636bbc4
Arg [3] : 0000000000000000000000002806e2e25480856432edb151e2975b6a49a5e079
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.