Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,415 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Exit | 16347766 | 726 days ago | IN | 0 ETH | 0.00151736 | ||||
Exit | 12763809 | 1277 days ago | IN | 0 ETH | 0.00052541 | ||||
Exit | 12451703 | 1325 days ago | IN | 0 ETH | 0.00531871 | ||||
Claim Reward | 12259061 | 1355 days ago | IN | 0 ETH | 0.00802701 | ||||
Claim Reward | 12259060 | 1355 days ago | IN | 0 ETH | 0.00802701 | ||||
Exit | 12259054 | 1355 days ago | IN | 0 ETH | 0.01887147 | ||||
Exit | 12242990 | 1357 days ago | IN | 0 ETH | 0.01108738 | ||||
Exit | 12076073 | 1383 days ago | IN | 0 ETH | 0.02204119 | ||||
Exit | 12004040 | 1394 days ago | IN | 0 ETH | 0.01316389 | ||||
Exit | 11874273 | 1414 days ago | IN | 0 ETH | 0.00898628 | ||||
Exit | 11800519 | 1426 days ago | IN | 0 ETH | 0.01236209 | ||||
Exit | 11794979 | 1426 days ago | IN | 0 ETH | 0.01599464 | ||||
Exit | 11690972 | 1442 days ago | IN | 0 ETH | 0.00681273 | ||||
Exit | 11678964 | 1444 days ago | IN | 0 ETH | 0.00923761 | ||||
Exit | 11661374 | 1447 days ago | IN | 0 ETH | 0.00551539 | ||||
Exit | 11650063 | 1449 days ago | IN | 0 ETH | 0.00628489 | ||||
Exit | 11649088 | 1449 days ago | IN | 0 ETH | 0.00508839 | ||||
Exit | 11599114 | 1457 days ago | IN | 0 ETH | 0.00996097 | ||||
Exit | 11595800 | 1457 days ago | IN | 0 ETH | 0.01904522 | ||||
Claim Reward | 11595800 | 1457 days ago | IN | 0 ETH | 0.01270856 | ||||
Exit | 11503824 | 1471 days ago | IN | 0 ETH | 0.00935081 | ||||
Exit | 11482337 | 1474 days ago | IN | 0 ETH | 0.00396741 | ||||
Claim Reward | 11473384 | 1476 days ago | IN | 0 ETH | 0.00312902 | ||||
Claim Reward | 11473314 | 1476 days ago | IN | 0 ETH | 0.00507632 | ||||
Claim Reward | 11443099 | 1480 days ago | IN | 0 ETH | 0.00066295 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StakingRewards
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-08-17 */ pragma solidity 0.5.16; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ 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); } /** * @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, 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) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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 mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @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]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } 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)); } 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. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "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"); } } } contract ReentrancyGuard { bool private _notEntered; constructor () internal { // Storing an initial 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 percetange 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. _notEntered = true; } /** * @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(_notEntered, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _notEntered = false; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _notEntered = true; } } contract StakingTokenWrapper is ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; IERC20 public stakingToken; uint256 private _totalSupply; mapping(address => uint256) private _balances; /** * @dev TokenWrapper constructor * @param _stakingToken Wrapped token to be staked */ constructor(address _stakingToken) internal { stakingToken = IERC20(_stakingToken); } /** * @dev Get the total amount of the staked token * @return uint256 total supply */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev Get the balance of a given account * @param _account User for which to retrieve balance */ function balanceOf(address _account) public view returns (uint256) { return _balances[_account]; } /** * @dev Deposits a given amount of StakingToken from sender * @param _amount Units of StakingToken */ function _stake(address _beneficiary, uint256 _amount) internal nonReentrant { _totalSupply = _totalSupply.add(_amount); _balances[_beneficiary] = _balances[_beneficiary].add(_amount); stakingToken.safeTransferFrom(msg.sender, address(this), _amount); } /** * @dev Withdraws a given stake from sender * @param _amount Units of StakingToken */ function _withdraw(uint256 _amount) internal nonReentrant { _totalSupply = _totalSupply.sub(_amount); _balances[msg.sender] = _balances[msg.sender].sub(_amount); stakingToken.safeTransfer(msg.sender, _amount); } } contract ModuleKeys { // Governance // =========== // Phases // keccak256("Governance"); // 2.x bytes32 internal constant KEY_GOVERNANCE = 0x9409903de1e6fd852dfc61c9dacb48196c48535b60e25abf92acc92dd689078d; //keccak256("Staking"); // 1.2 bytes32 internal constant KEY_STAKING = 0x1df41cd916959d1163dc8f0671a666ea8a3e434c13e40faef527133b5d167034; //keccak256("ProxyAdmin"); // 1.0 bytes32 internal constant KEY_PROXY_ADMIN = 0x96ed0203eb7e975a4cbcaa23951943fa35c5d8288117d50c12b3d48b0fab48d1; // mStable // ======= // keccak256("OracleHub"); // 1.2 bytes32 internal constant KEY_ORACLE_HUB = 0x8ae3a082c61a7379e2280f3356a5131507d9829d222d853bfa7c9fe1200dd040; // keccak256("Manager"); // 1.2 bytes32 internal constant KEY_MANAGER = 0x6d439300980e333f0256d64be2c9f67e86f4493ce25f82498d6db7f4be3d9e6f; //keccak256("Recollateraliser"); // 2.x bytes32 internal constant KEY_RECOLLATERALISER = 0x39e3ed1fc335ce346a8cbe3e64dd525cf22b37f1e2104a755e761c3c1eb4734f; //keccak256("MetaToken"); // 1.1 bytes32 internal constant KEY_META_TOKEN = 0xea7469b14936af748ee93c53b2fe510b9928edbdccac3963321efca7eb1a57a2; // keccak256("SavingsManager"); // 1.0 bytes32 internal constant KEY_SAVINGS_MANAGER = 0x12fe936c77a1e196473c4314f3bed8eeac1d757b319abb85bdda70df35511bf1; } interface INexus { function governor() external view returns (address); function getModule(bytes32 key) external view returns (address); function proposeModule(bytes32 _key, address _addr) external; function cancelProposedModule(bytes32 _key) external; function acceptProposedModule(bytes32 _key) external; function acceptProposedModules(bytes32[] calldata _keys) external; function requestLockModule(bytes32 _key) external; function cancelLockModule(bytes32 _key) external; function lockModule(bytes32 _key) external; } contract Module is ModuleKeys { INexus public nexus; /** * @dev Initialises the Module by setting publisher addresses, * and reading all available system module information */ constructor(address _nexus) internal { require(_nexus != address(0), "Nexus is zero address"); nexus = INexus(_nexus); } /** * @dev Modifier to allow function calls only from the Governor. */ modifier onlyGovernor() { require(msg.sender == _governor(), "Only governor can execute"); _; } /** * @dev Modifier to allow function calls only from the Governance. * Governance is either Governor address or Governance address. */ modifier onlyGovernance() { require( msg.sender == _governor() || msg.sender == _governance(), "Only governance can execute" ); _; } /** * @dev Modifier to allow function calls only from the ProxyAdmin. */ modifier onlyProxyAdmin() { require( msg.sender == _proxyAdmin(), "Only ProxyAdmin can execute" ); _; } /** * @dev Modifier to allow function calls only from the Manager. */ modifier onlyManager() { require(msg.sender == _manager(), "Only manager can execute"); _; } /** * @dev Returns Governor address from the Nexus * @return Address of Governor Contract */ function _governor() internal view returns (address) { return nexus.governor(); } /** * @dev Returns Governance Module address from the Nexus * @return Address of the Governance (Phase 2) */ function _governance() internal view returns (address) { return nexus.getModule(KEY_GOVERNANCE); } /** * @dev Return Staking Module address from the Nexus * @return Address of the Staking Module contract */ function _staking() internal view returns (address) { return nexus.getModule(KEY_STAKING); } /** * @dev Return ProxyAdmin Module address from the Nexus * @return Address of the ProxyAdmin Module contract */ function _proxyAdmin() internal view returns (address) { return nexus.getModule(KEY_PROXY_ADMIN); } /** * @dev Return MetaToken Module address from the Nexus * @return Address of the MetaToken Module contract */ function _metaToken() internal view returns (address) { return nexus.getModule(KEY_META_TOKEN); } /** * @dev Return OracleHub Module address from the Nexus * @return Address of the OracleHub Module contract */ function _oracleHub() internal view returns (address) { return nexus.getModule(KEY_ORACLE_HUB); } /** * @dev Return Manager Module address from the Nexus * @return Address of the Manager Module contract */ function _manager() internal view returns (address) { return nexus.getModule(KEY_MANAGER); } /** * @dev Return SavingsManager Module address from the Nexus * @return Address of the SavingsManager Module contract */ function _savingsManager() internal view returns (address) { return nexus.getModule(KEY_SAVINGS_MANAGER); } /** * @dev Return Recollateraliser Module address from the Nexus * @return Address of the Recollateraliser Module contract (Phase 2) */ function _recollateraliser() internal view returns (address) { return nexus.getModule(KEY_RECOLLATERALISER); } } interface IRewardsDistributionRecipient { function notifyRewardAmount(uint256 reward) external; function getRewardToken() external view returns (IERC20); } contract RewardsDistributionRecipient is IRewardsDistributionRecipient, Module { // @abstract function notifyRewardAmount(uint256 reward) external; function getRewardToken() external view returns (IERC20); // This address has the ability to distribute the rewards address public rewardsDistributor; /** @dev Recipient is a module, governed by mStable governance */ constructor(address _nexus, address _rewardsDistributor) internal Module(_nexus) { rewardsDistributor = _rewardsDistributor; } /** * @dev Only the rewards distributor can notify about rewards */ modifier onlyRewardsDistributor() { require(msg.sender == rewardsDistributor, "Caller is not reward distributor"); _; } /** * @dev Change the rewardsDistributor - only called by mStable governor * @param _rewardsDistributor Address of the new distributor */ function setRewardsDistribution(address _rewardsDistributor) external onlyGovernor { rewardsDistributor = _rewardsDistributor; } } library StableMath { using SafeMath for uint256; /** * @dev Scaling unit for use in specific calculations, * where 1 * 10**18, or 1e18 represents a unit '1' */ uint256 private constant FULL_SCALE = 1e18; /** * @notice Token Ratios are used when converting between units of bAsset, mAsset and MTA * Reasoning: Takes into account token decimals, and difference in base unit (i.e. grams to Troy oz for gold) * @dev bAsset ratio unit for use in exact calculations, * where (1 bAsset unit * bAsset.ratio) / ratioScale == x mAsset unit */ uint256 private constant RATIO_SCALE = 1e8; /** * @dev Provides an interface to the scaling unit * @return Scaling unit (1e18 or 1 * 10**18) */ function getFullScale() internal pure returns (uint256) { return FULL_SCALE; } /** * @dev Provides an interface to the ratio unit * @return Ratio scale unit (1e8 or 1 * 10**8) */ function getRatioScale() internal pure returns (uint256) { return RATIO_SCALE; } /** * @dev Scales a given integer to the power of the full scale. * @param x Simple uint256 to scale * @return Scaled value a to an exact number */ function scaleInteger(uint256 x) internal pure returns (uint256) { return x.mul(FULL_SCALE); } /*************************************** PRECISE ARITHMETIC ****************************************/ /** * @dev Multiplies two precise units, and then truncates by the full scale * @param x Left hand input to multiplication * @param y Right hand input to multiplication * @return Result after multiplying the two inputs and then dividing by the shared * scale unit */ function mulTruncate(uint256 x, uint256 y) internal pure returns (uint256) { return mulTruncateScale(x, y, FULL_SCALE); } /** * @dev Multiplies two precise units, and then truncates by the given scale. For example, * when calculating 90% of 10e18, (10e18 * 9e17) / 1e18 = (9e36) / 1e18 = 9e18 * @param x Left hand input to multiplication * @param y Right hand input to multiplication * @param scale Scale unit * @return Result after multiplying the two inputs and then dividing by the shared * scale unit */ function mulTruncateScale(uint256 x, uint256 y, uint256 scale) internal pure returns (uint256) { // e.g. assume scale = fullScale // z = 10e18 * 9e17 = 9e36 uint256 z = x.mul(y); // return 9e38 / 1e18 = 9e18 return z.div(scale); } /** * @dev Multiplies two precise units, and then truncates by the full scale, rounding up the result * @param x Left hand input to multiplication * @param y Right hand input to multiplication * @return Result after multiplying the two inputs and then dividing by the shared * scale unit, rounded up to the closest base unit. */ function mulTruncateCeil(uint256 x, uint256 y) internal pure returns (uint256) { // e.g. 8e17 * 17268172638 = 138145381104e17 uint256 scaled = x.mul(y); // e.g. 138145381104e17 + 9.99...e17 = 138145381113.99...e17 uint256 ceil = scaled.add(FULL_SCALE.sub(1)); // e.g. 13814538111.399...e18 / 1e18 = 13814538111 return ceil.div(FULL_SCALE); } /** * @dev Precisely divides two units, by first scaling the left hand operand. Useful * for finding percentage weightings, i.e. 8e18/10e18 = 80% (or 8e17) * @param x Left hand input to division * @param y Right hand input to division * @return Result after multiplying the left operand by the scale, and * executing the division on the right hand input. */ function divPrecisely(uint256 x, uint256 y) internal pure returns (uint256) { // e.g. 8e18 * 1e18 = 8e36 uint256 z = x.mul(FULL_SCALE); // e.g. 8e36 / 10e18 = 8e17 return z.div(y); } /*************************************** RATIO FUNCS ****************************************/ /** * @dev Multiplies and truncates a token ratio, essentially flooring the result * i.e. How much mAsset is this bAsset worth? * @param x Left hand operand to multiplication (i.e Exact quantity) * @param ratio bAsset ratio * @return Result after multiplying the two inputs and then dividing by the ratio scale */ function mulRatioTruncate(uint256 x, uint256 ratio) internal pure returns (uint256 c) { return mulTruncateScale(x, ratio, RATIO_SCALE); } /** * @dev Multiplies and truncates a token ratio, rounding up the result * i.e. How much mAsset is this bAsset worth? * @param x Left hand input to multiplication (i.e Exact quantity) * @param ratio bAsset ratio * @return Result after multiplying the two inputs and then dividing by the shared * ratio scale, rounded up to the closest base unit. */ function mulRatioTruncateCeil(uint256 x, uint256 ratio) internal pure returns (uint256) { // e.g. How much mAsset should I burn for this bAsset (x)? // 1e18 * 1e8 = 1e26 uint256 scaled = x.mul(ratio); // 1e26 + 9.99e7 = 100..00.999e8 uint256 ceil = scaled.add(RATIO_SCALE.sub(1)); // return 100..00.999e8 / 1e8 = 1e18 return ceil.div(RATIO_SCALE); } /** * @dev Precisely divides two ratioed units, by first scaling the left hand operand * i.e. How much bAsset is this mAsset worth? * @param x Left hand operand in division * @param ratio bAsset ratio * @return Result after multiplying the left operand by the scale, and * executing the division on the right hand input. */ function divRatioPrecisely(uint256 x, uint256 ratio) internal pure returns (uint256 c) { // e.g. 1e14 * 1e8 = 1e22 uint256 y = x.mul(RATIO_SCALE); // return 1e22 / 1e12 = 1e10 return y.div(ratio); } /*************************************** HELPERS ****************************************/ /** * @dev Calculates minimum of two numbers * @param x Left hand input * @param y Right hand input * @return Minimum of the two inputs */ function min(uint256 x, uint256 y) internal pure returns (uint256) { return x > y ? y : x; } /** * @dev Calculated maximum of two numbers * @param x Left hand input * @param y Right hand input * @return Maximum of the two inputs */ function max(uint256 x, uint256 y) internal pure returns (uint256) { return x > y ? x : y; } /** * @dev Clamps a value to an upper bound * @param x Left hand input * @param upperBound Maximum possible value to return * @return Input x clamped to a maximum value, upperBound */ function clamp(uint256 x, uint256 upperBound) internal pure returns (uint256) { return x > upperBound ? upperBound : x; } } // Internal // Libs /** * @title StakingRewards * @author Originally: Synthetix (forked from /Synthetixio/synthetix/contracts/StakingRewards.sol) * Audit: https://github.com/sigp/public-audits/blob/master/synthetix/unipool/review.pdf * Changes by: Stability Labs Pty. Ltd. * @notice Rewards stakers of a given LP token (a.k.a StakingToken) with RewardsToken, on a pro-rata basis * @dev Uses an ever increasing 'rewardPerTokenStored' variable to distribute rewards * each time a write action is called in the contract. This allows for passive reward accrual. * Changes: * - Cosmetic (comments, readability) * - Addition of getRewardToken() * - Changing of `StakingTokenWrapper` funcs from `super.stake` to `_stake` * - Introduced a `stake(_beneficiary)` function to enable contract wrappers to stake on behalf */ contract StakingRewards is StakingTokenWrapper, RewardsDistributionRecipient { using StableMath for uint256; IERC20 public rewardsToken; uint256 public constant DURATION = 7 days; // Timestamp for current period finish uint256 public periodFinish = 0; // RewardRate for the rest of the PERIOD uint256 public rewardRate = 0; // Last time any user took action uint256 public lastUpdateTime = 0; // Ever increasing rewardPerToken rate, based on % of total supply uint256 public rewardPerTokenStored = 0; mapping(address => uint256) public userRewardPerTokenPaid; mapping(address => uint256) public rewards; event RewardAdded(uint256 reward); event Staked(address indexed user, uint256 amount, address payer); event Withdrawn(address indexed user, uint256 amount); event RewardPaid(address indexed user, uint256 reward); /** @dev StakingRewards is a TokenWrapper and RewardRecipient */ constructor( address _nexus, address _stakingToken, address _rewardsToken, address _rewardsDistributor ) public StakingTokenWrapper(_stakingToken) RewardsDistributionRecipient(_nexus, _rewardsDistributor) { rewardsToken = IERC20(_rewardsToken); } /** @dev Updates the reward for a given address, before executing function */ modifier updateReward(address _account) { // Setting of global vars uint256 newRewardPerToken = rewardPerToken(); // If statement protects against loss in initialisation case if(newRewardPerToken > 0) { rewardPerTokenStored = newRewardPerToken; lastUpdateTime = lastTimeRewardApplicable(); // Setting of personal vars based on new globals if (_account != address(0)) { rewards[_account] = earned(_account); userRewardPerTokenPaid[_account] = newRewardPerToken; } } _; } /*************************************** ACTIONS ****************************************/ /** * @dev Stakes a given amount of the StakingToken for the sender * @param _amount Units of StakingToken */ function stake(uint256 _amount) external { _stake(msg.sender, _amount); } /** * @dev Stakes a given amount of the StakingToken for a given beneficiary * @param _beneficiary Staked tokens are credited to this address * @param _amount Units of StakingToken */ function stake(address _beneficiary, uint256 _amount) external { _stake(_beneficiary, _amount); } /** * @dev Internally stakes an amount by depositing from sender, * and crediting to the specified beneficiary * @param _beneficiary Staked tokens are credited to this address * @param _amount Units of StakingToken */ function _stake(address _beneficiary, uint256 _amount) internal updateReward(_beneficiary) { require(_amount > 0, "Cannot stake 0"); super._stake(_beneficiary, _amount); emit Staked(_beneficiary, _amount, msg.sender); } /** * @dev Withdraws stake from pool and claims any rewards */ function exit() external { withdraw(balanceOf(msg.sender)); claimReward(); } /** * @dev Withdraws given stake amount from the pool * @param _amount Units of the staked token to withdraw */ function withdraw(uint256 _amount) public updateReward(msg.sender) { require(_amount > 0, "Cannot withdraw 0"); _withdraw(_amount); emit Withdrawn(msg.sender, _amount); } /** * @dev Claims outstanding rewards for the sender. * First updates outstanding reward allocation and then transfers. */ function claimReward() public updateReward(msg.sender) { uint256 reward = rewards[msg.sender]; if (reward > 0) { rewards[msg.sender] = 0; rewardsToken.transfer(msg.sender, reward); emit RewardPaid(msg.sender, reward); } } /*************************************** GETTERS ****************************************/ /** * @dev Gets the RewardsToken */ function getRewardToken() external view returns (IERC20) { return rewardsToken; } /** * @dev Gets the last applicable timestamp for this reward period */ function lastTimeRewardApplicable() public view returns (uint256) { return StableMath.min(block.timestamp, periodFinish); } /** * @dev Calculates the amount of unclaimed rewards per token since last update, * and sums with stored to give the new cumulative reward per token * @return 'Reward' per staked token */ function rewardPerToken() public view returns (uint256) { // If there is no StakingToken liquidity, avoid div(0) uint256 stakedTokens = totalSupply(); if (stakedTokens == 0) { return rewardPerTokenStored; } // new reward units to distribute = rewardRate * timeSinceLastUpdate uint256 rewardUnitsToDistribute = rewardRate.mul(lastTimeRewardApplicable().sub(lastUpdateTime)); // new reward units per token = (rewardUnitsToDistribute * 1e18) / totalTokens uint256 unitsToDistributePerToken = rewardUnitsToDistribute.divPrecisely(stakedTokens); // return summed rate return rewardPerTokenStored.add(unitsToDistributePerToken); } /** * @dev Calculates the amount of unclaimed rewards a user has earned * @param _account User address * @return Total reward amount earned */ function earned(address _account) public view returns (uint256) { // current rate per token - rate user previously received uint256 userRewardDelta = rewardPerToken().sub(userRewardPerTokenPaid[_account]); // new reward = staked tokens * difference in rate uint256 userNewReward = balanceOf(_account).mulTruncate(userRewardDelta); // add to previous rewards return rewards[_account].add(userNewReward); } /*************************************** ADMIN ****************************************/ /** * @dev Notifies the contract that new rewards have been added. * Calculates an updated rewardRate based on the rewards in period. * @param _reward Units of RewardToken that have been added to the pool */ function notifyRewardAmount(uint256 _reward) external onlyRewardsDistributor updateReward(address(0)) { uint256 currentTime = block.timestamp; // If previous period over, reset rewardRate if (currentTime >= periodFinish) { rewardRate = _reward.div(DURATION); } // If additional reward to existing period, calc sum else { uint256 remaining = periodFinish.sub(currentTime); uint256 leftover = remaining.mul(rewardRate); rewardRate = _reward.add(leftover).div(DURATION); } lastUpdateTime = currentTime; periodFinish = currentTime.add(DURATION); emit RewardAdded(_reward); } /** * @dev Collects the accumulated BAL token from the contract * @param _recipient Recipient to credit */ function collectRewardToken( address _recipient ) external onlyGovernor { // Official checksummed BAL token address // https://ethplorer.io/address/0xba100000625a3754423978a60c9317c58a424e3d IERC20 balToken = IERC20(0xba100000625a3754423978a60c9317c58a424e3D); uint256 balance = balToken.balanceOf(address(this)); require(balToken.transfer(_recipient, balance), "Collection transfer failed"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_nexus","type":"address"},{"internalType":"address","name":"_stakingToken","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_rewardsDistributor","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"payer","type":"address"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"constant":true,"inputs":[],"name":"DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claimReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"collectRewardToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getRewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nexus","outputs":[{"internalType":"contract INexus","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsDistributor","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardsDistributor","type":"address"}],"name":"setRewardsDistribution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600060065560006007556000600855600060095534801561002457600080fd5b506040516115e83803806115e88339818101604052608081101561004757600080fd5b50805160208201516040830151606090930151600080546001600160a01b0380851661010002610100600160a81b031960ff1990931660011792909216919091179091559293919284908290829081166100e8576040805162461bcd60e51b815260206004820152601560248201527f4e65787573206973207a65726f20616464726573730000000000000000000000604482015290519081900360640190fd5b600380546001600160a01b03199081166001600160a01b03938416179091556004805482169383169390931790925560058054909216941693909317909255506114ab925082915061013d90506000396000f3fe608060405234801561001057600080fd5b50600436106101725760003560e01c80637b0a47ee116100de578063b88a802f11610097578063d1af0c7d11610071578063d1af0c7d14610366578063df136d651461036e578063e9fad8ee14610376578063ebe2b12b1461037e57610172565b8063b88a802f1461034e578063c8f33c9114610356578063cd3daf9d1461035e57610172565b80637b0a47ee146102c757806380faa57d146102cf5780638b876347146102d7578063a3f5c1d2146102fd578063a694fc3a14610305578063adc9772e1461032257610172565b80633c6b16ab116101305780633c6b16ab1461022a5780633f2a5540146102475780635ef6105d1461026b57806369940d791461029157806370a082311461029957806372f702f3146102bf57610172565b80628cc262146101775780630700037d146101af57806318160ddd146101d557806319762143146101dd5780631be05289146102055780632e1a7d4d1461020d575b600080fd5b61019d6004803603602081101561018d57600080fd5b50356001600160a01b0316610386565b60408051918252519081900360200190f35b61019d600480360360208110156101c557600080fd5b50356001600160a01b031661040a565b61019d61041c565b610203600480360360208110156101f357600080fd5b50356001600160a01b0316610423565b005b61019d6104ae565b6102036004803603602081101561022357600080fd5b50356104b5565b6102036004803603602081101561024057600080fd5b50356105a5565b61024f61073b565b604080516001600160a01b039092168252519081900360200190f35b6102036004803603602081101561028157600080fd5b50356001600160a01b031661074a565b61024f61090d565b61019d600480360360208110156102af57600080fd5b50356001600160a01b031661091c565b61024f610937565b61019d61094b565b61019d610951565b61019d600480360360208110156102ed57600080fd5b50356001600160a01b0316610964565b61024f610976565b6102036004803603602081101561031b57600080fd5b5035610985565b6102036004803603604081101561033857600080fd5b506001600160a01b038135169060200135610992565b6102036109a0565b61019d610ae5565b61019d610aeb565b61024f610b5b565b61019d610b6a565b610203610b70565b61019d610b8b565b6001600160a01b0381166000908152600a602052604081205481906103b9906103ad610aeb565b9063ffffffff610b9116565b905060006103d6826103ca8661091c565b9063ffffffff610bdc16565b6001600160a01b0385166000908152600b6020526040902054909150610402908263ffffffff610bf116565b949350505050565b600b6020526000908152604090205481565b6001545b90565b61042b610c4b565b6001600160a01b0316336001600160a01b03161461048c576040805162461bcd60e51b81526020600482015260196024820152784f6e6c7920676f7665726e6f722063616e206578656375746560381b604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b62093a8081565b3360006104c0610aeb565b905080156105185760098190556104d5610951565b6008556001600160a01b03821615610518576104f082610386565b6001600160a01b0383166000908152600b6020908152604080832093909355600a9052208190555b60008311610561576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b61056a83610cc1565b60408051848152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a2505050565b6004546001600160a01b03163314610604576040805162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f7420726577617264206469737472696275746f72604482015290519081900360640190fd5b60008061060f610aeb565b90508015610667576009819055610624610951565b6008556001600160a01b038216156106675761063f82610386565b6001600160a01b0383166000908152600b6020908152604080832093909355600a9052208190555b6006544290811061068d576106858462093a8063ffffffff610d9d16565b6007556106e7565b6006546000906106a3908363ffffffff610b9116565b905060006106bc60075483610ddf90919063ffffffff16565b90506106e162093a806106d5888463ffffffff610bf116565b9063ffffffff610d9d16565b60075550505b60088190556106ff8162093a8063ffffffff610bf116565b6006556040805185815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a150505050565b6004546001600160a01b031681565b610752610c4b565b6001600160a01b0316336001600160a01b0316146107b3576040805162461bcd60e51b81526020600482015260196024820152784f6e6c7920676f7665726e6f722063616e206578656375746560381b604482015290519081900360640190fd5b604080516370a0823160e01b8152306004820152905173ba100000625a3754423978a60c9317c58a424e3d9160009183916370a08231916024808301926020929190829003018186803b15801561080957600080fd5b505afa15801561081d573d6000803e3d6000fd5b505050506040513d602081101561083357600080fd5b50516040805163a9059cbb60e01b81526001600160a01b0386811660048301526024820184905291519293509084169163a9059cbb916044808201926020929091908290030181600087803b15801561088b57600080fd5b505af115801561089f573d6000803e3d6000fd5b505050506040513d60208110156108b557600080fd5b5051610908576040805162461bcd60e51b815260206004820152601a60248201527f436f6c6c656374696f6e207472616e73666572206661696c6564000000000000604482015290519081900360640190fd5b505050565b6005546001600160a01b031690565b6001600160a01b031660009081526002602052604090205490565b60005461010090046001600160a01b031681565b60075481565b600061095f42600654610e38565b905090565b600a6020526000908152604090205481565b6003546001600160a01b031681565b61098f3382610e4d565b50565b61099c8282610e4d565b5050565b3360006109ab610aeb565b90508015610a035760098190556109c0610951565b6008556001600160a01b03821615610a03576109db82610386565b6001600160a01b0383166000908152600b6020908152604080832093909355600a9052208190555b336000908152600b6020526040902054801561090857336000818152600b60209081526040808320839055600554815163a9059cbb60e01b815260048101959095526024850186905290516001600160a01b039091169363a9059cbb9360448083019493928390030190829087803b158015610a7e57600080fd5b505af1158015610a92573d6000803e3d6000fd5b505050506040513d6020811015610aa857600080fd5b505060408051828152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a2505050565b60085481565b600080610af661041c565b905080610b07575050600954610420565b6000610b29610b1a6008546103ad610951565b6007549063ffffffff610ddf16565b90506000610b3d828463ffffffff610f4816565b600954909150610b53908263ffffffff610bf116565b935050505090565b6005546001600160a01b031681565b60095481565b610b81610b7c3361091c565b6104b5565b610b896109a0565b565b60065481565b6000610bd383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610f75565b90505b92915050565b6000610bd38383670de0b6b3a764000061100c565b600082820183811015610bd3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6003546040805163030d028960e21b815290516000926001600160a01b031691630c340a24916004808301926020929190829003018186803b158015610c9057600080fd5b505afa158015610ca4573d6000803e3d6000fd5b505050506040513d6020811015610cba57600080fd5b5051905090565b60005460ff16610d18576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff19169055600154610d35908263ffffffff610b9116565b60015533600090815260026020526040902054610d58908263ffffffff610b9116565b336000818152600260205260408120929092559054610d8d916101009091046001600160a01b0316908363ffffffff61103a16565b506000805460ff19166001179055565b6000610bd383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061108c565b600082610dee57506000610bd6565b82820282848281610dfb57fe5b0414610bd35760405162461bcd60e51b815260040180806020018281038252602181526020018061142c6021913960400191505060405180910390fd5b6000818311610e475782610bd3565b50919050565b816000610e58610aeb565b90508015610eb0576009819055610e6d610951565b6008556001600160a01b03821615610eb057610e8882610386565b6001600160a01b0383166000908152600b6020908152604080832093909355600a9052208190555b60008311610ef6576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b610f0084846110f1565b6040805184815233602082015281516001600160a01b038716927f9f9e4044c5742cca66ca090b21552bac14645e68bad7a92364a9d9ff18111a1c928290030190a250505050565b600080610f6384670de0b6b3a764000063ffffffff610ddf16565b9050610402818463ffffffff610d9d16565b600081848411156110045760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610fc9578181015183820152602001610fb1565b50505050905090810190601f168015610ff65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008061101f858563ffffffff610ddf16565b9050611031818463ffffffff610d9d16565b95945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526109089084906111da565b600081836110db5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fc9578181015183820152602001610fb1565b5060008385816110e757fe5b0495945050505050565b60005460ff16611148576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff19169055600154611165908263ffffffff610bf116565b6001556001600160a01b038216600090815260026020526040902054611191908263ffffffff610bf116565b6001600160a01b0380841660009081526002602052604081209290925590546111c9916101009091041633308463ffffffff61139816565b50506000805460ff19166001179055565b6111ec826001600160a01b03166113f2565b61123d576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b6020831061127b5780518252601f19909201916020918201910161125c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146112dd576040519150601f19603f3d011682016040523d82523d6000602084013e6112e2565b606091505b509150915081611339576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156113925780806020019051602081101561135557600080fd5b50516113925760405162461bcd60e51b815260040180806020018281038252602a81526020018061144d602a913960400191505060405180910390fd5b50505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526113929085906111da565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061040257505015159291505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a72315820fd7b3b68d246fac29f1e26c952a7daee595e26bbdb60336f9ffdd15cb9dd97f364736f6c63430005100032000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb30000000000000000000000004019ba88158daa468a063ac48171a3bfe8cd9f3b000000000000000000000000a3bed4e1c75d00fa6f4e5e6922db7261b5e9acd200000000000000000000000004dfdfa471b79cc9e6e8c355e6c71f8ec4916c50
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101725760003560e01c80637b0a47ee116100de578063b88a802f11610097578063d1af0c7d11610071578063d1af0c7d14610366578063df136d651461036e578063e9fad8ee14610376578063ebe2b12b1461037e57610172565b8063b88a802f1461034e578063c8f33c9114610356578063cd3daf9d1461035e57610172565b80637b0a47ee146102c757806380faa57d146102cf5780638b876347146102d7578063a3f5c1d2146102fd578063a694fc3a14610305578063adc9772e1461032257610172565b80633c6b16ab116101305780633c6b16ab1461022a5780633f2a5540146102475780635ef6105d1461026b57806369940d791461029157806370a082311461029957806372f702f3146102bf57610172565b80628cc262146101775780630700037d146101af57806318160ddd146101d557806319762143146101dd5780631be05289146102055780632e1a7d4d1461020d575b600080fd5b61019d6004803603602081101561018d57600080fd5b50356001600160a01b0316610386565b60408051918252519081900360200190f35b61019d600480360360208110156101c557600080fd5b50356001600160a01b031661040a565b61019d61041c565b610203600480360360208110156101f357600080fd5b50356001600160a01b0316610423565b005b61019d6104ae565b6102036004803603602081101561022357600080fd5b50356104b5565b6102036004803603602081101561024057600080fd5b50356105a5565b61024f61073b565b604080516001600160a01b039092168252519081900360200190f35b6102036004803603602081101561028157600080fd5b50356001600160a01b031661074a565b61024f61090d565b61019d600480360360208110156102af57600080fd5b50356001600160a01b031661091c565b61024f610937565b61019d61094b565b61019d610951565b61019d600480360360208110156102ed57600080fd5b50356001600160a01b0316610964565b61024f610976565b6102036004803603602081101561031b57600080fd5b5035610985565b6102036004803603604081101561033857600080fd5b506001600160a01b038135169060200135610992565b6102036109a0565b61019d610ae5565b61019d610aeb565b61024f610b5b565b61019d610b6a565b610203610b70565b61019d610b8b565b6001600160a01b0381166000908152600a602052604081205481906103b9906103ad610aeb565b9063ffffffff610b9116565b905060006103d6826103ca8661091c565b9063ffffffff610bdc16565b6001600160a01b0385166000908152600b6020526040902054909150610402908263ffffffff610bf116565b949350505050565b600b6020526000908152604090205481565b6001545b90565b61042b610c4b565b6001600160a01b0316336001600160a01b03161461048c576040805162461bcd60e51b81526020600482015260196024820152784f6e6c7920676f7665726e6f722063616e206578656375746560381b604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b62093a8081565b3360006104c0610aeb565b905080156105185760098190556104d5610951565b6008556001600160a01b03821615610518576104f082610386565b6001600160a01b0383166000908152600b6020908152604080832093909355600a9052208190555b60008311610561576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b61056a83610cc1565b60408051848152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a2505050565b6004546001600160a01b03163314610604576040805162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f7420726577617264206469737472696275746f72604482015290519081900360640190fd5b60008061060f610aeb565b90508015610667576009819055610624610951565b6008556001600160a01b038216156106675761063f82610386565b6001600160a01b0383166000908152600b6020908152604080832093909355600a9052208190555b6006544290811061068d576106858462093a8063ffffffff610d9d16565b6007556106e7565b6006546000906106a3908363ffffffff610b9116565b905060006106bc60075483610ddf90919063ffffffff16565b90506106e162093a806106d5888463ffffffff610bf116565b9063ffffffff610d9d16565b60075550505b60088190556106ff8162093a8063ffffffff610bf116565b6006556040805185815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a150505050565b6004546001600160a01b031681565b610752610c4b565b6001600160a01b0316336001600160a01b0316146107b3576040805162461bcd60e51b81526020600482015260196024820152784f6e6c7920676f7665726e6f722063616e206578656375746560381b604482015290519081900360640190fd5b604080516370a0823160e01b8152306004820152905173ba100000625a3754423978a60c9317c58a424e3d9160009183916370a08231916024808301926020929190829003018186803b15801561080957600080fd5b505afa15801561081d573d6000803e3d6000fd5b505050506040513d602081101561083357600080fd5b50516040805163a9059cbb60e01b81526001600160a01b0386811660048301526024820184905291519293509084169163a9059cbb916044808201926020929091908290030181600087803b15801561088b57600080fd5b505af115801561089f573d6000803e3d6000fd5b505050506040513d60208110156108b557600080fd5b5051610908576040805162461bcd60e51b815260206004820152601a60248201527f436f6c6c656374696f6e207472616e73666572206661696c6564000000000000604482015290519081900360640190fd5b505050565b6005546001600160a01b031690565b6001600160a01b031660009081526002602052604090205490565b60005461010090046001600160a01b031681565b60075481565b600061095f42600654610e38565b905090565b600a6020526000908152604090205481565b6003546001600160a01b031681565b61098f3382610e4d565b50565b61099c8282610e4d565b5050565b3360006109ab610aeb565b90508015610a035760098190556109c0610951565b6008556001600160a01b03821615610a03576109db82610386565b6001600160a01b0383166000908152600b6020908152604080832093909355600a9052208190555b336000908152600b6020526040902054801561090857336000818152600b60209081526040808320839055600554815163a9059cbb60e01b815260048101959095526024850186905290516001600160a01b039091169363a9059cbb9360448083019493928390030190829087803b158015610a7e57600080fd5b505af1158015610a92573d6000803e3d6000fd5b505050506040513d6020811015610aa857600080fd5b505060408051828152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a2505050565b60085481565b600080610af661041c565b905080610b07575050600954610420565b6000610b29610b1a6008546103ad610951565b6007549063ffffffff610ddf16565b90506000610b3d828463ffffffff610f4816565b600954909150610b53908263ffffffff610bf116565b935050505090565b6005546001600160a01b031681565b60095481565b610b81610b7c3361091c565b6104b5565b610b896109a0565b565b60065481565b6000610bd383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610f75565b90505b92915050565b6000610bd38383670de0b6b3a764000061100c565b600082820183811015610bd3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6003546040805163030d028960e21b815290516000926001600160a01b031691630c340a24916004808301926020929190829003018186803b158015610c9057600080fd5b505afa158015610ca4573d6000803e3d6000fd5b505050506040513d6020811015610cba57600080fd5b5051905090565b60005460ff16610d18576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff19169055600154610d35908263ffffffff610b9116565b60015533600090815260026020526040902054610d58908263ffffffff610b9116565b336000818152600260205260408120929092559054610d8d916101009091046001600160a01b0316908363ffffffff61103a16565b506000805460ff19166001179055565b6000610bd383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061108c565b600082610dee57506000610bd6565b82820282848281610dfb57fe5b0414610bd35760405162461bcd60e51b815260040180806020018281038252602181526020018061142c6021913960400191505060405180910390fd5b6000818311610e475782610bd3565b50919050565b816000610e58610aeb565b90508015610eb0576009819055610e6d610951565b6008556001600160a01b03821615610eb057610e8882610386565b6001600160a01b0383166000908152600b6020908152604080832093909355600a9052208190555b60008311610ef6576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b610f0084846110f1565b6040805184815233602082015281516001600160a01b038716927f9f9e4044c5742cca66ca090b21552bac14645e68bad7a92364a9d9ff18111a1c928290030190a250505050565b600080610f6384670de0b6b3a764000063ffffffff610ddf16565b9050610402818463ffffffff610d9d16565b600081848411156110045760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610fc9578181015183820152602001610fb1565b50505050905090810190601f168015610ff65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008061101f858563ffffffff610ddf16565b9050611031818463ffffffff610d9d16565b95945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526109089084906111da565b600081836110db5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610fc9578181015183820152602001610fb1565b5060008385816110e757fe5b0495945050505050565b60005460ff16611148576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff19169055600154611165908263ffffffff610bf116565b6001556001600160a01b038216600090815260026020526040902054611191908263ffffffff610bf116565b6001600160a01b0380841660009081526002602052604081209290925590546111c9916101009091041633308463ffffffff61139816565b50506000805460ff19166001179055565b6111ec826001600160a01b03166113f2565b61123d576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b6020831061127b5780518252601f19909201916020918201910161125c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146112dd576040519150601f19603f3d011682016040523d82523d6000602084013e6112e2565b606091505b509150915081611339576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156113925780806020019051602081101561135557600080fd5b50516113925760405162461bcd60e51b815260040180806020018281038252602a81526020018061144d602a913960400191505060405180910390fd5b50505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526113929085906111da565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061040257505015159291505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a72315820fd7b3b68d246fac29f1e26c952a7daee595e26bbdb60336f9ffdd15cb9dd97f364736f6c63430005100032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb30000000000000000000000004019ba88158daa468a063ac48171a3bfe8cd9f3b000000000000000000000000a3bed4e1c75d00fa6f4e5e6922db7261b5e9acd200000000000000000000000004dfdfa471b79cc9e6e8c355e6c71f8ec4916c50
-----Decoded View---------------
Arg [0] : _nexus (address): 0xAFcE80b19A8cE13DEc0739a1aaB7A028d6845Eb3
Arg [1] : _stakingToken (address): 0x4019BA88158Daa468A063aC48171a3Bfe8cd9F3b
Arg [2] : _rewardsToken (address): 0xa3BeD4E1c75D00fa6f4E5E6922DB7261B5E9AcD2
Arg [3] : _rewardsDistributor (address): 0x04dfDfa471b79cc9E6E8C355e6C71F8eC4916C50
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb3
Arg [1] : 0000000000000000000000004019ba88158daa468a063ac48171a3bfe8cd9f3b
Arg [2] : 000000000000000000000000a3bed4e1c75d00fa6f4e5e6922db7261b5e9acd2
Arg [3] : 00000000000000000000000004dfdfa471b79cc9e6e8c355e6c71f8ec4916c50
Deployed Bytecode Sourcemap
33588:8318:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33588:8318:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39659:495;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39659:495:0;-1:-1:-1;;;;;39659:495:0;;:::i;:::-;;;;;;;;;;;;;;;;34221:42;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34221:42:0;-1:-1:-1;;;;;34221:42:0;;:::i;16462:123::-;;;:::i;24655:165::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24655:165:0;-1:-1:-1;;;;;24655:165:0;;:::i;:::-;;33746:41;;;:::i;37215:225::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37215:225:0;;:::i;40523:753::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40523:753:0;;:::i;23973:33::-;;;:::i;:::-;;;;-1:-1:-1;;;;;23973:33:0;;;;;;;;;;;;;;41418:485;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41418:485:0;-1:-1:-1;;;;;41418:485:0;;:::i;38096:127::-;;;:::i;16718:144::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16718:144:0;-1:-1:-1;;;;;16718:144:0;;:::i;16010:26::-;;;:::i;33924:29::-;;;:::i;38320:169::-;;;:::i;34157:57::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34157:57:0;-1:-1:-1;;;;;34157:57:0;;:::i;19856:19::-;;;:::i;35893:101::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35893:101:0;;:::i;36220:125::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36220:125:0;;;;;;;;:::i;37594:315::-;;;:::i;33999:33::-;;;:::i;38715:764::-;;;:::i;33711:26::-;;;:::i;34111:39::-;;;:::i;36973:99::-;;;:::i;33840:31::-;;;:::i;39659:495::-;-1:-1:-1;;;;;39880:32:0;;39741:7;39880:32;;;:22;:32;;;;;;39741:7;;39859:54;;:16;:14;:16::i;:::-;:20;:54;:20;:54;:::i;:::-;39833:80;;39984:21;40008:48;40040:15;40008:19;40018:8;40008:9;:19::i;:::-;:31;:48;:31;:48;:::i;:::-;-1:-1:-1;;;;;40110:17:0;;;;;;:7;:17;;;;;;39984:72;;-1:-1:-1;40110:36:0;;39984:72;40110:36;:21;:36;:::i;:::-;40103:43;39659:495;-1:-1:-1;;;;39659:495:0:o;34221:42::-;;;;;;;;;;;;;:::o;16462:123::-;16565:12;;16462:123;;:::o;24655:165::-;20331:11;:9;:11::i;:::-;-1:-1:-1;;;;;20317:25:0;:10;-1:-1:-1;;;;;20317:25:0;;20309:63;;;;;-1:-1:-1;;;20309:63:0;;;;;;;;;;;;-1:-1:-1;;;20309:63:0;;;;;;;;;;;;;;;24772:18;:40;;-1:-1:-1;;;;;;24772:40:0;-1:-1:-1;;;;;24772:40:0;;;;;;;;;;24655:165::o;33746:41::-;33781:6;33746:41;:::o;37215:225::-;37288:10;35087:25;35115:16;:14;:16::i;:::-;35087:44;-1:-1:-1;35215:21:0;;35212:397;;35253:20;:40;;;35325:26;:24;:26::i;:::-;35308:14;:43;-1:-1:-1;;;;;35432:22:0;;;35428:170;;35495:16;35502:8;35495:6;:16::i;:::-;-1:-1:-1;;;;;35475:17:0;;;;;;:7;:17;;;;;;;;:36;;;;35530:22;:32;;;:52;;;35428:170;37334:1;37324:7;:11;37316:41;;;;;-1:-1:-1;;;37316:41:0;;;;;;;;;;;;-1:-1:-1;;;37316:41:0;;;;;;;;;;;;;;;37368:18;37378:7;37368:9;:18::i;:::-;37402:30;;;;;;;;37412:10;;37402:30;;;;;;;;;;37215:225;;;:::o;40523:753::-;24409:18;;-1:-1:-1;;;;;24409:18:0;24395:10;:32;24387:77;;;;;-1:-1:-1;;;24387:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40648:1;35087:25;35115:16;:14;:16::i;:::-;35087:44;-1:-1:-1;35215:21:0;;35212:397;;35253:20;:40;;;35325:26;:24;:26::i;:::-;35308:14;:43;-1:-1:-1;;;;;35432:22:0;;;35428:170;;35495:16;35502:8;35495:6;:16::i;:::-;-1:-1:-1;;;;;35475:17:0;;;;;;:7;:17;;;;;;;;:36;;;;35530:22;:32;;;:52;;;35428:170;40789:12;;40690:15;;40774:27;;40770:369;;40831:21;:7;33781:6;40831:21;:11;:21;:::i;:::-;40818:10;:34;40770:369;;;40976:12;;40956:17;;40976:29;;40993:11;40976:29;:16;:29;:::i;:::-;40956:49;;41020:16;41039:25;41053:10;;41039:9;:13;;:25;;;;:::i;:::-;41020:44;-1:-1:-1;41092:35:0;33781:6;41092:21;:7;41020:44;41092:21;:11;:21;:::i;:::-;:25;:35;:25;:35;:::i;:::-;41079:10;:48;-1:-1:-1;;40770:369:0;41151:14;:28;;;41205:25;41168:11;33781:6;41205:25;:15;:25;:::i;:::-;41190:12;:40;41248:20;;;;;;;;;;;;;;;;;35619:1;24475;;40523:753;:::o;23973:33::-;;;-1:-1:-1;;;;;23973:33:0;;:::o;41418:485::-;20331:11;:9;:11::i;:::-;-1:-1:-1;;;;;20317:25:0;:10;-1:-1:-1;;;;;20317:25:0;;20309:63;;;;;-1:-1:-1;;;20309:63:0;;;;;;;;;;;;-1:-1:-1;;;20309:63:0;;;;;;;;;;;;;;;41772:33;;;-1:-1:-1;;;41772:33:0;;41799:4;41772:33;;;;;;41698:42;;41673:15;;41698:42;;41772:18;;:33;;;;;;;;;;;;;;41698:42;41772:33;;;5:2:-1;;;;30:1;27;20:12;5:2;41772:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41772:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41772:33:0;41826:38;;;-1:-1:-1;;;41826:38:0;;-1:-1:-1;;;;;41826:38:0;;;;;;;;;;;;;;;41772:33;;-1:-1:-1;41826:17:0;;;;;;:38;;;;;41772:33;;41826:38;;;;;;;;-1:-1:-1;41826:17:0;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;41826:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41826:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41826:38:0;41818:77;;;;;-1:-1:-1;;;41818:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20383:1;;41418:485;:::o;38096:127::-;38203:12;;-1:-1:-1;;;;;38203:12:0;38096:127;:::o;16718:144::-;-1:-1:-1;;;;;16835:19:0;16803:7;16835:19;;;:9;:19;;;;;;;16718:144::o;16010:26::-;;;;;;-1:-1:-1;;;;;16010:26:0;;:::o;33924:29::-;;;;:::o;38320:169::-;38404:7;38436:45;38451:15;38468:12;;38436:14;:45::i;:::-;38429:52;;38320:169;:::o;34157:57::-;;;;;;;;;;;;;:::o;19856:19::-;;;-1:-1:-1;;;;;19856:19:0;;:::o;35893:101::-;35959:27;35966:10;35978:7;35959:6;:27::i;:::-;35893:101;:::o;36220:125::-;36308:29;36315:12;36329:7;36308:6;:29::i;:::-;36220:125;;:::o;37594:315::-;37655:10;35087:25;35115:16;:14;:16::i;:::-;35087:44;-1:-1:-1;35215:21:0;;35212:397;;35253:20;:40;;;35325:26;:24;:26::i;:::-;35308:14;:43;-1:-1:-1;;;;;35432:22:0;;;35428:170;;35495:16;35502:8;35495:6;:16::i;:::-;-1:-1:-1;;;;;35475:17:0;;;;;;:7;:17;;;;;;;;:36;;;;35530:22;:32;;;:52;;;35428:170;37708:10;37683:14;37700:19;;;:7;:19;;;;;;37734:10;;37730:172;;37769:10;37783:1;37761:19;;;:7;:19;;;;;;;;:23;;;37799:12;;:41;;-1:-1:-1;;;37799:41:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37799:12:0;;;;:21;;:41;;;;;37761:19;37799:41;;;;;;;;:12;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;37799:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37799:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;37860:30:0;;;;;;;;37871:10;;37860:30;;;;;;37799:41;37860:30;;;35619:1;37594:315;;:::o;33999:33::-;;;;:::o;38715:764::-;38789:7;38878:20;38901:13;:11;:13::i;:::-;38878:36;-1:-1:-1;38929:17:0;38925:77;;-1:-1:-1;;38970:20:0;;38963:27;;38925:77;39090:31;39124:62;39139:46;39170:14;;39139:26;:24;:26::i;:46::-;39124:10;;;:62;:14;:62;:::i;:::-;39090:96;-1:-1:-1;39285:33:0;39321:50;39090:96;39358:12;39321:50;:36;:50;:::i;:::-;39420:20;;39285:86;;-1:-1:-1;39420:51:0;;39285:86;39420:51;:24;:51;:::i;:::-;39413:58;;;;;38715:764;:::o;33711:26::-;;;-1:-1:-1;;;;;33711:26:0;;:::o;34111:39::-;;;;:::o;36973:99::-;37009:31;37018:21;37028:10;37018:9;:21::i;:::-;37009:8;:31::i;:::-;37051:13;:11;:13::i;:::-;36973:99::o;33840:31::-;;;;:::o;4111:136::-;4169:7;4196:43;4200:1;4203;4196:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4189:50;;4111:136;;;;;:::o;26731:167::-;26824:7;26856:34;26873:1;26876;25062:4;26856:16;:34::i;3655:181::-;3713:7;3745:5;;;3769:6;;;;3761:46;;;;;-1:-1:-1;;;3761:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;21334:95;21405:5;;:16;;;-1:-1:-1;;;21405:16:0;;;;21378:7;;-1:-1:-1;;;;;21405:5:0;;:14;;:16;;;;;;;;;;;;;;:5;:16;;;5:2:-1;;;;30:1;27;20:12;5:2;21405:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21405:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21405:16:0;;-1:-1:-1;21334:95:0;:::o;17426:266::-;15547:11;;;;15539:55;;;;;-1:-1:-1;;;15539:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15686:5;15672:19;;-1:-1:-1;;15672:19:0;;;;17533:12;:25;;17550:7;17533:25;:16;:25;:::i;:::-;17518:12;:40;17603:10;17593:21;;;;:9;:21;;;;;;:34;;17619:7;17593:34;:25;:34;:::i;:::-;17579:10;17569:21;;;;:9;:21;;;;;:58;;;;17638:12;;:46;;:12;;;;-1:-1:-1;;;;;17638:12:0;;17676:7;17638:46;:25;:46;:::i;:::-;-1:-1:-1;15852:11:0;:18;;-1:-1:-1;;15852:18:0;15866:4;15852:18;;;17426:266::o;5966:132::-;6024:7;6051:39;6055:1;6058;6051:39;;;;;;;;;;;;;;;;;:3;:39::i;5027:471::-;5085:7;5330:6;5326:47;;-1:-1:-1;5360:1:0;5353:8;;5326:47;5397:5;;;5401:1;5397;:5;:1;5421:5;;;;;:10;5413:56;;;;-1:-1:-1;;;5413:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31785:138;31870:7;31906:1;31902;:5;:13;;31914:1;31902:13;;;-1:-1:-1;31910:1:0;31785:138;-1:-1:-1;31785:138:0:o;36611:274::-;36706:12;35087:25;35115:16;:14;:16::i;:::-;35087:44;-1:-1:-1;35215:21:0;;35212:397;;35253:20;:40;;;35325:26;:24;:26::i;:::-;35308:14;:43;-1:-1:-1;;;;;35432:22:0;;;35428:170;;35495:16;35502:8;35495:6;:16::i;:::-;-1:-1:-1;;;;;35475:17:0;;;;;;:7;:17;;;;;;;;:36;;;;35530:22;:32;;;:52;;;35428:170;36754:1;36744:7;:11;36736:38;;;;;-1:-1:-1;;;36736:38:0;;;;;;;;;;;;-1:-1:-1;;;36736:38:0;;;;;;;;;;;;;;;36785:35;36798:12;36812:7;36785:12;:35::i;:::-;36836:41;;;;;;36866:10;36836:41;;;;;;-1:-1:-1;;;;;36836:41:0;;;;;;;;;;;36611:274;;;;:::o;28963:255::-;29057:7;;29130:17;:1;25062:4;29130:17;:5;:17;:::i;:::-;29118:29;-1:-1:-1;29202:8:0;29118:29;29208:1;29202:8;:5;:8;:::i;4584:192::-;4670:7;4706:12;4698:6;;;;4690:29;;;;-1:-1:-1;;;4690:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4690:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4742:5:0;;;4584:192::o;27371:312::-;27484:7;;27599:8;:1;27605;27599:8;:5;:8;:::i;:::-;27587:20;-1:-1:-1;27663:12:0;27587:20;27669:5;27663:12;:5;:12;:::i;:::-;27656:19;27371:312;-1:-1:-1;;;;;27371:312:0:o;11344:176::-;11453:58;;;-1:-1:-1;;;;;11453:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11453:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;11427:85:0;;11446:5;;11427:18;:85::i;6628:345::-;6714:7;6816:12;6809:5;6801:28;;;;-1:-1:-1;;;6801:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;6801:28:0;;6840:9;6856:1;6852;:5;;;;;;;6628:345;-1:-1:-1;;;;;6628:345:0:o;16998:308::-;15547:11;;;;15539:55;;;;;-1:-1:-1;;;15539:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15686:5;15672:19;;-1:-1:-1;;15672:19:0;;;;17124:12;:25;;17141:7;17124:25;:16;:25;:::i;:::-;17109:12;:40;-1:-1:-1;;;;;17186:23:0;;;;;;:9;:23;;;;;;:36;;17214:7;17186:36;:27;:36;:::i;:::-;-1:-1:-1;;;;;17160:23:0;;;;;;;:9;:23;;;;;:62;;;;17233:12;;:65;;:12;;;;;17263:10;17283:4;17290:7;17233:65;:29;:65;:::i;:::-;-1:-1:-1;;15852:11:0;:18;;-1:-1:-1;;15852:18:0;15866:4;15852:18;;;16998:308::o;13383:1114::-;13987:27;13995:5;-1:-1:-1;;;;;13987:25:0;;:27::i;:::-;13979:71;;;;;-1:-1:-1;;;13979:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14124:12;14138:23;14173:5;-1:-1:-1;;;;;14165:19:0;14185:4;14165:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;14165:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;14123:67:0;;;;14209:7;14201:52;;;;;-1:-1:-1;;;14201:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14270:17;;:21;14266:224;;14412:10;14401:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14401:30:0;14393:85;;;;-1:-1:-1;;;14393:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13383:1114;;;;:::o;11528:204::-;11655:68;;;-1:-1:-1;;;;;11655:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11655:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;11629:95:0;;11648:5;;11629:18;:95::i;8934:619::-;8994:4;9462:20;;9305:66;9502:23;;;;;;:42;;-1:-1:-1;;9529:15:0;;;8934:619;-1:-1:-1;;8934:619:0:o
Swarm Source
bzzr://fd7b3b68d246fac29f1e26c952a7daee595e26bbdb60336f9ffdd15cb9dd97f3
Loading...
Loading
Loading...
Loading
OVERVIEW
The mStable EARN pool for Balancer 95/5 mUSD/MTA.Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.02985 | 398.9002 | $11.91 |
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.