Contract
0x47F21A0EC081df4c18A244a451b40f4773ED49CA
1
Contract Overview
Balance:
0 Ether
More Info
My Name Tag:
Not Available
Txn Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x8cec7e4cfcd5f96d7e538c26148fc4aedf62f2b892f3241dd290821cd1dc1173 | 0x60806040 | 8249075 | 476 days 12 hrs ago | 0x640a7ae1839d17633be0754342d3d004db560833 | IN | Create: OneCCGlobal | 0 Ether | 0.00235315 |
[ Download CSV Export ]
Contract Name:
OneCCGlobal
Compiler Version
v0.4.26+commit.4563c3fc
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-17 */ pragma solidity ^0.4.26; library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256 c) { if (a == 0) { return 0; } c = a * b; assert(c / a == b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 // uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return a / b; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a + b; assert(c >= a); return c; } } contract Ownable { address public owner; event OwnershipRenounced(address indexed previousOwner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { require(newOwner != address(0)); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } /** * @dev Allows the current owner to relinquish control of the contract. */ function renounceOwnership() public onlyOwner { emit OwnershipRenounced(owner); owner = address(0); } } contract ERC20Basic { function totalSupply() public view returns (uint256); function balanceOf(address who) public view returns (uint256); function transfer(address to, uint256 value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } contract ERC20 is ERC20Basic { function allowance(address owner, address spender) public view returns (uint256); function transferFrom(address from, address to, uint256 value) public returns (bool); function approve(address spender, uint256 value) public returns (bool); event Approval( address indexed owner, address indexed spender, uint256 value ); } library ArrayUtils { /** * Replace bytes in an array with bytes in another array, guarded by a bitmask * Efficiency of this function is a bit unpredictable because of the EVM's word-specific model (arrays under 32 bytes will be slower) * * @dev Mask must be the size of the byte array. A nonzero byte means the byte array can be changed. * @param array The original array * @param desired The target array * @param mask The mask specifying which bits can be changed * @return The updated byte array (the parameter will be modified inplace) */ function guardedArrayReplace(bytes memory array, bytes memory desired, bytes memory mask) internal pure { require(array.length == desired.length); require(array.length == mask.length); uint words = array.length / 0x20; uint index = words * 0x20; assert(index / 0x20 == words); uint i; for (i = 0; i < words; i++) { /* Conceptually: array[i] = (!mask[i] && array[i]) || (mask[i] && desired[i]), bitwise in word chunks. */ assembly { let commonIndex := mul(0x20, add(1, i)) let maskValue := mload(add(mask, commonIndex)) mstore(add(array, commonIndex), or(and(not(maskValue), mload(add(array, commonIndex))), and(maskValue, mload(add(desired, commonIndex))))) } } /* Deal with the last section of the byte array. */ if (words > 0) { /* This overlaps with bytes already set but is still more efficient than iterating through each of the remaining bytes individually. */ i = words; assembly { let commonIndex := mul(0x20, add(1, i)) let maskValue := mload(add(mask, commonIndex)) mstore(add(array, commonIndex), or(and(not(maskValue), mload(add(array, commonIndex))), and(maskValue, mload(add(desired, commonIndex))))) } } else { /* If the byte array is shorter than a word, we must unfortunately do the whole thing bytewise. (bounds checks could still probably be optimized away in assembly, but this is a rare case) */ for (i = index; i < array.length; i++) { array[i] = ((mask[i] ^ 0xff) & array[i]) | (mask[i] & desired[i]); } } } /** * Test if two arrays are equal * Source: https://github.com/GNSPS/solidity-bytes-utils/blob/master/contracts/BytesLib.sol * * @dev Arrays must be of equal length, otherwise will return false * @param a First array * @param b Second array * @return Whether or not all bytes in the arrays are equal */ function arrayEq(bytes memory a, bytes memory b) internal pure returns (bool) { bool success = true; assembly { let length := mload(a) // if lengths don't match the arrays are not equal switch eq(length, mload(b)) case 1 { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 let mc := add(a, 0x20) let end := add(mc, length) for { let cc := add(b, 0x20) // the next line is the loop condition: // while(uint(mc < end) + cb == 2) } eq(add(lt(mc, end), cb), 2) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { // if any of these checks fails then arrays are not equal if iszero(eq(mload(mc), mload(cc))) { // unsuccess: success := 0 cb := 0 } } } default { // unsuccess: success := 0 } } return success; } /** * Unsafe write byte array into a memory location * * @param index Memory location * @param source Byte array to write * @return End memory index */ function unsafeWriteBytes(uint index, bytes source) internal pure returns (uint) { if (source.length > 0) { assembly { let length := mload(source) let end := add(source, add(0x20, length)) let arrIndex := add(source, 0x20) let tempIndex := index for { } eq(lt(arrIndex, end), 1) { arrIndex := add(arrIndex, 0x20) tempIndex := add(tempIndex, 0x20) } { mstore(tempIndex, mload(arrIndex)) } index := add(index, length) } } return index; } /** * Unsafe write address into a memory location * * @param index Memory location * @param source Address to write * @return End memory index */ function unsafeWriteAddress(uint index, address source) internal pure returns (uint) { uint conv = uint(source) << 0x60; assembly { mstore(index, conv) index := add(index, 0x14) } return index; } /** * Unsafe write uint into a memory location * * @param index Memory location * @param source uint to write * @return End memory index */ function unsafeWriteUint(uint index, uint source) internal pure returns (uint) { assembly { mstore(index, source) index := add(index, 0x20) } return index; } /** * Unsafe write uint8 into a memory location * * @param index Memory location * @param source uint8 to write * @return End memory index */ function unsafeWriteUint8(uint index, uint8 source) internal pure returns (uint) { assembly { mstore8(index, source) index := add(index, 0x1) } return index; } } contract ReentrancyGuarded { bool reentrancyLock = false; /* Prevent a contract function from being reentrant-called. */ modifier reentrancyGuard { if (reentrancyLock) { revert(); } reentrancyLock = true; _; reentrancyLock = false; } } contract TokenRecipient { event ReceivedEther(address indexed sender, uint amount); event ReceivedTokens(address indexed from, uint256 value, address indexed token, bytes extraData); /** * @dev Receive tokens and generate a log event * @param from Address from which to transfer tokens * @param value Amount of tokens to transfer * @param token Address of token * @param extraData Additional data to log */ function receiveApproval(address from, uint256 value, address token, bytes extraData) public { ERC20 t = ERC20(token); require(t.transferFrom(from, this, value)); emit ReceivedTokens(from, value, token, extraData); } /** * @dev Receive Ether and generate a log event */ function () payable public { emit ReceivedEther(msg.sender, msg.value); } } contract ProxyRegistry is Ownable { /* DelegateProxy implementation contract. Must be initialized. */ address public delegateProxyImplementation; /* Authenticated proxies by user. */ mapping(address => OwnableDelegateProxy) public proxies; /* Contracts pending access. */ mapping(address => uint) public pending; /* Contracts allowed to call those proxies. */ mapping(address => bool) public contracts; /* Delay period for adding an authenticated contract. This mitigates a particular class of potential attack on the Wyvern DAO (which owns this registry) - if at any point the value of assets held by proxy contracts exceeded the value of half the WYV supply (votes in the DAO), a malicious but rational attacker could buy half the Wyvern and grant themselves access to all the proxy contracts. A delay period renders this attack nonthreatening - given two weeks, if that happened, users would have plenty of time to notice and transfer their assets. */ uint public DELAY_PERIOD = 2 weeks; /** * Start the process to enable access for specified contract. Subject to delay period. * * @dev ProxyRegistry owner only * @param addr Address to which to grant permissions */ function startGrantAuthentication (address addr) public onlyOwner { require(!contracts[addr] && pending[addr] == 0); pending[addr] = now; } /** * End the process to nable access for specified contract after delay period has passed. * * @dev ProxyRegistry owner only * @param addr Address to which to grant permissions */ function endGrantAuthentication (address addr) public onlyOwner { require(!contracts[addr] && pending[addr] != 0 && ((pending[addr] + DELAY_PERIOD) < now)); pending[addr] = 0; contracts[addr] = true; } /** * Revoke access for specified contract. Can be done instantly. * * @dev ProxyRegistry owner only * @param addr Address of which to revoke permissions */ function revokeAuthentication (address addr) public onlyOwner { contracts[addr] = false; } /** * Register a proxy contract with this registry * * @dev Must be called by the user which the proxy is for, creates a new AuthenticatedProxy * @return New AuthenticatedProxy contract */ function registerProxy() public returns (OwnableDelegateProxy proxy) { require(proxies[msg.sender] == address(0)); proxy = new OwnableDelegateProxy(msg.sender, delegateProxyImplementation, abi.encodeWithSignature("initialize(address,address)", msg.sender, address(this))); proxies[msg.sender] = proxy; return proxy; } } contract TokenTransferProxy { /* Authentication registry. */ ProxyRegistry public registry; /** * Call ERC20 `transferFrom` * * @dev Authenticated contract only * @param token ERC20 token address * @param from From address * @param to To address * @param amount Transfer amount */ function transferFrom(address token, address from, address to, uint amount) public returns (bool) { require(registry.contracts(msg.sender)); return ERC20(token).transferFrom(from, to, amount); } } library SaleKindInterface { /** * Side: buy or sell. */ enum Side { Buy, Sell } /** * Currently supported kinds of sale: fixed price, Dutch auction. * English auctions cannot be supported without stronger escrow guarantees. * Future interesting options: Vickrey auction, nonlinear Dutch auctions. */ enum SaleKind { FixedPrice, DutchAuction } /** * @dev Check whether the parameters of a sale are valid * @param saleKind Kind of sale * @param expirationTime Order expiration time * @return Whether the parameters were valid */ function validateParameters(SaleKind saleKind, uint expirationTime) pure internal returns (bool) { /* Auctions must have a set expiration date. */ return (saleKind == SaleKind.FixedPrice || expirationTime > 0); } /** * @dev Return whether or not an order can be settled * @dev Precondition: parameters have passed validateParameters * @param listingTime Order listing time * @param expirationTime Order expiration time */ function canSettleOrder(uint listingTime, uint expirationTime) view internal returns (bool) { return (listingTime < now) && (expirationTime == 0 || now < expirationTime); } /** * @dev Calculate the settlement price of an order * @dev Precondition: parameters have passed validateParameters. * @param side Order side * @param saleKind Method of sale * @param basePrice Order base price * @param extra Order extra price data * @param listingTime Order listing time * @param expirationTime Order expiration time */ function calculateFinalPrice(Side side, SaleKind saleKind, uint basePrice, uint extra, uint listingTime, uint expirationTime) view internal returns (uint finalPrice) { if (saleKind == SaleKind.FixedPrice) { return basePrice; } else if (saleKind == SaleKind.DutchAuction) { uint diff = SafeMath.div(SafeMath.mul(extra, SafeMath.sub(now, listingTime)), SafeMath.sub(expirationTime, listingTime)); if (side == Side.Sell) { /* Sell-side - start price: basePrice. End price: basePrice - extra. */ return SafeMath.sub(basePrice, diff); } else { /* Buy-side - start price: basePrice. End price: basePrice + extra. */ return SafeMath.add(basePrice, diff); } } } } contract OwnedUpgradeabilityStorage { // Current implementation address internal _implementation; // Owner of the contract address private _upgradeabilityOwner; /** * @dev Tells the address of the owner * @return the address of the owner */ function upgradeabilityOwner() public view returns (address) { return _upgradeabilityOwner; } /** * @dev Sets the address of the owner */ function setUpgradeabilityOwner(address newUpgradeabilityOwner) internal { _upgradeabilityOwner = newUpgradeabilityOwner; } /** * @dev Tells the address of the current implementation * @return address of the current implementation */ function implementation() public view returns (address) { return _implementation; } /** * @dev Tells the proxy type (EIP 897) * @return Proxy type, 2 for forwarding proxy */ function proxyType() public pure returns (uint256 proxyTypeId) { return 2; } } contract AuthenticatedProxy is TokenRecipient, OwnedUpgradeabilityStorage { /* Whether initialized. */ bool initialized = false; /* Address which owns this proxy. */ address public user; /* Associated registry with contract authentication information. */ ProxyRegistry public registry; /* Whether access has been revoked. */ bool public revoked; /* Delegate call could be used to atomically transfer multiple assets owned by the proxy contract with one order. */ enum HowToCall { Call, DelegateCall } /* Event fired when the proxy access is revoked or unrevoked. */ event Revoked(bool revoked); /** * Initialize an AuthenticatedProxy * * @param addrUser Address of user on whose behalf this proxy will act * @param addrRegistry Address of ProxyRegistry contract which will manage this proxy */ function initialize (address addrUser, ProxyRegistry addrRegistry) public { require(!initialized); initialized = true; user = addrUser; registry = addrRegistry; } /** * Set the revoked flag (allows a user to revoke ProxyRegistry access) * * @dev Can be called by the user only * @param revoke Whether or not to revoke access */ function setRevoke(bool revoke) public { require(msg.sender == user); revoked = revoke; emit Revoked(revoke); } /** * Execute a message call from the proxy contract * * @dev Can be called by the user, or by a contract authorized by the registry as long as the user has not revoked access * @param dest Address to which the call will be sent * @param howToCall Which kind of call to make * @param calldata Calldata to send * @return Result of the call (success or failure) */ function proxy(address dest, HowToCall howToCall, bytes calldata) public returns (bool result) { require(msg.sender == user || (!revoked && registry.contracts(msg.sender))); if (howToCall == HowToCall.Call) { result = dest.call(calldata); } else if (howToCall == HowToCall.DelegateCall) { result = dest.delegatecall(calldata); } return result; } /** * Execute a message call and assert success * * @dev Same functionality as `proxy`, just asserts the return value * @param dest Address to which the call will be sent * @param howToCall What kind of call to make * @param calldata Calldata to send */ function proxyAssert(address dest, HowToCall howToCall, bytes calldata) public { require(proxy(dest, howToCall, calldata)); } } contract Proxy { /** * @dev Tells the address of the implementation where every call will be delegated. * @return address of the implementation to which it will be delegated */ function implementation() public view returns (address); /** * @dev Tells the type of proxy (EIP 897) * @return Type of proxy, 2 for upgradeable proxy */ function proxyType() public pure returns (uint256 proxyTypeId); /** * @dev Fallback function allowing to perform a delegatecall to the given implementation. * This function will return whatever the implementation call returns */ function () payable public { address _impl = implementation(); require(_impl != address(0)); assembly { let ptr := mload(0x40) calldatacopy(ptr, 0, calldatasize) let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0) let size := returndatasize returndatacopy(ptr, 0, size) switch result case 0 { revert(ptr, size) } default { return(ptr, size) } } } } contract OwnedUpgradeabilityProxy is Proxy, OwnedUpgradeabilityStorage { /** * @dev Event to show ownership has been transferred * @param previousOwner representing the address of the previous owner * @param newOwner representing the address of the new owner */ event ProxyOwnershipTransferred(address previousOwner, address newOwner); /** * @dev This event will be emitted every time the implementation gets upgraded * @param implementation representing the address of the upgraded implementation */ event Upgraded(address indexed implementation); /** * @dev Upgrades the implementation address * @param implementation representing the address of the new implementation to be set */ function _upgradeTo(address implementation) internal { require(_implementation != implementation); _implementation = implementation; emit Upgraded(implementation); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyProxyOwner() { require(msg.sender == proxyOwner()); _; } /** * @dev Tells the address of the proxy owner * @return the address of the proxy owner */ function proxyOwner() public view returns (address) { return upgradeabilityOwner(); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferProxyOwnership(address newOwner) public onlyProxyOwner { require(newOwner != address(0)); emit ProxyOwnershipTransferred(proxyOwner(), newOwner); setUpgradeabilityOwner(newOwner); } /** * @dev Allows the upgradeability owner to upgrade the current implementation of the proxy. * @param implementation representing the address of the new implementation to be set. */ function upgradeTo(address implementation) public onlyProxyOwner { _upgradeTo(implementation); } /** * @dev Allows the upgradeability owner to upgrade the current implementation of the proxy * and delegatecall the new implementation for initialization. * @param implementation representing the address of the new implementation to be set. * @param data represents the msg.data to bet sent in the low level call. This parameter may include the function * signature of the implementation to be called with the needed payload */ function upgradeToAndCall(address implementation, bytes data) payable public onlyProxyOwner { upgradeTo(implementation); require(address(this).delegatecall(data)); } } contract OwnableDelegateProxy is OwnedUpgradeabilityProxy { constructor(address owner, address initialImplementation, bytes calldata) public { setUpgradeabilityOwner(owner); _upgradeTo(initialImplementation); require(initialImplementation.delegatecall(calldata)); } } /* * @title: 1cc global * @desc: onecc global smart contract */ contract OneCCGlobal is ReentrancyGuarded, Ownable{ ERC20 public investToken; /* User registry. */ ProxyRegistry public registry; /* Token transfer proxy. */ TokenTransferProxy public tokenTransferProxy; using SafeMath for uint256; struct PlayerDeposit { uint256 amount; uint256 totalWithdraw; uint256 time; uint256 period; uint256 expire; } struct Player { address referral; uint256 token_balance; uint256 eth_balance; uint256 dividends; uint256 day_devidends; uint256 referral_bonus; uint256 last_payout; uint256 total_invested; uint256 total_withdrawn; uint256 total_referral_bonus; PlayerDeposit[] deposits; PlayerDeposit crowd; uint8 is_shareholder; mapping(uint8 => uint256) referrals_per_level; } address public owner; /* invest contract address and decimal */ address public invest_token_address = 0x58548c2a07bf1d72104ca1834e945d92a74dcedf; uint256 public invest_token_decimal = 18; uint8 constant public investment_days = 10; uint256 constant public investment_perc = 1800; uint256 public total_investors; uint256 public total_invested; uint256 public total_withdrawn; uint256 public total_referral_bonus; /* Current corwded shareholder number */ uint256 public total_crowded_num; /* Total shareholder join number */ uint256 constant public total_shareholder_num = 30; uint256 constant public soft_release = 1615600800; uint256 constant public full_release = 1615608000; /* Referral bonuses data define*/ uint8[] public referral_gens = [1,2,3,4,5,6]; uint8[] public referral_bonuses = [10,8,6,4,2,1]; //loan period and profit parameter define uint256[] public invest_period_months = [1, 2, 3, 6, 12]; //month uint256[] public invest_period_day_rates = [30, 35, 40, 45, 50]; //Ten thousand of // 1cc (10 coin) cny price uint8 public invest_10_1cc_cny_price = 65; uint8 public invest_reward_eth_rate = 5; //invest reward eth rate (%) //invest amount limit define uint256 constant public invest_min_amount = 100; uint256 constant public invest_max_amount = 10000; //user data list define mapping(address => Player) public players; event Deposit(address indexed addr, uint256 amount, uint256 month); event Withdraw(address indexed addr, uint256 amount); event WithdrawEth(address indexed addr, uint256 amount); event Reinvest(address indexed addr, uint256 amount, uint8 month); event ReferralPayout(address indexed addr, uint256 amount, uint8 level); constructor() public { owner = msg.sender; /* Create invest token instace */ investToken = ERC20(invest_token_address); } /** * @dev Transfer tokens * @param token Token to transfer * @param from Address to charge fees * @param to Address to receive fees * @param amount Amount of protocol tokens to charge */ function transferTokens(address token, address from, address to, uint amount) internal { if (amount > 0) { require(tokenTransferProxy.transferFrom(token, from, to, amount)); } } /* * desc: user do deposit action */ function deposit(address _referral, uint256 _amount, uint256 _month) external payable { uint256 token_decimals = 10 ** invest_token_decimal; require(uint256(block.timestamp) > soft_release, "Not launched"); require(_amount >= 1e8, "Zero amount"); require(_amount >= invest_min_amount, "Minimal deposit: 100 1CC"); require(_amount <= invest_max_amount, "Maxinum deposit: 10000 1CC"); Player storage player = players[msg.sender]; require(player.deposits.length < 2000, "Max 2000 deposits per address"); _setReferral(msg.sender, _referral); /* get the period total time (total secones) */ uint256 period_time = _month.mul(30).mul(86400); player.deposits.push(PlayerDeposit({ amount: _amount, totalWithdraw: 0, time: uint256(block.timestamp), period: _month, expire:uint256(block.timestamp).add(period_time) })); if(player.total_invested == 0x0){ total_investors += 1; } player.total_invested += _amount; total_invested += _amount; //_referralPayout(msg.sender, _amount); //owner.transfer(msg.value.mul(20).div(100)); /* Transfer msg sender user token to contract address */ uint256 tokenAmount = _amount*token_decimals; transferTokens(investToken, msg.sender, address(this), tokenAmount); emit Deposit(msg.sender, _amount, _month); } /* * @desc: user do withdraw action */ function withdraw(uint256 _amount) payable external { Player storage player = players[msg.sender]; //_payout(msg.sender); require(player.token_balance > 0, "Zero amount"); require(player.token_balance > _amount, "Insufficient balance in token account"); //uint256 amount = player.dividends + player.referral_bonus; //========== get50Percent //uint256 _25Percent = amount.mul(50).div(100); //uint256 amountLess25 = amount.sub(_25Percent); //autoReInvest(_25Percent); //player.dividends = 0; //player.referral_bonus = 0; player.token_balance -= _amount; player.total_withdrawn += _amount; total_withdrawn += _amount; //msg.sender.transfer(amountLess25); transferTokens(investToken, address(this), msg.sender, _amount); emit Withdraw(msg.sender, _amount); } /* * @desc: user auto reinvest in Withdraw */ function autoReInvest(uint256 _amount,uint256 _month) private { Player storage player = players[msg.sender]; /* get the period total time (total secones) */ uint256 period_time = _month.mul(30).mul(86400); player.deposits.push(PlayerDeposit({ amount: _amount, totalWithdraw: 0, time: uint256(block.timestamp), period:_month, expire:uint256(block.timestamp).add(period_time) })); player.total_invested += _amount; total_invested += _amount; } /* * @desc: update user referral data */ function _setReferral(address _addr, address _referral) private { /* if user referral is not set */ if(players[_addr].referral == address(0)) { players[_addr].referral = _referral; /* for(uint8 i = 0; i < referral_bonuses.length; i++) { players[_referral].referrals_per_level[i]++; _referral = players[_referral].referral; if(_referral == address(0)) break; } */ } } /* * @desc: user referral payout */ function _referralPayout(address _addr, uint256 _amount) private { address ref = players[_addr].referral; for(uint8 i = 0; i < referral_bonuses.length; i++) { if(ref == address(0)) break; uint256 bonus = _amount * referral_bonuses[i] / 100; if(uint256(block.timestamp) < full_release){ bonus = bonus * 2; } players[ref].referral_bonus += bonus; players[ref].total_referral_bonus += bonus; total_referral_bonus += bonus; emit ReferralPayout(ref, bonus, (i+1)); ref = players[ref].referral; } } function _payout(address _addr) private { uint256 payout = this.payoutOf(_addr); if(payout > 0) { _updateTotalPayout(_addr); players[_addr].last_payout = uint256(block.timestamp); players[_addr].dividends += payout; } } /* * @desc: update user total withdraw data */ function _updateTotalPayout(address _addr) private { Player storage player = players[_addr]; for(uint256 i = 0; i < player.deposits.length; i++) { PlayerDeposit storage dep = player.deposits[i]; uint256 time_end = dep.time + investment_days * 86400; uint256 from = player.last_payout > dep.time ? player.last_payout : dep.time; uint256 to = block.timestamp > time_end ? time_end : uint256(block.timestamp); if(from < to) { player.deposits[i].totalWithdraw += dep.amount * (to - from) * investment_perc / investment_days / 8640000; } } } /* * @desc: get day deposit profit */ function payoutOf(address _addr) view external returns(uint256 value) { Player storage player = players[_addr]; for(uint256 i = 0; i < player.deposits.length; i++) { PlayerDeposit storage dep = player.deposits[i]; uint256 time_end = dep.time + investment_days * 86400; uint256 from = player.last_payout > dep.time ? player.last_payout : dep.time; uint256 to = block.timestamp > time_end ? time_end : uint256(block.timestamp); if(from < to) { value += dep.amount * (to - from) * investment_perc / investment_days / 8640000; } } return value; } /* * @desc: get contract data info */ function contractInfo() view external returns(uint256 _total_invested, uint256 _total_investors, uint256 _total_withdrawn, uint256 _total_referral_bonus) { return (total_invested, total_investors, total_withdrawn, total_referral_bonus); } /* * @desc: get user info */ function userInfo(address _addr) view external returns(uint256 for_withdraw, uint256 withdrawable_referral_bonus, uint256 total_deposits, uint256 withdrawn, uint256 referral_bonus, uint256[8] memory referrals) { Player storage player = players[_addr]; uint256 payout = this.payoutOf(_addr); for(uint8 i = 0; i < referral_bonuses.length; i++) { referrals[i] = player.referrals_per_level[i]; } return ( payout + player.dividends + player.referral_bonus, player.referral_bonus, player.total_invested, player.total_withdrawn, player.total_referral_bonus, referrals ); } /* * @desc: get user investment list */ function investmentsInfo(address _addr) view external returns(uint256[] memory times, uint256[] memory amounts, uint256[] memory totalWithdraws,uint256[] memory endTimes) { Player storage player = players[_addr]; uint256[] memory _times = new uint256[](player.deposits.length); uint256[] memory _endTimes = new uint256[](player.deposits.length); uint256[] memory _amounts = new uint256[](player.deposits.length); uint256[] memory _totalWithdraws = new uint256[](player.deposits.length); for(uint256 i = 0; i < player.deposits.length; i++) { PlayerDeposit storage dep = player.deposits[i]; _amounts[i] = dep.amount; _totalWithdraws[i] = dep.totalWithdraw; _times[i] = dep.time + investment_days * 86400; _endTimes[i] = dep.expire; } return ( _times, _amounts, _totalWithdraws, _endTimes ); } }
[{"constant":true,"inputs":[],"name":"total_crowded_num","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenTransferProxy","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_referral","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_month","type":"uint256"}],"name":"deposit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"contractInfo","outputs":[{"name":"_total_invested","type":"uint256"},{"name":"_total_investors","type":"uint256"},{"name":"_total_withdrawn","type":"uint256"},{"name":"_total_referral_bonus","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"userInfo","outputs":[{"name":"for_withdraw","type":"uint256"},{"name":"withdrawable_referral_bonus","type":"uint256"},{"name":"total_deposits","type":"uint256"},{"name":"withdrawn","type":"uint256"},{"name":"referral_bonus","type":"uint256"},{"name":"referrals","type":"uint256[8]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"referral_gens","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"invest_10_1cc_cny_price","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"soft_release","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"total_withdrawn","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"total_shareholder_num","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"investment_perc","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"total_invested","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"investmentsInfo","outputs":[{"name":"times","type":"uint256[]"},{"name":"amounts","type":"uint256[]"},{"name":"totalWithdraws","type":"uint256[]"},{"name":"endTimes","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"payoutOf","outputs":[{"name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"invest_token_address","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"invest_reward_eth_rate","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"invest_period_day_rates","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"registry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"total_referral_bonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"investment_days","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"full_release","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"invest_period_months","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"invest_max_amount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"total_investors","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"invest_min_amount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"investToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"referral_bonuses","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"players","outputs":[{"name":"referral","type":"address"},{"name":"token_balance","type":"uint256"},{"name":"eth_balance","type":"uint256"},{"name":"dividends","type":"uint256"},{"name":"day_devidends","type":"uint256"},{"name":"referral_bonus","type":"uint256"},{"name":"last_payout","type":"uint256"},{"name":"total_invested","type":"uint256"},{"name":"total_withdrawn","type":"uint256"},{"name":"total_referral_bonus","type":"uint256"},{"components":[{"name":"amount","type":"uint256"},{"name":"totalWithdraw","type":"uint256"},{"name":"time","type":"uint256"},{"name":"period","type":"uint256"},{"name":"expire","type":"uint256"}],"name":"crowd","type":"tuple"},{"name":"is_shareholder","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"invest_token_decimal","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"month","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"WithdrawEth","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"month","type":"uint8"}],"name":"Reinvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"level","type":"uint8"}],"name":"ReferralPayout","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
608060405260008060006101000a81548160ff0219169083151502179055507358548c2a07bf1d72104ca1834e945d92a74dcedf600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601260065560c060405190810160405280600160ff168152602001600260ff168152602001600360ff168152602001600460ff168152602001600560ff168152602001600660ff16815250600c906006620000d0929190620002f9565b5060c060405190810160405280600a60ff168152602001600860ff168152602001600660ff168152602001600460ff168152602001600260ff168152602001600160ff16815250600d90600662000129929190620002f9565b5060a060405190810160405280600160ff168152602001600260ff168152602001600360ff168152602001600660ff168152602001600c60ff16815250600e90600562000178929190620003a7565b5060a060405190810160405280601e60ff168152602001602360ff168152602001602860ff168152602001602d60ff168152602001603260ff16815250600f906005620001c7929190620003a7565b506041601060006101000a81548160ff021916908360ff1602179055506005601060016101000a81548160ff021916908360ff1602179055503480156200020d57600080fd5b5033600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000459565b82805482825590600052602060002090601f01602090048101928215620003945791602002820160005b838211156200036357835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262000323565b8015620003925782816101000a81549060ff021916905560010160208160000104928301926001030262000363565b505b509050620003a39190620003fe565b5090565b828054828255906000526020600020908101928215620003eb579160200282015b82811115620003ea578251829060ff16905591602001919060010190620003c8565b5b509050620003fa919062000431565b5090565b6200042e91905b808211156200042a57600081816101000a81549060ff02191690555060010162000405565b5090565b90565b6200045691905b808211156200045257600081600090555060010162000438565b5090565b90565b611f2280620004696000396000f3006080604052600436106101a1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806307e7dcab146101a65780630eefdbad146101d15780630efe6a8b1461022857806315c43aaf146102725780631959a002146102b257806322a20858146103545780632e1a7d4d1461039b5780632f60ecbc146103bb5780632fe9ce78146103ec57806343bfdd5d14610417578063512d0f4d14610442578063542139831461046d5780635f45527b146104985780636b59d0d0146104c35780636da61d1e14610633578063715018a61461068a57806374a172fc146106a1578063785a5351146106f857806379aa965e146107295780637b1039991461076a57806388d2786c146107c1578063890e5f8c146107ec5780638da5cb5b1461081d5780638ddfb250146108745780639f6de7271461089f578063a39abbcf146108e0578063a6b165ee1461090b578063b0c70e6014610936578063badf822b14610961578063c0c9a4a0146109b8578063e2eb41ff146109ff578063ee64db3814610ad5578063f2fde38b14610b00575b600080fd5b3480156101b257600080fd5b506101bb610b43565b6040518082815260200191505060405180910390f35b3480156101dd57600080fd5b506101e6610b49565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610270600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050610b6f565b005b34801561027e57600080fd5b50610287610fcf565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b3480156102be57600080fd5b506102f3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fef565b6040518087815260200186815260200185815260200184815260200183815260200182600860200280838360005b8381101561033c578082015181840152602081019050610321565b50505050905001965050505050505060405180910390f35b34801561036057600080fd5b5061037f600480360381019080803590602001909291905050506111af565b604051808260ff1660ff16815260200191505060405180910390f35b6103b9600480360381019080803590602001909291905050506111e2565b005b3480156103c757600080fd5b506103d06113f6565b604051808260ff1660ff16815260200191505060405180910390f35b3480156103f857600080fd5b50610401611409565b6040518082815260200191505060405180910390f35b34801561042357600080fd5b5061042c611411565b6040518082815260200191505060405180910390f35b34801561044e57600080fd5b50610457611417565b6040518082815260200191505060405180910390f35b34801561047957600080fd5b5061048261141c565b6040518082815260200191505060405180910390f35b3480156104a457600080fd5b506104ad611422565b6040518082815260200191505060405180910390f35b3480156104cf57600080fd5b50610504600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611428565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b83811015610553578082015181840152602081019050610538565b50505050905001858103845288818151815260200191508051906020019060200280838360005b8381101561059557808201518184015260208101905061057a565b50505050905001858103835287818151815260200191508051906020019060200280838360005b838110156105d75780820151818401526020810190506105bc565b50505050905001858103825286818151815260200191508051906020019060200280838360005b838110156106195780820151818401526020810190506105fe565b505050509050019850505050505050505060405180910390f35b34801561063f57600080fd5b50610674600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061164e565b6040518082815260200191505060405180910390f35b34801561069657600080fd5b5061069f61176a565b005b3480156106ad57600080fd5b506106b661186e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561070457600080fd5b5061070d611894565b604051808260ff1660ff16815260200191505060405180910390f35b34801561073557600080fd5b50610754600480360381019080803590602001909291905050506118a7565b6040518082815260200191505060405180910390f35b34801561077657600080fd5b5061077f6118ca565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107cd57600080fd5b506107d66118f0565b6040518082815260200191505060405180910390f35b3480156107f857600080fd5b506108016118f6565b604051808260ff1660ff16815260200191505060405180910390f35b34801561082957600080fd5b506108326118fb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561088057600080fd5b50610889611921565b6040518082815260200191505060405180910390f35b3480156108ab57600080fd5b506108ca60048036038101908080359060200190929190505050611929565b6040518082815260200191505060405180910390f35b3480156108ec57600080fd5b506108f561194c565b6040518082815260200191505060405180910390f35b34801561091757600080fd5b50610920611952565b6040518082815260200191505060405180910390f35b34801561094257600080fd5b5061094b611958565b6040518082815260200191505060405180910390f35b34801561096d57600080fd5b5061097661195d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109c457600080fd5b506109e360048036038101908080359060200190929190505050611983565b604051808260ff1660ff16815260200191505060405180910390f35b348015610a0b57600080fd5b50610a40600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119b6565b604051808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c81526020018b81526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018260ff1660ff1681526020019c5050505050505050505050505060405180910390f35b348015610ae157600080fd5b50610aea611a80565b6040518082815260200191505060405180910390f35b348015610b0c57600080fd5b50610b41600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a86565b005b600b5481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600654600a0a935063604c1ca042111515610bf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f74206c61756e63686564000000000000000000000000000000000000000081525060200191505060405180910390fd5b6305f5e1008610151515610c74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f5a65726f20616d6f756e7400000000000000000000000000000000000000000081525060200191505060405180910390fd5b60648610151515610ced576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4d696e696d616c206465706f7369743a2031303020314343000000000000000081525060200191505060405180910390fd5b6127108611151515610d67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4d6178696e756d206465706f7369743a2031303030302031434300000000000081525060200191505060405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002092506107d083600a0180549050101515610e28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4d61782032303030206465706f7369747320706572206164647265737300000081525060200191505060405180910390fd5b610e323388611bde565b610e5b62015180610e4d601e88611cfb90919063ffffffff16565b611cfb90919063ffffffff16565b915082600a0160a06040519081016040528088815260200160008152602001428152602001878152602001610e998542611d3390919063ffffffff16565b815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040155505050600083600701541415610f1b5760016007600082825401925050819055505b858360070160008282540192505081905550856008600082825401925050819055508386029050610f70600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16333084611d4f565b3373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a158787604051808381526020018281526020019250505060405180910390a250505050505050565b600080600080600854600754600954600a54935093509350935090919293565b6000806000806000610fff611ed2565b6000806000601160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002092503073ffffffffffffffffffffffffffffffffffffffff16636da61d1e8b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156110e057600080fd5b505af11580156110f4573d6000803e3d6000fd5b505050506040513d602081101561110a57600080fd5b81019080805190602001909291905050509150600090505b600d805490508160ff161015611175578260110160008260ff1660ff16815260200190815260200160002054848260ff1660088110151561115f57fe5b6020020181815250508080600101915050611122565b8260050154836003015483010183600501548460070154856008015486600901548898509850985098509850985050505091939550919395565b600c818154811015156111be57fe5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600101541115156112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f5a65726f20616d6f756e7400000000000000000000000000000000000000000081525060200191505060405180910390fd5b818160010154111515611342576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001807f496e73756666696369656e742062616c616e636520696e20746f6b656e20616381526020017f636f756e7400000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b818160010160008282540392505081905550818160080160008282540192505081905550816009600082825401925050819055506113a4600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16303385611d4f565b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364836040518082815260200191505060405180910390a25050565b601060009054906101000a900460ff1681565b63604c1ca081565b60095481565b601e81565b61070881565b60085481565b6060806060806000606080606080600080601160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020965086600a01805490506040519080825280602002602001820160405280156114b05781602001602082028038833980820191505090505b50955086600a01805490506040519080825280602002602001820160405280156114e95781602001602082028038833980820191505090505b50945086600a01805490506040519080825280602002602001820160405280156115225781602001602082028038833980820191505090505b50935086600a018054905060405190808252806020026020018201604052801561155b5781602001602082028038833980820191505090505b509250600091505b86600a01805490508210156116345786600a018281548110151561158357fe5b90600052602060002090600502019050806000015484838151811015156115a657fe5b9060200190602002018181525050806001015483838151811015156115c757fe5b906020019060200201818152505062015180600a60ff160262ffffff1681600201540186838151811015156115f857fe5b90602001906020020181815250508060040154858381518110151561161957fe5b90602001906020020181815250508180600101925050611563565b858484879a509a509a509a50505050505050509193509193565b6000806000806000806000601160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209550600094505b85600a018054905085101561175c5785600a01858154811015156116bf57fe5b9060005260206000209060050201935062015180600a60ff160262ffffff16846002015401925083600201548660060154116116ff578360020154611705565b85600601545b91508242116117145742611716565b825b90508082101561174f576283d600600a60ff166107088484038760000154020281151561173f57fe5b0481151561174957fe5b04870196505b848060010195505061169f565b869650505050505050919050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117c657600080fd5b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060019054906101000a900460ff1681565b600f818154811015156118b657fe5b906000526020600020016000915090505481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b600a81565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b63604c38c081565b600e8181548110151561193857fe5b906000526020600020016000915090505481565b61271081565b60075481565b606481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d8181548110151561199257fe5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b60116020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600b0160a0604051908101604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050908060100160009054906101000a900460ff1690508c565b60065481565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ae257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611b1e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff16601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611cf75780601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b600080831415611d0e5760009050611d2d565b8183029050818382811515611d1f57fe5b04141515611d2957fe5b8090505b92915050565b60008183019050828110151515611d4657fe5b80905092915050565b6000811115611ecc57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea858585856040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b158015611e8557600080fd5b505af1158015611e99573d6000803e3d6000fd5b505050506040513d6020811015611eaf57600080fd5b81019080805190602001909291905050501515611ecb57600080fd5b5b50505050565b610100604051908101604052806008906020820280388339808201915050905050905600a165627a7a723058208399dd813ed0ce3c904d9ebb3ff72a95fbdd1102a0540c50480b7ef8a05e658f0029
Deployed ByteCode Sourcemap
24712:12346:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26198:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26198:32:0;;;;;;;;;;;;;;;;;;;;;;;24909:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24909:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;28306:1609;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34875:288;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34875:288:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35219:753;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35219:753:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;35219:753:0;;;;;;;;;;;;;;;;;;;;;26509:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26509:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29981:978;;;;;;;;;;;;;;;;;;;;;;;;;;26884:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26884:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26355:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26355:49:0;;;;;;;;;;;;;;;;;;;;;;;26067:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26067:30:0;;;;;;;;;;;;;;;;;;;;;;;26285:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26285:50:0;;;;;;;;;;;;;;;;;;;;;;;25939:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25939:46:0;;;;;;;;;;;;;;;;;;;;;;;26031:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26031:29:0;;;;;;;;;;;;;;;;;;;;;;;36039:1016;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36039:1016:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;36039:1016:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;36039:1016:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;36039:1016:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;36039:1016:0;;;;;;;;;;;;;;;;;;;;;;;34091:722;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34091:722:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2073:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2073:114:0;;;;;;25754:80;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25754:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26932:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26932:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26755:64;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26755:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24838:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24838:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26104:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26104:35:0;;;;;;;;;;;;;;;;;;;;;;;25890:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25890:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;25668:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25668:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26411:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26411:49:0;;;;;;;;;;;;;;;;;;;;;;;26674:64;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26674:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27103:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27103:49:0;;;;;;;;;;;;;;;;;;;;;;;25994:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25994:30:0;;;;;;;;;;;;;;;;;;;;;;;27049:47;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27049:47:0;;;;;;;;;;;;;;;;;;;;;;;24775:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24775:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26560:48;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26560:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27190:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27190:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25841:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25841:40:0;;;;;;;;;;;;;;;;;;;;;;;1800:178;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1800:178:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26198:32;;;;:::o;24909:44::-;;;;;;;;;;;;;:::o;28306:1609::-;28439:22;28791:21;29042:19;29723;28470:20;;28464:2;:26;28439:51;;26394:10;28519:15;28511:39;28503:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28597:3;28586:7;:14;;28578:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27093:3;28635:7;:28;;28627:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27147:5;28711:7;:28;;28703:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28815:7;:19;28823:10;28815:19;;;;;;;;;;;;;;;28791:43;;28878:4;28853:6;:15;;:22;;;;:29;28845:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28929:35;28942:10;28954:9;28929:12;:35::i;:::-;29064:25;29083:5;29064:14;29075:2;29064:6;:10;;:14;;;;:::i;:::-;:18;;:25;;;;:::i;:::-;29042:47;;29110:6;:15;;29131:224;;;;;;;;;29168:7;29131:224;;;;29205:1;29131:224;;;;29235:15;29131:224;;;;29274:6;29131:224;;;;29302:41;29331:11;29310:15;29302:28;;:41;;;;:::i;:::-;29131:224;;;29110:246;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;29110:246:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29397:3;29372:6;:21;;;:28;29369:79;;;29435:1;29416:15;;:20;;;;;;;;;;;29369:79;29485:7;29460:6;:21;;;:32;;;;;;;;;;;29521:7;29503:14;;:25;;;;;;;;;;;29753:14;29745:7;:22;29723:44;;29778:67;29793:11;;;;;;;;;;;29806:10;29826:4;29833:11;29778:14;:67::i;:::-;29879:10;29871:36;;;29891:7;29900:6;29871:36;;;;;;;;;;;;;;;;;;;;;;;;28306:1609;;;;;;;:::o;34875:288::-;34951:23;34976:24;35002;35028:29;35084:14;;35100:15;;35117;;35134:20;;35076:79;;;;;;;;34875:288;;;;:::o;35219:753::-;35304:20;35326:35;35363:22;35387:17;35406:22;35430:27;;:::i;:::-;35476:21;35525:14;35579:7;35500;:14;35508:5;35500:14;;;;;;;;;;;;;;;35476:38;;35542:4;:13;;;35556:5;35542:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35542:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35542:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35542:20:0;;;;;;;;;;;;;;;;35525:37;;35589:1;35579:11;;35575:122;35596:16;:23;;;;35592:1;:27;;;35575:122;;;35656:6;:26;;:29;35683:1;35656:29;;;;;;;;;;;;;;;;35641:9;35651:1;35641:12;;;;;;;;;;;;;;:44;;;;;35621:3;;;;;;;35575:122;;;35757:6;:21;;;35738:6;:16;;;35729:6;:25;:49;35793:6;:21;;;35829:6;:21;;;35865:6;:22;;;35902:6;:27;;;35944:9;35707:257;;;;;;;;;;;;35219:753;;;;;;;;;;:::o;26509:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29981:978::-;30060:21;30084:7;:19;30092:10;30084:19;;;;;;;;;;;;;;;30060:43;;30181:1;30158:6;:20;;;:24;30150:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30240:7;30217:6;:20;;;:30;30209:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30674:7;30650:6;:20;;;:31;;;;;;;;;;;30728:7;30702:6;:22;;;:33;;;;;;;;;;;30765:7;30746:15;;:26;;;;;;;;;;;30841:63;30856:11;;;;;;;;;;;30877:4;30884:10;30896:7;30841:14;:63::i;:::-;30931:10;30922:29;;;30943:7;30922:29;;;;;;;;;;;;;;;;;;29981:978;;:::o;26884:41::-;;;;;;;;;;;;;:::o;26355:49::-;26394:10;26355:49;:::o;26067:30::-;;;;:::o;26285:50::-;26333:2;26285:50;:::o;25939:46::-;25981:4;25939:46;:::o;26031:29::-;;;;:::o;36039:1016::-;36131:22;36155:24;36181:31;36213:25;36257:21;36306:23;36380:26;36457:25;36533:32;36622:9;36683:25;36281:7;:14;36289:5;36281:14;;;;;;;;;;;;;;;36257:38;;36346:6;:15;;:22;;;;36332:37;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;36332:37:0;;;;36306:63;;36423:6;:15;;:22;;;;36409:37;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;36409:37:0;;;;36380:66;;36499:6;:15;;:22;;;;36485:37;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;36485:37:0;;;;36457:65;;36582:6;:15;;:22;;;;36568:37;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;36568:37:0;;;;36533:72;;36634:1;36622:13;;36618:310;36641:6;:15;;:22;;;;36637:1;:26;36618:310;;;36711:6;:15;;36727:1;36711:18;;;;;;;;;;;;;;;;;;;;36683:46;;36758:3;:10;;;36744:8;36753:1;36744:11;;;;;;;;;;;;;;;;;:24;;;;;36802:3;:17;;;36781:15;36797:1;36781:18;;;;;;;;;;;;;;;;;:38;;;;;36873:5;25930:2;36855:23;;;36844:34;;:3;:8;;;:34;36832:6;36839:1;36832:9;;;;;;;;;;;;;;;;;:46;;;;;36906:3;:10;;;36891:9;36901:1;36891:12;;;;;;;;;;;;;;;;;:25;;;;;36665:3;;;;;;;36618:310;;;36958:6;36977:8;36998:15;37027:9;36938:109;;;;;;;;36039:1016;;;;;;;;;;;;:::o;34091:722::-;34176:13;34208:21;34263:9;34326:25;34389:16;34457:12;34548:10;34232:7;:14;34240:5;34232:14;;;;;;;;;;;;;;;34208:38;;34275:1;34263:13;;34259:522;34282:6;:15;;:22;;;;34278:1;:26;34259:522;;;34354:6;:15;;34370:1;34354:18;;;;;;;;;;;;;;;;;;;;34326:46;;34437:5;25930:2;34419:23;;;34408:34;;:3;:8;;;:34;34389:53;;34493:3;:8;;;34472:6;:18;;;:29;:61;;34525:3;:8;;;34472:61;;;34504:6;:18;;;34472:61;34457:76;;34579:8;34561:15;:26;:64;;34609:15;34561:64;;;34590:8;34561:64;34548:77;;34652:2;34645:4;:9;34642:128;;;34747:7;25930:2;34684:60;;25981:4;34703;34698:2;:9;34684:3;:10;;;:24;:42;:60;;;;;;;;:70;;;;;;;;34675:79;;;;34642:128;34306:3;;;;;;;34259:522;;;34800:5;34793:12;;34091:722;;;;;;;;;:::o;2073:114::-;1613:5;;;;;;;;;;;1599:19;;:10;:19;;;1591:28;;;;;;;;2150:5;;;;;;;;;;;2131:25;;;;;;;;;;;;2179:1;2163:5;;:18;;;;;;;;;;;;;;;;;;2073:114::o;25754:80::-;;;;;;;;;;;;;:::o;26932:39::-;;;;;;;;;;;;;:::o;26755:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24838:29::-;;;;;;;;;;;;;:::o;26104:35::-;;;;:::o;25890:42::-;25930:2;25890:42;:::o;25668:20::-;;;;;;;;;;;;;:::o;26411:49::-;26450:10;26411:49;:::o;26674:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27103:49::-;27147:5;27103:49;:::o;25994:30::-;;;;:::o;27049:47::-;27093:3;27049:47;:::o;24775:24::-;;;;;;;;;;;;;:::o;26560:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27190:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25841:40::-;;;;:::o;1800:178::-;1613:5;;;;;;;;;;;1599:19;;:10;:19;;;1591:28;;;;;;;;1897:1;1877:22;;:8;:22;;;;1869:31;;;;;;;;1940:8;1912:37;;1933:5;;;;;;;;;;;1912:37;;;;;;;;;;;;1964:8;1956:5;;:16;;;;;;;;;;;;;;;;;;1800:178;:::o;31696:526::-;31862:1;31827:37;;:7;:14;31835:5;31827:14;;;;;;;;;;;;;;;:23;;;;;;;;;;;;:37;;;31824:391;;;31907:9;31881:7;:14;31889:5;31881:14;;;;;;;;;;;;;;;:23;;;:35;;;;;;;;;;;;;;;;;;31824:391;31696:526;;:::o;119:174::-;177:9;204:1;199;:6;195:37;;;223:1;216:8;;;;195:37;246:1;242;:5;238:9;;270:1;265;261;:5;;;;;;;;:10;254:18;;;;;;286:1;279:8;;119:174;;;;;:::o;954:127::-;1012:9;1038:1;1034;:5;1030:9;;1058:1;1053;:6;;1046:14;;;;;;1074:1;1067:8;;954:127;;;;:::o;28009:227::-;28134:1;28125:6;:10;28121:108;;;28160:18;;;;;;;;;;;:31;;;28192:5;28199:4;28205:2;28209:6;28160:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28160:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28160:56:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28160:56:0;;;;;;;;;;;;;;;;28152:65;;;;;;;;28121:108;28009:227;;;;:::o;24712:12346::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;24712:12346:0;;;;:::o
Swarm Source
bzzr://8399dd813ed0ce3c904d9ebb3ff72a95fbdd1102a0540c50480b7ef8a05e658f
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.