//充值加入游戏
function deposit(address _upline) payable external whenNotPaused {
_setUpline(msg.sender, _upline); //设置上线
_deposit(msg.sender, msg.value); //充值
}
//设置上线 、设置团队人数
function _setUpline(address _addr, address _upline) private {
if(users[_addr].upline == address(0) && _upline != _addr && (users[_upline].deposit_time > 0 || _upline == owner())) {
users[_addr].upline = _upline; //设置上线
users[_upline].referrals++; //设置直推人数 +1
emit Upline(_addr, _upline);
for(uint8 i = 0; i < ref_bonuses.length; i++) {
if(_upline == address(0)) break;
users[_upline].total_structure++; //设置团队人数 +1
_upline = users[_upline].upline;
}
}
}
//充值
function _deposit(address _addr, uint256 _amount) private {
require(users[_addr].upline != address(0) || _addr == owner(), "No upline"); //推荐地址不能为空或推荐人是合约所有者
if(users[_addr].deposit_time > 0) { //最近一轮充值时间
users[_addr].cycle++; //循环次数
require(users[_addr].payouts >= this.maxPayoutOf(users[_addr].deposit_amount), "Deposit already exists"); //提现收益数量大于本轮最大可获取收益
require(_amount >= users[_addr].deposit_amount && _amount <= cycles[users[_addr].cycle > cycles.length - 1 ? cycles.length - 1 : users[_addr].cycle], "Bad amount"); //投资数量要大于上轮同时要少于本轮最大可投数量
}
else require(_amount >= 0.1 ether && _amount <= cycles[0], "Bad amount"); //投资数量不有少于 0.1 ether 或大于本轮最大可投数量
users[_addr].payouts = 0;
users[_addr].deposit_amount = _amount; //充值数量
users[_addr].deposit_payouts = 0;
users[_addr].deposit_time = uint40(block.timestamp); //充值时间
users[_addr].total_deposits += _amount; //累计投资
emit NewDeposit(_addr, _amount);
if(users[_addr].upline != address(0)) { //如果上线不是空
users[users[_addr].upline].direct_bonus += _amount / 10; //直推10%
emit DirectPayout(users[_addr].upline, _addr, _amount / 10);
}
_pollDeposits(_addr, _amount);
if(pool_last_draw + 1 days < block.timestamp) { //奖励池
_drawPool();
}
payable(owner()).transfer(_amount / 100); //合约开发者1%收益
}