Contract

0x2044afe78fcF686eE75a6ff02493DD9D994192BE

Overview
0.0000 Trust Bitcoin
$0.0000
More Info
 
Contract Source Code Verified (Exact Match)
InvestmentPlan
Yes with 200 runs

0.8.10+commit.fc410830
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)

File 1 of 6 : Address.sol

pragma solidity ^0.8.1; // SPDX-License-Identifier: MIT library Address { function isContract(address account) internal view returns (bool) { return account.code.length > 0; } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue(address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }

File 2 of 6 : Context.sol

pragma solidity ^0.8.0; // SPDX-License-Identifier: MIT abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }

File 3 of 6 : IERC20.sol

pragma solidity ^0.8.0; // SPDX-License-Identifier: MIT interface IERC20 { event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address to, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address from, address to, uint256 amount) external returns (bool); }

File 4 of 6 : InvestmentPlan.sol

pragma solidity 0.8.10; // SPDX-License-Identifier: MIT import "./SafeERC20.sol"; interface IReferrals { function addMember(address investor, address sponsor) external; function getSponsor(address investor) external view returns (address); function getTeam(address sponsor, uint256 level) external view returns (uint256); } interface IVersion { function mapUserInfo(address investor) external view returns(uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256, bool); function totalBusiness(address investor) external view returns (uint256); function workingBonus(address investor) external view returns (uint256); function monthlySale(address investor, uint256 months) external view returns (uint256); function positionWiseTBC(uint256 stage, uint256 position) external view returns (uint256); function positionWiseWallet(uint256 stage, uint256 position) external view returns (address); function stageWiseUserTBC(uint256 stage, address investor) external view returns (uint256); function stageWiseAvailableTBC(uint256 stage) external view returns (uint256); function stageWiseCurrentSellPosition(uint256 stage) external view returns (uint256); function statusPerStage(uint256 stage) external view returns (bool); } contract InvestmentPlan { using SafeERC20 for IERC20; address public TUSD; address public FundWallet; address public OwnerWallet; IReferrals public Referrals; IVersion private V1; struct UserInfo { uint256 investedAmount; uint256 levelIncome; uint256 foreignTour; uint256 monthlyReward; uint256 workingBonus; uint256 royaltyBonus; uint256 receivedFromSale; uint256 extraBonus; uint256 claimedAmount; uint256 claimedTBC; bool royalty; } uint256 public royaltyIncentive; uint256 public nextRewardDrain; uint256 public workingBonusLoop; uint256 public monthlyBonusLoop; bool public saleEnable; uint256[10] public referralBonus = [500, 300, 200, 100, 100, 50, 50, 50, 50, 50]; uint256[10] public teamRequiredForBonus = [0, 3, 3, 3, 3, 3, 3, 3, 3, 3]; uint256[6] public investmentPackages = [100 * 10**18, 500 * 10**18, 1000 * 10**18, 2500 * 10**18, 5000 * 10**18, 10000 * 10**18]; uint256[5] public pricePerStage = [1 * 10**18, 10 * 10**18, 100 * 10**18, 1000 * 10**18, 10000 * 10**18]; uint256[6] public stageWiseAvailableTBC = [2500000 * 10**18, 2500000 * 10**18, 5000000 * 10**18, 5000000 * 10**18, 5000000 * 10**18]; uint256[6] public stageWiseCurrentSellPosition = [0, 0, 0, 0, 0, 0]; uint256[6] public incentivePerStage = [0, 4000, 4000, 5000, 5000, 5000]; bool[6] public statusPerStage; mapping(address => UserInfo) public mapUserInfo; mapping(address => uint256) public totalBusiness; mapping(address => uint256) public workingBonus; mapping(address => mapping(uint256 => uint256)) public monthlySale; mapping(address => mapping(uint256 => uint256)) public monthlySaleClaimed; mapping(uint256 => uint256[]) public positionWiseTBC; mapping(uint256 => address[]) public positionWiseWallet; mapping(uint256 => mapping(address => uint256)) public stageWiseUserTBC; mapping(uint256 => mapping(address => uint256[])) public stageWiseUserPosition; constructor(address TUSDAddress, address fundWallet, address ownerWallet, address VIAddress) { require(TUSDAddress != address(0) && fundWallet != address(0) && ownerWallet != address(0), "Zero address"); royaltyIncentive = 1000; nextRewardDrain = block.timestamp + 17 days; workingBonusLoop = 512; monthlyBonusLoop = 512; TUSD = address(TUSDAddress); FundWallet = address(fundWallet); OwnerWallet = address(ownerWallet); V1 = IVersion(VIAddress); } function buy(uint256 packages, uint256 buyStage, address investor, address sponsor, address communitySeller, uint256 stage2Share, uint256 stage3Share, uint256 stage4Share, uint256 stage5Share, uint256 stage6Share) external { require(sponsor != address(0), "Zero address"); require(address(Referrals) != address(0), "Referral address not added yet"); require(packages < investmentPackages.length, "Investment packages is not correct"); require(IERC20(TUSD).balanceOf(msg.sender) >= investmentPackages[packages], "TUSD balance not available for investment"); require(address(sponsor) != address(investor), "Investor and sponsor can't be same wallet"); if(!saleEnable) { saleEnable = true; } uint256 investmentAmount = investmentPackages[packages]; IERC20(TUSD).safeTransferFrom(address(msg.sender), address(this), investmentAmount); if(address(Referrals.getSponsor(address(investor))) == address(0)) { Referrals.addMember(address(investor), address(sponsor)); } sponsor = address(Referrals.getSponsor(address(investor))); if(address(sponsor) != address(0)) { require(mapUserInfo[address(sponsor)].investedAmount > 0, "Sponsor is not correct"); } uint256 totalTBC = (investmentAmount * 10**18) / (pricePerStage[buyStage]); require(statusPerStage[buyStage], "Stage is not active yet"); require(stageWiseAvailableTBC[buyStage] >= totalTBC, "TBC not available for sale"); if(buyStage == 0) { require(stage2Share + stage3Share + stage4Share + stage5Share + stage6Share == totalTBC, "Stagewise share is not correct"); updateStageWiseRecord(address(investor), stage2Share, stage3Share, stage4Share, stage5Share, stage6Share); } else if(buyStage == 1) { require(stage3Share + stage4Share + stage5Share + stage6Share == totalTBC, "Stagewise share is not correct"); updateStageWiseRecord(address(investor), 0, stage3Share, stage4Share, stage5Share, stage6Share); } else if(buyStage == 2) { require(stage4Share + stage5Share + stage6Share == totalTBC, "Stagewise share is not correct"); updateStageWiseRecord(address(investor), 0, 0, stage4Share, stage5Share, stage6Share); } else if(buyStage == 3) { require(stage5Share + stage6Share == totalTBC, "Stagewise share is not correct"); updateStageWiseRecord(address(investor), 0, 0, 0, stage5Share, stage6Share); } else { require(stage6Share == totalTBC, "Stagewise share is not correct"); updateStageWiseRecord(address(investor), 0, 0, 0, 0, stage6Share); } if(buyStage > 0) { updateStageWiseSell(address(communitySeller), buyStage, totalTBC); } if(block.timestamp >= nextRewardDrain) { nextRewardDrain += 30 days; } stageWiseAvailableTBC[buyStage] -= totalTBC; uint256 minimumTBCRequired = (investmentPackages[0] * 10**18) / (pricePerStage[buyStage]); if(minimumTBCRequired > stageWiseAvailableTBC[buyStage]) { statusPerStage[buyStage + 1] = true; } mapUserInfo[address(investor)].investedAmount += investmentAmount; totalBusiness[address(sponsor)] += investmentAmount; uint256 myDirect = Referrals.getTeam(address(sponsor), 0); if(myDirect >= 3 && totalBusiness[sponsor] >= (1500 * 10**18) && !mapUserInfo[sponsor].royalty) { mapUserInfo[address(sponsor)].royalty = true; } referralBonusDistribution(address(investor), investmentAmount); workingBonusDistribution(address(investor), investmentAmount); foreignTourBonusDistribution(address(sponsor), totalBusiness[sponsor]); monthlyBonusDistribution(address(investor), investmentAmount); IERC20(TUSD).safeTransfer(address(OwnerWallet), IERC20(TUSD).balanceOf(address(this))); } function setTeam(address[] calldata investor, address[] calldata sponsor, bool[] calldata royalty) external { require(msg.sender == address(OwnerWallet), "Owner wallet is not correct"); require(!saleEnable, "Sale already started"); require(address(Referrals) != address(0), "Referral address not added yet"); for(uint256 i = 0; i < investor.length; i++) { if(address(Referrals.getSponsor(investor[i])) == address(0) && address(sponsor[i]) != address(0)) { Referrals.addMember(address(investor[i]), address(sponsor[i])); } (, , , uint256 monthlyReward, uint256 WBonus, uint256 royaltyBonus, uint256 receivedFromSale, uint256 extraBonus, uint256 claimedAmount, , ) = V1.mapUserInfo(address(investor[i])); mapUserInfo[address(investor[i])].monthlyReward = monthlyReward; mapUserInfo[address(investor[i])].workingBonus = WBonus; mapUserInfo[address(investor[i])].royaltyBonus = royaltyBonus; mapUserInfo[address(investor[i])].receivedFromSale = receivedFromSale; mapUserInfo[address(investor[i])].claimedAmount = claimedAmount; mapUserInfo[address(investor[i])].extraBonus = extraBonus; mapUserInfo[address(investor[i])].royalty = royalty[i]; __setTeam(address(investor[i])); monthlySale[address(investor[i])][nextRewardDrain] = V1.monthlySale(address(investor[i]), nextRewardDrain); workingBonus[address(investor[i])] = V1.workingBonus(address(investor[i])); totalBusiness[address(investor[i])] = V1.totalBusiness(address(investor[i])); } } function __setTeam(address investor) internal { (uint256 investedAmount, uint256 levelIncome, uint256 foreignTour, , , , , , , , ) = V1.mapUserInfo(address(investor)); mapUserInfo[address(investor)].investedAmount = investedAmount; mapUserInfo[address(investor)].levelIncome = levelIncome; mapUserInfo[address(investor)].foreignTour = foreignTour; } function setSellPosition(uint256 stage, uint256 count) external { require(msg.sender == address(OwnerWallet), "Owner wallet is not correct"); require(!saleEnable, "Sale already started"); uint256 startingPosition = positionWiseTBC[stage].length; for(uint256 i = startingPosition; i < (startingPosition + count); i++) { address investor = V1.positionWiseWallet(stage, i); uint256 share = V1.positionWiseTBC(stage, i); uint256 SWUTBC = V1.stageWiseUserTBC(stage, address(investor)); if(address(investor) != address(0)) { stageWiseUserPosition[stage][address(investor)].push(i); positionWiseTBC[stage].push(share); positionWiseWallet[stage].push(address(investor)); stageWiseUserTBC[stage][address(investor)] = SWUTBC; } } } function startSale() external { require(msg.sender == address(OwnerWallet), "Owner wallet is not correct"); require(!saleEnable, "Sale already started"); for(uint256 i= 0; i < stageWiseAvailableTBC.length; i++) { stageWiseAvailableTBC[i] = V1.stageWiseAvailableTBC(i); stageWiseCurrentSellPosition[i] = V1.stageWiseCurrentSellPosition(i); statusPerStage[i] = V1.statusPerStage(i); } } function updateStageWiseSell(address communitySeller, uint256 stage, uint256 totalTBC) internal { uint256 communitySellLimit = totalTBC * 20 / 100; if(communitySeller != address(0)) { for(uint256 i= 0; i < stageWiseUserPosition[stage][address(communitySeller)].length; i++) { uint256 sellerPosition = stageWiseUserPosition[stage][address(communitySeller)][i]; uint256 remainingTBCOnPosition = positionWiseTBC[stage][sellerPosition]; if(remainingTBCOnPosition > 0) { if(remainingTBCOnPosition >= communitySellLimit) { stageWiseUserTBC[stage][address(communitySeller)] -= communitySellLimit; positionWiseTBC[stage][sellerPosition] -= communitySellLimit; uint256 sellerFund = (communitySellLimit * pricePerStage[stage]) / (10**18); uint256 communityFund = (sellerFund * incentivePerStage[stage]) / 10000; mapUserInfo[address(communitySeller)].receivedFromSale += (sellerFund - communityFund); mapUserInfo[address(communitySeller)].claimedAmount += (sellerFund - communityFund); communitySellLimit = 0; IERC20(TUSD).safeTransfer(address(address(communitySeller)), (sellerFund - communityFund)); break; } else { stageWiseUserTBC[stage][address(communitySeller)] -= remainingTBCOnPosition; positionWiseTBC[stage][sellerPosition] = 0; uint256 sellerFund = (remainingTBCOnPosition * pricePerStage[stage]) / (10**18); uint256 communityFund = (sellerFund * incentivePerStage[stage]) / 10000; mapUserInfo[address(communitySeller)].receivedFromSale += (sellerFund - communityFund); mapUserInfo[address(communitySeller)].claimedAmount += (sellerFund - communityFund); communitySellLimit -= remainingTBCOnPosition; IERC20(TUSD).safeTransfer(address(address(communitySeller)), (sellerFund - communityFund)); } } } } uint256 userSellLimit = (totalTBC * 30 / 100) + communitySellLimit; uint256 startingPosition = stageWiseCurrentSellPosition[stage]; for(uint256 i = startingPosition; i < positionWiseTBC[stage].length; i++) { uint256 remainingTBCOnPosition = positionWiseTBC[stage][i]; if(remainingTBCOnPosition > 0) { if(remainingTBCOnPosition >= userSellLimit) { address userOnPosition = address(positionWiseWallet[stage][i]); stageWiseUserTBC[stage][userOnPosition] -= userSellLimit; positionWiseTBC[stage][i] -= userSellLimit; uint256 userFund = (userSellLimit * pricePerStage[stage]) / (10**18); uint256 communityFund = (userFund * incentivePerStage[stage]) / (10000); mapUserInfo[address(userOnPosition)].receivedFromSale += (userFund - communityFund); mapUserInfo[address(userOnPosition)].claimedAmount += (userFund - communityFund); IERC20(TUSD).safeTransfer(userOnPosition, (userFund - communityFund)); stageWiseCurrentSellPosition[stage] = i; break; } else { address userOnPosition = address(positionWiseWallet[stage][i]); stageWiseUserTBC[stage][userOnPosition] -= remainingTBCOnPosition; positionWiseTBC[stage][i] = 0; uint256 userFund = (remainingTBCOnPosition * pricePerStage[stage]) / (10**18); uint256 communityFund = (userFund * incentivePerStage[stage]) / (10000); mapUserInfo[address(userOnPosition)].receivedFromSale += (userFund - communityFund); mapUserInfo[address(userOnPosition)].claimedAmount += (userFund - communityFund); userSellLimit -= remainingTBCOnPosition; stageWiseCurrentSellPosition[stage] = i; IERC20(TUSD).safeTransfer(userOnPosition, (userFund - communityFund)); } } } } function updateStageWiseRecord(address investor, uint256 stage2Share, uint256 stage3Share, uint256 stage4Share, uint256 stage5Share, uint256 stage6Share) internal { if(stage2Share > 0) { stageWiseUserPosition[1][address(investor)].push(positionWiseTBC[1].length); positionWiseTBC[1].push(stage2Share); positionWiseWallet[1].push(address(investor)); stageWiseAvailableTBC[1] += stage2Share; stageWiseUserTBC[1][address(investor)] += stage2Share; } if(stage3Share > 0) { stageWiseUserPosition[2][address(investor)].push(positionWiseTBC[2].length); positionWiseTBC[2].push(stage3Share); positionWiseWallet[2].push(address(investor)); stageWiseAvailableTBC[2] += stage3Share; stageWiseUserTBC[2][address(investor)] += stage3Share; } if(stage4Share > 0) { stageWiseUserPosition[3][address(investor)].push(positionWiseTBC[3].length); positionWiseTBC[3].push(stage4Share); positionWiseWallet[3].push(address(investor)); stageWiseAvailableTBC[3] += stage4Share; stageWiseUserTBC[3][address(investor)] += stage4Share; } if(stage5Share > 0) { stageWiseUserPosition[4][address(investor)].push(positionWiseTBC[4].length); positionWiseTBC[4].push(stage5Share); positionWiseWallet[4].push(address(investor)); stageWiseAvailableTBC[4] += stage5Share; stageWiseUserTBC[4][address(investor)] += stage5Share; } if(stage6Share > 0) { stageWiseUserPosition[5][address(investor)].push(positionWiseTBC[5].length); positionWiseTBC[5].push(stage6Share); positionWiseWallet[5].push(address(investor)); stageWiseAvailableTBC[5] += stage6Share; stageWiseUserTBC[5][address(investor)] += stage6Share; } } function referralBonusDistribution(address investor, uint256 amount) internal { address sponsor = Referrals.getSponsor(investor); for(uint256 i=0; i < 10; i++) { if(address(sponsor) != address(0)) { uint256 myDirect = Referrals.getTeam(address(sponsor), 0); if(myDirect >= teamRequiredForBonus[i]) { address sponsorWallet = address(Referrals.getSponsor(sponsor)); if(i==0 && myDirect >= 5) { uint256 reward = amount * (referralBonus[i] * 2) / 10000; if(mapUserInfo[sponsorWallet].royalty) { royaltyBonusDistribution(sponsorWallet, ((reward * royaltyIncentive) / 10000)); } mapUserInfo[address(sponsor)].levelIncome += reward; mapUserInfo[address(sponsor)].claimedAmount += reward; IERC20(TUSD).safeTransfer(address(sponsor), reward); } else { if(i==0) { uint256 reward = amount * referralBonus[i] / 10000; if(mapUserInfo[sponsorWallet].royalty) { royaltyBonusDistribution(sponsorWallet, ((reward * royaltyIncentive) / 10000)); } mapUserInfo[sponsor].levelIncome += reward; mapUserInfo[sponsor].claimedAmount += reward; IERC20(TUSD).safeTransfer(address(sponsor), reward); } else if(totalBusiness[address(sponsor)] >= (1500 * 10**18)) { uint256 reward = amount * referralBonus[i] / 10000; if(mapUserInfo[sponsorWallet].royalty) { royaltyBonusDistribution(sponsorWallet, ((reward * royaltyIncentive) / 10000)); } mapUserInfo[sponsor].levelIncome += reward; mapUserInfo[sponsor].claimedAmount += reward; IERC20(TUSD).safeTransfer(address(sponsor), reward); } } } } else { break; } sponsor = Referrals.getSponsor(sponsor); } } function monthlyBonusDistribution(address investor, uint256 amount) internal { address sponsor = Referrals.getSponsor(investor); for(uint256 i=0; i < monthlyBonusLoop; i++) { if(sponsor != address(0)) { monthlySale[address(sponsor)][nextRewardDrain] += amount; } else { break; } sponsor = Referrals.getSponsor(sponsor); } } function workingBonusDistribution(address investor, uint256 amount) internal { address sponsor = Referrals.getSponsor(investor); for(uint256 i=0; i < workingBonusLoop; i++) { if(address(sponsor) != address(0)) { if(workingBonus[address(sponsor)] > 0) { uint256 payableAmount = amount * (workingBonus[address(sponsor)]) / 10000; if(IERC20(TUSD).balanceOf(address(this)) >= payableAmount) { mapUserInfo[address(sponsor)].workingBonus += payableAmount; mapUserInfo[sponsor].claimedAmount += payableAmount; IERC20(TUSD).safeTransfer(address(sponsor), payableAmount); break; } else if(IERC20(TUSD).allowance(address(FundWallet), address(this)) >= payableAmount && IERC20(TUSD).balanceOf(address(FundWallet)) >= payableAmount) { mapUserInfo[address(sponsor)].workingBonus += payableAmount; mapUserInfo[sponsor].claimedAmount += payableAmount; IERC20(TUSD).safeTransferFrom(address(FundWallet), address(sponsor), payableAmount); break; } else { mapUserInfo[address(sponsor)].workingBonus += payableAmount; break; } } } else { break; } sponsor = Referrals.getSponsor(sponsor); } } function foreignTourBonusDistribution(address sponsor, uint256 amount) internal { uint256 incentiveAmount = (amount / (3000 * 10**18)) * (300 * 10**18); if(incentiveAmount > mapUserInfo[sponsor].foreignTour) { uint256 payableAmount = incentiveAmount - mapUserInfo[sponsor].foreignTour; if(mapUserInfo[Referrals.getSponsor(sponsor)].royalty) { royaltyBonusDistribution(Referrals.getSponsor(sponsor), ((payableAmount * royaltyIncentive) / 10000)); } if(IERC20(TUSD).balanceOf(address(this)) >= payableAmount) { mapUserInfo[sponsor].foreignTour += payableAmount; mapUserInfo[sponsor].claimedAmount += payableAmount; IERC20(TUSD).safeTransfer(address(sponsor), payableAmount); } else if(IERC20(TUSD).allowance(address(FundWallet), address(this)) >= payableAmount && IERC20(TUSD).balanceOf(address(FundWallet)) >= payableAmount) { mapUserInfo[sponsor].foreignTour += payableAmount; mapUserInfo[sponsor].claimedAmount += payableAmount; IERC20(TUSD).safeTransferFrom(address(FundWallet), address(sponsor), payableAmount); } else { mapUserInfo[sponsor].foreignTour += payableAmount; } } } function royaltyBonusDistribution(address sponsor, uint256 payableAmount) internal { if(address(sponsor) != address(0)) { if(IERC20(TUSD).balanceOf(address(this)) >= payableAmount) { mapUserInfo[sponsor].royaltyBonus += payableAmount; mapUserInfo[sponsor].claimedAmount += payableAmount; IERC20(TUSD).safeTransfer(address(sponsor), payableAmount); } else if(IERC20(TUSD).allowance(address(FundWallet), address(this)) >= payableAmount && IERC20(TUSD).balanceOf(address(FundWallet)) >= payableAmount) { mapUserInfo[sponsor].royaltyBonus += payableAmount; mapUserInfo[sponsor].claimedAmount += payableAmount; IERC20(TUSD).safeTransferFrom(address(FundWallet), address(sponsor), payableAmount); } else { mapUserInfo[sponsor].royaltyBonus += payableAmount; } } } function claimMonthlyReward(address topSponsor, uint256 month) external { require(monthlySaleClaimed[address(msg.sender)][month] == 0, "Monthly reward already claimed"); require(Referrals.getSponsor(topSponsor) == address(msg.sender), "Top sponsor is not correct"); uint256 topSponsorSale = monthlySale[address(topSponsor)][month]; uint256 allSale = monthlySale[address(msg.sender)][month]; uint256 remainingTeamSale = allSale - topSponsorSale; uint256 payableAmount = 0; if(topSponsorSale >= (10000000 * 10**18) && remainingTeamSale >= (10000000 * 10**18)) { payableAmount = 1000000 * 10**18; } else if(topSponsorSale >= (5000000 * 10**18) && remainingTeamSale >= (5000000 * 10**18)) { payableAmount = 400000 * 10**18; } else if(topSponsorSale >= (2000000 * 10**18) && remainingTeamSale >= (2000000 * 10**18)) { payableAmount = 150000 * 10**18; } else if(topSponsorSale >= (500000 * 10**18) && remainingTeamSale >= (500000 * 10**18)) { payableAmount = 35000 * 10**18; } else if(topSponsorSale >= (125000 * 10**18) && remainingTeamSale >= (125000 * 10**18)) { payableAmount = 8500 * 10**18; } else if(topSponsorSale >= (50000 * 10**18) && remainingTeamSale >= (50000 * 10**18)) { payableAmount = 3000 * 10**18; } else if(topSponsorSale >= (15000 * 10**18) && remainingTeamSale >= (15000 * 10**18)) { payableAmount = 800 * 10**18; } else if(topSponsorSale >= (5000 * 10**18) && remainingTeamSale >= (5000 * 10**18)) { payableAmount = 250 * 10**18; } if(payableAmount > 0 && IERC20(TUSD).allowance(address(FundWallet), address(this)) >= payableAmount && IERC20(TUSD).balanceOf(address(FundWallet)) >= payableAmount) { monthlySaleClaimed[address(msg.sender)][month] = 1; address sponsor = Referrals.getSponsor(address(msg.sender)); if(mapUserInfo[sponsor].royalty) { royaltyBonusDistribution(sponsor, ((payableAmount * royaltyIncentive) / 10000)); } mapUserInfo[address(msg.sender)].monthlyReward += payableAmount; mapUserInfo[address(msg.sender)].claimedAmount += payableAmount; IERC20(TUSD).safeTransferFrom(address(FundWallet), address(msg.sender), payableAmount); } } function withdrawEarning(uint256 amount) external { uint256 payableAmount = pendingReward(address(msg.sender)); if(payableAmount >= amount && IERC20(TUSD).allowance(address(FundWallet), address(this)) >= amount && IERC20(TUSD).balanceOf(address(FundWallet)) >= amount) { mapUserInfo[address(msg.sender)].claimedAmount += amount; IERC20(TUSD).safeTransferFrom(address(FundWallet), address(msg.sender), amount); } } function pendingReward(address user) public view returns (uint256) { if(mapUserInfo[address(user)].investedAmount > 0) { uint256 pending = (mapUserInfo[address(user)].levelIncome + mapUserInfo[address(user)].foreignTour + mapUserInfo[address(user)].workingBonus + mapUserInfo[address(user)].royaltyBonus + mapUserInfo[address(user)].monthlyReward + mapUserInfo[address(user)].receivedFromSale + mapUserInfo[address(user)].extraBonus) - (mapUserInfo[address(user)].claimedAmount); return pending; } else { return 0; } } function claimTBC() external { require(statusPerStage[5], "Exchange stage is not start yet"); uint256 claimableTBC = stageWiseUserTBC[5][address(msg.sender)] - mapUserInfo[address(msg.sender)].claimedTBC; if(claimableTBC > 0) { payable(msg.sender).transfer(claimableTBC); mapUserInfo[address(msg.sender)].claimedTBC += claimableTBC; } } function addReferral(address referral) external { require(address(Referrals) == address(0), "Zero address"); require(address(msg.sender) == address(OwnerWallet), "Owner wallet is not correct"); Referrals = IReferrals(referral); } function updateFundWallet(address newWalllet) external { require(address(newWalllet) != address(0), "Zero address"); require(address(msg.sender) == address(OwnerWallet), "Owner wallet is not correct"); FundWallet = address(newWalllet); } function updateOwnerWallet(address newWalllet) external { require(address(newWalllet) != address(0), "Zero address"); require(address(msg.sender) == address(OwnerWallet), "Owner wallet is not correct"); OwnerWallet = address(newWalllet); } function setWorkingBonus(address user, uint256 bonus) external { require(address(msg.sender) == address(OwnerWallet), "Owner wallet is not correct"); require(mapUserInfo[address(user)].investedAmount > 0, "User is not correct"); require(bonus <= 500); workingBonus[address(user)] = bonus; } function setExtraBonus(address user, uint256 bonus) external { require(address(msg.sender) == address(OwnerWallet), "Owner wallet is not correct"); require(mapUserInfo[address(user)].investedAmount > 0, "User is not correct"); mapUserInfo[address(user)].extraBonus += bonus; } function setLoopLimit(uint256 workingLoop, uint256 monthlyLoop) external { require(address(msg.sender) == address(OwnerWallet), "Owner wallet is not correct"); require(workingLoop > 0 && monthlyLoop > 0, "Incorrect request"); workingBonusLoop = workingLoop; monthlyBonusLoop = monthlyLoop; } }

File 5 of 6 : SafeERC20.sol

pragma solidity ^0.8.0; // SPDX-License-Identifier: MIT import "./IERC20.sol"; import "./draft-IERC20Permit.sol"; import "./Address.sol"; library SafeERC20 { 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' 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) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } function _callOptionalReturn(IERC20 token, bytes memory data) private { bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }

File 6 of 6 : draft-IERC20Permit.sol

pragma solidity ^0.8.0; // SPDX-License-Identifier: MIT interface IERC20Permit { function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; function nonces(address owner) external view returns (uint256); function DOMAIN_SEPARATOR() external view returns (bytes32); }
ABI Code (Solidity Standard Json-Input format)

File 1 of 1 : ABI.json

[ { "inputs": [ { "internalType": "address", "name": "referral", "type": "address" } ], "name": "addReferral", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "packages", "type": "uint256" }, { "internalType": "uint256", "name": "buyStage", "type": "uint256" }, { "internalType": "address", "name": "investor", "type": "address" }, { "internalType": "address", "name": "sponsor", "type": "address" }, { "internalType": "address", "name": "communitySeller", "type": "address" }, { "internalType": "uint256", "name": "stage2Share", "type": "uint256" }, { "internalType": "uint256", "name": "stage3Share", "type": "uint256" }, { "internalType": "uint256", "name": "stage4Share", "type": "uint256" }, { "internalType": "uint256", "name": "stage5Share", "type": "uint256" }, { "internalType": "uint256", "name": "stage6Share", "type": "uint256" } ], "name": "buy", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "topSponsor", "type": "address" }, { "internalType": "uint256", "name": "month", "type": "uint256" } ], "name": "claimMonthlyReward", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "claimTBC", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" }, { "internalType": "uint256", "name": "bonus", "type": "uint256" } ], "name": "setExtraBonus", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "workingLoop", "type": "uint256" }, { "internalType": "uint256", "name": "monthlyLoop", "type": "uint256" } ], "name": "setLoopLimit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "stage", "type": "uint256" }, { "internalType": "uint256", "name": "count", "type": "uint256" } ], "name": "setSellPosition", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "investor", "type": "address[]" }, { "internalType": "address[]", "name": "sponsor", "type": "address[]" }, { "internalType": "bool[]", "name": "royalty", "type": "bool[]" } ], "name": "setTeam", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" }, { "internalType": "uint256", "name": "bonus", "type": "uint256" } ], "name": "setWorkingBonus", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "startSale", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "TUSDAddress", "type": "address" }, { "internalType": "address", "name": "fundWallet", "type": "address" }, { "internalType": "address", "name": "ownerWallet", "type": "address" }, { "internalType": "address", "name": "VIAddress", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [ { "internalType": "address", "name": "newWalllet", "type": "address" } ], "name": "updateFundWallet", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newWalllet", "type": "address" } ], "name": "updateOwnerWallet", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "withdrawEarning", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "FundWallet", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "incentivePerStage", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "investmentPackages", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "mapUserInfo", "outputs": [ { "internalType": "uint256", "name": "investedAmount", "type": "uint256" }, { "internalType": "uint256", "name": "levelIncome", "type": "uint256" }, { "internalType": "uint256", "name": "foreignTour", "type": "uint256" }, { "internalType": "uint256", "name": "monthlyReward", "type": "uint256" }, { "internalType": "uint256", "name": "workingBonus", "type": "uint256" }, { "internalType": "uint256", "name": "royaltyBonus", "type": "uint256" }, { "internalType": "uint256", "name": "receivedFromSale", "type": "uint256" }, { "internalType": "uint256", "name": "extraBonus", "type": "uint256" }, { "internalType": "uint256", "name": "claimedAmount", "type": "uint256" }, { "internalType": "uint256", "name": "claimedTBC", "type": "uint256" }, { "internalType": "bool", "name": "royalty", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "monthlyBonusLoop", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "monthlySale", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "monthlySaleClaimed", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "nextRewardDrain", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "OwnerWallet", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" } ], "name": "pendingReward", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "positionWiseTBC", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "positionWiseWallet", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "pricePerStage", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "referralBonus", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "Referrals", "outputs": [ { "internalType": "contract IReferrals", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "royaltyIncentive", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "saleEnable", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "stageWiseAvailableTBC", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "stageWiseCurrentSellPosition", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "stageWiseUserPosition", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "address", "name": "", "type": "address" } ], "name": "stageWiseUserTBC", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "statusPerStage", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "teamRequiredForBonus", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "totalBusiness", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "TUSD", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "workingBonus", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "workingBonusLoop", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" } ]
Contract Creation Code
0x608060405234801561001057600080fd5b50600436106102475760003560e01c80636f20befd1161013b578063bef18a6b116100b8578063e8aca46a1161007c578063e8aca46a146105fa578063f40f0f521461060d578063f52d1ebe14610620578063fcb1112414610633578063fe4ca8471461063b57600080fd5b8063bef18a6b146105af578063c0fa2214146105c2578063c44f98b6146105d5578063de216f66146105de578063df32dc5c146105e757600080fd5b806384cd5505116100ff57806384cd55051461054a57806397c571ad1461056a57806399b008ce146105955780639e15cf721461059e578063b66a0e5d146105a757600080fd5b80636f20befd146104eb57806377d42fc9146104fe5780637c917187146105115780637cb936e7146105245780638323550b1461053757600080fd5b8063303256fb116101c957806358dc970d1161018d57806358dc970d146104745780635b591627146104875780635ec38bec1461049a57806363e118a2146104ad57806366f150e7146104c057600080fd5b8063303256fb14610408578063357ec6e21461041b578063441222441461043b5780634c7cdb821461044e5780634e7397731461046157600080fd5b80632276fbf9116102105780632276fbf914610384578063235a18eb1461039757806324531ba0146103aa57806324f97835146103bd57806326745f2d146103e557600080fd5b80624a98e81461024c57806306dc731414610272578063156129331461028557806318af7611146103445780631d63a0a81461036f575b600080fd5b61025f61025a366004614d84565b610648565b6040519081526020015b60405180910390f35b61025f610280366004614d9d565b61065f565b6102ef610293366004614dd4565b603c60205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a909a01549899979896979596949593949293919290919060ff168b565b604080519b8c5260208c019a909a52988a01979097526060890195909552608088019390935260a087019190915260c086015260e0850152610100840152610120830152151561014082015261016001610269565b600254610357906001600160a01b031681565b6040516001600160a01b039091168152602001610269565b61038261037d366004614df1565b610690565b005b61025f610392366004614d84565b610c2a565b6103826103a5366004614d9d565b610c3a565b6103826103b8366004614df1565b610ecd565b61025f6103cb366004614df1565b604060208181526000938452818420905290825290205481565b6103f86103f3366004614d84565b610f86565b6040519015158152602001610269565b61025f610416366004614d84565b610fb0565b61025f610429366004614dd4565b603e6020526000908152604090205481565b61025f610449366004614d84565b610fc0565b600154610357906001600160a01b031681565b61035761046f366004614d9d565b610fd0565b61025f610482366004614d84565b611008565b610382610495366004614dd4565b611018565b6103826104a8366004614dd4565b61108a565b6103826104bb366004614e69565b6110fc565b61025f6104ce366004614df1565b603f60209081526000928352604080842090915290825290205481565b600354610357906001600160a01b031681565b61025f61050c366004614d84565b611990565b61025f61051f366004614d84565b6119a0565b610382610532366004614df1565b6119b0565b600054610357906001600160a01b031681565b61025f610558366004614dd4565b603d6020526000908152604090205481565b61025f610578366004614f03565b604360209081526000928352604080842090915290825290205481565b61025f60065481565b61025f60085481565b610382611a60565b6103826105bd366004614f33565b611c6c565b61025f6105d0366004614fbe565b61264a565b61025f60075481565b61025f60055481565b6103826105f5366004614d84565b612688565b610382610608366004614dd4565b6127e9565b61025f61061b366004614dd4565b61285e565b61038261062e366004614d9d565b61291e565b6103826129a3565b6009546103f89060ff1681565b601e816006811061065857600080fd5b0154905081565b6041602052816000526040600020818154811061067b57600080fd5b90600052602060002001600091509150505481565b336000908152604060208181528183208484529052902054156106fa5760405162461bcd60e51b815260206004820152601e60248201527f4d6f6e74686c792072657761726420616c726561647920636c61696d6564000060448201526064015b60405180910390fd5b60035460405163743fc74560e01b81526001600160a01b0384811660048301523392169063743fc74590602401602060405180830381865afa158015610744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107689190614ff6565b6001600160a01b0316146107be5760405162461bcd60e51b815260206004820152601a60248201527f546f702073706f6e736f72206973206e6f7420636f727265637400000000000060448201526064016106f1565b6001600160a01b0382166000908152603f6020818152604080842085855282528084205433855292825280842085855290915282205490916108008383615029565b905060006a084595161401484a000000841015801561082a57506a084595161401484a0000008210155b15610840575069d3c21bcecceda10000006109d3565b6a0422ca8b0a00a425000000841015801561086657506a0422ca8b0a00a4250000008210155b1561087c57506954b40b1f852bda0000006109d3565b6a01a784379d99db4200000084101580156108a257506a01a784379d99db420000008210155b156108b85750691fc3842bd1f071c000006109d3565b6969e10de76676d080000084101580156108dc57506969e10de76676d08000008210155b156108f257506907695a92c20d6fe000006109d3565b691a784379d99db420000084101580156109165750691a784379d99db42000008210155b1561092c57506901ccc9324511e45000006109d3565b690a968163f0a57b40000084101580156109505750690a968163f0a57b4000008210155b15610965575068a2a15d09519be000006109d3565b69032d26d12e980b6000008410158015610989575069032d26d12e980b6000008210155b1561099e5750682b5e3af16b188000006109d3565b69010f0cf064dd5920000084101580156109c2575069010f0cf064dd592000008210155b156109d35750680d8d726b7177a800005b600081118015610a5b5750600054600154604051636eb1769f60e11b81526001600160a01b0391821660048201523060248201528392919091169063dd62ed3e90604401602060405180830381865afa158015610a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a589190615040565b10155b8015610ad957506000546001546040516370a0823160e01b81526001600160a01b039182166004820152839291909116906370a0823190602401602060405180830381865afa158015610ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad69190615040565b10155b15610c225733600081815260406020818152818320898452905280822060019055600354905163743fc74560e01b8152600481019390935290916001600160a01b039091169063743fc74590602401602060405180830381865afa158015610b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b699190614ff6565b6001600160a01b0381166000908152603c60205260409020600a015490915060ff1615610bb457610bb48161271060055485610ba59190615059565b610baf9190615078565b612aa5565b336000908152603c602052604081206003018054849290610bd690849061509a565b9091555050336000908152603c602052604081206008018054849290610bfd90849061509a565b9091555050600154600054610c20916001600160a01b0391821691163385612d44565b505b505050505050565b6035816006811061065857600080fd5b6002546001600160a01b03163314610c645760405162461bcd60e51b81526004016106f1906150b2565b60095460ff1615610c875760405162461bcd60e51b81526004016106f1906150e9565b600082815260416020526040902054805b610ca2838361509a565b811015610ec75760048054604051634e73977360e01b8152918201869052602482018390526000916001600160a01b0390911690634e73977390604401602060405180830381865afa158015610cfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d209190614ff6565b600480546040516301b71cc560e21b8152918201889052602482018590529192506000916001600160a01b0316906306dc731490604401602060405180830381865afa158015610d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d989190615040565b600480546040516397c571ad60e01b81529182018990526001600160a01b03858116602484015292935060009216906397c571ad90604401602060405180830381865afa158015610ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e119190615040565b90506001600160a01b03831615610eb15760008781526044602090815260408083206001600160a01b038716808552908352818420805460018181018355918652848620018990558b85526041845282852080548083018255908652848620018790558b8552604284528285208054918201815585528385200180546001600160a01b031916821790558a84526043835281842090845290915290208190555b5050508080610ebf90615117565b915050610c98565b50505050565b6002546001600160a01b03163314610ef75760405162461bcd60e51b81526004016106f1906150b2565b6001600160a01b0382166000908152603c6020526040902054610f525760405162461bcd60e51b8152602060048201526013602482015272155cd95c881a5cc81b9bdd0818dbdc9c9958dd606a1b60448201526064016106f1565b6001600160a01b0382166000908152603c602052604081206007018054839290610f7d90849061509a565b90915550505050565b603b8160068110610f9657600080fd5b60209182820401919006915054906101000a900460ff1681565b601481600a811061065857600080fd5b6024816005811061065857600080fd5b60426020528160005260406000208181548110610fec57600080fd5b6000918252602090912001546001600160a01b03169150829050565b6029816006811061065857600080fd5b6001600160a01b03811661103e5760405162461bcd60e51b81526004016106f190615132565b6002546001600160a01b031633146110685760405162461bcd60e51b81526004016106f1906150b2565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166110b05760405162461bcd60e51b81526004016106f190615132565b6002546001600160a01b031633146110da5760405162461bcd60e51b81526004016106f1906150b2565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031633146111265760405162461bcd60e51b81526004016106f1906150b2565b60095460ff16156111495760405162461bcd60e51b81526004016106f1906150e9565b6003546001600160a01b03166111a15760405162461bcd60e51b815260206004820152601e60248201527f526566657272616c2061646472657373206e6f7420616464656420796574000060448201526064016106f1565b60005b85811015610c20576003546000906001600160a01b031663743fc7458989858181106111d2576111d2615158565b90506020020160208101906111e79190614dd4565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561122b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124f9190614ff6565b6001600160a01b03161480156112955750600085858381811061127457611274615158565b90506020020160208101906112899190614dd4565b6001600160a01b031614155b1561135a576003546001600160a01b0316639d58b15d8888848181106112bd576112bd615158565b90506020020160208101906112d29190614dd4565b8787858181106112e4576112e4615158565b90506020020160208101906112f99190614dd4565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401600060405180830381600087803b15801561134157600080fd5b505af1158015611355573d6000803e3d6000fd5b505050505b600454600090819081908190819081906001600160a01b031663156129338e8e8a81811061138a5761138a615158565b905060200201602081019061139f9190614dd4565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240161016060405180830381865afa1580156113e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611408919061517c565b505098509850985098509850985050505085603c60008f8f8b81811061143057611430615158565b90506020020160208101906114459190614dd4565b6001600160a01b03166001600160a01b031681526020019081526020016000206003018190555084603c60008f8f8b81811061148357611483615158565b90506020020160208101906114989190614dd4565b6001600160a01b03166001600160a01b031681526020019081526020016000206004018190555083603c60008f8f8b8181106114d6576114d6615158565b90506020020160208101906114eb9190614dd4565b6001600160a01b03166001600160a01b031681526020019081526020016000206005018190555082603c60008f8f8b81811061152957611529615158565b905060200201602081019061153e9190614dd4565b6001600160a01b03166001600160a01b031681526020019081526020016000206006018190555080603c60008f8f8b81811061157c5761157c615158565b90506020020160208101906115919190614dd4565b6001600160a01b03166001600160a01b031681526020019081526020016000206008018190555081603c60008f8f8b8181106115cf576115cf615158565b90506020020160208101906115e49190614dd4565b6001600160a01b0316815260208101919091526040016000206007015588888881811061161357611613615158565b90506020020160208101906116289190615206565b603c60008f8f8b81811061163e5761163e615158565b90506020020160208101906116539190614dd4565b6001600160a01b031681526020810191909152604001600020600a01805460ff19169115159190911790556116ad8d8d8981811061169357611693615158565b90506020020160208101906116a89190614dd4565b612daf565b6004546001600160a01b03166366f150e78e8e8a8181106116d0576116d0615158565b90506020020160208101906116e59190614dd4565b6006546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015611731573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117559190615040565b603f60008f8f8b81811061176b5761176b615158565b90506020020160208101906117809190614dd4565b6001600160a01b0390811682526020808301939093526040918201600090812060065482529093529120919091556004541663357ec6e28e8e8a8181106117c9576117c9615158565b90506020020160208101906117de9190614dd4565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611822573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118469190615040565b603e60008f8f8b81811061185c5761185c615158565b90506020020160208101906118719190614dd4565b6001600160a01b039081168252602082019290925260400160002091909155600454166384cd55058e8e8a8181106118ab576118ab615158565b90506020020160208101906118c09190614dd4565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611904573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119289190615040565b603d60008f8f8b81811061193e5761193e615158565b90506020020160208101906119539190614dd4565b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550505050505050808061198890615117565b9150506111a4565b600a81600a811061065857600080fd5b602f816006811061065857600080fd5b6002546001600160a01b031633146119da5760405162461bcd60e51b81526004016106f1906150b2565b6001600160a01b0382166000908152603c6020526040902054611a355760405162461bcd60e51b8152602060048201526013602482015272155cd95c881a5cc81b9bdd0818dbdc9c9958dd606a1b60448201526064016106f1565b6101f4811115611a4457600080fd5b6001600160a01b039091166000908152603e6020526040902055565b6002546001600160a01b03163314611a8a5760405162461bcd60e51b81526004016106f1906150b2565b60095460ff1615611aad5760405162461bcd60e51b81526004016106f1906150e9565b60005b6006811015611c6957600480546040516358dc970d60e01b81529182018390526001600160a01b0316906358dc970d90602401602060405180830381865afa158015611b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b249190615040565b60298260068110611b3757611b37615158565b015560048054604051637c91718760e01b81529182018390526001600160a01b031690637c91718790602401602060405180830381865afa158015611b80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba49190615040565b602f8260068110611bb757611bb7615158565b0155600480546040516326745f2d60e01b81529182018390526001600160a01b0316906326745f2d90602401602060405180830381865afa158015611c00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c249190615223565b603b8260068110611c3757611c37615158565b602091828204019190066101000a81548160ff0219169083151502179055508080611c6190615117565b915050611ab0565b50565b6001600160a01b038716611c925760405162461bcd60e51b81526004016106f190615132565b6003546001600160a01b0316611cea5760405162461bcd60e51b815260206004820152601e60248201527f526566657272616c2061646472657373206e6f7420616464656420796574000060448201526064016106f1565b60068a10611d455760405162461bcd60e51b815260206004820152602260248201527f496e766573746d656e74207061636b61676573206973206e6f7420636f72726560448201526118dd60f21b60648201526084016106f1565b601e8a60068110611d5857611d58615158565b01546000546040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611da2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc69190615040565b1015611e265760405162461bcd60e51b815260206004820152602960248201527f545553442062616c616e6365206e6f7420617661696c61626c6520666f7220696044820152681b9d995cdd1b595b9d60ba1b60648201526084016106f1565b876001600160a01b0316876001600160a01b03161415611e9a5760405162461bcd60e51b815260206004820152602960248201527f496e766573746f7220616e642073706f6e736f722063616e27742062652073616044820152681b59481dd85b1b195d60ba1b60648201526084016106f1565b60095460ff16611eb2576009805460ff191660011790555b6000601e8b60068110611ec757611ec7615158565b0154600054909150611ee4906001600160a01b0316333084612d44565b60035460405163743fc74560e01b81526001600160a01b038b81166004830152600092169063743fc74590602401602060405180830381865afa158015611f2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f539190614ff6565b6001600160a01b03161415611fca57600354604051639d58b15d60e01b81526001600160a01b038b811660048301528a8116602483015290911690639d58b15d90604401600060405180830381600087803b158015611fb157600080fd5b505af1158015611fc5573d6000803e3d6000fd5b505050505b60035460405163743fc74560e01b81526001600160a01b038b811660048301529091169063743fc74590602401602060405180830381865afa158015612014573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120389190614ff6565b97506001600160a01b038816156120a7576001600160a01b0388166000908152603c60205260409020546120a75760405162461bcd60e51b815260206004820152601660248201527514dc1bdb9cdbdc881a5cc81b9bdd0818dbdc9c9958dd60521b60448201526064016106f1565b600060248b600581106120bc576120bc615158565b01546120d083670de0b6b3a7640000615059565b6120da9190615078565b9050603b8b600681106120ef576120ef615158565b602081049091015460ff601f9092166101000a9004166121515760405162461bcd60e51b815260206004820152601760248201527f5374616765206973206e6f74206163746976652079657400000000000000000060448201526064016106f1565b8060298c6006811061216557612165615158565b015410156121b55760405162461bcd60e51b815260206004820152601a60248201527f544243206e6f7420617661696c61626c6520666f722073616c6500000000000060448201526064016106f1565b8a61221657808385876121c88a8c61509a565b6121d2919061509a565b6121dc919061509a565b6121e6919061509a565b146122035760405162461bcd60e51b81526004016106f190615240565b6122118a8888888888612e5e565b612327565b8a6001141561226c5780838561222c888a61509a565b612236919061509a565b612240919061509a565b1461225d5760405162461bcd60e51b81526004016106f190615240565b6122118a600088888888612e5e565b8a600214156122b7578083612281868861509a565b61228b919061509a565b146122a85760405162461bcd60e51b81526004016106f190615240565b6122118a600080888888612e5e565b8a600314156122f857806122cb848661509a565b146122e85760405162461bcd60e51b81526004016106f190615240565b6122118a60008060008888612e5e565b8083146123175760405162461bcd60e51b81526004016106f190615240565b6123278a60008060008088612e5e565b8a1561233857612338888c83613568565b600654421061235c5762278d0060066000828254612356919061509a565b90915550505b8060298c6006811061237057612370615158565b0160008282546123809190615029565b909155506000905060248c6005811061239b5761239b615158565b0154601e546123b290670de0b6b3a7640000615059565b6123bc9190615078565b905060298c600681106123d1576123d1615158565b0154811115612418576001603b6123e88e8361509a565b600681106123f8576123f8615158565b602091828204019190066101000a81548160ff0219169083151502179055505b6001600160a01b038b166000908152603c60205260408120805485929061244090849061509a565b90915550506001600160a01b038a166000908152603d60205260408120805485929061246d90849061509a565b90915550506003546040516380f78b3f60e01b81526001600160a01b038c811660048301526000602483018190529216906380f78b3f90604401602060405180830381865afa1580156124c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e89190615040565b90506003811015801561251c57506001600160a01b038b166000908152603d6020526040902054685150ae84a8cdf0000011155b801561254457506001600160a01b038b166000908152603c60205260409020600a015460ff16155b15612570576001600160a01b038b166000908152603c60205260409020600a01805460ff191660011790555b61257a8c85613d29565b6125848c85614182565b6001600160a01b038b166000908152603d60205260409020546125a8908c90614587565b6125b28c856149b2565b6002546000546040516370a0823160e01b815230600482015261263a926001600160a01b039081169216906370a0823190602401602060405180830381865afa158015612603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126279190615040565b6000546001600160a01b03169190614b01565b5050505050505050505050505050565b6044602052826000526040600020602052816000526040600020818154811061267257600080fd5b9060005260206000200160009250925050505481565b60006126933361285e565b905081811015801561271d5750600054600154604051636eb1769f60e11b81526001600160a01b0391821660048201523060248201528492919091169063dd62ed3e90604401602060405180830381865afa1580156126f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271a9190615040565b10155b801561279b57506000546001546040516370a0823160e01b81526001600160a01b039182166004820152849291909116906370a0823190602401602060405180830381865afa158015612774573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127989190615040565b10155b156127e557336000908152603c6020526040812060080180548492906127c290849061509a565b90915550506001546000546127e5916001600160a01b0391821691163385612d44565b5050565b6003546001600160a01b0316156128125760405162461bcd60e51b81526004016106f190615132565b6002546001600160a01b0316331461283c5760405162461bcd60e51b81526004016106f1906150b2565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152603c602052604081205415612916576001600160a01b0382166000908152603c6020526040812060088101546007820154600683015460038401546005850154600486015460028701546001909701549596949593949293919290916128d3919061509a565b6128dd919061509a565b6128e7919061509a565b6128f1919061509a565b6128fb919061509a565b612905919061509a565b61290f9190615029565b9392505050565b506000919050565b6002546001600160a01b031633146129485760405162461bcd60e51b81526004016106f1906150b2565b6000821180156129585750600081115b6129985760405162461bcd60e51b8152602060048201526011602482015270125b98dbdc9c9958dd081c995c5d595cdd607a1b60448201526064016106f1565b600791909155600855565b603b5465010000000000900460ff166129fe5760405162461bcd60e51b815260206004820152601f60248201527f45786368616e6765207374616765206973206e6f74207374617274207965740060448201526064016106f1565b336000908152603c60209081526040808320600901547fd6c2779d7e386daf361b85a5d634dce51e9403cce5e5b1ec9b100865557a3c4d909252822054612a459190615029565b90508015611c6957604051339082156108fc029083906000818181858888f19350505050158015612a7a573d6000803e3d6000fd5b50336000908152603c602052604081206009018054839290612a9d90849061509a565b909155505050565b6001600160a01b038216156127e5576000546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015612afc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b209190615040565b10612b9c576001600160a01b0382166000908152603c602052604081206005018054839290612b5090849061509a565b90915550506001600160a01b0382166000908152603c602052604081206008018054839290612b8090849061509a565b90915550506000546127e5906001600160a01b03168383614b01565b600054600154604051636eb1769f60e11b81526001600160a01b0391821660048201523060248201528392919091169063dd62ed3e90604401602060405180830381865afa158015612bf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c169190615040565b10158015612c9657506000546001546040516370a0823160e01b81526001600160a01b039182166004820152839291909116906370a0823190602401602060405180830381865afa158015612c6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c939190615040565b10155b15612d19576001600160a01b0382166000908152603c602052604081206005018054839290612cc690849061509a565b90915550506001600160a01b0382166000908152603c602052604081206008018054839290612cf690849061509a565b90915550506001546000546127e5916001600160a01b0391821691168484612d44565b6001600160a01b0382166000908152603c602052604081206005018054839290610f7d90849061509a565b6040516001600160a01b0380851660248301528316604482015260648101829052610ec79085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614b31565b60048054604051631561293360e01b81526001600160a01b03848116938201939093526000928392839291169063156129339060240161016060405180830381865afa158015612e03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e27919061517c565b5050506001600160a01b03909b166000908152603c6020526040902096875550505050600183019190915560029091015550505050565b8415612fc5576001600160a01b03861660008181527fcdad79d33f4de49584ed9b39ca3d8a53cc10e49c033c5359244d3129cc2efd3d6020908152604082207fcae482817da5739a72d01cb9874e04d330e5e8dc74bc0bece220f5b3532c14b88054825460018082018555938652848620015580548083019091557fbc475fabdc81888234727d84844551d4b29dadadddc669d53b81403f3c27f3920189905560429091527f1e02e7e7cb9e9eea58e182617f7334d8953b76e5cc38e6ca429c7744253cace78054918201815582527f9976d2929a73d3b0a4d2370acf6ad27bf1eb832df2a88ef4089290b6862ecde70180546001600160a01b031916909217909155602a8054879290612f7390849061509a565b90915550506001600160a01b03861660009081527f7b18867ebd2b04dbe21f520089d61bc882c11b3f5cc506df65457bb01e796297602052604081208054879290612fbf90849061509a565b90915550505b831561312c576001600160a01b03861660008181527f698f965f71a6f5c9afb45442df7ff01640d7295288618bfa1177b6c22c0c05db6020908152604082207fe12917faa952038297cceeb966eb4f054126fd0f1307df22b19432454cb24b378054825460018082018555938652848620015580548083019091557f5be7c536397117463d980345fb0ad2788a68ce0ddd4722db167062755e2aa9db0188905560429091527f9693e62f09366b4f038d2f3dfe3f0982145a73c367786164031cce1e5a64f0948054918201815582527f933a97da2e72a8e2fc4c0b2dd25832df6d659999333a0f21d5b32b26809fccff0180546001600160a01b031916909217909155602b80548692906130da90849061509a565b90915550506001600160a01b03861660009081527fb24be977f4ec7a75f89e669b15af271af2f8729c5e9c8c681997633a48b1031460205260408120805486929061312690849061509a565b90915550505b8215613293576001600160a01b03861660008181527fbb4c205d2fd5d5c0ff4ab723a86b46f24bafcc7dfe57b1f587a8c4b4e7fe20146020908152604082207fc3a7a9815c24f0c36cde8cf4e88f62a6b5d5a812279aee192ae55af7227959598054825460018082018555938652848620015580548083019091557f50dced972fc3919c37c066415db46664f7404d5c4ac1aee54cf89e9af0d933c40187905560429091527f6a51289a21ac6edf4deccbe661eee535a9c8ffbe178740c39f03ed213ff51ffe8054918201815582527f7dca9502745de57dbe351b4d531a19d0f23ea8d5fe1a0376f9e8823d78a47b480180546001600160a01b031916909217909155602c805485929061324190849061509a565b90915550506001600160a01b03861660009081527f62f6a8d3ed649f412d833373e5344ded5babeca5d7f90d4d90216edfee362f6c60205260408120805485929061328d90849061509a565b90915550505b81156133fa576001600160a01b03861660008181527f45b807389775ad05c7cd9109cde6b930048fc115975326a747c8e4a5232f1e826020908152604082207f6f521771d1c10c5f5cf26170d7c1f204b89275fa64742d43fde7a274c85d47dd8054825460018082018555938652848620015580548083019091557f1ed5b319a1cf8393b52a739f0e64fef69c18f722bbace93a78f074ea7433fa230186905560429091527fa1328882ef5cecf9940951e98b9f20f66903681a6caf2eab06e4557fe91b11468054918201815582527f7d7f0147b94a3bf1c424808e180352110f1baeec2056dfb4b50b2b4615e9c78f0180546001600160a01b031916909217909155602d80548492906133a890849061509a565b90915550506001600160a01b03861660009081527f03e975a9b289ace39a8da1293156fa093fd8f5e3245fd785d78bb45b91a97ce06020526040812080548492906133f490849061509a565b90915550505b8015610c22576001600160a01b03861660008181527f0d8114addc107b9906d4b6801726e6398dfeab6fcad9ec1b0042e243f7efef3d6020908152604082207fd6fcbeeb060af62b78ed9399842247242693c1167af80fe8ef190295be0191118054825460018082018555938652848620015580548083019091557f5605cf113824bae09495aaf163ebd0729ca0cb7c44ac7eaaaffca3047108fe500185905560429091527fd011f032728d0086269ce676ee6ffa50fce1f33e5a567cef723380c6830bbf068054918201815582527fb7984df2695730525e860bf371144e0269e9aefc38f3915f4aa709ed98475e690180546001600160a01b031916909217909155602e805483929061350f90849061509a565b90915550506001600160a01b03861660009081527fd6c2779d7e386daf361b85a5d634dce51e9403cce5e5b1ec9b100865557a3c4d60205260408120805483929061355b90849061509a565b9091555050505050505050565b60006064613577836014615059565b6135819190615078565b90506001600160a01b038416156139285760005b60008481526044602090815260408083206001600160a01b03891684529091529020548110156139265760008481526044602090815260408083206001600160a01b038916845290915281208054839081106135f3576135f3615158565b90600052602060002001549050600060416000878152602001908152602001600020828154811061362657613626615158565b906000526020600020015490506000811115613911578381106137b35760008681526043602090815260408083206001600160a01b038b16845290915281208054869290613675908490615029565b9091555050600086815260416020526040902080548591908490811061369d5761369d615158565b9060005260206000200160008282546136b69190615029565b9091555060009050670de0b6b3a7640000602488600581106136da576136da615158565b01546136e69087615059565b6136f09190615078565b905060006127106035896006811061370a5761370a615158565b01546137169084615059565b6137209190615078565b905061372c8183615029565b6001600160a01b038a166000908152603c60205260408120600601805490919061375790849061509a565b9091555061376790508183615029565b6001600160a01b038a166000908152603c60205260408120600801805490919061379290849061509a565b90915550600096506137aa9050896126278385615029565b50505050613926565b60008681526043602090815260408083206001600160a01b038b168452909152812080548392906137e5908490615029565b9091555050600086815260416020526040812080548490811061380a5761380a615158565b90600052602060002001819055506000670de0b6b3a76400006024886005811061383657613836615158565b01546138429084615059565b61384c9190615078565b905060006127106035896006811061386657613866615158565b01546138729084615059565b61387c9190615078565b90506138888183615029565b6001600160a01b038a166000908152603c6020526040812060060180549091906138b390849061509a565b909155506138c390508183615029565b6001600160a01b038a166000908152603c6020526040812060080180549091906138ee90849061509a565b909155506138fe90508387615029565b955061390e896126278385615029565b50505b5050808061391e90615117565b915050613595565b505b600081606461393885601e615059565b6139429190615078565b61394c919061509a565b90506000602f856006811061396357613963615158565b01549050805b600086815260416020526040902054811015610c2057600086815260416020526040812080548390811061399f5761399f615158565b906000526020600020015490506000811115613d1657838110613b705760008781526042602052604081208054849081106139dc576139dc615158565b60009182526020808320909101548a83526043825260408084206001600160a01b0390921680855291909252908220805491935087929091613a1f908490615029565b90915550506000888152604160205260409020805486919085908110613a4757613a47615158565b906000526020600020016000828254613a609190615029565b9091555060009050670de0b6b3a764000060248a60058110613a8457613a84615158565b0154613a909088615059565b613a9a9190615078565b9050600061271060358b60068110613ab457613ab4615158565b0154613ac09084615059565b613aca9190615078565b9050613ad68183615029565b6001600160a01b0384166000908152603c602052604081206006018054909190613b0190849061509a565b90915550613b1190508183615029565b6001600160a01b0384166000908152603c602052604081206008018054909190613b3c90849061509a565b90915550613b509050836126278385615029565b84602f8b60068110613b6457613b64615158565b015550610c2092505050565b6000878152604260205260408120805484908110613b9057613b90615158565b60009182526020808320909101548a83526043825260408084206001600160a01b0390921680855291909252908220805491935084929091613bd3908490615029565b90915550506000888152604160205260408120805485908110613bf857613bf8615158565b90600052602060002001819055506000670de0b6b3a764000060248a60058110613c2457613c24615158565b0154613c309085615059565b613c3a9190615078565b9050600061271060358b60068110613c5457613c54615158565b0154613c609084615059565b613c6a9190615078565b9050613c768183615029565b6001600160a01b0384166000908152603c602052604081206006018054909190613ca190849061509a565b90915550613cb190508183615029565b6001600160a01b0384166000908152603c602052604081206008018054909190613cdc90849061509a565b90915550613cec90508488615029565b965084602f8b60068110613d0257613d02615158565b0155613d12836126278385615029565b5050505b5080613d2181615117565b915050613969565b60035460405163743fc74560e01b81526001600160a01b038481166004830152600092169063743fc74590602401602060405180830381865afa158015613d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d989190614ff6565b905060005b600a811015610ec7576001600160a01b038216156140fb576003546040516380f78b3f60e01b81526001600160a01b0384811660048301526000602483018190529216906380f78b3f90604401602060405180830381865afa158015613e07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e2b9190615040565b9050601482600a8110613e4057613e40615158565b015481106140f55760035460405163743fc74560e01b81526001600160a01b038581166004830152600092169063743fc74590602401602060405180830381865afa158015613e93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613eb79190614ff6565b905082158015613ec8575060058210155b15613fbf576000612710600a85600a8110613ee557613ee5615158565b0154613ef2906002615059565b613efc9088615059565b613f069190615078565b6001600160a01b0383166000908152603c60205260409020600a015490915060ff1615613f4257613f428261271060055484610ba59190615059565b6001600160a01b0385166000908152603c602052604081206001018054839290613f6d90849061509a565b90915550506001600160a01b0385166000908152603c602052604081206008018054839290613f9d90849061509a565b9091555050600054613fb9906001600160a01b03168683614b01565b506140f3565b82613fe8576000612710600a85600a8110613fdc57613fdc615158565b0154613efc9088615059565b6001600160a01b0384166000908152603d6020526040902054685150ae84a8cdf00000116140f3576000612710600a85600a811061402857614028615158565b01546140349088615059565b61403e9190615078565b6001600160a01b0383166000908152603c60205260409020600a015490915060ff161561407a5761407a8261271060055484610ba59190615059565b6001600160a01b0385166000908152603c6020526040812060010180548392906140a590849061509a565b90915550506001600160a01b0385166000908152603c6020526040812060080180548392906140d590849061509a565b90915550506000546140f1906001600160a01b03168683614b01565b505b505b50614100565b610ec7565b60035460405163743fc74560e01b81526001600160a01b0384811660048301529091169063743fc74590602401602060405180830381865afa15801561414a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061416e9190614ff6565b91508061417a81615117565b915050613d9d565b60035460405163743fc74560e01b81526001600160a01b038481166004830152600092169063743fc74590602401602060405180830381865afa1580156141cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141f19190614ff6565b905060005b600754811015610ec7576001600160a01b038216156140fb576001600160a01b0382166000908152603e602052604090205415614505576001600160a01b0382166000908152603e6020526040812054612710906142549086615059565b61425e9190615078565b6000546040516370a0823160e01b815230600482015291925082916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156142ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142cf9190615040565b10614351576001600160a01b0383166000908152603c6020526040812060040180548392906142ff90849061509a565b90915550506001600160a01b0383166000908152603c60205260408120600801805483929061432f90849061509a565b909155505060005461434b906001600160a01b03168483614b01565b50610ec7565b600054600154604051636eb1769f60e11b81526001600160a01b0391821660048201523060248201528392919091169063dd62ed3e90604401602060405180830381865afa1580156143a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143cb9190615040565b1015801561444b57506000546001546040516370a0823160e01b81526001600160a01b039182166004820152839291909116906370a0823190602401602060405180830381865afa158015614424573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144489190615040565b10155b156144ce576001600160a01b0383166000908152603c60205260408120600401805483929061447b90849061509a565b90915550506001600160a01b0383166000908152603c6020526040812060080180548392906144ab90849061509a565b909155505060015460005461434b916001600160a01b0391821691168584612d44565b6001600160a01b0383166000908152603c6020526040812060040180548392906144f990849061509a565b90915550610ec7915050565b60035460405163743fc74560e01b81526001600160a01b0384811660048301529091169063743fc74590602401602060405180830381865afa15801561454f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145739190614ff6565b91508061457f81615117565b9150506141f6565b600061459c68a2a15d09519be0000083615078565b6145af90681043561a8829300000615059565b6001600160a01b0384166000908152603c60205260409020600201549091508111156149ad576001600160a01b0383166000908152603c60205260408120600201546145fb9083615029565b60035460405163743fc74560e01b81526001600160a01b038781166004830152929350603c92600092169063743fc74590602401602060405180830381865afa15801561464c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146709190614ff6565b6001600160a01b031681526020810191909152604001600020600a015460ff16156147165760035460405163743fc74560e01b81526001600160a01b03868116600483015261471692169063743fc74590602401602060405180830381865afa1580156146e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147059190614ff6565b61271060055484610ba59190615059565b6000546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa15801561475e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147829190615040565b106147fe576001600160a01b0384166000908152603c6020526040812060020180548392906147b290849061509a565b90915550506001600160a01b0384166000908152603c6020526040812060080180548392906147e290849061509a565b90915550506000546140fb906001600160a01b03168583614b01565b600054600154604051636eb1769f60e11b81526001600160a01b0391821660048201523060248201528392919091169063dd62ed3e90604401602060405180830381865afa158015614854573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148789190615040565b101580156148f857506000546001546040516370a0823160e01b81526001600160a01b039182166004820152839291909116906370a0823190602401602060405180830381865afa1580156148d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148f59190615040565b10155b1561497b576001600160a01b0384166000908152603c60205260408120600201805483929061492890849061509a565b90915550506001600160a01b0384166000908152603c60205260408120600801805483929061495890849061509a565b90915550506001546000546140fb916001600160a01b0391821691168684612d44565b6001600160a01b0384166000908152603c6020526040812060020180548392906149a690849061509a565b9091555050505b505050565b60035460405163743fc74560e01b81526001600160a01b038481166004830152600092169063743fc74590602401602060405180830381865afa1580156149fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614a219190614ff6565b905060005b600854811015610ec7576001600160a01b038216156140fb576001600160a01b0382166000908152603f60209081526040808320600654845290915281208054859290614a7490849061509a565b90915550614a7f9050565b60035460405163743fc74560e01b81526001600160a01b0384811660048301529091169063743fc74590602401602060405180830381865afa158015614ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614aed9190614ff6565b915080614af981615117565b915050614a26565b6040516001600160a01b0383166024820152604481018290526149ad90849063a9059cbb60e01b90606401612d78565b6000614b86826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614c039092919063ffffffff16565b8051909150156149ad5780806020019051810190614ba49190615223565b6149ad5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106f1565b6060614c128484600085614c1a565b949350505050565b606082471015614c7b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106f1565b6001600160a01b0385163b614cd25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106f1565b600080866001600160a01b03168587604051614cee91906152a3565b60006040518083038185875af1925050503d8060008114614d2b576040519150601f19603f3d011682016040523d82523d6000602084013e614d30565b606091505b5091509150614d40828286614d4b565b979650505050505050565b60608315614d5a57508161290f565b825115614d6a5782518084602001fd5b8160405162461bcd60e51b81526004016106f191906152bf565b600060208284031215614d9657600080fd5b5035919050565b60008060408385031215614db057600080fd5b50508035926020909101359150565b6001600160a01b0381168114611c6957600080fd5b600060208284031215614de657600080fd5b813561290f81614dbf565b60008060408385031215614e0457600080fd5b8235614e0f81614dbf565b946020939093013593505050565b60008083601f840112614e2f57600080fd5b50813567ffffffffffffffff811115614e4757600080fd5b6020830191508360208260051b8501011115614e6257600080fd5b9250929050565b60008060008060008060608789031215614e8257600080fd5b863567ffffffffffffffff80821115614e9a57600080fd5b614ea68a838b01614e1d565b90985096506020890135915080821115614ebf57600080fd5b614ecb8a838b01614e1d565b90965094506040890135915080821115614ee457600080fd5b50614ef189828a01614e1d565b979a9699509497509295939492505050565b60008060408385031215614f1657600080fd5b823591506020830135614f2881614dbf565b809150509250929050565b6000806000806000806000806000806101408b8d031215614f5357600080fd5b8a35995060208b0135985060408b0135614f6c81614dbf565b975060608b0135614f7c81614dbf565b965060808b0135614f8c81614dbf565b999c989b50969995989760a0870135975060c08701359660e08101359650610100810135955061012001359350915050565b600080600060608486031215614fd357600080fd5b833592506020840135614fe581614dbf565b929592945050506040919091013590565b60006020828403121561500857600080fd5b815161290f81614dbf565b634e487b7160e01b600052601160045260246000fd5b60008282101561503b5761503b615013565b500390565b60006020828403121561505257600080fd5b5051919050565b600081600019048311821515161561507357615073615013565b500290565b60008261509557634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156150ad576150ad615013565b500190565b6020808252601b908201527f4f776e65722077616c6c6574206973206e6f7420636f72726563740000000000604082015260600190565b60208082526014908201527314d85b1948185b1c9958591e481cdd185c9d195960621b604082015260600190565b600060001982141561512b5761512b615013565b5060010190565b6020808252600c908201526b5a65726f206164647265737360a01b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b8015158114611c6957600080fd5b60008060008060008060008060008060006101608c8e03121561519e57600080fd5b8b519a5060208c0151995060408c0151985060608c0151975060808c0151965060a08c0151955060c08c0151945060e08c015193506101008c015192506101208c015191506101408c01516151f28161516e565b809150509295989b509295989b9093969950565b60006020828403121561521857600080fd5b813561290f8161516e565b60006020828403121561523557600080fd5b815161290f8161516e565b6020808252601e908201527f537461676577697365207368617265206973206e6f7420636f72726563740000604082015260600190565b60005b8381101561529257818101518382015260200161527a565b83811115610ec75750506000910152565b600082516152b5818460208701615277565b9190910192915050565b60208152600082518060208401526152de816040850160208701615277565b601f01601f1916919091016040019291505056fea26469706673582212208682005b0118604885d9e1ba75605a772edb83e4f591c24861d946d5d324ab0b64736f6c634300080a0033
1. FundWallet

2. incentivePerStage

3. investmentPackages

4. mapUserInfo

5. monthlyBonusLoop

6. monthlySale

7. monthlySaleClaimed

8. nextRewardDrain

9. OwnerWallet

10. pendingReward

11. positionWiseTBC

12. positionWiseWallet

13. pricePerStage

14. referralBonus

15. Referrals

16. royaltyIncentive

17. saleEnable

18. stageWiseAvailableTBC

19. stageWiseCurrentSellPosition

20. stageWiseUserPosition

21. stageWiseUserTBC

22. statusPerStage

23. teamRequiredForBonus

24. totalBusiness

25. TUSD

26. workingBonus

27. workingBonusLoop

1. addReferral
2. buy
3. claimMonthlyReward
4. claimTBC
5. setExtraBonus
6. setLoopLimit
7. setSellPosition
8. setTeam
9. setWorkingBonus
10. startSale
11. updateFundWallet
12. updateOwnerWallet
13. withdrawEarning

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met.