Contract

0x29a4bCE9A0d34c3010A1e19CedAE97E80494955E

Overview
0.0000 Trust Bitcoin
$0.0000
More Info
 
Contract Source Code (Solidity Standard Json-Input format)

File 1 of 7 : Address.sol

// SPDX-License-Identifier: MIT pragma solidity ^0.8.1; 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 7 : Context.sol

// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; 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 7 : IERC20.sol

// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; 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 7 : InvestmentPlan.sol

pragma solidity 0.8.10; // SPDX-License-Identifier: MIT import "./SafeERC20.sol"; import "./Ownable.sol"; /// @title IReferrals /// @notice Interface for managing referral system (sponsor and team tree). interface IReferrals { /// @notice Adds a new investor with a sponsor to the referral tree. /// @param investor The address of the new investor. /// @param sponsor The address of the investor's sponsor. function addMember(address investor, address sponsor) external; /// @notice Returns the sponsor of a given investor. /// @param investor The address to query. /// @return The sponsor address. function getSponsor(address investor) external view returns (address); /// @notice Returns the number of team members at a given level for a sponsor. /// @param sponsor The sponsor address. /// @param level The team depth level (0 = direct). /// @return Team member count at that level. function getTeam(address sponsor, uint256 level) external view returns (uint256); } /// @title IVersion /// @notice Interface to access legacy contract (V1) data during migration. interface IVersion { /// @notice Returns user data tuple from old contract. function mapUserInfo(address investor) external view returns(uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256, bool); /// @notice Returns total team business volume for a user. function totalBusiness(address investor) external view returns (uint256); /// @notice Returns working bonus for a user. function workingBonus(address investor) external view returns (uint256); /// @notice Returns user’s monthly sales for a given timestamp. function monthlySale(address investor, uint256 months) external view returns (uint256); /// @notice Gets the amount of TBC assigned to a position at a stage. function positionWiseTBC(uint256 stage, uint256 position) external view returns (uint256); /// @notice Gets the wallet address at a specific position and stage. function positionWiseWallet(uint256 stage, uint256 position) external view returns (address); /// @notice Gets how much TBC a user holds at a particular stage. function stageWiseUserTBC(uint256 stage, address investor) external view returns (uint256); /// @notice Gets total available TBC left for a stage. function stageWiseAvailableTBC(uint256 stage) external view returns (uint256); /// @notice Gets the current sell position index for a stage. function stageWiseCurrentSellPosition(uint256 stage) external view returns (uint256); /// @notice Gets whether a particular stage is currently active. function statusPerStage(uint256 stage) external view returns (bool); } /// @title InvestmentPlan Contract /// @notice This contract handles a multi-stage investment and reward distribution plan with referral, team, and royalty bonuses. /// @dev Integrates with external IReferrals and IVersion contracts to manage network structure and historical data. contract InvestmentPlan is Ownable { using SafeERC20 for IERC20; address public immutable TUSD; ///< Address of the TUSD token contract. address public immutable FundWallet; ///< Address from which fallback payments are made. address public immutable TreasuryWallet; ///< Wallet where invested TUSD is collected. IReferrals public Referrals; ///< Reference to referral system contract. IVersion private immutable V1; ///< Legacy contract for migration (V1). struct UserInfo { uint256 investedAmount; ///< Total invested TUSD. uint256 levelIncome; ///< Referral level income. uint256 foreignTour; ///< Foreign tour bonus received. uint256 monthlyReward; ///< Monthly bonus reward. uint256 monthlyDirectReward; //< Monthly direct bonus reward. uint256 workingBonus; ///< Working bonus reward. uint256 royaltyBonus; ///< Royalty bonus reward. uint256 receivedFromSale; ///< Amount received from TBC sales. uint256 extraBonus; ///< Extra manually credited bonuses. uint256 claimedAmount; ///< Total amount claimed. uint256 claimedTBC; ///< Claimed TBC. bool royalty; ///< Whether user qualifies for royalty bonuses. } /// @notice Tracks total and claimed TBC for a user. struct TBCHoldingInfo { uint256 totalTBC; uint256 claimedTBC; } /// @notice Defines direct business reward configuration for a specific month. struct MonthlyDirectBusinessReward { uint256 requiredBusiness; ///< Business volume required to earn the reward uint256 rewardAmount; ///< Reward amount granted } uint256 public immutable royaltyIncentive; ///< % bonus forwarded to royalty sponsor. uint256 public immutable workingBonusLoop; ///< Max depth for working bonus distribution. uint256 public immutable monthlyBonusLoop; ///< Max depth for monthly sales recording. uint256 public nextRewardDrain; ///< Timestamp of next monthly reward cycle. bool public saleEnable; ///< Flag to allow investments. uint256[10] public referralBonus = [500, 300, 200, 100, 100, 50, 50, 50, 50, 50]; ///< Referral bonus rates (in basis points). uint256[10] public teamRequiredForBonus = [0, 3, 3, 3, 3, 3, 3, 3, 3, 3]; ///< Required directs to unlock level bonuses. uint256[6] public investmentPackages = [100 * 10**18, 500 * 10**18, 1000 * 10**18, 2500 * 10**18, 5000 * 10**18, 10000 * 10**18]; ///< Available investment amounts. uint256[5] public pricePerStage = [1 * 10**18, 10 * 10**18, 100 * 10**18, 1000 * 10**18, 10000 * 10**18]; ///< TBC price per stage. uint256[6] public stageWiseAvailableTBC = [2500000 * 10**18, 2500000 * 10**18, 5000000 * 10**18, 5000000 * 10**18, 5000000 * 10**18]; ///< Remaining TBC per stage. uint256[6] public stageWiseCurrentSellPosition = [0, 0, 0, 0, 0, 0]; ///< Last position index sold per stage. uint256[6] public incentivePerStage = [0, 4000, 4000, 5000, 5000, 5000]; ///< Incentive rate per stage. bool[6] public statusPerStage; ///< Stage activation flags. mapping(address => TBCHoldingInfo) public mapTBCHoldingInfo; ///< TBC holdings by user. mapping(address => UserInfo) public mapUserInfo; ///< Full user data. mapping(address => uint256) public totalBusiness; ///< User's team business volume. mapping(address => uint256) public workingBonus; ///< Working bonus percentage (bps). mapping(address => mapping(uint256 => uint256)) public monthlyPurchase; ///< User purchases per month. mapping(address => mapping(uint256 => uint256)) public monthlySale; ///< Downline sales per month. mapping(address => mapping(uint256 => uint256)) public monthlySaleClaimed; ///< Address → month → claimed reward amount. mapping(uint256 => uint256[]) public positionWiseTBC; ///< Position → TBC allocation. mapping(uint256 => address[]) public positionWiseWallet; ///< Position → wallet mapping. mapping(uint256 => mapping(address => uint256)) public stageWiseUserTBC; ///< User TBC per stage. mapping(uint256 => mapping(address => uint256[])) public stageWiseUserPosition; ///< User positions per stage. mapping(address => address) public mapNewAddress; //< Old → new address mapping. mapping(address => mapping(uint256 => uint256)) public monthlyDirectBusiness; ///< Monthly direct business volume per user. mapping(uint256 => MonthlyDirectBusinessReward) public monthlyDirectBusinessReward; ///< Reward configuration per month. mapping(address => mapping(uint256 => uint256)) public monthlyDirectBusinessClaimed; ///< Address → month → claimed reward amount. /// @notice Initializes the contract with token and wallet addresses and sets up default parameters. /// @param TUSDAddress The address of the TUSD token used for investments and rewards. /// @param fundWallet The wallet used for backup rewards or fund transfers. /// @param treasuryWallet The wallet where invested funds are stored. /// @param VIAddress The address of the old version (V1) contract for data migration. constructor(address TUSDAddress, address fundWallet, address treasuryWallet, address VIAddress) { require(TUSDAddress != address(0) && fundWallet != address(0) && treasuryWallet != address(0), "Zero address"); royaltyIncentive = 1000; nextRewardDrain = 1755894532; workingBonusLoop = 512; monthlyBonusLoop = 512; TUSD = address(TUSDAddress); FundWallet = address(fundWallet); TreasuryWallet = address(treasuryWallet); V1 = IVersion(VIAddress); } /// @notice Executes an investment by a user, processes TBC allocation, referral bonuses, and updates team data. /// @dev Must be called only after `startSale()` by the contract owner for public use. /// @param packages Index of the investment package chosen by the user. /// @param buyStage The current stage at which TBC is being purchased. /// @param investor The address of the investor. /// @param sponsor The address of the direct sponsor. /// @param communitySeller Optional community seller to receive TBC resell rewards. /// @param stage2Share TBC portion allocated to stage 2. /// @param stage3Share TBC portion allocated to stage 3. /// @param stage4Share TBC portion allocated to stage 4. /// @param stage5Share TBC portion allocated to stage 5. /// @param stage6Share TBC portion allocated to stage 6. /// @param holding TBC allocated directly to the investor. function buy(uint256 packages, uint256 buyStage, address investor, address sponsor, address communitySeller, uint256 stage2Share, uint256 stage3Share, uint256 stage4Share, uint256 stage5Share, uint256 stage6Share, uint256 holding) 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) { require(address(msg.sender) == owner(), "Sale is not started yet, only onwer can buy"); } uint256 investmentAmount = investmentPackages[packages]; IERC20(TUSD).safeTransferFrom(address(msg.sender), address(this), investmentAmount); if(address(Referrals.getSponsor(address(investor))) == address(0)) { require(mapUserInfo[address(sponsor)].investedAmount > 0, "Sponsor is not correct"); Referrals.addMember(address(investor), address(sponsor)); } sponsor = address(Referrals.getSponsor(address(investor))); 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 + holding == totalTBC, "Stagewise share is not correct"); updateStageWiseRecord(address(investor), stage2Share, stage3Share, stage4Share, stage5Share, stage6Share); } else if(buyStage == 1) { require(stage3Share + stage4Share + stage5Share + stage6Share + holding == totalTBC, "Stagewise share is not correct"); updateStageWiseRecord(address(investor), 0, stage3Share, stage4Share, stage5Share, stage6Share); } else if(buyStage == 2) { require(stage4Share + stage5Share + stage6Share + holding == totalTBC, "Stagewise share is not correct"); updateStageWiseRecord(address(investor), 0, 0, stage4Share, stage5Share, stage6Share); } else if(buyStage == 3) { require(stage5Share + stage6Share + holding == totalTBC, "Stagewise share is not correct"); updateStageWiseRecord(address(investor), 0, 0, 0, stage5Share, stage6Share); } else { require(stage6Share + holding == 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; } mapTBCHoldingInfo[address(investor)].totalTBC += holding; 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; } monthlyDirectBusiness[address(sponsor)][nextRewardDrain] += investmentAmount; monthlyPurchase[address(investor)][nextRewardDrain] += investmentAmount; referralBonusDistribution(address(investor), investmentAmount); workingBonusDistribution(address(investor), investmentAmount); foreignTourBonusDistribution(address(sponsor), totalBusiness[sponsor]); monthlyBonusDistribution(address(investor), investmentAmount); IERC20(TUSD).safeTransfer(address(TreasuryWallet), IERC20(TUSD).balanceOf(address(this))); } /// @notice Imports referral team data from the old version contract (V1). /// @dev Should only be called before the sale is started. Used during migration/setup. /// @param investor Array of user addresses to be mapped. /// @param sponsor Array of corresponding sponsor addresses. function setTeam(address[] calldata investor, address[] calldata sponsor) external onlyOwner { require(!saleEnable, "Sale already started"); require(address(Referrals) != address(0), "Referral address not added yet"); for(uint256 i = 0; i < investor.length; i++) { address newInvestor = mapNewAddress[investor[i]] == address(0) ? investor[i] : mapNewAddress[investor[i]]; address newSponsor = mapNewAddress[sponsor[i]] == address(0) ? sponsor[i] : mapNewAddress[sponsor[i]]; if(address(Referrals.getSponsor(investor[i])) == address(0) && address(sponsor[i]) != address(0)) { Referrals.addMember(address(newInvestor), address(newSponsor)); } (, , , uint256 monthlyReward, uint256 WBonus, uint256 royaltyBonus, uint256 receivedFromSale, uint256 extraBonus, uint256 claimedAmount, , ) = V1.mapUserInfo(address(investor[i])); mapUserInfo[address(newInvestor)].monthlyReward = monthlyReward; mapUserInfo[address(newInvestor)].workingBonus = WBonus; mapUserInfo[address(newInvestor)].royaltyBonus = royaltyBonus; mapUserInfo[address(newInvestor)].receivedFromSale = receivedFromSale; mapUserInfo[address(newInvestor)].claimedAmount = claimedAmount; mapUserInfo[address(newInvestor)].extraBonus = extraBonus; __setTeam(investor[i], address(newInvestor)); monthlySale[address(newInvestor)][nextRewardDrain] = V1.monthlySale(address(investor[i]), nextRewardDrain); workingBonus[address(newInvestor)] = V1.workingBonus(address(investor[i])); totalBusiness[address(newInvestor)] = V1.totalBusiness(address(investor[i])); } } /// @notice Internal function to map migrated user investment and bonus data. /// @param oldinvestor The old user address in V1. /// @param newinvestor The new user address to receive the data. function __setTeam(address oldinvestor, address newinvestor) internal { (uint256 investedAmount, uint256 levelIncome, uint256 foreignTour, , , , , , , , bool royalty) = V1.mapUserInfo(address(oldinvestor)); mapUserInfo[address(newinvestor)].investedAmount = investedAmount; mapUserInfo[address(newinvestor)].levelIncome = levelIncome; mapUserInfo[address(newinvestor)].foreignTour = foreignTour; mapUserInfo[address(newinvestor)].royalty = royalty; } /// @notice Imports user TBC selling positions from the old version contract. /// @dev Must be called before sale is started. /// @param stage The TBC stage for which positions are being imported. /// @param count Number of user positions to import. function setSellPosition(uint256 stage, uint256 count) external onlyOwner { require(!saleEnable, "Sale already started"); uint256 startingPosition = positionWiseTBC[stage].length; for(uint256 i = startingPosition; i < (startingPosition + count); i++) { address investor = V1.positionWiseWallet(stage, i); address newInvestor = mapNewAddress[investor] == address(0) ? investor : mapNewAddress[investor]; uint256 share = V1.positionWiseTBC(stage, i); uint256 SWUTBC = V1.stageWiseUserTBC(stage, address(investor)); if(address(investor) != address(0)) { stageWiseUserPosition[stage][address(newInvestor)].push(i); positionWiseTBC[stage].push(share); positionWiseWallet[stage].push(address(newInvestor)); stageWiseUserTBC[stage][address(newInvestor)] = SWUTBC; } } } /// @notice Loads stage-wise TBC availability and status from V1 contract. /// @dev One-time use before sale is started to sync historical data. function setStageWiseData() external onlyOwner { 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); } } /// @notice Enables the public investment and sale process. /// @dev Can only be called once by the owner. function startSale() external onlyOwner { require(!saleEnable, "Sale already started"); saleEnable = true; } /// @notice Internal function to distribute TBC sale proceeds to eligible sellers and community members. /// @param communitySeller The community seller's address, if involved. /// @param stage The stage for which the TBC sale is occurring. /// @param totalTBC The total amount of TBC being sold in the transaction. 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; if(saleEnable){ 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; if(saleEnable) { 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); if(saleEnable) { 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; if(saleEnable) { IERC20(TUSD).safeTransfer(userOnPosition, (userFund - communityFund)); } } } } } /// @notice Records the user’s TBC distribution across stages during purchase. /// @param investor The address of the user making the purchase. /// @param stage2Share TBC allocated to stage 2. /// @param stage3Share TBC allocated to stage 3. /// @param stage4Share TBC allocated to stage 4. /// @param stage5Share TBC allocated to stage 5. /// @param stage6Share TBC allocated to stage 6. 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; } } /// @notice Distributes referral bonuses up to 10 levels. /// @param investor The investor whose referral tree is used. /// @param amount The base investment amount for reward calculation. 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; if(saleEnable) { 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; if(saleEnable) { 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; if(saleEnable) { IERC20(TUSD).safeTransfer(address(sponsor), reward); } } } } } else { break; } sponsor = Referrals.getSponsor(sponsor); } } /// @notice Adds purchase volume to uplines for monthly reward calculation. /// @param investor The investor who triggered the purchase. /// @param amount The amount of the purchase to be recorded. 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); } } /// @notice Distributes working bonus if applicable to uplines. /// @param investor The investor whose sponsor tree is walked. /// @param amount The investment amount to base the bonus on. 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; if(saleEnable) { 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; if(saleEnable) { IERC20(TUSD).safeTransferFrom(address(FundWallet), address(sponsor), payableAmount); } break; } else { mapUserInfo[address(sponsor)].workingBonus += payableAmount; break; } } } else { break; } sponsor = Referrals.getSponsor(sponsor); } } /// @notice Awards bonuses for achieving certain team volume thresholds. /// @param sponsor The upline sponsor eligible for foreign tour reward. /// @param amount The cumulative team business volume. 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; if(saleEnable) { 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; if(saleEnable) { IERC20(TUSD).safeTransferFrom(address(FundWallet), address(sponsor), payableAmount); } } else { mapUserInfo[sponsor].foreignTour += payableAmount; } } } /// @notice Distributes additional bonus to royalty-qualified uplines. /// @param sponsor The sponsor eligible for royalty bonus. /// @param payableAmount The bonus amount to be distributed. 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; if(saleEnable) { 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; if(saleEnable) { IERC20(TUSD).safeTransferFrom(address(FundWallet), address(sponsor), payableAmount); } } else { mapUserInfo[sponsor].royaltyBonus += payableAmount; } } } /// @notice Allows eligible users to claim a monthly team-based reward if certain sales thresholds are met. /// @dev The function checks both direct and team sales volume. /// @param topSponsor The top performing direct referral whose sales are subtracted to get the team sale. /// @param month The month index for which the reward is being claimed. 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]) + (monthlyPurchase[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] = payableAmount; 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); } if(topSponsorSale >= (15000 * 10**18) && remainingTeamSale >= (15000 * 10**18) && workingBonus[address(msg.sender)] == 0){ workingBonus[address(msg.sender)] = 500; } } /// @notice User claims monthly reward if direct business meets threshold. /// @param month The month index. function claimMonthlyDirectBusinessReward(uint256 month) external { require(monthlyDirectBusinessClaimed[address(msg.sender)][month] == 0, "Monthly reward already claimed"); MonthlyDirectBusinessReward memory config = monthlyDirectBusinessReward[month]; require(config.rewardAmount > 0, "No reward set for this month"); uint256 multiplier = (monthlyDirectBusiness[address(msg.sender)][month] / config.requiredBusiness); uint256 payableAmount = multiplier * config.rewardAmount; if(payableAmount > 0 && IERC20(TUSD).allowance(address(FundWallet), address(this)) >= payableAmount && IERC20(TUSD).balanceOf(address(FundWallet)) >= payableAmount){ monthlyDirectBusinessClaimed[address(msg.sender)][month] = payableAmount; mapUserInfo[address(msg.sender)].monthlyDirectReward += payableAmount; mapUserInfo[address(msg.sender)].claimedAmount += payableAmount; IERC20(TUSD).safeTransferFrom(address(FundWallet), address(msg.sender), payableAmount); } } /// @notice Allows a user to withdraw part or all of their pending rewards. /// @param amount The amount of earnings the user wishes to withdraw. 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); } } /// @notice Claims TBC tokens held by the user directly. /// @dev Transfers native TBC. function claimHoldingTBC() external { uint256 total = mapTBCHoldingInfo[address(msg.sender)].totalTBC; uint256 claimed = mapTBCHoldingInfo[address(msg.sender)].claimedTBC; uint256 claimable = total - claimed; uint256 balance = address(this).balance; if(claimable > 0 && balance >= claimable) { payable(msg.sender).transfer(claimable); mapTBCHoldingInfo[address(msg.sender)].claimedTBC += claimable; } } /// @notice Updates old team addresses to new addresses for migration. /// @param oldAddress Array of legacy user addresses. /// @param newAddress Array of mapped new user addresses. function updateTeam(address[] calldata oldAddress, address[] calldata newAddress) external onlyOwner { require(!saleEnable, "Sale already started"); for(uint256 i = 0; i < oldAddress.length; i++) { if(oldAddress[i] != address(0) && newAddress[i] != address(0)) { mapNewAddress[oldAddress[i]] = newAddress[i]; } } } /// @notice View function to calculate the total unclaimed reward for a user. /// @param user The address of the user. /// @return The amount of reward pending to be claimed. 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)].monthlyDirectReward + mapUserInfo[address(user)].receivedFromSale + mapUserInfo[address(user)].extraBonus) - (mapUserInfo[address(user)].claimedAmount); return pending; } else { return 0; } } /// @notice Allows users to claim unclaimed TBC from stage 5. /// @dev Transfers native TBC. function claimTBC() external { require(statusPerStage[5], "Exchange stage is not start yet"); uint256 claimableTBC = stageWiseUserTBC[5][address(msg.sender)] - mapUserInfo[address(msg.sender)].claimedTBC; uint256 balance = address(this).balance; if(claimableTBC > 0 && balance >= claimableTBC) { payable(msg.sender).transfer(claimableTBC); mapUserInfo[address(msg.sender)].claimedTBC += claimableTBC; } } /// @notice Sets the address of the referral contract. /// @param referral The address of the IReferrals contract. function addReferral(address referral) external onlyOwner { require(address(Referrals) == address(0), "Zero address"); Referrals = IReferrals(referral); } /// @notice Sets a user’s working bonus if they meet volume requirements. /// @param topSponsor The sponsor whose sales will be excluded to calculate team volume. /// @param month The monthly index used to calculate the reward. function setWorkingBonus(address topSponsor, uint256 month) external { require(Referrals.getSponsor(topSponsor) == address(msg.sender), "Top sponsor is not correct"); require(workingBonus[address(msg.sender)] == 0, "Working bonus already set"); uint256 topSponsorSale = (monthlySale[address(topSponsor)][month]) + (monthlyPurchase[address(topSponsor)][month]); uint256 allSale = monthlySale[address(msg.sender)][month]; uint256 remainingTeamSale = allSale - topSponsorSale; if(topSponsorSale >= (15000 * 10**18) && remainingTeamSale >= (15000 * 10**18)) { workingBonus[address(msg.sender)] = 500; } } /// @notice Admin sets the required direct business and reward amount for a month. /// @param month Month index. /// @param business Required direct business in TUSD. /// @param reward Reward amount in TUSD. function setMonthlyDirectBusinessReward(uint256 month, uint256 business, uint256 reward) external onlyOwner { require(business > 0, "Business must be > 0"); require(reward > 0, "Reward must be > 0"); require(month == nextRewardDrain || month == nextRewardDrain + 30 days, "Can only set for current or next reward period"); monthlyDirectBusinessReward[month] = MonthlyDirectBusinessReward({ requiredBusiness: business, rewardAmount: reward }); } }

File 5 of 7 : Ownable.sol

// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }

File 6 of 7 : SafeERC20.sol

// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; 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 7 of 7 : draft-IERC20Permit.sol

// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; 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": "TUSDAddress", "type": "address" }, { "internalType": "address", "name": "fundWallet", "type": "address" }, { "internalType": "address", "name": "treasuryWallet", "type": "address" }, { "internalType": "address", "name": "VIAddress", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "inputs": [], "name": "FundWallet", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "Referrals", "outputs": [ { "internalType": "contract IReferrals", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "TUSD", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "TreasuryWallet", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "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" }, { "internalType": "uint256", "name": "holding", "type": "uint256" } ], "name": "buy", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "claimHoldingTBC", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "month", "type": "uint256" } ], "name": "claimMonthlyDirectBusinessReward", "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": "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": "mapNewAddress", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "mapTBCHoldingInfo", "outputs": [ { "internalType": "uint256", "name": "totalTBC", "type": "uint256" }, { "internalType": "uint256", "name": "claimedTBC", "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": "monthlyDirectReward", "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": "monthlyDirectBusiness", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "monthlyDirectBusinessClaimed", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "monthlyDirectBusinessReward", "outputs": [ { "internalType": "uint256", "name": "requiredBusiness", "type": "uint256" }, { "internalType": "uint256", "name": "rewardAmount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "monthlyPurchase", "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": "owner", "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": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "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": "month", "type": "uint256" }, { "internalType": "uint256", "name": "business", "type": "uint256" }, { "internalType": "uint256", "name": "reward", "type": "uint256" } ], "name": "setMonthlyDirectBusinessReward", "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": [], "name": "setStageWiseData", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "investor", "type": "address[]" }, { "internalType": "address[]", "name": "sponsor", "type": "address[]" } ], "name": "setTeam", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "topSponsor", "type": "address" }, { "internalType": "uint256", "name": "month", "type": "uint256" } ], "name": "setWorkingBonus", "outputs": [], "stateMutability": "nonpayable", "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": [], "name": "startSale", "outputs": [], "stateMutability": "nonpayable", "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": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "oldAddress", "type": "address[]" }, { "internalType": "address[]", "name": "newAddress", "type": "address[]" } ], "name": "updateTeam", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "withdrawEarning", "outputs": [], "stateMutability": "nonpayable", "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
0x6040608081526004361015610015575b50600080fd5b600090813560e01c80624a98e814610a9757806306dc731414610a7a5780630b5059ed14610a6257806311ffeaf214610a25578063156129331461095257806316bad3091461093b5780631d63a0a8146109235780632276fbf914610907578063235a18eb146108ef57806324f97835146108b857806326745f2d1461088b578063303256fb1461086f578063357ec6e21461083d57806343bb5c4e1461082257806344122244146108065780634c7cdb82146107c95780634e739773146107ac5780634feab7171461079557806356c1a3bc1461075e57806358dc970d146107425780635aadf4d7146107025780635fb03afd146106de57806366f150e7146106a75780636d6438ac1461068c5780636f20befd14610661578063715018a61461064a57806377d42fc91461062e5780637c917187146106125780637cb936e7146105fa5780637f9efd7c146105cb5780638323550b1461058e57806384cd55051461055c5780638a24bee4146105255780638da5cb5b146104fd57806397c571ad146104cc57806399b008ce146104a65780639e15cf721461046c578063af47cbb914610455578063b66a0e5d1461043e578063c0fa221414610421578063c44f98b6146103e7578063de216f66146103a8578063df32dc5c14610391578063e8aca46a1461037a578063f2fde38b14610363578063f40f0f5214610338578063f7ac68e4146102e2578063fcb11124146102c8578063fe4ca8471461029c5763ffb7a5be14610247575061000f565b3461029857610294915061027d61025d36610c7a565b60018060a01b031660005260366020526040600020906001825492015490565b915190815260208101919091529081906040820190565b0390f35b5080fd5b50346102985761029491506102b036610c3c565b600354905160ff909116151581529081906020820190565b5034610298576102d736610c3c565b6102df6151ca565b51f35b50346102985761029491506103286103196102fc36610d62565b6001600160a01b0390911660009081526042602052604090209091565b90600052602052604060002090565b5490519081529081906020820190565b503461029857610294915061035461034f36610c7a565b61512f565b90519081529081906020820190565b5034610298576102df61037536610c7a565b6155fe565b5034610298576102df61038c36610c7a565b6152ae565b5034610298576102df6103a336610ac6565b614e4f565b5090346103e257506103b936610c3c565b517f00000000000000000000000000000000000000000000000000000000000003e88152602090f35b809150fd5b5090346103e257506103f836610c3c565b517f00000000000000000000000000000000000000000000000000000000000002008152602090f35b503461029857610294915061035461043836610fbe565b91610fe1565b50346102985761044d36610c3c565b6102df6128b8565b50346102985761046436610c3c565b6102df6126e6565b5090346103e2575061047d36610c3c565b517f00000000000000000000000000000000000000000000000000000000000002008152602090f35b50346102985761029491506104ba36610c3c565b60025490519081529081906020820190565b50346102985761029491506103286104f86104e636610fa2565b9190600052603f602052604060002090565b610d4b565b5034610298576102949161051036610c3c565b5490519182916001600160a01b031682610c55565b503461029857610294915061032861031961053f36610d62565b6001600160a01b039091166000908152603a602052604090209091565b503461029857610294915061035461057336610c7a565b6001600160a01b031660009081526038602052604090205490565b5090346103e2575061059f36610c3c565b51806102947f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f245782610c55565b503461029857610294915061027d6105e236610ac6565b60005260436020526040600020906001825492015490565b5034610298576102df61060c36610d62565b9061532c565b503461029857610294915061035461062936610ac6565b610f92565b503461029857610294915061035461064536610ac6565b610f82565b50346102985761065936610c3c565b6102df6155af565b503461029857610294915061067536610c3c565b60015490519182916001600160a01b031682610c55565b5034610298576102df61069e36610e60565b92919091615063565b50346102985761029491506103286103196106c136610d62565b6001600160a01b039091166000908152603b602052604090209091565b5034610298576102df6106f036610f29565b99989098979197969296959395611511565b503461029857610294915061073761071936610c7a565b6001600160a01b039081166000908152604160205260409020541690565b905191829182610c55565b503461029857610294915061035461075936610ac6565b610f19565b503461029857610294915061032861031961077836610d62565b6001600160a01b0390911660009081526044602052604090209091565b5034610298576102df6107a736610ac6565b614bc6565b50346102985761029491506107376107c336610b86565b90610ee4565b5090346103e257506107da36610c3c565b51806102947f0000000000000000000000005e59110f5a8089b4ba7378347c85b85bfe1fe46e82610c55565b503461029857610294915061035461081d36610ac6565b610ed4565b5034610298576102df61083436610e60565b92919091611cff565b503461029857610294915061035461085436610c7a565b6001600160a01b031660009081526039602052604090205490565b503461029857610294915061035461088636610ac6565b610e17565b50346102985761029491506108a76108a236610ac6565b610db7565b905190151581529081906020820190565b50346102985761029491506103286103196108d236610d62565b6001600160a01b039091166000908152603c602052604090209091565b5034610298576102df61090136610b86565b906123db565b503461029857610294915061035461091e36610ac6565b610d81565b5034610298576102df61093536610d62565b90614568565b50346102985761094a36610c3c565b6102df614fd0565b50346102985761029491506109c861096936610c7a565b60018060a01b0316600052603760205260406000209081549160018101549160028201549160038101549160048201549160058101549160068201549160078101549160088201549160098101549160ff600b600a8401549301541690565b9b519a8b5260208b019990995260408a01979097526060890195909552608088019390935260a087019190915260c086015260e0850152610100840152610120830152610140820152901515610160820152908190610180820190565b5090346103e25750610a3636610c3c565b51806102947f000000000000000000000000754f74e467835e25ab1b3554de2c69860c472c7482610c55565b5034610298576102df610a7436610c22565b916153fe565b5034610298576102949150610354610a9136610b86565b90610bf0565b505034610ac35750607f19610abe610ab6610ab136610ac6565b610b6f565b60805260a090565b016080f35b80fd5b602090600319011261000f5760043590565b50634e487b7160e01b600052603260045260246000fd5b6006811015610b02575b60180190600090565b610b0a610ad8565b610af9565b6006811015610b22575b60230190600090565b610b2a610ad8565b610b19565b6006811015610b42575b60290190600090565b610b4a610ad8565b610b39565b6006811015610b62575b602f0190600090565b610b6a610ad8565b610b59565b6006811015610b7f576018015490565b5050600080fd5b604090600319011261000f576004359060243590565b6005600052603d6020527fa8d410acd00f76bbae43eed75f7ab195b28d7e9ca8db5f6ee13019df18a0a78d90565b8054821015610be3575b60005260206000200190600090565b610beb610ad8565b610bd4565b600052603d6020526040600020908154811015610c1a57610c1091610bca565b90549060031b1c90565b505050600080fd5b606090600319011261000f57600435906024359060443590565b600090600319011261000f57565b600091031261000f57565b6001600160a01b03909116815260200190565b6001600160a01b038116141561000f57565b602090600319011261000f57600435610c9281610c68565b90565b6001600160a01b0316600090815260376020526040902090565b6001600160a01b0316600090815260366020526040902090565b6001600160a01b0316600090815260386020526040902090565b6001600160a01b03166000908152603a6020526040902090565b6001600160a01b0316600090815260416020526040902090565b6001600160a01b03166000908152603b6020526040902090565b6001600160a01b0316600090815260396020526040902090565b9060018060a01b0316600052602052604060002090565b604090600319011261000f57600435610d7a81610c68565b9060243590565b6006811015610b7f57602f015490565b906006821015610daa575b601f8260051c603501921690565b610db2610ad8565b610d9c565b6006811015610b7f578060f860ff9260051c603501549160031b161c1690565b600a811015610dea575b600e0190600090565b610df2610ad8565b610de1565b600a811015610e0a575b60040190600090565b610e12610ad8565b610e01565b600a811015610b7f57600e015490565b9181601f84011215610c1a578235916001600160401b038311610e57576020808501948460051b010111610c1a57565b50505050600080fd5b6040600319820112610b7f576001600160401b0391600435838111610e575782610e8c91600401610e27565b93909392602435918211610eaa57610ea691600401610e27565b9091565b5050505050600080fd5b6005811015610ec7575b601e0190600090565b610ecf610ad8565b610ebe565b6005811015610b7f57601e015490565b600052603e6020526040600020908154811015610c1a57610f0491610bca565b905460039190911b1c6001600160a01b031690565b6006811015610b7f576023015490565b61016090600319011261000f576004359060243590604435610f4a81610c68565b90606435610f5781610c68565b90608435610f6481610c68565b9060a4359060c4359060e43590610104359061012435906101443590565b600a811015610b7f576004015490565b6006811015610b7f576029015490565b604090600319011261000f5760043590602435610c9281610c68565b606090600319011261000f5760043590602435610fda81610c68565b9060443590565b90610ff89160005260406020526040600020610d4b565b908154811015610c1a57610c1091610bca565b1561101257565b5060405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606490fd5b1561104e57565b5060405162461bcd60e51b815260206004820152601e60248201527f526566657272616c2061646472657373206e6f742061646465642079657400006044820152606490fd5b1561109b57565b5060405162461bcd60e51b815260206004820152602260248201527f496e766573746d656e74207061636b61676573206973206e6f7420636f72726560448201526118dd60f21b6064820152608490fd5b50634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761111e57604052565b6111266110ec565b604052565b90601f801991011681019081106001600160401b0382111761111e57604052565b90816020910312610b7f575190565b506040513d6000823e3d90fd5b1561116f57565b5060405162461bcd60e51b815260206004820152602960248201527f545553442062616c616e6365206e6f7420617661696c61626c6520666f7220696044820152681b9d995cdd1b595b9d60ba1b6064820152608490fd5b156111ce57565b5060405162461bcd60e51b815260206004820152602960248201527f496e766573746f7220616e642073706f6e736f722063616e27742062652073616044820152681b59481dd85b1b195d60ba1b6064820152608490fd5b1561122d57565b5060405162461bcd60e51b815260206004820152602b60248201527f53616c65206973206e6f742073746172746564207965742c206f6e6c79206f6e60448201526a7765722063616e2062757960a81b6064820152608490fd5b90816020910312610b7f5751610c9281610c68565b156112a357565b5060405162461bcd60e51b815260206004820152601660248201527514dc1bdb9cdbdc881a5cc81b9bdd0818dbdc9c9958dd60521b6044820152606490fd5b6001600160a01b0391821681529116602082015260400190565b50634e487b7160e01b600052601160045260246000fd5b670de0b6b3a7640000908060001904821181151516611330570290565b6113386112fc565b0290565b6014908060001904821181151516611330570290565b601e908060001904821181151516611330570290565b80600019046002118115151661137f575b60011b90565b6113876112fc565b611379565b681043561a8829300000908060001904821181151516611330570290565b8060001904821181151516611330570290565b81156113c7570490565b505050634e487b7160e01b600052601260045260246000fd5b156113e757565b5060405162461bcd60e51b815260206004820152601760248201527614dd1859d9481a5cc81b9bdd081858dd1a5d99481e595d604a1b6044820152606490fd5b1561142e57565b5060405162461bcd60e51b815260206004820152601a602482015279544243206e6f7420617661696c61626c6520666f722073616c6560301b6044820152606490fd5b62278d009062278d00198111611485570190565b61148d6112fc565b0190565b6001906001198111611485570190565b81198111611485570190565b156114b457565b5060405162461bcd60e51b815260206004820152601e60248201527f537461676577697365207368617265206973206e6f7420636f727265637400006044820152606490fd5b818110611505570390565b61150d6112fc565b0390565b909992989197929594929061161790610c10906115fb6001600160a01b038d1661153c81151561100b565b60015461156a9061156390611557906001600160a01b031681565b6001600160a01b031690565b1515611047565b61157660068410611094565b6040516370a0823160e01b81526115ea90602081806115983360048301610c55565b03817f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f24576001600160a01b03165afa908115611cf2575b600091611cdd575b506115e3610c1086610aef565b1115611168565b6001600160a01b038d1614156111c7565b61160e61160a60035460ff1690565b1590565b611cc157610aef565b9861164d8a30337f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f24576001600160a01b03166156eb565b600154611662906001600160a01b0316611557565b60405163743fc74560e01b8152602081806116808e60048301610c55565b0381855afa908115611cb4575b600091611c9f575b506001600160a01b031615611bed575b50509261194c9992886119479896938b98966116cb61155760015460018060a01b031690565b986020604051809b63743fc74560e01b825281806116ec8960048301610c55565b03915afa998a15611be0575b60009a611ba6575b50918798999a918a9361172c61171a6117f49b9795611313565b611726610c1089610eb4565b906113bd565b988997889561175261174d6117408b610d91565b905460ff9160031b1c1690565b6113e0565b61176987611762610c108c610b0f565b1015611427565b8815978815611b04576117a39761179861179e926117938a6117938b6117938c6117938d8d6114a1565b6114a1565b146114ad565b6134aa565b15611af3575b50505060025480421015611adc575b506117db6117c584610b0f565b9190926117d68385549060031b1c90565b6114fa565b9082549060031b600019811b9283911b16911916179055565b61180e611802601854611313565b611726610c1084610eb4565b61181a610c1083610b0f565b10611aa8575b5061183561182d85610caf565b9182546114a1565b905561184083610c95565b61184b8582546114a1565b905561185681610cc9565b6118618582546114a1565b905560015460039061187b906001600160a01b0316611557565b6040516380f78b3f60e01b81526001600160a01b03841660048201526000602482015290602090829060449082905afa908115611a9b575b600091611a86575b50101580611a6a575b80611a4b575b611a2a575b6001600160a01b03811660009081526042602052604090206118fd905b600254600052602052604060002090565b6119088582546114a1565b90556119166118ec84610ce3565b6119218582546114a1565b905561192d84846135f2565b6119378484613c48565b61194081610cc9565b5490613fbe565b613af7565b6040516370a0823160e01b81526119fd906020818061196e3060048301610c55565b03817f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f24576001600160a01b03165afa908115611a1d575b6000916119ff575b507f000000000000000000000000754f74e467835e25ab1b3554de2c69860c472c747f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f24576001600160a01b03166156aa565b565b611a179150611a0e3d8261112b565b3d81019061114c565b386119ac565b611a2561115b565b6119a4565b611a46600b611a3883610c95565b01805460ff19166001179055565b6118cf565b50611a6561160a600b611a5d84610c95565b015460ff1690565b6118ca565b50685150ae84a8cdf00000611a7e82610cc9565b5410156118c4565b611a959150611a0e3d8261112b565b386118bb565b611aa361115b565b6118b3565b611abc611ab7611ad692611491565b610d91565b60019082549060031b60ff811b9283911b16911916179055565b38611820565b611ae8611aed91611471565b600255565b386117b8565b611afc926128dc565b3881846117a9565b9091506001891415611b3757611b3296611798611b2d92611793896117938a6117938b8b6114a1565b613369565b6117a3565b9091506002881415611b6157611b3295611798611b5c926117938861179389896114a1565b61309d565b505050915060038414600014611b8d5781611b87866117988d61179386611b32986114a1565b8d612f93565b611b329150611ba0856117988c846114a1565b8c612ecb565b899a50918899939161172c61171a611bd06117f49c9896611bc73d8261112b565b3d810190611287565b9d50505091939950919397611700565b611be861115b565b6116f8565b611c0a611c02839997949a98959d9693610c95565b54151561129c565b803b15611c8d5761194c9b61194799600080611c418f9c958f96604051948580948193639d58b15d60e01b83528b600484016112e2565b03925af18015611c80575b611c63575b50939698509396985081949b506116a5565b611c7a90611c713d8261112b565b3d810190610c4a565b38611c51565b611c8861115b565b611c4c565b50505050505050505050505050600080fd5b611cae9150611bc73d8261112b565b38611695565b611cbc61115b565b61168d565b600054611cd8906001600160a01b03163314611226565b610aef565b611cec9150611a0e3d8261112b565b386115d6565b611cfa61115b565b6115ce565b919290611d0a615555565b600391611d23611d1e61160a855460ff1690565b612221565b6001805490956001600160a01b039391611d4c908590611d44908216611557565b161515611047565b7f000000000000000000000000bca8294e350f5247ce0efb590f9c97cc2712736184169160005b818110611d8557505050505050505050565b611db3611557611da6611da1611d9c85878e612275565b612293565b610cfd565b546001600160a01b031690565b61220757611dc5611d9c82848b612275565b905b86868b858c898d87868c611de8611557611da6611da1611d9c878787612275565b6121ed5791611d9c91611dfa93612275565b945b546001600160a01b031694611e12898686612275565b611e1b90612293565b958c8a6040998a519b63743fc74560e01b8d5260209c8d818060049e8f820190611e4491610c55565b0381895afa9081156121e0575b6000916121cb575b50161592836121ad575b5050506120fb575b5050878484611fd28a611ff696611eb76120339f611d9c9861200e9f9d9b829f8d819f611d9c8d611e9f9261016096612275565b9151631561293360e01b815295869283928301610c55565b0381875afa9081156120ee575b600080818093819782966120ac575b5091611f24959391879593611ee9600899610c95565b01556005611ef686610c95565b01556006611f0385610c95565b01556007611f1084610c95565b01556009611f1d83610c95565b0155610c95565b0155611f3d8c611f38611d9c898989612275565b6122fe565b8b611f868b84611f51611d9c8b8b8b612275565b60025492516366f150e760e01b81526001600160a01b03909116818f0190815260208101849052909384918291604090910190565b0381875afa91821561209f575b600092612082575b50610319611fa99293610d17565b55611fb8611d9c878787612275565b908a518080958194631abf637160e11b83528d8301610c55565b03915afa908115612075575b600091612060575b50611ff08a610d31565b55612275565b91516384cd550560e01b815294859283928301610c55565b03818a5afa918215612053575b600092612038575b5061202d90610cc9565b55612265565b611d73565b61202d91925061204c90611a0e3d8261112b565b9190612023565b61205b61115b565b61201b565b61206f9150611a0e3d8261112b565b38611fe6565b61207d61115b565b611fde565b611fa9925061209861031991611a0e3d8261112b565b9250611f9b565b6120a761115b565b611f93565b9250965050611f24935060089492506120d391506120ca3d8261112b565b3d8101906122ab565b50919c999b909a509198929750929550929350919050611ed3565b6120f661115b565b611ec4565b97959350989593505050843b1561219857611ff6611d9c8f8f8991611fd28f89908f946120339f611eb79161200e9f8f926000908f928f838791612152965196879586948593639d58b15d60e01b855284016112e2565b03925af1801561218b575b612177575b50985050509650505094969850949699611e6b565b61218590611c713d8261112b565b38612162565b61219361115b565b61215d565b50505050505050505050505050505050600080fd5b6121c0935091611d9c9161155793612275565b15158f8b908f611e63565b6121da9150611bc73d8261112b565b38611e59565b6121e861115b565b611e51565b611d9c61220193611da693611da193612275565b94611dfc565b61221b611da6611da1611d9c84868d612275565b90611dc7565b1561222857565b5060405162461bcd60e51b815260206004820152601460248201527314d85b1948185b1c9958591e481cdd185c9d195960621b6044820152606490fd5b6001906000198114611485570190565b9190811015612286575b60051b0190565b61228e610ad8565b61227f565b35610c9281610c68565b5190811515821415610b7f57565b9081610160910312610b7f5780519160208201519160408101519160608201519160808101519160a08201519160c08101519160e08201519161010081015191610c92610140610120840151930161229d565b604051631561293360e01b81526001600160a01b039182166004820152919061016090839060249082907f000000000000000000000000bca8294e350f5247ce0efb590f9c97cc27127361165afa9182156123ce575b6000808092819561239e575b5091839161238c93612373600b96610c95565b55600161237f84610c95565b01556002611f1d83610c95565b019060ff801983541691151516179055565b9050600b93945061238c92506123b991506120ca3d8261112b565b9c9b979a509798975061236095505050505050565b6123d661115b565b612354565b91906123e5615555565b6123f7611d1e61160a60035460ff1690565b61240b83600052603d602052604060002090565b54916001600160a01b037f000000000000000000000000bca8294e350f5247ce0efb590f9c97cc27127361811692909190845b61244882876114a1565b811015612651579061254c612448926125288960406124e4898251634e73977360e01b815260208d86898385806124916004948686840160209093929193604081019481520152565b0381865afa948515612644575b60009561262d575b506124b6611557611da687610cfd565b61261b5784975b80516301b71cc560e21b8152828101848152602081018e9052909886918a91829160400190565b0381875afa97881561260e575b6000986125ef575b50516397c571ad60e01b81529081019182526001600160a01b0385166020830152988992918391829160400190565b03915afa9586156125e2575b6000966125cb575b5016612554575b50505050612265565b90915061243e565b816125a8846125986125ad946125848a61257f876104f86125c19c6000526040602052604060002090565b61265a565b61257f83600052603d602052604060002090565b600052603e602052604060002090565b6126a6565b6104f88c600052603f602052604060002090565b5538898180612543565b6125db919650611a0e3d8261112b565b943861253c565b6125ea61115b565b612534565b8694939291985061260490611a0e3d8261112b565b97909192936124f9565b61261661115b565b6124f1565b612627611da686610cfd565b976124bd565b61263d919550611bc73d8261112b565b93386124a6565b61264c61115b565b61249e565b50509350505050565b80546119fd929161267e9190600160401b821015612699575b600182018155610bca565b90919082549060031b600019811b9283911b16911916179055565b6126a16110ec565b612673565b80546126c391600160401b82101561269957600182018155610bca565b819291549060031b9160018060a01b039283811b93849216901b16911916179055565b6126ee615555565b612700611d1e61160a60035460ff1690565b7f000000000000000000000000bca8294e350f5247ce0efb590f9c97cc271273616001600160a01b031660005b60068110612739575050565b6128309061282b6127ee60408381516358dc970d60e01b815260209261278f60049285818c81806127718a8a83019190602083019252565b03915afa908115612897575b600091612882575b5061267e85610b0f565b6127d28151637c91718760e01b815285818c81806127b48a8a83019190602083019252565b03915afa908115612875575b600091612860575b5061267e85610b2f565b5193849283926326745f2d60e01b845283019190602083019252565b0381885afa908115612853575b600091612835575b5061280d83610d91565b90919082549060031b9160ff831b9283911515901b16911916179055565b612265565b61272d565b61284d91506128443d8261112b565b3d8101906128a4565b38612803565b61285b61115b565b6127fb565b61286f9150611a0e3d8261112b565b386127c8565b61287d61115b565b6127c0565b6128919150611a0e3d8261112b565b38612785565b61289f61115b565b61277d565b90816020910312610b7f57610c929061229d565b6128c0615555565b60016003546128d260ff821615612221565b60ff191617600355565b916128f06128e98261133c565b6064900490565b6001600160a01b0393909190808516612c17575b50906117936128e961291593611352565b90612922610c1082610b2f565b915b61293882600052603d602052604060002090565b54831015612c1157612960610c108461295b85600052603d602052604060002090565b610bca565b80612979575b50909161297290612265565b9190612924565b818110612acf57509061267e916119fd94612a1e612a106129ab610f048861295b88600052603e602052604060002090565b936129c4856104f888600052603f602052604060002090565b6129cf8282546114fa565b90556129fe6129ec8961295b89600052603d602052604060002090565b6117db846117d68385549060031b1c90565b612a0a610c1087610eb4565b906113aa565b670de0b6b3a7640000900490565b91612a3f612a37612a31610c1087610b4f565b856113aa565b612710900490565b92612a4a84826114fa565b612a616007612a5885610c95565b019182546114a1565b9055612a6d84826114fa565b612a7b6009612a5885610c95565b905560035460ff16612a91575b50505050610b2f565b612ac693612a9e916114fa565b917f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f2457166156aa565b38808080612a88565b919261297291612af0610f048361295b88600052603e602052604060002090565b612b08816104f888600052603f602052604060002090565b612b138682546114fa565b9055612b41612b308461295b89600052603d602052604060002090565b8154906000199060031b1b19169055565b612baf612b5c612a10612b56610c108a610eb4565b886113aa565b95612b75612a37612b6f610c108b610b4f565b896113aa565b93612b8085896114fa565b612b8e6007612a5887610c95565b9055612b9a85896114fa565b612ba86009612a5887610c95565b90556114fa565b94612bbd8461267e89610b2f565b60035460ff16612bd3575b505050929190612966565b612c0992612be0916114fa565b90877f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f2457166156aa565b388080612bc8565b50505050565b600095939194929594855b612c3a836104f8866000526040602052604060002090565b54811015612eb257612c61610c108261295b866104f8896000526040602052604060002090565b612c7c610c108261295b88600052603d602052604060002090565b80612c92575b5050612c8d90612265565b612c22565b96989597949693959294939091838210612dac5750509261179392612d07612a106128e994612cfb6129ec8a99612cda6129159c6104f88f600052603f602052604060002090565b612ce58582546114fa565b905561295b8d600052603d602052604060002090565b612a0a610c108b610eb4565b94612d1a612a37612b56610c108b610b4f565b91612d2583886114fa565b612d336007612a5885610c95565b9055612d3f83886114fa565b612d4d6009612a5885610c95565b905595612d5c60035460ff1690565b612d6e575b5050505b92935050612904565b612da492612d7b916114fa565b90897f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f2457166156aa565b388080612d61565b9098969492612df8612b30612c8d948c612de2612dda8c9a9e9c6104f88d600052603f602052604060002090565b9182546114fa565b905561295b89600052603d602052604060002090565b612e5a612e13612a10612e0d610c108a610eb4565b8d6113aa565b9a8b92612e4c612e31612a37612e2b610c108d610b4f565b876113aa565b858a612ba86007612a58612e4686809c6114fa565b93610c95565b612ba86009612a588b610c95565b99612e6760035460ff1690565b612e75575b50509038612c82565b612eab91612e82916114fa565b85887f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f2457166156aa565b3880612e6c565b5061291593955061179391506128e99096929496612d65565b81612ed4575050565b60056000526040602052612f8f9061182d90612f22612f13827fb98b004094dddbdff1aed9095505d5018e180f46e8506818cf2e3aa288a7ecf7610d4b565b612f1b610b9c565b549061265a565b612f2e8461257f610b9c565b6005600052603e602052612f62817fde40ddd8a8a89c992d99ca0ada2a7e666b9bd2f777166a55a52779c0ae85aed26126a6565b612f6e846028546114a1565b6028556005600052603f602052600080516020615983833981519152610d4b565b9055565b9080612fa4575b5081612ed4575050565b60046000526040602052612ff9612fdb837f42bfb2abe149a1100dc9b36dbf98f1e7fe53c01b7c31bf8fcd294d764e214da4610d4b565b6004600052603d602052600080516020615963833981519152612f1b565b6004600052603d60205261301b8160008051602061596383398151915261265a565b6004600052603e60205261304f827f300686b07df8c6d4fed9de20e382b97a3e388833f492b69c1a052f6ebd6497b06126a6565b61305b816027546114a1565b6027556004600052603f60205261309561182d837f037c5ed03d51749cfd9298d610e0ec9cb2039430d72eaca4715465364be41d43610d4b565b905538612f9a565b919080613247575b5080613167575b50816130b6575050565b60056000526040602052612f8f9061182d906130f5612f13827fb98b004094dddbdff1aed9095505d5018e180f46e8506818cf2e3aa288a7ecf7610d4b565b6131018461257f610b9c565b6005600052603e602052613135817fde40ddd8a8a89c992d99ca0ada2a7e666b9bd2f777166a55a52779c0ae85aed26126a6565b613149613144856028546114a1565b602855565b6005600052603f602052600080516020615983833981519152610d4b565b6004600052604060205261319e612fdb837f42bfb2abe149a1100dc9b36dbf98f1e7fe53c01b7c31bf8fcd294d764e214da4610d4b565b6004600052603d6020526131c08160008051602061596383398151915261265a565b6004600052603e6020526131f4827f300686b07df8c6d4fed9de20e382b97a3e388833f492b69c1a052f6ebd6497b06126a6565b613208613203826027546114a1565b602755565b6004600052603f60205261323f61182d837f037c5ed03d51749cfd9298d610e0ec9cb2039430d72eaca4715465364be41d43610d4b565b9055386130ac565b600360005260406020526132ae61327e847fb165e78d239e02d33731b73b0fb60f4a9c193244ed24e9eedaad71548297af2b610d4b565b6003600052603d6020527fa831081d1a2d7a5cfee7efc291804d4de06676f57c5561b59e5f4cb1921d919a612f1b565b6003600052603d6020526132e2817fa831081d1a2d7a5cfee7efc291804d4de06676f57c5561b59e5f4cb1921d919a61265a565b6003600052603e602052613316837fa85ba2164933dad3462192a5146147f252b8ada5145fc70dfe9be195bf10a8db6126a6565b61332a613325826026546114a1565b602655565b6003600052603f60205261336161182d847f946320853ff8367f48c31f5926e4236ecd3fee702e2919e09421d481da063e8e610d4b565b9055386130a5565b92919080613388575b50806132475750806131675750816130b6575050565b600260005260406020526133ef6133bf857f99bc547f166b5932f754821d2631dc84804a425a7bcb1caf7e488ea823036dda610d4b565b6002600052603d6020527f9b83e22ae1fc17f33c6807bd666c3fec23f86de17b61bd411ed4728f7b928da9612f1b565b6002600052603d602052613423817f9b83e22ae1fc17f33c6807bd666c3fec23f86de17b61bd411ed4728f7b928da961265a565b6002600052603e602052613457847fe2dd079769adc29c98f3e5900e2ea53e4880b1989d8a5de753fc27b0d83ee9136126a6565b61346b613466826025546114a1565b602555565b6002600052603f6020526134a261182d857fcb7b1f208dd0ddcbd15bbefbb50b95959a9ca518e726c9f1c88cfe0bcc045ffb610d4b565b905538613372565b93929190806134d0575b50806133885750806132475750806131675750816130b6575050565b60016000526040602052613537613507867f79e068d87311f0999d8cc460f83efdb75159f5d2a58c037053e1489685917ab3610d4b565b6001600052603d6020527ff68b062fcb2bf49b51918594cc4193270fef1a264c802eb8940dafb530231ea4612f1b565b6001600052603d60205261356b817ff68b062fcb2bf49b51918594cc4193270fef1a264c802eb8940dafb530231ea461265a565b6001600052603e60205261359f857fae78b1325812a8a7d69d497dd950a8406b6cd373f338d119e8d81f39e42806fa6126a6565b6135b36135ae826024546114a1565b602455565b6001600052603f6020526135ea61182d867f953e9efc9ff2c098dec47e0564cbd7c91b2b36ee20dc4c893b4fdd2ea3408711610d4b565b9055386134b4565b6001805491929161360b906001600160a01b0316611557565b926040908151948563743fc74560e01b9182825260209788918180613634600498898301610c55565b03915afa908115613aea575b600091613ad5575b50936000945b600a8610613661575b5050505050505050565b6001600160a01b039080821615613acf57888161373e93888b8b8986613723988d6136956115578e5460018060a01b031690565b87516380f78b3f60e01b81526001600160a01b038416818401908152600060208201529095919291908590879081906040010381865afa958615613ac2575b600096613aab575b506136e9610c1088610dd7565b861015613766575b50508c5461371198506001600160a01b0316965061155795505050505050565b885180809581948a83528b8301610c55565b03915afa908115613759575b600091613744575b5095612265565b9461364e565b6137539150611bc73d8261112b565b38613737565b61376161115b565b61372f565b61377b98519889948593849384528301610c55565b03915afa938415613a9e575b600094613a87575b50811580918192613a7b575b501561389857506137bd91612a0a6137b8610c10612a3794610df7565b611368565b906137cc600b611a5d83610c95565b61385b575b50866137dc84610c95565b016137e88282546114a1565b905560096137f584610c95565b016138018282546114a1565b90558261381060035460ff1690565b613828575b5050505b38888b8b838686828e8e6136f1565b613853927f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f2457166156aa565b388082613815565b6138929061388c612a377f00000000000000000000000000000000000000000000000000000000000003e8856113aa565b9061432c565b386137d1565b1561397a576138b091612a0a610c10612a3793610df7565b906138bf600b611a5d83610c95565b613943575b50866138cf84610c95565b016138db8282546114a1565b905560096138e884610c95565b016138f48282546114a1565b90558261390360035460ff1690565b613910575b505050613819565b61393b927f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f2457166156aa565b388082613908565b6139749061388c612a377f00000000000000000000000000000000000000000000000000000000000003e8856113aa565b386138c4565b685150ae84a8cdf0000061398d86610cc9565b54101561399e575b50505050613819565b6139b191612a0a610c10612a3793610df7565b906139c0600b611a5d83610c95565b613a44575b50866139d084610c95565b016139dc8282546114a1565b905560096139e984610c95565b016139f58282546114a1565b905582613a0460035460ff1690565b613a11575b508b8b613995565b613a3c927f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f2457166156aa565b388082613a09565b613a759061388c612a377f00000000000000000000000000000000000000000000000000000000000003e8856113aa565b386139c5565b6005915010153861379b565b613a97919450611bc73d8261112b565b923861378f565b613aa661115b565b613787565b613abb919650611a0e3d8261112b565b94386136dc565b613aca61115b565b6136d4565b50613657565b613ae49150611bc73d8261112b565b38613648565b613af261115b565b613640565b60018054919291613b10906001600160a01b0316611557565b926040908151948563743fc74560e01b9182825260209788918180613b39600498898301610c55565b03915afa908115613c3b575b600091613c26575b507f000000000000000000000000000000000000000000000000000000000000020095600095915b878710613b88575b505050505050505050565b6001600160a01b03811615613c2157613bde8982613bab6118ec613bf995610d17565b613bb68682546114a1565b90558554613bcc906001600160a01b0316611557565b895180809581948b83528c8301610c55565b03915afa908115613c14575b600091613bff575b5096612265565b95613b75565b613c0e9150611bc73d8261112b565b38613bf2565b613c1c61115b565b613bea565b613b7d565b613c359150611bc73d8261112b565b38613b4d565b613c4361115b565b613b45565b60018054919291613c61906001600160a01b0316611557565b906040938451928363743fc74560e01b9182825260209586918180613c8a600498898301610c55565b03915afa908115613fb1575b600091613f9c575b507f000000000000000000000000000000000000000000000000000000000000020095600094915b878610613cd857505050505050505050565b6001600160a01b0381811615613f9657613cf182610d31565b54613d2e57508254613d289161372391899190613d16906001600160a01b0316611557565b8c5180809581948b83528c8301610c55565b94613cc6565b97509597939450613d4f9250612a379150613d4886610d31565b54906113aa565b80947f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f24571695825190826370a0823160e01b92838152828180613d93308b8301610c55565b03818d5afa908115613f89575b600091613f74575b5010613e0c5750505050506005613dbe82610c95565b01613dca8382546114a1565b90556009613dd782610c95565b01613de38382546114a1565b905560035460ff16613dfb575b808080808080613b7d565b613e04926156aa565b388080613df0565b7f0000000000000000000000005e59110f5a8089b4ba7378347c85b85bfe1fe46e948592848651636eb1769f60e11b815284818d8180613e4f308c8b84016112e2565b03915afa908115613f67575b600091613f52575b5010159586613ef5575b505050505050600014613ed3576005613e8583610c95565b01613e918482546114a1565b90556009613e9e83610c95565b01613eaa8482546114a1565b905560035460ff16613ec1575b8080808080613b7d565b613eca936156eb565b38808080613eb7565b50613ee5919250612a58600591610c95565b9055388080808080808080613b7d565b51908152939450909183918291613f0d918301610c55565b0381895afa908115613f45575b600091613f30575b501015838238808080613e6d565b613f3f9150611a0e3d8261112b565b38613f22565b613f4d61115b565b613f1a565b613f619150611a0e3d8261112b565b38613e63565b613f6f61115b565b613e5b565b613f839150611a0e3d8261112b565b38613da8565b613f9161115b565b613da0565b50613b7d565b613fab9150611bc73d8261112b565b38613c9e565b613fb961115b565b613c96565b9068a2a15d09519be00000613fd3910461138c565b6002613fde83610c95565b01548111613fea575050565b614001906002613ff984610c95565b0154906114fa565b600154614016906001600160a01b0316611557565b6040519061405a600b611a5d63743fc74560e01b948581526020818061403f8b60048301610c55565b0381885afa90811561431f575b60009161430a575b50610c95565b614282575b50506040516370a0823160e01b8082527f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f24576001600160a01b031693918390602081806140ae3060048301610c55565b0381895afa908115614275575b600091614260575b5010614114575060026140d582610c95565b016140e18382546114a1565b905560096140ee82610c95565b016140fa8382546114a1565b905560035460ff1661410b57505050565b6119fd926156aa565b7f0000000000000000000000005e59110f5a8089b4ba7378347c85b85bfe1fe46e908380604051636eb1769f60e11b8152602081806141573089600484016112e2565b03818b5afa908115614253575b60009161423e575b50101591826141e3575b5050156141d157600261418883610c95565b016141948482546114a1565b905560096141a183610c95565b016141ad8482546114a1565b905560035460ff166141bf5750505050565b6141c8936156eb565b38808080612c11565b50612f8f919250612a58600291610c95565b909150604051908152602081806141fd8660048301610c55565b0381895afa908115614231575b60009161421c575b5010158338614176565b61422b9150611a0e3d8261112b565b38614212565b61423961115b565b61420a565b61424d9150611a0e3d8261112b565b3861416c565b61425b61115b565b614164565b61426f9150611a0e3d8261112b565b386140c3565b61427d61115b565b6140bb565b60206142e1926040519283918252818061429f8960048301610c55565b03915afa9081156142fd575b6000916142e8575b5061388c612a377f00000000000000000000000000000000000000000000000000000000000003e8856113aa565b388061405f565b6142f79150611bc73d8261112b565b386142b3565b61430561115b565b6142ab565b6143199150611bc73d8261112b565b38614054565b61432761115b565b61404c565b906001600160a01b0380831661434157505050565b7f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f24571691604051826370a0823160e01b91828152602081806143853060048301610c55565b0381895afa9081156144c4575b6000916144af575b50106143ac575060066140d582610c95565b7f0000000000000000000000005e59110f5a8089b4ba7378347c85b85bfe1fe46e908380604051636eb1769f60e11b8152602081806143ef3089600484016112e2565b03818b5afa9081156144a2575b60009161448d575b5010159182614432575b50501561442057600661418883610c95565b50612f8f919250612a58600691610c95565b9091506040519081526020818061444c8660048301610c55565b0381895afa908115614480575b60009161446b575b501015833861440e565b61447a9150611a0e3d8261112b565b38614461565b61448861115b565b614459565b61449c9150611a0e3d8261112b565b38614404565b6144aa61115b565b6143fc565b6144be9150611a0e3d8261112b565b3861439a565b6144cc61115b565b614392565b156144d857565b5060405162461bcd60e51b815260206004820152601e60248201527f4d6f6e74686c792072657761726420616c726561647920636c61696d656400006044820152606490fd5b1561452557565b5060405162461bcd60e51b815260206004820152601a602482015279151bdc081cdc1bdb9cdbdc881a5cc81b9bdd0818dbdc9c9958dd60321b6044820152606490fd5b9061459361458c826103193360018060a01b0316600052603c602052604060002090565b54156144d1565b6001546145a8906001600160a01b0316611557565b906040519260208463743fc74560e01b9485825281806145cb8660048301610c55565b03915afa938415614b23575b600094614b08575b506001600160a01b039361461d91906145fb908616331461451e565b6146168361031961460f8261031986610d17565b5493610ce3565b54906114a1565b916146358361462f8461031933610d17565b546114fa565b9360006a084595161401484a000000808610159081614afd575b501561496a575069d3c21bcecceda1000000915b821515806148c7575b80614825575b6146ce575b5050505069032d26d12e980b6000008091101591826146c3575b5050806146b2575b61469f57565b6119fd6146ab33610d31565b6101f49055565b506146bc33610d31565b5415614699565b101590503880614691565b336000908152603c602052604090206147c39484916146ed9190610319565b55600154602090614706906001600160a01b0316611557565b6040519283528290818061471d3360048301610c55565b03915afa908115614818575b600091614803575b50614740600b611a5d83610c95565b6147cc575b50600361475133610c95565b0161475d8382546114a1565b9055600961476a33610c95565b016147768382546114a1565b905533907f0000000000000000000000005e59110f5a8089b4ba7378347c85b85bfe1fe46e907f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f2457166156eb565b38808080614677565b6147fd9061388c612a377f00000000000000000000000000000000000000000000000000000000000003e8866113aa565b38614745565b6148129150611bc73d8261112b565b38614731565b61482061115b565b614729565b506040516370a0823160e01b81528390602081806148667f0000000000000000000000005e59110f5a8089b4ba7378347c85b85bfe1fe46e60048301610c55565b0381877f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f2457165afa9081156148ba575b6000916148a5575b501015614672565b6148b49150611a0e3d8261112b565b3861489d565b6148c261115b565b614895565b50604051636eb1769f60e11b8152839060208180614909307f0000000000000000000000005e59110f5a8089b4ba7378347c85b85bfe1fe46e600484016112e2565b0381877f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f2457165afa90811561495d575b600091614948575b50101561466c565b6149579150611a0e3d8261112b565b38614940565b61496561115b565b614938565b6a0422ca8b0a00a425000000808610159081614af2575b501561499957506954b40b1f852bda00000091614663565b6a01a784379d99db42000000808610159081614ae7575b50156149c85750691fc3842bd1f071c0000091614663565b6969e10de76676d0800000808610159081614adc575b50156149f657506907695a92c20d6fe0000091614663565b691a784379d99db4200000808610159081614ad1575b5015614a2457506901ccc9324511e450000091614663565b690a968163f0a57b400000808610159081614ac6575b5015614a51575068a2a15d09519be0000091614663565b69032d26d12e980b600000808610159081614abb575b5015614a7e5750682b5e3af16b1880000091614663565b9169010f0cf064dd59200000808610159081614ab0575b50614a9f57614663565b680d8d726b7177a800009250614663565b905086101538614a95565b905086101538614a67565b905086101538614a3a565b905086101538614a0c565b9050861015386149de565b9050861015386149b0565b905086101538614981565b90508610153861464f565b61461d919450614b1c90611bc73d8261112b565b93906145df565b614b2b61115b565b6145d7565b604051906119fd82611103565b90604051604081018181106001600160401b03821117614b6c575b604052602060018294805484520154910152565b614b746110ec565b614b58565b15614b8057565b5060405162461bcd60e51b815260206004820152601c60248201527f4e6f207265776172642073657420666f722074686973206d6f6e7468000000006044820152606490fd5b336000908152604460205260409020614be49061458c908390610319565b614c42614c03614bfe836000526043602052604060002090565b614b3d565b614c3a6020820191614c1783511515614b79565b336000908152604260205260409020614c31908690610319565b549051906113bd565b9051906113aa565b80151580614da5575b80614cfc575b614c59575050565b3360009081526044602052604090206119fd928291614c789190610319565b556004614c8433610c95565b01614c908282546114a1565b90556009614c9d33610c95565b01614ca98282546114a1565b9055337f0000000000000000000000005e59110f5a8089b4ba7378347c85b85bfe1fe46e7f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f24576001600160a01b03166156eb565b506040516370a0823160e01b8152819060208180614d3d7f0000000000000000000000005e59110f5a8089b4ba7378347c85b85bfe1fe46e60048301610c55565b03817f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f24576001600160a01b03165afa908115614d98575b600091614d83575b501015614c51565b614d929150611a0e3d8261112b565b38614d7b565b614da061115b565b614d73565b50604051636eb1769f60e11b8152819060208180614de7307f0000000000000000000000005e59110f5a8089b4ba7378347c85b85bfe1fe46e600484016112e2565b03817f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f24576001600160a01b03165afa908115614e42575b600091614e2d575b501015614c4b565b614e3c9150611a0e3d8261112b565b38614e25565b614e4a61115b565b614e1d565b80614e593361512f565b101580614f26575b80614e7d575b614e6e5750565b6119fd906009614c9d33610c95565b506040516370a0823160e01b8152819060208180614ebe7f0000000000000000000000005e59110f5a8089b4ba7378347c85b85bfe1fe46e60048301610c55565b03817f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f24576001600160a01b03165afa908115614f19575b600091614f04575b501015614e67565b614f139150611a0e3d8261112b565b38614efc565b614f2161115b565b614ef4565b50604051636eb1769f60e11b8152819060208180614f68307f0000000000000000000000005e59110f5a8089b4ba7378347c85b85bfe1fe46e600484016112e2565b03817f0000000000000000000000007739089d4acd765f0968c93149c54fb3366f24576001600160a01b03165afa908115614fc3575b600091614fae575b501015614e61565b614fbd9150611a0e3d8261112b565b38614fa6565b614fcb61115b565b614f9e565b600033815260366020526040812054906001614feb33610caf565b015491828110615056575b8281039214801583478261504b575b505061501057505050565b8282918290615042575b829182913390f115615035575b612f8f6001612a5833610caf565b61503d61115b565b615027565b506108fc61501a565b101590508338615005565b61505e6112fc565b614ff6565b919261506d615555565b61507c60ff6003541615612221565b60005b82811061508d575050505050565b8061509c6150c4928587612275565b356150a681610c68565b6001600160a01b03908116151580615110575b6150c9575b50612265565b61507f565b6150d4828589612275565b35906150df82610c68565b6150f76150ed84888a612275565b35611da181610c68565b80546001600160a01b03191691909216179055386150be565b508061511d83868a612275565b3561512781610c68565b1615156150b9565b61513881610c95565b54156151c457806009613ff96151be6151b36151a861519d61519261518761517c6001615167610c929c610c95565b015460026151748c610c95565b0154906114a1565b60056151748b610c95565b60066151748a610c95565b600361517489610c95565b600461517488610c95565b600761517487610c95565b600861517486610c95565b92610c95565b50600090565b60ff60355460281c1615615268576005600052603f6020526152096151fd33600080516020615983833981519152610d4b565b54600a613ff933610c95565b8015801582478261525d575b505061521f575050565b8190600090615254575b600080809381933390f115615247575b612f8f600a612a5833610c95565b61524f61115b565b615239565b506108fc615229565b101590508238615215565b5060405162461bcd60e51b815260206004820152601f60248201527f45786368616e6765207374616765206973206e6f7420737461727420796574006044820152606490fd5b6152b6615555565b600154906001600160a01b03906152cf8284161561100b565b6001600160a01b0319909216911617600155565b156152ea57565b5060405162461bcd60e51b815260206004820152601960248201527815dbdc9ada5b99c8189bdb9d5cc8185b1c9958591e481cd95d603a1b6044820152606490fd5b61462f916153a66153b29261539361534e61155760015460018060a01b031690565b6020604051809263743fc74560e01b8252818061536e8860048301610c55565b03915afa9081156153f1575b6000916153dc575b506001600160a01b0316331461451e565b6145fb61539f33610d31565b54156152e3565b92839161031933610d17565b9069032d26d12e980b6000008091101591826153d1575b505061469f57565b1015905038806153c9565b6153eb9150611bc73d8261112b565b38615382565b6153f961115b565b61537a565b91615407615555565b81156154b2578015615475576119fd9261545291615432600254808414908115615463575b506154f1565b61543a614b30565b93845260208401526000526043602052604060002090565b906020600191805184550151910155565b61546d9150611471565b83143861542c565b50505050606460405162461bcd60e51b81526020600482015260126024820152710526577617264206d757374206265203e20360741b6044820152fd5b50505050606460405162461bcd60e51b81526020600482015260146024820152730427573696e657373206d757374206265203e20360641b6044820152fd5b156154f857565b5060405162461bcd60e51b815260206004820152602e60248201527f43616e206f6e6c792073657420666f722063757272656e74206f72206e65787460448201526d081c995dd85c99081c195c9a5bd960921b6064820152608490fd5b6000546001600160a01b031633141561556a57565b50606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6155b7615555565b600080546001600160a01b0319811682556040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b615606615555565b6001600160a01b038181168015615653576000549060018060a01b0319821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06000604051a3565b50505050608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152fd5b60405163a9059cbb60e01b60208201526001600160a01b039290921660248301526044808301939093529181526119fd916156e660648361112b565b6157b0565b6040516323b872dd60e01b60208201526001600160a01b0392831660248201529290911660448301526064808301939093529181526119fd9160a082018281106001600160401b03821117615743575b6040526157b0565b61574b6110ec565b61573b565b1561575757565b5060405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b6040516001600160a01b0391909116916157c982611103565b6020928383527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656484840152803b15615840576000828192828761581b9796519301915af1615815615888565b906158d5565b8051908161582857505050565b826119fd9361583b9383010191016128a4565b615750565b505050606491506040519062461bcd60e51b82526004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b3d156158d0573d906001600160401b0382116158c3575b604051916158b7601f8201601f19166020018461112b565b82523d6000602084013e565b6158cb6110ec565b61589f565b606090565b909190156158e1575090565b815191925090156158f55750805190602001fd5b90506040519062461bcd60e51b82528160208060048301528251928360248401526000915b84831061594957505091806044931161593c575b601f01601f19168101030190fd5b600083828401015261592e565b818301810151868401604401528593509182019161591a56fe8d591019a15377c8e6a9622af7eace9517ffd6fc2b77a6aa22ffbaafe1211a66ce9ba49259f29965db66374dc56c65bc96d48189021153bccfa36a1dbb8ce366a36469706673582212205b96d941988527817733a3f75cd31a2135237d0d2c5c1a2f3ba9feb28a5e76576c6578706572696d656e74616cf564736f6c634300080a0041
1. FundWallet

2. Referrals

3. TUSD

4. TreasuryWallet

5. incentivePerStage

6. investmentPackages

7. mapNewAddress

8. mapTBCHoldingInfo

9. mapUserInfo

10. monthlyBonusLoop

11. monthlyDirectBusiness

12. monthlyDirectBusinessClaimed

13. monthlyDirectBusinessReward

14. monthlyPurchase

15. monthlySale

16. monthlySaleClaimed

17. nextRewardDrain

18. owner

19. pendingReward

20. positionWiseTBC

21. positionWiseWallet

22. pricePerStage

23. referralBonus

24. royaltyIncentive

25. saleEnable

26. stageWiseAvailableTBC

27. stageWiseCurrentSellPosition

28. stageWiseUserPosition

29. stageWiseUserTBC

30. statusPerStage

31. teamRequiredForBonus

32. totalBusiness

33. workingBonus

34. workingBonusLoop

1. addReferral
2. buy
3. claimHoldingTBC
4. claimMonthlyDirectBusinessReward
5. claimMonthlyReward
6. claimTBC
7. renounceOwnership
8. setMonthlyDirectBusinessReward
9. setSellPosition
10. setStageWiseData
11. setTeam
12. setWorkingBonus
13. startSale
14. transferOwnership
15. updateTeam
16. 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.