More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 5,901 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Settle Bets | 17236925 | 445 days ago | IN | 0 ETH | 0.05561292 | ||||
Place Bet | 17236915 | 445 days ago | IN | 0.01 ETH | 0.03930494 | ||||
Settle Bets | 14429253 | 862 days ago | IN | 0 ETH | 0.00136583 | ||||
Place Bet | 14429203 | 862 days ago | IN | 0.01 ETH | 0.00754734 | ||||
Place Bet | 14429158 | 862 days ago | IN | 0.01 ETH | 0.00857709 | ||||
Settle Bets | 14428802 | 862 days ago | IN | 0 ETH | 0.00219976 | ||||
Place Bet | 13401860 | 1022 days ago | IN | 0.01 ETH | 0.03255177 | ||||
Settle Bets | 13332303 | 1033 days ago | IN | 0 ETH | 0.0039427 | ||||
Place Bet | 13332028 | 1033 days ago | IN | 0.02 ETH | 0.023069 | ||||
Settle Bets | 13260164 | 1044 days ago | IN | 0 ETH | 0.00437194 | ||||
Place Bet | 13259893 | 1044 days ago | IN | 0.02 ETH | 0.01762227 | ||||
Settle Bets | 13222650 | 1050 days ago | IN | 0 ETH | 0.00358516 | ||||
Place Bet | 13222440 | 1050 days ago | IN | 0.02 ETH | 0.01221286 | ||||
Transfer | 13222418 | 1050 days ago | IN | 0.1 ETH | 0.00082319 | ||||
Transfer | 13222406 | 1050 days ago | IN | 0.1 ETH | 0.00067981 | ||||
Place Bet | 13222366 | 1050 days ago | IN | 0.01 ETH | 0.01112008 | ||||
Settle Bets | 13171631 | 1058 days ago | IN | 0 ETH | 0.00514653 | ||||
Place Bet | 13171628 | 1058 days ago | IN | 0.02 ETH | 0.02284822 | ||||
Settle Bets | 13158623 | 1060 days ago | IN | 0 ETH | 0.00426066 | ||||
Place Bet | 13158350 | 1060 days ago | IN | 0.02 ETH | 0.02520125 | ||||
Settle Bets | 13123902 | 1065 days ago | IN | 0 ETH | 0.0046899 | ||||
Place Bet | 13123627 | 1065 days ago | IN | 0.02 ETH | 0.02146079 | ||||
Settle Bets | 13060486 | 1075 days ago | IN | 0 ETH | 0.00160329 | ||||
Place Bet | 13060473 | 1075 days ago | IN | 0.03 ETH | 0.00511957 | ||||
Settle Bets | 13060466 | 1075 days ago | IN | 0 ETH | 0.00143451 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
17236925 | 445 days ago | 0.09179466 ETH | ||||
17236925 | 445 days ago | 0.128 ETH | ||||
17236915 | 445 days ago | 0.001 ETH | ||||
17236915 | 445 days ago | 0.001 ETH | ||||
14429253 | 862 days ago | 0.04266666 ETH | ||||
14429203 | 862 days ago | 0.001 ETH | ||||
14429203 | 862 days ago | 0.001 ETH | ||||
14429158 | 862 days ago | 0.001 ETH | ||||
14429158 | 862 days ago | 0.001 ETH | ||||
14428802 | 862 days ago | 0.02133333 ETH | ||||
14428802 | 862 days ago | 0.008 ETH | ||||
14428742 | 862 days ago | 0.001 ETH | ||||
14428742 | 862 days ago | 0.001 ETH | ||||
14428742 | 862 days ago | 0.01 ETH | ||||
13401860 | 1022 days ago | 0.001 ETH | ||||
13401860 | 1022 days ago | 0.001 ETH | ||||
13332303 | 1033 days ago | 0.016 ETH | ||||
13332028 | 1033 days ago | 0.002 ETH | ||||
13332028 | 1033 days ago | 0.002 ETH | ||||
13260164 | 1044 days ago | 0.016 ETH | ||||
13259893 | 1044 days ago | 0.002 ETH | ||||
13259893 | 1044 days ago | 0.002 ETH | ||||
13222650 | 1050 days ago | 0.128 ETH | ||||
13222650 | 1050 days ago | 0.008 ETH | ||||
13222440 | 1050 days ago | 0.002 ETH |
Loading...
Loading
Contract Name:
EthexLoto
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-03-26 */ // File: contracts/DeliverFunds.sol pragma solidity 0.5.17; contract DeliverFunds { constructor(address payable target) public payable { selfdestruct(target); } } // File: contracts/Ownable.sol pragma solidity 0.5.17; contract Ownable { address payable public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () internal { owner = msg.sender; emit OwnershipTransferred(address(0), owner); } modifier onlyOwner() { require(msg.sender == owner, "Ownable: caller is not the owner"); _; } function transferOwnership(address payable newOwner) public onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } } // File: contracts/EthexJackpot.sol pragma solidity 0.5.17; /** * (E)t)h)e)x) Jackpot Contract * This smart-contract is the part of Ethex Lottery fair game. * See latest version at https://github.com/ethex-bet/ethex-contracts * http://ethex.bet */ contract EthexJackpot is Ownable { mapping(uint256 => address payable) public tickets; mapping(uint256 => Segment[4]) public prevJackpots; uint256[4] public amounts; uint256[4] public starts; uint256[4] public ends; uint256[4] public numberStarts; uint256 public numberEnd; uint256 public firstNumber; address public lotoAddress; address payable public newVersionAddress; EthexJackpot public previousContract; struct Segment { uint256 start; uint256 end; bool processed; } event Jackpot ( uint256 number, uint256 count, uint256 amount, byte jackpotType ); event Ticket ( uint256 number ); event Superprize ( uint256 amount, address winner ); uint256 internal constant PRECISION = 1 ether; modifier onlyLoto { require(msg.sender == lotoAddress, "Loto only"); _; } function() external payable { } function migrate() external { require(msg.sender == owner || msg.sender == newVersionAddress); require(newVersionAddress != address(0), "NewVersionAddress required"); newVersionAddress.transfer(address(this).balance); } function registerTicket(address payable gamer) external payable onlyLoto { distribute(); uint8 i; if (gamer == address(0x0)) { for (; i < 4; i++) if (block.number >= ends[i]) setJackpot(i); } else { uint256 number = numberEnd + 1; for (; i < 4; i++) { if (block.number >= ends[i]) { setJackpot(i); numberStarts[i] = number; } else if (numberStarts[i] == prevJackpots[starts[i]][i].start) numberStarts[i] = number; } numberEnd = number; tickets[number] = gamer; emit Ticket(number); } } function setLoto(address loto) external onlyOwner { lotoAddress = loto; } function setNewVersion(address payable newVersion) external onlyOwner { newVersionAddress = newVersion; } function payIn() external payable { distribute(); } function settleJackpot() external { for (uint8 i = 0; i < 4; i++) if (block.number >= ends[i]) setJackpot(i); uint256[4] memory payAmounts; uint256[4] memory wins; uint8[4] memory PARTS = [84, 12, 3, 1]; for (uint8 i = 0; i < 4; i++) { uint256 start = starts[i]; if (block.number == start || (start < block.number - 256)) continue; if (prevJackpots[start][i].processed == false && prevJackpots[start][i].start != 0) { payAmounts[i] = amounts[i] * PRECISION / PARTS[i] / PRECISION; amounts[i] -= payAmounts[i]; prevJackpots[start][i].processed = true; uint48 modulo = uint48(bytes6(blockhash(start) << 29)); wins[i] = getNumber(prevJackpots[start][i].start, prevJackpots[start][i].end, modulo); emit Jackpot(wins[i], prevJackpots[start][i].end - prevJackpots[start][i].start + 1, payAmounts[i], byte(uint8(1) << i)); } } for (uint8 i = 0; i < 4; i++) if (payAmounts[i] > 0 && !getAddress(wins[i]).send(payAmounts[i])) (new DeliverFunds).value(payAmounts[i])(getAddress(wins[i])); } function settleMissedJackpot(bytes32 hash, uint256 blockHeight) external onlyOwner { for (uint8 i = 0; i < 4; i++) if (block.number >= ends[i]) setJackpot(i); if (blockHeight < block.number - 256) { uint48 modulo = uint48(bytes6(hash << 29)); uint256[4] memory payAmounts; uint256[4] memory wins; uint8[4] memory PARTS = [84, 12, 3, 1]; for (uint8 i = 0; i < 4; i++) { if (prevJackpots[blockHeight][i].processed == false && prevJackpots[blockHeight][i].start != 0) { payAmounts[i] = amounts[i] * PRECISION / PARTS[i] / PRECISION; amounts[i] -= payAmounts[i]; prevJackpots[blockHeight][i].processed = true; wins[i] = getNumber(prevJackpots[blockHeight][i].start, prevJackpots[blockHeight][i].end, modulo); emit Jackpot(wins[i], prevJackpots[blockHeight][i].end - prevJackpots[blockHeight][i].start + 1, payAmounts[i], byte(uint8(1) << i)); } } for (uint8 i = 0; i < 4; i++) if (payAmounts[i] > 0 && !getAddress(wins[i]).send(payAmounts[i])) (new DeliverFunds).value(payAmounts[i])(getAddress(wins[i])); } } function paySuperprize(address payable winner) external onlyLoto { uint256 superprizeAmount = amounts[0] + amounts[1] + amounts[2] + amounts[3]; amounts[0] = 0; amounts[1] = 0; amounts[2] = 0; amounts[3] = 0; emit Superprize(superprizeAmount, winner); if (superprizeAmount > 0 && !winner.send(superprizeAmount)) (new DeliverFunds).value(superprizeAmount)(winner); } function setOldVersion(address payable oldAddress) external onlyOwner { previousContract = EthexJackpot(oldAddress); for (uint8 i = 0; i < 4; i++) { starts[i] = previousContract.starts(i); ends[i] = previousContract.ends(i); numberStarts[i] = previousContract.numberStarts(i); uint256 start; uint256 end; bool processed; (start, end, processed) = previousContract.prevJackpots(starts[i], i); prevJackpots[starts[i]][i] = Segment(start, end, processed); amounts[i] = previousContract.amounts(i); } numberEnd = previousContract.numberEnd(); firstNumber = numberEnd; previousContract.migrate(); } function getAddress(uint256 number) public returns (address payable) { if (number <= firstNumber) return previousContract.getAddress(number); return tickets[number]; } function setJackpot(uint8 jackpotType) private { uint24[4] memory LENGTH = [5000, 35000, 150000, 450000]; prevJackpots[ends[jackpotType]][jackpotType].processed = prevJackpots[starts[jackpotType]][jackpotType].end == numberEnd; starts[jackpotType] = ends[jackpotType]; ends[jackpotType] = starts[jackpotType] + LENGTH[jackpotType]; prevJackpots[starts[jackpotType]][jackpotType].start = numberStarts[jackpotType]; prevJackpots[starts[jackpotType]][jackpotType].end = numberEnd; } function distribute() private { uint256 distributedAmount = amounts[0] + amounts[1] + amounts[2] + amounts[3]; if (distributedAmount < address(this).balance) { uint256 amount = (address(this).balance - distributedAmount) / 4; amounts[0] += amount; amounts[1] += amount; amounts[2] += amount; amounts[3] += amount; } } function getNumber(uint256 startNumber, uint256 endNumber, uint48 modulo) private pure returns (uint256) { return startNumber + modulo % (endNumber - startNumber + 1); } } // File: contracts/EthexHouse.sol pragma solidity 0.5.17; /** * (E)t)h)e)x) House Contract * This smart-contract is the part of Ethex Lottery fair game. * See latest version at https://github.com/ethex-bet/ethex-contracts * http://ethex.bet */ contract EthexHouse is Ownable { function payIn() external payable { } function withdraw() external onlyOwner { owner.transfer(address(this).balance); } } // File: contracts/EthexSuperprize.sol pragma solidity 0.5.17; /** * (E)t)h)e)x) Superprize Contract * This smart-contract is the part of Ethex Lottery fair game. * See latest version at https://github.com/ethex-bet/ethex-lottery * http://ethex.bet */ contract EthexSuperprize is Ownable { struct Payout { uint256 index; uint256 amount; uint256 block; address payable winnerAddress; uint256 betId; } Payout[] public payouts; address public lotoAddress; address payable public newVersionAddress; EthexSuperprize public previousContract; uint256 public hold; event Superprize ( uint256 index, uint256 amount, address winner, uint256 betId, byte state ); uint8 internal constant PARTS = 6; uint256 internal constant PRECISION = 1 ether; uint256 internal constant MONTHLY = 150000; function() external payable { } function initSuperprize(address payable winner, uint256 betId) external { require(msg.sender == lotoAddress, "Loto only"); uint256 amount = address(this).balance - hold; hold = address(this).balance; uint256 sum; uint256 temp; for (uint256 i = 1; i < PARTS; i++) { temp = amount * PRECISION * (i - 1 + 10) / 75 / PRECISION; sum += temp; payouts.push(Payout(i, temp, block.number + i * MONTHLY, winner, betId)); } payouts.push(Payout(PARTS, amount - sum, block.number + PARTS * MONTHLY, winner, betId)); emit Superprize(0, amount, winner, betId, 0); } function paySuperprize() external onlyOwner { if (payouts.length == 0) return; Payout[] memory payoutArray = new Payout[](payouts.length); uint i = payouts.length; while (i > 0) { i--; if (payouts[i].block <= block.number) { emit Superprize(payouts[i].index, payouts[i].amount, payouts[i].winnerAddress, payouts[i].betId, 0x01); hold -= payouts[i].amount; } payoutArray[i] = payouts[i]; payouts.pop(); } for (i = 0; i < payoutArray.length; i++) if (payoutArray[i].block > block.number) payouts.push(payoutArray[i]); for (i = 0; i < payoutArray.length; i++) if (payoutArray[i].block <= block.number && !payoutArray[i].winnerAddress.send(payoutArray[i].amount)) (new DeliverFunds).value(payoutArray[i].amount)(payoutArray[i].winnerAddress); } function setOldVersion(address payable oldAddress) external onlyOwner { previousContract = EthexSuperprize(oldAddress); lotoAddress = previousContract.lotoAddress(); hold = previousContract.hold(); uint256 index; uint256 amount; uint256 betBlock; address payable winner; uint256 betId; uint256 payoutsCount = previousContract.getPayoutsCount(); for (uint i = 0; i < payoutsCount; i++) { (index, amount, betBlock, winner, betId) = previousContract.payouts(i); payouts.push(Payout(index, amount, betBlock, winner, betId)); } previousContract.migrate(); } function setNewVersion(address payable newVersion) external onlyOwner { newVersionAddress = newVersion; } function setLoto(address loto) external onlyOwner { lotoAddress = loto; } function migrate() external { require(msg.sender == owner || msg.sender == newVersionAddress); require(newVersionAddress != address(0)); newVersionAddress.transfer(address(this).balance); } function getPayoutsCount() public view returns (uint256) { return payouts.length; } } // File: contracts/openzeppelin/GSN/Context.sol pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: contracts/openzeppelin/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/openzeppelin/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * NOTE: This is a feature of the next version of OpenZeppelin Contracts. * @dev Get it via `npm install @openzeppelin/contracts@next`. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * NOTE: This is a feature of the next version of OpenZeppelin Contracts. * @dev Get it via `npm install @openzeppelin/contracts@next`. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * NOTE: This is a feature of the next version of OpenZeppelin Contracts. * @dev Get it via `npm install @openzeppelin/contracts@next`. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: contracts/openzeppelin/access/Roles.sol pragma solidity ^0.5.0; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } // File: contracts/openzeppelin/access/roles/DistributorRole.sol pragma solidity ^0.5.0; contract DistributorRole is Context { using Roles for Roles.Role; event DistributorAdded(address indexed account); event DistributorRemoved(address indexed account); Roles.Role private _distributors; constructor () internal { _addDistributor(_msgSender()); } modifier onlyDistributor() { require(isDistributor(_msgSender()), "DistributorRole: caller does not have the Distributor role"); _; } function isDistributor(address account) public view returns (bool) { return _distributors.has(account); } function addDistributor(address account) public onlyDistributor { _addDistributor(account); } function renounceDistributor() public { _removeDistributor(_msgSender()); } function _addDistributor(address account) internal { _distributors.add(account); emit DistributorAdded(account); } function _removeDistributor(address account) internal { _distributors.remove(account); emit DistributorRemoved(account); } } // File: contracts/openzeppelin/token/ERC20/ERC20Distributable.sol pragma solidity ^0.5.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20Mintable}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20Distributable is Context, IERC20, DistributorRole { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public onlyDistributor returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public onlyDistributor returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public onlyDistributor returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public onlyDistributor returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public onlyDistributor returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal { require(account != address(0), "ERC20: burn from the zero address"); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } } // File: contracts/openzeppelin/token/ERC20/ERC20Detailed.sol pragma solidity ^0.5.0; /** * @dev Optional functions from the ERC20 standard. */ contract ERC20Detailed is IERC20 { string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of * these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol, uint8 decimals) public { _name = name; _symbol = symbol; _decimals = decimals; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } } // File: contracts/EthexFreeSpins.sol pragma solidity 0.5.17; contract EthexFreeSpins is Ownable, Context, ERC20Distributable, ERC20Detailed { mapping (address => bool) private _migrated; address payable public lotoAddress; address payable public oldVersionAddress; address payable public newVersionAddress; uint256 public Rate; constructor (uint256 rate) public ERC20Detailed("EthexFreeSpins", "EFS", 18) { require(rate > 0, "Rate must be non zero"); Rate = rate; } function use(address account, uint256 amount) public { require(amount >= Rate, "Amount must be greater then rate"); require(msg.sender == lotoAddress, "Loto only"); if (oldVersionAddress != address(0) && _migrated[account] == false) { uint256 totalAmount = EthexFreeSpins(oldVersionAddress).totalBalanceOf(account); _mint(account, totalAmount); _migrated[account] = true; } _burn(account, amount); lotoAddress.transfer(amount / Rate); } function removeDistributor(address account) external onlyOwner { _removeDistributor(account); } function setLoto(address payable loto) external onlyOwner { lotoAddress = loto; } function mint(address account) public payable { _mint(account, msg.value * Rate); } function setOldVersion(address payable oldVersion) external onlyOwner { oldVersionAddress = oldVersion; } function setNewVersion(address payable newVersion) external onlyOwner { newVersionAddress = newVersion; } function migrate() external { require(msg.sender == owner || msg.sender == newVersionAddress); require(newVersionAddress != address(0), "NewVersionAddress required"); EthexFreeSpins(newVersionAddress).payIn.value(address(this).balance)(); } function payIn() external payable { } function totalBalanceOf(address account) public view returns (uint256) { uint256 balance = balanceOf(account); if (oldVersionAddress != address(0) && _migrated[account] == false) return balance + EthexFreeSpins(oldVersionAddress).totalBalanceOf(account); return balance; } } // File: contracts/uniswap/IUniswapFactory.sol pragma solidity ^0.5.0; contract IUniswapFactory { // Public Variables address public exchangeTemplate; uint256 public tokenCount; // Create Exchange function createExchange(address token) external returns (address exchange); // Get Exchange and Token Info function getExchange(address token) external view returns (address exchange); function getToken(address exchange) external view returns (address token); function getTokenWithId(uint256 tokenId) external view returns (address token); // Never use function initializeFactory(address template) external; } // File: contracts/uniswap/IUniswapExchange.sol pragma solidity ^0.5.0; contract IUniswapExchange { // Address of ERC20 token sold on this exchange function tokenAddress() external view returns (address token); // Address of Uniswap Factory function factoryAddress() external view returns (address factory); // Provide Liquidity function addLiquidity(uint256 min_liquidity, uint256 max_tokens, uint256 deadline) external payable returns (uint256); function removeLiquidity(uint256 amount, uint256 min_eth, uint256 min_tokens, uint256 deadline) external returns (uint256, uint256); // Get Prices function getEthToTokenInputPrice(uint256 eth_sold) external view returns (uint256 tokens_bought); function getEthToTokenOutputPrice(uint256 tokens_bought) external view returns (uint256 eth_sold); function getTokenToEthInputPrice(uint256 tokens_sold) external view returns (uint256 eth_bought); function getTokenToEthOutputPrice(uint256 eth_bought) external view returns (uint256 tokens_sold); // Trade ETH to ERC20 function ethToTokenSwapInput(uint256 min_tokens, uint256 deadline) external payable returns (uint256 tokens_bought); function ethToTokenTransferInput(uint256 min_tokens, uint256 deadline, address recipient) external payable returns (uint256 tokens_bought); function ethToTokenSwapOutput(uint256 tokens_bought, uint256 deadline) external payable returns (uint256 eth_sold); function ethToTokenTransferOutput(uint256 tokens_bought, uint256 deadline, address recipient) external payable returns (uint256 eth_sold); // Trade ERC20 to ETH function tokenToEthSwapInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline) external returns (uint256 eth_bought); function tokenToEthTransferInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline, address recipient) external returns (uint256 eth_bought); function tokenToEthSwapOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline) external returns (uint256 tokens_sold); function tokenToEthTransferOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline, address recipient) external returns (uint256 tokens_sold); // Trade ERC20 to ERC20 function tokenToTokenSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address token_addr) external returns (uint256 tokens_bought); function tokenToTokenTransferInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address token_addr) external returns (uint256 tokens_bought); function tokenToTokenSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address token_addr) external returns (uint256 tokens_sold); function tokenToTokenTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address token_addr) external returns (uint256 tokens_sold); // Trade ERC20 to Custom Pool function tokenToExchangeSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address exchange_addr) external returns (uint256 tokens_bought); function tokenToExchangeTransferInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address exchange_addr) external returns (uint256 tokens_bought); function tokenToExchangeSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address exchange_addr) external returns (uint256 tokens_sold); function tokenToExchangeTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address exchange_addr) external returns (uint256 tokens_sold); // ERC20 comaptibility for liquidity tokens bytes32 public name; bytes32 public symbol; uint256 public decimals; function transfer(address _to, uint256 _value) external returns (bool); function transferFrom(address _from, address _to, uint256 value) external returns (bool); function approve(address _spender, uint256 _value) external returns (bool); function allowance(address _owner, address _spender) external view returns (uint256); function balanceOf(address _owner) external view returns (uint256); function totalSupply() external view returns (uint256); // Never use function setup(address token_addr) external; } // File: contracts/EthexLoto.sol pragma solidity 0.5.17; /** * (E)t)h)e)x) Loto Contract * This smart-contract is the part of Ethex Lottery fair game. * See latest version at https://github.com/ethex-bet/ethex-contacts * http://ethex.bet */ contract EthexLoto is Ownable { struct Bet { uint256 blockNumber; uint256 amount; uint256 id; bytes6 bet; address payable gamer; } struct Transaction { uint256 amount; address payable gamer; } struct Superprize { uint256 amount; uint256 id; } mapping(uint256 => Bet) public betQueue; uint256 public counters = 0x20000000000000001; uint256 public holdBalance; address payable public newVersionAddress; address payable public jackpotAddress; address payable public houseAddress; address payable public superprizeAddress; address payable public freeSpinsAddress; address payable public uniswapAddress; event TokenBetAdded ( uint256 tokenAmount, uint256 ethAmount ); event PlaceBet ( uint256 id ); event PayoutBet ( uint256 amount, uint256 id, address gamer ); event RefundBet ( uint256 amount, uint256 id, address gamer ); uint256 internal constant MIN_BET = 0.01 ether; uint256 internal constant PRECISION = 1 ether; uint256 internal constant JACKPOT_PERCENT = 10; uint256 internal constant HOUSE_EDGE = 10; constructor(address payable jackpot, address payable house, address payable superprize, address payable freeSpins, address payable uniswap) public { jackpotAddress = jackpot; houseAddress = house; superprizeAddress = superprize; freeSpinsAddress = freeSpins; uniswapAddress = uniswap; for(uint i = 1; i <= 10; i++) betQueue[i] = Bet(1, MIN_BET, 1, 0xffffffffffff, address(0x0)); } function() external payable { } function placeTokenBet(address tokenAddress, uint256 betMaxTokenAmount, uint256 betTargetEthAmount, uint256 swapDeadline, bytes6 bet) external { require(betTargetEthAmount >= MIN_BET, "Bet amount should be greater or equal than minimal amount"); require(tokenAddress != address(0), "Token address is required"); if (tokenAddress == freeSpinsAddress) { placeFreeSpinBet(betTargetEthAmount, bet); return; } IERC20 token = IERC20(tokenAddress); IUniswapFactory uniswapFactory = IUniswapFactory(uniswapAddress); address exchangeAddress = uniswapFactory.getExchange(tokenAddress); require(exchangeAddress != address(0), "Token is not supported"); IUniswapExchange uniswap = IUniswapExchange(exchangeAddress); uint256 tokensSold = uniswap.getTokenToEthOutputPrice(betTargetEthAmount); require(betMaxTokenAmount >= tokensSold, "Swap requires more token then was allowed"); uint256 balance = token.balanceOf(msg.sender); require(balance >= tokensSold, "Not enough tokens"); token.transferFrom(msg.sender, address(this), tokensSold); token.approve(exchangeAddress, tokensSold); uint256 converted = uniswap.tokenToEthSwapOutput(betTargetEthAmount, tokensSold, swapDeadline); require(converted >= betTargetEthAmount, "Exchange result is smaller then requested"); placeBet(msg.sender, betTargetEthAmount, bet); emit TokenBetAdded(tokensSold, betTargetEthAmount); } function placeFreeSpinBet(uint256 betAmount, bytes6 bet) public { require(betAmount >= MIN_BET, "Bet amount should be greater or equal than minimal amount"); EthexFreeSpins freeSpinsToken = EthexFreeSpins(freeSpinsAddress); uint256 freeSpinAmount = betAmount * freeSpinsToken.Rate(); uint256 freeSpinBalance = freeSpinsToken.balanceOf(msg.sender); require(freeSpinBalance >= freeSpinAmount, "Not enough tokens"); freeSpinsToken.use(msg.sender, freeSpinAmount); placeBet(msg.sender, betAmount, bet); emit TokenBetAdded(freeSpinAmount, betAmount); } function placeBet(bytes6 bet) external payable { require(tx.origin == msg.sender); placeBet(msg.sender, msg.value, bet); } function placeBet(address payable player, uint256 amount, bytes6 bet) private { require(amount >= MIN_BET, "Bet amount should be greater or equal than minimal amount"); uint256 coefficient; uint8 markedCount; uint256 holdAmount; uint256 jackpotFee = amount * JACKPOT_PERCENT * PRECISION / 100 / PRECISION; uint256 houseEdgeFee = amount * HOUSE_EDGE * PRECISION / 100 / PRECISION; uint256 betAmount = amount - jackpotFee - houseEdgeFee; (coefficient, markedCount, holdAmount) = getHold(betAmount, bet); require(amount * (100 - JACKPOT_PERCENT - HOUSE_EDGE) * (coefficient * 8 - 15 * markedCount) <= 9000 ether * markedCount); require( amount * (800 * coefficient - (JACKPOT_PERCENT + HOUSE_EDGE) * (coefficient * 8 + 15 * markedCount)) <= 1500 * markedCount * (address(this).balance - holdBalance)); holdBalance += holdAmount; emit PlaceBet(enqueue(betAmount, bet, player)); EthexJackpot(jackpotAddress).registerTicket.value(jackpotFee)(markedCount > 1 ? player : address(0x0)); EthexHouse(houseAddress).payIn.value(houseEdgeFee)(); } function settleBets() external { uint256 betCount; uint256 first; uint256 last; (betCount, first, last) = getCounters(); if (first > last) return; uint256 i = 0; uint256 length = getLength(); length = length > 10 ? 10 : length; Transaction[] memory transactions = new Transaction[](length); Superprize[] memory superprizes = new Superprize[](length); uint256 hold = holdBalance; uint256 balance = address(this).balance - hold; for(; i < length; i++) { if (betQueue[first].blockNumber >= block.number) { length = i; break; } else { Bet memory bet = dequeue(); first++; uint256 coefficient = 0; uint8 markedCount = 0; uint256 holdAmount = 0; (coefficient, markedCount, holdAmount) = getHold(bet.amount, bet.bet); hold -= holdAmount; balance += holdAmount; if (bet.blockNumber < block.number - 256) { transactions[i] = Transaction(bet.amount, bet.gamer); emit RefundBet(bet.amount, bet.id, bet.gamer); balance -= bet.amount; } else { bytes32 blockHash = blockhash(bet.blockNumber); coefficient = 0; uint8 matchesCount; bool isSuperPrize = true; for (uint8 j = 0; j < bet.bet.length; j++) { if (bet.bet[j] > 0x13) { isSuperPrize = false; continue; } byte field; if (j % 2 == 0) field = blockHash[29 + j / 2] >> 4; else field = blockHash[29 + j / 2] & 0x0F; if (bet.bet[j] < 0x10) { if (field == bet.bet[j]) { matchesCount++; coefficient += 30; } else isSuperPrize = false; continue; } else isSuperPrize = false; if (bet.bet[j] == 0x10) { if (field > 0x09 && field < 0x10) { matchesCount++; coefficient += 5; } continue; } if (bet.bet[j] == 0x11) { if (field < 0x0A) { matchesCount++; coefficient += 3; } continue; } if (bet.bet[j] == 0x12) { if (field < 0x0A && field & 0x01 == 0x01) { matchesCount++; coefficient += 6; } continue; } if (bet.bet[j] == 0x13) { if (field < 0x0A && field & 0x01 == 0x0) { matchesCount++; coefficient += 6; } continue; } } coefficient *= PRECISION * 8; uint256 payoutAmount = bet.amount * coefficient / (PRECISION * 15 * markedCount); transactions[i] = Transaction(payoutAmount, bet.gamer); emit PayoutBet(payoutAmount, bet.id, bet.gamer); balance -= payoutAmount; if (isSuperPrize == true) { superprizes[i].amount = balance; superprizes[i].id = bet.id; balance = 0; } } holdBalance = hold; } } for (i = 0; i < length; i++) { if (transactions[i].amount > 0 && !transactions[i].gamer.send(transactions[i].amount)) (new DeliverFunds).value(transactions[i].amount)(transactions[i].gamer); if (superprizes[i].id != 0) { EthexSuperprize(superprizeAddress).initSuperprize(transactions[i].gamer, superprizes[i].id); EthexJackpot(jackpotAddress).paySuperprize(transactions[i].gamer); if (superprizes[i].amount > 0 && !transactions[i].gamer.send(superprizes[i].amount)) (new DeliverFunds).value(superprizes[i].amount)(transactions[i].gamer); } } } function migrate() external { require(msg.sender == owner || msg.sender == newVersionAddress); require(getLength() == 0, "There are pending bets"); require(newVersionAddress != address(0), "NewVersionAddress required"); newVersionAddress.transfer(address(this).balance); } function setJackpot(address payable jackpot) external onlyOwner { jackpotAddress = jackpot; } function setSuperprize(address payable superprize) external onlyOwner { superprizeAddress = superprize; } function setFreeSpins(address payable freeSpins) external onlyOwner { freeSpinsAddress = freeSpins; } function setNewVersion(address payable newVersion) external onlyOwner { newVersionAddress = newVersion; } function setOldVersion(address payable oldAddress) external onlyOwner { counters = EthexLoto(oldAddress).counters(); EthexLoto(oldAddress).migrate(); } function withdrawToken(IERC20 token, uint amount, address sendTo) external onlyOwner { require(token.transfer(sendTo, amount)); } function length() external view returns (uint256) { return getLength(); } function enqueue(uint256 amount, bytes6 bet, address payable gamer) internal returns (uint256 betCount) { uint256 first; uint256 last; (betCount, first, last) = getCounters(); last++; betCount++; betQueue[last] = Bet(block.number, amount, betCount, bet, gamer); counters = betCount << 128 | (first << 64 | last); } function dequeue() internal returns (Bet memory bet) { uint256 betCount; uint256 first; uint256 last; (betCount, first, last) = getCounters(); require(last >= first); bet = betQueue[first]; if (first == last) counters = betCount << 128 | 0x20000000000000001; else counters = betCount << 128 | (first + 1 << 64 | last); } function getLength() internal view returns (uint256) { uint256 betCount; uint256 first; uint256 last; (betCount, first, last) = getCounters(); return 1 + last - first; } function getCounters() internal view returns (uint256 betCount, uint256 first, uint256 last) { betCount = counters >> 128; first = (counters & 0xffffffffffffffffffffffffffffffff) >> 64; last = counters & 0xffffffffffffffff; } function getHold(uint256 amount, bytes6 bet) internal pure returns (uint256 coefficient, uint8 markedCount, uint256 holdAmount) { for (uint8 i = 0; i < bet.length; i++) { if (bet[i] > 0x13) continue; markedCount++; if (bet[i] < 0x10) { coefficient += 30; continue; } if (bet[i] == 0x10) { coefficient += 5; continue; } if (bet[i] == 0x11) { coefficient += 3; continue; } if (bet[i] == 0x12) { coefficient += 6; continue; } if (bet[i] == 0x13) { coefficient += 6; continue; } } holdAmount = amount * coefficient * 8 / 15 / markedCount; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address payable","name":"jackpot","type":"address"},{"internalType":"address payable","name":"house","type":"address"},{"internalType":"address payable","name":"superprize","type":"address"},{"internalType":"address payable","name":"freeSpins","type":"address"},{"internalType":"address payable","name":"uniswap","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"gamer","type":"address"}],"name":"PayoutBet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"PlaceBet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"gamer","type":"address"}],"name":"RefundBet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"TokenBetAdded","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"betQueue","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes6","name":"bet","type":"bytes6"},{"internalType":"address payable","name":"gamer","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"counters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"freeSpinsAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"holdBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"houseAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"jackpotAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"length","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"migrate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"newVersionAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes6","name":"bet","type":"bytes6"}],"name":"placeBet","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"betAmount","type":"uint256"},{"internalType":"bytes6","name":"bet","type":"bytes6"}],"name":"placeFreeSpinBet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"betMaxTokenAmount","type":"uint256"},{"internalType":"uint256","name":"betTargetEthAmount","type":"uint256"},{"internalType":"uint256","name":"swapDeadline","type":"uint256"},{"internalType":"bytes6","name":"bet","type":"bytes6"}],"name":"placeTokenBet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"freeSpins","type":"address"}],"name":"setFreeSpins","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"jackpot","type":"address"}],"name":"setJackpot","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"newVersion","type":"address"}],"name":"setNewVersion","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"oldAddress","type":"address"}],"name":"setOldVersion","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"superprize","type":"address"}],"name":"setSuperprize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"settleBets","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"superprizeAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"uniswapAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"sendTo","type":"address"}],"name":"withdrawToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526802000000000000000160025534801561001d57600080fd5b506040516124fd3803806124fd833981810160405260a081101561004057600080fd5b50805160208201516040808401516060850151608090950151600080546001600160a01b031916331780825593519596949592949391926001600160a01b0392909216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600580546001600160a01b03199081166001600160a01b03888116919091179092556006805482168784161790556007805482168684161790556008805482168584161790556009805490911691831691909117905560015b600a81116101b2576040805160a0810182526001808252662386f26fc1000060208084019182528385018381526001600160d01b0319606086019081526000608087018181528982529386905296909620945185559151848401559051600284015592516003909201805493516001600160a01b0316660100000000000002600160301b600160d01b031960d09490941c65ffffffffffff19909516949094179290921692909217905501610102565b505050505050612336806101c76000396000f3fe6080604052600436106101405760003560e01c80639d2e52b4116100b6578063d71be24b1161006f578063d71be24b14610451578063d7cee31e14610478578063e23fe94e1461048d578063e33e5580146104a2578063f2fde38b146104b7578063f7210633146104ea57610140565b80639d2e52b4146102fd5780639d719ee614610352578063a529c678146103ba578063aebd81d2146103cf578063c703313714610409578063cdfa67d11461041e57610140565b80635ce7d299116101085780635ce7d299146102255780636bc0b3ba146102585780637e95385c1461026d57806386f9318b146102a05780638da5cb5b146102d35780638fd3ab80146102e857610140565b80630e2feb05146101425780631f7b6d321461017357806326c989df1461019a5780633ccdbb28146101af5780634abd4c85146101f2575b005b34801561014e57600080fd5b506101576104ff565b604080516001600160a01b039092168252519081900360200190f35b34801561017f57600080fd5b5061018861050e565b60408051918252519081900360200190f35b3480156101a657600080fd5b5061018861051d565b3480156101bb57600080fd5b50610140600480360360608110156101d257600080fd5b506001600160a01b03813581169160208101359160409091013516610523565b3480156101fe57600080fd5b506101406004803603602081101561021557600080fd5b50356001600160a01b031661060a565b34801561023157600080fd5b506101406004803603602081101561024857600080fd5b50356001600160a01b0316610679565b34801561026457600080fd5b506101576106e8565b34801561027957600080fd5b506101406004803603602081101561029057600080fd5b50356001600160a01b03166106f7565b3480156102ac57600080fd5b50610140600480360360208110156102c357600080fd5b50356001600160a01b0316610766565b3480156102df57600080fd5b506101576107d5565b3480156102f457600080fd5b506101406107e4565b34801561030957600080fd5b50610140600480360360a081101561032057600080fd5b5080356001600160a01b031690602081013590604081013590606081013590608001356001600160d01b0319166108fc565b34801561035e57600080fd5b5061037c6004803603602081101561037557600080fd5b5035610e2e565b604080519586526020860194909452848401929092526001600160d01b03191660608401526001600160a01b03166080830152519081900360a00190f35b3480156103c657600080fd5b50610157610e6c565b3480156103db57600080fd5b50610140600480360360408110156103f257600080fd5b50803590602001356001600160d01b031916610e7b565b34801561041557600080fd5b506101406110af565b34801561042a57600080fd5b506101406004803603602081101561044157600080fd5b50356001600160a01b03166119d6565b6101406004803603602081101561046757600080fd5b50356001600160d01b031916611ae0565b34801561048457600080fd5b50610157611af7565b34801561049957600080fd5b50610157611b06565b3480156104ae57600080fd5b50610157611b15565b3480156104c357600080fd5b50610140600480360360208110156104da57600080fd5b50356001600160a01b0316611b24565b3480156104f657600080fd5b50610188611c11565b6009546001600160a01b031681565b6000610518611c17565b905090565b60035481565b6000546001600160a01b03163314610570576040805162461bcd60e51b81526020600482018190526024820152600080516020612280833981519152604482015290519081900360640190fd5b826001600160a01b031663a9059cbb82846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156105d057600080fd5b505af11580156105e4573d6000803e3d6000fd5b505050506040513d60208110156105fa57600080fd5b505161060557600080fd5b505050565b6000546001600160a01b03163314610657576040805162461bcd60e51b81526020600482018190526024820152600080516020612280833981519152604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146106c6576040805162461bcd60e51b81526020600482018190526024820152600080516020612280833981519152604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031681565b6000546001600160a01b03163314610744576040805162461bcd60e51b81526020600482018190526024820152600080516020612280833981519152604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146107b3576040805162461bcd60e51b81526020600482018190526024820152600080516020612280833981519152604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031681565b6000546001600160a01b031633148061080757506004546001600160a01b031633145b61081057600080fd5b610818611c17565b15610863576040805162461bcd60e51b81526020600482015260166024820152755468657265206172652070656e64696e67206265747360501b604482015290519081900360640190fd5b6004546001600160a01b03166108c0576040805162461bcd60e51b815260206004820152601a60248201527f4e657756657273696f6e41646472657373207265717569726564000000000000604482015290519081900360640190fd5b6004546040516001600160a01b03909116904780156108fc02916000818181858888f193505050501580156108f9573d6000803e3d6000fd5b50565b662386f26fc100008310156109425760405162461bcd60e51b81526004018080602001828103825260398152602001806122a06039913960400191505060405180910390fd5b6001600160a01b03851661099d576040805162461bcd60e51b815260206004820152601960248201527f546f6b656e206164647265737320697320726571756972656400000000000000604482015290519081900360640190fd5b6008546001600160a01b03868116911614156109c2576109bd8382610e7b565b610e27565b600954604080516303795fb160e11b81526001600160a01b03808916600483015291518893929092169160009183916306f2bf6291602480820192602092909190829003018186803b158015610a1757600080fd5b505afa158015610a2b573d6000803e3d6000fd5b505050506040513d6020811015610a4157600080fd5b505190506001600160a01b038116610a99576040805162461bcd60e51b8152602060048201526016602482015275151bdad95b881a5cc81b9bdd081cdd5c1c1bdc9d195960521b604482015290519081900360640190fd5b60008190506000816001600160a01b0316632640f62c896040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610ae457600080fd5b505afa158015610af8573d6000803e3d6000fd5b505050506040513d6020811015610b0e57600080fd5b5051905080891015610b515760405162461bcd60e51b81526004018080602001828103825260298152602001806122576029913960400191505060405180910390fd5b604080516370a0823160e01b815233600482015290516000916001600160a01b038816916370a0823191602480820192602092909190829003018186803b158015610b9b57600080fd5b505afa158015610baf573d6000803e3d6000fd5b505050506040513d6020811015610bc557600080fd5b5051905081811015610c12576040805162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820746f6b656e7360781b604482015290519081900360640190fd5b604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b038816916323b872dd9160648083019260209291908290030181600087803b158015610c6757600080fd5b505af1158015610c7b573d6000803e3d6000fd5b505050506040513d6020811015610c9157600080fd5b50506040805163095ea7b360e01b81526001600160a01b0386811660048301526024820185905291519188169163095ea7b3916044808201926020929091908290030181600087803b158015610ce657600080fd5b505af1158015610cfa573d6000803e3d6000fd5b505050506040513d6020811015610d1057600080fd5b50506040805163013efd8b60e01b8152600481018b905260248101849052604481018a905290516000916001600160a01b0386169163013efd8b9160648082019260209290919082900301818787803b158015610d6c57600080fd5b505af1158015610d80573d6000803e3d6000fd5b505050506040513d6020811015610d9657600080fd5b5051905089811015610dd95760405162461bcd60e51b81526004018080602001828103825260298152602001806122d96029913960400191505060405180910390fd5b610de4338b8a611c32565b60408051848152602081018c905281517f9362b22077eba3a4fa0a6773b3c8f22c96d3b87104a510484d4c724ed338bdb7929181900390910190a1505050505050505b5050505050565b6001602081905260009182526040909120805491810154600282015460039092015490919060d081901b90600160301b90046001600160a01b031685565b6008546001600160a01b031681565b662386f26fc10000821015610ec15760405162461bcd60e51b81526004018080602001828103825260398152602001806122a06039913960400191505060405180910390fd5b60085460408051631b8e94a160e01b815290516001600160a01b03909216916000918391631b8e94a191600480820192602092909190829003018186803b158015610f0b57600080fd5b505afa158015610f1f573d6000803e3d6000fd5b505050506040513d6020811015610f3557600080fd5b5051604080516370a0823160e01b8152336004820152905191860292506000916001600160a01b038516916370a08231916024808301926020929190829003018186803b158015610f8557600080fd5b505afa158015610f99573d6000803e3d6000fd5b505050506040513d6020811015610faf57600080fd5b5051905081811015610ffc576040805162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820746f6b656e7360781b604482015290519081900360640190fd5b6040805163034fd95160e51b81523360048201526024810184905290516001600160a01b038516916369fb2a2091604480830192600092919082900301818387803b15801561104a57600080fd5b505af115801561105e573d6000803e3d6000fd5b5050505061106d338686611c32565b604080518381526020810187905281517f9362b22077eba3a4fa0a6773b3c8f22c96d3b87104a510484d4c724ed338bdb7929181900390910190a15050505050565b60008060006110bc611e5d565b91945092509050808211156110d3575050506119d4565b6000806110de611c17565b9050600a81116110ee57806110f1565b600a5b905060608160405190808252806020026020018201604052801561112f57816020015b61111c61217f565b8152602001906001900390816111145790505b50905060608260405190808252806020026020018201604052801561116e57816020015b61115b612196565b8152602001906001900390816111535790505b50600354909150478190035b8486101561168057600088815260016020526040902054431161119f57859450611680565b6111a76121b0565b6111af611e7b565b602081015160608201516001909b019a919250600091829182916111d39190611f43565b8651988190039897810197929550909350915060ff19430111156112935760405180604001604052808560200151815260200185608001516001600160a01b0316815250888b8151811061122357fe5b6020908102919091018101919091528481015160408087015160808801518251938452938301526001600160a01b039092168183015290517f7e76c280720a70a91ed1d3beb323e2f4a59ecf10e4922086b21187085f42832a9181900360600190a183602001518503945061166c565b83516000935040836001815b600660ff82161015611556576060880151601360f81b9060ff8316600681106112c457fe5b1a60f81b6001600160f81b03191611156112e1576000915061154e565b60006001821661131c57600485600260ff851604601d0160ff166020811061130557fe5b1a60f81b6001600160f81b031916901c9050611341565b84600260ff841604601d0160ff166020811061133457fe5b1a60f81b600f60f81b1690505b6060890151600160fc1b9060ff84166006811061135a57fe5b1a60f81b6001600160f81b03191610156113bd5788606001518260ff166006811061138157fe5b1a60f81b6001600160f81b031916816001600160f81b03191614156113b257601e97909701966001909301926113b7565b600092505b5061154e565b6000925088606001518260ff16600681106113d457fe5b1a60f81b6001600160f81b031916601060f81b141561142f57600960f81b6001600160f81b031982161180156114175750600160fc1b6001600160f81b03198216105b156113b757600597909701966001909301925061154e565b88606001518260ff166006811061144257fe5b1a60f81b6001600160f81b031916601160f81b141561148457600560f91b6001600160f81b0319821610156113b757600397909701966001909301925061154e565b88606001518260ff166006811061149757fe5b1a60f81b6001600160f81b031916601260f81b14156114ea57600560f91b6001600160f81b031982161080156114d25750600160f81b808216145b156113b757600697909701966001909301925061154e565b88606001518260ff16600681106114fd57fe5b1a60f81b6001600160f81b031916601360f81b141561154c57600560f91b6001600160f81b031982161080156114d25750600160f81b81166113b757600697909701966001909301925061154e565b505b60010161129f565b506020870151676f05b59d3b2000008781029760009267d02ab486cedc000060ff8a1602929102028161158557fe5b049050604051806040016040528082815260200189608001516001600160a01b03168152508c8f815181106115b657fe5b6020908102919091018101919091526040808a015160808b01518251858152938401919091526001600160a01b031682820152517fd6e868f6da34c3ad12d79e1dedfe199baf8533f66aa7fdf14b2ed7ca48e2045d9181900360600190a197889003976001821515141561166757888b8f8151811061163157fe5b6020026020010151600001818152505087604001518b8f8151811061165257fe5b60200260200101516020018181525050600098505b505050505b50505060038390555060019095019461117a565b600095505b848610156119ca57600084878151811061169b57fe5b60200260200101516000015111801561170757508386815181106116bb57fe5b6020026020010151602001516001600160a01b03166108fc8588815181106116df57fe5b6020026020010151600001519081150290604051600060405180830381858888f19350505050155b156117785783868151811061171857fe5b60200260200101516000015184878151811061173057fe5b602002602001015160200151604051611748906121f2565b6001600160a01b039091168152604051908190036020019082f080158015611774573d6000803e3d6000fd5b5050505b82868151811061178457fe5b6020026020010151602001516000146119bf5760075484516001600160a01b0390911690636a3c4c90908690899081106117ba57fe5b6020026020010151602001518589815181106117d257fe5b6020026020010151602001516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561182d57600080fd5b505af1158015611841573d6000803e3d6000fd5b505060055486516001600160a01b039091169250636cbe252e915086908990811061186857fe5b6020026020010151602001516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b1580156118bc57600080fd5b505af11580156118d0573d6000803e3d6000fd5b5050505060008387815181106118e257fe5b60200260200101516000015111801561194e575083868151811061190257fe5b6020026020010151602001516001600160a01b03166108fc84888151811061192657fe5b6020026020010151600001519081150290604051600060405180830381858888f19350505050155b156119bf5782868151811061195f57fe5b60200260200101516000015184878151811061197757fe5b60200260200101516020015160405161198f906121f2565b6001600160a01b039091168152604051908190036020019082f0801580156119bb573d6000803e3d6000fd5b5050505b600190950194611685565b5050505050505050505b565b6000546001600160a01b03163314611a23576040805162461bcd60e51b81526020600482018190526024820152600080516020612280833981519152604482015290519081900360640190fd5b806001600160a01b031663f72106336040518163ffffffff1660e01b815260040160206040518083038186803b158015611a5c57600080fd5b505afa158015611a70573d6000803e3d6000fd5b505050506040513d6020811015611a8657600080fd5b50516002556040805163011fa75760e71b815290516001600160a01b03831691638fd3ab8091600480830192600092919082900301818387803b158015611acc57600080fd5b505af1158015610e27573d6000803e3d6000fd5b323314611aec57600080fd5b6108f9333483611c32565b6006546001600160a01b031681565b6004546001600160a01b031681565b6007546001600160a01b031681565b6000546001600160a01b03163314611b71576040805162461bcd60e51b81526020600482018190526024820152600080516020612280833981519152604482015290519081900360640190fd5b6001600160a01b038116611bb65760405162461bcd60e51b81526004018080602001828103825260268152602001806122316026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60025481565b600080600080611c25611e5d565b0360010194505050505090565b662386f26fc10000821015611c785760405162461bcd60e51b81526004018080602001828103825260398152602001806122a06039913960400191505060405180910390fd5b60008080670de0b6b3a76400006064678ac7230489e800008702040480808703819003611ca58188611f43565b9197509550935060ff8086166901e7e4171bf4d3a000000269ffffffffffffffffffff166050600f880290921660088902038a02919091021115611ce857600080fd5b60035447038560ff166105dc0261ffff160285600f0260ff168760080201600a80010287610320020389021115611d1e57600080fd5b60038054850190557f5a6d41a069342415d1f48212db19fe3d1d6ac230791e6638c67ce405600fb9f3611d5282898c6120aa565b60408051918252519081900360200190a16005546001600160a01b031663c1126a3684600160ff891611611d87576000611d89565b8b5b6040518363ffffffff1660e01b815260040180826001600160a01b03166001600160a01b031681526020019150506000604051808303818588803b158015611dd057600080fd5b505af1158015611de4573d6000803e3d6000fd5b5050505050600660009054906101000a90046001600160a01b03166001600160a01b031663fcddd056836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611e3957600080fd5b505af1158015611e4d573d6000803e3d6000fd5b5050505050505050505050505050565b600254608081901c9167ffffffffffffffff604083901c8116921690565b611e836121b0565b6000806000611e90611e5d565b9194509250905081811015611ea457600080fd5b600082815260016020818152604092839020835160a08101855281548152928101549183019190915260028101549282019290925260039091015460d081901b6001600160d01b0319166060830152600160301b90046001600160a01b03166080820152935080821415611f2a5768020000000000000001608084901b17600255611f3d565b608083901b6001830160401b8217176002555b50505090565b60008080805b600660ff8216101561208b57601360f81b8560ff831660068110611f6957fe5b1a60f81b6001600160f81b0319161115611f8257612083565b600190920191600160fc1b8560ff831660068110611f9c57fe5b1a60f81b6001600160f81b0319161015611fbb57601e84019350612083565b848160ff1660068110611fca57fe5b1a60f81b6001600160f81b031916601060f81b1415611fee57600584019350612083565b848160ff1660068110611ffd57fe5b1a60f81b6001600160f81b031916601160f81b141561202157600384019350612083565b848160ff166006811061203057fe5b1a60f81b6001600160f81b031916601260f81b141561205457600684019350612083565b848160ff166006811061206357fe5b1a60f81b6001600160f81b031916601360f81b1415612083576006840193505b600101611f49565b5060ff8216600f60088786020204816120a057fe5b0490509250925092565b60008060006120b7611e5d565b6040805160a08101825243815260208082019b8c5260019586018284018181526001600160d01b0319909c16606084019081526001600160a01b039b8c1660808086019182529689016000818152948a905293869020945185559d51978401979097559a516002808401919091559551600390920180549c51909a16600160301b026601000000000000600160d01b031960d09390931c65ffffffffffff19909d169c909c17919091169a909a1790975587901b951b90961793909317909455509092915050565b604080518082019091526000808252602082015290565b604051806040016040528060008152602001600081525090565b6040518060a0016040528060008152602001600081526020016000815260200160006001600160d01b031916815260200160006001600160a01b031681525090565b6032806121ff8339019056fe60806040526040516032380380603283398181016040526020811015602357600080fd5b50516001600160a01b038116fffe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353776170207265717569726573206d6f726520746f6b656e207468656e2077617320616c6c6f7765644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657242657420616d6f756e742073686f756c642062652067726561746572206f7220657175616c207468616e206d696e696d616c20616d6f756e7445786368616e676520726573756c7420697320736d616c6c6572207468656e20726571756573746564a265627a7a72315820b3c8f7b4e828553f9171aed4a05ab58b21ff259c14d6d763e9f8628992b78b7664736f6c634300051100320000000000000000000000008dc74d28b9821f7f9d0e95ab2d3c66f5276ac474000000000000000000000000a6d93468c1f16f2e1009ec321251f0b3147117b300000000000000000000000043386190b78ed35551a104bd374522725b20fe570000000000000000000000009a5423038bade592e3e35ac04c5ff6813dd3e7df000000000000000000000000c0a47dfe034b400b47bdad5fecda2621de6c4d95
Deployed Bytecode
0x6080604052600436106101405760003560e01c80639d2e52b4116100b6578063d71be24b1161006f578063d71be24b14610451578063d7cee31e14610478578063e23fe94e1461048d578063e33e5580146104a2578063f2fde38b146104b7578063f7210633146104ea57610140565b80639d2e52b4146102fd5780639d719ee614610352578063a529c678146103ba578063aebd81d2146103cf578063c703313714610409578063cdfa67d11461041e57610140565b80635ce7d299116101085780635ce7d299146102255780636bc0b3ba146102585780637e95385c1461026d57806386f9318b146102a05780638da5cb5b146102d35780638fd3ab80146102e857610140565b80630e2feb05146101425780631f7b6d321461017357806326c989df1461019a5780633ccdbb28146101af5780634abd4c85146101f2575b005b34801561014e57600080fd5b506101576104ff565b604080516001600160a01b039092168252519081900360200190f35b34801561017f57600080fd5b5061018861050e565b60408051918252519081900360200190f35b3480156101a657600080fd5b5061018861051d565b3480156101bb57600080fd5b50610140600480360360608110156101d257600080fd5b506001600160a01b03813581169160208101359160409091013516610523565b3480156101fe57600080fd5b506101406004803603602081101561021557600080fd5b50356001600160a01b031661060a565b34801561023157600080fd5b506101406004803603602081101561024857600080fd5b50356001600160a01b0316610679565b34801561026457600080fd5b506101576106e8565b34801561027957600080fd5b506101406004803603602081101561029057600080fd5b50356001600160a01b03166106f7565b3480156102ac57600080fd5b50610140600480360360208110156102c357600080fd5b50356001600160a01b0316610766565b3480156102df57600080fd5b506101576107d5565b3480156102f457600080fd5b506101406107e4565b34801561030957600080fd5b50610140600480360360a081101561032057600080fd5b5080356001600160a01b031690602081013590604081013590606081013590608001356001600160d01b0319166108fc565b34801561035e57600080fd5b5061037c6004803603602081101561037557600080fd5b5035610e2e565b604080519586526020860194909452848401929092526001600160d01b03191660608401526001600160a01b03166080830152519081900360a00190f35b3480156103c657600080fd5b50610157610e6c565b3480156103db57600080fd5b50610140600480360360408110156103f257600080fd5b50803590602001356001600160d01b031916610e7b565b34801561041557600080fd5b506101406110af565b34801561042a57600080fd5b506101406004803603602081101561044157600080fd5b50356001600160a01b03166119d6565b6101406004803603602081101561046757600080fd5b50356001600160d01b031916611ae0565b34801561048457600080fd5b50610157611af7565b34801561049957600080fd5b50610157611b06565b3480156104ae57600080fd5b50610157611b15565b3480156104c357600080fd5b50610140600480360360208110156104da57600080fd5b50356001600160a01b0316611b24565b3480156104f657600080fd5b50610188611c11565b6009546001600160a01b031681565b6000610518611c17565b905090565b60035481565b6000546001600160a01b03163314610570576040805162461bcd60e51b81526020600482018190526024820152600080516020612280833981519152604482015290519081900360640190fd5b826001600160a01b031663a9059cbb82846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156105d057600080fd5b505af11580156105e4573d6000803e3d6000fd5b505050506040513d60208110156105fa57600080fd5b505161060557600080fd5b505050565b6000546001600160a01b03163314610657576040805162461bcd60e51b81526020600482018190526024820152600080516020612280833981519152604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146106c6576040805162461bcd60e51b81526020600482018190526024820152600080516020612280833981519152604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031681565b6000546001600160a01b03163314610744576040805162461bcd60e51b81526020600482018190526024820152600080516020612280833981519152604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146107b3576040805162461bcd60e51b81526020600482018190526024820152600080516020612280833981519152604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031681565b6000546001600160a01b031633148061080757506004546001600160a01b031633145b61081057600080fd5b610818611c17565b15610863576040805162461bcd60e51b81526020600482015260166024820152755468657265206172652070656e64696e67206265747360501b604482015290519081900360640190fd5b6004546001600160a01b03166108c0576040805162461bcd60e51b815260206004820152601a60248201527f4e657756657273696f6e41646472657373207265717569726564000000000000604482015290519081900360640190fd5b6004546040516001600160a01b03909116904780156108fc02916000818181858888f193505050501580156108f9573d6000803e3d6000fd5b50565b662386f26fc100008310156109425760405162461bcd60e51b81526004018080602001828103825260398152602001806122a06039913960400191505060405180910390fd5b6001600160a01b03851661099d576040805162461bcd60e51b815260206004820152601960248201527f546f6b656e206164647265737320697320726571756972656400000000000000604482015290519081900360640190fd5b6008546001600160a01b03868116911614156109c2576109bd8382610e7b565b610e27565b600954604080516303795fb160e11b81526001600160a01b03808916600483015291518893929092169160009183916306f2bf6291602480820192602092909190829003018186803b158015610a1757600080fd5b505afa158015610a2b573d6000803e3d6000fd5b505050506040513d6020811015610a4157600080fd5b505190506001600160a01b038116610a99576040805162461bcd60e51b8152602060048201526016602482015275151bdad95b881a5cc81b9bdd081cdd5c1c1bdc9d195960521b604482015290519081900360640190fd5b60008190506000816001600160a01b0316632640f62c896040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610ae457600080fd5b505afa158015610af8573d6000803e3d6000fd5b505050506040513d6020811015610b0e57600080fd5b5051905080891015610b515760405162461bcd60e51b81526004018080602001828103825260298152602001806122576029913960400191505060405180910390fd5b604080516370a0823160e01b815233600482015290516000916001600160a01b038816916370a0823191602480820192602092909190829003018186803b158015610b9b57600080fd5b505afa158015610baf573d6000803e3d6000fd5b505050506040513d6020811015610bc557600080fd5b5051905081811015610c12576040805162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820746f6b656e7360781b604482015290519081900360640190fd5b604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b038816916323b872dd9160648083019260209291908290030181600087803b158015610c6757600080fd5b505af1158015610c7b573d6000803e3d6000fd5b505050506040513d6020811015610c9157600080fd5b50506040805163095ea7b360e01b81526001600160a01b0386811660048301526024820185905291519188169163095ea7b3916044808201926020929091908290030181600087803b158015610ce657600080fd5b505af1158015610cfa573d6000803e3d6000fd5b505050506040513d6020811015610d1057600080fd5b50506040805163013efd8b60e01b8152600481018b905260248101849052604481018a905290516000916001600160a01b0386169163013efd8b9160648082019260209290919082900301818787803b158015610d6c57600080fd5b505af1158015610d80573d6000803e3d6000fd5b505050506040513d6020811015610d9657600080fd5b5051905089811015610dd95760405162461bcd60e51b81526004018080602001828103825260298152602001806122d96029913960400191505060405180910390fd5b610de4338b8a611c32565b60408051848152602081018c905281517f9362b22077eba3a4fa0a6773b3c8f22c96d3b87104a510484d4c724ed338bdb7929181900390910190a1505050505050505b5050505050565b6001602081905260009182526040909120805491810154600282015460039092015490919060d081901b90600160301b90046001600160a01b031685565b6008546001600160a01b031681565b662386f26fc10000821015610ec15760405162461bcd60e51b81526004018080602001828103825260398152602001806122a06039913960400191505060405180910390fd5b60085460408051631b8e94a160e01b815290516001600160a01b03909216916000918391631b8e94a191600480820192602092909190829003018186803b158015610f0b57600080fd5b505afa158015610f1f573d6000803e3d6000fd5b505050506040513d6020811015610f3557600080fd5b5051604080516370a0823160e01b8152336004820152905191860292506000916001600160a01b038516916370a08231916024808301926020929190829003018186803b158015610f8557600080fd5b505afa158015610f99573d6000803e3d6000fd5b505050506040513d6020811015610faf57600080fd5b5051905081811015610ffc576040805162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820746f6b656e7360781b604482015290519081900360640190fd5b6040805163034fd95160e51b81523360048201526024810184905290516001600160a01b038516916369fb2a2091604480830192600092919082900301818387803b15801561104a57600080fd5b505af115801561105e573d6000803e3d6000fd5b5050505061106d338686611c32565b604080518381526020810187905281517f9362b22077eba3a4fa0a6773b3c8f22c96d3b87104a510484d4c724ed338bdb7929181900390910190a15050505050565b60008060006110bc611e5d565b91945092509050808211156110d3575050506119d4565b6000806110de611c17565b9050600a81116110ee57806110f1565b600a5b905060608160405190808252806020026020018201604052801561112f57816020015b61111c61217f565b8152602001906001900390816111145790505b50905060608260405190808252806020026020018201604052801561116e57816020015b61115b612196565b8152602001906001900390816111535790505b50600354909150478190035b8486101561168057600088815260016020526040902054431161119f57859450611680565b6111a76121b0565b6111af611e7b565b602081015160608201516001909b019a919250600091829182916111d39190611f43565b8651988190039897810197929550909350915060ff19430111156112935760405180604001604052808560200151815260200185608001516001600160a01b0316815250888b8151811061122357fe5b6020908102919091018101919091528481015160408087015160808801518251938452938301526001600160a01b039092168183015290517f7e76c280720a70a91ed1d3beb323e2f4a59ecf10e4922086b21187085f42832a9181900360600190a183602001518503945061166c565b83516000935040836001815b600660ff82161015611556576060880151601360f81b9060ff8316600681106112c457fe5b1a60f81b6001600160f81b03191611156112e1576000915061154e565b60006001821661131c57600485600260ff851604601d0160ff166020811061130557fe5b1a60f81b6001600160f81b031916901c9050611341565b84600260ff841604601d0160ff166020811061133457fe5b1a60f81b600f60f81b1690505b6060890151600160fc1b9060ff84166006811061135a57fe5b1a60f81b6001600160f81b03191610156113bd5788606001518260ff166006811061138157fe5b1a60f81b6001600160f81b031916816001600160f81b03191614156113b257601e97909701966001909301926113b7565b600092505b5061154e565b6000925088606001518260ff16600681106113d457fe5b1a60f81b6001600160f81b031916601060f81b141561142f57600960f81b6001600160f81b031982161180156114175750600160fc1b6001600160f81b03198216105b156113b757600597909701966001909301925061154e565b88606001518260ff166006811061144257fe5b1a60f81b6001600160f81b031916601160f81b141561148457600560f91b6001600160f81b0319821610156113b757600397909701966001909301925061154e565b88606001518260ff166006811061149757fe5b1a60f81b6001600160f81b031916601260f81b14156114ea57600560f91b6001600160f81b031982161080156114d25750600160f81b808216145b156113b757600697909701966001909301925061154e565b88606001518260ff16600681106114fd57fe5b1a60f81b6001600160f81b031916601360f81b141561154c57600560f91b6001600160f81b031982161080156114d25750600160f81b81166113b757600697909701966001909301925061154e565b505b60010161129f565b506020870151676f05b59d3b2000008781029760009267d02ab486cedc000060ff8a1602929102028161158557fe5b049050604051806040016040528082815260200189608001516001600160a01b03168152508c8f815181106115b657fe5b6020908102919091018101919091526040808a015160808b01518251858152938401919091526001600160a01b031682820152517fd6e868f6da34c3ad12d79e1dedfe199baf8533f66aa7fdf14b2ed7ca48e2045d9181900360600190a197889003976001821515141561166757888b8f8151811061163157fe5b6020026020010151600001818152505087604001518b8f8151811061165257fe5b60200260200101516020018181525050600098505b505050505b50505060038390555060019095019461117a565b600095505b848610156119ca57600084878151811061169b57fe5b60200260200101516000015111801561170757508386815181106116bb57fe5b6020026020010151602001516001600160a01b03166108fc8588815181106116df57fe5b6020026020010151600001519081150290604051600060405180830381858888f19350505050155b156117785783868151811061171857fe5b60200260200101516000015184878151811061173057fe5b602002602001015160200151604051611748906121f2565b6001600160a01b039091168152604051908190036020019082f080158015611774573d6000803e3d6000fd5b5050505b82868151811061178457fe5b6020026020010151602001516000146119bf5760075484516001600160a01b0390911690636a3c4c90908690899081106117ba57fe5b6020026020010151602001518589815181106117d257fe5b6020026020010151602001516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561182d57600080fd5b505af1158015611841573d6000803e3d6000fd5b505060055486516001600160a01b039091169250636cbe252e915086908990811061186857fe5b6020026020010151602001516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b1580156118bc57600080fd5b505af11580156118d0573d6000803e3d6000fd5b5050505060008387815181106118e257fe5b60200260200101516000015111801561194e575083868151811061190257fe5b6020026020010151602001516001600160a01b03166108fc84888151811061192657fe5b6020026020010151600001519081150290604051600060405180830381858888f19350505050155b156119bf5782868151811061195f57fe5b60200260200101516000015184878151811061197757fe5b60200260200101516020015160405161198f906121f2565b6001600160a01b039091168152604051908190036020019082f0801580156119bb573d6000803e3d6000fd5b5050505b600190950194611685565b5050505050505050505b565b6000546001600160a01b03163314611a23576040805162461bcd60e51b81526020600482018190526024820152600080516020612280833981519152604482015290519081900360640190fd5b806001600160a01b031663f72106336040518163ffffffff1660e01b815260040160206040518083038186803b158015611a5c57600080fd5b505afa158015611a70573d6000803e3d6000fd5b505050506040513d6020811015611a8657600080fd5b50516002556040805163011fa75760e71b815290516001600160a01b03831691638fd3ab8091600480830192600092919082900301818387803b158015611acc57600080fd5b505af1158015610e27573d6000803e3d6000fd5b323314611aec57600080fd5b6108f9333483611c32565b6006546001600160a01b031681565b6004546001600160a01b031681565b6007546001600160a01b031681565b6000546001600160a01b03163314611b71576040805162461bcd60e51b81526020600482018190526024820152600080516020612280833981519152604482015290519081900360640190fd5b6001600160a01b038116611bb65760405162461bcd60e51b81526004018080602001828103825260268152602001806122316026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60025481565b600080600080611c25611e5d565b0360010194505050505090565b662386f26fc10000821015611c785760405162461bcd60e51b81526004018080602001828103825260398152602001806122a06039913960400191505060405180910390fd5b60008080670de0b6b3a76400006064678ac7230489e800008702040480808703819003611ca58188611f43565b9197509550935060ff8086166901e7e4171bf4d3a000000269ffffffffffffffffffff166050600f880290921660088902038a02919091021115611ce857600080fd5b60035447038560ff166105dc0261ffff160285600f0260ff168760080201600a80010287610320020389021115611d1e57600080fd5b60038054850190557f5a6d41a069342415d1f48212db19fe3d1d6ac230791e6638c67ce405600fb9f3611d5282898c6120aa565b60408051918252519081900360200190a16005546001600160a01b031663c1126a3684600160ff891611611d87576000611d89565b8b5b6040518363ffffffff1660e01b815260040180826001600160a01b03166001600160a01b031681526020019150506000604051808303818588803b158015611dd057600080fd5b505af1158015611de4573d6000803e3d6000fd5b5050505050600660009054906101000a90046001600160a01b03166001600160a01b031663fcddd056836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611e3957600080fd5b505af1158015611e4d573d6000803e3d6000fd5b5050505050505050505050505050565b600254608081901c9167ffffffffffffffff604083901c8116921690565b611e836121b0565b6000806000611e90611e5d565b9194509250905081811015611ea457600080fd5b600082815260016020818152604092839020835160a08101855281548152928101549183019190915260028101549282019290925260039091015460d081901b6001600160d01b0319166060830152600160301b90046001600160a01b03166080820152935080821415611f2a5768020000000000000001608084901b17600255611f3d565b608083901b6001830160401b8217176002555b50505090565b60008080805b600660ff8216101561208b57601360f81b8560ff831660068110611f6957fe5b1a60f81b6001600160f81b0319161115611f8257612083565b600190920191600160fc1b8560ff831660068110611f9c57fe5b1a60f81b6001600160f81b0319161015611fbb57601e84019350612083565b848160ff1660068110611fca57fe5b1a60f81b6001600160f81b031916601060f81b1415611fee57600584019350612083565b848160ff1660068110611ffd57fe5b1a60f81b6001600160f81b031916601160f81b141561202157600384019350612083565b848160ff166006811061203057fe5b1a60f81b6001600160f81b031916601260f81b141561205457600684019350612083565b848160ff166006811061206357fe5b1a60f81b6001600160f81b031916601360f81b1415612083576006840193505b600101611f49565b5060ff8216600f60088786020204816120a057fe5b0490509250925092565b60008060006120b7611e5d565b6040805160a08101825243815260208082019b8c5260019586018284018181526001600160d01b0319909c16606084019081526001600160a01b039b8c1660808086019182529689016000818152948a905293869020945185559d51978401979097559a516002808401919091559551600390920180549c51909a16600160301b026601000000000000600160d01b031960d09390931c65ffffffffffff19909d169c909c17919091169a909a1790975587901b951b90961793909317909455509092915050565b604080518082019091526000808252602082015290565b604051806040016040528060008152602001600081525090565b6040518060a0016040528060008152602001600081526020016000815260200160006001600160d01b031916815260200160006001600160a01b031681525090565b6032806121ff8339019056fe60806040526040516032380380603283398181016040526020811015602357600080fd5b50516001600160a01b038116fffe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353776170207265717569726573206d6f726520746f6b656e207468656e2077617320616c6c6f7765644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657242657420616d6f756e742073686f756c642062652067726561746572206f7220657175616c207468616e206d696e696d616c20616d6f756e7445786368616e676520726573756c7420697320736d616c6c6572207468656e20726571756573746564a265627a7a72315820b3c8f7b4e828553f9171aed4a05ab58b21ff259c14d6d763e9f8628992b78b7664736f6c63430005110032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008dc74d28b9821f7f9d0e95ab2d3c66f5276ac474000000000000000000000000a6d93468c1f16f2e1009ec321251f0b3147117b300000000000000000000000043386190b78ed35551a104bd374522725b20fe570000000000000000000000009a5423038bade592e3e35ac04c5ff6813dd3e7df000000000000000000000000c0a47dfe034b400b47bdad5fecda2621de6c4d95
-----Decoded View---------------
Arg [0] : jackpot (address): 0x8dc74D28B9821f7f9d0e95AB2D3C66f5276AC474
Arg [1] : house (address): 0xA6D93468C1F16f2e1009eC321251F0B3147117b3
Arg [2] : superprize (address): 0x43386190b78ed35551A104BD374522725B20fE57
Arg [3] : freeSpins (address): 0x9a5423038BAdE592E3E35aC04c5fF6813dd3E7df
Arg [4] : uniswap (address): 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000008dc74d28b9821f7f9d0e95ab2d3c66f5276ac474
Arg [1] : 000000000000000000000000a6d93468c1f16f2e1009ec321251f0b3147117b3
Arg [2] : 00000000000000000000000043386190b78ed35551a104bd374522725b20fe57
Arg [3] : 0000000000000000000000009a5423038bade592e3e35ac04c5ff6813dd3e7df
Arg [4] : 000000000000000000000000c0a47dfe034b400b47bdad5fecda2621de6c4d95
Deployed Bytecode Sourcemap
43499:14108:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44227:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44227:37:0;;;:::i;:::-;;;;-1:-1:-1;;;;;44227:37:0;;;;;;;;;;;;;;55283:73;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55283:73:0;;;:::i;:::-;;;;;;;;;;;;;;;;43966:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43966:26:0;;;:::i;55132:143::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55132:143:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;55132:143:0;;;;;;;;;;;;;;;;;:::i;54700:115::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54700:115:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54700:115:0;-1:-1:-1;;;;;54700:115:0;;:::i;54823:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54823:119:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54823:119:0;-1:-1:-1;;;;;54823:119:0;;:::i;44048:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44048:37:0;;;:::i;54454:107::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54454:107:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54454:107:0;-1:-1:-1;;;;;54454:107:0;;:::i;54569:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54569:119:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54569:119:0;-1:-1:-1;;;;;54569:119:0;;:::i;277:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;277:28:0;;;:::i;54133:313::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54133:313:0;;;:::i;45344:1583::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45344:1583:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;45344:1583:0;;-1:-1:-1;;;;;45344:1583:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45344:1583:0;;:::i;43868:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43868:39:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43868:39:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;43868:39:0;;;;;-1:-1:-1;;;;;43868:39:0;;;;;;;;;;;;;;44181;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44181:39:0;;;:::i;46935:634::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46935:634:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46935:634:0;;;;;;-1:-1:-1;;;;;;46935:634:0;;:::i;48947:5178::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48947:5178:0;;;:::i;54950:174::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54950:174:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54950:174:0;-1:-1:-1;;;;;54950:174:0;;:::i;47577:147::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47577:147:0;-1:-1:-1;;;;;;47577:147:0;;:::i;44092:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44092:35:0;;;:::i;44001:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44001:40:0;;;:::i;44134:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44134:40:0;;;:::i;666:242::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;666:242:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;666:242:0;-1:-1:-1;;;;;666:242:0;;:::i;43914:45::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43914:45:0;;;:::i;44227:37::-;;;-1:-1:-1;;;;;44227:37:0;;:::o;55283:73::-;55324:7;55342:11;:9;:11::i;:::-;55335:18;;55283:73;:::o;43966:26::-;;;;:::o;55132:143::-;592:5;;-1:-1:-1;;;;;592:5:0;578:10;:19;570:64;;;;;-1:-1:-1;;;570:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;570:64:0;;;;;;;;;;;;;;;55236:5;-1:-1:-1;;;;;55236:14:0;;55251:6;55259;55236:30;;;;;;;;;;;;;-1:-1:-1;;;;;55236:30:0;-1:-1:-1;;;;;55236:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55236:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55236:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55236:30:0;55228:39;;;;;;55132:143;;;:::o;54700:115::-;592:5;;-1:-1:-1;;;;;592:5:0;578:10;:19;570:64;;;;;-1:-1:-1;;;570:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;570:64:0;;;;;;;;;;;;;;;54779:16;:28;;-1:-1:-1;;;;;;54779:28:0;-1:-1:-1;;;;;54779:28:0;;;;;;;;;;54700:115::o;54823:119::-;592:5;;-1:-1:-1;;;;;592:5:0;578:10;:19;570:64;;;;;-1:-1:-1;;;570:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;570:64:0;;;;;;;;;;;;;;;54904:17;:30;;-1:-1:-1;;;;;;54904:30:0;-1:-1:-1;;;;;54904:30:0;;;;;;;;;;54823:119::o;44048:37::-;;;-1:-1:-1;;;;;44048:37:0;;:::o;54454:107::-;592:5;;-1:-1:-1;;;;;592:5:0;578:10;:19;570:64;;;;;-1:-1:-1;;;570:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;570:64:0;;;;;;;;;;;;;;;54529:14;:24;;-1:-1:-1;;;;;;54529:24:0;-1:-1:-1;;;;;54529:24:0;;;;;;;;;;54454:107::o;54569:119::-;592:5;;-1:-1:-1;;;;;592:5:0;578:10;:19;570:64;;;;;-1:-1:-1;;;570:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;570:64:0;;;;;;;;;;;;;;;54650:17;:30;;-1:-1:-1;;;;;;54650:30:0;-1:-1:-1;;;;;54650:30:0;;;;;;;;;;54569:119::o;277:28::-;;;-1:-1:-1;;;;;277:28:0;;:::o;54133:313::-;54194:5;;-1:-1:-1;;;;;54194:5:0;54180:10;:19;;:54;;-1:-1:-1;54217:17:0;;-1:-1:-1;;;;;54217:17:0;54203:10;:31;54180:54;54172:63;;;;;;54254:11;:9;:11::i;:::-;:16;54246:51;;;;;-1:-1:-1;;;54246:51:0;;;;;;;;;;;;-1:-1:-1;;;54246:51:0;;;;;;;;;;;;;;;54316:17;;-1:-1:-1;;;;;54316:17:0;54308:70;;;;;-1:-1:-1;;;54308:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54389:17;;:49;;-1:-1:-1;;;;;54389:17:0;;;;54416:21;54389:49;;;;;:17;:49;:17;:49;54416:21;54389:17;:49;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54389:49:0;54133:313::o;45344:1583::-;44663:10;45506:18;:29;;45498:99;;;;-1:-1:-1;;;45498:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45616:26:0;;45608:64;;;;;-1:-1:-1;;;45608:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45705:16;;-1:-1:-1;;;;;45689:32:0;;;45705:16;;45689:32;45685:136;;;45747:41;45764:18;45784:3;45747:16;:41::i;:::-;45803:7;;45685:136;45928:14;;45982:40;;;-1:-1:-1;;;45982:40:0;;-1:-1:-1;;;;;45982:40:0;;;;;;;;;45855:12;;45928:14;;;;;45833:12;;45928:14;;45982:26;;:40;;;;;;;;;;;;;;;45928:14;45982:40;;;5:2:-1;;;;30:1;27;20:12;5:2;45982:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45982:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45982:40:0;;-1:-1:-1;;;;;;46041:29:0;;46033:64;;;;;-1:-1:-1;;;46033:64:0;;;;;;;;;;;;-1:-1:-1;;;46033:64:0;;;;;;;;;;;;;;;46110:24;46154:15;46110:60;;46183:18;46204:7;-1:-1:-1;;;;;46204:32:0;;46237:18;46204:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46204:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46204:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46204:52:0;;-1:-1:-1;46275:31:0;;;;46267:85;;;;-1:-1:-1;;;46267:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46383:27;;;-1:-1:-1;;;46383:27:0;;46399:10;46383:27;;;;;;46365:15;;-1:-1:-1;;;;;46383:15:0;;;;;:27;;;;;;;;;;;;;;;:15;:27;;;5:2:-1;;;;30:1;27;20:12;5:2;46383:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46383:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46383:27:0;;-1:-1:-1;46429:21:0;;;;46421:51;;;;;-1:-1:-1;;;46421:51:0;;;;;;;;;;;;-1:-1:-1;;;46421:51:0;;;;;;;;;;;;;;;46485:57;;;-1:-1:-1;;;46485:57:0;;46504:10;46485:57;;;;46524:4;46485:57;;;;;;;;;;;;-1:-1:-1;;;;;46485:18:0;;;;;:57;;;;;;;;;;;;;;-1:-1:-1;46485:18:0;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;46485:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46485:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;46553:42:0;;;-1:-1:-1;;;46553:42:0;;-1:-1:-1;;;;;46553:42:0;;;;;;;;;;;;;;;:13;;;;;;:42;;;;;46485:57;;46553:42;;;;;;;;-1:-1:-1;46553:13:0;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;46553:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46553:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;46628:74:0;;;-1:-1:-1;;;46628:74:0;;;;;;;;;;;;;;;;;;;;;;46608:17;;-1:-1:-1;;;;;46628:28:0;;;;;:74;;;;;46553:42;;46628:74;;;;;;;;46608:17;46628:28;:74;;;5:2:-1;;;;30:1;27;20:12;5:2;46628:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46628:74:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46628:74:0;;-1:-1:-1;46721:31:0;;;;46713:85;;;;-1:-1:-1;;;46713:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46811:45;46820:10;46832:18;46852:3;46811:8;:45::i;:::-;46874;;;;;;;;;;;;;;;;;;;;;;;;;45344:1583;;;;;;;;;;;;;:::o;43868:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43868:39:0;;-1:-1:-1;;;;;43868:39:0;;:::o;44181:::-;;;-1:-1:-1;;;;;44181:39:0;;:::o;46935:634::-;44663:10;47018:9;:20;;47010:90;;;;-1:-1:-1;;;47010:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47160:16;;47227:21;;;-1:-1:-1;;;47227:21:0;;;;-1:-1:-1;;;;;47160:16:0;;;;47113:29;;47160:16;;47227:19;;:21;;;;;;;;;;;;;;;47160:16;47227:21;;;5:2:-1;;;;30:1;27;20:12;5:2;47227:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47227:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47227:21:0;47285:36;;;-1:-1:-1;;;47285:36:0;;47310:10;47285:36;;;;;;47215:33;;;;-1:-1:-1;47259:23:0;;-1:-1:-1;;;;;47285:24:0;;;;;:36;;;;;47227:21;;47285:36;;;;;;;:24;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;47285:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47285:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47285:36:0;;-1:-1:-1;47342:33:0;;;;47334:63;;;;;-1:-1:-1;;;47334:63:0;;;;;;;;;;;;-1:-1:-1;;;47334:63:0;;;;;;;;;;;;;;;47410:46;;;-1:-1:-1;;;47410:46:0;;47429:10;47410:46;;;;;;;;;;;;-1:-1:-1;;;;;47410:18:0;;;;;:46;;;;;-1:-1:-1;;47410:46:0;;;;;;;-1:-1:-1;47410:18:0;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;47410:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47410:46:0;;;;47467:36;47476:10;47488:9;47499:3;47467:8;:36::i;:::-;47521:40;;;;;;;;;;;;;;;;;;;;;;;;;46935:634;;;;;:::o;48947:5178::-;48989:16;49016:13;49040:12;49089:13;:11;:13::i;:::-;49063:39;;-1:-1:-1;49063:39:0;-1:-1:-1;49063:39:0;-1:-1:-1;49117:12:0;;;49113:38;;;49144:7;;;;;49113:38;49161:9;;49202:11;:9;:11::i;:::-;49185:28;;49242:2;49233:6;:11;:25;;49252:6;49233:25;;;49247:2;49233:25;49224:34;;49269:33;49323:6;49305:25;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;49269:61;;49341:31;49392:6;49375:24;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;49425:11:0;;49341:58;;-1:-1:-1;49465:21:0;:28;;;49506:3922;49516:6;49512:1;:10;49506:3922;;;49548:15;;;;:8;:15;;;;;:27;49579:12;-1:-1:-1;49544:3873:0;;49621:1;49612:10;;49641:5;;49544:3873;49700:14;;:::i;:::-;49717:9;:7;:9::i;:::-;49943:10;;;;49955:7;;;;49745;;;;;49700:26;;-1:-1:-1;49771:19:0;;;;;;49935:28;;49943:10;49935:7;:28::i;:::-;50063:15;;49982:18;;;;;50019:21;;;;49894:69;;-1:-1:-1;49894:69:0;;-1:-1:-1;49894:69:0;-1:-1:-1;;;50081:12:0;:18;-1:-1:-1;50059:3306:0;;;50142:34;;;;;;;;50154:3;:10;;;50142:34;;;;50166:3;:9;;;-1:-1:-1;;;;;50142:34:0;;;;50124:12;50137:1;50124:15;;;;;;;;;;;;;;;;;;:52;;;;50214:10;;;;50226:6;;;;;50234:9;;;;50204:40;;;;;;;;;-1:-1:-1;;;;;50204:40:0;;;;;;;;;;;;;;;;;;50278:3;:10;;;50267:21;;;;50059:3306;;;50384:15;;50354:17;;-1:-1:-1;50374:26:0;50354:17;50522:4;50354:17;50549:2199;50571:14;50567:18;;;;50549:2199;;;50623:7;;;;-1:-1:-1;;;50623:17:0;:10;;;;;;;;;;;;;-1:-1:-1;;;;;50623:17:0;;;50619:141;;;50688:5;50673:20;;50724:8;;50619:141;50786:10;50827:5;;;50823:176;;50901:1;50876:9;50895:1;50891:5;;;;50886:2;:10;50876:21;;;;;;;;;;;;-1:-1:-1;;;;;50876:26:0;;;;50868:34;;50823:176;;;50971:9;50990:1;50986:5;;;;50981:2;:10;50971:21;;;;;;;;;;;;50995:4;50971:28;;;50963:36;;50823:176;51030:7;;;;-1:-1:-1;;;51030:17:0;:10;;;;;;;;;;;;;-1:-1:-1;;;;;51030:17:0;;;51026:447;;;51093:3;:7;;;51101:1;51093:10;;;;;;;;;;;;-1:-1:-1;;;;;51084:19:0;;:5;-1:-1:-1;;;;;51084:19:0;;;51080:246;;;51204:2;51189:17;;;;;51140:14;;;;;51080:246;;;51321:5;51306:20;;51080:246;51357:8;;;51026:447;51468:5;51453:20;;51504:3;:7;;;51512:1;51504:10;;;;;;;;;;;;-1:-1:-1;;;;;51504:18:0;;51518:4;51504:18;;;51500:287;;;-1:-1:-1;;;;;;;;;51559:12:0;;;:28;;;;-1:-1:-1;;;;;;;;;;51575:12:0;;;51559:28;51555:166;;;51688:1;51673:16;;;;;51624:14;;;;;51751:8;;;51500:287;51817:3;:7;;;51825:1;51817:10;;;;;;;;;;;;-1:-1:-1;;;;;51817:18:0;;51831:4;51817:18;;;51813:271;;;-1:-1:-1;;;;;;;;;51872:12:0;;;51868:150;;;51985:1;51970:16;;;;;51921:14;;;;;52048:8;;;51813:271;52114:3;:7;;;52122:1;52114:10;;;;;;;;;;;;-1:-1:-1;;;;;52114:18:0;;52128:4;52114:18;;;52110:295;;;-1:-1:-1;;;;;;;;;52169:12:0;;;:36;;;;-1:-1:-1;;;;52185:12:0;;;:20;52169:36;52165:174;;;52306:1;52291:16;;;;;52242:14;;;;;52369:8;;;52110:295;52435:3;:7;;;52443:1;52435:10;;;;;;;;;;;;-1:-1:-1;;;;;52435:18:0;;52449:4;52435:18;;;52431:294;;;-1:-1:-1;;;;;;;;;52490:12:0;;;:35;;;;-1:-1:-1;;;;52506:12:0;;52486:173;;52626:1;52611:16;;;;;52562:14;;;;;52689:8;;;52431:294;50549:2199;;50587:3;;50549:2199;;;-1:-1:-1;52872:10:0;;;;52787:13;52772:28;;;;52849:20;;52900:14;:28;;;;;52872:24;;;52900:28;52872:57;;;;;52849:80;;52970:36;;;;;;;;52982:12;52970:36;;;;52996:3;:9;;;-1:-1:-1;;;;;52970:36:0;;;;52952:12;52965:1;52952:15;;;;;;;;;;;;;;;;;;:54;;;;53058:6;;;;;53066:9;;;;53034:42;;;;;;;;;;;;-1:-1:-1;;;;;53034:42:0;;;;;;;;;;;;;;;53099:23;;;;;53167:4;53151:20;;;;53147:199;;;53224:7;53200:11;53212:1;53200:14;;;;;;;;;;;;;;:21;;:31;;;;;53278:3;:6;;;53258:11;53270:1;53258:14;;;;;;;;;;;;;;:17;;:26;;;;;53321:1;53311:11;;53147:199;50059:3306;;;;;-1:-1:-1;;;53383:11:0;:18;;;-1:-1:-1;49524:3:0;;;;;49506:3922;;;53449:1;53445:5;;53440:678;53456:6;53452:1;:10;53440:678;;;53513:1;53488:12;53501:1;53488:15;;;;;;;;;;;;;;:22;;;:26;:81;;;;;53519:12;53532:1;53519:15;;;;;;;;;;;;;;:21;;;-1:-1:-1;;;;;53519:26:0;:50;53546:12;53559:1;53546:15;;;;;;;;;;;;;;:22;;;53519:50;;;;;;;;;;;;;;;;;;;;;;;53518:51;53488:81;53484:175;;;53613:12;53626:1;53613:15;;;;;;;;;;;;;;:22;;;53637:12;53650:1;53637:15;;;;;;;;;;;;;;:21;;;53588:71;;;;;:::i;:::-;-1:-1:-1;;;;;53588:71:0;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;53484:175:0;53678:11;53690:1;53678:14;;;;;;;;;;;;;;:17;;;53699:1;53678:22;53674:433;;53737:17;;53771:15;;-1:-1:-1;;;;;53737:17:0;;;;53721:49;;53771:12;;53784:1;;53771:15;;;;;;;;;;;;:21;;;53794:11;53806:1;53794:14;;;;;;;;;;;;;;:17;;;53721:91;;;;;;;;;;;;;-1:-1:-1;;;;;53721:91:0;-1:-1:-1;;;;;53721:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53721:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;53844:14:0;;53874:15;;-1:-1:-1;;;;;53844:14:0;;;;-1:-1:-1;53831:42:0;;-1:-1:-1;53874:12:0;;53887:1;;53874:15;;;;;;;;;;;;:21;;;53831:65;;;;;;;;;;;;;-1:-1:-1;;;;;53831:65:0;-1:-1:-1;;;;;53831:65:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53831:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53831:65:0;;;;53943:1;53919:11;53931:1;53919:14;;;;;;;;;;;;;;:21;;;:25;:79;;;;;53949:12;53962:1;53949:15;;;;;;;;;;;;;;:21;;;-1:-1:-1;;;;;53949:26:0;:49;53976:11;53988:1;53976:14;;;;;;;;;;;;;;:21;;;53949:49;;;;;;;;;;;;;;;;;;;;;;;53948:50;53919:79;53915:176;;;54046:11;54058:1;54046:14;;;;;;;;;;;;;;:21;;;54069:12;54082:1;54069:15;;;;;;;;;;;;;;:21;;;54021:70;;;;;:::i;:::-;-1:-1:-1;;;;;54021:70:0;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;53915:176:0;53464:3;;;;;53440:678;;;48947:5178;;;;;;;;;;:::o;54950:174::-;592:5;;-1:-1:-1;;;;;592:5:0;578:10;:19;570:64;;;;;-1:-1:-1;;;570:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;570:64:0;;;;;;;;;;;;;;;55052:10;-1:-1:-1;;;;;55042:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55042:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55042:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55042:32:0;55031:8;:43;55085:31;;;-1:-1:-1;;;55085:31:0;;;;-1:-1:-1;;;;;55085:29:0;;;;;:31;;;;;;;;;;;;;;;:29;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;55085:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;47577:147:0;47643:9;47656:10;47643:23;47635:32;;;;;;47680:36;47689:10;47701:9;47712:3;47680:8;:36::i;44092:35::-;;;-1:-1:-1;;;;;44092:35:0;;:::o;44001:40::-;;;-1:-1:-1;;;;;44001:40:0;;:::o;44134:::-;;;-1:-1:-1;;;;;44134:40:0;;:::o;666:242::-;592:5;;-1:-1:-1;;;;;592:5:0;578:10;:19;570:64;;;;;-1:-1:-1;;;570:64:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;570:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;755:22:0;;747:73;;;;-1:-1:-1;;;747:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;857:5;;;836:37;;-1:-1:-1;;;;;836:37:0;;;;857:5;;;836:37;;;884:5;:16;;-1:-1:-1;;;;;;884:16:0;-1:-1:-1;;;;;884:16:0;;;;;;;;;;666:242::o;43914:45::-;;;;:::o;56193:219::-;56237:7;56257:16;56284:13;56308:12;56357:13;:11;:13::i;:::-;56388:16;:1;:16;;-1:-1:-1;;;;;56193:219:0;:::o;47732:1207::-;44663:10;47829:6;:17;;47821:87;;;;-1:-1:-1;;;47821:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47921:19;;;44718:7;48068:3;48029:36;;;:42;:54;;48197:19;;;:34;;;48285:23;48197:34;48304:3;48285:7;:23::i;:::-;48244:64;;-1:-1:-1;48244:64:0;-1:-1:-1;48244:64:0;-1:-1:-1;48417:24:0;;;;:10;:24;48329:112;;48339:34;48396:2;:16;;48378:34;;;48392:1;48378:15;;:34;48329:84;;;;;;:112;;48321:121;;;;;;48627:11;;48603:21;:35;48588:11;48581:18;;:4;:18;:58;;;48564:11;48559:2;:16;48541:34;;:11;48555:1;48541:15;:34;44824:2;44776;48508:28;48507:69;48493:11;48487:3;:17;:89;48477:6;:100;:162;;48455:185;;;;;;48653:11;:25;;;;;;48704:41;48713:31;48721:9;48732:3;48737:6;48713:7;:31::i;:::-;48704:41;;;;;;;;;;;;;;;48779:14;;-1:-1:-1;;;;;48779:14:0;48766:43;48816:10;48779:14;48828:15;;;;:39;;48863:3;48828:39;;;48846:6;48828:39;48766:102;;;;;;;;;;;;;-1:-1:-1;;;;;48766:102:0;-1:-1:-1;;;;;48766:102:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48766:102:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48766:102:0;;;;;48890:12;;;;;;;;;-1:-1:-1;;;;;48890:12:0;-1:-1:-1;;;;;48879:30:0;;48916:12;48879:52;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48879:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48879:52:0;;;;;47732:1207;;;;;;;;;:::o;56424:257::-;56539:8;;56551:3;56539:15;;;;56573:53;56624:2;56573:53;;;;;;56644:29;;56424:257::o;55754:427::-;55791:14;;:::i;:::-;55818:16;55845:13;55869:12;55918:13;:11;:13::i;:::-;55892:39;;-1:-1:-1;55892:39:0;-1:-1:-1;55892:39:0;-1:-1:-1;55950:13:0;;;;55942:22;;;;;;55983:15;;;;:8;:15;;;;;;;;;55977:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;55977:21:0;;;;;-1:-1:-1;;;55977:21:0;;-1:-1:-1;;;;;55977:21:0;;;;;;-1:-1:-1;56015:13:0;;;56011:162;;;56072:19;56066:3;56054:15;;;:37;56043:8;:48;56011:162;;;56143:3;56131:15;;;56158:1;56150:9;;56163:2;56150:15;:22;;56131:42;56120:8;:53;56011:162;55754:427;;;;:::o;56693:911::-;56761:19;;;;56832:698;56854:10;56850:14;;;;56832:698;;;-1:-1:-1;;;56890:3:0;:6;;;;;;;;;;;;;-1:-1:-1;;;;;56890:13:0;;;56886:44;;;56922:8;;56886:44;56945:13;;;;;-1:-1:-1;;;56977:3:0;:6;;;;;;;;;;;;;-1:-1:-1;;;;;56977:13:0;;;56973:98;;;57026:2;57011:17;;;;57047:8;;56973:98;57089:3;57093:1;57089:6;;;;;;;;;;;;-1:-1:-1;;;;;57089:14:0;;57099:4;57089:14;;;57085:98;;;57139:1;57124:16;;;;57159:8;;57085:98;57201:3;57205:1;57201:6;;;;;;;;;;;;-1:-1:-1;;;;;57201:14:0;;57211:4;57201:14;;;57197:98;;;57251:1;57236:16;;;;57271:8;;57197:98;57313:3;57317:1;57313:6;;;;;;;;;;;;-1:-1:-1;;;;;57313:14:0;;57323:4;57313:14;;;57309:98;;;57363:1;57348:16;;;;57383:8;;57309:98;57425:3;57429:1;57425:6;;;;;;;;;;;;-1:-1:-1;;;;;57425:14:0;;57435:4;57425:14;;;57421:98;;;57475:1;57460:16;;;;57421:98;56866:3;;56832:698;;;-1:-1:-1;57553:43:0;;;57580:2;57576:1;57553:20;;;:24;:29;:43;;;;;;57540:56;;56693:911;;;;;:::o;55364:382::-;55450:16;55479:13;55503:12;55552:13;:11;:13::i;:::-;55631:47;;;;;;;;55635:12;55631:47;;;;;;;;;55576:6;55593:10;;;55631:47;;;;;;-1:-1:-1;;;;;;55631:47:0;;;;;;;;;-1:-1:-1;;;;;55631:47:0;;;;;;;;;;55576:6;;;-1:-1:-1;55614:14:0;;;;;;;;;;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;55614:64:0;-1:-1:-1;;;;;;55614:64:0;;;;;-1:-1:-1;;55614:64:0;;;;;;;;;;;;;;;;;;55700:15;;;55719:11;;:18;;;55700:38;;;;55689:49;;;-1:-1:-1;55593:10:0;;55364:382;-1:-1:-1;;55364:382:0:o;43499:14108::-;;;;;;;;;;-1:-1:-1;43499:14108:0;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43499:14108:0;;;;;;;-1:-1:-1;;;;;43499:14108:0;;;;;:::o;:::-;;;;;;;;:::o
Swarm Source
bzzr://b3c8f7b4e828553f9171aed4a05ab58b21ff259c14d6d763e9f8628992b78b76
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
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.