Contract

0x4b889555FD8D113885494454b39C5c7F46eFCa89

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

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

File 1 of 6 : Address.sol

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

File 2 of 6 : Context.sol

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

File 3 of 6 : IERC20.sol

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

File 4 of 6 : InvestmentPlan.sol

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

File 5 of 6 : SafeERC20.sol

pragma solidity ^0.8.0; // SPDX-License-Identifier: MIT import "./IERC20.sol"; import "./draft-IERC20Permit.sol"; import "./Address.sol"; library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } function _callOptionalReturn(IERC20 token, bytes memory data) private { bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }

File 6 of 6 : draft-IERC20Permit.sol

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

File 1 of 1 : ABI.json

[ { "inputs": [ { "internalType": "address", "name": "investor", "type": "address" }, { "internalType": "address", "name": "sponsor", "type": "address" } ], "name": "addMember", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "investor", "type": "address" } ], "name": "getSponsor", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "sponsor", "type": "address" }, { "internalType": "uint256", "name": "level", "type": "uint256" } ], "name": "getTeam", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" } ]
Contract Creation Code
0x608060405234801561001057600080fd5b506004361061023c5760003560e01c806375106f4e1161013b578063bef18a6b116100b8578063e8aca46a1161007c578063e8aca46a146105ff578063f40f0f5214610612578063f52d1ebe14610625578063fcb1112414610638578063fe4ca8471461064057600080fd5b8063bef18a6b146105b4578063c0fa2214146105c7578063c44f98b6146105da578063de216f66146105e3578063df32dc5c146105ec57600080fd5b806384cd5505116100ff57806384cd550514610544578063946b2a521461056457806397c571ad1461057757806399b008ce146105a25780639e15cf72146105ab57600080fd5b806375106f4e146104cd57806377d42fc9146104f85780637c9171871461050b5780637cb936e71461051e5780638323550b1461053157600080fd5b8063303256fb116101c957806358dc970d1161018d57806358dc970d146104565780635b591627146104695780635ec38bec1461047c57806366f150e71461048f5780636f20befd146104ba57600080fd5b8063303256fb146103ea578063357ec6e2146103fd578063441222441461041d5780634c7cdb82146104305780634e7397731461044357600080fd5b80631d63a0a8116102105780631d63a0a8146103645780632276fbf91461037957806324531ba01461038c57806324f978351461039f57806326745f2d146103c757600080fd5b80624a98e81461024157806306dc731414610267578063156129331461027a57806318af761114610339575b600080fd5b61025461024f36600461549c565b61064d565b6040519081526020015b60405180910390f35b6102546102753660046154b5565b610664565b6102e46102883660046154ec565b603b60205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a909a01549899979896979596949593949293919290919060ff168b565b604080519b8c5260208c019a909a52988a01979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083015215156101408201526101600161025e565b60025461034c906001600160a01b031681565b6040516001600160a01b03909116815260200161025e565b610377610372366004615509565b610695565b005b61025461038736600461549c565b610c2f565b61037761039a366004615509565b610c3f565b6102546103ad366004615509565b604060208181526000938452818420905290825290205481565b6103da6103d536600461549c565b610cf8565b604051901515815260200161025e565b6102546103f836600461549c565b610d22565b61025461040b3660046154ec565b603d6020526000908152604090205481565b61025461042b36600461549c565b610d32565b60015461034c906001600160a01b031681565b61034c6104513660046154b5565b610d42565b61025461046436600461549c565b610d7a565b6103776104773660046154ec565b610d8a565b61037761048a3660046154ec565b610dfc565b61025461049d366004615509565b603f60209081526000928352604080842090915290825290205481565b60035461034c906001600160a01b031681565b6102546104db366004615509565b603e60209081526000928352604080842090915290825290205481565b61025461050636600461549c565b610e6e565b61025461051936600461549c565b610e7e565b61037761052c366004615509565b610e8e565b60005461034c906001600160a01b031681565b6102546105523660046154ec565b603c6020526000908152604090205481565b61037761057236600461560c565b610f3e565b61025461058536600461574f565b604360209081526000928352604080842090915290825290205481565b61025460055481565b61025460075481565b6103776105c236600461577f565b611cfc565b6102546105d536600461580a565b6126da565b61025460065481565b61025460045481565b6103776105fa36600461549c565b612718565b61037761060d3660046154ec565b612879565b6102546106203660046154ec565b6128ee565b6103776106333660046154b5565b6129ae565b610377612a33565b6008546103da9060ff1681565b601d816006811061065d57600080fd5b0154905081565b6041602052816000526040600020818154811061068057600080fd5b90600052602060002001600091509150505481565b336000908152604060208181528183208484529052902054156106ff5760405162461bcd60e51b815260206004820152601e60248201527f4d6f6e74686c792072657761726420616c726561647920636c61696d6564000060448201526064015b60405180910390fd5b60035460405163743fc74560e01b81526001600160a01b0384811660048301523392169063743fc74590602401602060405180830381865afa158015610749573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076d9190615842565b6001600160a01b0316146107c35760405162461bcd60e51b815260206004820152601a60248201527f546f702073706f6e736f72206973206e6f7420636f727265637400000000000060448201526064016106f6565b6001600160a01b0382166000908152603f6020818152604080842085855282528084205433855292825280842085855290915282205490916108058383615875565b905060006a084595161401484a000000841015801561082f57506a084595161401484a0000008210155b15610845575069d3c21bcecceda10000006109d8565b6a0422ca8b0a00a425000000841015801561086b57506a0422ca8b0a00a4250000008210155b1561088157506954b40b1f852bda0000006109d8565b6a01a784379d99db4200000084101580156108a757506a01a784379d99db420000008210155b156108bd5750691fc3842bd1f071c000006109d8565b6969e10de76676d080000084101580156108e157506969e10de76676d08000008210155b156108f757506907695a92c20d6fe000006109d8565b691a784379d99db4200000841015801561091b5750691a784379d99db42000008210155b1561093157506901ccc9324511e45000006109d8565b690a968163f0a57b40000084101580156109555750690a968163f0a57b4000008210155b1561096a575068a2a15d09519be000006109d8565b69032d26d12e980b600000841015801561098e575069032d26d12e980b6000008210155b156109a35750682b5e3af16b188000006109d8565b69010f0cf064dd5920000084101580156109c7575069010f0cf064dd592000008210155b156109d85750680d8d726b7177a800005b600081118015610a605750600054600154604051636eb1769f60e11b81526001600160a01b0391821660048201523060248201528392919091169063dd62ed3e90604401602060405180830381865afa158015610a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5d919061588c565b10155b8015610ade57506000546001546040516370a0823160e01b81526001600160a01b039182166004820152839291909116906370a0823190602401602060405180830381865afa158015610ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610adb919061588c565b10155b15610c275733600081815260406020818152818320898452905280822060019055600354905163743fc74560e01b8152600481019390935290916001600160a01b039091169063743fc74590602401602060405180830381865afa158015610b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6e9190615842565b6001600160a01b0381166000908152603b60205260409020600a015490915060ff1615610bb957610bb98161271060045485610baa91906158a5565b610bb491906158c4565b612b36565b336000908152603b602052604081206003018054849290610bdb9084906158e6565b9091555050336000908152603b602052604081206008018054849290610c029084906158e6565b9091555050600154600054610c25916001600160a01b0391821691163385612dd5565b505b505050505050565b6034816006811061065d57600080fd5b6002546001600160a01b03163314610c695760405162461bcd60e51b81526004016106f6906158fe565b6001600160a01b0382166000908152603b6020526040902054610cc45760405162461bcd60e51b8152602060048201526013602482015272155cd95c881a5cc81b9bdd0818dbdc9c9958dd606a1b60448201526064016106f6565b6001600160a01b0382166000908152603b602052604081206007018054839290610cef9084906158e6565b90915550505050565b603a8160068110610d0857600080fd5b60209182820401919006915054906101000a900460ff1681565b601381600a811061065d57600080fd5b6023816005811061065d57600080fd5b60426020528160005260406000208181548110610d5e57600080fd5b6000918252602090912001546001600160a01b03169150829050565b6028816006811061065d57600080fd5b6001600160a01b038116610db05760405162461bcd60e51b81526004016106f690615935565b6002546001600160a01b03163314610dda5760405162461bcd60e51b81526004016106f6906158fe565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116610e225760405162461bcd60e51b81526004016106f690615935565b6002546001600160a01b03163314610e4c5760405162461bcd60e51b81526004016106f6906158fe565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600981600a811061065d57600080fd5b602e816006811061065d57600080fd5b6002546001600160a01b03163314610eb85760405162461bcd60e51b81526004016106f6906158fe565b6001600160a01b0382166000908152603b6020526040902054610f135760405162461bcd60e51b8152602060048201526013602482015272155cd95c881a5cc81b9bdd0818dbdc9c9958dd606a1b60448201526064016106f6565b6101f4811115610f2257600080fd5b6001600160a01b039091166000908152603d6020526040902055565b6002546001600160a01b03163314610f685760405162461bcd60e51b81526004016106f6906158fe565b60085460ff1615610fb25760405162461bcd60e51b815260206004820152601460248201527314d85b1948185b1c9958591e481cdd185c9d195960621b60448201526064016106f6565b6003546001600160a01b031661100a5760405162461bcd60e51b815260206004820152601e60248201527f526566657272616c2061646472657373206e6f7420616464656420796574000060448201526064016106f6565b60005b87811015611ced5760008d8d838181106110295761102961595b565b905061016002016008600b81106110425761104261595b565b6020020135905060018111156110a55760405162461bcd60e51b815260206004820152602260248201527f546869732066756e6374696f6e206f6e6c7920666f7220737461676520312026604482015261101960f11b60648201526084016106f6565b6003546000906001600160a01b031663743fc7458a8a868181106110cb576110cb61595b565b90506020020160208101906110e091906154ec565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611124573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111489190615842565b6001600160a01b031614801561118e5750600086868481811061116d5761116d61595b565b905060200201602081019061118291906154ec565b6001600160a01b031614155b15611253576003546001600160a01b0316639d58b15d8989858181106111b6576111b661595b565b90506020020160208101906111cb91906154ec565b8888868181106111dd576111dd61595b565b90506020020160208101906111f291906154ec565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401600060405180830381600087803b15801561123a57600080fd5b505af115801561124e573d6000803e3d6000fd5b505050505b60008484848181106112675761126761595b565b905060a0020160046005811061127f5761127f61595b565b60200201358585858181106112965761129661595b565b905060a002016003600581106112ae576112ae61595b565b60200201358686868181106112c5576112c561595b565b905060a002016002600581106112dd576112dd61595b565b60200201358787878181106112f4576112f461595b565b905060a0020160016005811061130c5761130c61595b565b60200201358888888181106113235761132361595b565b905060a0020160006005811061133b5761133b61595b565b602002013561134a91906158e6565b61135491906158e6565b61135e91906158e6565b61136891906158e6565b90508e8e8481811061137c5761137c61595b565b905061016002016008600b81106113955761139561595b565b60200201356115ee57808585858181106113b1576113b161595b565b905060a002016004600581106113c9576113c961595b565b60200201358686868181106113e0576113e061595b565b905060a002016003600581106113f8576113f861595b565b602002013587878781811061140f5761140f61595b565b905060a002016002600581106114275761142761595b565b602002013588888881811061143e5761143e61595b565b905060a002016001600581106114565761145661595b565b602002013589898981811061146d5761146d61595b565b905060a002016000600581106114855761148561595b565b602002013561149491906158e6565b61149e91906158e6565b6114a891906158e6565b6114b291906158e6565b146114cf5760405162461bcd60e51b81526004016106f690615971565b6115e98989858181106114e4576114e461595b565b90506020020160208101906114f991906154ec565b86868681811061150b5761150b61595b565b905060a002016000600581106115235761152361595b565b602002013587878781811061153a5761153a61595b565b905060a002016001600581106115525761155261595b565b60200201358888888181106115695761156961595b565b905060a002016002600581106115815761158161595b565b60200201358989898181106115985761159861595b565b905060a002016003600581106115b0576115b061595b565b60200201358a8a8a8181106115c7576115c761595b565b905060a002016004600581106115df576115df61595b565b6020020135612e46565b611756565b808585858181106116015761160161595b565b905060a002016004600581106116195761161961595b565b60200201358686868181106116305761163061595b565b905060a002016003600581106116485761164861595b565b602002013587878781811061165f5761165f61595b565b905060a002016002600581106116775761167761595b565b602002013588888881811061168e5761168e61595b565b905060a002016001600581106116a6576116a661595b565b60200201356116b591906158e6565b6116bf91906158e6565b6116c991906158e6565b146116e65760405162461bcd60e51b81526004016106f690615971565b6117248989858181106116fb576116fb61595b565b905060200201602081019061171091906154ec565b600087878781811061153a5761153a61595b565b6117568d8d858181106117395761173961595b565b905060200201602081019061174e91906154ec565b600183613550565b806028836006811061176a5761176a61595b565b01600082825461177a9190615875565b9091555060019050603a83600681106117955761179561595b565b602091828204019190066101000a81548160ff0219169083151502179055508e8e848181106117c6576117c661595b565b905061016002016000600b81106117df576117df61595b565b6020020135603b60008b8b878181106117fa576117fa61595b565b905060200201602081019061180f91906154ec565b6001600160a01b031681526020810191909152604001600020558e8e8481811061183b5761183b61595b565b905061016002016001600b81106118545761185461595b565b6020020135603b60008b8b8781811061186f5761186f61595b565b905060200201602081019061188491906154ec565b6001600160a01b031681526020810191909152604001600020600101558e8e848181106118b3576118b361595b565b905061016002016002600b81106118cc576118cc61595b565b6020020135603b60008b8b878181106118e7576118e761595b565b90506020020160208101906118fc91906154ec565b6001600160a01b031681526020810191909152604001600020600201558e8e8481811061192b5761192b61595b565b905061016002016003600b81106119445761194461595b565b6020020135603b60008b8b8781811061195f5761195f61595b565b905060200201602081019061197491906154ec565b6001600160a01b031681526020810191909152604001600020600301558e8e848181106119a3576119a361595b565b905061016002016004600b81106119bc576119bc61595b565b6020020135603b60008b8b878181106119d7576119d761595b565b90506020020160208101906119ec91906154ec565b6001600160a01b031681526020810191909152604001600020600401558e8e84818110611a1b57611a1b61595b565b905061016002016005600b8110611a3457611a3461595b565b6020020135603b60008b8b87818110611a4f57611a4f61595b565b9050602002016020810190611a6491906154ec565b6001600160a01b031681526020810191909152604001600020600501558e8e84818110611a9357611a9361595b565b905061016002016006600b8110611aac57611aac61595b565b6020020135603b60008b8b87818110611ac757611ac761595b565b9050602002016020810190611adc91906154ec565b6001600160a01b031681526020810191909152604001600020600801558e8e84818110611b0b57611b0b61595b565b90506101600201600a600b8110611b2457611b2461595b565b6020020135603b60008b8b87818110611b3f57611b3f61595b565b9050602002016020810190611b5491906154ec565b6001600160a01b031681526020810191909152604001600020600701558a8a84818110611b8357611b8361595b565b9050602002016020810190611b9891906159b6565b603b60008b8b87818110611bae57611bae61595b565b9050602002016020810190611bc391906154ec565b6001600160a01b031681526020810191909152604001600020600a01805460ff19169115159190911790558e8e84818110611c0057611c0061595b565b905061016002016007600b8110611c1957611c1961595b565b6020020135603d60008b8b87818110611c3457611c3461595b565b9050602002016020810190611c4991906154ec565b6001600160a01b031681526020810191909152604001600020558e8e84818110611c7557611c7561595b565b905061016002016009600b8110611c8e57611c8e61595b565b6020020135603c60008b8b87818110611ca957611ca961595b565b9050602002016020810190611cbe91906154ec565b6001600160a01b0316815260208101919091526040016000205550819050611ce5816159d3565b91505061100d565b50505050505050505050505050565b6001600160a01b038716611d225760405162461bcd60e51b81526004016106f690615935565b6003546001600160a01b0316611d7a5760405162461bcd60e51b815260206004820152601e60248201527f526566657272616c2061646472657373206e6f7420616464656420796574000060448201526064016106f6565b60068a10611dd55760405162461bcd60e51b815260206004820152602260248201527f496e766573746d656e74207061636b61676573206973206e6f7420636f72726560448201526118dd60f21b60648201526084016106f6565b601d8a60068110611de857611de861595b565b01546000546040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e56919061588c565b1015611eb65760405162461bcd60e51b815260206004820152602960248201527f545553442062616c616e6365206e6f7420617661696c61626c6520666f7220696044820152681b9d995cdd1b595b9d60ba1b60648201526084016106f6565b876001600160a01b0316876001600160a01b03161415611f2a5760405162461bcd60e51b815260206004820152602960248201527f496e766573746f7220616e642073706f6e736f722063616e27742062652073616044820152681b59481dd85b1b195d60ba1b60648201526084016106f6565b60085460ff16611f42576008805460ff191660011790555b6000601d8b60068110611f5757611f5761595b565b0154600054909150611f74906001600160a01b0316333084612dd5565b60035460405163743fc74560e01b81526001600160a01b038b81166004830152600092169063743fc74590602401602060405180830381865afa158015611fbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe39190615842565b6001600160a01b0316141561205a57600354604051639d58b15d60e01b81526001600160a01b038b811660048301528a8116602483015290911690639d58b15d90604401600060405180830381600087803b15801561204157600080fd5b505af1158015612055573d6000803e3d6000fd5b505050505b60035460405163743fc74560e01b81526001600160a01b038b811660048301529091169063743fc74590602401602060405180830381865afa1580156120a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c89190615842565b97506001600160a01b03881615612137576001600160a01b0388166000908152603b60205260409020546121375760405162461bcd60e51b815260206004820152601660248201527514dc1bdb9cdbdc881a5cc81b9bdd0818dbdc9c9958dd60521b60448201526064016106f6565b600060238b6005811061214c5761214c61595b565b015461216083670de0b6b3a76400006158a5565b61216a91906158c4565b9050603a8b6006811061217f5761217f61595b565b602081049091015460ff601f9092166101000a9004166121e15760405162461bcd60e51b815260206004820152601760248201527f5374616765206973206e6f74206163746976652079657400000000000000000060448201526064016106f6565b8060288c600681106121f5576121f561595b565b015410156122455760405162461bcd60e51b815260206004820152601a60248201527f544243206e6f7420617661696c61626c6520666f722073616c6500000000000060448201526064016106f6565b8a6122a657808385876122588a8c6158e6565b61226291906158e6565b61226c91906158e6565b61227691906158e6565b146122935760405162461bcd60e51b81526004016106f690615971565b6122a18a8888888888612e46565b6123b7565b8a600114156122fc578083856122bc888a6158e6565b6122c691906158e6565b6122d091906158e6565b146122ed5760405162461bcd60e51b81526004016106f690615971565b6122a18a600088888888612e46565b8a6002141561234757808361231186886158e6565b61231b91906158e6565b146123385760405162461bcd60e51b81526004016106f690615971565b6122a18a600080888888612e46565b8a60031415612388578061235b84866158e6565b146123785760405162461bcd60e51b81526004016106f690615971565b6122a18a60008060008888612e46565b8083146123a75760405162461bcd60e51b81526004016106f690615971565b6123b78a60008060008088612e46565b8a156123c8576123c8888c83613c1c565b60055442106123ec5762278d00600560008282546123e691906158e6565b90915550505b8060288c600681106124005761240061595b565b0160008282546124109190615875565b909155506000905060238c6005811061242b5761242b61595b565b0154601d5461244290670de0b6b3a76400006158a5565b61244c91906158c4565b905060288c600681106124615761246161595b565b01548111156124a8576001603a6124788e836158e6565b600681106124885761248861595b565b602091828204019190066101000a81548160ff0219169083151502179055505b6001600160a01b038b166000908152603b6020526040812080548592906124d09084906158e6565b90915550506001600160a01b038a166000908152603c6020526040812080548592906124fd9084906158e6565b90915550506003546040516380f78b3f60e01b81526001600160a01b038c811660048301526000602483018190529216906380f78b3f90604401602060405180830381865afa158015612554573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612578919061588c565b9050600381101580156125ac57506001600160a01b038b166000908152603c6020526040902054685150ae84a8cdf0000011155b80156125d457506001600160a01b038b166000908152603b60205260409020600a015460ff16155b15612600576001600160a01b038b166000908152603b60205260409020600a01805460ff191660011790555b61260a8c856143d1565b6126148c8561489a565b6001600160a01b038b166000908152603c6020526040902054612638908c90614c9f565b6126428c856150ca565b6002546000546040516370a0823160e01b81523060048201526126ca926001600160a01b039081169216906370a0823190602401602060405180830381865afa158015612693573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b7919061588c565b6000546001600160a01b03169190615219565b5050505050505050505050505050565b6044602052826000526040600020602052816000526040600020818154811061270257600080fd5b9060005260206000200160009250925050505481565b6000612723336128ee565b90508181101580156127ad5750600054600154604051636eb1769f60e11b81526001600160a01b0391821660048201523060248201528492919091169063dd62ed3e90604401602060405180830381865afa158015612786573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127aa919061588c565b10155b801561282b57506000546001546040516370a0823160e01b81526001600160a01b039182166004820152849291909116906370a0823190602401602060405180830381865afa158015612804573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612828919061588c565b10155b1561287557336000908152603b6020526040812060080180548492906128529084906158e6565b9091555050600154600054612875916001600160a01b0391821691163385612dd5565b5050565b6003546001600160a01b0316156128a25760405162461bcd60e51b81526004016106f690615935565b6002546001600160a01b031633146128cc5760405162461bcd60e51b81526004016106f6906158fe565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152603b6020526040812054156129a6576001600160a01b0382166000908152603b60205260408120600881015460078201546006830154600384015460058501546004860154600287015460019097015495969495939492939192909161296391906158e6565b61296d91906158e6565b61297791906158e6565b61298191906158e6565b61298b91906158e6565b61299591906158e6565b61299f9190615875565b9392505050565b506000919050565b6002546001600160a01b031633146129d85760405162461bcd60e51b81526004016106f6906158fe565b6000821180156129e85750600081115b612a285760405162461bcd60e51b8152602060048201526011602482015270125b98dbdc9c9958dd081c995c5d595cdd607a1b60448201526064016106f6565b600691909155600755565b603a5465010000000000900460ff16612a8e5760405162461bcd60e51b815260206004820152601f60248201527f45786368616e6765207374616765206973206e6f74207374617274207965740060448201526064016106f6565b336000908152603b60209081526040808320600901547fd6c2779d7e386daf361b85a5d634dce51e9403cce5e5b1ec9b100865557a3c4d909252822054612ad59190615875565b90508015612b3357604051339082156108fc029083906000818181858888f19350505050158015612b0a573d6000803e3d6000fd5b50336000908152603b602052604081206009018054839290612b2d9084906158e6565b90915550505b50565b6001600160a01b03821615612875576000546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015612b8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bb1919061588c565b10612c2d576001600160a01b0382166000908152603b602052604081206005018054839290612be19084906158e6565b90915550506001600160a01b0382166000908152603b602052604081206008018054839290612c119084906158e6565b9091555050600054612875906001600160a01b03168383615219565b600054600154604051636eb1769f60e11b81526001600160a01b0391821660048201523060248201528392919091169063dd62ed3e90604401602060405180830381865afa158015612c83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca7919061588c565b10158015612d2757506000546001546040516370a0823160e01b81526001600160a01b039182166004820152839291909116906370a0823190602401602060405180830381865afa158015612d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d24919061588c565b10155b15612daa576001600160a01b0382166000908152603b602052604081206005018054839290612d579084906158e6565b90915550506001600160a01b0382166000908152603b602052604081206008018054839290612d879084906158e6565b9091555050600154600054612875916001600160a01b0391821691168484612dd5565b6001600160a01b0382166000908152603b602052604081206005018054839290610cef9084906158e6565b6040516001600160a01b0380851660248301528316604482015260648101829052612e409085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152615249565b50505050565b8415612fad576001600160a01b03861660008181527fcdad79d33f4de49584ed9b39ca3d8a53cc10e49c033c5359244d3129cc2efd3d6020908152604082207fcae482817da5739a72d01cb9874e04d330e5e8dc74bc0bece220f5b3532c14b88054825460018082018555938652848620015580548083019091557fbc475fabdc81888234727d84844551d4b29dadadddc669d53b81403f3c27f3920189905560429091527f1e02e7e7cb9e9eea58e182617f7334d8953b76e5cc38e6ca429c7744253cace78054918201815582527f9976d2929a73d3b0a4d2370acf6ad27bf1eb832df2a88ef4089290b6862ecde70180546001600160a01b03191690921790915560298054879290612f5b9084906158e6565b90915550506001600160a01b03861660009081527f7b18867ebd2b04dbe21f520089d61bc882c11b3f5cc506df65457bb01e796297602052604081208054879290612fa79084906158e6565b90915550505b8315613114576001600160a01b03861660008181527f698f965f71a6f5c9afb45442df7ff01640d7295288618bfa1177b6c22c0c05db6020908152604082207fe12917faa952038297cceeb966eb4f054126fd0f1307df22b19432454cb24b378054825460018082018555938652848620015580548083019091557f5be7c536397117463d980345fb0ad2788a68ce0ddd4722db167062755e2aa9db0188905560429091527f9693e62f09366b4f038d2f3dfe3f0982145a73c367786164031cce1e5a64f0948054918201815582527f933a97da2e72a8e2fc4c0b2dd25832df6d659999333a0f21d5b32b26809fccff0180546001600160a01b031916909217909155602a80548692906130c29084906158e6565b90915550506001600160a01b03861660009081527fb24be977f4ec7a75f89e669b15af271af2f8729c5e9c8c681997633a48b1031460205260408120805486929061310e9084906158e6565b90915550505b821561327b576001600160a01b03861660008181527fbb4c205d2fd5d5c0ff4ab723a86b46f24bafcc7dfe57b1f587a8c4b4e7fe20146020908152604082207fc3a7a9815c24f0c36cde8cf4e88f62a6b5d5a812279aee192ae55af7227959598054825460018082018555938652848620015580548083019091557f50dced972fc3919c37c066415db46664f7404d5c4ac1aee54cf89e9af0d933c40187905560429091527f6a51289a21ac6edf4deccbe661eee535a9c8ffbe178740c39f03ed213ff51ffe8054918201815582527f7dca9502745de57dbe351b4d531a19d0f23ea8d5fe1a0376f9e8823d78a47b480180546001600160a01b031916909217909155602b80548592906132299084906158e6565b90915550506001600160a01b03861660009081527f62f6a8d3ed649f412d833373e5344ded5babeca5d7f90d4d90216edfee362f6c6020526040812080548592906132759084906158e6565b90915550505b81156133e2576001600160a01b03861660008181527f45b807389775ad05c7cd9109cde6b930048fc115975326a747c8e4a5232f1e826020908152604082207f6f521771d1c10c5f5cf26170d7c1f204b89275fa64742d43fde7a274c85d47dd8054825460018082018555938652848620015580548083019091557f1ed5b319a1cf8393b52a739f0e64fef69c18f722bbace93a78f074ea7433fa230186905560429091527fa1328882ef5cecf9940951e98b9f20f66903681a6caf2eab06e4557fe91b11468054918201815582527f7d7f0147b94a3bf1c424808e180352110f1baeec2056dfb4b50b2b4615e9c78f0180546001600160a01b031916909217909155602c80548492906133909084906158e6565b90915550506001600160a01b03861660009081527f03e975a9b289ace39a8da1293156fa093fd8f5e3245fd785d78bb45b91a97ce06020526040812080548492906133dc9084906158e6565b90915550505b8015610c27576001600160a01b03861660008181527f0d8114addc107b9906d4b6801726e6398dfeab6fcad9ec1b0042e243f7efef3d6020908152604082207fd6fcbeeb060af62b78ed9399842247242693c1167af80fe8ef190295be0191118054825460018082018555938652848620015580548083019091557f5605cf113824bae09495aaf163ebd0729ca0cb7c44ac7eaaaffca3047108fe500185905560429091527fd011f032728d0086269ce676ee6ffa50fce1f33e5a567cef723380c6830bbf068054918201815582527fb7984df2695730525e860bf371144e0269e9aefc38f3915f4aa709ed98475e690180546001600160a01b031916909217909155602d80548392906134f79084906158e6565b90915550506001600160a01b03861660009081527fd6c2779d7e386daf361b85a5d634dce51e9403cce5e5b1ec9b100865557a3c4d6020526040812080548392906135439084906158e6565b9091555050505050505050565b6000606461355f8360146158a5565b61356991906158c4565b90506001600160a01b038416158015906135a4575060008381526044602090815260408083206001600160a01b038816845290915290205415155b156138ad5760005b60008481526044602090815260408083206001600160a01b03891684529091529020548110156138ab5760008481526044602090815260408083206001600160a01b0389168452909152812080548390811061360a5761360a61595b565b90600052602060002001549050600060416000878152602001908152602001600020828154811061363d5761363d61595b565b906000526020600020015490506000811115613896578381106137815760008681526043602090815260408083206001600160a01b038b1684529091528120805486929061368c908490615875565b909155505060008681526041602052604090208054859190849081106136b4576136b461595b565b9060005260206000200160008282546136cd9190615875565b9091555060009050670de0b6b3a7640000602388600581106136f1576136f161595b565b01546136fd90876158a5565b61370791906158c4565b90506000612710603489600681106137215761372161595b565b015461372d90846158a5565b61373791906158c4565b90506137438183615875565b6001600160a01b038a166000908152603b60205260408120600601805490919061376e9084906158e6565b90915550600096506138ab945050505050565b60008681526043602090815260408083206001600160a01b038b168452909152812080548392906137b3908490615875565b909155505060008681526041602052604081208054849081106137d8576137d861595b565b90600052602060002001819055506000670de0b6b3a7640000602388600581106138045761380461595b565b015461381090846158a5565b61381a91906158c4565b90506000612710603489600681106138345761383461595b565b015461384090846158a5565b61384a91906158c4565b90506138568183615875565b6001600160a01b038a166000908152603b6020526040812060060180549091906138819084906158e6565b9091555061389190508387615875565b955050505b505080806138a3906159d3565b9150506135ac565b505b60008160646138bd85601e6158a5565b6138c791906158c4565b6138d191906158e6565b90506000602e85600681106138e8576138e861595b565b01549050805b600086815260416020526040902054811015610c255760008681526041602052604081208054839081106139245761392461595b565b906000526020600020015490506000811115613c0957838110613aac5760008781526042602052604081208054849081106139615761396161595b565b60009182526020808320909101548a83526043825260408084206001600160a01b03909216808552919092529082208054919350879290916139a4908490615875565b909155505060008881526041602052604090208054869190859081106139cc576139cc61595b565b9060005260206000200160008282546139e59190615875565b9091555060009050670de0b6b3a764000060238a60058110613a0957613a0961595b565b0154613a1590886158a5565b613a1f91906158c4565b9050600061271060348b60068110613a3957613a3961595b565b0154613a4590846158a5565b613a4f91906158c4565b9050613a5b8183615875565b6001600160a01b0384166000908152603b602052604081206006018054909190613a869084906158e6565b90915550859050602e8b60068110613aa057613aa061595b565b015550610c2592505050565b6000878152604260205260408120805484908110613acc57613acc61595b565b60009182526020808320909101548a83526043825260408084206001600160a01b0390921680855291909252908220805491935084929091613b0f908490615875565b90915550506000888152604160205260408120805485908110613b3457613b3461595b565b90600052602060002001819055506000670de0b6b3a764000060238a60058110613b6057613b6061595b565b0154613b6c90856158a5565b613b7691906158c4565b9050600061271060348b60068110613b9057613b9061595b565b0154613b9c90846158a5565b613ba691906158c4565b9050613bb28183615875565b6001600160a01b0384166000908152603b602052604081206006018054909190613bdd9084906158e6565b90915550613bed90508488615875565b965084602e8b60068110613c0357613c0361595b565b01555050505b5080613c14816159d3565b9150506138ee565b60006064613c2b8360146158a5565b613c3591906158c4565b90506001600160a01b03841615613fdc5760005b60008481526044602090815260408083206001600160a01b0389168452909152902054811015613fda5760008481526044602090815260408083206001600160a01b03891684529091528120805483908110613ca757613ca761595b565b906000526020600020015490506000604160008781526020019081526020016000208281548110613cda57613cda61595b565b906000526020600020015490506000811115613fc557838110613e675760008681526043602090815260408083206001600160a01b038b16845290915281208054869290613d29908490615875565b90915550506000868152604160205260409020805485919084908110613d5157613d5161595b565b906000526020600020016000828254613d6a9190615875565b9091555060009050670de0b6b3a764000060238860058110613d8e57613d8e61595b565b0154613d9a90876158a5565b613da491906158c4565b9050600061271060348960068110613dbe57613dbe61595b565b0154613dca90846158a5565b613dd491906158c4565b9050613de08183615875565b6001600160a01b038a166000908152603b602052604081206006018054909190613e0b9084906158e6565b90915550613e1b90508183615875565b6001600160a01b038a166000908152603b602052604081206008018054909190613e469084906158e6565b9091555060009650613e5e9050896126b78385615875565b50505050613fda565b60008681526043602090815260408083206001600160a01b038b16845290915281208054839290613e99908490615875565b90915550506000868152604160205260408120805484908110613ebe57613ebe61595b565b90600052602060002001819055506000670de0b6b3a764000060238860058110613eea57613eea61595b565b0154613ef690846158a5565b613f0091906158c4565b9050600061271060348960068110613f1a57613f1a61595b565b0154613f2690846158a5565b613f3091906158c4565b9050613f3c8183615875565b6001600160a01b038a166000908152603b602052604081206006018054909190613f679084906158e6565b90915550613f7790508183615875565b6001600160a01b038a166000908152603b602052604081206008018054909190613fa29084906158e6565b90915550613fb290508387615875565b9550613fc2896126b78385615875565b50505b50508080613fd2906159d3565b915050613c49565b505b6000816064613fec85601e6158a5565b613ff691906158c4565b61400091906158e6565b90506000602e85600681106140175761401761595b565b01549050805b600086815260416020526040902054811015610c255760008681526041602052604081208054839081106140535761405361595b565b9060005260206000200154905060008111156143be578381106142185760008781526042602052604081208054849081106140905761409061595b565b60009182526020808320909101548a83526043825260408084206001600160a01b03909216808552919092529082208054919350879290916140d3908490615875565b909155505060008881526041602052604090208054869190859081106140fb576140fb61595b565b9060005260206000200160008282546141149190615875565b9091555060009050670de0b6b3a764000060238a600581106141385761413861595b565b015461414490886158a5565b61414e91906158c4565b9050600061271060348b600681106141685761416861595b565b015461417490846158a5565b61417e91906158c4565b905061418a8183615875565b6001600160a01b0384166000908152603b6020526040812060060180549091906141b59084906158e6565b909155506141c590508183615875565b6001600160a01b0384166000908152603b6020526040812060080180549091906141f09084906158e6565b909155506142049050836126b78385615875565b84602e8b60068110613aa057613aa061595b565b60008781526042602052604081208054849081106142385761423861595b565b60009182526020808320909101548a83526043825260408084206001600160a01b039092168085529190925290822080549193508492909161427b908490615875565b909155505060008881526041602052604081208054859081106142a0576142a061595b565b90600052602060002001819055506000670de0b6b3a764000060238a600581106142cc576142cc61595b565b01546142d890856158a5565b6142e291906158c4565b9050600061271060348b600681106142fc576142fc61595b565b015461430890846158a5565b61431291906158c4565b905061431e8183615875565b6001600160a01b0384166000908152603b6020526040812060060180549091906143499084906158e6565b9091555061435990508183615875565b6001600160a01b0384166000908152603b6020526040812060080180549091906143849084906158e6565b9091555061439490508488615875565b965084602e8b600681106143aa576143aa61595b565b01556143ba836126b78385615875565b5050505b50806143c9816159d3565b91505061401d565b60035460405163743fc74560e01b81526001600160a01b038481166004830152600092169063743fc74590602401602060405180830381865afa15801561441c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144409190615842565b905060005b600a811015612e40576001600160a01b03821615614813576003546040516380f78b3f60e01b81526001600160a01b0384811660048301526000602483018190529216906380f78b3f90604401602060405180830381865afa1580156144af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144d3919061588c565b9050601382600a81106144e8576144e861595b565b0154811061480d5760035460405163743fc74560e01b81526001600160a01b038581166004830152600092169063743fc74590602401602060405180830381865afa15801561453b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061455f9190615842565b905082158015614570575060058210155b1561469f576000612710600985600a811061458d5761458d61595b565b015461459a9060026158a5565b6145a490886158a5565b6145ae91906158c4565b6001600160a01b0383166000908152603b60205260409020600a015490915060ff16156145ea576145ea8261271060045484610baa91906158a5565b6001600160a01b0385166000908152603e602090815260408083208784529091528120805483929061461d9084906158e6565b90915550506001600160a01b0385166000908152603b60205260408120600101805483929061464d9084906158e6565b90915550506001600160a01b0385166000908152603b60205260408120600801805483929061467d9084906158e6565b9091555050600054614699906001600160a01b03168683615219565b5061480b565b826146c8576000612710600985600a81106146bc576146bc61595b565b01546145a490886158a5565b6001600160a01b0384166000908152603c6020526040902054685150ae84a8cdf000001161480b576000612710600985600a81106147085761470861595b565b015461471490886158a5565b61471e91906158c4565b6001600160a01b0383166000908152603b60205260409020600a015490915060ff161561475a5761475a8261271060045484610baa91906158a5565b6001600160a01b0385166000908152603e602090815260408083208784529091528120805483929061478d9084906158e6565b90915550506001600160a01b0385166000908152603b6020526040812060010180548392906147bd9084906158e6565b90915550506001600160a01b0385166000908152603b6020526040812060080180548392906147ed9084906158e6565b9091555050600054614809906001600160a01b03168683615219565b505b505b50614818565b612e40565b60035460405163743fc74560e01b81526001600160a01b0384811660048301529091169063743fc74590602401602060405180830381865afa158015614862573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148869190615842565b915080614892816159d3565b915050614445565b60035460405163743fc74560e01b81526001600160a01b038481166004830152600092169063743fc74590602401602060405180830381865afa1580156148e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149099190615842565b905060005b600654811015612e40576001600160a01b03821615614813576001600160a01b0382166000908152603d602052604090205415614c1d576001600160a01b0382166000908152603d60205260408120546127109061496c90866158a5565b61497691906158c4565b6000546040516370a0823160e01b815230600482015291925082916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156149c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149e7919061588c565b10614a69576001600160a01b0383166000908152603b602052604081206004018054839290614a179084906158e6565b90915550506001600160a01b0383166000908152603b602052604081206008018054839290614a479084906158e6565b9091555050600054614a63906001600160a01b03168483615219565b50612e40565b600054600154604051636eb1769f60e11b81526001600160a01b0391821660048201523060248201528392919091169063dd62ed3e90604401602060405180830381865afa158015614abf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ae3919061588c565b10158015614b6357506000546001546040516370a0823160e01b81526001600160a01b039182166004820152839291909116906370a0823190602401602060405180830381865afa158015614b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b60919061588c565b10155b15614be6576001600160a01b0383166000908152603b602052604081206004018054839290614b939084906158e6565b90915550506001600160a01b0383166000908152603b602052604081206008018054839290614bc39084906158e6565b9091555050600154600054614a63916001600160a01b0391821691168584612dd5565b6001600160a01b0383166000908152603b602052604081206004018054839290614c119084906158e6565b90915550612e40915050565b60035460405163743fc74560e01b81526001600160a01b0384811660048301529091169063743fc74590602401602060405180830381865afa158015614c67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c8b9190615842565b915080614c97816159d3565b91505061490e565b6000614cb468a2a15d09519be00000836158c4565b614cc790681043561a88293000006158a5565b6001600160a01b0384166000908152603b60205260409020600201549091508111156150c5576001600160a01b0383166000908152603b6020526040812060020154614d139083615875565b60035460405163743fc74560e01b81526001600160a01b038781166004830152929350603b92600092169063743fc74590602401602060405180830381865afa158015614d64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d889190615842565b6001600160a01b031681526020810191909152604001600020600a015460ff1615614e2e5760035460405163743fc74560e01b81526001600160a01b038681166004830152614e2e92169063743fc74590602401602060405180830381865afa158015614df9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e1d9190615842565b61271060045484610baa91906158a5565b6000546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015614e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e9a919061588c565b10614f16576001600160a01b0384166000908152603b602052604081206002018054839290614eca9084906158e6565b90915550506001600160a01b0384166000908152603b602052604081206008018054839290614efa9084906158e6565b9091555050600054614813906001600160a01b03168583615219565b600054600154604051636eb1769f60e11b81526001600160a01b0391821660048201523060248201528392919091169063dd62ed3e90604401602060405180830381865afa158015614f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f90919061588c565b1015801561501057506000546001546040516370a0823160e01b81526001600160a01b039182166004820152839291909116906370a0823190602401602060405180830381865afa158015614fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061500d919061588c565b10155b15615093576001600160a01b0384166000908152603b6020526040812060020180548392906150409084906158e6565b90915550506001600160a01b0384166000908152603b6020526040812060080180548392906150709084906158e6565b9091555050600154600054614813916001600160a01b0391821691168684612dd5565b6001600160a01b0384166000908152603b6020526040812060020180548392906150be9084906158e6565b9091555050505b505050565b60035460405163743fc74560e01b81526001600160a01b038481166004830152600092169063743fc74590602401602060405180830381865afa158015615115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151399190615842565b905060005b600754811015612e40576001600160a01b03821615614813576001600160a01b0382166000908152603f6020908152604080832060055484529091528120805485929061518c9084906158e6565b909155506151979050565b60035460405163743fc74560e01b81526001600160a01b0384811660048301529091169063743fc74590602401602060405180830381865afa1580156151e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152059190615842565b915080615211816159d3565b91505061513e565b6040516001600160a01b0383166024820152604481018290526150c590849063a9059cbb60e01b90606401612e09565b600061529e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661531b9092919063ffffffff16565b8051909150156150c557808060200190518101906152bc91906159ee565b6150c55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106f6565b606061532a8484600085615332565b949350505050565b6060824710156153935760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106f6565b6001600160a01b0385163b6153ea5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106f6565b600080866001600160a01b031685876040516154069190615a37565b60006040518083038185875af1925050503d8060008114615443576040519150601f19603f3d011682016040523d82523d6000602084013e615448565b606091505b5091509150615458828286615463565b979650505050505050565b6060831561547257508161299f565b8251156154825782518084602001fd5b8160405162461bcd60e51b81526004016106f69190615a53565b6000602082840312156154ae57600080fd5b5035919050565b600080604083850312156154c857600080fd5b50508035926020909101359150565b6001600160a01b0381168114612b3357600080fd5b6000602082840312156154fe57600080fd5b813561299f816154d7565b6000806040838503121561551c57600080fd5b8235615527816154d7565b946020939093013593505050565b60008083601f84011261554757600080fd5b50813567ffffffffffffffff81111561555f57600080fd5b6020830191508360206101608302850101111561557b57600080fd5b9250929050565b60008083601f84011261559457600080fd5b50813567ffffffffffffffff8111156155ac57600080fd5b6020830191508360208260051b850101111561557b57600080fd5b60008083601f8401126155d957600080fd5b50813567ffffffffffffffff8111156155f157600080fd5b60208301915083602060a08302850101111561557b57600080fd5b60008060008060008060008060008060008060c08d8f03121561562e57600080fd5b67ffffffffffffffff8d35111561564457600080fd5b6156518e8e358f01615535565b909c509a5067ffffffffffffffff60208e0135111561566f57600080fd5b61567f8e60208f01358f01615582565b909a50985067ffffffffffffffff60408e0135111561569d57600080fd5b6156ad8e60408f01358f01615582565b909850965067ffffffffffffffff60608e013511156156cb57600080fd5b6156db8e60608f01358f01615582565b909650945067ffffffffffffffff60808e013511156156f957600080fd5b6157098e60808f01358f01615582565b909450925067ffffffffffffffff60a08e0135111561572757600080fd5b6157378e60a08f01358f016155c7565b81935080925050509295989b509295989b509295989b565b6000806040838503121561576257600080fd5b823591506020830135615774816154d7565b809150509250929050565b6000806000806000806000806000806101408b8d03121561579f57600080fd5b8a35995060208b0135985060408b01356157b8816154d7565b975060608b01356157c8816154d7565b965060808b01356157d8816154d7565b999c989b50969995989760a0870135975060c08701359660e08101359650610100810135955061012001359350915050565b60008060006060848603121561581f57600080fd5b833592506020840135615831816154d7565b929592945050506040919091013590565b60006020828403121561585457600080fd5b815161299f816154d7565b634e487b7160e01b600052601160045260246000fd5b6000828210156158875761588761585f565b500390565b60006020828403121561589e57600080fd5b5051919050565b60008160001904831182151516156158bf576158bf61585f565b500290565b6000826158e157634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156158f9576158f961585f565b500190565b6020808252601b908201527f4f776e65722077616c6c6574206973206e6f7420636f72726563740000000000604082015260600190565b6020808252600c908201526b5a65726f206164647265737360a01b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6020808252601e908201527f537461676577697365207368617265206973206e6f7420636f72726563740000604082015260600190565b8015158114612b3357600080fd5b6000602082840312156159c857600080fd5b813561299f816159a8565b60006000198214156159e7576159e761585f565b5060010190565b600060208284031215615a0057600080fd5b815161299f816159a8565b60005b83811015615a26578181015183820152602001615a0e565b83811115612e405750506000910152565b60008251615a49818460208701615a0b565b9190910192915050565b6020815260008251806020840152615a72816040850160208701615a0b565b601f01601f1916919091016040019291505056fea264697066735822122020e8b1b48528b898ef4069987622b44544af43683dd81b38e3356cf5bb611c9464736f6c634300080a0033
1. getSponsor

2. getTeam

1. addMember

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