Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 21 from a total of 21 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Emergency Withdr... | 17616111 | 580 days ago | IN | 0 ETH | 0.00067599 | ||||
Withdraw Tokens | 17524378 | 593 days ago | IN | 0 ETH | 0.00092474 | ||||
Withdraw Tokens | 17524260 | 593 days ago | IN | 0 ETH | 0.00101426 | ||||
Withdraw Tokens | 17515097 | 594 days ago | IN | 0 ETH | 0.00225259 | ||||
Withdraw Tokens | 17514931 | 594 days ago | IN | 0 ETH | 0.00186651 | ||||
Buy Tokens | 17503409 | 596 days ago | IN | 0.1 ETH | 0.00201988 | ||||
Buy Tokens | 17499877 | 596 days ago | IN | 0.406233 ETH | 0.00196446 | ||||
Buy Tokens | 17495959 | 597 days ago | IN | 0.02 ETH | 0.00212583 | ||||
Buy Tokens | 17494984 | 597 days ago | IN | 0.02 ETH | 0.00319958 | ||||
Open Sale Period | 17494976 | 597 days ago | IN | 0 ETH | 0.00073598 | ||||
Advance Sale Pha... | 17494973 | 597 days ago | IN | 0 ETH | 0.00051109 | ||||
Register IDO | 17462965 | 602 days ago | IN | 0 ETH | 0.00082061 | ||||
Register IDO | 17462889 | 602 days ago | IN | 0 ETH | 0.00136205 | ||||
Register IDO | 17462814 | 602 days ago | IN | 0 ETH | 0.00139849 | ||||
Register IDO | 17453491 | 603 days ago | IN | 0 ETH | 0.00133803 | ||||
Register IDO | 17447127 | 604 days ago | IN | 0 ETH | 0.0016747 | ||||
Register IDO | 17445267 | 604 days ago | IN | 0 ETH | 0.00150805 | ||||
Advance Sale Pha... | 17445262 | 604 days ago | IN | 0 ETH | 0.00087332 | ||||
Extend Time | 17401165 | 610 days ago | IN | 0 ETH | 0.00118364 | ||||
Deposit Tokens | 17401158 | 610 days ago | IN | 0 ETH | 0.00119671 | ||||
Deposit Tokens | 17401154 | 610 days ago | IN | 0 ETH | 0.00071343 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
F9CrowdSale
Compiler Version
v0.5.16+commit.9c3226ce
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: Unlicense pragma solidity 0.5.16; // import "openzeppelin-solidity2/contracts/crowdsale/Crowdsale.sol"; // import "openzeppelin-solidity2/contracts/crowdsale/distribution/PostDeliveryCrowdsale.sol"; // import "openzeppelin-solidity2/contracts/crowdsale/validation/TimedCrowdsale.sol"; // import "openzeppelin-solidity2/contracts/math/SafeMath.sol"; // import "openzeppelin-solidity2/contracts/ownership/Ownable.sol"; import "openzeppelin-solidity2/crowdsale/Crowdsale.sol"; import "openzeppelin-solidity2/crowdsale/distribution/PostDeliveryCrowdsale.sol"; import "openzeppelin-solidity2/crowdsale/validation/TimedCrowdsale.sol"; import "openzeppelin-solidity2/math/SafeMath.sol"; import "openzeppelin-solidity2/ownership/Ownable.sol"; import "./Staker.sol"; import "./stakingToken.sol"; contract ERC20IDO is IERC20 { function setStartTimestamp(uint256 _newStart) external; } contract F9CrowdSale is Crowdsale, TimedCrowdsale, PostDeliveryCrowdsale, Ownable { using SafeMath for uint256; Staker public stakingContract; address public f9TokenAddress; address public dao9TokenAddress; IERC20 public tokenInstance; // Have minimum and maximum contributions uint256 public investorMinCap = .02 * 10**18; uint256 public investorHardCap = 1 * 10**18; enum SalePhase { PREREGISTRATION, F9REGISTRATION, DAO9REGISTRATION, OPENSALE } SalePhase phase = SalePhase.PREREGISTRATION; // Track investor contributions mapping(address => uint256) private contributions; // Track registrants mapping(address => uint256) private multiplier; bool public salesOpen = false; uint256 public tokenBalance; uint256 public IDOrate; uint256[3] public dao9Tier = [9999 * 10**18, 49999 * 10**18, 99999 * 10**18]; event TokensPurchasedTimestamp(uint256 date, address indexed beneficiary, uint256 amount); event Registered(uint256 date, address indexed beneficiary, uint256 allocationMultiple); event withdrawRemaining(uint256 amount, uint256 timestamp); event emergencyWithdrawal(uint256 amount, uint256 timestamp); event updateDAO9TierLevels( uint256 lowTier, uint256 middleTier, uint256 highTier, uint256 timestamp ); event changeSalePhase(SalePhase newPhase, uint256 timestamp); event changeSaleOpen(bool salesOpen, uint256 timestamp); event changeRate(uint256 newRate, uint256 timestamp); event changeMinCap(uint256 newMinCap, uint256 timestamp); event changeMaxCap(uint256 newMaxCap, uint256 timestamp); event changeSaleEnd(uint256 newSaleEnd, uint256 timestamp); constructor( uint256 _rate, address payable _wal, IERC20 _token, uint256 _openingTime, uint256 _closingTime, Staker _stakingContract, address _f9Token, address _dao9Token ) public Crowdsale(_rate, _wal, _token) TimedCrowdsale(_openingTime, _closingTime) PostDeliveryCrowdsale() Ownable() { IDOrate = _rate; tokenInstance = _token; stakingContract = _stakingContract; f9TokenAddress = _f9Token; dao9TokenAddress = _dao9Token; } function() external payable { revert(); } /** * @dev Deposit tokens to be sold in IDO * @param tokens number of tokens deposited into contract */ function depositTokens(uint256 tokens) external { uint256 amountBefore = tokenInstance.balanceOf(address(this)); if (amountBefore > tokenBalance) { tokenBalance = amountBefore; //update token deposit made through direct transfers } if (tokens != 0) { // Only the sale token specified in the constructor can be deposited tokenInstance.transferFrom(_msgSender(), address(this), tokens); uint256 amountAfter = tokenInstance.balanceOf(address(this)); uint256 _amount = amountAfter.sub(amountBefore); tokenBalance = tokenBalance.add(_amount); } } /** * @dev Owner can withdraw unsold tokens */ function sweepTokens() external onlyOwner { uint256 withdrawalAmount = tokenBalance; tokenBalance = 0; tokenInstance.transfer(_msgSender(), withdrawalAmount); emit withdrawRemaining(withdrawalAmount, now); } /** * @dev Failsafe to withdraw in case tokenBalance state variable becomes corrupted */ function emergencyWithdraw() external onlyOwner { uint256 withdrawalAmount = tokenInstance.balanceOf(address(this)); tokenInstance.transfer(_msgSender(), withdrawalAmount); emit emergencyWithdrawal(withdrawalAmount, now); } /** * @dev Owner can update the amount of DAO9 tokens required for each tier */ function updateDAO9Tiers( uint256 lowTier, uint256 middleTier, uint256 upperTier ) public onlyOwner { dao9Tier = [lowTier, middleTier, upperTier]; stakingContract.updateDAO9Tiers(lowTier, middleTier, upperTier); emit updateDAO9TierLevels(lowTier, middleTier, upperTier, now); } /** * @dev Called by user to register for the IDO. * Determines allocation multiplier, and locks' * users stake for 12960 minutes * @param _token address of token which user is staking * to participate */ function registerIDO(address _token) external { uint256 stakedBalance = stakingContract.stakedBalance(IERC20(_token), _msgSender()); require(stakedBalance > 0, "IDO: No staked tokens to register"); if (_token == dao9TokenAddress) { require(phase == SalePhase.DAO9REGISTRATION, "IDO: Not DAO9 Registration"); if (stakedBalance >= dao9Tier[2]) { multiplier[_msgSender()] = 10; } else if (stakedBalance >= dao9Tier[1]) { multiplier[_msgSender()] = 5; } else if (stakedBalance >= dao9Tier[0]) { multiplier[_msgSender()] = 1; } else { revert("IDO: Insufficient DAO9 stake"); } } else if (_token == f9TokenAddress) { require(phase == SalePhase.F9REGISTRATION, "IDO: Not F9 Registration"); if (stakedBalance >= 4206969 * 10**9) { multiplier[_msgSender()] = 420; } else if (stakedBalance >= 999999 * 10**9) { multiplier[_msgSender()] = 100; } else if (stakedBalance >= 499999 * 10**9) { multiplier[_msgSender()] = 50; } else if (stakedBalance >= 99999 * 10**9) { multiplier[_msgSender()] = 10; } else if (stakedBalance >= 9999 * 10**9) { multiplier[_msgSender()] = 1; } else { revert("IDO: Insufficient F9 stake"); } } emit Registered(now, _msgSender(), multiplier[_msgSender()]); stakingContract.lock(_msgSender(), now + 12960 minutes); } /** * @dev Owner can set sale phase. * * Note that sales are ALSO halted/unhalted by the openSalePeriod() function * * SalePhase is an enum with three possible values: * PREREGISTRATION (CLOSED) : 0 * F9REGISTRATION : 1 * DAO9REGISTRATION : 2 * OPENSALE : 3 * * The contract sets the phase to 0 upon deployment and _salesOpen to false. * * @param _phase current sale phase * */ function advanceSalePhase(SalePhase _phase) external onlyOwner { phase = _phase; emit changeSalePhase(_phase, now); } function getSalePhase() external view returns (SalePhase) { return phase; } /** * @dev Owner can open or close sale period * @param _salesOpen boolean true/false: sale period is open */ function openSalePeriod(bool _salesOpen) external onlyOwner { salesOpen = _salesOpen; emit changeSaleOpen(_salesOpen, now); } /** * @dev Owner can update rate * @param _rate uint New Token rate */ function setRate(uint256 _rate) external onlyOwner { IDOrate = _rate; emit changeRate(_rate, now); } function rate() public view returns (uint256) { return IDOrate; } /** * @dev Owner can update investor minimum * @param _minCap uint Minimum individual purchase */ function setMinCap(uint256 _minCap) external onlyOwner { investorMinCap = _minCap; emit changeMinCap(_minCap, now); } /** * @dev Owner can update investor maximum * @param _maxCap uint Maximum individual purchase */ function setMaxCap(uint256 _maxCap) external onlyOwner { investorHardCap = _maxCap; emit changeMaxCap(_maxCap, now); } /** * @dev Returns the amount contributed so far by a specific user. * @param _beneficiary Address of contributor * @return User contribution so far */ function getUserContribution(address _beneficiary) public view returns (uint256) { return contributions[_beneficiary]; } /** * @dev Returns the allocation multiplier for a given registrant * @param _registrant address of registrant */ function getMultiplier(address _registrant) external view returns (uint256) { return multiplier[_registrant]; } /** * @dev Extend parent behavior requiring purchase to respect investor min/max funding cap. * @param _beneficiary Token purchaser * @param _weiAmount Amount of wei contributed */ function _preValidatePurchase(address _beneficiary, uint256 _weiAmount) internal view salePeriod { require(phase == SalePhase.OPENSALE, "IDO: Not open sale period"); require(_beneficiary == _msgSender(), "IDO: User may only purchase tokens for themself"); require(multiplier[_beneficiary] > 0, "IDO: User did not register successfully"); // Check that contribution respects minimum and maximum caps uint256 _existingContribution = contributions[_beneficiary]; uint256 _newContribution = _existingContribution.add(_weiAmount); require(_newContribution >= investorMinCap, "IDO: Must meet minimum investment requirement"); require( _newContribution <= investorHardCap.mul(multiplier[_beneficiary]), "IDO: Must not exceed individual allocation" ); super._preValidatePurchase(_beneficiary, _weiAmount); } /** * @dev Updates beneficiary contribution and contract eth balance * @param _beneficiary Token purchaser * @param _weiAmount Amount of wei contributed */ function _updatePurchasingState(address _beneficiary, uint256 _weiAmount) internal { uint256 _existingContribution = contributions[_beneficiary]; uint256 _newContribution = _existingContribution.add(_weiAmount); contributions[_beneficiary] = _newContribution; super._updatePurchasingState(_beneficiary, _weiAmount); } /** * @dev Override to extend the way in which ether is converted to tokens. * @param weiAmount Value in wei to be converted into tokens * @return Number of tokens that can be purchased with the specified _weiAmount */ function _getTokenAmount(uint256 weiAmount) internal view returns (uint256) { return weiAmount.mul(IDOrate); } /** * @dev Delivers tokens after a sale is completed * @param _beneficiary Address performing the token purchase * @param _tokenAmount Number of tokens to be emitted */ function _deliverTokens(address _beneficiary, uint256 _tokenAmount) internal { require(tokenBalance >= _tokenAmount, "Not enough token balance"); tokenBalance = tokenBalance.sub(_tokenAmount); tokenInstance.transfer(_beneficiary, _tokenAmount); emit TokensPurchasedTimestamp(now, _beneficiary, _tokenAmount); } /** * @dev Dev can extend length of sale if it has not already ended * @param _newTime new end-of-sale timestamp */ function extendTime(uint256 _newTime) external onlyOwner { _extendTime(_newTime); ERC20IDO(address(tokenInstance)).setStartTimestamp(_newTime); emit changeSaleEnd(_newTime, now); } modifier salePeriod() { require(salesOpen, "IDO: Not sale period"); _; } }
pragma solidity 0.5.16; // import "openzeppelin-solidity2/contracts/GSN/Context.sol"; // import "openzeppelin-solidity2/contracts/token/ERC20/IERC20.sol"; // import "openzeppelin-solidity2/contracts/math/SafeMath.sol"; // import "openzeppelin-solidity2/contracts/utils/Address.sol"; // import "openzeppelin-solidity2/contracts/ownership/Ownable.sol"; import "openzeppelin-solidity2/GSN/Context.sol"; import "openzeppelin-solidity2/token/ERC20/IERC20.sol"; import "openzeppelin-solidity2/math/SafeMath.sol"; import "openzeppelin-solidity2/utils/Address.sol"; import "openzeppelin-solidity2/ownership/Ownable.sol"; contract Staker is Ownable { using SafeMath for uint256; using Address for address; IERC20 public f9token; IERC20 public dao9token; mapping(address => mapping(address => uint256)) _tokenBalances; mapping(address => uint256) _unlockTime; mapping(address => bool) _isIDO; mapping(address => bool) _isF9Staked; mapping(address => bool) _isDAO9Staked; mapping(address => uint256) _dao9Tier; bool public f9Halted; bool public dao9Halted; uint256[3] public dao9Tiers = [999 * 10**18, 4999 * 10**18, 9999 * 10**18]; uint256[3] public dao9TiersStaked = [0, 0, 0]; uint256[3] public dao9TiersMax = [100, 100, 100]; event updateDAO9StakeCapacity( uint256 lowTierMax, uint256 middleTierMax, uint256 highTierMax, uint256 timestamp ); event haltF9Staking(bool f9Halted, uint256 timestamp); event haltDAO9Staking(bool dao9Halted, uint256 timestamp); event addIDOManager(address indexed account, uint256 timestamp); event Stake(address indexed account, uint256 timestamp, uint256 value); event Unstake(address indexed account, uint256 timestamp, uint256 value); event Lock(address indexed account, uint256 timestamp, uint256 unlockTime, address locker); constructor(address _f9, address _dao9token) public { f9token = IERC20(_f9); dao9token = IERC20(_dao9token); dao9Halted = true; } function stakedBalance(IERC20 token, address account) external view returns (uint256) { return _tokenBalances[address(token)][account]; } function unlockTime(address account) external view returns (uint256) { return _unlockTime[account]; } function isIDO(address account) external view returns (bool) { return _isIDO[account]; } /** * @dev Returns a boolean for whether a user has staked F9 * * @param account address for which to check status * @return bool - true if user has staked F9 */ function isF9Staked(address account) external view returns (bool) { return _isF9Staked[account]; } function isDAO9Staked(address account) external view returns (bool) { return _isDAO9Staked[account]; } function updateDAO9Tiers( uint256 lowTier, uint256 middleTier, uint256 highTier ) external onlyIDO { dao9Tiers = [lowTier, middleTier, highTier]; } function updateDAO9TiersMax( uint256 lowTierMax, uint256 middleTierMax, uint256 highTierMax ) external onlyOwner { dao9TiersMax = [lowTierMax, middleTierMax, highTierMax]; emit updateDAO9StakeCapacity(lowTierMax, middleTierMax, highTierMax, now); } function _stake(IERC20 token, uint256 value) internal { token.transferFrom(_msgSender(), address(this), value); _tokenBalances[address(token)][_msgSender()] = _tokenBalances[address(token)][_msgSender()].add( value ); emit Stake(_msgSender(), now, value); } function _unstake(IERC20 token, uint256 value) internal { _tokenBalances[address(token)][_msgSender()] = _tokenBalances[address(token)][_msgSender()].sub( value, "Staker: insufficient staked balance" ); token.transfer(_msgSender(), value); emit Unstake(_msgSender(), now, value); } /** * @dev User calls this function to stake DAO9 */ function dao9Stake(uint256 tier) external notDAO9Halted { require( dao9token.balanceOf(_msgSender()) >= dao9Tiers[tier], "Staker: Stake amount exceeds wallet DAO9 balance" ); require(dao9TiersStaked[tier] < dao9TiersMax[tier], "Staker: Pool is full"); require(_isDAO9Staked[_msgSender()] == false, "Staker: User already staked DAO9"); require(_isF9Staked[_msgSender()] == false, "Staker: User staked in F9 pool"); _isDAO9Staked[_msgSender()] = true; _dao9Tier[_msgSender()] = tier; dao9TiersStaked[tier] += 1; _stake(dao9token, dao9Tiers[tier]); } /** * @dev User calls this function to stake F9 */ function f9Stake(uint256 value) external notF9Halted { require(value > 0, "Staker: unstake value should be greater than 0"); require( f9token.balanceOf(_msgSender()) >= value, "Staker: Stake amount exceeds wallet F9 balance" ); require(_isDAO9Staked[_msgSender()] == false, "Staker: User staked in DAO9 pool"); _isF9Staked[_msgSender()] = true; _stake(f9token, value); } function dao9Unstake() external lockable { uint256 _tier = _dao9Tier[_msgSender()]; require( _tokenBalances[address(dao9token)][_msgSender()] > 0, "Staker: insufficient staked DAO9" ); dao9TiersStaked[_tier] -= 1; _isDAO9Staked[_msgSender()] = false; _unstake(dao9token, _tokenBalances[address(dao9token)][_msgSender()]); } function f9Unstake(uint256 value) external lockable { require(value > 0, "Staker: unstake value should be greater than 0"); require( _tokenBalances[address(f9token)][_msgSender()] >= value, "Staker: insufficient staked F9 balance" ); _unstake(f9token, value); if (_tokenBalances[address(f9token)][_msgSender()] == 0) { _isF9Staked[_msgSender()] = false; } } function lock(address user, uint256 unlockAt) external onlyIDO { require(unlockAt > now, "Staker: unlock is in the past"); if (_unlockTime[user] < unlockAt) { _unlockTime[user] = unlockAt; emit Lock(user, now, unlockAt, _msgSender()); } } function f9Halt(bool status) external onlyOwner { f9Halted = status; emit haltF9Staking(status, now); } function dao9Halt(bool status) external onlyOwner { dao9Halted = status; emit haltDAO9Staking(status, now); } function addIDO(address account) external onlyOwner { require(account != address(0), "Staker: cannot be zero address"); _isIDO[account] = true; emit addIDOManager(account, now); } modifier onlyIDO() { require(_isIDO[_msgSender()], "Staker: only IDOs can lock"); _; } modifier lockable() { require(_unlockTime[_msgSender()] <= now, "Staker: account is locked"); _; } modifier notF9Halted() { require(!f9Halted, "Staker: F9 deposits are paused"); _; } modifier notDAO9Halted() { require(!dao9Halted, "Staker: DAO9 deposits are paused"); _; } }
pragma solidity 0.5.16; // import "openzeppelin-solidity2/contracts/token/ERC20/ERC20Mintable.sol"; // import "openzeppelin-solidity2/contracts/token/ERC20/ERC20Detailed.sol"; // import "openzeppelin-solidity2/contracts/token/ERC20/ERC20Pausable.sol"; import "openzeppelin-solidity2/token/ERC20/ERC20Mintable.sol"; import "openzeppelin-solidity2/token/ERC20/ERC20Detailed.sol"; import "openzeppelin-solidity2/token/ERC20/ERC20Pausable.sol"; //f9 contract stakingToken is ERC20Pausable, ERC20Mintable, ERC20Detailed { constructor( string memory _name, string memory _symbol, uint8 decimals ) public ERC20Detailed(_name, _symbol, decimals) ERC20Pausable() { _mint(msg.sender, 999999999 * 10**9); } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public whenNotPaused returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev Called by a pauser to unpause, returns to normal state. */ // function unpause() public onlyPauser whenPaused { // super.unpause(); // } }
pragma solidity ^0.5.0; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } }
pragma solidity ^0.5.0; import "../../GSN/Context.sol"; import "../Roles.sol"; contract MinterRole is Context { using Roles for Roles.Role; event MinterAdded(address indexed account); event MinterRemoved(address indexed account); Roles.Role private _minters; constructor () internal { _addMinter(_msgSender()); } modifier onlyMinter() { require(isMinter(_msgSender()), "MinterRole: caller does not have the Minter role"); _; } function isMinter(address account) public view returns (bool) { return _minters.has(account); } function addMinter(address account) public onlyMinter { _addMinter(account); } function renounceMinter() public { _removeMinter(_msgSender()); } function _addMinter(address account) internal { _minters.add(account); emit MinterAdded(account); } function _removeMinter(address account) internal { _minters.remove(account); emit MinterRemoved(account); } }
pragma solidity ^0.5.0; import "../../GSN/Context.sol"; import "../Roles.sol"; contract PauserRole is Context { using Roles for Roles.Role; event PauserAdded(address indexed account); event PauserRemoved(address indexed account); Roles.Role private _pausers; constructor () internal { _addPauser(_msgSender()); } modifier onlyPauser() { require(isPauser(_msgSender()), "PauserRole: caller does not have the Pauser role"); _; } function isPauser(address account) public view returns (bool) { return _pausers.has(account); } function addPauser(address account) public onlyPauser { _addPauser(account); } function renouncePauser() public { _removePauser(_msgSender()); } function _addPauser(address account) internal { _pausers.add(account); emit PauserAdded(account); } function _removePauser(address account) internal { _pausers.remove(account); emit PauserRemoved(account); } }
pragma solidity ^0.5.0; import "../GSN/Context.sol"; import "../token/ERC20/IERC20.sol"; import "../math/SafeMath.sol"; import "../token/ERC20/SafeERC20.sol"; import "../utils/ReentrancyGuard.sol"; /** * @title Crowdsale * @dev Crowdsale is a base contract for managing a token crowdsale, * allowing investors to purchase tokens with ether. This contract implements * such functionality in its most fundamental form and can be extended to provide additional * functionality and/or custom behavior. * The external interface represents the basic interface for purchasing tokens, and conforms * the base architecture for crowdsales. It is *not* intended to be modified / overridden. * The internal interface conforms the extensible and modifiable surface of crowdsales. Override * the methods to add functionality. Consider using 'super' where appropriate to concatenate * behavior. */ contract Crowdsale is Context, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; // The token being sold IERC20 private _token; // Address where funds are collected address payable private _wallet; // How many token units a buyer gets per wei. // The rate is the conversion between wei and the smallest and indivisible token unit. // So, if you are using a rate of 1 with a ERC20Detailed token with 3 decimals called TOK // 1 wei will give you 1 unit, or 0.001 TOK. uint256 private _rate; // Amount of wei raised uint256 private _weiRaised; /** * Event for token purchase logging * @param purchaser who paid for the tokens * @param beneficiary who got the tokens * @param value weis paid for purchase * @param amount amount of tokens purchased */ event TokensPurchased(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount); /** * @param rate Number of token units a buyer gets per wei * @dev The rate is the conversion between wei and the smallest and indivisible * token unit. So, if you are using a rate of 1 with a ERC20Detailed token * with 3 decimals called TOK, 1 wei will give you 1 unit, or 0.001 TOK. * @param wallet Address where collected funds will be forwarded to * @param token Address of the token being sold */ constructor (uint256 rate, address payable wallet, IERC20 token) public { require(rate > 0, "Crowdsale: rate is 0"); require(wallet != address(0), "Crowdsale: wallet is the zero address"); require(address(token) != address(0), "Crowdsale: token is the zero address"); _rate = rate; _wallet = wallet; _token = token; } /** * @dev fallback function ***DO NOT OVERRIDE*** * Note that other contracts will transfer funds with a base gas stipend * of 2300, which is not enough to call buyTokens. Consider calling * buyTokens directly when purchasing tokens from a contract. */ function () external payable { buyTokens(_msgSender()); } /** * @return the token being sold. */ function token() public view returns (IERC20) { return _token; } /** * @return the address where funds are collected. */ function wallet() public view returns (address payable) { return _wallet; } /** * @return the number of token units a buyer gets per wei. */ function rate() public view returns (uint256) { return _rate; } /** * @return the amount of wei raised. */ function weiRaised() public view returns (uint256) { return _weiRaised; } /** * @dev low level token purchase ***DO NOT OVERRIDE*** * This function has a non-reentrancy guard, so it shouldn't be called by * another `nonReentrant` function. * @param beneficiary Recipient of the token purchase */ function buyTokens(address beneficiary) public nonReentrant payable { uint256 weiAmount = msg.value; _preValidatePurchase(beneficiary, weiAmount); // calculate token amount to be created uint256 tokens = _getTokenAmount(weiAmount); // update state _weiRaised = _weiRaised.add(weiAmount); _processPurchase(beneficiary, tokens); emit TokensPurchased(_msgSender(), beneficiary, weiAmount, tokens); _updatePurchasingState(beneficiary, weiAmount); _forwardFunds(); _postValidatePurchase(beneficiary, weiAmount); } /** * @dev Validation of an incoming purchase. Use require statements to revert state when conditions are not met. * Use `super` in contracts that inherit from Crowdsale to extend their validations. * Example from CappedCrowdsale.sol's _preValidatePurchase method: * super._preValidatePurchase(beneficiary, weiAmount); * require(weiRaised().add(weiAmount) <= cap); * @param beneficiary Address performing the token purchase * @param weiAmount Value in wei involved in the purchase */ function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal view { require(beneficiary != address(0), "Crowdsale: beneficiary is the zero address"); require(weiAmount != 0, "Crowdsale: weiAmount is 0"); this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 } /** * @dev Validation of an executed purchase. Observe state and use revert statements to undo rollback when valid * conditions are not met. * @param beneficiary Address performing the token purchase * @param weiAmount Value in wei involved in the purchase */ function _postValidatePurchase(address beneficiary, uint256 weiAmount) internal view { // solhint-disable-previous-line no-empty-blocks } /** * @dev Source of tokens. Override this method to modify the way in which the crowdsale ultimately gets and sends * its tokens. * @param beneficiary Address performing the token purchase * @param tokenAmount Number of tokens to be emitted */ function _deliverTokens(address beneficiary, uint256 tokenAmount) internal { _token.safeTransfer(beneficiary, tokenAmount); } /** * @dev Executed when a purchase has been validated and is ready to be executed. Doesn't necessarily emit/send * tokens. * @param beneficiary Address receiving the tokens * @param tokenAmount Number of tokens to be purchased */ function _processPurchase(address beneficiary, uint256 tokenAmount) internal { _deliverTokens(beneficiary, tokenAmount); } /** * @dev Override for extensions that require an internal state to check for validity (current user contributions, * etc.) * @param beneficiary Address receiving the tokens * @param weiAmount Value in wei involved in the purchase */ function _updatePurchasingState(address beneficiary, uint256 weiAmount) internal { // solhint-disable-previous-line no-empty-blocks } /** * @dev Override to extend the way in which ether is converted to tokens. * @param weiAmount Value in wei to be converted into tokens * @return Number of tokens that can be purchased with the specified _weiAmount */ function _getTokenAmount(uint256 weiAmount) internal view returns (uint256) { return weiAmount.mul(_rate); } /** * @dev Determines how ETH is stored/forwarded on purchases. */ function _forwardFunds() internal { _wallet.transfer(msg.value); } }
pragma solidity ^0.5.0; import "../validation/TimedCrowdsale.sol"; import "../../math/SafeMath.sol"; import "../../ownership/Secondary.sol"; import "../../token/ERC20/IERC20.sol"; /** * @title PostDeliveryCrowdsale * @dev Crowdsale that locks tokens from withdrawal until it ends. */ contract PostDeliveryCrowdsale is TimedCrowdsale { using SafeMath for uint256; mapping(address => uint256) private _balances; __unstable__TokenVault private _vault; constructor() public { _vault = new __unstable__TokenVault(); } /** * @dev Withdraw tokens only after crowdsale ends. * @param beneficiary Whose tokens will be withdrawn. */ function withdrawTokens(address beneficiary) public { require(hasClosed(), "PostDeliveryCrowdsale: not closed"); uint256 amount = _balances[beneficiary]; require(amount > 0, "PostDeliveryCrowdsale: beneficiary is not due any tokens"); _balances[beneficiary] = 0; _vault.transfer(token(), beneficiary, amount); } /** * @return the balance of an account. */ function balanceOf(address account) public view returns (uint256) { return _balances[account]; } /** * @dev Overrides parent by storing due balances, and delivering tokens to the vault instead of the end user. This * ensures that the tokens will be available by the time they are withdrawn (which may not be the case if * `_deliverTokens` was called later). * @param beneficiary Token purchaser * @param tokenAmount Amount of tokens purchased */ function _processPurchase(address beneficiary, uint256 tokenAmount) internal { _balances[beneficiary] = _balances[beneficiary].add(tokenAmount); _deliverTokens(address(_vault), tokenAmount); } } /** * @title __unstable__TokenVault * @dev Similar to an Escrow for tokens, this contract allows its primary account to spend its tokens as it sees fit. * This contract is an internal helper for PostDeliveryCrowdsale, and should not be used outside of this context. */ // solhint-disable-next-line contract-name-camelcase contract __unstable__TokenVault is Secondary { function transfer(IERC20 token, address to, uint256 amount) public onlyPrimary { token.transfer(to, amount); } }
pragma solidity ^0.5.0; import "../../math/SafeMath.sol"; import "../Crowdsale.sol"; /** * @title TimedCrowdsale * @dev Crowdsale accepting contributions only within a time frame. */ contract TimedCrowdsale is Crowdsale { using SafeMath for uint256; uint256 private _openingTime; uint256 private _closingTime; /** * Event for crowdsale extending * @param newClosingTime new closing time * @param prevClosingTime old closing time */ event TimedCrowdsaleExtended(uint256 prevClosingTime, uint256 newClosingTime); /** * @dev Reverts if not in crowdsale time range. */ modifier onlyWhileOpen { require(isOpen(), "TimedCrowdsale: not open"); _; } /** * @dev Constructor, takes crowdsale opening and closing times. * @param openingTime Crowdsale opening time * @param closingTime Crowdsale closing time */ constructor (uint256 openingTime, uint256 closingTime) public { // solhint-disable-next-line not-rely-on-time require(openingTime >= block.timestamp, "TimedCrowdsale: opening time is before current time"); // solhint-disable-next-line max-line-length require(closingTime > openingTime, "TimedCrowdsale: opening time is not before closing time"); _openingTime = openingTime; _closingTime = closingTime; } /** * @return the crowdsale opening time. */ function openingTime() public view returns (uint256) { return _openingTime; } /** * @return the crowdsale closing time. */ function closingTime() public view returns (uint256) { return _closingTime; } /** * @return true if the crowdsale is open, false otherwise. */ function isOpen() public view returns (bool) { // solhint-disable-next-line not-rely-on-time return block.timestamp >= _openingTime && block.timestamp <= _closingTime; } /** * @dev Checks whether the period in which the crowdsale is open has already elapsed. * @return Whether crowdsale period has elapsed */ function hasClosed() public view returns (bool) { // solhint-disable-next-line not-rely-on-time return block.timestamp > _closingTime; } /** * @dev Extend parent behavior requiring to be within contributing period. * @param beneficiary Token purchaser * @param weiAmount Amount of wei contributed */ function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal onlyWhileOpen view { super._preValidatePurchase(beneficiary, weiAmount); } /** * @dev Extend crowdsale. * @param newClosingTime Crowdsale closing time */ function _extendTime(uint256 newClosingTime) internal { require(!hasClosed(), "TimedCrowdsale: already closed"); // solhint-disable-next-line max-line-length require(newClosingTime > _closingTime, "TimedCrowdsale: new closing time is before current closing time"); emit TimedCrowdsaleExtended(_closingTime, newClosingTime); _closingTime = newClosingTime; } }
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; } }
pragma solidity ^0.5.0; import "../GSN/Context.sol"; import "../access/roles/PauserRole.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ contract Pausable is Context, PauserRole { /** * @dev Emitted when the pause is triggered by a pauser (`account`). */ event Paused(address account); /** * @dev Emitted when the pause is lifted by a pauser (`account`). */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. Assigns the Pauser role * to the deployer. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Called by a pauser to pause, triggers stopped state. */ function pause() public onlyPauser whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Called by a pauser to unpause, returns to normal state. */ function unpause() public onlyPauser whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
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; } }
pragma solidity ^0.5.0; import "../GSN/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * 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 { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @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; } }
pragma solidity ^0.5.0; import "../GSN/Context.sol"; /** * @dev A Secondary contract can only be used by its primary account (the one that created it). */ contract Secondary is Context { address private _primary; /** * @dev Emitted when the primary contract changes. */ event PrimaryTransferred( address recipient ); /** * @dev Sets the primary account to the one that is creating the Secondary contract. */ constructor () internal { address msgSender = _msgSender(); _primary = msgSender; emit PrimaryTransferred(msgSender); } /** * @dev Reverts if called from any account other than the primary. */ modifier onlyPrimary() { require(_msgSender() == _primary, "Secondary: caller is not the primary account"); _; } /** * @return the address of the primary. */ function primary() public view returns (address) { return _primary; } /** * @dev Transfers contract to a new primary. * @param recipient The address of new primary. */ function transferPrimary(address recipient) public onlyPrimary { require(recipient != address(0), "Secondary: new primary is the zero address"); _primary = recipient; emit PrimaryTransferred(recipient); } }
pragma solidity ^0.5.0; import "../../GSN/Context.sol"; import "./IERC20.sol"; import "../../math/SafeMath.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20Mintable}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 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); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 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); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 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); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 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); } /** * @dev Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } }
pragma solidity ^0.5.0; import "./IERC20.sol"; /** * @dev Optional functions from the ERC20 standard. */ contract ERC20Detailed is IERC20 { string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of * these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol, uint8 decimals) public { _name = name; _symbol = symbol; _decimals = decimals; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } }
pragma solidity ^0.5.0; import "./ERC20.sol"; import "../../access/roles/MinterRole.sol"; /** * @dev Extension of {ERC20} that adds a set of accounts with the {MinterRole}, * which have permission to mint (create) new tokens as they see fit. * * At construction, the deployer of the contract is the only minter. */ contract ERC20Mintable is ERC20, MinterRole { /** * @dev See {ERC20-_mint}. * * Requirements: * * - the caller must have the {MinterRole}. */ function mint(address account, uint256 amount) public onlyMinter returns (bool) { _mint(account, amount); return true; } }
pragma solidity ^0.5.0; import "./ERC20.sol"; import "../../lifecycle/Pausable.sol"; /** * @title Pausable token * @dev ERC20 with pausable transfers and allowances. * * Useful if you want to stop trades until the end of a crowdsale, or have * an emergency switch for freezing all token transfers in the event of a large * bug. */ contract ERC20Pausable is ERC20, Pausable { function transfer(address to, uint256 value) public whenNotPaused returns (bool) { return super.transfer(to, value); } function transferFrom(address from, address to, uint256 value) public whenNotPaused returns (bool) { return super.transferFrom(from, to, value); } function approve(address spender, uint256 value) public whenNotPaused returns (bool) { return super.approve(spender, value); } function increaseAllowance(address spender, uint256 addedValue) public whenNotPaused returns (bool) { return super.increaseAllowance(spender, addedValue); } function decreaseAllowance(address spender, uint256 subtractedValue) public whenNotPaused returns (bool) { return super.decreaseAllowance(spender, subtractedValue); } }
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); /** * @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); }
pragma solidity ^0.5.0; import "./IERC20.sol"; import "../../math/SafeMath.sol"; import "../../utils/Address.sol"; /** * @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"); } } }
pragma solidity ^0.5.5; /** * @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"); } }
pragma solidity ^0.5.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. * * _Since v2.5.0:_ this module is now much more gas efficient, given net gas * metering changes introduced in the Istanbul hardfork. */ 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; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"},{"internalType":"address payable","name":"_wal","type":"address"},{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_openingTime","type":"uint256"},{"internalType":"uint256","name":"_closingTime","type":"uint256"},{"internalType":"contract Staker","name":"_stakingContract","type":"address"},{"internalType":"address","name":"_f9Token","type":"address"},{"internalType":"address","name":"_dao9Token","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"allocationMultiple","type":"uint256"}],"name":"Registered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevClosingTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newClosingTime","type":"uint256"}],"name":"TimedCrowdsaleExtended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"purchaser","type":"address"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensPurchasedTimestamp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"changeMaxCap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMinCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"changeMinCap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"changeRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSaleEnd","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"changeSaleEnd","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"salesOpen","type":"bool"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"changeSaleOpen","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum F9CrowdSale.SalePhase","name":"newPhase","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"changeSalePhase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"emergencyWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lowTier","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"middleTier","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"highTier","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"updateDAO9TierLevels","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"withdrawRemaining","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"IDOrate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"enum F9CrowdSale.SalePhase","name":"_phase","type":"uint8"}],"name":"advanceSalePhase","outputs":[],"payable":false,"stateMutability":"nonpayable","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":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"buyTokens","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"closingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dao9Tier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dao9TokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"depositTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"emergencyWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_newTime","type":"uint256"}],"name":"extendTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"f9TokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_registrant","type":"address"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSalePhase","outputs":[{"internalType":"enum F9CrowdSale.SalePhase","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"getUserContribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"hasClosed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"investorHardCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"investorMinCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"_salesOpen","type":"bool"}],"name":"openSalePeriod","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"openingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"registerIDO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"salesOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_maxCap","type":"uint256"}],"name":"setMaxCap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_minCap","type":"uint256"}],"name":"setMinCap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakingContract","outputs":[{"internalType":"contract Staker","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"sweepTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenInstance","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"lowTier","type":"uint256"},{"internalType":"uint256","name":"middleTier","type":"uint256"},{"internalType":"uint256","name":"upperTier","type":"uint256"}],"name":"updateDAO9Tiers","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"wallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"weiRaised","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"withdrawTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
66470de4df820000600d55670de0b6b3a7640000600e55600f805460ff1990811690915560128054909116905560e060405269021e0c0013070adc00006080908152690a96738339f1d3dc000060a05269152cf4e72a974f1c000060c0526200006d9060159060036200039d565b503480156200007b57600080fd5b5060405162002da038038062002da08339818101604052610100811015620000a257600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e0909701516000805460ff191660011790559596949593949293919290918484898989826200013a576040805162461bcd60e51b815260206004820152601460248201527f43726f776473616c653a20726174652069732030000000000000000000000000604482015290519081900360640190fd5b6001600160a01b038216620001815760405162461bcd60e51b815260040180806020018281038252602581526020018062002d7b6025913960400191505060405180910390fd5b6001600160a01b038116620001c85760405162461bcd60e51b815260040180806020018281038252602481526020018062002d576024913960400191505060405180910390fd5b600292909255600180546001600160a01b039283166001600160a01b0319909116179055600080549190921661010002610100600160a81b031990911617905542821015620002495760405162461bcd60e51b815260040180806020018281038252603381526020018062002ced6033913960400191505060405180910390fd5b818111620002895760405162461bcd60e51b815260040180806020018281038252603781526020018062002d206037913960400191505060405180910390fd5b600491909155600555604051620002a090620003eb565b604051809103906000f080158015620002bd573d6000803e3d6000fd5b50600780546001600160a01b0319166001600160a01b03929092169190911790556000620002ea62000398565b600880546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350601497909755600c80546001600160a01b03199081166001600160a01b039788161790915560098054821693871693909317909255600a80548316918616919091179055600b805490911693909516929092179093555062000416915050565b335b90565b8260038101928215620003d9579160200282015b82811115620003d957825182906001600160501b0316905591602001919060010190620003b1565b50620003e7929150620003f9565b5090565b6103c7806200292683390190565b6200039a91905b80821115620003e7576000815560010162000400565b61250080620004266000396000f3fe6080604052600436106102305760003560e01c80638da5cb5b1161012e578063b7a8807c116100ab578063ed5db8741161006f578063ed5db874146106dc578063ee99205c146106f1578063f2fde38b14610706578063f5a74a5414610739578063fc0c546a1461074e57610230565b8063b7a8807c1461062f578063bb8b2b4714610644578063db2e21bc14610677578063dd49756e1461068c578063ec8ac4d8146106b657610230565b8063a880aee3116100f2578063a880aee31461057e578063a9d637e114610593578063ad7a65ba146105c6578063ae3b748d146105f0578063b25d7f541461061a57610230565b80638da5cb5b146104e95780638f32d59b146104fe57806399259655146105135780639e1a4d191461053f578063a27aebbc1461055457610230565b80634e3befd3116101bc57806370a082311161018057806370a082311461044d578063715018a614610480578063729205e714610495578063763265de146104aa5780638925dbcc146104d457610230565b80634e3befd31461036e578063521eb273146103a75780636312ad5f146103d8578063650cf7da1461040b578063658030b31461043857610230565b80634042b66f116102035780634042b66f146102e757806347535d7b146102fc57806349df728c146103115780634b6753bc146103445780634c7f6c0a1461035957610230565b80631515bc2b146102355780632c4e722e1461025e57806334fcf4371461028557806339a79bdf146102b1575b600080fd5b34801561024157600080fd5b5061024a610763565b604080519115158252519081900360200190f35b34801561026a57600080fd5b5061027361076c565b60408051918252519081900360200190f35b34801561029157600080fd5b506102af600480360360208110156102a857600080fd5b5035610772565b005b3480156102bd57600080fd5b506102af600480360360608110156102d457600080fd5b50803590602081013590604001356107fb565b3480156102f357600080fd5b5061027361092a565b34801561030857600080fd5b5061024a610930565b34801561031d57600080fd5b506102af6004803603602081101561033457600080fd5b50356001600160a01b031661094b565b34801561035057600080fd5b50610273610a7f565b34801561036557600080fd5b50610273610a85565b34801561037a57600080fd5b50610383610a8b565b6040518082600381111561039357fe5b60ff16815260200191505060405180910390f35b3480156103b357600080fd5b506103bc610a94565b604080516001600160a01b039092168252519081900360200190f35b3480156103e457600080fd5b506102af600480360360208110156103fb57600080fd5b50356001600160a01b0316610aa3565b34801561041757600080fd5b506102af6004803603602081101561042e57600080fd5b503560ff16610f16565b34801561044457600080fd5b506103bc610fcb565b34801561045957600080fd5b506102736004803603602081101561047057600080fd5b50356001600160a01b0316610fda565b34801561048c57600080fd5b506102af610ff5565b3480156104a157600080fd5b5061024a611086565b3480156104b657600080fd5b506102af600480360360208110156104cd57600080fd5b503561108f565b3480156104e057600080fd5b506102af611118565b3480156104f557600080fd5b506103bc61123a565b34801561050a57600080fd5b5061024a611249565b34801561051f57600080fd5b506102af6004803603602081101561053657600080fd5b5035151561126f565b34801561054b57600080fd5b50610273611303565b34801561056057600080fd5b506102af6004803603602081101561057757600080fd5b5035611309565b34801561058a57600080fd5b506103bc6113fb565b34801561059f57600080fd5b50610273600480360360208110156105b657600080fd5b50356001600160a01b031661140a565b3480156105d257600080fd5b50610273600480360360208110156105e957600080fd5b5035611425565b3480156105fc57600080fd5b506102af6004803603602081101561061357600080fd5b5035611439565b34801561062657600080fd5b506102736114c2565b34801561063b57600080fd5b506102736114c8565b34801561065057600080fd5b506102736004803603602081101561066757600080fd5b50356001600160a01b03166114ce565b34801561068357600080fd5b506102af6114e9565b34801561069857600080fd5b506102af600480360360208110156106af57600080fd5b503561167c565b6102af600480360360208110156106cc57600080fd5b50356001600160a01b0316611850565b3480156106e857600080fd5b50610273611972565b3480156106fd57600080fd5b506103bc611978565b34801561071257600080fd5b506102af6004803603602081101561072957600080fd5b50356001600160a01b0316611987565b34801561074557600080fd5b506103bc6119da565b34801561075a57600080fd5b506103bc6119e9565b60055442115b90565b60145490565b61077a611249565b6107b9576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b60148190556040805182815242602082015281517fa883b0c4457680bf0320e5e6d26d6d6363663810982303a1c20beaa3ac213f33929181900390910190a150565b610803611249565b610842576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b604080516060810182528481526020810184905290810182905261086a90601590600361227c565b50600954604080516339a79bdf60e01b815260048101869052602481018590526044810184905290516001600160a01b03909216916339a79bdf9160648082019260009290919082900301818387803b1580156108c657600080fd5b505af11580156108da573d6000803e3d6000fd5b5050604080518681526020810186905280820185905242606082015290517fa70ea5e74a302095780dd300d142a6e10da3e4aea51a0de4bdee20235592acff9350908190036080019150a1505050565b60035490565b6000600454421015801561094657506005544211155b905090565b610953610763565b61098e5760405162461bcd60e51b815260040180806020018281038252602181526020018061248a6021913960400191505060405180910390fd5b6001600160a01b038116600090815260066020526040902054806109e35760405162461bcd60e51b81526004018080602001828103825260388152602001806123c06038913960400191505060405180910390fd5b6001600160a01b038083166000908152600660205260408120556007541663beabacc8610a0e6119e9565b604080516001600160e01b031960e085901b1681526001600160a01b03928316600482015291861660248301526044820185905251606480830192600092919082900301818387803b158015610a6357600080fd5b505af1158015610a77573d6000803e3d6000fd5b505050505050565b60055490565b60145481565b600f5460ff1690565b6001546001600160a01b031690565b6009546000906001600160a01b0316638229084b83610ac06119fd565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b158015610b1f57600080fd5b505afa158015610b33573d6000803e3d6000fd5b505050506040513d6020811015610b4957600080fd5b5051905080610b895760405162461bcd60e51b81526004018080602001828103825260218152602001806124ab6021913960400191505060405180910390fd5b600b546001600160a01b0383811691161415610cba576002600f5460ff166003811115610bb257fe5b14610c04576040805162461bcd60e51b815260206004820152601a60248201527f49444f3a204e6f742044414f3920526567697374726174696f6e000000000000604482015290519081900360640190fd5b6017548110610c3a57600a60116000610c1b6119fd565b6001600160a01b03168152602081019190915260400160002055610cb5565b6016548110610c5157600560116000610c1b6119fd565b6015548110610c6857600160116000610c1b6119fd565b6040805162461bcd60e51b815260206004820152601c60248201527f49444f3a20496e73756666696369656e742044414f39207374616b6500000000604482015290519081900360640190fd5b610e2c565b600a546001600160a01b0383811691161415610e2c576001600f5460ff166003811115610ce357fe5b14610d35576040805162461bcd60e51b815260206004820152601860248201527f49444f3a204e6f7420463920526567697374726174696f6e0000000000000000604482015290519081900360640190fd5b660ef2374cd37a008110610d71576101a460116000610d526119fd565b6001600160a01b03168152602081019190915260400160002055610e2c565b66038d7e692bb6008110610d8d57606460116000610d526119fd565b6601c6bf16c876008110610da957603260116000610d526119fd565b655af2d4df76008110610dc457600a60116000610d526119fd565b65091812d7d6008110610ddf57600160116000610d526119fd565b6040805162461bcd60e51b815260206004820152601a60248201527f49444f3a20496e73756666696369656e74204639207374616b65000000000000604482015290519081900360640190fd5b610e346119fd565b6001600160a01b03167f39dd062cc095bf933d83338d8e4591b7eb119264d876f173cacb1cfdf2c9737f4260116000610e6b6119fd565b6001600160a01b03166001600160a01b0316815260200190815260200160002054604051808381526020018281526020019250505060405180910390a26009546001600160a01b031663282d3fdf610ec16119fd565b42620bdd80016040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610a6357600080fd5b610f1e611249565b610f5d576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b600f805482919060ff19166001836003811115610f7657fe5b02179055507f13c3cd13bbe69c5fefab00e59ada8afb2e0e4575816435e6d39ad4ba35632650814260405180836003811115610fae57fe5b60ff1681526020018281526020019250505060405180910390a150565b600c546001600160a01b031681565b6001600160a01b031660009081526006602052604090205490565b610ffd611249565b61103c576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b6008546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600880546001600160a01b0319169055565b60125460ff1681565b611097611249565b6110d6576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b600e8190556040805182815242602082015281517f9b0a2e59093a2d98dfa44d5be4516ec9b1d5cb3906ddc86849e98c8c21635181929181900390910190a150565b611120611249565b61115f576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b601380546000909155600c546001600160a01b031663a9059cbb6111816119fd565b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156111d157600080fd5b505af11580156111e5573d6000803e3d6000fd5b505050506040513d60208110156111fb57600080fd5b50506040805182815242602082015281517f075f78784acf1bbe85ef0240b7a2e78304830128bae7b139589628c1ad395934929181900390910190a150565b6008546001600160a01b031690565b6008546000906001600160a01b03166112606119fd565b6001600160a01b031614905090565b611277611249565b6112b6576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b6012805460ff19168215159081179091556040805191825242602083015280517fe65bfa7a822958bacb7488049252843165d2e6cd95c99c346f930e257b3f5f609281900390910190a150565b60135481565b611311611249565b611350576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b61135981611a01565b600c546040805163c44bef7560e01b81526004810184905290516001600160a01b039092169163c44bef759160248082019260009290919082900301818387803b1580156113a657600080fd5b505af11580156113ba573d6000803e3d6000fd5b50506040805184815242602082015281517f7720e74c00acc5fc08c61dfe995c1ff5d722b9af5ad7b9f8eaa44ec9fa5418fa9450908190039091019150a150565b600b546001600160a01b031681565b6001600160a01b031660009081526011602052604090205490565b6015816003811061143257fe5b0154905081565b611441611249565b611480576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b600d8190556040805182815242602082015281517fea096761d0d83c4dcd3d10975ec857131458be4986ce05ef4fab880e53bccb14929181900390910190a150565b600d5481565b60045490565b6001600160a01b031660009081526010602052604090205490565b6114f1611249565b611530576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b600c54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561157b57600080fd5b505afa15801561158f573d6000803e3d6000fd5b505050506040513d60208110156115a557600080fd5b5051600c549091506001600160a01b031663a9059cbb6115c36119fd565b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561161357600080fd5b505af1158015611627573d6000803e3d6000fd5b505050506040513d602081101561163d57600080fd5b50506040805182815242602082015281517f5cdbdaf1e54842ac25d0fdabf59c3fcbc7b62bcda372e3a8724a61443930a572929181900390910190a150565b600c54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156116c757600080fd5b505afa1580156116db573d6000803e3d6000fd5b505050506040513d60208110156116f157600080fd5b50516013549091508111156117065760138190555b811561184c57600c546001600160a01b03166323b872dd6117256119fd565b604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152306024830152604482018690525160648083019260209291908290030181600087803b15801561177957600080fd5b505af115801561178d573d6000803e3d6000fd5b505050506040513d60208110156117a357600080fd5b5050600c54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156117f057600080fd5b505afa158015611804573d6000803e3d6000fd5b505050506040513d602081101561181a57600080fd5b505190506000611830828463ffffffff611add16565b601354909150611846908263ffffffff611b2816565b60135550505b5050565b60005460ff166118a7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff19169055346118bc8282611b82565b60006118c782611dc6565b6003549091506118dd908363ffffffff611b2816565b6003556118ea8382611ddd565b826001600160a01b03166118fc6119fd565b6001600160a01b03167f6faf93231a456e552dbc9961f58d9713ee4f2e69d15f1975b050ef0911053a7b8484604051808381526020018281526020019250505060405180910390a361194e8383611e31565b611956611e82565b611960838361184c565b50506000805460ff1916600117905550565b600e5481565b6009546001600160a01b031681565b61198f611249565b6119ce576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b6119d781611ebb565b50565b600a546001600160a01b031681565b60005461010090046001600160a01b031690565b3390565b611a09610763565b15611a5b576040805162461bcd60e51b815260206004820152601e60248201527f54696d656443726f776473616c653a20616c726561647920636c6f7365640000604482015290519081900360640190fd5b6005548111611a9b5760405162461bcd60e51b815260040180806020018281038252603f815260200180612325603f913960400191505060405180910390fd5b600554604080519182526020820183905280517f46711e222f558a07afd26e5e71b48ecb0a8b2cdcd40faeb1323e05e2c76a2f329281900390910190a1600555565b6000611b1f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f5c565b90505b92915050565b600082820183811015611b1f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60125460ff16611bd0576040805162461bcd60e51b8152602060048201526014602482015273125113ce88139bdd081cd85b19481c195c9a5bd960621b604482015290519081900360640190fd5b6003600f5460ff166003811115611be357fe5b14611c35576040805162461bcd60e51b815260206004820152601960248201527f49444f3a204e6f74206f70656e2073616c6520706572696f6400000000000000604482015290519081900360640190fd5b611c3d6119fd565b6001600160a01b0316826001600160a01b031614611c8c5760405162461bcd60e51b815260040180806020018281038252602f815260200180612391602f913960400191505060405180910390fd5b6001600160a01b038216600090815260116020526040902054611ce05760405162461bcd60e51b81526004018080602001828103825260278152602001806124396027913960400191505060405180910390fd5b6001600160a01b03821660009081526010602052604081205490611d0a828463ffffffff611b2816565b9050600d54811015611d4d5760405162461bcd60e51b815260040180806020018281038252602d815260200180612364602d913960400191505060405180910390fd5b6001600160a01b038416600090815260116020526040902054600e54611d789163ffffffff611ff316565b811115611db65760405162461bcd60e51b815260040180806020018281038252602a8152602001806122fb602a913960400191505060405180910390fd5b611dc0848461204c565b50505050565b6000611b2260145483611ff390919063ffffffff16565b6001600160a01b038216600090815260066020526040902054611e06908263ffffffff611b2816565b6001600160a01b0380841660009081526006602052604090209190915560075461184c9116826120af565b6001600160a01b03821660009081526010602052604081205490611e5b828463ffffffff611b2816565b6001600160a01b03851660009081526010602052604090208190559050611dc0848461184c565b6001546040516001600160a01b03909116903480156108fc02916000818181858888f193505050501580156119d7573d6000803e3d6000fd5b6001600160a01b038116611f005760405162461bcd60e51b81526004018080602001828103825260268152602001806122d56026913960400191505060405180910390fd5b6008546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b60008184841115611feb5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611fb0578181015183820152602001611f98565b50505050905090810190601f168015611fdd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008261200257506000611b22565b8282028284828161200f57fe5b0414611b1f5760405162461bcd60e51b81526004018080602001828103825260218152602001806123f86021913960400191505060405180910390fd5b612054610930565b6120a5576040805162461bcd60e51b815260206004820152601860248201527f54696d656443726f776473616c653a206e6f74206f70656e0000000000000000604482015290519081900360640190fd5b61184c82826121e5565b806013541015612106576040805162461bcd60e51b815260206004820152601860248201527f4e6f7420656e6f75676820746f6b656e2062616c616e63650000000000000000604482015290519081900360640190fd5b601354612119908263ffffffff611add16565b601355600c546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561217257600080fd5b505af1158015612186573d6000803e3d6000fd5b505050506040513d602081101561219c57600080fd5b5050604080514281526020810183905281516001600160a01b038516927f4cdc26e95a94d21526ac02ef8745a075224014e28d8758d1b9a73cba305c05bf928290030190a25050565b6001600160a01b03821661222a5760405162461bcd60e51b815260040180806020018281038252602a815260200180612460602a913960400191505060405180910390fd5b8061184c576040805162461bcd60e51b815260206004820152601960248201527f43726f776473616c653a20776569416d6f756e74206973203000000000000000604482015290519081900360640190fd5b82600381019282156122aa579160200282015b828111156122aa57825182559160200191906001019061228f565b506122b69291506122ba565b5090565b61076991905b808211156122b657600081556001016122c056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737349444f3a204d757374206e6f742065786365656420696e646976696475616c20616c6c6f636174696f6e54696d656443726f776473616c653a206e657720636c6f73696e672074696d65206973206265666f72652063757272656e7420636c6f73696e672074696d6549444f3a204d757374206d656574206d696e696d756d20696e766573746d656e7420726571756972656d656e7449444f3a2055736572206d6179206f6e6c7920707572636861736520746f6b656e7320666f72207468656d73656c66506f737444656c697665727943726f776473616c653a2062656e6566696369617279206973206e6f742064756520616e7920746f6b656e73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657249444f3a205573657220646964206e6f74207265676973746572207375636365737366756c6c7943726f776473616c653a2062656e656669636961727920697320746865207a65726f2061646472657373506f737444656c697665727943726f776473616c653a206e6f7420636c6f73656449444f3a204e6f207374616b656420746f6b656e7320746f207265676973746572a265627a7a72315820ee459eff2a7cfdb9890068aab7b2b7ceef72cbcb2bb3b4067867077e9342974464736f6c63430005100032608060405260006100176001600160e01b0361007216565b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252519192507f4101e71e974f68df5e9730cc223280b41654676bbb052cdcc735c3337e64d2d9919081900360200190a150610076565b3390565b610342806100856000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80632348238c14610046578063beabacc81461006e578063c6dbdf61146100a4575b600080fd5b61006c6004803603602081101561005c57600080fd5b50356001600160a01b03166100c8565b005b61006c6004803603606081101561008457600080fd5b506001600160a01b038135811691602081013590911690604001356101ba565b6100ac6102a4565b604080516001600160a01b039092168252519081900360200190f35b6000546001600160a01b03166100dc6102b3565b6001600160a01b0316146101215760405162461bcd60e51b815260040180806020018281038252602c8152602001806102e2602c913960400191505060405180910390fd5b6001600160a01b0381166101665760405162461bcd60e51b815260040180806020018281038252602a8152602001806102b8602a913960400191505060405180910390fd5b600080546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f4101e71e974f68df5e9730cc223280b41654676bbb052cdcc735c3337e64d2d99181900360200190a150565b6000546001600160a01b03166101ce6102b3565b6001600160a01b0316146102135760405162461bcd60e51b815260040180806020018281038252602c8152602001806102e2602c913960400191505060405180910390fd5b826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561027357600080fd5b505af1158015610287573d6000803e3d6000fd5b505050506040513d602081101561029d57600080fd5b5050505050565b6000546001600160a01b031690565b339056fe5365636f6e646172793a206e6577207072696d61727920697320746865207a65726f20616464726573735365636f6e646172793a2063616c6c6572206973206e6f7420746865207072696d617279206163636f756e74a265627a7a723158200a5b671b49642d074c26970d9896fbc4091ecee5a549e86cf34f7781a5bddc8f64736f6c6343000510003254696d656443726f776473616c653a206f70656e696e672074696d65206973206265666f72652063757272656e742074696d6554696d656443726f776473616c653a206f70656e696e672074696d65206973206e6f74206265666f726520636c6f73696e672074696d6543726f776473616c653a20746f6b656e20697320746865207a65726f206164647265737343726f776473616c653a2077616c6c657420697320746865207a65726f2061646472657373000000000000000000000000000000000000000000000000000000000002a6e000000000000000000000000060159352c622c03bf8375b006ea84d1b8ecfc99a0000000000000000000000001845966510f14e2f66b8b9568d36cc6dba4d684500000000000000000000000000000000000000000000000000000000647b615700000000000000000000000000000000000000000000000000000000647b8b4b0000000000000000000000004a0546d0f72a9fe1d76beb400c6046efe2d40dc300000000000000000000000038a94e92a19e970c144ded0b2dd47278ca11cc1f000000000000000000000000dd0ef0b2de3efec847a79b4ce4de52c4bb98f488
Deployed Bytecode
0x6080604052600436106102305760003560e01c80638da5cb5b1161012e578063b7a8807c116100ab578063ed5db8741161006f578063ed5db874146106dc578063ee99205c146106f1578063f2fde38b14610706578063f5a74a5414610739578063fc0c546a1461074e57610230565b8063b7a8807c1461062f578063bb8b2b4714610644578063db2e21bc14610677578063dd49756e1461068c578063ec8ac4d8146106b657610230565b8063a880aee3116100f2578063a880aee31461057e578063a9d637e114610593578063ad7a65ba146105c6578063ae3b748d146105f0578063b25d7f541461061a57610230565b80638da5cb5b146104e95780638f32d59b146104fe57806399259655146105135780639e1a4d191461053f578063a27aebbc1461055457610230565b80634e3befd3116101bc57806370a082311161018057806370a082311461044d578063715018a614610480578063729205e714610495578063763265de146104aa5780638925dbcc146104d457610230565b80634e3befd31461036e578063521eb273146103a75780636312ad5f146103d8578063650cf7da1461040b578063658030b31461043857610230565b80634042b66f116102035780634042b66f146102e757806347535d7b146102fc57806349df728c146103115780634b6753bc146103445780634c7f6c0a1461035957610230565b80631515bc2b146102355780632c4e722e1461025e57806334fcf4371461028557806339a79bdf146102b1575b600080fd5b34801561024157600080fd5b5061024a610763565b604080519115158252519081900360200190f35b34801561026a57600080fd5b5061027361076c565b60408051918252519081900360200190f35b34801561029157600080fd5b506102af600480360360208110156102a857600080fd5b5035610772565b005b3480156102bd57600080fd5b506102af600480360360608110156102d457600080fd5b50803590602081013590604001356107fb565b3480156102f357600080fd5b5061027361092a565b34801561030857600080fd5b5061024a610930565b34801561031d57600080fd5b506102af6004803603602081101561033457600080fd5b50356001600160a01b031661094b565b34801561035057600080fd5b50610273610a7f565b34801561036557600080fd5b50610273610a85565b34801561037a57600080fd5b50610383610a8b565b6040518082600381111561039357fe5b60ff16815260200191505060405180910390f35b3480156103b357600080fd5b506103bc610a94565b604080516001600160a01b039092168252519081900360200190f35b3480156103e457600080fd5b506102af600480360360208110156103fb57600080fd5b50356001600160a01b0316610aa3565b34801561041757600080fd5b506102af6004803603602081101561042e57600080fd5b503560ff16610f16565b34801561044457600080fd5b506103bc610fcb565b34801561045957600080fd5b506102736004803603602081101561047057600080fd5b50356001600160a01b0316610fda565b34801561048c57600080fd5b506102af610ff5565b3480156104a157600080fd5b5061024a611086565b3480156104b657600080fd5b506102af600480360360208110156104cd57600080fd5b503561108f565b3480156104e057600080fd5b506102af611118565b3480156104f557600080fd5b506103bc61123a565b34801561050a57600080fd5b5061024a611249565b34801561051f57600080fd5b506102af6004803603602081101561053657600080fd5b5035151561126f565b34801561054b57600080fd5b50610273611303565b34801561056057600080fd5b506102af6004803603602081101561057757600080fd5b5035611309565b34801561058a57600080fd5b506103bc6113fb565b34801561059f57600080fd5b50610273600480360360208110156105b657600080fd5b50356001600160a01b031661140a565b3480156105d257600080fd5b50610273600480360360208110156105e957600080fd5b5035611425565b3480156105fc57600080fd5b506102af6004803603602081101561061357600080fd5b5035611439565b34801561062657600080fd5b506102736114c2565b34801561063b57600080fd5b506102736114c8565b34801561065057600080fd5b506102736004803603602081101561066757600080fd5b50356001600160a01b03166114ce565b34801561068357600080fd5b506102af6114e9565b34801561069857600080fd5b506102af600480360360208110156106af57600080fd5b503561167c565b6102af600480360360208110156106cc57600080fd5b50356001600160a01b0316611850565b3480156106e857600080fd5b50610273611972565b3480156106fd57600080fd5b506103bc611978565b34801561071257600080fd5b506102af6004803603602081101561072957600080fd5b50356001600160a01b0316611987565b34801561074557600080fd5b506103bc6119da565b34801561075a57600080fd5b506103bc6119e9565b60055442115b90565b60145490565b61077a611249565b6107b9576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b60148190556040805182815242602082015281517fa883b0c4457680bf0320e5e6d26d6d6363663810982303a1c20beaa3ac213f33929181900390910190a150565b610803611249565b610842576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b604080516060810182528481526020810184905290810182905261086a90601590600361227c565b50600954604080516339a79bdf60e01b815260048101869052602481018590526044810184905290516001600160a01b03909216916339a79bdf9160648082019260009290919082900301818387803b1580156108c657600080fd5b505af11580156108da573d6000803e3d6000fd5b5050604080518681526020810186905280820185905242606082015290517fa70ea5e74a302095780dd300d142a6e10da3e4aea51a0de4bdee20235592acff9350908190036080019150a1505050565b60035490565b6000600454421015801561094657506005544211155b905090565b610953610763565b61098e5760405162461bcd60e51b815260040180806020018281038252602181526020018061248a6021913960400191505060405180910390fd5b6001600160a01b038116600090815260066020526040902054806109e35760405162461bcd60e51b81526004018080602001828103825260388152602001806123c06038913960400191505060405180910390fd5b6001600160a01b038083166000908152600660205260408120556007541663beabacc8610a0e6119e9565b604080516001600160e01b031960e085901b1681526001600160a01b03928316600482015291861660248301526044820185905251606480830192600092919082900301818387803b158015610a6357600080fd5b505af1158015610a77573d6000803e3d6000fd5b505050505050565b60055490565b60145481565b600f5460ff1690565b6001546001600160a01b031690565b6009546000906001600160a01b0316638229084b83610ac06119fd565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b158015610b1f57600080fd5b505afa158015610b33573d6000803e3d6000fd5b505050506040513d6020811015610b4957600080fd5b5051905080610b895760405162461bcd60e51b81526004018080602001828103825260218152602001806124ab6021913960400191505060405180910390fd5b600b546001600160a01b0383811691161415610cba576002600f5460ff166003811115610bb257fe5b14610c04576040805162461bcd60e51b815260206004820152601a60248201527f49444f3a204e6f742044414f3920526567697374726174696f6e000000000000604482015290519081900360640190fd5b6017548110610c3a57600a60116000610c1b6119fd565b6001600160a01b03168152602081019190915260400160002055610cb5565b6016548110610c5157600560116000610c1b6119fd565b6015548110610c6857600160116000610c1b6119fd565b6040805162461bcd60e51b815260206004820152601c60248201527f49444f3a20496e73756666696369656e742044414f39207374616b6500000000604482015290519081900360640190fd5b610e2c565b600a546001600160a01b0383811691161415610e2c576001600f5460ff166003811115610ce357fe5b14610d35576040805162461bcd60e51b815260206004820152601860248201527f49444f3a204e6f7420463920526567697374726174696f6e0000000000000000604482015290519081900360640190fd5b660ef2374cd37a008110610d71576101a460116000610d526119fd565b6001600160a01b03168152602081019190915260400160002055610e2c565b66038d7e692bb6008110610d8d57606460116000610d526119fd565b6601c6bf16c876008110610da957603260116000610d526119fd565b655af2d4df76008110610dc457600a60116000610d526119fd565b65091812d7d6008110610ddf57600160116000610d526119fd565b6040805162461bcd60e51b815260206004820152601a60248201527f49444f3a20496e73756666696369656e74204639207374616b65000000000000604482015290519081900360640190fd5b610e346119fd565b6001600160a01b03167f39dd062cc095bf933d83338d8e4591b7eb119264d876f173cacb1cfdf2c9737f4260116000610e6b6119fd565b6001600160a01b03166001600160a01b0316815260200190815260200160002054604051808381526020018281526020019250505060405180910390a26009546001600160a01b031663282d3fdf610ec16119fd565b42620bdd80016040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610a6357600080fd5b610f1e611249565b610f5d576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b600f805482919060ff19166001836003811115610f7657fe5b02179055507f13c3cd13bbe69c5fefab00e59ada8afb2e0e4575816435e6d39ad4ba35632650814260405180836003811115610fae57fe5b60ff1681526020018281526020019250505060405180910390a150565b600c546001600160a01b031681565b6001600160a01b031660009081526006602052604090205490565b610ffd611249565b61103c576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b6008546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600880546001600160a01b0319169055565b60125460ff1681565b611097611249565b6110d6576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b600e8190556040805182815242602082015281517f9b0a2e59093a2d98dfa44d5be4516ec9b1d5cb3906ddc86849e98c8c21635181929181900390910190a150565b611120611249565b61115f576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b601380546000909155600c546001600160a01b031663a9059cbb6111816119fd565b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156111d157600080fd5b505af11580156111e5573d6000803e3d6000fd5b505050506040513d60208110156111fb57600080fd5b50506040805182815242602082015281517f075f78784acf1bbe85ef0240b7a2e78304830128bae7b139589628c1ad395934929181900390910190a150565b6008546001600160a01b031690565b6008546000906001600160a01b03166112606119fd565b6001600160a01b031614905090565b611277611249565b6112b6576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b6012805460ff19168215159081179091556040805191825242602083015280517fe65bfa7a822958bacb7488049252843165d2e6cd95c99c346f930e257b3f5f609281900390910190a150565b60135481565b611311611249565b611350576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b61135981611a01565b600c546040805163c44bef7560e01b81526004810184905290516001600160a01b039092169163c44bef759160248082019260009290919082900301818387803b1580156113a657600080fd5b505af11580156113ba573d6000803e3d6000fd5b50506040805184815242602082015281517f7720e74c00acc5fc08c61dfe995c1ff5d722b9af5ad7b9f8eaa44ec9fa5418fa9450908190039091019150a150565b600b546001600160a01b031681565b6001600160a01b031660009081526011602052604090205490565b6015816003811061143257fe5b0154905081565b611441611249565b611480576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b600d8190556040805182815242602082015281517fea096761d0d83c4dcd3d10975ec857131458be4986ce05ef4fab880e53bccb14929181900390910190a150565b600d5481565b60045490565b6001600160a01b031660009081526010602052604090205490565b6114f1611249565b611530576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b600c54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561157b57600080fd5b505afa15801561158f573d6000803e3d6000fd5b505050506040513d60208110156115a557600080fd5b5051600c549091506001600160a01b031663a9059cbb6115c36119fd565b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561161357600080fd5b505af1158015611627573d6000803e3d6000fd5b505050506040513d602081101561163d57600080fd5b50506040805182815242602082015281517f5cdbdaf1e54842ac25d0fdabf59c3fcbc7b62bcda372e3a8724a61443930a572929181900390910190a150565b600c54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156116c757600080fd5b505afa1580156116db573d6000803e3d6000fd5b505050506040513d60208110156116f157600080fd5b50516013549091508111156117065760138190555b811561184c57600c546001600160a01b03166323b872dd6117256119fd565b604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152306024830152604482018690525160648083019260209291908290030181600087803b15801561177957600080fd5b505af115801561178d573d6000803e3d6000fd5b505050506040513d60208110156117a357600080fd5b5050600c54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156117f057600080fd5b505afa158015611804573d6000803e3d6000fd5b505050506040513d602081101561181a57600080fd5b505190506000611830828463ffffffff611add16565b601354909150611846908263ffffffff611b2816565b60135550505b5050565b60005460ff166118a7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff19169055346118bc8282611b82565b60006118c782611dc6565b6003549091506118dd908363ffffffff611b2816565b6003556118ea8382611ddd565b826001600160a01b03166118fc6119fd565b6001600160a01b03167f6faf93231a456e552dbc9961f58d9713ee4f2e69d15f1975b050ef0911053a7b8484604051808381526020018281526020019250505060405180910390a361194e8383611e31565b611956611e82565b611960838361184c565b50506000805460ff1916600117905550565b600e5481565b6009546001600160a01b031681565b61198f611249565b6119ce576040805162461bcd60e51b81526020600482018190526024820152600080516020612419833981519152604482015290519081900360640190fd5b6119d781611ebb565b50565b600a546001600160a01b031681565b60005461010090046001600160a01b031690565b3390565b611a09610763565b15611a5b576040805162461bcd60e51b815260206004820152601e60248201527f54696d656443726f776473616c653a20616c726561647920636c6f7365640000604482015290519081900360640190fd5b6005548111611a9b5760405162461bcd60e51b815260040180806020018281038252603f815260200180612325603f913960400191505060405180910390fd5b600554604080519182526020820183905280517f46711e222f558a07afd26e5e71b48ecb0a8b2cdcd40faeb1323e05e2c76a2f329281900390910190a1600555565b6000611b1f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f5c565b90505b92915050565b600082820183811015611b1f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60125460ff16611bd0576040805162461bcd60e51b8152602060048201526014602482015273125113ce88139bdd081cd85b19481c195c9a5bd960621b604482015290519081900360640190fd5b6003600f5460ff166003811115611be357fe5b14611c35576040805162461bcd60e51b815260206004820152601960248201527f49444f3a204e6f74206f70656e2073616c6520706572696f6400000000000000604482015290519081900360640190fd5b611c3d6119fd565b6001600160a01b0316826001600160a01b031614611c8c5760405162461bcd60e51b815260040180806020018281038252602f815260200180612391602f913960400191505060405180910390fd5b6001600160a01b038216600090815260116020526040902054611ce05760405162461bcd60e51b81526004018080602001828103825260278152602001806124396027913960400191505060405180910390fd5b6001600160a01b03821660009081526010602052604081205490611d0a828463ffffffff611b2816565b9050600d54811015611d4d5760405162461bcd60e51b815260040180806020018281038252602d815260200180612364602d913960400191505060405180910390fd5b6001600160a01b038416600090815260116020526040902054600e54611d789163ffffffff611ff316565b811115611db65760405162461bcd60e51b815260040180806020018281038252602a8152602001806122fb602a913960400191505060405180910390fd5b611dc0848461204c565b50505050565b6000611b2260145483611ff390919063ffffffff16565b6001600160a01b038216600090815260066020526040902054611e06908263ffffffff611b2816565b6001600160a01b0380841660009081526006602052604090209190915560075461184c9116826120af565b6001600160a01b03821660009081526010602052604081205490611e5b828463ffffffff611b2816565b6001600160a01b03851660009081526010602052604090208190559050611dc0848461184c565b6001546040516001600160a01b03909116903480156108fc02916000818181858888f193505050501580156119d7573d6000803e3d6000fd5b6001600160a01b038116611f005760405162461bcd60e51b81526004018080602001828103825260268152602001806122d56026913960400191505060405180910390fd5b6008546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b60008184841115611feb5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611fb0578181015183820152602001611f98565b50505050905090810190601f168015611fdd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008261200257506000611b22565b8282028284828161200f57fe5b0414611b1f5760405162461bcd60e51b81526004018080602001828103825260218152602001806123f86021913960400191505060405180910390fd5b612054610930565b6120a5576040805162461bcd60e51b815260206004820152601860248201527f54696d656443726f776473616c653a206e6f74206f70656e0000000000000000604482015290519081900360640190fd5b61184c82826121e5565b806013541015612106576040805162461bcd60e51b815260206004820152601860248201527f4e6f7420656e6f75676820746f6b656e2062616c616e63650000000000000000604482015290519081900360640190fd5b601354612119908263ffffffff611add16565b601355600c546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561217257600080fd5b505af1158015612186573d6000803e3d6000fd5b505050506040513d602081101561219c57600080fd5b5050604080514281526020810183905281516001600160a01b038516927f4cdc26e95a94d21526ac02ef8745a075224014e28d8758d1b9a73cba305c05bf928290030190a25050565b6001600160a01b03821661222a5760405162461bcd60e51b815260040180806020018281038252602a815260200180612460602a913960400191505060405180910390fd5b8061184c576040805162461bcd60e51b815260206004820152601960248201527f43726f776473616c653a20776569416d6f756e74206973203000000000000000604482015290519081900360640190fd5b82600381019282156122aa579160200282015b828111156122aa57825182559160200191906001019061228f565b506122b69291506122ba565b5090565b61076991905b808211156122b657600081556001016122c056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737349444f3a204d757374206e6f742065786365656420696e646976696475616c20616c6c6f636174696f6e54696d656443726f776473616c653a206e657720636c6f73696e672074696d65206973206265666f72652063757272656e7420636c6f73696e672074696d6549444f3a204d757374206d656574206d696e696d756d20696e766573746d656e7420726571756972656d656e7449444f3a2055736572206d6179206f6e6c7920707572636861736520746f6b656e7320666f72207468656d73656c66506f737444656c697665727943726f776473616c653a2062656e6566696369617279206973206e6f742064756520616e7920746f6b656e73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657249444f3a205573657220646964206e6f74207265676973746572207375636365737366756c6c7943726f776473616c653a2062656e656669636961727920697320746865207a65726f2061646472657373506f737444656c697665727943726f776473616c653a206e6f7420636c6f73656449444f3a204e6f207374616b656420746f6b656e7320746f207265676973746572a265627a7a72315820ee459eff2a7cfdb9890068aab7b2b7ceef72cbcb2bb3b4067867077e9342974464736f6c63430005100032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000002a6e000000000000000000000000060159352c622c03bf8375b006ea84d1b8ecfc99a0000000000000000000000001845966510f14e2f66b8b9568d36cc6dba4d684500000000000000000000000000000000000000000000000000000000647b615700000000000000000000000000000000000000000000000000000000647b8b4b0000000000000000000000004a0546d0f72a9fe1d76beb400c6046efe2d40dc300000000000000000000000038a94e92a19e970c144ded0b2dd47278ca11cc1f000000000000000000000000dd0ef0b2de3efec847a79b4ce4de52c4bb98f488
-----Decoded View---------------
Arg [0] : _rate (uint256): 173792
Arg [1] : _wal (address): 0x60159352c622C03bf8375B006EA84D1b8eCFc99A
Arg [2] : _token (address): 0x1845966510F14e2f66B8B9568d36cC6dbA4d6845
Arg [3] : _openingTime (uint256): 1685807447
Arg [4] : _closingTime (uint256): 1685818187
Arg [5] : _stakingContract (address): 0x4A0546D0F72a9fe1D76bEb400c6046EfE2d40dc3
Arg [6] : _f9Token (address): 0x38A94e92A19E970c144DEd0B2DD47278CA11CC1F
Arg [7] : _dao9Token (address): 0xDd0ef0B2dE3EFec847a79b4CE4de52c4bb98f488
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000002a6e0
Arg [1] : 00000000000000000000000060159352c622c03bf8375b006ea84d1b8ecfc99a
Arg [2] : 0000000000000000000000001845966510f14e2f66b8b9568d36cc6dba4d6845
Arg [3] : 00000000000000000000000000000000000000000000000000000000647b6157
Arg [4] : 00000000000000000000000000000000000000000000000000000000647b8b4b
Arg [5] : 0000000000000000000000004a0546d0f72a9fe1d76beb400c6046efe2d40dc3
Arg [6] : 00000000000000000000000038a94e92a19e970c144ded0b2dd47278ca11cc1f
Arg [7] : 000000000000000000000000dd0ef0b2de3efec847a79b4ce4de52c4bb98f488
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.