Transaction Hash:
Block:
11807693 at Feb-07-2021 06:29:00 AM +UTC
Transaction Fee:
0.031598615 ETH
$79.78
Gas Used:
332,617 Gas / 95 Gwei
Emitted Events:
64 |
yInsure.Transfer( from=[Receiver] yNFTETHPool, to=[Sender] 0x88f9a3a1025cb0a10870245aa167014e52043fed, tokenId=391 )
|
65 |
yInsure.Transfer( from=[Receiver] yNFTETHPool, to=[Sender] 0x88f9a3a1025cb0a10870245aa167014e52043fed, tokenId=405 )
|
66 |
yNFTETHPool.WithdrawnAll( user=[Sender] 0x88f9a3a1025cb0a10870245aa167014e52043fed )
|
67 |
SAFE.Transfer( from=[Receiver] yNFTETHPool, to=[Sender] 0x88f9a3a1025cb0a10870245aa167014e52043fed, value=37116362278269228563 )
|
68 |
yNFTETHPool.RewardPaid( user=[Sender] 0x88f9a3a1025cb0a10870245aa167014e52043fed, reward=37116362278269228563 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x181Aea69...eB8d98F91 | |||||
0x1Aa61c19...Ed24FC469 | |||||
0x88F9A3a1...E52043FeD |
8.397547171114609576 Eth
Nonce: 426
|
8.365948556114609576 Eth
Nonce: 427
| 0.031598615 | ||
0xE72F7919...a9077F6AA
Miner
| 220.516484900240733004 Eth | 220.548083515240733004 Eth | 0.031598615 | ||
0xF03ABaad...1154C2Dd4 | (YieldFarming.insure: yNFT ETH Pool) |
Execution Trace
yNFTETHPool.CALL( )
-
yInsure.transferFrom( from=0xF03ABaadA6F3069aaf3A923769b8D931154C2Dd4, to=0x88F9A3a1025CB0a10870245Aa167014E52043FeD, tokenId=391 )
-
yInsure.transferFrom( from=0xF03ABaadA6F3069aaf3A923769b8D931154C2Dd4, to=0x88F9A3a1025CB0a10870245Aa167014E52043FeD, tokenId=405 )
-
SAFE.transfer( recipient=0x88F9A3a1025CB0a10870245Aa167014E52043FeD, amount=37116362278269228563 ) => ( True )
File 1 of 3: yNFTETHPool
File 2 of 3: yInsure
File 3 of 3: SAFE
/** *Submitted for verification at Etherscan.io on 2020-09-09 */ /* ____ __ __ __ _ / __/__ __ ___ / /_ / / ___ / /_ (_)__ __ _\ \ / // // _ \/ __// _ \/ -_)/ __// / \ \ / /___/ \_, //_//_/\__//_//_/\__/ \__//_/ /_\_\ /___/ * Synthetix: YFIRewards.sol * * Docs: https://docs.synthetix.io/ * * * MIT License * =========== * * Copyright (c) 2020 Synthetix * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE */ // File: @openzeppelin/contracts/math/Math.sol pragma solidity ^0.5.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @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; } } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/ownership/Ownable.sol pragma solidity ^0.5.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { _owner = _msgSender(); emit OwnershipTransferred(address(0), _owner); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); function mint(address account, uint amount) external; /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing 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. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // 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 != 0x0 && codehash != accountHash); } /** * @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"); } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.5.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } 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"); } } } // File: contracts/IRewardDistributionRecipient.sol pragma solidity ^0.5.0; contract IRewardDistributionRecipient is Ownable { address rewardDistribution; function notifyRewardAmount(uint256 reward) external; modifier onlyRewardDistribution() { require(_msgSender() == rewardDistribution, "Caller is not reward distribution"); _; } function setRewardDistribution(address _rewardDistribution) external onlyOwner { rewardDistribution = _rewardDistribution; } } pragma solidity ^0.5.0; interface yNFT { function tokens(uint256) external view returns (uint expirationTimestamp, bytes4 coverCurrency, uint coverAmount, uint coverPrice, uint coverPriceNXM, uint expireTime, uint generationTime, uint coverId, bool claimInProgress, uint claimId); function transferFrom(address from, address to, uint256 tokenId) external; } contract LPTokenWrapper { using SafeMath for uint256; address constant public yinsure = address(0x181Aea6936B407514ebFC0754A37704eB8d98F91); //yinsure struct Token { uint expirationTimestamp; bytes4 coverCurrency; uint coverAmount; uint adjCoverAmount; uint coverPrice; uint coverPriceNXM; uint expireTime; uint generationTime; uint coverId; bool claimInProgress; uint claimId; uint tokenId; bool withdrawn; } uint256 private _totalStaked; uint256 private _totalCover; uint256 private _adjustedTotalCover; mapping(address => uint256) private _myCover; mapping(address => Token[]) private _owned; function totalStaked() public view returns (uint256) { return _totalStaked; } function totalSupply() public view returns (uint256) { return _adjustedTotalCover; } function totalCover() public view returns (uint256) { return _totalCover; } function balanceOf(address account) public view returns (uint256) { return _myCover[account]; } function numStaked(address account) public view returns (uint256) { uint256 staked = 0; for (uint i = 0; i < _owned[account].length; i++) { if (!_owned[account][i].withdrawn) { staked++; } } return staked; } function calculateCoverValue(uint256 coverAmount, uint256 generationTime, uint256 expirationTimestamp) public view returns (uint256) { // generationTime is in milliseconds, expirationTimestamp is in seconds uint256 x = block.timestamp.mul(1000).sub(generationTime); uint256 y = expirationTimestamp.mul(1000).sub(generationTime); uint256 multiplier = 100000; uint256 per = x.mul(multiplier).div(y); return multiplier.sub(per).mul(coverAmount).div(multiplier); } function idsStaked(address account) public view returns (uint256[] memory) { uint256[] memory staked = new uint256[](numStaked(account)); uint tempIdx = 0; for(uint i = 0; i < _owned[account].length; i++) { if(!_owned[account][i].withdrawn) { staked[tempIdx] = _owned[account][i].tokenId; tempIdx ++; } } return staked; } function getToken(uint256 tokenId) public view returns(uint expirationTimestamp, bytes4 coverCurrency, uint coverAmount, uint coverPrice, uint coverPriceNXM, uint expireTime, uint generationTime, uint coverId, bool claimInProgress, uint claimId) { return yNFT(yinsure).tokens(tokenId); } function stake(uint256 tokenId) public { (uint expirationTimestamp, bytes4 coverCurrency, uint coverAmount, uint coverPrice, uint coverPriceNXM, uint expireTime, uint generationTime, uint coverId, bool claimInProgress, uint claimId) = getToken(tokenId); require(coverCurrency == bytes4(0x45544800), "yNFT cover currency must be ETH"); require(expirationTimestamp - 24 hours> block.timestamp, "cover has expired or is 24 hours away from expiring!"); uint256 adjCoverAmount = calculateCoverValue(coverAmount, generationTime, expirationTimestamp); _owned[msg.sender].push(Token(expirationTimestamp, coverCurrency, coverAmount, adjCoverAmount, coverPrice, coverPriceNXM, expireTime, generationTime, coverId, claimInProgress, claimId, tokenId, false)); _totalStaked = _totalStaked.add(1); _adjustedTotalCover = _adjustedTotalCover.add(adjCoverAmount); _totalCover = _totalCover.add(coverAmount); _myCover[msg.sender] = _myCover[msg.sender].add(adjCoverAmount); yNFT(yinsure).transferFrom(msg.sender, address(this), tokenId); } function withdraw(uint256 tokenId) public { for (uint i = 0; i < _owned[msg.sender].length; i++) { if (_owned[msg.sender][i].tokenId == tokenId && !_owned[msg.sender][i].withdrawn) { _totalStaked = _totalStaked.sub(1); _totalCover = _totalCover.sub(_owned[msg.sender][i].coverAmount); _adjustedTotalCover = _adjustedTotalCover.sub(_owned[msg.sender][i].adjCoverAmount); _myCover[msg.sender] = _myCover[msg.sender].sub(_owned[msg.sender][i].adjCoverAmount); _owned[msg.sender][i].withdrawn = true; yNFT(yinsure).transferFrom(address(this), msg.sender, tokenId); } } } function withdrawAll() public { for (uint i = 0; i < _owned[msg.sender].length; i++) { if (!_owned[msg.sender][i].withdrawn) { _totalStaked = _totalStaked.sub(1); _totalCover = _totalCover.sub(_owned[msg.sender][i].coverAmount); _adjustedTotalCover = _adjustedTotalCover.sub(_owned[msg.sender][i].adjCoverAmount); _myCover[msg.sender] = _myCover[msg.sender].sub(_owned[msg.sender][i].adjCoverAmount); _owned[msg.sender][i].withdrawn = true; yNFT(yinsure).transferFrom(address(this), msg.sender, _owned[msg.sender][i].tokenId); } } } } contract yNFTETHPool is LPTokenWrapper, IRewardDistributionRecipient { using SafeERC20 for IERC20; IERC20 public safe = IERC20(0x1Aa61c196E76805fcBe394eA00e4fFCEd24FC469); uint256 public constant DURATION = 7 days; uint256 public initreward = 10000*1e18; uint256 public starttime = 1599944400; // 1599944400 => Saturday, September 12, 2020 4:00:00 PM GMT-05:00 DST uint256 public periodFinish = 0; uint256 public rewardRate = 0; uint256 public lastUpdateTime; uint256 public rewardPerTokenStored; mapping(address => uint256) public userRewardPerTokenPaid; mapping(address => uint256) public rewards; event RewardAdded(uint256 reward); event Staked(address indexed user, uint256 tokenId); event Withdrawn(address indexed user, uint256 tokenId); event WithdrawnAll(address indexed user); event RewardPaid(address indexed user, uint256 reward); modifier updateReward(address account) { rewardPerTokenStored = rewardPerToken(); lastUpdateTime = lastTimeRewardApplicable(); if (account != address(0)) { rewards[account] = earned(account); userRewardPerTokenPaid[account] = rewardPerTokenStored; } _; } function lastTimeRewardApplicable() public view returns (uint256) { return Math.min(block.timestamp, periodFinish); } function rewardPerToken() public view returns (uint256) { if (totalSupply() == 0) { return rewardPerTokenStored; } return rewardPerTokenStored.add( lastTimeRewardApplicable() .sub(lastUpdateTime) .mul(rewardRate) .mul(1e18) .div(totalSupply()) ); } function earned(address account) public view returns (uint256) { return balanceOf(account) .mul(rewardPerToken().sub(userRewardPerTokenPaid[account])) .div(1e18) .add(rewards[account]); } // stake visibility is public as overriding LPTokenWrapper's stake() function function stake(uint256 tokenId) public updateReward(msg.sender) checkhalve checkStart{ require(tokenId >= 0, "token id must be >= 0"); super.stake(tokenId); emit Staked(msg.sender, tokenId); } function stakeMultiple(uint256[] memory tokenIds) public updateReward(msg.sender) checkhalve checkStart{ for (uint i = 0; i < tokenIds.length; i++) { require(tokenIds[i] >= 0, "token id must be >= 0"); super.stake(tokenIds[i]); emit Staked(msg.sender, tokenIds[i]); } } function withdraw(uint256 tokenId) public updateReward(msg.sender) checkhalve checkStart{ require(tokenId >= 0, "token id must be >= 0"); require(numStaked(msg.sender) > 0, "no ynfts staked"); super.withdraw(tokenId); emit Withdrawn(msg.sender, tokenId); } function withdrawMultiple(uint256[] memory tokenIds) public updateReward(msg.sender) checkhalve checkStart{ for (uint i = 0; i < tokenIds.length; i++) { require(tokenIds[i] >= 0, "token id must be >= 0"); super.withdraw(tokenIds[i]); emit Withdrawn(msg.sender, tokenIds[i]); } } function withdrawAll() public updateReward(msg.sender) checkhalve checkStart { require(numStaked(msg.sender) > 0, "no ynfts staked"); super.withdrawAll(); emit WithdrawnAll(msg.sender); } function exit() external { withdrawAll(); getReward(); } function getReward() public updateReward(msg.sender) checkhalve checkStart { uint256 reward = earned(msg.sender); if (reward > 0) { rewards[msg.sender] = 0; safe.safeTransfer(msg.sender, reward); emit RewardPaid(msg.sender, reward); } } modifier checkhalve(){ if (block.timestamp >= periodFinish) { initreward = initreward.mul(50).div(100); safe.mint(address(this),initreward); rewardRate = initreward.div(DURATION); periodFinish = block.timestamp.add(DURATION); emit RewardAdded(initreward); } _; } modifier checkStart(){ require(block.timestamp > starttime,"not start"); _; } function notifyRewardAmount(uint256 reward) external onlyRewardDistribution updateReward(address(0)) { if (block.timestamp >= periodFinish) { rewardRate = reward.div(DURATION); } else { uint256 remaining = periodFinish.sub(block.timestamp); uint256 leftover = remaining.mul(rewardRate); rewardRate = reward.add(leftover).div(DURATION); } safe.mint(address(this),reward); lastUpdateTime = block.timestamp; periodFinish = block.timestamp.add(DURATION); emit RewardAdded(reward); } }
File 2 of 3: yInsure
pragma solidity ^0.5.0; contract Context { constructor () internal { } function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } interface IERC165 { function supportsInterface(bytes4 interfaceId) external view returns (bool); } contract IERC721 is IERC165 { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); function balanceOf(address owner) public view returns (uint256 balance); function ownerOf(uint256 tokenId) public view returns (address owner); function safeTransferFrom(address from, address to, uint256 tokenId) public; function transferFrom(address from, address to, uint256 tokenId) public; function approve(address to, uint256 tokenId) public; function getApproved(uint256 tokenId) public view returns (address operator); function setApprovalForAll(address operator, bool _approved) public; function isApprovedForAll(address owner, address operator) public view returns (bool); function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public; } contract IERC721Receiver { function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data) public returns (bytes4); } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } 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; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } 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; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } library Address { function isContract(address account) internal view returns (bool) { bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } 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 Counters { using SafeMath for uint256; struct Counter { uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { // The {SafeMath} overflow check can be skipped here, see the comment at the top counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } contract ERC165 is IERC165 { bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { _registerInterface(_INTERFACE_ID_ERC165); } function supportsInterface(bytes4 interfaceId) external view returns (bool) { return _supportedInterfaces[interfaceId]; } function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } contract ERC721 is Context, ERC165, IERC721 { using SafeMath for uint256; using Address for address; using Counters for Counters.Counter; bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; mapping (uint256 => address) private _tokenOwner; mapping (uint256 => address) private _tokenApprovals; mapping (address => Counters.Counter) private _ownedTokensCount; mapping (address => mapping (address => bool)) private _operatorApprovals; bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; constructor () public { // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); } function balanceOf(address owner) public view returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _ownedTokensCount[owner].current(); } function ownerOf(uint256 tokenId) public view returns (address) { address owner = _tokenOwner[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } function approve(address to, uint256 tokenId) public { address owner = ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } function getApproved(uint256 tokenId) public view returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } function setApprovalForAll(address to, bool approved) public { require(to != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][to] = approved; emit ApprovalForAll(_msgSender(), to, approved); } function isApprovedForAll(address owner, address operator) public view returns (bool) { return _operatorApprovals[owner][operator]; } function transferFrom(address from, address to, uint256 tokenId) public { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransferFrom(from, to, tokenId, _data); } function _safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) internal { _transferFrom(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } function _exists(uint256 tokenId) internal view returns (bool) { address owner = _tokenOwner[tokenId]; return owner != address(0); } function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } function _safeMint(address to, uint256 tokenId) internal { _safeMint(to, tokenId, ""); } function _safeMint(address to, uint256 tokenId, bytes memory _data) internal { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } function _mint(address to, uint256 tokenId) internal { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _tokenOwner[tokenId] = to; _ownedTokensCount[to].increment(); emit Transfer(address(0), to, tokenId); } function _burn(address owner, uint256 tokenId) internal { require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own"); _clearApproval(tokenId); _ownedTokensCount[owner].decrement(); _tokenOwner[tokenId] = address(0); emit Transfer(owner, address(0), tokenId); } function _burn(uint256 tokenId) internal { _burn(ownerOf(tokenId), tokenId); } function _transferFrom(address from, address to, uint256 tokenId) internal { require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _clearApproval(tokenId); _ownedTokensCount[from].decrement(); _ownedTokensCount[to].increment(); _tokenOwner[tokenId] = to; emit Transfer(from, to, tokenId); } function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) internal returns (bool) { if (!to.isContract()) { return true; } // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = to.call(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data )); if (!success) { if (returndata.length > 0) { // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert("ERC721: transfer to non ERC721Receiver implementer"); } } else { bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } } function _clearApproval(uint256 tokenId) private { if (_tokenApprovals[tokenId] != address(0)) { _tokenApprovals[tokenId] = address(0); } } } contract IERC721Enumerable is IERC721 { function totalSupply() public view returns (uint256); function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId); function tokenByIndex(uint256 index) public view returns (uint256); } contract ERC721Enumerable is Context, ERC165, ERC721, IERC721Enumerable { mapping(address => uint256[]) private _ownedTokens; mapping(uint256 => uint256) private _ownedTokensIndex; uint256[] private _allTokens; mapping(uint256 => uint256) private _allTokensIndex; bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; constructor () public { // register the supported interface to conform to ERC721Enumerable via ERC165 _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) { require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } function totalSupply() public view returns (uint256) { return _allTokens.length; } function tokenByIndex(uint256 index) public view returns (uint256) { require(index < totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } function _transferFrom(address from, address to, uint256 tokenId) internal { super._transferFrom(from, to, tokenId); _removeTokenFromOwnerEnumeration(from, tokenId); _addTokenToOwnerEnumeration(to, tokenId); } function _mint(address to, uint256 tokenId) internal { super._mint(to, tokenId); _addTokenToOwnerEnumeration(to, tokenId); _addTokenToAllTokensEnumeration(tokenId); } function _burn(address owner, uint256 tokenId) internal { super._burn(owner, tokenId); _removeTokenFromOwnerEnumeration(owner, tokenId); // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund _ownedTokensIndex[tokenId] = 0; _removeTokenFromAllTokensEnumeration(tokenId); } function _tokensOfOwner(address owner) internal view returns (uint256[] storage) { return _ownedTokens[owner]; } function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { _ownedTokensIndex[tokenId] = _ownedTokens[to].length; _ownedTokens[to].push(tokenId); } function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { uint256 lastTokenIndex = _ownedTokens[from].length.sub(1); uint256 tokenIndex = _ownedTokensIndex[tokenId]; if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } _ownedTokens[from].length--; } function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { uint256 lastTokenIndex = _allTokens.length.sub(1); uint256 tokenIndex = _allTokensIndex[tokenId]; uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index _allTokens.length--; _allTokensIndex[tokenId] = 0; } } contract IERC721Metadata is IERC721 { function name() external view returns (string memory); function symbol() external view returns (string memory); function tokenURI(uint256 tokenId) external view returns (string memory); } contract ERC721Metadata is Context, ERC165, ERC721, IERC721Metadata { string private _name; string private _symbol; string private _baseURI; mapping(uint256 => string) private _tokenURIs; bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721_METADATA); } function name() external view returns (string memory) { return _name; } function symbol() external view returns (string memory) { return _symbol; } function tokenURI(uint256 tokenId) external view returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; // Even if there is a base URI, it is only appended to non-empty token-specific URIs if (bytes(_tokenURI).length == 0) { return ""; } else { // abi.encodePacked is being used to concatenate strings return string(abi.encodePacked(_baseURI, _tokenURI)); } } function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } function _setBaseURI(string memory baseURI) internal { _baseURI = baseURI; } function baseURI() external view returns (string memory) { return _baseURI; } function _burn(address owner, uint256 tokenId) internal { super._burn(owner, tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } contract ERC721Full is ERC721, ERC721Enumerable, ERC721Metadata { constructor (string memory name, string memory symbol) public ERC721Metadata(name, symbol) { // solhint-disable-previous-line no-empty-blocks } } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } function isOwner() public view returns (bool) { return _msgSender() == _owner; } function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract ReentrancyGuard { bool private _notEntered; constructor () internal { _notEntered = true; } modifier nonReentrant() { require(_notEntered, "ReentrancyGuard: reentrant call"); _notEntered = false; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _notEntered = true; } } interface Pool1 { function changeDependentContractAddress() external; function makeCoverBegin( address smartCAdd, bytes4 coverCurr, uint[] calldata coverDetails, uint16 coverPeriod, uint8 _v, bytes32 _r, bytes32 _s ) external payable; function makeCoverUsingCA( address smartCAdd, bytes4 coverCurr, uint[] calldata coverDetails, uint16 coverPeriod, uint8 _v, bytes32 _r, bytes32 _s ) external; function getWei(uint amount) external view returns(uint); function sellNXMTokens(uint _amount) external returns (bool); } contract INXMMaster { address public tokenAddress; address public owner; uint public pauseTime; function masterInitialized() external view returns(bool); function isPause() external view returns(bool check); function isMember(address _add) external view returns(bool); function getLatestAddress(bytes2 _contractName) external view returns(address payable contractAddress); } interface DSValue { function peek() external view returns (bytes32, bool); function read() external view returns (bytes32); } interface PoolData { struct ApiId { bytes4 typeOf; bytes4 currency; uint id; uint64 dateAdd; uint64 dateUpd; } struct CurrencyAssets { address currAddress; uint baseMin; uint varMin; } struct InvestmentAssets { address currAddress; bool status; uint64 minHoldingPercX100; uint64 maxHoldingPercX100; uint8 decimals; } struct IARankDetails { bytes4 maxIACurr; uint64 maxRate; bytes4 minIACurr; uint64 minRate; } struct McrData { uint mcrPercx100; uint mcrEther; uint vFull; //Pool funds uint64 date; } function setCapReached(uint val) external; function getInvestmentAssetDecimals(bytes4 curr) external returns(uint8 decimal); function getCurrencyAssetAddress(bytes4 curr) external view returns(address); function getInvestmentAssetAddress(bytes4 curr) external view returns(address); function getInvestmentAssetStatus(bytes4 curr) external view returns(bool status); } interface QuotationData { enum HCIDStatus { NA, kycPending, kycPass, kycFailedOrRefunded, kycPassNoCover } enum CoverStatus { Active, ClaimAccepted, ClaimDenied, CoverExpired, ClaimSubmitted, Requested } struct Cover { address payable memberAddress; bytes4 currencyCode; uint sumAssured; uint16 coverPeriod; uint validUntil; address scAddress; uint premiumNXM; } struct HoldCover { uint holdCoverId; address payable userAddress; address scAddress; bytes4 coverCurr; uint[] coverDetails; uint16 coverPeriod; } function getCoverLength() external returns(uint len); function getAuthQuoteEngine() external returns(address _add); function getAllCoversOfUser(address _add) external returns(uint[] memory allCover); function getUserCoverLength(address _add) external returns(uint len); function getCoverStatusNo(uint _cid) external returns(uint8); function getCoverPeriod(uint _cid) external returns(uint32 cp); function getCoverSumAssured(uint _cid) external returns(uint sa); function getCurrencyOfCover(uint _cid) external returns(bytes4 curr); function getValidityOfCover(uint _cid) external returns(uint date); function getscAddressOfCover(uint _cid) external returns(uint, address); function getCoverMemberAddress(uint _cid) external returns(address payable _add); function getCoverPremiumNXM(uint _cid) external returns(uint _premiumNXM); function getCoverDetailsByCoverID1( uint _cid ) external returns ( uint cid, address _memberAddress, address _scAddress, bytes4 _currencyCode, uint _sumAssured, uint premiumNXM ); function getCoverDetailsByCoverID2( uint _cid ) external view returns ( uint cid, uint8 status, uint sumAssured, uint16 coverPeriod, uint validUntil ); function getHoldedCoverDetailsByID1( uint _hcid ) external view returns ( uint hcid, address scAddress, bytes4 coverCurr, uint16 coverPeriod ); function getUserHoldedCoverLength(address _add) external returns (uint); function getUserHoldedCoverByIndex(address _add, uint index) external returns (uint); function getHoldedCoverDetailsByID2( uint _hcid ) external returns ( uint hcid, address payable memberAddress, uint[] memory coverDetails ); function getTotalSumAssuredSC(address _add, bytes4 _curr) external returns(uint amount); } contract TokenData { function lockTokenTimeAfterCoverExp() external returns (uint); } interface Claims { function getClaimbyIndex(uint _claimId) external view returns ( uint claimId, uint status, int8 finalVerdict, address claimOwner, uint coverId ); function submitClaim(uint coverId) external; } contract ClaimsData { function actualClaimLength() external view returns(uint); } interface NXMToken { function balanceOf(address owner) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); } interface MemberRoles { function switchMembership(address) external; } contract yInsure is ERC721Full("yInsureNFT", "yNFT"), Ownable, ReentrancyGuard { struct Token { uint expirationTimestamp; bytes4 coverCurrency; uint coverAmount; uint coverPrice; uint coverPriceNXM; uint expireTime; uint generationTime; uint coverId; bool claimInProgress; uint claimId; } event ClaimRedeemed ( address receiver, uint value, bytes4 currency ); using SafeMath for uint; INXMMaster constant public nxMaster = INXMMaster(0x01BFd82675DBCc7762C84019cA518e701C0cD07e); enum CoverStatus { Active, ClaimAccepted, ClaimDenied, CoverExpired, ClaimSubmitted, Requested } enum ClaimStatus { PendingClaimAssessorVote, // 0 PendingClaimAssessorVoteDenied, // 1 PendingClaimAssessorVoteThresholdNotReachedAccept, // 2 PendingClaimAssessorVoteThresholdNotReachedDeny, // 3 PendingClaimAssessorConsensusNotReachedAccept, // 4 PendingClaimAssessorConsensusNotReachedDeny, // 5 FinalClaimAssessorVoteDenied, // 6 FinalClaimAssessorVoteAccepted, // 7 FinalClaimAssessorVoteDeniedMVAccepted, // 8 FinalClaimAssessorVoteDeniedMVDenied, // 9 FinalClaimAssessorVotAcceptedMVNoDecision, // 10 FinalClaimAssessorVoteDeniedMVNoDecision, // 11 ClaimAcceptedPayoutPending, // 12 ClaimAcceptedNoPayout, // 13 ClaimAcceptedPayoutDone // 14 } function _buyCover( address coveredContractAddress, bytes4 coverCurrency, uint[] memory coverDetails, uint16 coverPeriod, uint8 _v, bytes32 _r, bytes32 _s ) internal returns (uint coverId) { uint coverPrice = coverDetails[1]; Pool1 pool1 = Pool1(nxMaster.getLatestAddress("P1")); if (coverCurrency == "ETH") { pool1.makeCoverBegin.value(coverPrice)(coveredContractAddress, coverCurrency, coverDetails, coverPeriod, _v, _r, _s); } else { address payable pool1Address = address(uint160(address(pool1))); PoolData poolData = PoolData(nxMaster.getLatestAddress("PD")); IERC20 erc20 = IERC20(poolData.getCurrencyAssetAddress(coverCurrency)); erc20.approve(pool1Address, coverPrice); pool1.makeCoverUsingCA(coveredContractAddress, coverCurrency, coverDetails, coverPeriod, _v, _r, _s); } QuotationData quotationData = QuotationData(nxMaster.getLatestAddress("QD")); // *assumes* the newly created claim is appended at the end of the list covers coverId = quotationData.getCoverLength().sub(1); } function _submitClaim(uint coverId) internal returns (uint) { Claims claims = Claims(nxMaster.getLatestAddress("CL")); claims.submitClaim(coverId); ClaimsData claimsData = ClaimsData(nxMaster.getLatestAddress("CD")); uint claimId = claimsData.actualClaimLength() - 1; return claimId; } function getMemberRoles() public view returns (address) { return nxMaster.getLatestAddress("MR"); } function getCover( uint coverId ) internal view returns ( uint cid, uint8 status, uint sumAssured, uint16 coverPeriod, uint validUntil ) { QuotationData quotationData = QuotationData(nxMaster.getLatestAddress("QD")); return quotationData.getCoverDetailsByCoverID2(coverId); } function _sellNXMTokens(uint amount) internal returns (uint ethValue) { address payable pool1Address = nxMaster.getLatestAddress("P1"); Pool1 p1 = Pool1(pool1Address); NXMToken nxmToken = NXMToken(nxMaster.tokenAddress()); ethValue = p1.getWei(amount); nxmToken.approve(pool1Address, amount); p1.sellNXMTokens(amount); } function _getCurrencyAssetAddress(bytes4 currency) internal view returns (address) { PoolData pd = PoolData(nxMaster.getLatestAddress("PD")); return pd.getCurrencyAssetAddress(currency); } function _getLockTokenTimeAfterCoverExpiry() internal returns (uint) { TokenData tokenData = TokenData(nxMaster.getLatestAddress("TD")); return tokenData.lockTokenTimeAfterCoverExp(); } function _getTokenAddress() internal view returns (address) { return nxMaster.tokenAddress(); } function _payoutIsCompleted(uint claimId) internal view returns (bool) { uint256 status; Claims claims = Claims(nxMaster.getLatestAddress("CL")); (, status, , , ) = claims.getClaimbyIndex(claimId); return status == uint(ClaimStatus.FinalClaimAssessorVoteAccepted) || status == uint(ClaimStatus.ClaimAcceptedPayoutDone); } bytes4 internal constant ethCurrency = "ETH"; uint public distributorFeePercentage; uint256 internal issuedTokensCount; mapping(uint256 => Token) public tokens; mapping(bytes4 => uint) public withdrawableTokens; constructor(uint _distributorFeePercentage) public { distributorFeePercentage = _distributorFeePercentage; } function switchMembership(address _newMembership) external onlyOwner { NXMToken nxmToken = NXMToken(nxMaster.tokenAddress()); nxmToken.approve(getMemberRoles(),uint(-1)); MemberRoles(getMemberRoles()).switchMembership(_newMembership); } // Arguments to be passed as coverDetails, from the quote api: // coverDetails[0] = coverAmount; // coverDetails[1] = coverPrice; // coverDetails[2] = coverPriceNXM; // coverDetails[3] = expireTime; // coverDetails[4] = generationTime; function buyCover( address coveredContractAddress, bytes4 coverCurrency, uint[] calldata coverDetails, uint16 coverPeriod, uint8 _v, bytes32 _r, bytes32 _s ) external payable { uint coverPrice = coverDetails[1]; uint requiredValue = distributorFeePercentage.mul(coverPrice).div(100).add(coverPrice); if (coverCurrency == "ETH") { require(msg.value == requiredValue, "Incorrect value sent"); } else { IERC20 erc20 = IERC20(_getCurrencyAssetAddress(coverCurrency)); require(erc20.transferFrom(msg.sender, address(this), requiredValue), "Transfer failed"); } uint coverId = _buyCover(coveredContractAddress, coverCurrency, coverDetails, coverPeriod, _v, _r, _s); withdrawableTokens[coverCurrency] = withdrawableTokens[coverCurrency].add(requiredValue.sub(coverPrice)); // mint token uint256 nextTokenId = issuedTokensCount++; uint expirationTimestamp = block.timestamp + _getLockTokenTimeAfterCoverExpiry() + coverPeriod * 1 days; tokens[nextTokenId] = Token(expirationTimestamp, coverCurrency, coverDetails[0], coverDetails[1], coverDetails[2], coverDetails[3], coverDetails[4], coverId, false, 0); _mint(msg.sender, nextTokenId); } function submitClaim(uint256 tokenId) external onlyTokenApprovedOrOwner(tokenId) { if (tokens[tokenId].claimInProgress) { uint8 coverStatus; (, coverStatus, , , ) = getCover(tokens[tokenId].coverId); require(coverStatus == uint8(CoverStatus.ClaimDenied), "Can submit another claim only if the previous one was denied."); } require(tokens[tokenId].expirationTimestamp > block.timestamp, "Token is expired"); uint claimId = _submitClaim(tokens[tokenId].coverId); tokens[tokenId].claimInProgress = true; tokens[tokenId].claimId = claimId; } function redeemClaim(uint256 tokenId) public onlyTokenApprovedOrOwner(tokenId) nonReentrant { require(tokens[tokenId].claimInProgress, "No claim is in progress"); uint8 coverStatus; uint sumAssured; (, coverStatus, sumAssured, , ) = getCover(tokens[tokenId].coverId); require(coverStatus == uint8(CoverStatus.ClaimAccepted), "Claim is not accepted"); require(_payoutIsCompleted(tokens[tokenId].coverId), "Claim accepted but payout not completed"); _burn(tokenId); _sendAssuredSum(tokens[tokenId].coverCurrency, sumAssured); emit ClaimRedeemed(msg.sender, sumAssured, tokens[tokenId].coverCurrency); } function _sendAssuredSum(bytes4 coverCurrency, uint sumAssured) internal { if (coverCurrency == ethCurrency) { msg.sender.transfer(sumAssured); } else { IERC20 erc20 = IERC20(_getCurrencyAssetAddress(coverCurrency)); require(erc20.transfer(msg.sender, sumAssured), "Transfer failed"); } } function getCoverStatus(uint256 tokenId) external view returns (uint8 coverStatus, bool payoutCompleted) { (, coverStatus, , , ) = getCover(tokens[tokenId].coverId); payoutCompleted = _payoutIsCompleted(tokenId); } function nxmTokenApprove(address _spender, uint256 _value) public onlyOwner { IERC20 nxmToken = IERC20(_getTokenAddress()); nxmToken.approve(_spender, _value); } function withdrawEther(address payable _recipient, uint256 _amount) external onlyOwner nonReentrant { require(withdrawableTokens[ethCurrency] >= _amount, "Not enough ETH"); withdrawableTokens[ethCurrency] = withdrawableTokens[ethCurrency].sub(_amount); _recipient.transfer(_amount); } function withdrawTokens(address payable _recipient, uint256 _amount, bytes4 _currency) external onlyOwner nonReentrant { require(withdrawableTokens[_currency] >= _amount, "Not enough tokens"); withdrawableTokens[_currency] = withdrawableTokens[_currency].sub(_amount); IERC20 erc20 = IERC20(_getCurrencyAssetAddress(_currency)); require(erc20.transfer(_recipient, _amount), "Transfer failed"); } function sellNXMTokens(uint amount) external onlyOwner { uint ethValue = _sellNXMTokens(amount); withdrawableTokens[ethCurrency] = withdrawableTokens[ethCurrency].add(ethValue); } modifier onlyTokenApprovedOrOwner(uint256 tokenId) { require(_isApprovedOrOwner(msg.sender, tokenId), "Not approved or owner"); _; } function () payable external { } }
File 3 of 3: SAFE
/** *Submitted for verification at Etherscan.io on 2020-07-31 */ pragma solidity ^0.5.16; interface IERC20 { function totalSupply() external view returns (uint); function balanceOf(address account) external view returns (uint); function transfer(address recipient, uint amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint amount) external returns (bool); function transferFrom(address sender, address recipient, uint amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); } contract Context { constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } } contract ERC20 is Context, IERC20 { using SafeMath for uint; mapping (address => uint) private _balances; mapping (address => mapping (address => uint)) private _allowances; uint private _totalSupply; function totalSupply() public view returns (uint) { return _totalSupply; } function balanceOf(address account) public view returns (uint) { return _balances[account]; } function transfer(address recipient, uint amount) public returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view returns (uint) { return _allowances[owner][spender]; } function approve(address spender, uint amount) public returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint amount) public returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint addedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint subtractedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function _transfer(address sender, address recipient, uint amount) internal { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } function _mint(address account, uint amount) internal { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } function _burn(address account, uint amount) internal { require(account != address(0), "ERC20: burn from the zero address"); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } function _approve(address owner, address spender, uint amount) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } } contract ERC20Detailed is IERC20 { string private _name; string private _symbol; uint8 private _decimals; constructor (string memory name, string memory symbol, uint8 decimals) public { _name = name; _symbol = symbol; _decimals = decimals; } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } } library SafeMath { function add(uint a, uint b) internal pure returns (uint) { uint c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint a, uint b) internal pure returns (uint) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint a, uint b, string memory errorMessage) internal pure returns (uint) { require(b <= a, errorMessage); uint c = a - b; return c; } function mul(uint a, uint b) internal pure returns (uint) { if (a == 0) { return 0; } uint c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint a, uint b) internal pure returns (uint) { return div(a, b, "SafeMath: division by zero"); } function div(uint a, uint b, string memory errorMessage) internal pure returns (uint) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint c = a / b; return c; } } library Address { function isContract(address account) internal view returns (bool) { bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != 0x0 && codehash != accountHash); } } library SafeERC20 { using SafeMath for uint; using Address for address; function safeTransfer(IERC20 token, address to, uint value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint value) internal { 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 callOptionalReturn(IERC20 token, bytes memory data) private { 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 SAFE is ERC20, ERC20Detailed { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint; address public governance; mapping (address => bool) public minters; constructor () public ERC20Detailed("yieldfarming.insure", "SAFE", 18) { governance = tx.origin; } function mint(address account, uint256 amount) public { require(minters[msg.sender], "!minter"); _mint(account, amount); } function setGovernance(address _governance) public { require(msg.sender == governance, "!governance"); governance = _governance; } function addMinter(address _minter) public { require(msg.sender == governance, "!governance"); minters[_minter] = true; } function removeMinter(address _minter) public { require(msg.sender == governance, "!governance"); minters[_minter] = false; } }