Contract

0x410f0C12957C1a134Ef935D0C7cd6Ac7a27bae50

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

File 1 of 6 : 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 6 : 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 6 : 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 6 : InvestmentPlan.sol

// SPDX-License-Identifier: MIT pragma solidity 0.8.2; import "./SafeERC20.sol"; interface IReferrals { function addMember(address member, address parent) external; function getSponsor(address account) external view returns (address); function getTeam(address sponsor, uint256 level) external view returns (uint256); } contract InvestmentPlan { using SafeERC20 for IERC20; address public TUSD; address public FundWallet; address public ownerWallet; IReferrals public Referrals; struct UserInfo { uint256 investedAmount; uint256 levelIncome; uint256 foreignTour; uint256 monthlyReward; uint256 workingBonus; uint256 royaltyBonus; uint256 claimedAmount; uint256 claimedTBC; bool royalty; } struct Earning{ uint256 levelEarning; } uint256 public communityIncentives; uint256 public extraIncentives; uint256 public royaltyIncentive; uint256 public nextRewardDrain; bool[6] public statusPerStage; bool public saleEnable; uint256[5] public indexPerStage; uint256[5] public pricePerStage; uint256[6] public TBCPerStage; uint256[6] public usersTBCPerStage; uint256[6] public investmentPackages; uint256[10] public referrerBonus; uint256[10] public teamRequiredForBonus; uint256[] public stage2UserTBC; uint256[] public stage3UserTBC; uint256[] public stage4UserTBC; uint256[] public stage5UserTBC; uint256[] public stage6UserTBC; address[] public stage2UserWallet; address[] public stage3UserWallet; address[] public stage4UserWallet; address[] public stage5UserWallet; address[] public stage6UserWallet; mapping(address => UserInfo) public mapUserInfo; mapping(address => Earning[10]) public mapLevelEarning; mapping(address => uint256) public totalBusiness; mapping(address => uint256) public workingBonus; mapping(address => mapping(uint256 => uint256)) public monthlySale; mapping(address => mapping(uint256 => bool)) public monthlySaleClaimed; mapping(address => mapping(uint256 => uint256)) public stageWiseTBC; mapping(address => mapping(uint256 => uint256)) public stageWiseTBCSold; event Deposit(address user, uint256 amount); event Withdraw(address user, uint256 amount); event PoolUpdated(uint256 amount); event StageStatusUpdated(bool stage1Status, bool stage2Status, bool stage3Status, bool stage4Status, bool stage5Status, bool stage6Status); constructor() { investmentPackages[0] = 100 * 10**18; investmentPackages[1] = 500 * 10**18; investmentPackages[2] = 1000 * 10**18; investmentPackages[3] = 2500 * 10**18; investmentPackages[4] = 5000 * 10**18; investmentPackages[5] = 10000 * 10**18; referrerBonus[0] = 500; referrerBonus[1] = 300; referrerBonus[2] = 200; referrerBonus[3] = 100; referrerBonus[4] = 100; referrerBonus[5] = 50; referrerBonus[6] = 50; referrerBonus[7] = 50; referrerBonus[8] = 50; referrerBonus[9] = 50; teamRequiredForBonus[0] = 0; teamRequiredForBonus[1] = 3; teamRequiredForBonus[2] = 3; teamRequiredForBonus[3] = 3; teamRequiredForBonus[4] = 3; teamRequiredForBonus[5] = 3; teamRequiredForBonus[6] = 3; teamRequiredForBonus[7] = 3; teamRequiredForBonus[8] = 3; teamRequiredForBonus[9] = 3; pricePerStage[0] = 1 * 10**18; pricePerStage[1] = 10 * 10**18; pricePerStage[2] = 100 * 10**18; pricePerStage[3] = 1000 * 10**18; pricePerStage[4] = 10000 * 10**18; TBCPerStage[0] = 2000000 * 10**18; TBCPerStage[1] = 2000000 * 10**18; TBCPerStage[2] = 2000000 * 10**18; TBCPerStage[3] = 2000000 * 10**18; TBCPerStage[4] = 2000000 * 10**18; usersTBCPerStage[0] = 0; usersTBCPerStage[1] = 0; usersTBCPerStage[2] = 0; usersTBCPerStage[3] = 0; usersTBCPerStage[4] = 0; statusPerStage[0] = true; statusPerStage[1] = false; statusPerStage[2] = false; statusPerStage[3] = false; statusPerStage[4] = false; statusPerStage[5] = false; communityIncentives = 4000; extraIncentives = 1000; royaltyIncentive = 1000; nextRewardDrain = block.timestamp + 30 days; Referrals = IReferrals(0xA02251bF35e53ea86bAc1aDbEc728F4419CA4961); TUSD = address(0x63F74F1329Fe12E1E1dbad20Ebabb06DC53f2330); FundWallet = address(0x760c5A41b67BE0b8E208Da61c9654d5aad1e92f2); ownerWallet = address(0x760c5A41b67BE0b8E208Da61c9654d5aad1e92f2); } function buy(uint256 packages, uint256 stage, address investor, address sponsor, uint256 stage2Share, uint256 stage3Share, uint256 stage4Share, uint256 stage5Share, uint256 stage6Share) external { require(packages < investmentPackages.length, "Staking packages not found"); require(IERC20(TUSD).balanceOf(msg.sender) >= investmentPackages[packages], "balance not available for staking"); require(sponsor != address(0), 'zero address'); require(sponsor != msg.sender, "ERR: referrer different required"); if(!saleEnable) { saleEnable = true; } uint256 TUSDAmount = investmentPackages[packages]; IERC20(TUSD).safeTransferFrom(address(msg.sender), address(this), TUSDAmount); if(Referrals.getSponsor(investor) == address(0)) { Referrals.addMember(investor, sponsor); } else { sponsor = Referrals.getSponsor(investor); } if(stage == 0) { uint256 totalTBC = TUSDAmount * 10**18 / pricePerStage[0]; require(TBCPerStage[0] >= totalTBC, "TBC not available for sale"); require(stage2Share + stage3Share + stage4Share + stage5Share + stage6Share == totalTBC, "Stagewise coin distrubation is not correct"); require(statusPerStage[0], "Stage is closed"); if(stage2Share > 0) { stage2UserTBC.push(stage2Share); stage2UserWallet.push(investor); TBCPerStage[1] += stage2Share; usersTBCPerStage[1] += stage2Share; stageWiseTBC[address(msg.sender)][1] += stage2Share; } if(stage3Share > 0) { stage3UserTBC.push(stage3Share); stage3UserWallet.push(investor); TBCPerStage[2] += stage3Share; usersTBCPerStage[2] += stage3Share; stageWiseTBC[address(msg.sender)][2] += stage3Share; } if(stage4Share > 0) { stage4UserTBC.push(stage4Share); stage4UserWallet.push(investor); TBCPerStage[3] += stage4Share; usersTBCPerStage[3] += stage4Share; stageWiseTBC[address(msg.sender)][3] += stage4Share; } if(stage5Share > 0) { stage5UserTBC.push(stage5Share); stage5UserWallet.push(investor); TBCPerStage[4] += stage5Share; usersTBCPerStage[4] += stage5Share; stageWiseTBC[address(msg.sender)][4] += stage5Share; } if(stage6Share > 0) { stage6UserTBC.push(stage6Share); stage6UserWallet.push(investor); TBCPerStage[5] += stage6Share; usersTBCPerStage[5] += stage6Share; stageWiseTBC[address(msg.sender)][5] += stage6Share; } TBCPerStage[0] -= totalTBC; if(TBCPerStage[0] == 0) { statusPerStage[0] = false; statusPerStage[1] = true; } } else if(stage == 1) { uint256 totalTBC = TUSDAmount * 10**18 / pricePerStage[1]; require(TBCPerStage[1] >= totalTBC, "TBC not available for sale"); require(stage3Share + stage4Share + stage5Share + stage6Share == totalTBC, "Stagewise coin distrubation is not correct"); require(statusPerStage[1], "Stage is closed"); uint256 sponsorShare = totalTBC * 20 / 100; uint256 userShare = totalTBC * 40 / 100; uint256 start = indexPerStage[1]; for(uint256 i=start; i < stage2UserTBC.length; i++) { uint256 indexTBC = stage2UserTBC[i]; if(indexTBC >= userShare) { stage2UserTBC[i] -= userShare; uint256 userFund = totalTBC * pricePerStage[1] / 10**18; uint256 communityFee = userFund * communityIncentives / 10000; IERC20(TUSD).safeTransfer(address(stage2UserWallet[i]), userFund - communityFee); break; } else { uint256 userFund = stage2UserTBC[i] * pricePerStage[1] / 10**18; uint256 communityFee = userFund * communityIncentives / 10000; IERC20(TUSD).safeTransfer(address(stage2UserWallet[i]), userFund - communityFee); userShare -= stage2UserTBC[i]; stage2UserTBC[i] = 0; indexPerStage[1] = i; } } start = indexPerStage[1]; for(uint256 i=start; i < stage2UserTBC.length; i++) { if(stage2UserWallet[i] == address(sponsor)) { uint256 indexTBC = stage2UserTBC[i]; if(indexTBC >= sponsorShare) { stage2UserTBC[i] -= sponsorShare; uint256 userFund = totalTBC * pricePerStage[1] / 10**18; uint256 communityFee = userFund * communityIncentives / 10000; IERC20(TUSD).safeTransfer(address(stage2UserWallet[i]), userFund - communityFee); break; } else { uint256 userFund = stage2UserTBC[i] * pricePerStage[1] / 10**18; uint256 communityFee = userFund * communityIncentives / 10000; IERC20(TUSD).safeTransfer(address(stage2UserWallet[i]), userFund - communityFee); sponsorShare -= stage2UserTBC[i]; stage2UserTBC[i] = 0; } } } if(stage3Share > 0) { stage3UserTBC.push(stage3Share); stage3UserWallet.push(investor); TBCPerStage[2] += stage3Share; usersTBCPerStage[2] += stage3Share; stageWiseTBC[address(msg.sender)][2] += stage3Share; } if(stage4Share > 0) { stage4UserTBC.push(stage4Share); stage4UserWallet.push(investor); TBCPerStage[3] += stage4Share; usersTBCPerStage[3] += stage4Share; stageWiseTBC[address(msg.sender)][3] += stage4Share; } if(stage5Share > 0) { stage5UserTBC.push(stage5Share); stage5UserWallet.push(investor); TBCPerStage[4] += stage5Share; usersTBCPerStage[4] += stage5Share; stageWiseTBC[address(msg.sender)][4] += stage5Share; } if(stage6Share > 0) { stage6UserTBC.push(stage6Share); stage6UserWallet.push(investor); TBCPerStage[5] += stage6Share; usersTBCPerStage[5] += stage6Share; stageWiseTBC[address(msg.sender)][5] += stage6Share; } TBCPerStage[1] -= totalTBC; if(TBCPerStage[1] == 0) { statusPerStage[1] = false; statusPerStage[2] = true; } } else if(stage == 2) { uint256 totalTBC = TUSDAmount * 10**18 / pricePerStage[2]; require(TBCPerStage[2] >= totalTBC, "TBC not available for sale"); require(stage4Share + stage5Share + stage6Share == totalTBC, "Stagewise coin distrubation is not correct"); require(statusPerStage[2], "Stage is closed"); uint256 sponsorShare = totalTBC * 20 / 100; uint256 userShare = totalTBC * 40 / 100; uint256 start = indexPerStage[2]; for(uint256 i=start; i < stage3UserTBC.length; i++) { uint256 indexTBC = stage3UserTBC[i]; if(indexTBC >= userShare) { stage3UserTBC[i] -= userShare; uint256 userFund = totalTBC * pricePerStage[2] / 10**18; uint256 communityFee = userFund * communityIncentives / 10000; IERC20(TUSD).safeTransfer(address(stage3UserWallet[i]), userFund - communityFee); break; } else { uint256 userFund = stage3UserTBC[i] * pricePerStage[2] / 10**18; uint256 communityFee = userFund * communityIncentives / 10000; IERC20(TUSD).safeTransfer(address(stage3UserWallet[i]), userFund - communityFee); userShare -= stage3UserTBC[i]; stage3UserTBC[i] = 0; indexPerStage[1] = i; } } start = indexPerStage[2]; for(uint256 i=start; i < stage3UserTBC.length; i++) { if(stage3UserWallet[i] == address(sponsor)) { uint256 indexTBC = stage3UserTBC[i]; if(indexTBC >= sponsorShare) { stage3UserTBC[i] -= sponsorShare; uint256 userFund = totalTBC * pricePerStage[1] / 10**18; uint256 communityFee = userFund * communityIncentives / 10000; IERC20(TUSD).safeTransfer(address(stage3UserWallet[i]), userFund - communityFee); break; } else { uint256 userFund = stage3UserTBC[i] * pricePerStage[1] / 10**18; uint256 communityFee = userFund * communityIncentives / 10000; IERC20(TUSD).safeTransfer(address(stage3UserWallet[i]), userFund - communityFee); sponsorShare -= stage3UserTBC[i]; stage3UserTBC[i] = 0; } } } if(stage4Share > 0) { stage4UserTBC.push(stage4Share); stage4UserWallet.push(investor); TBCPerStage[3] += stage4Share; usersTBCPerStage[3] += stage4Share; stageWiseTBC[address(msg.sender)][3] += stage4Share; } if(stage5Share > 0) { stage5UserTBC.push(stage5Share); stage5UserWallet.push(investor); TBCPerStage[4] += stage5Share; usersTBCPerStage[4] += stage5Share; stageWiseTBC[address(msg.sender)][4] += stage5Share; } if(stage6Share > 0) { stage6UserTBC.push(stage6Share); stage6UserWallet.push(investor); TBCPerStage[5] += stage6Share; usersTBCPerStage[5] += stage6Share; stageWiseTBC[address(msg.sender)][5] += stage6Share; } TBCPerStage[2] -= totalTBC; if(TBCPerStage[2] == 0) { statusPerStage[2] = false; statusPerStage[3] = true; } } else if(stage == 3) { uint256 totalTBC = TUSDAmount * 10**18 / pricePerStage[3]; require(TBCPerStage[3] >= totalTBC, "TBC not available for sale"); require(stage5Share + stage6Share == totalTBC, "Stagewise coin distrubation is not correct"); require(statusPerStage[3], "Stage is closed"); uint256 sponsorShare = totalTBC * 20 / 100; uint256 userShare = totalTBC * 40 / 100; uint256 start = indexPerStage[3]; for(uint256 i=start; i < stage4UserTBC.length; i++) { uint256 indexTBC = stage4UserTBC[i]; if(indexTBC >= userShare) { stage4UserTBC[i] -= userShare; uint256 userFund = totalTBC * pricePerStage[3] / 10**18; uint256 communityFee = userFund * communityIncentives / 10000; IERC20(TUSD).safeTransfer(address(stage4UserWallet[i]), userFund - communityFee); break; } else { uint256 userFund = stage4UserTBC[i] * pricePerStage[3] / 10**18; uint256 communityFee = userFund * communityIncentives / 10000; IERC20(TUSD).safeTransfer(address(stage4UserWallet[i]), userFund - communityFee); userShare -= stage4UserTBC[i]; stage4UserTBC[i] = 0; indexPerStage[1] = i; } } start = indexPerStage[3]; for(uint256 i=start; i < stage4UserTBC.length; i++) { if(stage4UserWallet[i] == address(sponsor)) { uint256 indexTBC = stage4UserTBC[i]; if(indexTBC >= sponsorShare) { stage4UserTBC[i] -= sponsorShare; uint256 userFund = totalTBC * pricePerStage[3] / 10**18; uint256 communityFee = userFund * communityIncentives / 10000; IERC20(TUSD).safeTransfer(address(stage4UserWallet[i]), userFund - communityFee); break; } else { uint256 userFund = stage4UserTBC[i] * pricePerStage[3] / 10**18; uint256 communityFee = userFund * communityIncentives / 10000; IERC20(TUSD).safeTransfer(address(stage4UserWallet[i]), userFund - communityFee); sponsorShare -= stage4UserTBC[i]; stage4UserTBC[i] = 0; } } } if(stage5Share > 0) { stage5UserTBC.push(stage5Share); stage5UserWallet.push(investor); TBCPerStage[4] += stage5Share; usersTBCPerStage[4] += stage5Share; stageWiseTBC[address(msg.sender)][4] += stage5Share; } if(stage6Share > 0) { stage6UserTBC.push(stage6Share); stage6UserWallet.push(investor); TBCPerStage[5] += stage6Share; usersTBCPerStage[5] += stage6Share; stageWiseTBC[address(msg.sender)][5] += stage6Share; } TBCPerStage[3] -= totalTBC; if(TBCPerStage[3] == 0) { statusPerStage[3] = false; statusPerStage[4] = true; } } else if(stage == 4) { uint256 totalTBC = TUSDAmount * 10**18 / pricePerStage[4]; require(TBCPerStage[4] >= totalTBC, "TBC not available for sale"); require(stage6Share == totalTBC, "Stagewise coin distrubation is not correct"); require(statusPerStage[4], "Stage is closed"); uint256 sponsorShare = totalTBC * 20 / 100; uint256 userShare = totalTBC * 40 / 100; uint256 start = indexPerStage[4]; for(uint256 i=start; i < stage5UserTBC.length; i++) { uint256 indexTBC = stage5UserTBC[i]; if(indexTBC >= userShare) { stage5UserTBC[i] -= userShare; uint256 userFund = totalTBC * pricePerStage[4] / 10**18; uint256 communityFee = userFund * communityIncentives / 10000; IERC20(TUSD).safeTransfer(address(stage5UserWallet[i]), userFund - communityFee); break; } else { uint256 userFund = stage5UserTBC[i] * pricePerStage[4] / 10**18; uint256 communityFee = userFund * communityIncentives / 10000; IERC20(TUSD).safeTransfer(address(stage5UserWallet[i]), userFund - communityFee); userShare -= stage5UserTBC[i]; stage5UserTBC[i] = 0; indexPerStage[1] = i; } } start = indexPerStage[4]; for(uint256 i=start; i < stage5UserTBC.length; i++) { if(stage5UserWallet[i] == address(sponsor)) { uint256 indexTBC = stage5UserTBC[i]; if(indexTBC >= sponsorShare) { stage5UserTBC[i] -= sponsorShare; uint256 userFund = totalTBC * pricePerStage[4] / 10**18; uint256 communityFee = userFund * communityIncentives / 10000; IERC20(TUSD).safeTransfer(address(stage5UserWallet[i]), userFund - communityFee); break; } else { uint256 userFund = stage5UserTBC[i] * pricePerStage[4] / 10**18; uint256 communityFee = userFund * communityIncentives / 10000; IERC20(TUSD).safeTransfer(address(stage5UserWallet[i]), userFund - communityFee); sponsorShare -= stage5UserTBC[i]; stage5UserTBC[i] = 0; } } } if(stage6Share > 0) { stage6UserTBC.push(stage6Share); stage6UserWallet.push(investor); TBCPerStage[5] += stage6Share; usersTBCPerStage[5] += stage6Share; stageWiseTBC[address(msg.sender)][5] += stage6Share; } TBCPerStage[4] -= totalTBC; if(TBCPerStage[4] == 0) { statusPerStage[4] = false; statusPerStage[5] = true; } } if(block.timestamp >= nextRewardDrain) { nextRewardDrain += 30 days; } mapUserInfo[msg.sender].investedAmount += TUSDAmount; totalBusiness[sponsor] += TUSDAmount; uint256 myDirect = Referrals.getTeam(address(sponsor), 0); if(myDirect >= 3 && totalBusiness[sponsor] >= 1500 * 10**18 && !mapUserInfo[sponsor].royalty) { mapUserInfo[sponsor].royalty = true; } referralBonusDistribution(investor, TUSDAmount); workingBonusDistribution(investor, TUSDAmount); foreignTourBonusDistribution(sponsor, totalBusiness[sponsor]); monthlyBonusDistribution(investor, TUSDAmount); IERC20(TUSD).safeTransfer(address(ownerWallet), IERC20(TUSD).balanceOf(address(this))); } function monthlyBonusDistribution(address sponsor, uint256 amount) private { address nextReferrer = Referrals.getSponsor(sponsor); for(uint256 i=0; i < 512; i++) { if(nextReferrer != address(0)) { monthlySale[nextReferrer][nextRewardDrain] += amount; } else { break; } nextReferrer = Referrals.getSponsor(nextReferrer); } } function foreignTourBonusDistribution(address sponsor, uint256 amount) private { uint256 incentiveAmount = (amount / 3000 * 10**18) * (300 * 10**18); if(incentiveAmount > mapUserInfo[sponsor].foreignTour) { uint256 payableAmount = incentiveAmount - mapUserInfo[sponsor].foreignTour; if(mapUserInfo[Referrals.getSponsor(sponsor)].royalty) { royaltyBonusDistribution(Referrals.getSponsor(sponsor), ((payableAmount * royaltyIncentive) / 10000)); } if(IERC20(TUSD).balanceOf(address(this)) >= payableAmount) { mapUserInfo[sponsor].foreignTour += payableAmount; mapUserInfo[sponsor].claimedAmount += payableAmount; IERC20(TUSD).safeTransfer(address(sponsor), payableAmount); } else if(IERC20(TUSD).allowance(address(FundWallet), address(this)) >= payableAmount && IERC20(TUSD).balanceOf(address(FundWallet)) >= payableAmount) { mapUserInfo[sponsor].foreignTour += payableAmount; mapUserInfo[sponsor].claimedAmount += payableAmount; IERC20(TUSD).safeTransferFrom(address(FundWallet), address(sponsor), payableAmount); } else { mapUserInfo[sponsor].foreignTour += payableAmount; } } } function workingBonusDistribution(address sponsor, uint256 amount) private { address nextReferrer = Referrals.getSponsor(sponsor); for(uint256 i=0; i < 512; i++) { if(nextReferrer != address(0)) { if(workingBonus[nextReferrer] > 0) { uint256 payableAmount = amount * (workingBonus[nextReferrer]) / 10000; if(IERC20(TUSD).balanceOf(address(this)) >= payableAmount) { mapUserInfo[nextReferrer].workingBonus += payableAmount; mapUserInfo[sponsor].claimedAmount += payableAmount; IERC20(TUSD).safeTransfer(address(sponsor), payableAmount); break; } else if(IERC20(TUSD).allowance(address(FundWallet), address(this)) >= payableAmount && IERC20(TUSD).balanceOf(address(FundWallet)) >= payableAmount) { mapUserInfo[nextReferrer].workingBonus += payableAmount; mapUserInfo[sponsor].claimedAmount += payableAmount; IERC20(TUSD).safeTransferFrom(address(FundWallet), address(nextReferrer), payableAmount); break; } else { mapUserInfo[nextReferrer].workingBonus += payableAmount; break; } } } else { break; } nextReferrer = Referrals.getSponsor(nextReferrer); } } function referralBonusDistribution(address sponsor, uint256 amount) private { address nextReferrer = Referrals.getSponsor(sponsor); for(uint256 i=0; i < 10; i++) { if(nextReferrer != address(0)) { uint256 myDirect = Referrals.getTeam(address(nextReferrer), 0); if(myDirect >= teamRequiredForBonus[i]) { address sponsorWallet = Referrals.getSponsor(nextReferrer); if(i==0 && myDirect >= 5) { uint256 reward = amount * referrerBonus[i] * 2 / 10000; if(mapUserInfo[sponsorWallet].royalty) { royaltyBonusDistribution(sponsorWallet, ((reward * royaltyIncentive) / 10000)); } mapLevelEarning[nextReferrer][i].levelEarning += reward; mapUserInfo[nextReferrer].levelIncome += reward; mapUserInfo[nextReferrer].claimedAmount += reward; IERC20(TUSD).safeTransfer(address(nextReferrer), reward); } else { if(i==0) { uint256 reward = amount * referrerBonus[i] / 10000; if(mapUserInfo[sponsorWallet].royalty) { royaltyBonusDistribution(sponsorWallet, ((reward * royaltyIncentive) / 10000)); } mapLevelEarning[nextReferrer][i].levelEarning += reward; mapUserInfo[nextReferrer].levelIncome += reward; mapUserInfo[nextReferrer].claimedAmount += reward; IERC20(TUSD).safeTransfer(address(nextReferrer), reward); } else if(totalBusiness[address(nextReferrer)] >= 1500 * 10**18) { uint256 reward = amount * referrerBonus[i] / 10000; if(mapUserInfo[sponsorWallet].royalty) { royaltyBonusDistribution(sponsorWallet, ((reward * royaltyIncentive) / 10000)); } mapLevelEarning[nextReferrer][i].levelEarning += reward; mapUserInfo[nextReferrer].levelIncome += reward; mapUserInfo[nextReferrer].claimedAmount += reward; IERC20(TUSD).safeTransfer(address(nextReferrer), reward); } } } } else { break; } nextReferrer = Referrals.getSponsor(nextReferrer); } } function royaltyBonusDistribution(address sponsor, uint256 payableAmount) private { if(IERC20(TUSD).balanceOf(address(this)) >= payableAmount) { mapUserInfo[sponsor].royaltyBonus += payableAmount; mapUserInfo[sponsor].claimedAmount += payableAmount; IERC20(TUSD).safeTransfer(address(sponsor), payableAmount); } else if(IERC20(TUSD).allowance(address(FundWallet), address(this)) >= payableAmount && IERC20(TUSD).balanceOf(address(FundWallet)) >= payableAmount) { mapUserInfo[sponsor].royaltyBonus += payableAmount; mapUserInfo[sponsor].claimedAmount += payableAmount; IERC20(TUSD).safeTransferFrom(address(FundWallet), address(sponsor), payableAmount); } else { mapUserInfo[sponsor].royaltyBonus += payableAmount; } } function claimMonthlyReward(address topSponsor, uint256 month) external { require(monthlySaleClaimed[address(msg.sender)][month] == false, "Already claimed"); require(Referrals.getSponsor(topSponsor) == address(msg.sender), "Incorrect top sponsor"); uint256 topSponsorSale = monthlySale[address(topSponsor)][month]; uint256 allSale = monthlySale[address(msg.sender)][month]; uint256 remainingTeamSale = allSale - topSponsorSale; uint256 payableAmount = 0; if(topSponsorSale >= 10000000 * 10**18 && remainingTeamSale >=10000000 * 10**18) { payableAmount = 1000000 * 10**18; } else if(topSponsorSale >= 5000000 * 10**18 && remainingTeamSale >=5000000 * 10**18) { payableAmount = 400000 * 10**18; } else if(topSponsorSale >= 2000000 * 10**18 && remainingTeamSale >=2000000 * 10**18) { payableAmount = 150000 * 10**18; } else if(topSponsorSale >= 500000 * 10**18 && remainingTeamSale >=500000 * 10**18) { payableAmount = 35000 * 10**18; } else if(topSponsorSale >= 125000 * 10**18 && remainingTeamSale >=125000 * 10**18) { payableAmount = 8500 * 10**18; } else if(topSponsorSale >= 50000 * 10**18 && remainingTeamSale >=50000 * 10**18) { payableAmount = 3000 * 10**18; } else if(topSponsorSale >= 15000 * 10**18 && remainingTeamSale >=15000 * 10**18) { payableAmount = 800 * 10**18; } else if(topSponsorSale >=5000 * 10**18 && remainingTeamSale >=5000 * 10**18) { payableAmount = 250 * 10**18; } else { payableAmount = 0; } if(payableAmount > 0 && IERC20(TUSD).allowance(address(FundWallet), address(this)) >= payableAmount && IERC20(TUSD).balanceOf(address(FundWallet)) >= payableAmount) { monthlySaleClaimed[address(msg.sender)][month] = true; address sponsor = Referrals.getSponsor(address(msg.sender)); if(mapUserInfo[sponsor].royalty) { royaltyBonusDistribution(sponsor, ((payableAmount * royaltyIncentive) / 10000)); } IERC20(TUSD).safeTransferFrom(address(FundWallet), address(msg.sender), payableAmount); } } function withdrawEarning() external { require(mapUserInfo[address(msg.sender)].investedAmount > 0, "Incorrect request"); uint256 payableAmount = pendingReward(address(msg.sender)); if(payableAmount > 0 && IERC20(TUSD).allowance(address(FundWallet), address(this)) >= payableAmount && IERC20(TUSD).balanceOf(address(FundWallet)) >= payableAmount) { mapUserInfo[address(msg.sender)].claimedAmount += payableAmount; IERC20(TUSD).safeTransferFrom(address(FundWallet), address(msg.sender), payableAmount); } } function pendingReward(address user) public view returns (uint256) { if(mapUserInfo[address(user)].investedAmount > 0) { uint256 pending = (mapUserInfo[user].levelIncome + mapUserInfo[user].foreignTour + mapUserInfo[user].workingBonus + mapUserInfo[user].royaltyBonus) - (mapUserInfo[user].claimedAmount); return pending; } else { return 0; } } function setWorkingBonus(address user, uint256 bonus) external { require(msg.sender == address(FundWallet), "Incorrect request"); require(bonus <= 500, "Working bonus can't be more than 30%"); workingBonus[address(user)] = bonus; } function setTeam(uint256[8] memory userStats, bool royalty, address investor, address sponsor, uint256 stage2Share, uint256 stage3Share, uint256 stage4Share, uint256 stage5Share, uint256 stage6Share) external { require(msg.sender == address(FundWallet), "Incorrect request"); require(!saleEnable, "Sale already enable"); if(Referrals.getSponsor(investor) == address(0)) { Referrals.addMember(investor, address(sponsor)); } uint256 totalTBC = stage2Share + stage3Share + stage4Share + stage5Share + stage6Share; if(stage2Share > 0) { stage2UserTBC.push(stage2Share); stage2UserWallet.push(investor); TBCPerStage[1] += stage2Share; usersTBCPerStage[1] += stage2Share; stageWiseTBC[address(investor)][1] += stage2Share; } if(stage3Share > 0) { stage3UserTBC.push(stage3Share); stage3UserWallet.push(investor); TBCPerStage[2] += stage3Share; usersTBCPerStage[2] += stage3Share; stageWiseTBC[address(investor)][2] += stage3Share; } if(stage4Share > 0) { stage4UserTBC.push(stage4Share); stage4UserWallet.push(investor); TBCPerStage[3] += stage4Share; usersTBCPerStage[3] += stage4Share; stageWiseTBC[address(investor)][3] += stage4Share; } if(stage5Share > 0) { stage5UserTBC.push(stage5Share); stage5UserWallet.push(investor); TBCPerStage[4] += stage5Share; usersTBCPerStage[4] += stage5Share; stageWiseTBC[address(investor)][4] += stage5Share; } if(stage6Share > 0) { stage6UserTBC.push(stage6Share); stage6UserWallet.push(investor); TBCPerStage[5] += stage6Share; usersTBCPerStage[5] += stage6Share; stageWiseTBC[address(investor)][5] += stage6Share; } TBCPerStage[0] -= totalTBC; mapUserInfo[address(investor)].investedAmount = userStats[0]; mapUserInfo[address(investor)].levelIncome = userStats[1]; mapUserInfo[address(investor)].foreignTour = userStats[2]; mapUserInfo[address(investor)].monthlyReward = userStats[3]; mapUserInfo[address(investor)].workingBonus = userStats[4]; mapUserInfo[address(investor)].royaltyBonus = userStats[5]; mapUserInfo[address(investor)].claimedAmount = userStats[6]; monthlySale[address(investor)][nextRewardDrain] = userStats[7]; mapUserInfo[address(investor)].royalty = royalty; } function claimTBC() external { require(statusPerStage[5], "Exchange stage is not start yet"); uint256 claimableTBC = stageWiseTBC[address(msg.sender)][5] - mapUserInfo[address(msg.sender)].claimedTBC; if(claimableTBC > 0) { payable(msg.sender).transfer(claimableTBC); mapUserInfo[address(msg.sender)].claimedTBC += claimableTBC; } } }

File 5 of 6 : 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 6 of 6 : 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":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PoolUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"stage1Status","type":"bool"},{"indexed":false,"internalType":"bool","name":"stage2Status","type":"bool"},{"indexed":false,"internalType":"bool","name":"stage3Status","type":"bool"},{"indexed":false,"internalType":"bool","name":"stage4Status","type":"bool"},{"indexed":false,"internalType":"bool","name":"stage5Status","type":"bool"},{"indexed":false,"internalType":"bool","name":"stage6Status","type":"bool"}],"name":"StageStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"TBCPerStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TUSD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"packages","type":"uint256"},{"internalType":"uint256","name":"stage","type":"uint256"},{"internalType":"address","name":"investor","type":"address"},{"internalType":"address","name":"sponsor","type":"address"},{"internalType":"uint256","name":"stage2Share","type":"uint256"},{"internalType":"uint256","name":"stage3Share","type":"uint256"},{"internalType":"uint256","name":"stage4Share","type":"uint256"},{"internalType":"uint256","name":"stage5Share","type":"uint256"},{"internalType":"uint256","name":"stage6Share","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"topSponsor","type":"address"},{"internalType":"uint256","name":"month","type":"uint256"}],"name":"claimMonthlyReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTBC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"communityIncentives","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extraIncentives","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"indexPerStage","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"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"mapLevelEarning","outputs":[{"internalType":"uint256","name":"levelEarning","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mapUserInfo","outputs":[{"internalType":"uint256","name":"investedAmount","type":"uint256"},{"internalType":"uint256","name":"levelIncome","type":"uint256"},{"internalType":"uint256","name":"foreignTour","type":"uint256"},{"internalType":"uint256","name":"monthlyReward","type":"uint256"},{"internalType":"uint256","name":"workingBonus","type":"uint256"},{"internalType":"uint256","name":"royaltyBonus","type":"uint256"},{"internalType":"uint256","name":"claimedAmount","type":"uint256"},{"internalType":"uint256","name":"claimedTBC","type":"uint256"},{"internalType":"bool","name":"royalty","type":"bool"}],"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":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextRewardDrain","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pricePerStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"referrerBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyIncentive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleEnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[8]","name":"userStats","type":"uint256[8]"},{"internalType":"bool","name":"royalty","type":"bool"},{"internalType":"address","name":"investor","type":"address"},{"internalType":"address","name":"sponsor","type":"address"},{"internalType":"uint256","name":"stage2Share","type":"uint256"},{"internalType":"uint256","name":"stage3Share","type":"uint256"},{"internalType":"uint256","name":"stage4Share","type":"uint256"},{"internalType":"uint256","name":"stage5Share","type":"uint256"},{"internalType":"uint256","name":"stage6Share","type":"uint256"}],"name":"setTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"bonus","type":"uint256"}],"name":"setWorkingBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stage2UserTBC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stage2UserWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stage3UserTBC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stage3UserWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stage4UserTBC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stage4UserWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stage5UserTBC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stage5UserWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stage6UserTBC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stage6UserWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stageWiseTBC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stageWiseTBCSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"statusPerStage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"teamRequiredForBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalBusiness","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usersTBCPerStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"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"}]
Contract Creation Code
0x608060405234801561001057600080fd5b506004361061025d5760003560e01c80637cb936e711610146578063d21d35dc116100c3578063ea74ce1d11610087578063ea74ce1d1461060c578063f16cc4db1461061f578063f40f0f5214610632578063fcb1112414610645578063fe4ca8471461064d578063ffbdbe5e1461065a5761025d565b8063d21d35dc1461059f578063d9282dc6146105ca578063dd164ef1146105dd578063ddf30a1b146105f0578063de216f66146106035761025d565b806399b008ce1161010a57806399b008ce146105545780639f45b38c1461055d578063a6776d9f14610570578063abe257cc14610583578063cddc3552146105965761025d565b80637cb936e7146104f35780638323550b1461050657806384cd550514610519578063899161a0146105395780639335dcb7146105415761025d565b8063357ec6e2116101df57806359d7bd71116101a357806359d7bd71146104735780635bf5658b1461047c57806361b49fdc1461048f57806366f150e7146104a25780636f20befd146104cd57806375b94977146104e05761025d565b8063357ec6e2146103ef578063441222441461040f578063471332c8146104225780634c7cdb821461044d57806358bdd4a2146104605761025d565b8063156129331161022657806315612933146102d65780631d63a0a81461037857806324f978351461038b57806326745f2d146103c9578063303256fb146103dc5761025d565b80624a98e81461026257806307f5e8ac146102885780630a8c0e4c1461029b57806312c8b348146102ae57806313c5897e146102c1575b600080fd5b6102756102703660046157c4565b610685565b6040519081526020015b60405180910390f35b6102756102963660046157c4565b61069c565b6102756102a9366004615695565b6106ac565b6102756102bc3660046157c4565b6106d1565b6102d46102cf3660046157f4565b6106f2565b005b6103326102e436600461565d565b60446020526000908152604090208054600182015460028301546003840154600485015460058601546006870154600788015460089098015496979596949593949293919290919060ff1689565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e083015215156101008201526101200161027f565b6102d4610386366004615695565b612fe3565b6103b9610399366004615695565b604960209081526000928352604080842090915290825290205460ff1681565b604051901515815260200161027f565b6103b96103d73660046157c4565b613568565b6102756103ea3660046157c4565b613592565b6102756103fd36600461565d565b60476020526000908152604090205481565b61027561041d3660046157c4565b6135a2565b6104356104303660046157c4565b6135b2565b6040516001600160a01b03909116815260200161027f565b600154610435906001600160a01b031681565b61043561046e3660046157c4565b6135dc565b61027560045481565b61027561048a3660046157c4565b6135ec565b61043561049d3660046157c4565b6135fc565b6102756104b0366004615695565b604860209081526000928352604080842090915290825290205481565b600354610435906001600160a01b031681565b6104356104ee3660046157c4565b61360c565b6102d4610501366004615695565b61361c565b600054610435906001600160a01b031681565b61027561052736600461565d565b60466020526000908152604090205481565b6102d46136c0565b600254610435906001600160a01b031681565b61027560075481565b61027561056b3660046157c4565b61386a565b61027561057e3660046157c4565b61387a565b6102d46105913660046156c0565b61388a565b61027560055481565b6102756105ad366004615695565b604a60209081526000928352604080842090915290825290205481565b6104356105d83660046157c4565b613f0d565b6102756105eb3660046157c4565b613f1d565b6102756105fe3660046157c4565b613f2d565b61027560065481565b61027561061a3660046157c4565b613f3d565b61027561062d3660046157c4565b613f4d565b61027561064036600461565d565b613f5d565b6102d4613fec565b6009546103b99060ff1681565b610275610668366004615695565b604b60209081526000928352604080842090915290825290205481565b6020816006811061069557600080fd5b0154905081565b6014816006811061069557600080fd5b604560205281600052604060002081600a81106106c857600080fd5b01549150829050565b603c81815481106106e157600080fd5b600091825260209091200154905081565b600689106107475760405162461bcd60e51b815260206004820152601a60248201527f5374616b696e67207061636b61676573206e6f7420666f756e6400000000000060448201526064015b60405180910390fd5b6020896006811061076857634e487b7160e01b600052603260045260246000fd5b01546000546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156107ad57600080fd5b505afa1580156107c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e591906157dc565b101561083d5760405162461bcd60e51b815260206004820152602160248201527f62616c616e6365206e6f7420617661696c61626c6520666f72207374616b696e6044820152606760f81b606482015260840161073e565b6001600160a01b0386166108825760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b604482015260640161073e565b6001600160a01b0386163314156108db5760405162461bcd60e51b815260206004820181905260248201527f4552523a20726566657272657220646966666572656e74207265717569726564604482015260640161073e565b60095460ff166108f3576009805460ff191660011790555b600060208a6006811061091657634e487b7160e01b600052603260045260246000fd5b0154600054909150610933906001600160a01b03163330846140d8565b60035460405163743fc74560e01b81526001600160a01b038a81166004830152600092169063743fc7459060240160206040518083038186803b15801561097957600080fd5b505afa15801561098d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b19190615679565b6001600160a01b03161415610a2c57600354604051639d58b15d60e01b81526001600160a01b038a81166004830152898116602483015290911690639d58b15d90604401600060405180830381600087803b158015610a0f57600080fd5b505af1158015610a23573d6000803e3d6000fd5b50505050610aac565b60035460405163743fc74560e01b81526001600160a01b038a811660048301529091169063743fc7459060240160206040518083038186803b158015610a7157600080fd5b505afa158015610a85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa99190615679565b96505b88610fa657600f54600090610ac983670de0b6b3a76400006159c7565b610ad391906159a7565b9050806014600001541015610afa5760405162461bcd60e51b815260040161073e90615904565b80838587610b088a8c61598f565b610b12919061598f565b610b1c919061598f565b610b26919061598f565b14610b435760405162461bcd60e51b815260040161073e906158ba565b60085460ff16610b655760405162461bcd60e51b815260040161073e9061593b565b8615610c4b57603a805460018082019092557fa2999d817b6757290b50e8ecf3fa939673403dd35c97de392fdb343b4015ce9e01889055603f805480830182556000919091527fc03004e3ce0784bf68186394306849f9b7b1200073105cd9aeb554a1802b58fd0180546001600160a01b0319166001600160a01b038c1617905587906014016000828254610bfa919061598f565b90915550879050601a6001016000828254610c15919061598f565b9091555050336000908152604a602090815260408083206001845290915281208054899290610c4590849061598f565b90915550505b8515610d2f57603b805460018082019092557fbbe3212124853f8b0084a66a2d057c2966e251e132af3691db153ab65f0d1a4d018790556040805491820181556000527f352feee0eea125f11f791c1b77524172e9bc20f1b719b6cef0fc24f64db8e15e0180546001600160a01b0319166001600160a01b038b161790558560146002016000828254610cde919061598f565b90915550869050601a6002016000828254610cf9919061598f565b9091555050336000908152604a602090815260408083206002845290915281208054889290610d2990849061598f565b90915550505b8415610def57603c80546001808201909255600080516020615ab483398151915201869055604180549182018155600052600080516020615ad48339815191520180546001600160a01b0319166001600160a01b038b161790558460146003016000828254610d9e919061598f565b90915550859050601a6003016000828254610db9919061598f565b9091555050336000908152604a602090815260408083206003845290915281208054879290610de990849061598f565b90915550505b8315610eaf57603d80546001808201909255600080516020615b3483398151915201859055604280549182018155600052600080516020615a948339815191520180546001600160a01b0319166001600160a01b038b161790558360146004016000828254610e5e919061598f565b90915550849050601a6004016000828254610e79919061598f565b9091555050336000908152604a602090815260408083206004845290915281208054869290610ea990849061598f565b90915550505b8215610f6f57603e80546001808201909255600080516020615b1483398151915201849055604380549182018155600052600080516020615af48339815191520180546001600160a01b0319166001600160a01b038b161790558260146005016000828254610f1e919061598f565b90915550839050601a6005016000828254610f39919061598f565b9091555050336000908152604a602090815260408083206005845290915281208054859290610f6990849061598f565b90915550505b8060146000016000828254610f8491906159e6565b9091555050601454610fa0576008805461ffff19166101001790555b50612d8e565b88600114156118a857601054600090610fc783670de0b6b3a76400006159c7565b610fd191906159a7565b9050806014600101541015610ff85760405162461bcd60e51b815260040161073e90615904565b808385611005888a61598f565b61100f919061598f565b611019919061598f565b146110365760405162461bcd60e51b815260040161073e906158ba565b600854610100900460ff1661105d5760405162461bcd60e51b815260040161073e9061593b565b6000606461106c8360146159c7565b61107691906159a7565b9050600060646110878460286159c7565b61109191906159a7565b600b54909150805b603a548110156112d5576000603a82815481106110c657634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508381106111bd5783603a83815481106110fc57634e487b7160e01b600052603260045260246000fd5b90600052602060002001600082825461111591906159e6565b9091555050601054600090670de0b6b3a76400009061113490896159c7565b61113e91906159a7565b905060006127106004548361115391906159c7565b61115d91906159a7565b90506111b5603f858154811061118357634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03166111a283856159e6565b6000546001600160a01b03169190614149565b5050506112d5565b6000670de0b6b3a7640000600f60010154603a85815481106111ef57634e487b7160e01b600052603260045260246000fd5b906000526020600020015461120491906159c7565b61120e91906159a7565b905060006127106004548361122391906159c7565b61122d91906159a7565b9050611253603f858154811061118357634e487b7160e01b600052603260045260246000fd5b603a848154811061127457634e487b7160e01b600052603260045260246000fd5b90600052602060002001548661128a91906159e6565b95506000603a85815481106112af57634e487b7160e01b600052603260045260246000fd5b600091825260209091200155505050600b819055806112cd81615a29565b915050611099565b5050600b54805b603a54811015611528578b6001600160a01b0316603f828154811061131157634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415611516576000603a828154811061134f57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508481106114145784603a838154811061138557634e487b7160e01b600052603260045260246000fd5b90600052602060002001600082825461139e91906159e6565b9091555050601054600090670de0b6b3a7640000906113bd90896159c7565b6113c791906159a7565b90506000612710600454836113dc91906159c7565b6113e691906159a7565b905061140c603f858154811061118357634e487b7160e01b600052603260045260246000fd5b505050611528565b6000670de0b6b3a7640000600f60010154603a858154811061144657634e487b7160e01b600052603260045260246000fd5b906000526020600020015461145b91906159c7565b61146591906159a7565b905060006127106004548361147a91906159c7565b61148491906159a7565b90506114aa603f858154811061118357634e487b7160e01b600052603260045260246000fd5b603a84815481106114cb57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154876114e191906159e6565b96506000603a858154811061150657634e487b7160e01b600052603260045260246000fd5b6000918252602090912001555050505b8061152081615a29565b9150506112dc565b50881561160d57603b805460018082019092557fbbe3212124853f8b0084a66a2d057c2966e251e132af3691db153ab65f0d1a4d018a90556040805491820181556000527f352feee0eea125f11f791c1b77524172e9bc20f1b719b6cef0fc24f64db8e15e0180546001600160a01b0319166001600160a01b038e1617905588601460020160008282546115bc919061598f565b90915550899050601a60020160008282546115d7919061598f565b9091555050336000908152604a6020908152604080832060028452909152812080548b929061160790849061598f565b90915550505b87156116cd57603c80546001808201909255600080516020615ab483398151915201899055604180549182018155600052600080516020615ad48339815191520180546001600160a01b0319166001600160a01b038e16179055876014600301600082825461167c919061598f565b90915550889050601a6003016000828254611697919061598f565b9091555050336000908152604a6020908152604080832060038452909152812080548a92906116c790849061598f565b90915550505b861561178d57603d80546001808201909255600080516020615b3483398151915201889055604280549182018155600052600080516020615a948339815191520180546001600160a01b0319166001600160a01b038e16179055866014600401600082825461173c919061598f565b90915550879050601a6004016000828254611757919061598f565b9091555050336000908152604a60209081526040808320600484529091528120805489929061178790849061598f565b90915550505b851561184d57603e80546001808201909255600080516020615b1483398151915201879055604380549182018155600052600080516020615af48339815191520180546001600160a01b0319166001600160a01b038e1617905585601460050160008282546117fc919061598f565b90915550869050601a6005016000828254611817919061598f565b9091555050336000908152604a60209081526040808320600584529091528120805488929061184790849061598f565b90915550505b836014600101600082825461186291906159e6565b909155505060155461189f576008805461ff001916815560019060025b602091828204019190066101000a81548160ff0219169083151502179055505b50505050612d8e565b8860021415612066576011546000906118c983670de0b6b3a76400006159c7565b6118d391906159a7565b90508060146002015410156118fa5760405162461bcd60e51b815260040161073e90615904565b8083611906868861598f565b611910919061598f565b1461192d5760405162461bcd60e51b815260040161073e906158ba565b60085462010000900460ff166119555760405162461bcd60e51b815260040161073e9061593b565b600060646119648360146159c7565b61196e91906159a7565b90506000606461197f8460286159c7565b61198991906159a7565b600c54909150805b603b54811015611b9b576000603b82815481106119be57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050838110611a835783603b83815481106119f457634e487b7160e01b600052603260045260246000fd5b906000526020600020016000828254611a0d91906159e6565b9091555050601154600090670de0b6b3a764000090611a2c90896159c7565b611a3691906159a7565b9050600061271060045483611a4b91906159c7565b611a5591906159a7565b9050611a7b6040858154811061118357634e487b7160e01b600052603260045260246000fd5b505050611b9b565b6000670de0b6b3a7640000600f60020154603b8581548110611ab557634e487b7160e01b600052603260045260246000fd5b9060005260206000200154611aca91906159c7565b611ad491906159a7565b9050600061271060045483611ae991906159c7565b611af391906159a7565b9050611b196040858154811061118357634e487b7160e01b600052603260045260246000fd5b603b8481548110611b3a57634e487b7160e01b600052603260045260246000fd5b906000526020600020015486611b5091906159e6565b95506000603b8581548110611b7557634e487b7160e01b600052603260045260246000fd5b600091825260209091200155505050600b81905580611b9381615a29565b915050611991565b5050600c54805b603b54811015611dee578b6001600160a01b031660408281548110611bd757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415611ddc576000603b8281548110611c1557634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050848110611cda5784603b8381548110611c4b57634e487b7160e01b600052603260045260246000fd5b906000526020600020016000828254611c6491906159e6565b9091555050601054600090670de0b6b3a764000090611c8390896159c7565b611c8d91906159a7565b9050600061271060045483611ca291906159c7565b611cac91906159a7565b9050611cd26040858154811061118357634e487b7160e01b600052603260045260246000fd5b505050611dee565b6000670de0b6b3a7640000600f60010154603b8581548110611d0c57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154611d2191906159c7565b611d2b91906159a7565b9050600061271060045483611d4091906159c7565b611d4a91906159a7565b9050611d706040858154811061118357634e487b7160e01b600052603260045260246000fd5b603b8481548110611d9157634e487b7160e01b600052603260045260246000fd5b906000526020600020015487611da791906159e6565b96506000603b8581548110611dcc57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001555050505b80611de681615a29565b915050611ba2565b508715611eaf57603c80546001808201909255600080516020615ab483398151915201899055604180549182018155600052600080516020615ad48339815191520180546001600160a01b0319166001600160a01b038e161790558760146003016000828254611e5e919061598f565b90915550889050601a6003016000828254611e79919061598f565b9091555050336000908152604a6020908152604080832060038452909152812080548a9290611ea990849061598f565b90915550505b8615611f6f57603d80546001808201909255600080516020615b3483398151915201889055604280549182018155600052600080516020615a948339815191520180546001600160a01b0319166001600160a01b038e161790558660146004016000828254611f1e919061598f565b90915550879050601a6004016000828254611f39919061598f565b9091555050336000908152604a602090815260408083206004845290915281208054899290611f6990849061598f565b90915550505b851561202f57603e80546001808201909255600080516020615b1483398151915201879055604380549182018155600052600080516020615af48339815191520180546001600160a01b0319166001600160a01b038e161790558560146005016000828254611fde919061598f565b90915550869050601a6005016000828254611ff9919061598f565b9091555050336000908152604a60209081526040808320600584529091528120805488929061202990849061598f565b90915550505b836014600201600082825461204491906159e6565b909155505060165461189f576008805462ff000019168155600190600361187f565b886003141561275b5760125460009061208783670de0b6b3a76400006159c7565b61209191906159a7565b90508060146003015410156120b85760405162461bcd60e51b815260040161073e90615904565b806120c3848661598f565b146120e05760405162461bcd60e51b815260040161073e906158ba565b6008546301000000900460ff166121095760405162461bcd60e51b815260040161073e9061593b565b600060646121188360146159c7565b61212291906159a7565b9050600060646121338460286159c7565b61213d91906159a7565b600d54909150805b603c5481101561234f576000603c828154811061217257634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508381106122375783603c83815481106121a857634e487b7160e01b600052603260045260246000fd5b9060005260206000200160008282546121c191906159e6565b9091555050601254600090670de0b6b3a7640000906121e090896159c7565b6121ea91906159a7565b90506000612710600454836121ff91906159c7565b61220991906159a7565b905061222f6041858154811061118357634e487b7160e01b600052603260045260246000fd5b50505061234f565b6000670de0b6b3a7640000600f60030154603c858154811061226957634e487b7160e01b600052603260045260246000fd5b906000526020600020015461227e91906159c7565b61228891906159a7565b905060006127106004548361229d91906159c7565b6122a791906159a7565b90506122cd6041858154811061118357634e487b7160e01b600052603260045260246000fd5b603c84815481106122ee57634e487b7160e01b600052603260045260246000fd5b90600052602060002001548661230491906159e6565b95506000603c858154811061232957634e487b7160e01b600052603260045260246000fd5b600091825260209091200155505050600b8190558061234781615a29565b915050612145565b5050600d54805b603c548110156125a2578b6001600160a01b03166041828154811061238b57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415612590576000603c82815481106123c957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905084811061248e5784603c83815481106123ff57634e487b7160e01b600052603260045260246000fd5b90600052602060002001600082825461241891906159e6565b9091555050601254600090670de0b6b3a76400009061243790896159c7565b61244191906159a7565b905060006127106004548361245691906159c7565b61246091906159a7565b90506124866041858154811061118357634e487b7160e01b600052603260045260246000fd5b5050506125a2565b6000670de0b6b3a7640000600f60030154603c85815481106124c057634e487b7160e01b600052603260045260246000fd5b90600052602060002001546124d591906159c7565b6124df91906159a7565b90506000612710600454836124f491906159c7565b6124fe91906159a7565b90506125246041858154811061118357634e487b7160e01b600052603260045260246000fd5b603c848154811061254557634e487b7160e01b600052603260045260246000fd5b90600052602060002001548761255b91906159e6565b96506000603c858154811061258057634e487b7160e01b600052603260045260246000fd5b6000918252602090912001555050505b8061259a81615a29565b915050612356565b50861561266357603d80546001808201909255600080516020615b3483398151915201889055604280549182018155600052600080516020615a948339815191520180546001600160a01b0319166001600160a01b038e161790558660146004016000828254612612919061598f565b90915550879050601a600401600082825461262d919061598f565b9091555050336000908152604a60209081526040808320600484529091528120805489929061265d90849061598f565b90915550505b851561272357603e80546001808201909255600080516020615b1483398151915201879055604380549182018155600052600080516020615af48339815191520180546001600160a01b0319166001600160a01b038e1617905585601460050160008282546126d2919061598f565b90915550869050601a60050160008282546126ed919061598f565b9091555050336000908152604a60209081526040808320600584529091528120805488929061271d90849061598f565b90915550505b836014600301600082825461273891906159e6565b909155505060175461189f576008805463ff00000019168155600190600461187f565b8860041415612d8e5760135460009061277c83670de0b6b3a76400006159c7565b61278691906159a7565b90508060146004015410156127ad5760405162461bcd60e51b815260040161073e90615904565b8083146127cc5760405162461bcd60e51b815260040161073e906158ba565b600854640100000000900460ff166127f65760405162461bcd60e51b815260040161073e9061593b565b600060646128058360146159c7565b61280f91906159a7565b9050600060646128208460286159c7565b61282a91906159a7565b600e54909150805b603d54811015612a3c576000603d828154811061285f57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508381106129245783603d838154811061289557634e487b7160e01b600052603260045260246000fd5b9060005260206000200160008282546128ae91906159e6565b9091555050601354600090670de0b6b3a7640000906128cd90896159c7565b6128d791906159a7565b90506000612710600454836128ec91906159c7565b6128f691906159a7565b905061291c6042858154811061118357634e487b7160e01b600052603260045260246000fd5b505050612a3c565b6000670de0b6b3a7640000600f60040154603d858154811061295657634e487b7160e01b600052603260045260246000fd5b906000526020600020015461296b91906159c7565b61297591906159a7565b905060006127106004548361298a91906159c7565b61299491906159a7565b90506129ba6042858154811061118357634e487b7160e01b600052603260045260246000fd5b603d84815481106129db57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154866129f191906159e6565b95506000603d8581548110612a1657634e487b7160e01b600052603260045260246000fd5b600091825260209091200155505050600b81905580612a3481615a29565b915050612832565b5050600e54805b603d54811015612c8f578b6001600160a01b031660428281548110612a7857634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415612c7d576000603d8281548110612ab657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050848110612b7b5784603d8381548110612aec57634e487b7160e01b600052603260045260246000fd5b906000526020600020016000828254612b0591906159e6565b9091555050601354600090670de0b6b3a764000090612b2490896159c7565b612b2e91906159a7565b9050600061271060045483612b4391906159c7565b612b4d91906159a7565b9050612b736042858154811061118357634e487b7160e01b600052603260045260246000fd5b505050612c8f565b6000670de0b6b3a7640000600f60040154603d8581548110612bad57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154612bc291906159c7565b612bcc91906159a7565b9050600061271060045483612be191906159c7565b612beb91906159a7565b9050612c116042858154811061118357634e487b7160e01b600052603260045260246000fd5b603d8481548110612c3257634e487b7160e01b600052603260045260246000fd5b906000526020600020015487612c4891906159e6565b96506000603d8581548110612c6d57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001555050505b80612c8781615a29565b915050612a43565b508515612d5057603e80546001808201909255600080516020615b1483398151915201879055604380549182018155600052600080516020615af48339815191520180546001600160a01b0319166001600160a01b038e161790558560146005016000828254612cff919061598f565b90915550869050601a6005016000828254612d1a919061598f565b9091555050336000908152604a602090815260408083206005845290915281208054889290612d4a90849061598f565b90915550505b8360146004016000828254612d6591906159e6565b9091555050601854612d89576008805465ffff000000001916650100000000001790555b505050505b6007544210612db25762278d0060076000828254612dac919061598f565b90915550505b3360009081526044602052604081208054839290612dd190849061598f565b90915550506001600160a01b03871660009081526046602052604081208054839290612dfe90849061598f565b90915550506003546040516380f78b3f60e01b81526001600160a01b0389811660048301526000602483018190529216906380f78b3f9060440160206040518083038186803b158015612e5057600080fd5b505afa158015612e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e8891906157dc565b905060038110158015612ebc57506001600160a01b038816600090815260466020526040902054685150ae84a8cdf0000011155b8015612ee457506001600160a01b03881660009081526044602052604090206008015460ff16155b15612f10576001600160a01b0388166000908152604460205260409020600801805460ff191660011790555b612f1a898361417e565b612f2489836146e9565b6001600160a01b038816600090815260466020526040902054612f48908990614b39565b612f528983614fb9565b6002546000546040516370a0823160e01b8152306004820152612fd6926001600160a01b039081169216906370a082319060240160206040518083038186803b158015612f9e57600080fd5b505afa158015612fb2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a291906157dc565b5050505050505050505050565b33600090815260496020908152604080832084845290915290205460ff16156130405760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b604482015260640161073e565b60035460405163743fc74560e01b81526001600160a01b0384811660048301523392169063743fc7459060240160206040518083038186803b15801561308557600080fd5b505afa158015613099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130bd9190615679565b6001600160a01b03161461310b5760405162461bcd60e51b815260206004820152601560248201527424b731b7b93932b1ba103a37b81039b837b739b7b960591b604482015260640161073e565b6001600160a01b0382166000908152604860208181526040808420858552825280842054338552928252808420858552909152822054909161314d83836159e6565b905060006a084595161401484a000000841015801561317757506a084595161401484a0000008210155b1561318d575069d3c21bcecceda1000000613328565b6a0422ca8b0a00a42500000084101580156131b357506a0422ca8b0a00a4250000008210155b156131c957506954b40b1f852bda000000613328565b6a01a784379d99db4200000084101580156131ef57506a01a784379d99db420000008210155b156132055750691fc3842bd1f071c00000613328565b6969e10de76676d0800000841015801561322957506969e10de76676d08000008210155b1561323f57506907695a92c20d6fe00000613328565b691a784379d99db420000084101580156132635750691a784379d99db42000008210155b1561327957506901ccc9324511e4500000613328565b690a968163f0a57b400000841015801561329d5750690a968163f0a57b4000008210155b156132b2575068a2a15d09519be00000613328565b69032d26d12e980b60000084101580156132d6575069032d26d12e980b6000008210155b156132eb5750682b5e3af16b18800000613328565b69010f0cf064dd59200000841015801561330f575069010f0cf064dd592000008210155b156133245750680d8d726b7177a80000613328565b5060005b6000811180156133bf5750600054600154604051636eb1769f60e11b81526001600160a01b0391821660048201523060248201528392919091169063dd62ed3e9060440160206040518083038186803b15801561338457600080fd5b505afa158015613398573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133bc91906157dc565b10155b801561344c57506000546001546040516370a0823160e01b81526001600160a01b039182166004820152839291909116906370a082319060240160206040518083038186803b15801561341157600080fd5b505afa158015613425573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344991906157dc565b10155b1561356057336000818152604960209081526040808320898452909152808220805460ff19166001179055600354905163743fc74560e01b8152600481019390935290916001600160a01b039091169063743fc7459060240160206040518083038186803b1580156134bd57600080fd5b505afa1580156134d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134f59190615679565b6001600160a01b03811660009081526044602052604090206008015490915060ff161561354057613540816127106006548561353191906159c7565b61353b91906159a7565b615126565b60015460005461355e916001600160a01b03918216911633856140d8565b505b505050505050565b6008816006811061357857600080fd5b60209182820401919006915054906101000a900460ff1681565b603081600a811061069557600080fd5b600f816005811061069557600080fd5b603f81815481106135c257600080fd5b6000918252602090912001546001600160a01b0316905081565b604281815481106135c257600080fd5b603b81815481106106e157600080fd5b604181815481106135c257600080fd5b604381815481106135c257600080fd5b6001546001600160a01b031633146136465760405162461bcd60e51b815260040161073e90615964565b6101f48111156136a45760405162461bcd60e51b8152602060048201526024808201527f576f726b696e6720626f6e75732063616e2774206265206d6f7265207468616e6044820152632033302560e01b606482015260840161073e565b6001600160a01b03909116600090815260476020526040902055565b336000908152604460205260409020546136ec5760405162461bcd60e51b815260040161073e90615964565b60006136f733613f5d565b90506000811180156137905750600054600154604051636eb1769f60e11b81526001600160a01b0391821660048201523060248201528392919091169063dd62ed3e9060440160206040518083038186803b15801561375557600080fd5b505afa158015613769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061378d91906157dc565b10155b801561381d57506000546001546040516370a0823160e01b81526001600160a01b039182166004820152839291909116906370a082319060240160206040518083038186803b1580156137e257600080fd5b505afa1580156137f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061381a91906157dc565b10155b1561386757336000908152604460205260408120600601805483929061384490849061598f565b9091555050600154600054613867916001600160a01b03918216911633846140d8565b50565b602681600a811061069557600080fd5b600a816005811061069557600080fd5b6001546001600160a01b031633146138b45760405162461bcd60e51b815260040161073e90615964565b60095460ff16156138fd5760405162461bcd60e51b815260206004820152601360248201527253616c6520616c726561647920656e61626c6560681b604482015260640161073e565b60035460405163743fc74560e01b81526001600160a01b038981166004830152600092169063743fc7459060240160206040518083038186803b15801561394357600080fd5b505afa158015613957573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061397b9190615679565b6001600160a01b031614156139f257600354604051639d58b15d60e01b81526001600160a01b038981166004830152888116602483015290911690639d58b15d90604401600060405180830381600087803b1580156139d957600080fd5b505af11580156139ed573d6000803e3d6000fd5b505050505b6000818385613a01888a61598f565b613a0b919061598f565b613a15919061598f565b613a1f919061598f565b90508515613b1057603a805460018082019092557fa2999d817b6757290b50e8ecf3fa939673403dd35c97de392fdb343b4015ce9e01879055603f805480830182556000919091527fc03004e3ce0784bf68186394306849f9b7b1200073105cd9aeb554a1802b58fd0180546001600160a01b0319166001600160a01b038b1617905586906014016000828254613ab6919061598f565b90915550869050601a6001016000828254613ad1919061598f565b90915550506001600160a01b0388166000908152604a602090815260408083206001845290915281208054889290613b0a90849061598f565b90915550505b8415613bfd57603b805460018082019092557fbbe3212124853f8b0084a66a2d057c2966e251e132af3691db153ab65f0d1a4d018690556040805491820181556000527f352feee0eea125f11f791c1b77524172e9bc20f1b719b6cef0fc24f64db8e15e0180546001600160a01b0319166001600160a01b038a161790558460146002016000828254613ba3919061598f565b90915550859050601a6002016000828254613bbe919061598f565b90915550506001600160a01b0388166000908152604a602090815260408083206002845290915281208054879290613bf790849061598f565b90915550505b8315613cc657603c80546001808201909255600080516020615ab483398151915201859055604180549182018155600052600080516020615ad48339815191520180546001600160a01b0319166001600160a01b038a161790558360146003016000828254613c6c919061598f565b90915550849050601a6003016000828254613c87919061598f565b90915550506001600160a01b0388166000908152604a602090815260408083206003845290915281208054869290613cc090849061598f565b90915550505b8215613d8f57603d80546001808201909255600080516020615b3483398151915201849055604280549182018155600052600080516020615a948339815191520180546001600160a01b0319166001600160a01b038a161790558260146004016000828254613d35919061598f565b90915550839050601a6004016000828254613d50919061598f565b90915550506001600160a01b0388166000908152604a602090815260408083206004845290915281208054859290613d8990849061598f565b90915550505b8115613e5857603e80546001808201909255600080516020615b1483398151915201839055604380549182018155600052600080516020615af48339815191520180546001600160a01b0319166001600160a01b038a161790558160146005016000828254613dfe919061598f565b90915550829050601a6005016000828254613e19919061598f565b90915550506001600160a01b0388166000908152604a602090815260408083206005845290915281208054849290613e5290849061598f565b90915550505b8060146000016000828254613e6d91906159e6565b909155505089516001600160a01b039890981660008181526044602081815260408084209c8d55818f015160018e0155808f015160028e015560608f015160038e015560808f015160048e015560a08f015160058e015560c08f015160068e015560e0909e0151604882528e8420600754855282529d83209d909d559190529099525050506008909301805460ff19169415159490941790935550505050565b604081815481106135c257600080fd5b603e81815481106106e157600080fd5b603d81815481106106e157600080fd5b603a81815481106106e157600080fd5b601a816006811061069557600080fd5b6001600160a01b03811660009081526044602052604081205415613fe3576001600160a01b03821660009081526044602052604081206006810154600582015460048301546002840154600190940154929391929091613fbc9161598f565b613fc6919061598f565b613fd0919061598f565b613fda91906159e6565b9150613fe79050565b5060005b919050565b60085465010000000000900460ff166140475760405162461bcd60e51b815260206004820152601f60248201527f45786368616e6765207374616765206973206e6f742073746172742079657400604482015260640161073e565b33600090815260446020908152604080832060070154604a83528184206005855290925282205461407891906159e6565b9050801561386757604051339082156108fc029083906000818181858888f193505050501580156140ad573d6000803e3d6000fd5b5033600090815260446020526040812060070180548392906140d090849061598f565b909155505050565b6040516001600160a01b03808516602483015283166044820152606481018290526141439085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526153f2565b50505050565b6040516001600160a01b03831660248201526044810182905261417990849063a9059cbb60e01b9060640161410c565b505050565b60035460405163743fc74560e01b81526001600160a01b038481166004830152600092169063743fc7459060240160206040518083038186803b1580156141c457600080fd5b505afa1580156141d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141fc9190615679565b905060005b600a811015614143576001600160a01b03821615614653576003546040516380f78b3f60e01b81526001600160a01b0384811660048301526000602483018190529216906380f78b3f9060440160206040518083038186803b15801561426657600080fd5b505afa15801561427a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061429e91906157dc565b9050603082600a81106142c157634e487b7160e01b600052603260045260246000fd5b0154811061464d5760035460405163743fc74560e01b81526001600160a01b038581166004830152600092169063743fc7459060240160206040518083038186803b15801561430f57600080fd5b505afa158015614323573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143479190615679565b905082158015614358575060058210155b156144ac576000612710602685600a811061438357634e487b7160e01b600052603260045260246000fd5b015461438f90886159c7565b61439a9060026159c7565b6143a491906159a7565b6001600160a01b03831660009081526044602052604090206008015490915060ff16156143e0576143e0826127106006548461353191906159c7565b6001600160a01b0385166000908152604560205260409020819085600a811061441957634e487b7160e01b600052603260045260246000fd5b01805460009061442a90849061598f565b90915550506001600160a01b0385166000908152604460205260408120600101805483929061445a90849061598f565b90915550506001600160a01b0385166000908152604460205260408120600601805483929061448a90849061598f565b90915550506000546144a6906001600160a01b03168683614149565b5061464b565b826144e3576000612710602685600a81106144d757634e487b7160e01b600052603260045260246000fd5b015461439a90886159c7565b6001600160a01b038416600090815260466020526040902054685150ae84a8cdf000001161464b576000612710602685600a811061453157634e487b7160e01b600052603260045260246000fd5b015461453d90886159c7565b61454791906159a7565b6001600160a01b03831660009081526044602052604090206008015490915060ff161561458357614583826127106006548461353191906159c7565b6001600160a01b0385166000908152604560205260409020819085600a81106145bc57634e487b7160e01b600052603260045260246000fd5b0180546000906145cd90849061598f565b90915550506001600160a01b038516600090815260446020526040812060010180548392906145fd90849061598f565b90915550506001600160a01b0385166000908152604460205260408120600601805483929061462d90849061598f565b9091555050600054614649906001600160a01b03168683614149565b505b505b50614658565b614143565b60035460405163743fc74560e01b81526001600160a01b0384811660048301529091169063743fc7459060240160206040518083038186803b15801561469d57600080fd5b505afa1580156146b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146d59190615679565b9150806146e181615a29565b915050614201565b60035460405163743fc74560e01b81526001600160a01b038481166004830152600092169063743fc7459060240160206040518083038186803b15801561472f57600080fd5b505afa158015614743573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147679190615679565b905060005b610200811015614143576001600160a01b03821615614653576001600160a01b03821660009081526047602052604090205415614aa8576001600160a01b038216600090815260476020526040812054612710906147ca90866159c7565b6147d491906159a7565b6000546040516370a0823160e01b815230600482015291925082916001600160a01b03909116906370a082319060240160206040518083038186803b15801561481c57600080fd5b505afa158015614830573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061485491906157dc565b106148d6576001600160a01b0383166000908152604460205260408120600401805483929061488490849061598f565b90915550506001600160a01b038516600090815260446020526040812060060180548392906148b490849061598f565b90915550506000546148d0906001600160a01b03168683614149565b50614143565b600054600154604051636eb1769f60e11b81526001600160a01b0391821660048201523060248201528392919091169063dd62ed3e9060440160206040518083038186803b15801561492757600080fd5b505afa15801561493b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061495f91906157dc565b101580156149ee57506000546001546040516370a0823160e01b81526001600160a01b039182166004820152839291909116906370a082319060240160206040518083038186803b1580156149b357600080fd5b505afa1580156149c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149eb91906157dc565b10155b15614a71576001600160a01b03831660009081526044602052604081206004018054839290614a1e90849061598f565b90915550506001600160a01b03851660009081526044602052604081206006018054839290614a4e90849061598f565b90915550506001546000546148d0916001600160a01b03918216911685846140d8565b6001600160a01b03831660009081526044602052604081206004018054839290614a9c90849061598f565b90915550614143915050565b60035460405163743fc74560e01b81526001600160a01b0384811660048301529091169063743fc7459060240160206040518083038186803b158015614aed57600080fd5b505afa158015614b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b259190615679565b915080614b3181615a29565b91505061476c565b6000614b47610bb8836159a7565b614b5990670de0b6b3a76400006159c7565b614b6c90681043561a88293000006159c7565b6001600160a01b038416600090815260446020526040902060020154909150811115614179576001600160a01b038316600090815260446020526040812060020154614bb890836159e6565b60035460405163743fc74560e01b81526001600160a01b038781166004830152929350604492600092169063743fc7459060240160206040518083038186803b158015614c0457600080fd5b505afa158015614c18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c3c9190615679565b6001600160a01b0316815260208101919091526040016000206008015460ff1615614cf15760035460405163743fc74560e01b81526001600160a01b038681166004830152614cf192169063743fc7459060240160206040518083038186803b158015614ca857600080fd5b505afa158015614cbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ce09190615679565b6127106006548461353191906159c7565b6000546040516370a0823160e01b815230600482015282916001600160a01b0316906370a082319060240160206040518083038186803b158015614d3457600080fd5b505afa158015614d48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d6c91906157dc565b10614de8576001600160a01b03841660009081526044602052604081206002018054839290614d9c90849061598f565b90915550506001600160a01b03841660009081526044602052604081206006018054839290614dcc90849061598f565b9091555050600054614653906001600160a01b03168583614149565b600054600154604051636eb1769f60e11b81526001600160a01b0391821660048201523060248201528392919091169063dd62ed3e9060440160206040518083038186803b158015614e3957600080fd5b505afa158015614e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e7191906157dc565b10158015614f0057506000546001546040516370a0823160e01b81526001600160a01b039182166004820152839291909116906370a082319060240160206040518083038186803b158015614ec557600080fd5b505afa158015614ed9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614efd91906157dc565b10155b15614f83576001600160a01b03841660009081526044602052604081206002018054839290614f3090849061598f565b90915550506001600160a01b03841660009081526044602052604081206006018054839290614f6090849061598f565b9091555050600154600054614653916001600160a01b03918216911686846140d8565b6001600160a01b03841660009081526044602052604081206002018054839290614fae90849061598f565b909155505050505050565b60035460405163743fc74560e01b81526001600160a01b038481166004830152600092169063743fc7459060240160206040518083038186803b158015614fff57600080fd5b505afa158015615013573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150379190615679565b905060005b610200811015614143576001600160a01b03821615614653576001600160a01b038216600090815260486020908152604080832060075484529091528120805485929061508a90849061598f565b909155506150959050565b60035460405163743fc74560e01b81526001600160a01b0384811660048301529091169063743fc7459060240160206040518083038186803b1580156150da57600080fd5b505afa1580156150ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151129190615679565b91508061511e81615a29565b91505061503c565b6000546040516370a0823160e01b815230600482015282916001600160a01b0316906370a082319060240160206040518083038186803b15801561516957600080fd5b505afa15801561517d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151a191906157dc565b10615222576001600160a01b038216600090815260446020526040812060050180548392906151d190849061598f565b90915550506001600160a01b0382166000908152604460205260408120600601805483929061520190849061598f565b909155505060005461521d906001600160a01b03168383614149565b6153ee565b600054600154604051636eb1769f60e11b81526001600160a01b0391821660048201523060248201528392919091169063dd62ed3e9060440160206040518083038186803b15801561527357600080fd5b505afa158015615287573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152ab91906157dc565b1015801561533a57506000546001546040516370a0823160e01b81526001600160a01b039182166004820152839291909116906370a082319060240160206040518083038186803b1580156152ff57600080fd5b505afa158015615313573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061533791906157dc565b10155b156153bd576001600160a01b0382166000908152604460205260408120600501805483929061536a90849061598f565b90915550506001600160a01b0382166000908152604460205260408120600601805483929061539a90849061598f565b909155505060015460005461521d916001600160a01b03918216911684846140d8565b6001600160a01b038216600090815260446020526040812060050180548392906153e890849061598f565b90915550505b5050565b6000615447826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166154c49092919063ffffffff16565b805190915015614179578080602001905181019061546591906157a8565b6141795760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161073e565b60606154d384846000856154dd565b90505b9392505050565b60608247101561553e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161073e565b6001600160a01b0385163b6155955760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161073e565b600080866001600160a01b031685876040516155b1919061586b565b60006040518083038185875af1925050503d80600081146155ee576040519150601f19603f3d011682016040523d82523d6000602084013e6155f3565b606091505b509150915061560382828661560e565b979650505050505050565b6060831561561d5750816154d6565b82511561562d5782518084602001fd5b8160405162461bcd60e51b815260040161073e9190615887565b8035613fe781615a70565b8035613fe781615a85565b60006020828403121561566e578081fd5b81356154d681615a70565b60006020828403121561568a578081fd5b81516154d681615a70565b600080604083850312156156a7578081fd5b82356156b281615a70565b946020939093013593505050565b60008060008060008060008060006102008a8c0312156156de578485fd5b8a601f8b01126156ec578485fd5b60405161010080820182811067ffffffffffffffff8211171561571157615711615a5a565b6040528b01818c8e831115615724578889fd5b885b6008811015615745578135835260209283019290910190600101615726565b505050819a5061575481615652565b995050506157656101208b01615647565b96506157746101408b01615647565b989b979a5095986101608101359761018082013597506101a082013596506101c082013595506101e0909101359350915050565b6000602082840312156157b9578081fd5b81516154d681615a85565b6000602082840312156157d5578081fd5b5035919050565b6000602082840312156157ed578081fd5b5051919050565b60008060008060008060008060006101208a8c031215615812578485fd5b8935985060208a0135975060408a013561582b81615a70565b965060608a013561583b81615a70565b989b979a50959860808101359760a0820135975060c0820135965060e08201359550610100909101359350915050565b6000825161587d8184602087016159fd565b9190910192915050565b60006020825282518060208401526158a68160408501602087016159fd565b601f01601f19169190910160400192915050565b6020808252602a908201527f53746167657769736520636f696e20646973747275626174696f6e206973206e6040820152691bdd0818dbdc9c9958dd60b21b606082015260800190565b6020808252601a908201527f544243206e6f7420617661696c61626c6520666f722073616c65000000000000604082015260600190565b6020808252600f908201526e14dd1859d9481a5cc818db1bdcd959608a1b604082015260600190565b602080825260119082015270125b98dbdc9c9958dd081c995c5d595cdd607a1b604082015260600190565b600082198211156159a2576159a2615a44565b500190565b6000826159c257634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156159e1576159e1615a44565b500290565b6000828210156159f8576159f8615a44565b500390565b60005b83811015615a18578181015183820152602001615a00565b838111156141435750506000910152565b6000600019821415615a3d57615a3d615a44565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461386757600080fd5b801515811461386757600080fdfe38dfe4635b27babeca8be38d3b448cb5161a639b899a14825ba9c8d7892eb8c3c6bb06cb7f92603de181bf256cd16846b93b752a170ff24824098b31aa008a7e7c9785e8241615bc80415d89775984a1337d15dc1bf4ce50f41988b2a2b336a79690ad99d6ce244efa8a0f6c2d04036d3b33a9474db32a71b71135c6951027938d800d6614d35eed73733ee453164a3b48076eb3138f466adeeb9dec7bb31f70ece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc3a2646970667358221220cc9a605ea346b3a176843840a0d2a8bed2708ba2afc06ca79914d0d4d3d7244b64736f6c63430008020033
1. FundWallet

2. Referrals

3. TBCPerStage

4. TUSD

5. communityIncentives

6. extraIncentives

7. indexPerStage

8. investmentPackages

9. mapLevelEarning

10. mapUserInfo

11. monthlySale

12. monthlySaleClaimed

13. nextRewardDrain

14. ownerWallet

15. pendingReward

16. pricePerStage

17. referrerBonus

18. royaltyIncentive

19. saleEnable

20. stage2UserTBC

21. stage2UserWallet

22. stage3UserTBC

23. stage3UserWallet

24. stage4UserTBC

25. stage4UserWallet

26. stage5UserTBC

27. stage5UserWallet

28. stage6UserTBC

29. stage6UserWallet

30. stageWiseTBC

31. stageWiseTBCSold

32. statusPerStage

33. teamRequiredForBonus

34. totalBusiness

35. usersTBCPerStage

36. workingBonus

1. buy
2. claimMonthlyReward
3. claimTBC
4. setTeam
5. setWorkingBonus
6. 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.