More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,717 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Exit | 21759723 | 3 days ago | IN | 0 ETH | 0.0005452 | ||||
Withdraw | 17394807 | 614 days ago | IN | 0 ETH | 0.00278683 | ||||
Exit | 16904285 | 683 days ago | IN | 0 ETH | 0.00206084 | ||||
Exit | 16784174 | 700 days ago | IN | 0 ETH | 0.00383452 | ||||
Exit | 16650647 | 719 days ago | IN | 0 ETH | 0.00500664 | ||||
Exit | 16347771 | 761 days ago | IN | 0 ETH | 0.00187749 | ||||
Exit | 16221981 | 779 days ago | IN | 0 ETH | 0.00256078 | ||||
Exit | 15862519 | 829 days ago | IN | 0 ETH | 0.00256078 | ||||
Exit | 14873576 | 982 days ago | IN | 0 ETH | 0.00335375 | ||||
Exit | 14779188 | 998 days ago | IN | 0 ETH | 0.0020676 | ||||
Exit | 14605589 | 1025 days ago | IN | 0 ETH | 0.00329132 | ||||
Exit | 13990305 | 1120 days ago | IN | 0 ETH | 0.01270242 | ||||
Exit | 13035850 | 1269 days ago | IN | 0 ETH | 0.00462664 | ||||
Exit | 12920227 | 1287 days ago | IN | 0 ETH | 0.00251718 | ||||
Exit | 12649894 | 1330 days ago | IN | 0 ETH | 0.00080476 | ||||
Exit | 12544949 | 1346 days ago | IN | 0 ETH | 0.00356578 | ||||
Exit | 12443656 | 1362 days ago | IN | 0 ETH | 0.0054147 | ||||
Exit | 12360515 | 1375 days ago | IN | 0 ETH | 0.00287415 | ||||
Exit | 12345782 | 1377 days ago | IN | 0 ETH | 0.00396198 | ||||
Exit | 12313584 | 1382 days ago | IN | 0 ETH | 0.00466187 | ||||
Exit | 12307738 | 1383 days ago | IN | 0 ETH | 0.00425374 | ||||
Exit | 12304368 | 1383 days ago | IN | 0 ETH | 0.00693346 | ||||
Exit | 12303450 | 1383 days ago | IN | 0 ETH | 0.00686743 | ||||
Exit | 12302797 | 1383 days ago | IN | 0 ETH | 0.00620816 | ||||
Exit | 12239895 | 1393 days ago | IN | 0 ETH | 0.01761058 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
10585672 | 1648 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
StakingRewardsWithPlatformToken
Compiler Version
v0.5.16+commit.9c3226ce
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion, GNU AGPLv3 license, Audited
Contract Source Code (Solidity)Audit Report
/** *Submitted for verification at Etherscan.io on 2020-08-03 */ pragma solidity 0.5.16; 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 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); } 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; } } /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ /** * @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); } } 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; } } library MassetHelpers { using StableMath for uint256; using SafeMath for uint256; using SafeERC20 for IERC20; function transferTokens( address _sender, address _recipient, address _basset, bool _erc20TransferFeeCharged, uint256 _qty ) internal returns (uint256 receivedQty) { receivedQty = _qty; if(_erc20TransferFeeCharged) { uint256 balBefore = IERC20(_basset).balanceOf(_recipient); IERC20(_basset).safeTransferFrom(_sender, _recipient, _qty); uint256 balAfter = IERC20(_basset).balanceOf(_recipient); receivedQty = StableMath.min(_qty, balAfter.sub(balBefore)); } else { IERC20(_basset).safeTransferFrom(_sender, _recipient, _qty); } } function safeInfiniteApprove(address _asset, address _spender) internal { IERC20(_asset).safeApprove(_spender, 0); IERC20(_asset).safeApprove(_spender, uint256(-1)); } } contract PlatformTokenVendor { IERC20 public platformToken; address public parentStakingContract; /** @dev Simple constructor that stores the parent address */ constructor(IERC20 _platformToken) public { parentStakingContract = msg.sender; platformToken = _platformToken; MassetHelpers.safeInfiniteApprove(address(_platformToken), parentStakingContract); } /** * @dev Re-approves the StakingReward contract to spend the platform token. * Just incase for some reason approval has been reset. */ function reApproveOwner() external { MassetHelpers.safeInfiniteApprove(address(platformToken), parentStakingContract); } } /** * @title StakingRewardsWithPlatformToken * @author Stability Labs Pty. Ltd. * @notice Rewards stakers of a given LP token (a.k.a StakingToken) with RewardsToken, on a pro-rata basis * additionally, distributes the Platform token airdropped by the platform * @dev Derives from ./StakingRewards.sol and implements a secondary token into the core logic */ contract StakingRewardsWithPlatformToken is StakingTokenWrapper, RewardsDistributionRecipient { using StableMath for uint256; IERC20 public rewardsToken; IERC20 public platformToken; PlatformTokenVendor public platformTokenVendor; 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; uint256 public platformRewardRate = 0; // Last time any user took action uint256 public lastUpdateTime; // Ever increasing rewardPerToken rate, based on % of total supply uint256 public rewardPerTokenStored; uint256 public platformRewardPerTokenStored; mapping(address => uint256) public userRewardPerTokenPaid; mapping(address => uint256) public userPlatformRewardPerTokenPaid; mapping(address => uint256) public rewards; mapping(address => uint256) public platformRewards; event RewardAdded(uint256 reward, uint256 platformReward); event Staked(address indexed user, uint256 amount, address payer); event Withdrawn(address indexed user, uint256 amount); event RewardPaid(address indexed user, uint256 reward, uint256 platformReward); /** @dev StakingRewards is a TokenWrapper and RewardRecipient */ constructor( address _nexus, address _stakingToken, address _rewardsToken, address _platformToken, address _rewardsDistributor ) public StakingTokenWrapper(_stakingToken) RewardsDistributionRecipient(_nexus, _rewardsDistributor) { rewardsToken = IERC20(_rewardsToken); platformToken = IERC20(_platformToken); platformTokenVendor = new PlatformTokenVendor(platformToken); } /** @dev Updates the reward for a given address, before executing function */ modifier updateReward(address _account) { // Setting of global vars (uint256 newRewardPerTokenStored, uint256 newPlatformRewardPerTokenStored) = rewardPerToken(); // If statement protects against loss in initialisation case if(newRewardPerTokenStored > 0 || newPlatformRewardPerTokenStored > 0) { rewardPerTokenStored = newRewardPerTokenStored; platformRewardPerTokenStored = newPlatformRewardPerTokenStored; lastUpdateTime = lastTimeRewardApplicable(); // Setting of personal vars based on new globals if (_account != address(0)) { (rewards[_account], platformRewards[_account]) = earned(_account); userRewardPerTokenPaid[_account] = newRewardPerTokenStored; userPlatformRewardPerTokenPaid[_account] = newPlatformRewardPerTokenStored; } } _; } /*************************************** 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 (both platform and native) for the sender. * First updates outstanding reward allocation and then transfers. */ function claimReward() public updateReward(msg.sender) { uint256 reward = _claimReward(); uint256 platformReward = _claimPlatformReward(); emit RewardPaid(msg.sender, reward, platformReward); } /** * @dev Claims outstanding rewards for the sender. Only the native * rewards token, and not the platform rewards */ function claimRewardOnly() public updateReward(msg.sender) { uint256 reward = _claimReward(); emit RewardPaid(msg.sender, reward, 0); } /** * @dev Credits any outstanding rewards to the sender */ function _claimReward() internal returns (uint256) { uint256 reward = rewards[msg.sender]; if (reward > 0) { rewards[msg.sender] = 0; rewardsToken.transfer(msg.sender, reward); } return reward; } /** * @dev Claims any outstanding platform reward tokens */ function _claimPlatformReward() internal returns (uint256) { uint256 platformReward = platformRewards[msg.sender]; if(platformReward > 0) { platformRewards[msg.sender] = 0; platformToken.safeTransferFrom(address(platformTokenVendor), msg.sender, platformReward); } return platformReward; } /*************************************** 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 a user has earned * @return 'Reward' per staked token */ function rewardPerToken() public view returns (uint256, uint256) { // If there is no StakingToken liquidity, avoid div(0) uint256 stakedTokens = totalSupply(); if (stakedTokens == 0) { return (rewardPerTokenStored, platformRewardPerTokenStored); } // new reward units to distribute = rewardRate * timeSinceLastUpdate uint256 timeDelta = lastTimeRewardApplicable().sub(lastUpdateTime); uint256 rewardUnitsToDistribute = rewardRate.mul(timeDelta); uint256 platformRewardUnitsToDistribute = platformRewardRate.mul(timeDelta); // new reward units per token = (rewardUnitsToDistribute * 1e18) / totalTokens uint256 unitsToDistributePerToken = rewardUnitsToDistribute.divPrecisely(stakedTokens); uint256 platformUnitsToDistributePerToken = platformRewardUnitsToDistribute.divPrecisely(stakedTokens); // return summed rate return ( rewardPerTokenStored.add(unitsToDistributePerToken), platformRewardPerTokenStored.add(platformUnitsToDistributePerToken) ); } /** * @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, uint256) { // current rate per token - rate user previously received (uint256 currentRewardPerToken, uint256 currentPlatformRewardPerToken) = rewardPerToken(); uint256 userRewardDelta = currentRewardPerToken.sub(userRewardPerTokenPaid[_account]); uint256 userPlatformRewardDelta = currentPlatformRewardPerToken.sub(userPlatformRewardPerTokenPaid[_account]); // new reward = staked tokens * difference in rate uint256 stakeBalance = balanceOf(_account); uint256 userNewReward = stakeBalance.mulTruncate(userRewardDelta); uint256 userNewPlatformReward = stakeBalance.mulTruncate(userPlatformRewardDelta); // add to previous rewards return ( rewards[_account].add(userNewReward), platformRewards[_account].add(userNewPlatformReward) ); } /*************************************** 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 newPlatformRewards = platformToken.balanceOf(address(this)); if(newPlatformRewards > 0){ platformToken.safeTransfer(address(platformTokenVendor), newPlatformRewards); } uint256 currentTime = block.timestamp; // If previous period over, reset rewardRate if (currentTime >= periodFinish) { rewardRate = _reward.div(DURATION); platformRewardRate = newPlatformRewards.div(DURATION); } // If additional reward to existing period, calc sum else { uint256 remaining = periodFinish.sub(currentTime); uint256 leftoverReward = remaining.mul(rewardRate); rewardRate = _reward.add(leftoverReward).div(DURATION); uint256 leftoverPlatformReward = remaining.mul(platformRewardRate); platformRewardRate = newPlatformRewards.add(leftoverPlatformReward).div(DURATION); } lastUpdateTime = currentTime; periodFinish = currentTime.add(DURATION); emit RewardAdded(_reward, newPlatformRewards); } }
Contract Security Audit
- Consensys Diligence - August 10th, 2020 - Security Audit Report
[{"inputs":[{"internalType":"address","name":"_nexus","type":"address"},{"internalType":"address","name":"_stakingToken","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_platformToken","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"},{"indexed":false,"internalType":"uint256","name":"platformReward","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"},{"indexed":false,"internalType":"uint256","name":"platformReward","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":[],"name":"claimRewardOnly","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"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":"platformRewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"platformRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"platformRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"platformToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"platformTokenVendor","outputs":[{"internalType":"contract PlatformTokenVendor","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"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":"userPlatformRewardPerTokenPaid","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
6080604052600060085560006009556000600a5534801561001f57600080fd5b506040516122ae3803806122ae833981810160405260a081101561004257600080fd5b508051602082015160408301516060840151608090940151600080546001600160a01b0380861661010002610100600160a81b031960ff1990931660011792909216919091179091559394929391929185908290829081166100eb576040805162461bcd60e51b815260206004820152601560248201527f4e65787573206973207a65726f20616464726573730000000000000000000000604482015290519081900360640190fd5b600380546001600160a01b03199081166001600160a01b039384161790915560048054821693831693909317909255600580548316878316179055600680549092168582161791829055604051911691506101459061019e565b6001600160a01b03909116815260405190819003602001906000f080158015610172573d6000803e3d6000fd5b50600780546001600160a01b0319166001600160a01b0392909216919091179055506101ab9350505050565b6108f5806119b983390190565b6117ff806101ba6000396000f3fe608060405234801561001057600080fd5b50600436106101e45760003560e01c80638b8763471161010f578063cd3daf9d116100a2578063e882025a11610071578063e882025a1461043f578063e9fad8ee14610447578063ebe2b12b1461044f578063f9ce7d4714610457576101e4565b8063cd3daf9d1461041f578063d1af0c7d14610427578063d1b812cd1461042f578063df136d6514610437576101e4565b8063b88a802f116100de578063b88a802f146103ff578063c014a32014610407578063c5869a061461040f578063c8f33c9114610417576101e4565b80638b87634714610388578063a3f5c1d2146103ae578063a694fc3a146103b6578063adc9772e146103d3576101e4565b80633c6b16ab1161018757806370a082311161015657806370a082311461034a57806372f702f3146103705780637b0a47ee1461037857806380faa57d14610380576101e4565b80633c6b16ab146102db5780633f2a5540146102f857806347f530681461031c57806369940d7914610342576101e4565b806318160ddd116101c357806318160ddd14610286578063197621431461028e5780631be05289146102b65780632e1a7d4d146102be576101e4565b80628cc262146101e95780630700037d146102285780630b12a95214610260575b600080fd5b61020f600480360360208110156101ff57600080fd5b50356001600160a01b031661045f565b6040805192835260208301919091528051918290030190f35b61024e6004803603602081101561023e57600080fd5b50356001600160a01b0316610566565b60408051918252519081900360200190f35b61024e6004803603602081101561027657600080fd5b50356001600160a01b0316610578565b61024e61058a565b6102b4600480360360208110156102a457600080fd5b50356001600160a01b0316610590565b005b61024e61061f565b6102b4600480360360208110156102d457600080fd5b5035610626565b6102b4600480360360208110156102f157600080fd5b5035610743565b6103006109fc565b604080516001600160a01b039092168252519081900360200190f35b61024e6004803603602081101561033257600080fd5b50356001600160a01b0316610a0b565b610300610a1d565b61024e6004803603602081101561036057600080fd5b50356001600160a01b0316610a2c565b610300610a47565b61024e610a5b565b61024e610a61565b61024e6004803603602081101561039e57600080fd5b50356001600160a01b0316610a74565b610300610a86565b6102b4600480360360208110156103cc57600080fd5b5035610a95565b6102b4600480360360408110156103e957600080fd5b506001600160a01b038135169060200135610aa2565b6102b4610ab0565b6102b4610b9c565b61024e610c7b565b61024e610c81565b61020f610c87565b610300610d59565b610300610d68565b61024e610d77565b61024e610d7d565b6102b4610d83565b61024e610d9e565b610300610da4565b60008060008061046d610c87565b6001600160a01b0387166000908152600e60205260408120549294509092509061049e90849063ffffffff610db316565b6001600160a01b0387166000908152600f6020526040812054919250906104cc90849063ffffffff610db316565b905060006104d988610a2c565b905060006104ed828563ffffffff610dfe16565b90506000610501838563ffffffff610dfe16565b6001600160a01b038b1660009081526010602052604090205490915061052d908363ffffffff610e1316565b6001600160a01b038b16600090815260116020526040902054610556908363ffffffff610e1316565b9850985050505050505050915091565b60106020526000908152604090205481565b60116020526000908152604090205481565b60015490565b610598610e6d565b6001600160a01b0316336001600160a01b0316146105fd576040805162461bcd60e51b815260206004820152601960248201527f4f6e6c7920676f7665726e6f722063616e206578656375746500000000000000604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b62093a8081565b33600080610632610c87565b9150915060008211806106455750600081115b156106b557600c829055600d81905561065c610a61565b600b556001600160a01b038316156106b5576106778361045f565b6001600160a01b0385166000908152601060209081526040808320601183528184209490945593909255600e8252828120859055600f909152208190555b600084116106fe576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b61070784610ee3565b60408051858152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a250505050565b6004546001600160a01b031633146107a2576040805162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f7420726577617264206469737472696275746f72604482015290519081900360640190fd5b60008060006107af610c87565b9150915060008211806107c25750600081115b1561083257600c829055600d8190556107d9610a61565b600b556001600160a01b03831615610832576107f48361045f565b6001600160a01b0385166000908152601060209081526040808320601183528184209490945593909255600e8252828120859055600f909152208190555b600654604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561087d57600080fd5b505afa158015610891573d6000803e3d6000fd5b505050506040513d60208110156108a757600080fd5b5051905080156108d4576007546006546108d4916001600160a01b0391821691168363ffffffff610fbf16565b60085442908110610910576108f28662093a8063ffffffff61101616565b6009556109088262093a8063ffffffff61101616565b600a5561099e565b600854600090610926908363ffffffff610db316565b9050600061093f6009548361105890919063ffffffff16565b905061096462093a806109588a8463ffffffff610e1316565b9063ffffffff61101616565b600955600a5460009061097e90849063ffffffff61105816565b905061099762093a80610958878463ffffffff610e1316565b600a555050505b600b8190556109b68162093a8063ffffffff610e1316565b600855604080518781526020810184905281517f6c07ee05dcf262f13abf9d87b846ee789d2f90fe991d495acd7d7fc109ee1f55929181900390910190a1505050505050565b6004546001600160a01b031681565b600f6020526000908152604090205481565b6005546001600160a01b031690565b6001600160a01b031660009081526002602052604090205490565b60005461010090046001600160a01b031681565b60095481565b6000610a6f426008546110b1565b905090565b600e6020526000908152604090205481565b6003546001600160a01b031681565b610a9f33826110c6565b50565b610aac82826110c6565b5050565b33600080610abc610c87565b915091506000821180610acf5750600081115b15610b3f57600c829055600d819055610ae6610a61565b600b556001600160a01b03831615610b3f57610b018361045f565b6001600160a01b0385166000908152601060209081526040808320601183528184209490945593909255600e8252828120859055600f909152208190555b6000610b496111ee565b90506000610b5561129a565b6040805184815260208101839052815192935033927fd6f2c8500df5b44f11e9e48b91ff9f1b9d81bc496d55570c2b1b75bf65243f51929181900390910190a25050505050565b33600080610ba8610c87565b915091506000821180610bbb5750600081115b15610c2b57600c829055600d819055610bd2610a61565b600b556001600160a01b03831615610c2b57610bed8361045f565b6001600160a01b0385166000908152601060209081526040808320601183528184209490945593909255600e8252828120859055600f909152208190555b6000610c356111ee565b6040805182815260006020820152815192935033927fd6f2c8500df5b44f11e9e48b91ff9f1b9d81bc496d55570c2b1b75bf65243f51929181900390910190a250505050565b600d5481565b600b5481565b6000806000610c9461058a565b905080610cab57600c54600d549250925050610d55565b6000610cc7600b54610cbb610a61565b9063ffffffff610db316565b90506000610ce08260095461105890919063ffffffff16565b90506000610cf983600a5461105890919063ffffffff16565b90506000610d0d838663ffffffff6112e616565b90506000610d21838763ffffffff6112e616565b600c54909150610d37908363ffffffff610e1316565b600d54610d4a908363ffffffff610e1316565b975097505050505050505b9091565b6005546001600160a01b031681565b6006546001600160a01b031681565b600c5481565b600a5481565b610d94610d8f33610a2c565b610626565b610d9c610ab0565b565b60085481565b6007546001600160a01b031681565b6000610df583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061131b565b90505b92915050565b6000610df58383670de0b6b3a76400006113b2565b600082820183811015610df5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6003546040805163030d028960e21b815290516000926001600160a01b031691630c340a24916004808301926020929190829003018186803b158015610eb257600080fd5b505afa158015610ec6573d6000803e3d6000fd5b505050506040513d6020811015610edc57600080fd5b5051905090565b60005460ff16610f3a576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff19169055600154610f57908263ffffffff610db316565b60015533600090815260026020526040902054610f7a908263ffffffff610db316565b336000818152600260205260408120929092559054610faf916101009091046001600160a01b0316908363ffffffff610fbf16565b506000805460ff19166001179055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526110119084906113e0565b505050565b6000610df583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061159e565b60008261106757506000610df8565b8282028284828161107457fe5b0414610df55760405162461bcd60e51b81526004018080602001828103825260218152602001806117806021913960400191505060405180910390fd5b60008183116110c05782610df5565b50919050565b816000806110d2610c87565b9150915060008211806110e55750600081115b1561115557600c829055600d8190556110fc610a61565b600b556001600160a01b03831615611155576111178361045f565b6001600160a01b0385166000908152601060209081526040808320601183528184209490945593909255600e8252828120859055600f909152208190555b6000841161119b576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b6111a58585611603565b6040805185815233602082015281516001600160a01b038816927f9f9e4044c5742cca66ca090b21552bac14645e68bad7a92364a9d9ff18111a1c928290030190a25050505050565b336000908152601060205260408120548015610a6f57336000818152601060209081526040808320839055600554815163a9059cbb60e01b815260048101959095526024850186905290516001600160a01b039091169363a9059cbb9360448083019493928390030190829087803b15801561126957600080fd5b505af115801561127d573d6000803e3d6000fd5b505050506040513d602081101561129357600080fd5b5050905090565b336000908152601160205260408120548015610a6f5733600081815260116020526040812055600754600654610a6f926001600160a01b0391821692909116908463ffffffff6116ec16565b60008061130184670de0b6b3a764000063ffffffff61105816565b9050611313818463ffffffff61101616565b949350505050565b600081848411156113aa5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561136f578181015183820152602001611357565b50505050905090810190601f16801561139c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000806113c5858563ffffffff61105816565b90506113d7818463ffffffff61101616565b95945050505050565b6113f2826001600160a01b0316611746565b611443576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106114815780518252601f199092019160209182019101611462565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146114e3576040519150601f19603f3d011682016040523d82523d6000602084013e6114e8565b606091505b50915091508161153f576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156115985780806020019051602081101561155b57600080fd5b50516115985760405162461bcd60e51b815260040180806020018281038252602a8152602001806117a1602a913960400191505060405180910390fd5b50505050565b600081836115ed5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561136f578181015183820152602001611357565b5060008385816115f957fe5b0495945050505050565b60005460ff1661165a576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff19169055600154611677908263ffffffff610e1316565b6001556001600160a01b0382166000908152600260205260409020546116a3908263ffffffff610e1316565b6001600160a01b0380841660009081526002602052604081209290925590546116db916101009091041633308463ffffffff6116ec16565b50506000805460ff19166001179055565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526115989085906113e0565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061131357505015159291505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a723158205e9af8b5e9e29799e42175a85e11d1b413bc2312dcbbbdb7559cc0d09f4b5aae64736f6c63430005100032608060405234801561001057600080fd5b506040516108f53803806108f58339818101604052602081101561003357600080fd5b5051600180546001600160a01b0319908116331791829055600080546001600160a01b038086169190931617905561007b918391166100b8610081602090811b91909117901c565b506103ec565b6100a4816000846001600160a01b03166100cc60201b6100f3179092919060201c565b6100c881600019846001600160a01b03166100cc60201b6100f3179092919060201c565b5050565b801580610152575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561012457600080fd5b505afa158015610138573d6000803e3d6000fd5b505050506040513d602081101561014e57600080fd5b5051155b61018d5760405162461bcd60e51b81526004018080602001828103825260368152602001806108bf6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526101e39185916101e816565b505050565b610204826001600160a01b03166103b060201b6103c91760201c565b610255576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106102935780518252601f199092019160209182019101610274565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b509150915081610351576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156103aa5780806020019051602081101561036d57600080fd5b50516103aa5760405162461bcd60e51b815260040180806020018281038252602a815260200180610895602a913960400191505060405180910390fd5b50505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906103e457508115155b949350505050565b61049a806103fb6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063488a49e314610046578063d1b812cd1461006a578063d8245bb914610072575b600080fd5b61004e61007c565b604080516001600160a01b039092168252519081900360200190f35b61004e61008b565b61007a61009a565b005b6001546001600160a01b031681565b6000546001600160a01b031681565b6000546001546100b6916001600160a01b0390811691166100b8565b565b6100d36001600160a01b03831682600063ffffffff6100f316565b6100ef6001600160a01b0383168260001963ffffffff6100f316565b5050565b801580610179575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561014b57600080fd5b505afa15801561015f573d6000803e3d6000fd5b505050506040513d602081101561017557600080fd5b5051155b6101b45760405162461bcd60e51b81526004018080602001828103825260368152602001806104306036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261020690849061020b565b505050565b61021d826001600160a01b03166103c9565b61026e576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106102ac5780518252601f19909201916020918201910161028d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461030e576040519150601f19603f3d011682016040523d82523d6000602084013e610313565b606091505b50915091508161036a576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156103c35780806020019051602081101561038657600080fd5b50516103c35760405162461bcd60e51b815260040180806020018281038252602a815260200180610406602a913960400191505060405180910390fd5b50505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906103fd57508115155b94935050505056fe5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a72315820a429b8c365252069903df35536fa29d6aa77596f140cfda60f7b602f82b2db1564736f6c634300051000325361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb300000000000000000000000072cd8f4504941bf8c5a21d1fd83a96499fd71d2c000000000000000000000000a3bed4e1c75d00fa6f4e5e6922db7261b5e9acd2000000000000000000000000ba100000625a3754423978a60c9317c58a424e3d00000000000000000000000004dfdfa471b79cc9e6e8c355e6c71f8ec4916c50
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e45760003560e01c80638b8763471161010f578063cd3daf9d116100a2578063e882025a11610071578063e882025a1461043f578063e9fad8ee14610447578063ebe2b12b1461044f578063f9ce7d4714610457576101e4565b8063cd3daf9d1461041f578063d1af0c7d14610427578063d1b812cd1461042f578063df136d6514610437576101e4565b8063b88a802f116100de578063b88a802f146103ff578063c014a32014610407578063c5869a061461040f578063c8f33c9114610417576101e4565b80638b87634714610388578063a3f5c1d2146103ae578063a694fc3a146103b6578063adc9772e146103d3576101e4565b80633c6b16ab1161018757806370a082311161015657806370a082311461034a57806372f702f3146103705780637b0a47ee1461037857806380faa57d14610380576101e4565b80633c6b16ab146102db5780633f2a5540146102f857806347f530681461031c57806369940d7914610342576101e4565b806318160ddd116101c357806318160ddd14610286578063197621431461028e5780631be05289146102b65780632e1a7d4d146102be576101e4565b80628cc262146101e95780630700037d146102285780630b12a95214610260575b600080fd5b61020f600480360360208110156101ff57600080fd5b50356001600160a01b031661045f565b6040805192835260208301919091528051918290030190f35b61024e6004803603602081101561023e57600080fd5b50356001600160a01b0316610566565b60408051918252519081900360200190f35b61024e6004803603602081101561027657600080fd5b50356001600160a01b0316610578565b61024e61058a565b6102b4600480360360208110156102a457600080fd5b50356001600160a01b0316610590565b005b61024e61061f565b6102b4600480360360208110156102d457600080fd5b5035610626565b6102b4600480360360208110156102f157600080fd5b5035610743565b6103006109fc565b604080516001600160a01b039092168252519081900360200190f35b61024e6004803603602081101561033257600080fd5b50356001600160a01b0316610a0b565b610300610a1d565b61024e6004803603602081101561036057600080fd5b50356001600160a01b0316610a2c565b610300610a47565b61024e610a5b565b61024e610a61565b61024e6004803603602081101561039e57600080fd5b50356001600160a01b0316610a74565b610300610a86565b6102b4600480360360208110156103cc57600080fd5b5035610a95565b6102b4600480360360408110156103e957600080fd5b506001600160a01b038135169060200135610aa2565b6102b4610ab0565b6102b4610b9c565b61024e610c7b565b61024e610c81565b61020f610c87565b610300610d59565b610300610d68565b61024e610d77565b61024e610d7d565b6102b4610d83565b61024e610d9e565b610300610da4565b60008060008061046d610c87565b6001600160a01b0387166000908152600e60205260408120549294509092509061049e90849063ffffffff610db316565b6001600160a01b0387166000908152600f6020526040812054919250906104cc90849063ffffffff610db316565b905060006104d988610a2c565b905060006104ed828563ffffffff610dfe16565b90506000610501838563ffffffff610dfe16565b6001600160a01b038b1660009081526010602052604090205490915061052d908363ffffffff610e1316565b6001600160a01b038b16600090815260116020526040902054610556908363ffffffff610e1316565b9850985050505050505050915091565b60106020526000908152604090205481565b60116020526000908152604090205481565b60015490565b610598610e6d565b6001600160a01b0316336001600160a01b0316146105fd576040805162461bcd60e51b815260206004820152601960248201527f4f6e6c7920676f7665726e6f722063616e206578656375746500000000000000604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b62093a8081565b33600080610632610c87565b9150915060008211806106455750600081115b156106b557600c829055600d81905561065c610a61565b600b556001600160a01b038316156106b5576106778361045f565b6001600160a01b0385166000908152601060209081526040808320601183528184209490945593909255600e8252828120859055600f909152208190555b600084116106fe576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b61070784610ee3565b60408051858152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a250505050565b6004546001600160a01b031633146107a2576040805162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f7420726577617264206469737472696275746f72604482015290519081900360640190fd5b60008060006107af610c87565b9150915060008211806107c25750600081115b1561083257600c829055600d8190556107d9610a61565b600b556001600160a01b03831615610832576107f48361045f565b6001600160a01b0385166000908152601060209081526040808320601183528184209490945593909255600e8252828120859055600f909152208190555b600654604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561087d57600080fd5b505afa158015610891573d6000803e3d6000fd5b505050506040513d60208110156108a757600080fd5b5051905080156108d4576007546006546108d4916001600160a01b0391821691168363ffffffff610fbf16565b60085442908110610910576108f28662093a8063ffffffff61101616565b6009556109088262093a8063ffffffff61101616565b600a5561099e565b600854600090610926908363ffffffff610db316565b9050600061093f6009548361105890919063ffffffff16565b905061096462093a806109588a8463ffffffff610e1316565b9063ffffffff61101616565b600955600a5460009061097e90849063ffffffff61105816565b905061099762093a80610958878463ffffffff610e1316565b600a555050505b600b8190556109b68162093a8063ffffffff610e1316565b600855604080518781526020810184905281517f6c07ee05dcf262f13abf9d87b846ee789d2f90fe991d495acd7d7fc109ee1f55929181900390910190a1505050505050565b6004546001600160a01b031681565b600f6020526000908152604090205481565b6005546001600160a01b031690565b6001600160a01b031660009081526002602052604090205490565b60005461010090046001600160a01b031681565b60095481565b6000610a6f426008546110b1565b905090565b600e6020526000908152604090205481565b6003546001600160a01b031681565b610a9f33826110c6565b50565b610aac82826110c6565b5050565b33600080610abc610c87565b915091506000821180610acf5750600081115b15610b3f57600c829055600d819055610ae6610a61565b600b556001600160a01b03831615610b3f57610b018361045f565b6001600160a01b0385166000908152601060209081526040808320601183528184209490945593909255600e8252828120859055600f909152208190555b6000610b496111ee565b90506000610b5561129a565b6040805184815260208101839052815192935033927fd6f2c8500df5b44f11e9e48b91ff9f1b9d81bc496d55570c2b1b75bf65243f51929181900390910190a25050505050565b33600080610ba8610c87565b915091506000821180610bbb5750600081115b15610c2b57600c829055600d819055610bd2610a61565b600b556001600160a01b03831615610c2b57610bed8361045f565b6001600160a01b0385166000908152601060209081526040808320601183528184209490945593909255600e8252828120859055600f909152208190555b6000610c356111ee565b6040805182815260006020820152815192935033927fd6f2c8500df5b44f11e9e48b91ff9f1b9d81bc496d55570c2b1b75bf65243f51929181900390910190a250505050565b600d5481565b600b5481565b6000806000610c9461058a565b905080610cab57600c54600d549250925050610d55565b6000610cc7600b54610cbb610a61565b9063ffffffff610db316565b90506000610ce08260095461105890919063ffffffff16565b90506000610cf983600a5461105890919063ffffffff16565b90506000610d0d838663ffffffff6112e616565b90506000610d21838763ffffffff6112e616565b600c54909150610d37908363ffffffff610e1316565b600d54610d4a908363ffffffff610e1316565b975097505050505050505b9091565b6005546001600160a01b031681565b6006546001600160a01b031681565b600c5481565b600a5481565b610d94610d8f33610a2c565b610626565b610d9c610ab0565b565b60085481565b6007546001600160a01b031681565b6000610df583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061131b565b90505b92915050565b6000610df58383670de0b6b3a76400006113b2565b600082820183811015610df5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6003546040805163030d028960e21b815290516000926001600160a01b031691630c340a24916004808301926020929190829003018186803b158015610eb257600080fd5b505afa158015610ec6573d6000803e3d6000fd5b505050506040513d6020811015610edc57600080fd5b5051905090565b60005460ff16610f3a576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff19169055600154610f57908263ffffffff610db316565b60015533600090815260026020526040902054610f7a908263ffffffff610db316565b336000818152600260205260408120929092559054610faf916101009091046001600160a01b0316908363ffffffff610fbf16565b506000805460ff19166001179055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526110119084906113e0565b505050565b6000610df583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061159e565b60008261106757506000610df8565b8282028284828161107457fe5b0414610df55760405162461bcd60e51b81526004018080602001828103825260218152602001806117806021913960400191505060405180910390fd5b60008183116110c05782610df5565b50919050565b816000806110d2610c87565b9150915060008211806110e55750600081115b1561115557600c829055600d8190556110fc610a61565b600b556001600160a01b03831615611155576111178361045f565b6001600160a01b0385166000908152601060209081526040808320601183528184209490945593909255600e8252828120859055600f909152208190555b6000841161119b576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b6111a58585611603565b6040805185815233602082015281516001600160a01b038816927f9f9e4044c5742cca66ca090b21552bac14645e68bad7a92364a9d9ff18111a1c928290030190a25050505050565b336000908152601060205260408120548015610a6f57336000818152601060209081526040808320839055600554815163a9059cbb60e01b815260048101959095526024850186905290516001600160a01b039091169363a9059cbb9360448083019493928390030190829087803b15801561126957600080fd5b505af115801561127d573d6000803e3d6000fd5b505050506040513d602081101561129357600080fd5b5050905090565b336000908152601160205260408120548015610a6f5733600081815260116020526040812055600754600654610a6f926001600160a01b0391821692909116908463ffffffff6116ec16565b60008061130184670de0b6b3a764000063ffffffff61105816565b9050611313818463ffffffff61101616565b949350505050565b600081848411156113aa5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561136f578181015183820152602001611357565b50505050905090810190601f16801561139c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000806113c5858563ffffffff61105816565b90506113d7818463ffffffff61101616565b95945050505050565b6113f2826001600160a01b0316611746565b611443576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106114815780518252601f199092019160209182019101611462565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146114e3576040519150601f19603f3d011682016040523d82523d6000602084013e6114e8565b606091505b50915091508161153f576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156115985780806020019051602081101561155b57600080fd5b50516115985760405162461bcd60e51b815260040180806020018281038252602a8152602001806117a1602a913960400191505060405180910390fd5b50505050565b600081836115ed5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561136f578181015183820152602001611357565b5060008385816115f957fe5b0495945050505050565b60005460ff1661165a576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff19169055600154611677908263ffffffff610e1316565b6001556001600160a01b0382166000908152600260205260409020546116a3908263ffffffff610e1316565b6001600160a01b0380841660009081526002602052604081209290925590546116db916101009091041633308463ffffffff6116ec16565b50506000805460ff19166001179055565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526115989085906113e0565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061131357505015159291505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a723158205e9af8b5e9e29799e42175a85e11d1b413bc2312dcbbbdb7559cc0d09f4b5aae64736f6c63430005100032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb300000000000000000000000072cd8f4504941bf8c5a21d1fd83a96499fd71d2c000000000000000000000000a3bed4e1c75d00fa6f4e5e6922db7261b5e9acd2000000000000000000000000ba100000625a3754423978a60c9317c58a424e3d00000000000000000000000004dfdfa471b79cc9e6e8c355e6c71f8ec4916c50
-----Decoded View---------------
Arg [0] : _nexus (address): 0xAFcE80b19A8cE13DEc0739a1aaB7A028d6845Eb3
Arg [1] : _stakingToken (address): 0x72Cd8f4504941Bf8c5a21d1Fd83A96499FD71d2C
Arg [2] : _rewardsToken (address): 0xa3BeD4E1c75D00fa6f4E5E6922DB7261B5E9AcD2
Arg [3] : _platformToken (address): 0xba100000625a3754423978a60c9317c58a424e3D
Arg [4] : _rewardsDistributor (address): 0x04dfDfa471b79cc9E6E8C355e6C71F8eC4916C50
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000afce80b19a8ce13dec0739a1aab7a028d6845eb3
Arg [1] : 00000000000000000000000072cd8f4504941bf8c5a21d1fd83a96499fd71d2c
Arg [2] : 000000000000000000000000a3bed4e1c75d00fa6f4e5e6922db7261b5e9acd2
Arg [3] : 000000000000000000000000ba100000625a3754423978a60c9317c58a424e3d
Arg [4] : 00000000000000000000000004dfdfa471b79cc9e6e8c355e6c71f8ec4916c50
Deployed Bytecode Sourcemap
34837:10875:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34837:10875:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43127:960;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43127:960:0;-1:-1:-1;;;;;43127:960:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35736:42;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35736:42:0;-1:-1:-1;;;;;35736:42:0;;:::i;:::-;;;;;;;;;;;;;;;;35785:50;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35785:50:0;-1:-1:-1;;;;;35785:50:0;;:::i;23592:123::-;;;:::i;9624:165::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9624:165:0;-1:-1:-1;;;;;9624:165:0;;:::i;:::-;;35099:41;;;:::i;39301:225::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39301:225:0;;:::i;44456:1253::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44456:1253:0;;:::i;8942:33::-;;;:::i;:::-;;;;-1:-1:-1;;;;;8942:33:0;;;;;;;;;;;;;;35662:65;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35662:65:0;-1:-1:-1;;;;;35662:65:0;;:::i;41260:127::-;;;:::i;23848:144::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23848:144:0;-1:-1:-1;;;;;23848:144:0;;:::i;23140:26::-;;;:::i;35277:29::-;;;:::i;41484:169::-;;;:::i;35598:57::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35598:57:0;-1:-1:-1;;;;;35598:57:0;;:::i;2186:19::-;;;:::i;37979:101::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37979:101:0;;:::i;38306:125::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;38306:125:0;;;;;;;;:::i;39707:248::-;;;:::i;40105:181::-;;;:::i;35546:43::-;;;:::i;35396:29::-;;;:::i;41795:1152::-;;;:::i;34977:26::-;;;:::i;35010:27::-;;;:::i;35504:35::-;;;:::i;35313:37::-;;;:::i;39059:99::-;;;:::i;35193:31::-;;;:::i;35044:46::-;;;:::i;43127:960::-;43209:7;43218;43311:29;43342:37;43383:16;:14;:16::i;:::-;-1:-1:-1;;;;;43462:32:0;;43410:23;43462:32;;;:22;:32;;;;;;43310:89;;-1:-1:-1;43310:89:0;;-1:-1:-1;43410:23:0;43436:59;;43310:89;;43436:59;:25;:59;:::i;:::-;-1:-1:-1;;;;;43574:40:0;;43506:31;43574:40;;;:30;:40;;;;;;43410:85;;-1:-1:-1;43506:31:0;43540:75;;:29;;:75;:33;:75;:::i;:::-;43506:109;;43686:20;43709:19;43719:8;43709:9;:19::i;:::-;43686:42;-1:-1:-1;43739:21:0;43763:41;43686:42;43788:15;43763:41;:24;:41;:::i;:::-;43739:65;-1:-1:-1;43815:29:0;43847:49;:12;43872:23;43847:49;:24;:49;:::i;:::-;-1:-1:-1;;;;;43965:17:0;;;;;;:7;:17;;;;;;43815:81;;-1:-1:-1;43965:36:0;;43987:13;43965:36;:21;:36;:::i;:::-;-1:-1:-1;;;;;44016:25:0;;;;;;:15;:25;;;;;;:52;;44046:21;44016:52;:29;:52;:::i;:::-;43943:136;;;;;;;;;;;43127:960;;;:::o;35736:42::-;;;;;;;;;;;;;:::o;35785:50::-;;;;;;;;;;;;;:::o;23592:123::-;23695:12;;23592:123;:::o;9624:165::-;2661:11;:9;:11::i;:::-;-1:-1:-1;;;;;2647:25:0;:10;-1:-1:-1;;;;;2647:25:0;;2639:63;;;;;-1:-1:-1;;;2639:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9741:18;:40;;-1:-1:-1;;;;;;9741:40:0;-1:-1:-1;;;;;9741:40:0;;;;;;;;;;9624:165::o;35099:41::-;35134:6;35099:41;:::o;39301:225::-;39374:10;36861:31;36894:39;36937:16;:14;:16::i;:::-;36860:93;;;;37065:1;37039:23;:27;:66;;;;37104:1;37070:31;:35;37039:66;37036:659;;;37122:20;:46;;;37183:28;:62;;;37279:26;:24;:26::i;:::-;37262:14;:43;-1:-1:-1;;;;;37388:22:0;;;37384:300;;37480:16;37487:8;37480:6;:16::i;:::-;-1:-1:-1;;;;;37432:17:0;;;;;;:7;:17;;;;;;;;37451:15;:25;;;;;37431:65;;;;;;;;37517:22;:32;;;;;:58;;;37594:30;:40;;;;:74;;;37384:300;39420:1;39410:7;:11;39402:41;;;;;-1:-1:-1;;;39402:41:0;;;;;;;;;;;;-1:-1:-1;;;39402:41:0;;;;;;;;;;;;;;;39454:18;39464:7;39454:9;:18::i;:::-;39488:30;;;;;;;;39498:10;;39488:30;;;;;;;;;;39301:225;;;;:::o;44456:1253::-;9378:18;;-1:-1:-1;;;;;9378:18:0;9364:10;:32;9356:77;;;;;-1:-1:-1;;;9356:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44581:1;36861:31;36894:39;36937:16;:14;:16::i;:::-;36860:93;;;;37065:1;37039:23;:27;:66;;;;37104:1;37070:31;:35;37039:66;37036:659;;;37122:20;:46;;;37183:28;:62;;;37279:26;:24;:26::i;:::-;37262:14;:43;-1:-1:-1;;;;;37388:22:0;;;37384:300;;37480:16;37487:8;37480:6;:16::i;:::-;-1:-1:-1;;;;;37432:17:0;;;;;;:7;:17;;;;;;;;37451:15;:25;;;;;37431:65;;;;;;;;37517:22;:32;;;;;:58;;;37594:30;:40;;;;:74;;;37384:300;44630:13;;:38;;;-1:-1:-1;;;44630:38:0;;44662:4;44630:38;;;;;;44601:26;;-1:-1:-1;;;;;44630:13:0;;:23;;:38;;;;;;;;;;;;;;:13;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;44630:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44630:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44630:38:0;;-1:-1:-1;44682:22:0;;44679:129;;44755:19;;44720:13;;:76;;-1:-1:-1;;;;;44720:13:0;;;;44755:19;44777:18;44720:76;:26;:76;:::i;:::-;44941:12;;44842:15;;44926:27;;44922:630;;44983:21;:7;35134:6;44983:21;:11;:21;:::i;:::-;44970:10;:34;45040:32;:18;35134:6;45040:32;:22;:32;:::i;:::-;45019:18;:53;44922:630;;;45196:12;;45176:17;;45196:29;;45213:11;45196:29;:16;:29;:::i;:::-;45176:49;;45242:22;45267:25;45281:10;;45267:9;:13;;:25;;;;:::i;:::-;45242:50;-1:-1:-1;45320:41:0;35134:6;45320:27;:7;45242:50;45320:27;:11;:27;:::i;:::-;:31;:41;:31;:41;:::i;:::-;45307:10;:54;45425:18;;45378:30;;45411:33;;:9;;:33;:13;:33;:::i;:::-;45378:66;-1:-1:-1;45480:60:0;35134:6;45480:46;:18;45378:66;45480:46;:22;:46;:::i;:60::-;45459:18;:81;-1:-1:-1;;;44922:630:0;45564:14;:28;;;45618:25;45581:11;35134:6;45618:25;:15;:25;:::i;:::-;45603:12;:40;45661;;;;;;;;;;;;;;;;;;;;;;;;;37705:1;;9444;;;44456:1253;:::o;8942:33::-;;;-1:-1:-1;;;;;8942:33:0;;:::o;35662:65::-;;;;;;;;;;;;;:::o;41260:127::-;41367:12;;-1:-1:-1;;;;;41367:12:0;41260:127;:::o;23848:144::-;-1:-1:-1;;;;;23965:19:0;23933:7;23965:19;;;:9;:19;;;;;;;23848:144::o;23140:26::-;;;;;;-1:-1:-1;;;;;23140:26:0;;:::o;35277:29::-;;;;:::o;41484:169::-;41568:7;41600:45;41615:15;41632:12;;41600:14;:45::i;:::-;41593:52;;41484:169;:::o;35598:57::-;;;;;;;;;;;;;:::o;2186:19::-;;;-1:-1:-1;;;;;2186:19:0;;:::o;37979:101::-;38045:27;38052:10;38064:7;38045:6;:27::i;:::-;37979:101;:::o;38306:125::-;38394:29;38401:12;38415:7;38394:6;:29::i;:::-;38306:125;;:::o;39707:248::-;39768:10;36861:31;36894:39;36937:16;:14;:16::i;:::-;36860:93;;;;37065:1;37039:23;:27;:66;;;;37104:1;37070:31;:35;37039:66;37036:659;;;37122:20;:46;;;37183:28;:62;;;37279:26;:24;:26::i;:::-;37262:14;:43;-1:-1:-1;;;;;37388:22:0;;;37384:300;;37480:16;37487:8;37480:6;:16::i;:::-;-1:-1:-1;;;;;37432:17:0;;;;;;:7;:17;;;;;;;;37451:15;:25;;;;;37431:65;;;;;;;;37517:22;:32;;;;;:58;;;37594:30;:40;;;;:74;;;37384:300;39796:14;39813;:12;:14::i;:::-;39796:31;;39838:22;39863;:20;:22::i;:::-;39901:46;;;;;;;;;;;;;;39838:47;;-1:-1:-1;39912:10:0;;39901:46;;;;;;;;;;;37705:1;;39707:248;;;:::o;40105:181::-;40170:10;36861:31;36894:39;36937:16;:14;:16::i;:::-;36860:93;;;;37065:1;37039:23;:27;:66;;;;37104:1;37070:31;:35;37039:66;37036:659;;;37122:20;:46;;;37183:28;:62;;;37279:26;:24;:26::i;:::-;37262:14;:43;-1:-1:-1;;;;;37388:22:0;;;37384:300;;37480:16;37487:8;37480:6;:16::i;:::-;-1:-1:-1;;;;;37432:17:0;;;;;;:7;:17;;;;;;;;37451:15;:25;;;;;37431:65;;;;;;;;37517:22;:32;;;;;:58;;;37594:30;:40;;;;:74;;;37384:300;40198:14;40215;:12;:14::i;:::-;40245:33;;;;;;40276:1;40245:33;;;;;;40198:31;;-1:-1:-1;40256:10:0;;40245:33;;;;;;;;;;;37705:1;40105:181;;;:::o;35546:43::-;;;;:::o;35396:29::-;;;;:::o;41795:1152::-;41869:7;41878;41967:20;41990:13;:11;:13::i;:::-;41967:36;-1:-1:-1;42018:17:0;42014:109;;42060:20;;42082:28;;42052:59;;;;;;;42014:109;42211:17;42231:46;42262:14;;42231:26;:24;:26::i;:::-;:30;:46;:30;:46;:::i;:::-;42211:66;;42288:31;42322:25;42337:9;42322:10;;:14;;:25;;;;:::i;:::-;42288:59;;42358:39;42400:33;42423:9;42400:18;;:22;;:33;;;;:::i;:::-;42358:75;-1:-1:-1;42532:33:0;42568:50;:23;42605:12;42568:50;:36;:50;:::i;:::-;42532:86;-1:-1:-1;42629:41:0;42673:58;:31;42718:12;42673:58;:44;:58;:::i;:::-;42795:20;;42629:102;;-1:-1:-1;42795:51:0;;42820:25;42795:51;:24;:51;:::i;:::-;42861:28;;:67;;42894:33;42861:67;:32;:67;:::i;:::-;42773:166;;;;;;;;;;41795:1152;;;:::o;34977:26::-;;;-1:-1:-1;;;;;34977:26:0;;:::o;35010:27::-;;;-1:-1:-1;;;;;35010:27:0;;:::o;35504:35::-;;;;:::o;35313:37::-;;;;:::o;39059:99::-;39095:31;39104:21;39114:10;39104:9;:21::i;:::-;39095:8;:31::i;:::-;39137:13;:11;:13::i;:::-;39059:99::o;35193:31::-;;;;:::o;35044:46::-;;;-1:-1:-1;;;;;35044:46:0;;:::o;11241:136::-;11299:7;11326:43;11330:1;11333;11326:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;11319:50;;11241:136;;;;;:::o;26733:167::-;26826:7;26858:34;26875:1;26878;25064:4;26858:16;:34::i;10785:181::-;10843:7;10875:5;;;10899:6;;;;10891:46;;;;;-1:-1:-1;;;10891:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;3664:95;3735:5;;:16;;;-1:-1:-1;;;3735:16:0;;;;3708:7;;-1:-1:-1;;;;;3735:5:0;;:14;;:16;;;;;;;;;;;;;;:5;:16;;;5:2:-1;;;;30:1;27;20:12;5:2;3735:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3735:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3735:16:0;;-1:-1:-1;3664:95:0;:::o;24556:266::-;22677:11;;;;22669:55;;;;;-1:-1:-1;;;22669:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22816:5;22802:19;;-1:-1:-1;;22802:19:0;;;;24663:12;:25;;24680:7;24663:25;:16;:25;:::i;:::-;24648:12;:40;24733:10;24723:21;;;;:9;:21;;;;;;:34;;24749:7;24723:34;:25;:34;:::i;:::-;24709:10;24699:21;;;;:9;:21;;;;;:58;;;;24768:12;;:46;;:12;;;;-1:-1:-1;;;;;24768:12:0;;24806:7;24768:46;:25;:46;:::i;:::-;-1:-1:-1;22982:11:0;:18;;-1:-1:-1;;22982:18:0;22996:4;22982:18;;;24556:266::o;18474:176::-;18583:58;;;-1:-1:-1;;;;;18583:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18583:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;18557:85:0;;18576:5;;18557:18;:85::i;:::-;18474:176;;;:::o;13096:132::-;13154:7;13181:39;13185:1;13188;13181:39;;;;;;;;;;;;;;;;;:3;:39::i;12157:471::-;12215:7;12460:6;12456:47;;-1:-1:-1;12490:1:0;12483:8;;12456:47;12527:5;;;12531:1;12527;:5;:1;12551:5;;;;;:10;12543:56;;;;-1:-1:-1;;;12543:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31787:138;31872:7;31908:1;31904;:5;:13;;31916:1;31904:13;;;-1:-1:-1;31912:1:0;31787:138;-1:-1:-1;31787:138:0:o;38697:274::-;38792:12;36861:31;36894:39;36937:16;:14;:16::i;:::-;36860:93;;;;37065:1;37039:23;:27;:66;;;;37104:1;37070:31;:35;37039:66;37036:659;;;37122:20;:46;;;37183:28;:62;;;37279:26;:24;:26::i;:::-;37262:14;:43;-1:-1:-1;;;;;37388:22:0;;;37384:300;;37480:16;37487:8;37480:6;:16::i;:::-;-1:-1:-1;;;;;37432:17:0;;;;;;:7;:17;;;;;;;;37451:15;:25;;;;;37431:65;;;;;;;;37517:22;:32;;;;;:58;;;37594:30;:40;;;;:74;;;37384:300;38840:1;38830:7;:11;38822:38;;;;;-1:-1:-1;;;38822:38:0;;;;;;;;;;;;-1:-1:-1;;;38822:38:0;;;;;;;;;;;;;;;38871:35;38884:12;38898:7;38871:12;:35::i;:::-;38922:41;;;;;;38952:10;38922:41;;;;;;-1:-1:-1;;;;;38922:41:0;;;;;;;;;;;38697:274;;;;;:::o;40371:262::-;40458:10;40413:7;40450:19;;;:7;:19;;;;;;40484:10;;40480:122;;40519:10;40533:1;40511:19;;;:7;:19;;;;;;;;:23;;;40549:12;;:41;;-1:-1:-1;;;40549:41:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40549:12:0;;;;:21;;:41;;;;;40511:19;40549:41;;;;;;;;:12;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;40549:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40549:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;40619:6:0;-1:-1:-1;40371:262:0;:::o;40718:357::-;40830:10;40768:7;40814:27;;;:15;:27;;;;;;40855:18;;40852:184;;40906:10;40920:1;40890:27;;;:15;:27;;;;;:31;40975:19;;40936:13;;:88;;-1:-1:-1;;;;;40936:13:0;;;;40975:19;;;;41009:14;40936:88;:30;:88;:::i;28965:255::-;29059:7;;29132:17;:1;25064:4;29132:17;:5;:17;:::i;:::-;29120:29;-1:-1:-1;29204:8:0;29120:29;29210:1;29204:8;:5;:8;:::i;:::-;29197:15;28965:255;-1:-1:-1;;;;28965:255:0:o;11714:192::-;11800:7;11836:12;11828:6;;;;11820:29;;;;-1:-1:-1;;;11820: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;11820:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11872:5:0;;;11714:192::o;27373:312::-;27486:7;;27601:8;:1;27607;27601:8;:5;:8;:::i;:::-;27589:20;-1:-1:-1;27665:12:0;27589:20;27671:5;27665:12;:5;:12;:::i;:::-;27658:19;27373:312;-1:-1:-1;;;;;27373:312:0:o;20513:1114::-;21117:27;21125:5;-1:-1:-1;;;;;21117:25:0;;:27::i;:::-;21109:71;;;;;-1:-1:-1;;;21109:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21254:12;21268:23;21303:5;-1:-1:-1;;;;;21295:19:0;21315:4;21295: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;;;21295: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;;21253:67:0;;;;21339:7;21331:52;;;;;-1:-1:-1;;;21331:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21400:17;;:21;21396:224;;21542:10;21531:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21531:30:0;21523:85;;;;-1:-1:-1;;;21523:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20513:1114;;;;:::o;13758:345::-;13844:7;13946:12;13939:5;13931:28;;;;-1:-1:-1;;;13931:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;13931:28:0;;13970:9;13986:1;13982;:5;;;;;;;13758:345;-1:-1:-1;;;;;13758:345:0:o;24128:308::-;22677:11;;;;22669:55;;;;;-1:-1:-1;;;22669:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22816:5;22802:19;;-1:-1:-1;;22802:19:0;;;;24254:12;:25;;24271:7;24254:25;:16;:25;:::i;:::-;24239:12;:40;-1:-1:-1;;;;;24316:23:0;;;;;;:9;:23;;;;;;:36;;24344:7;24316:36;:27;:36;:::i;:::-;-1:-1:-1;;;;;24290:23:0;;;;;;;:9;:23;;;;;:62;;;;24363:12;;:65;;:12;;;;;24393:10;24413:4;24420:7;24363:65;:29;:65;:::i;:::-;-1:-1:-1;;22982:11:0;:18;;-1:-1:-1;;22982:18:0;22996:4;22982:18;;;24128:308::o;18658:204::-;18785:68;;;-1:-1:-1;;;;;18785:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18785:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;18759:95:0;;18778:5;;18759:18;:95::i;16064:619::-;16124:4;16592:20;;16435:66;16632:23;;;;;;:42;;-1:-1:-1;;16659:15:0;;;16624:51;-1:-1:-1;;16064:619:0:o
Swarm Source
bzzr://a429b8c365252069903df35536fa29d6aa77596f140cfda60f7b602f82b2db15
Loading...
Loading
Loading...
Loading
OVERVIEW
The mStable EARN Pools reward users for contributing to wider ecosystem liquidity by directly rewarding the staking of ecosystem LP tokens in MTA. Pool 1 is a Balancer mUSD<>USDC pool.Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.03154 | 672.6046 | $21.21 |
Loading...
Loading
[ Download: CSV Export ]
[ 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.