{"id":1,"sourceCode":"pragma solidity 0.4.21;\n\n \n \n \ncontract Ownable {\n    address public owner;\n    address public newOwner;\n\n    event OwnershipTransferred(address indexed _from, address indexed _to);\n\n    function Ownable() public {\n        owner = msg.sender;\n    }\n\n    modifier onlyOwner {\n        require(msg.sender == owner);\n        _;\n    }\n\n    function transferOwnership(address _newOwner) public onlyOwner {\n        newOwner = _newOwner;\n    }\n    function acceptOwnership() public {\n        require(msg.sender == newOwner);\n        emit OwnershipTransferred(owner, newOwner);\n        owner = newOwner;\n        newOwner = address(0);\n    }\n}\n\n\ncontract Pausable is Ownable {\n\tevent Pause();\n\tevent Unpause();\n\n\tbool public paused = false;\n\n\n\t \n\tmodifier whenNotPaused() {\n\t\trequire(!paused);\n\t\t_;\n\t}\n\n\t \n\tmodifier whenPaused {\n\t\trequire(paused);\n\t\t_;\n\t}\n\n\t \n\tfunction pause() onlyOwner whenNotPaused public returns (bool) {\n\t\tpaused = true;\n\t\temit Pause();\n\t\treturn true;\n\t}\n\n\t \n\tfunction unpause() onlyOwner whenPaused public returns (bool) {\n\t\tpaused = false;\n\t\temit Unpause();\n\t\treturn true;\n\t}\n}\n\n \nlibrary SafeMath {\n\n   \n  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\n    if (a == 0) {\n      return 0;\n    }\n    c = a * b;\n    assert(c / a == b);\n    return c;\n  }\n\n   \n  function div(uint256 a, uint256 b) internal pure returns (uint256) {\n     \n     \n     \n    return a / b;\n  }\n\n   \n  function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n    assert(b <= a);\n    return a - b;\n  }\n\n   \n  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\n    c = a + b;\n    assert(c >= a);\n    return c;\n  }\n}\n\nlibrary ContractLib {\n\t \n\tfunction isContract(address _addr) internal view returns (bool) {\n\t\tuint length;\n\t\tassembly {\n\t\t\t \n\t\t\tlength := extcodesize(_addr)\n\t\t}\n\t\treturn (length>0);\n\t}\n}\n\n \n \ncontract ContractReceiver {\n\tfunction tokenFallback(address _from, uint _value, bytes _data) public pure;\n}\n\n \n \n \n \ncontract ERC20Interface {\n\tfunction totalSupply() public constant returns (uint);\n\tfunction balanceOf(address tokenOwner) public constant returns (uint);\n\tfunction allowance(address tokenOwner, address spender) public constant returns (uint);\n\tfunction transfer(address to, uint tokens) public returns (bool);\n\tfunction approve(address spender, uint tokens) public returns (bool);\n\tfunction transferFrom(address from, address to, uint tokens) public returns (bool);\n\n\tfunction name() public constant returns (string);\n\tfunction symbol() public constant returns (string);\n\tfunction decimals() public constant returns (uint8);\n\n\tevent Transfer(address indexed from, address indexed to, uint tokens);\n\tevent Approval(address indexed tokenOwner, address indexed spender, uint tokens);\n}\n\n\n  \n \n\n  \n \ncontract ERC223 is ERC20Interface {\n\tfunction transfer(address to, uint value, bytes data) public returns (bool);\n\t\n\tevent Transfer(address indexed from, address indexed to, uint tokens);\n\tevent Transfer(address indexed from, address indexed to, uint value, bytes data);\n}\n\n \ncontract NXX is ERC223, Pausable {\n\n\tusing SafeMath for uint256;\n\tusing ContractLib for address;\n\n\tmapping(address => uint) balances;\n\tmapping(address => mapping(address => uint)) allowed;\n\t\n\tstring public name;\n\tstring public symbol;\n\tuint8 public decimals;\n\tuint256 public totalSupply;\n\n\tevent Burn(address indexed from, uint256 value);\n\t\n\t \n\t \n\t \n\tfunction NXX() public {\n\t\tsymbol = \"NASHXX\";\n\t\tname = \"XXXX CASH\";\n\t\tdecimals = 18;\n\t\ttotalSupply = 100000000000 * 10**uint(decimals);\n\t\tbalances[msg.sender] = totalSupply;\n\t\temit Transfer(address(0), msg.sender, totalSupply);\n\t}\n\t\n\t\n\t \n\tfunction name() public constant returns (string) {\n\t\treturn name;\n\t}\n\t \n\tfunction symbol() public constant returns (string) {\n\t\treturn symbol;\n\t}\n\t \n\tfunction decimals() public constant returns (uint8) {\n\t\treturn decimals;\n\t}\n\t \n\tfunction totalSupply() public constant returns (uint256) {\n\t\treturn totalSupply;\n\t}\n\t\n\t \n\tfunction transfer(address _to, uint _value, bytes _data) public whenNotPaused returns (bool) {\n\t\trequire(_to != 0x0);\n\t\tif(_to.isContract()) {\n\t\t\treturn transferToContract(_to, _value, _data);\n\t\t}\n\t\telse {\n\t\t\treturn transferToAddress(_to, _value, _data);\n\t\t}\n\t}\n\t\n\t \n\t \n\tfunction transfer(address _to, uint _value) public whenNotPaused returns (bool) {\n\t\t \n\t\t \n\t\trequire(_to != 0x0);\n\n\t\tbytes memory empty;\n\t\tif(_to.isContract()) {\n\t\t\treturn transferToContract(_to, _value, empty);\n\t\t}\n\t\telse {\n\t\t\treturn transferToAddress(_to, _value, empty);\n\t\t}\n\t}\n\n\n\n\t \n\tfunction transferToAddress(address _to, uint _value, bytes _data) private returns (bool) {\n\t\tbalances[msg.sender] = balanceOf(msg.sender).sub(_value);\n\t\tbalances[_to] = balanceOf(_to).add(_value);\n\t\temit Transfer(msg.sender, _to, _value);\n\t\temit Transfer(msg.sender, _to, _value, _data);\n\t\treturn true;\n\t}\n\t\n   \n  function transferToContract(address _to, uint _value, bytes _data) private returns (bool success) {\n\t    balances[msg.sender] = balanceOf(msg.sender).sub(_value);\n\t    balances[_to] = balanceOf(_to).add(_value);\n\t    ContractReceiver receiver = ContractReceiver(_to);\n\t    receiver.tokenFallback(msg.sender, _value, _data);\n\t    emit Transfer(msg.sender, _to, _value);\n\t    emit Transfer(msg.sender, _to, _value, _data);\n\t    return true;\n\t}\n\t\n\tfunction balanceOf(address _owner) public constant returns (uint) {\n\t\treturn balances[_owner];\n\t}  \n\n\tfunction burn(uint256 _value) public whenNotPaused returns (bool) {\n\t\trequire (_value > 0); \n\t\trequire (balanceOf(msg.sender) >= _value);             \n\t\tbalances[msg.sender] = balanceOf(msg.sender).sub(_value);                       \n\t\ttotalSupply = totalSupply.sub(_value);                                 \n\t\temit Burn(msg.sender, _value);\n\t\treturn true;\n\t}\n\n\t \n\t \n\t \n\t \n\t \n\t \n\t \n\t \n\tfunction approve(address spender, uint tokens) public whenNotPaused returns (bool) {\n\t\tallowed[msg.sender][spender] = tokens;\n\t\temit Approval(msg.sender, spender, tokens);\n\t\treturn true;\n\t}\n\n\tfunction increaseApproval (address _spender, uint _addedValue) public whenNotPaused\n\t    returns (bool success) {\n\t    allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);\n\t    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);\n\t    return true;\n\t}\n\n\tfunction decreaseApproval (address _spender, uint _subtractedValue) public whenNotPaused\n\t    returns (bool success) {\n\t    uint oldValue = allowed[msg.sender][_spender];\n\t    if (_subtractedValue > oldValue) {\n\t      allowed[msg.sender][_spender] = 0;\n\t    } else {\n\t      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);\n\t    }\n\t    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);\n\t    return true;\n\t}\t\n\n\t \n\t \n\t \n\t \n\t \n\t \n\t \n\t \n\t \n\tfunction transferFrom(address from, address to, uint tokens) public whenNotPaused returns (bool) {\n\t\tallowed[from][msg.sender] = allowed[from][msg.sender].sub(tokens);\n\t\tbalances[from] = balances[from].sub(tokens);\n\t\tbalances[to] = balances[to].add(tokens);\n\t\temit Transfer(from, to, tokens);\n\t\treturn true;\n\t}\n\n\t \n\t \n\t \n\t \n\tfunction allowance(address tokenOwner, address spender) public constant returns (uint) {\n\t\treturn allowed[tokenOwner][spender];\n\t}\n\n\t \n\t \n\t \n\tfunction () public payable {\n\t\trevert();\n\t}\n\n\t \n\t \n\t \n\tfunction transferAnyERC20Token(address tokenAddress, uint tokens) public onlyOwner returns (bool) {\n\t\treturn ERC20Interface(tokenAddress).transfer(owner, tokens);\n\t}\n\n\t \n\taddress[] supportedERC20Token;\n\tmapping (address => uint256) prices;\n\tmapping (address => uint256) starttime;\n\tmapping (address => uint256) endtime;\n\n\tuint256 maxTokenCountPerTrans = 10000;\n\tuint256 nashInPool;\n\n\tevent AddSupportedToken(\n\t\taddress _address, \n\t\tuint256 _price, \n\t\tuint256 _startTime, \n\t\tuint256 _endTime);\n\n\tevent RemoveSupportedToken(\n\t\taddress _address\n\t);\n\n\tfunction addSupportedToken(\n\t\taddress _address, \n\t\tuint256 _price, \n\t\tuint256 _startTime, \n\t\tuint256 _endTime\n\t) public onlyOwner returns (bool) {\n\t\t\n\t\trequire(_address != 0x0);\n\t\trequire(_address.isContract());\n\t\trequire(_startTime < _endTime);\n\t\trequire(_endTime > block.timestamp);\n\n\t\tsupportedERC20Token.push(_address);\n\t\tprices[_address] = _price;\n\t\tstarttime[_address] = _startTime;\n\t\tendtime[_address] = _endTime;\n\n\t\temit AddSupportedToken(_address, _price, _startTime, _endTime);\n\n\t\treturn true;\n\t}\n\n\tfunction removeSupportedToken(address _address) public onlyOwner returns (bool) {\n\t\trequire(_address != 0x0);\n\t\tuint256 length = supportedERC20Token.length;\n\t\tfor (uint256 i = 0; i < length; i++) {\n\t\t\tif (supportedERC20Token[i] == _address) {\n\t\t\t\tif (i != length - 1) {\n\t\t\t\t\tsupportedERC20Token[i] = supportedERC20Token[length - 1];\n\t\t\t\t}\n                delete supportedERC20Token[length-1];\n\t\t\t\tsupportedERC20Token.length--;\n\n\t\t\t\tprices[_address] = 0;\n\t\t\t\tstarttime[_address] = 0;\n\t\t\t\tendtime[_address] = 0;\n\n\t\t\t\temit RemoveSupportedToken(_address);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tmodifier canBuy(address _address) { \n\t\tbool found = false;\n\t\tuint256 length = supportedERC20Token.length;\n\t\tfor (uint256 i = 0; i < length; i++) {\n\t\t\tif (supportedERC20Token[i] == _address) {\n\t\t\t\trequire(block.timestamp > starttime[_address]);\n\t\t\t\trequire(block.timestamp < endtime[_address]);\n\t\t\t\tfound = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\t\t\n\t\trequire (found); \n\t\t_; \n\t}\n\n\tfunction joinPreSale(address _tokenAddress, uint256 _tokenCount) public canBuy(_tokenAddress) returns (bool) {\n\t\trequire(_tokenCount <= maxTokenCountPerTrans); \n\t\tuint256 total = _tokenCount * prices[_tokenAddress];  \n\t\tbalances[msg.sender].sub(total);\n\t\tnashInPool.add(total);\n\n\t\temit Transfer(_tokenAddress, this, total);\n\n\t\treturn ERC20Interface(_tokenCount).transfer(msg.sender, _tokenCount);\n\t}\n\n\tfunction transferNashOut(address _to, uint256 count) public onlyOwner returns(bool) {\n\t\trequire(_to != 0x0);\n\t\tnashInPool.sub(count);\n\t\tbalances[_to].add(count);\n\n\t\temit Transfer(this, _to, count);\n\t}\n}","codeTree":{"Ownable":{"OwnershipTransferred":"event OwnershipTransferred(address indexed _from, address indexed _to);","constructor":"function Ownable() public {\n        owner = msg.sender;\n    }","onlyOwner":"modifier onlyOwner {\n        require(msg.sender == owner);\n        _;\n    }","transferOwnership":"function transferOwnership(address _newOwner) public onlyOwner {\n        newOwner = _newOwner;\n    }","acceptOwnership":"function acceptOwnership() public {\n        require(msg.sender == newOwner);\n        emit OwnershipTransferred(owner, newOwner);\n        owner = newOwner;\n        newOwner = address(0);\n    }"},"Pausable":{"Pause":"event Pause();","Unpause":"event Unpause();","whenNotPaused":"modifier whenNotPaused() {\n\t\trequire(!paused);\n\t\t_;\n\t}","whenPaused":"modifier whenPaused {\n\t\trequire(paused);\n\t\t_;\n\t}","pause":"function pause() onlyOwner whenNotPaused public returns (bool) {\n\t\tpaused = true;\n\t\temit Pause();\n\t\treturn true;\n\t}","unpause":"function unpause() onlyOwner whenPaused public returns (bool) {\n\t\tpaused = false;\n\t\temit Unpause();\n\t\treturn true;\n\t}"},"SafeMath":{"mul":"function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {\n    if (a == 0) {\n      return 0;\n    }\n    c = a * b;\n    assert(c / a == b);\n    return c;\n  }","div":"function div(uint256 a, uint256 b) internal pure returns (uint256) {\n     \n     \n     \n    return a / b;\n  }","sub":"function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n    assert(b <= a);\n    return a - b;\n  }","add":"function add(uint256 a, uint256 b) internal pure returns (uint256 c) {\n    c = a + b;\n    assert(c >= a);\n    return c;\n  }"},"ContractLib":{"isContract":"function isContract(address _addr) internal view returns (bool) {\n\t\tuint length;\n\t\tassembly {\n\t\t\t \n\t\t\tlength := extcodesize(_addr)\n\t\t}\n\t\treturn (length>0);\n\t}"},"ContractReceiver":{"tokenFallback":"function tokenFallback(address _from, uint _value, bytes _data) public pure;"},"ERC20Interface":{"totalSupply":"function totalSupply() public constant returns (uint);","balanceOf":"function balanceOf(address tokenOwner) public constant returns (uint);","allowance":"function allowance(address tokenOwner, address spender) public constant returns (uint);","transfer":"function transfer(address to, uint tokens) public returns (bool);","approve":"function approve(address spender, uint tokens) public returns (bool);","transferFrom":"function transferFrom(address from, address to, uint tokens) public returns (bool);","name":"function name() public constant returns (string);","symbol":"function symbol() public constant returns (string);","decimals":"function decimals() public constant returns (uint8);","Transfer":"event Transfer(address indexed from, address indexed to, uint tokens);","Approval":"event Approval(address indexed tokenOwner, address indexed spender, uint tokens);"},"ERC223":{"transfer":"function transfer(address to, uint value, bytes data) public returns (bool);","Transfer":"event Transfer(address indexed from, address indexed to, uint value, bytes data);"},"NXX":{"Burn":"event Burn(address indexed from, uint256 value);","constructor":"function NXX() public {\n\t\tsymbol = \"NASHXX\";\n\t\tname = \"XXXX CASH\";\n\t\tdecimals = 18;\n\t\ttotalSupply = 100000000000 * 10**uint(decimals);\n\t\tbalances[msg.sender] = totalSupply;\n\t\temit Transfer(address(0), msg.sender, totalSupply);\n\t}","name":"function name() public constant returns (string) {\n\t\treturn name;\n\t}","symbol":"function symbol() public constant returns (string) {\n\t\treturn symbol;\n\t}","decimals":"function decimals() public constant returns (uint8) {\n\t\treturn decimals;\n\t}","totalSupply":"function totalSupply() public constant returns (uint256) {\n\t\treturn totalSupply;\n\t}","transfer":"function transfer(address _to, uint _value) public whenNotPaused returns (bool) {\n\t\t \n\t\t \n\t\trequire(_to != 0x0);\n\n\t\tbytes memory empty;\n\t\tif(_to.isContract()) {\n\t\t\treturn transferToContract(_to, _value, empty);\n\t\t}\n\t\telse {\n\t\t\treturn transferToAddress(_to, _value, empty);\n\t\t}\n\t}","transferToAddress":"function transferToAddress(address _to, uint _value, bytes _data) private returns (bool) {\n\t\tbalances[msg.sender] = balanceOf(msg.sender).sub(_value);\n\t\tbalances[_to] = balanceOf(_to).add(_value);\n\t\temit Transfer(msg.sender, _to, _value);\n\t\temit Transfer(msg.sender, _to, _value, _data);\n\t\treturn true;\n\t}","transferToContract":"function transferToContract(address _to, uint _value, bytes _data) private returns (bool success) {\n\t    balances[msg.sender] = balanceOf(msg.sender).sub(_value);\n\t    balances[_to] = balanceOf(_to).add(_value);\n\t    ContractReceiver receiver = ContractReceiver(_to);\n\t    receiver.tokenFallback(msg.sender, _value, _data);\n\t    emit Transfer(msg.sender, _to, _value);\n\t    emit Transfer(msg.sender, _to, _value, _data);\n\t    return true;\n\t}","balanceOf":"function balanceOf(address _owner) public constant returns (uint) {\n\t\treturn balances[_owner];\n\t}","burn":"function burn(uint256 _value) public whenNotPaused returns (bool) {\n\t\trequire (_value > 0); \n\t\trequire (balanceOf(msg.sender) >= _value);             \n\t\tbalances[msg.sender] = balanceOf(msg.sender).sub(_value);                       \n\t\ttotalSupply = totalSupply.sub(_value);                                 \n\t\temit Burn(msg.sender, _value);\n\t\treturn true;\n\t}","approve":"function approve(address spender, uint tokens) public whenNotPaused returns (bool) {\n\t\tallowed[msg.sender][spender] = tokens;\n\t\temit Approval(msg.sender, spender, tokens);\n\t\treturn true;\n\t}","increaseApproval":"function increaseApproval (address _spender, uint _addedValue) public whenNotPaused\n\t    returns (bool success) {\n\t    allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);\n\t    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);\n\t    return true;\n\t}","decreaseApproval":"function decreaseApproval (address _spender, uint _subtractedValue) public whenNotPaused\n\t    returns (bool success) {\n\t    uint oldValue = allowed[msg.sender][_spender];\n\t    if (_subtractedValue > oldValue) {\n\t      allowed[msg.sender][_spender] = 0;\n\t    } else {\n\t      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);\n\t    }\n\t    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);\n\t    return true;\n\t}","transferFrom":"function transferFrom(address from, address to, uint tokens) public whenNotPaused returns (bool) {\n\t\tallowed[from][msg.sender] = allowed[from][msg.sender].sub(tokens);\n\t\tbalances[from] = balances[from].sub(tokens);\n\t\tbalances[to] = balances[to].add(tokens);\n\t\temit Transfer(from, to, tokens);\n\t\treturn true;\n\t}","allowance":"function allowance(address tokenOwner, address spender) public constant returns (uint) {\n\t\treturn allowed[tokenOwner][spender];\n\t}","(anonymous)":"function () public payable {\n\t\trevert();\n\t}","transferAnyERC20Token":"function transferAnyERC20Token(address tokenAddress, uint tokens) public onlyOwner returns (bool) {\n\t\treturn ERC20Interface(tokenAddress).transfer(owner, tokens);\n\t}","AddSupportedToken":"event AddSupportedToken(\n\t\taddress _address, \n\t\tuint256 _price, \n\t\tuint256 _startTime, \n\t\tuint256 _endTime);","RemoveSupportedToken":"event RemoveSupportedToken(\n\t\taddress _address\n\t);","addSupportedToken":"function addSupportedToken(\n\t\taddress _address, \n\t\tuint256 _price, \n\t\tuint256 _startTime, \n\t\tuint256 _endTime\n\t) public onlyOwner returns (bool) {\n\t\t\n\t\trequire(_address != 0x0);\n\t\trequire(_address.isContract());\n\t\trequire(_startTime < _endTime);\n\t\trequire(_endTime > block.timestamp);\n\n\t\tsupportedERC20Token.push(_address);\n\t\tprices[_address] = _price;\n\t\tstarttime[_address] = _startTime;\n\t\tendtime[_address] = _endTime;\n\n\t\temit AddSupportedToken(_address, _price, _startTime, _endTime);\n\n\t\treturn true;\n\t}","removeSupportedToken":"function removeSupportedToken(address _address) public onlyOwner returns (bool) {\n\t\trequire(_address != 0x0);\n\t\tuint256 length = supportedERC20Token.length;\n\t\tfor (uint256 i = 0; i < length; i++) {\n\t\t\tif (supportedERC20Token[i] == _address) {\n\t\t\t\tif (i != length - 1) {\n\t\t\t\t\tsupportedERC20Token[i] = supportedERC20Token[length - 1];\n\t\t\t\t}\n                delete supportedERC20Token[length-1];\n\t\t\t\tsupportedERC20Token.length--;\n\n\t\t\t\tprices[_address] = 0;\n\t\t\t\tstarttime[_address] = 0;\n\t\t\t\tendtime[_address] = 0;\n\n\t\t\t\temit RemoveSupportedToken(_address);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}","canBuy":"modifier canBuy(address _address) { \n\t\tbool found = false;\n\t\tuint256 length = supportedERC20Token.length;\n\t\tfor (uint256 i = 0; i < length; i++) {\n\t\t\tif (supportedERC20Token[i] == _address) {\n\t\t\t\trequire(block.timestamp > starttime[_address]);\n\t\t\t\trequire(block.timestamp < endtime[_address]);\n\t\t\t\tfound = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\t\t\n\t\trequire (found); \n\t\t_; \n\t}","joinPreSale":"function joinPreSale(address _tokenAddress, uint256 _tokenCount) public canBuy(_tokenAddress) returns (bool) {\n\t\trequire(_tokenCount <= maxTokenCountPerTrans); \n\t\tuint256 total = _tokenCount * prices[_tokenAddress];  \n\t\tbalances[msg.sender].sub(total);\n\t\tnashInPool.add(total);\n\n\t\temit Transfer(_tokenAddress, this, total);\n\n\t\treturn ERC20Interface(_tokenCount).transfer(msg.sender, _tokenCount);\n\t}","transferNashOut":"function transferNashOut(address _to, uint256 count) public onlyOwner returns(bool) {\n\t\trequire(_to != 0x0);\n\t\tnashInPool.sub(count);\n\t\tbalances[_to].add(count);\n\n\t\temit Transfer(this, _to, count);\n\t}"}},"vulnerability":{"timestamp dependency":["NXX"]},"dir":"timestamp dependency","detail":"Below are the function code snippets from the provided smart contract that contain the timestamp dependency (TP) vulnerability along with explanations for each occurrence.\n\n#### Function: `addSupportedToken`\n\n```solidity\nfunction addSupportedToken(\n    address _address, \n    uint256 _price, \n    uint256 _startTime, \n    uint256 _endTime\n) public onlyOwner returns (bool) {\n    \n    require(_address != 0x0);\n    require(_address.isContract());\n    require(_startTime < _endTime);\n    require(_endTime > block.timestamp);\n\n    supportedERC20Token.push(_address);\n    prices[_address] = _price;\n    starttime[_address] = _startTime;\n    endtime[_address] = _endTime;\n\n    emit AddSupportedToken(_address, _price, _startTime, _endTime);\n\n    return true;\n}\n```\n\n**Explanation**: The `block.timestamp` is used in a `require` statement to compare with `_endTime`. This association fulfills the pattern of **TimestampAssign** since the value of `block.timestamp` is assigned to the condition of a `require` statement. Therefore, this function is flagged for timestamp dependency vulnerability.\n\n#### Function: `joinPreSale`\n\n```solidity\nmodifier canBuy(address _address) { \n    bool found = false;\n    uint256 length = supportedERC20Token.length;\n    for (uint256 i = 0; i < length; i++) {\n        if (supportedERC20Token[i] == _address) {\n            require(block.timestamp > starttime[_address]);\n            require(block.timestamp < endtime[_address]);\n            found = true;\n            break;\n        }\n    }       \n    require (found); \n    _; \n}\n\nfunction joinPreSale(address _tokenAddress, uint256 _tokenCount) public canBuy(_tokenAddress) returns (bool) {\n    require(_tokenCount <= maxTokenCountPerTrans); \n    uint256 total = _tokenCount * prices[_tokenAddress];  \n    balances[msg.sender].sub(total);\n    nashInPool.add(total);\n\n    emit Transfer(_tokenAddress, this, total);\n\n    return ERC20Interface(_tokenCount).transfer(msg.sender, _tokenCount);\n}\n```\n\n**Explanation**: The `block.timestamp` is used within the `canBuy` modifier in two `require` statements to compare the current block's timestamp with `starttime` and `endtime`. This again fulfills the **TimestampAssign** pattern since the conditions for executing `joinPreSale` depend directly on `block.timestamp`. Thus, `joinPreSale` is flagged for the timestamp dependency vulnerability.\n\nIn both instances, utilizing `block.timestamp` introduces a dependency on the block's timestamp that is susceptible to manipulation by miners, which could result in unfavorable conditions or actions within the contract.","repair":"Below are the repaired code snippets for the identified vulnerabilities. The provided fixes ensure that the code can compile and run correctly.\n\n### Repaired Function: `addSupportedToken`\n\n```solidity\nfunction addSupportedToken(\n    address _address, \n    uint256 _price, \n    uint256 _startTime, \n    uint256 _endTime\n) public onlyOwner returns (bool) {\n    \n    require(_address != 0x0);\n    require(_address.isContract());\n    require(_startTime < _endTime);\n    \n    // Remove dependency on block.timestamp:\n    require(_endTime > block.number); // Use block number instead\n    \n    supportedERC20Token.push(_address);\n    prices[_address] = _price;\n    starttime[_address] = _startTime;\n    endtime[_address] = _endTime;\n\n    emit AddSupportedToken(_address, _price, _startTime, _endTime);\n\n    return true;\n}\n```\nExplanation: We replaced the timestamp check `require(_endTime > block.timestamp);` with `require(_endTime > block.number);` to use the block number instead of the block timestamp.\n\n### Repaired Function: `joinPreSale`\n\n```solidity\nmodifier canBuy(address _address) { \n    bool found = false;\n    uint256 length = supportedERC20Token.length;\n    for (uint256 i = 0; i < length; i++) {\n        if (supportedERC20Token[i] == _address) {\n            require(block.number > starttime[_address]);\n            require(block.number < endtime[_address]);\n            found = true;\n            break;\n        }\n    }       \n    require (found); \n    _; \n}\n\nfunction joinPreSale(address _tokenAddress, uint256 _tokenCount) public canBuy(_tokenAddress) returns (bool) {\n    require(_tokenCount <= maxTokenCountPerTrans); \n    uint256 total = _tokenCount * prices[_tokenAddress];  \n    balances[msg.sender].sub(total);\n    nashInPool.add(total);\n\n    emit Transfer(_tokenAddress, this, total);\n\n    return ERC20Interface(_tokenCount).transfer(msg.sender, _tokenCount);\n}\n```\nExplanation: In the `canBuy` modifier, we replaced the timestamp checks `require(block.timestamp > starttime[_address]);` and `require(block.timestamp < endtime[_address]);` with block number checks `require(block.number > starttime[_address]);` and `require(block.number < endtime[_address]);`.\n\nThese changes help to avoid direct dependency on block timestamps, using the block number can provide a more deterministic and secure method to handle time-based conditions."}