Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 16,945 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
End Game | 18031313 | 483 days ago | IN | 0 ETH | 0.00135017 | ||||
New Game | 18031312 | 483 days ago | IN | 0 ETH | 0.00286441 | ||||
End Game | 18031150 | 483 days ago | IN | 0 ETH | 0.00167707 | ||||
New Game | 18031147 | 483 days ago | IN | 0 ETH | 0.00355314 | ||||
End Game | 18031133 | 483 days ago | IN | 0 ETH | 0.0013903 | ||||
New Game | 18031132 | 483 days ago | IN | 0 ETH | 0.00265789 | ||||
End Game | 18031122 | 483 days ago | IN | 0 ETH | 0.00138833 | ||||
New Game | 18031119 | 483 days ago | IN | 0 ETH | 0.00260963 | ||||
End Game | 18031109 | 483 days ago | IN | 0 ETH | 0.00147177 | ||||
New Game | 18031107 | 483 days ago | IN | 0 ETH | 0.00272641 | ||||
End Game | 18030089 | 483 days ago | IN | 0 ETH | 0.0023637 | ||||
New Game | 18030087 | 483 days ago | IN | 0 ETH | 0.00406141 | ||||
End Game | 18030081 | 483 days ago | IN | 0 ETH | 0.00250555 | ||||
New Game | 18030078 | 483 days ago | IN | 0 ETH | 0.00474996 | ||||
End Game | 18030069 | 483 days ago | IN | 0 ETH | 0.00262431 | ||||
New Game | 18030067 | 483 days ago | IN | 0 ETH | 0.00449093 | ||||
End Game | 18030061 | 483 days ago | IN | 0 ETH | 0.00268424 | ||||
New Game | 18030059 | 483 days ago | IN | 0 ETH | 0.00483813 | ||||
End Game | 18030055 | 483 days ago | IN | 0 ETH | 0.00244721 | ||||
New Game | 18030053 | 483 days ago | IN | 0 ETH | 0.00438602 | ||||
End Game | 18030034 | 483 days ago | IN | 0 ETH | 0.00329111 | ||||
New Game | 18030031 | 483 days ago | IN | 0 ETH | 0.00526275 | ||||
End Game | 18030015 | 483 days ago | IN | 0 ETH | 0.00324849 | ||||
New Game | 18030013 | 483 days ago | IN | 0 ETH | 0.01227864 | ||||
End Game | 18029997 | 483 days ago | IN | 0 ETH | 0.00325204 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TelegramRussianRoulette
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-08-02 */ /* Bullet Game - Play Russian Roulette directly in Telegram ,___________________________________________/7_ |-_______------. `\ | _,/ | _______) |___\____________________________| .__/`(( | _______ | (/))_______________=. `~) \ | _______) | /----------------_/ `__y|______________| / / ________ __________/ / /#####\( \ / )) / /#######|\ \( // / /########|.\______ad/` / /###(\)###||`------`` / /##########|| / /###########|| ( (############|| \ \####(/)####)) \ \#########// \ \#######// `---|_|--` ((_)) `-` Telegram: https://t.me/BulletGameDarkPortal Twitter/X: https://twitter.com/BulletGameERC Docs: https://bullet-game.gitbook.io/bullet-game */ // SPDX-License-Identifier: MIT pragma solidity 0.8.19; // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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 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. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); } /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } /** * @title BulletGame * @dev Betting token for Bullet Game */ contract BulletGame is Ownable, ERC20 { IUniswapV2Router02 public router; IUniswapV2Factory public factory; IUniswapV2Pair public pair; uint private constant INITIAL_SUPPLY = 10_000_000 * 10**8; // Percent of the initial supply that will go to the LP uint constant LP_BPS = 9000; // Percent of the initial supply that will go to marketing uint constant MARKETING_BPS = 10_000 - LP_BPS; // // The tax to deduct, in basis points // uint public buyTaxBps = 500; uint public sellTaxBps = 500; // bool isSellingCollectedTaxes; event AntiBotEngaged(); event AntiBotDisengaged(); event StealthLaunchEngaged(); address public rouletteContract; bool public isLaunched; address public myWallet; address public marketingWallet; address public revenueWallet; bool public engagedOnce; bool public disengagedOnce; constructor() ERC20("Bullet Game Betting Token", "BULLET", 8) { if (isGoerli()) { router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); } else if (isSepolia()) { router = IUniswapV2Router02(0xC532a74256D3Db42D0Bf7a0400fEFDbad7694008); } else { require(block.chainid == 1, "expected mainnet"); router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); } factory = IUniswapV2Factory(router.factory()); // Approve infinite spending by DEX, to sell tokens collected via tax. allowance[address(this)][address(router)] = type(uint).max; emit Approval(address(this), address(router), type(uint).max); isLaunched = false; } modifier lockTheSwap() { isSellingCollectedTaxes = true; _; isSellingCollectedTaxes = false; } modifier onlyTestnet() { require(isTestnet(), "not testnet"); _; } receive() external payable {} fallback() external payable {} function burn(uint amount) external { _burn(msg.sender, amount); } /** * @dev Allow minting on testnet so I don't have to deal with * buying from Uniswap. * @param amount the number of tokens to mint */ function mint(uint amount) external onlyTestnet { _mint(address(msg.sender), amount); } function getMinSwapAmount() internal view returns (uint) { return (totalSupply * 2) / 10000; // 0.02% } function isGoerli() public view returns (bool) { return block.chainid == 5; } function isSepolia() public view returns (bool) { return block.chainid == 11155111; } function isTestnet() public view returns (bool) { return isGoerli() || isSepolia(); } function enableAntiBotMode() public onlyOwner { require(!engagedOnce, "this is a one shot function"); engagedOnce = true; buyTaxBps = 1000; sellTaxBps = 1000; emit AntiBotEngaged(); } function disableAntiBotMode() public onlyOwner { require(!disengagedOnce, "this is a one shot function"); disengagedOnce = true; buyTaxBps = 500; sellTaxBps = 500; emit AntiBotDisengaged(); } /** * @dev Does the same thing as a max approve for the roulette * contract, but takes as input a secret that the bot uses to * verify ownership by a Telegram user. * @param secret The secret that the bot is expecting. * @return true */ function connectAndApprove(uint32 secret) external returns (bool) { address pwner = _msgSender(); allowance[pwner][rouletteContract] = type(uint).max; emit Approval(pwner, rouletteContract, type(uint).max); return true; } function setRouletteContract(address a) public onlyOwner { require(a != address(0), "null address"); rouletteContract = a; } function setMyWallet(address wallet) public onlyOwner { require(wallet != address(0), "null address"); myWallet = wallet; } function setMarketingWallet(address wallet) public onlyOwner { require(wallet != address(0), "null address"); marketingWallet = wallet; } function setRevenueWallet(address wallet) public onlyOwner { require(wallet != address(0), "null address"); revenueWallet = wallet; } function stealthLaunch() external payable onlyOwner { require(!isLaunched, "already launched"); require(myWallet != address(0), "null address"); require(marketingWallet != address(0), "null address"); require(revenueWallet != address(0), "null address"); require(rouletteContract != address(0), "null address"); isLaunched = true; _mint(address(this), INITIAL_SUPPLY * LP_BPS / 10_000); router.addLiquidityETH{ value: msg.value }( address(this), balanceOf[address(this)], 0, 0, owner(), block.timestamp); pair = IUniswapV2Pair(factory.getPair(address(this), router.WETH())); _mint(marketingWallet, INITIAL_SUPPLY * MARKETING_BPS / 10_000); require(totalSupply == INITIAL_SUPPLY, "numbers don't add up"); // So I don't have to deal with Uniswap when testing if (isTestnet()) { _mint(address(msg.sender), 10_000 * 10**decimals); } emit StealthLaunchEngaged(); } /** * @dev Calculate the amount of tax to apply to a transaction. * @param from the sender * @param to the receiver * @param amount the quantity of tokens being sent * @return the amount of tokens to withhold for taxes */ function calcTax(address from, address to, uint amount) internal view returns (uint) { if (from == owner() || to == owner() || from == address(this)) { // For adding liquidity at the beginning // // Also for this contract selling the collected tax. return 0; } else if (from == address(pair)) { // Buy from DEX, or adding liquidity. return amount * buyTaxBps / 10_000; } else if (to == address(pair)) { // Sell from DEX, or removing liquidity. return amount * sellTaxBps / 10_000; } else { // Sending to other wallets (e.g. OTC) is tax-free. return 0; } } /** * @dev Sell the balance accumulated from taxes. */ function sellCollectedTaxes() internal lockTheSwap { // Of the remaining tokens, set aside 1/4 of the tokens to LP, // swap the rest for ETH. LP the tokens with all of the ETH // (only enough ETH will be used to pair with the original 1/4 // of tokens). Send the remaining ETH (about half the original // balance) to my wallet. uint tokensForLiq = balanceOf[address(this)] / 4; uint tokensToSwap = balanceOf[address(this)] - tokensForLiq; // Sell address[] memory path = new address[](2); path[0] = address(this); path[1] = router.WETH(); router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokensToSwap, 0, path, address(this), block.timestamp ); router.addLiquidityETH{ value: address(this).balance }( address(this), tokensForLiq, 0, 0, owner(), block.timestamp); myWallet.call{value: address(this).balance}(""); } /** * @dev Transfer tokens from the caller to another address. * @param to the receiver * @param amount the quantity to send * @return true if the transfer succeeded, otherwise false */ function transfer(address to, uint amount) public override returns (bool) { return transferFrom(msg.sender, to, amount); } /** * @dev Transfer tokens from one address to another. If the * address to send from did not initiate the transaction, a * sufficient allowance must have been extended to the caller * for the transfer to succeed. * @param from the sender * @param to the receiver * @param amount the quantity to send * @return true if the transfer succeeded, otherwise false */ function transferFrom( address from, address to, uint amount ) public override returns (bool) { if (from != msg.sender) { // This is a typical transferFrom uint allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint).max) allowance[from][msg.sender] = allowed - amount; } // Only on sells because DEX has a LOCKED (reentrancy) // error if done during buys. // // isSellingCollectedTaxes prevents an infinite loop. if (balanceOf[address(this)] > getMinSwapAmount() && !isSellingCollectedTaxes && from != address(pair) && from != address(this)) { sellCollectedTaxes(); } uint tax = calcTax(from, to, amount); uint afterTaxAmount = amount - tax; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint value. unchecked { balanceOf[to] += afterTaxAmount; } emit Transfer(from, to, afterTaxAmount); if (tax > 0) { // Use 1/5 of tax for revenue uint revenue = tax / 5; tax -= revenue; unchecked { balanceOf[address(this)] += tax; balanceOf[revenueWallet] += revenue; } // Any transfer to the contract can be viewed as tax emit Transfer(from, address(this), tax); emit Transfer(from, revenueWallet, revenue); } return true; } } /** * @title TelegramRussianRoulette * @dev Store funds for Russian Roulette and distribute the winnings as games finish. */ contract TelegramRussianRoulette is Ownable { address public revenueWallet; BulletGame public immutable bettingToken; uint256 public immutable minimumBet; // The amount to take as revenue, in basis points. uint256 public immutable revenueBps; // The amount to burn forever, in basis points. uint256 public immutable burnBps; // Map Telegram chat IDs to their games. mapping(int64 => Game) public games; // The Telegram chat IDs for each active game. Mainly used to // abort all active games in the event of a catastrophe. int64[] public activeTgGroups; // Stores the amount each player has bet for a game. event Bet(int64 tgChatId, address player, uint16 playerIndex, uint256 amount); // Stores the amount each player wins for a game. event Win(int64 tgChatId, address player, uint16 playerIndex, uint256 amount); // Stores the amount the loser lost. event Loss(int64 tgChatId, address player, uint16 playerIndex, uint256 amount); // Stores the amount collected by the protocol. event Revenue(int64 tgChatId, uint256 amount); // Stores the amount burned by the protocol. event Burn(int64 tgChatId, uint256 amount); constructor(address payable _bettingToken, uint256 _minimumBet, uint256 _revenueBps, uint256 _burnBps, address _revenueWallet) { revenueWallet = _revenueWallet; revenueBps = _revenueBps; burnBps = _burnBps; bettingToken = BulletGame(_bettingToken); minimumBet = _minimumBet; } struct Game { uint256 revolverSize; uint256 minBet; // This is a SHA-256 hash of the random number generated by the bot. bytes32 hashedBulletChamberIndex; address[] players; uint256[] bets; bool inProgress; uint16 loser; } /** * @dev Check if there is a game in progress for a Telegram group. * @param _tgChatId Telegram group to check * @return true if there is a game in progress, otherwise false */ function isGameInProgress(int64 _tgChatId) public view returns (bool) { return games[_tgChatId].inProgress; } /** * @dev Remove a Telegram chat ID from the array. * @param _tgChatId Telegram chat ID to remove */ function removeTgId(int64 _tgChatId) internal { for (uint256 i = 0; i < activeTgGroups.length; i++) { if (activeTgGroups[i] == _tgChatId) { activeTgGroups[i] = activeTgGroups[activeTgGroups.length - 1]; activeTgGroups.pop(); } } } /** * @dev Create a new game. Transfer funds into escrow. * @param _tgChatId Telegram group of this game * @param _revolverSize number of chambers in the revolver * @param _minBet minimum bet to play * @param _hashedBulletChamberIndex which chamber the bullet is in * @param _players participating players * @param _bets each player's bet * @return The updated list of bets. */ function newGame( int64 _tgChatId, uint256 _revolverSize, uint256 _minBet, bytes32 _hashedBulletChamberIndex, address[] memory _players, uint256[] memory _bets) public onlyOwner returns (uint256[] memory) { require(_revolverSize >= 2, "Revolver size too small"); require(_players.length <= _revolverSize, "Too many players for this size revolver"); require(_minBet >= minimumBet, "Minimum bet too small"); require(_players.length == _bets.length, "Players/bets length mismatch"); require(_players.length > 1, "Not enough players"); require(!isGameInProgress(_tgChatId), "There is already a game in progress"); // The bets will be capped so you can only lose what other // players bet. The updated bets will be returned to the // caller. // // O(N) by doing a prepass to sum all the bets in the // array. Use the sum to modify one bet at a time. Replace // each bet with its updated value. uint256 betTotal = 0; for (uint16 i = 0; i < _bets.length; i++) { require(_bets[i] >= _minBet, "Bet is smaller than the minimum"); betTotal += _bets[i]; } for (uint16 i = 0; i < _bets.length; i++) { betTotal -= _bets[i]; if (_bets[i] > betTotal) { _bets[i] = betTotal; } betTotal += _bets[i]; require(bettingToken.allowance(_players[i], address(this)) >= _bets[i], "Not enough allowance"); bool isSent = bettingToken.transferFrom(_players[i], address(this), _bets[i]); require(isSent, "Funds transfer failed"); emit Bet(_tgChatId, _players[i], i, _bets[i]); } Game memory g; g.revolverSize = _revolverSize; g.minBet = _minBet; g.hashedBulletChamberIndex = _hashedBulletChamberIndex; g.players = _players; g.bets = _bets; g.inProgress = true; games[_tgChatId] = g; activeTgGroups.push(_tgChatId); return _bets; } /** * @dev Declare a loser of the game and pay out the winnings. * @param _tgChatId Telegram group of this game * @param _loser index of the loser * * There is also a string array that will be passed in by the bot * containing labeled strings, for historical/auditing purposes: * * beta: The randomly generated number in hex. * * salt: The salt to append to beta for hashing, in hex. * * publickey: The VRF public key in hex. * * proof: The generated proof in hex. * * alpha: The input message to the VRF. */ function endGame( int64 _tgChatId, uint16 _loser, string[] calldata) public onlyOwner { require(_loser != type(uint16).max, "Loser index shouldn't be the sentinel value"); require(isGameInProgress(_tgChatId), "No game in progress for this Telegram chat ID"); Game storage g = games[_tgChatId]; require(_loser < g.players.length, "Loser index out of range"); require(g.players.length > 1, "Not enough players"); g.loser = _loser; g.inProgress = false; removeTgId(_tgChatId); // Parallel arrays address[] memory winners = new address[](g.players.length - 1); uint16[] memory winnersPlayerIndex = new uint16[](g.players.length - 1); // The total bets of the winners. uint256 winningBetTotal = 0; // Filter out the loser and calc the total winning bets. { uint16 numWinners = 0; for (uint16 i = 0; i < g.players.length; i++) { if (i != _loser) { winners[numWinners] = g.players[i]; winnersPlayerIndex[numWinners] = i; winningBetTotal += g.bets[i]; numWinners++; } } } uint256 totalPaidWinnings = 0; require(burnBps + revenueBps < 10_1000, "Total fees must be < 100%"); // The share of tokens to burn. uint256 burnShare = g.bets[_loser] * burnBps / 10_000; // The share left for the contract. This is an approximate // value. The real value will be whatever is leftover after // each winner is paid their share. uint256 approxRevenueShare = g.bets[_loser] * revenueBps / 10_000; bool isSent; { uint256 totalWinnings = g.bets[_loser] - burnShare - approxRevenueShare; for (uint16 i = 0; i < winners.length; i++) { uint256 winnings = totalWinnings * g.bets[winnersPlayerIndex[i]] / winningBetTotal; isSent = bettingToken.transfer(winners[i], g.bets[winnersPlayerIndex[i]] + winnings); require(isSent, "Funds transfer failed"); emit Win(_tgChatId, winners[i], winnersPlayerIndex[i], winnings); totalPaidWinnings += winnings; } } bettingToken.burn(burnShare); emit Burn(_tgChatId, burnShare); uint256 realRevenueShare = g.bets[_loser] - totalPaidWinnings - burnShare; isSent = bettingToken.transfer(revenueWallet, realRevenueShare); require(isSent, "Revenue transfer failed"); emit Revenue(_tgChatId, realRevenueShare); require((totalPaidWinnings + burnShare + realRevenueShare) == g.bets[_loser], "Calculated winnings do not add up"); } /** * @dev Abort a game and refund the bets. Use in emergencies * e.g. bot crash. * @param _tgChatId Telegram group of this game */ function abortGame(int64 _tgChatId) public onlyOwner { require(isGameInProgress(_tgChatId), "No game in progress for this Telegram chat ID"); Game storage g = games[_tgChatId]; for (uint16 i = 0; i < g.players.length; i++) { bool isSent = bettingToken.transfer(g.players[i], g.bets[i]); require(isSent, "Funds transfer failed"); } g.inProgress = false; removeTgId(_tgChatId); } /** * @dev Abort all in progress games. */ function abortAllGames() public onlyOwner { // abortGame modifies activeTgGroups with each call, so // iterate over a copy int64[] memory _activeTgGroups = activeTgGroups; for (uint256 i = 0; i < _activeTgGroups.length; i++) { abortGame(_activeTgGroups[i]); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address payable","name":"_bettingToken","type":"address"},{"internalType":"uint256","name":"_minimumBet","type":"uint256"},{"internalType":"uint256","name":"_revenueBps","type":"uint256"},{"internalType":"uint256","name":"_burnBps","type":"uint256"},{"internalType":"address","name":"_revenueWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int64","name":"tgChatId","type":"int64"},{"indexed":false,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint16","name":"playerIndex","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Bet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int64","name":"tgChatId","type":"int64"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int64","name":"tgChatId","type":"int64"},{"indexed":false,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint16","name":"playerIndex","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Loss","type":"event"},{"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":"int64","name":"tgChatId","type":"int64"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Revenue","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int64","name":"tgChatId","type":"int64"},{"indexed":false,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint16","name":"playerIndex","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Win","type":"event"},{"inputs":[],"name":"abortAllGames","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int64","name":"_tgChatId","type":"int64"}],"name":"abortGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"activeTgGroups","outputs":[{"internalType":"int64","name":"","type":"int64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bettingToken","outputs":[{"internalType":"contract BulletGame","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int64","name":"_tgChatId","type":"int64"},{"internalType":"uint16","name":"_loser","type":"uint16"},{"internalType":"string[]","name":"","type":"string[]"}],"name":"endGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int64","name":"","type":"int64"}],"name":"games","outputs":[{"internalType":"uint256","name":"revolverSize","type":"uint256"},{"internalType":"uint256","name":"minBet","type":"uint256"},{"internalType":"bytes32","name":"hashedBulletChamberIndex","type":"bytes32"},{"internalType":"bool","name":"inProgress","type":"bool"},{"internalType":"uint16","name":"loser","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int64","name":"_tgChatId","type":"int64"}],"name":"isGameInProgress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumBet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int64","name":"_tgChatId","type":"int64"},{"internalType":"uint256","name":"_revolverSize","type":"uint256"},{"internalType":"uint256","name":"_minBet","type":"uint256"},{"internalType":"bytes32","name":"_hashedBulletChamberIndex","type":"bytes32"},{"internalType":"address[]","name":"_players","type":"address[]"},{"internalType":"uint256[]","name":"_bets","type":"uint256[]"}],"name":"newGame","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revenueBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revenueWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101006040523480156200001257600080fd5b506040516200286c3803806200286c8339810160408190526200003591620000de565b620000403362000075565b600180546001600160a01b0319166001600160a01b0392831617905560c09290925260e0529190911660805260a0526200013b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620000db57600080fd5b50565b600080600080600060a08688031215620000f757600080fd5b85516200010481620000c5565b8095505060208601519350604086015192506060860151915060808601516200012d81620000c5565b809150509295509295909350565b60805160a05160c05160e0516126ab620001c160003960008181610170015281816108f40152610986015260008181610327015281816108d301526109e6015260008181610221015261147f01526000818160ff01528181610aeb01528181610d8901528181610ecf015281816111950152818161182e015261198801526126ab6000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80638da5cb5b11610097578063d057fc1f11610066578063d057fc1f14610276578063f2fde38b1461029c578063f3619716146102af578063ff08aa491461032257600080fd5b80638da5cb5b146101fe578063c38a8afd1461021c578063cb99e91f14610243578063ceb7ec041461025657600080fd5b806363c42460116100d357806363c42460146101a057806365816731146101d9578063715018a6146101e357806388b7904d146101eb57600080fd5b806343425e88146100fa578063444784251461014b57806353deb3d61461016b575b600080fd5b6101217f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6001546101219073ffffffffffffffffffffffffffffffffffffffff1681565b6101927f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610142565b6101c96101ae366004612183565b60070b60009081526002602052604090206005015460ff1690565b6040519015158152602001610142565b6101e1610349565b005b6101e161040d565b6101e16101f93660046121a5565b610421565b60005473ffffffffffffffffffffffffffffffffffffffff16610121565b6101927f000000000000000000000000000000000000000000000000000000000000000081565b6101e1610251366004612183565b6110b9565b610269610264366004612370565b611377565b604051610142919061245e565b6102896102843660046124a2565b611d5c565b60405160079190910b8152602001610142565b6101e16102aa3660046124bb565b611d93565b6102f46102bd366004612183565b600260208190526000918252604090912080546001820154928201546005909201549092919060ff811690610100900461ffff1685565b604080519586526020860194909452928401919091521515606083015261ffff16608082015260a001610142565b6101927f000000000000000000000000000000000000000000000000000000000000000081565b610351611e4a565b600060038054806020026020016040519081016040528092919081815260200182805480156103c257602002820191906000526020600020906000905b825461010083900a900460070b81526020600f830181900493840193600103600890930192909202910180841161038e5790505b5050505050905060005b8151811015610409576103f78282815181106103ea576103ea6124d6565b60200260200101516110b9565b8061040181612534565b9150506103cc565b5050565b610415611e4a565b61041f6000611ecb565b565b610429611e4a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000161ffff8416016104e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4c6f73657220696e6465782073686f756c646e2774206265207468652073656e60448201527f74696e656c2076616c756500000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105008460070b60009081526002602052604090206005015460ff1690565b61058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e6f2067616d6520696e2070726f677265737320666f7220746869732054656c60448201527f656772616d20636861742049440000000000000000000000000000000000000060648201526084016104d8565b600784900b6000908152600260205260409020600381015461ffff851610610610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4c6f73657220696e646578206f7574206f662072616e6765000000000000000060448201526064016104d8565b600381015460011061067e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f7420656e6f75676820706c6179657273000000000000000000000000000060448201526064016104d8565b6005810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001661010061ffff8716027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00161790556106dd85611f40565b60038101546000906106f19060019061256c565b67ffffffffffffffff8111156107095761070961223f565b604051908082528060200260200182016040528015610732578160200160208202803683370190505b50600383015490915060009061074a9060019061256c565b67ffffffffffffffff8111156107625761076261223f565b60405190808252806020026020018201604052801561078b578160200160208202803683370190505b50905060008060005b600386015461ffff821610156108c5578861ffff168161ffff16146108b357856003018161ffff16815481106107cc576107cc6124d6565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16858361ffff168151811061080d5761080d6124d6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080848361ffff168151811061085e5761085e6124d6565b602002602001019061ffff16908161ffff1681525050856004018161ffff168154811061088d5761088d6124d6565b9060005260206000200154836108a39190612585565b9250816108af81612598565b9250505b806108bd81612598565b915050610794565b506000905062018a886109187f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612585565b1061097f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f546f74616c2066656573206d757374206265203c20313030250000000000000060448201526064016104d8565b60006127107f0000000000000000000000000000000000000000000000000000000000000000876004018b61ffff16815481106109be576109be6124d6565b90600052602060002001546109d391906125b9565b6109dd91906125d0565b905060006127107f0000000000000000000000000000000000000000000000000000000000000000886004018c61ffff1681548110610a1e57610a1e6124d6565b9060005260206000200154610a3391906125b9565b610a3d91906125d0565b905060008082848a6004018e61ffff1681548110610a5d57610a5d6124d6565b9060005260206000200154610a72919061256c565b610a7c919061256c565b905060005b88518161ffff161015610d58576000878b6004018a8461ffff1681518110610aab57610aab6124d6565b602002602001015161ffff1681548110610ac757610ac76124d6565b906000526020600020015484610add91906125b9565b610ae791906125d0565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8b8461ffff1681518110610b3b57610b3b6124d6565b6020026020010151838e6004018d8761ffff1681518110610b5e57610b5e6124d6565b602002602001015161ffff1681548110610b7a57610b7a6124d6565b9060005260206000200154610b8f9190612585565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af1158015610bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c23919061260b565b935083610c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f46756e6473207472616e73666572206661696c6564000000000000000000000060448201526064016104d8565b7f6b5ed972057bb3f9c6b7b2ea6350bf7abde0e0c5f8a765c5dde8402bb2b6efd38f8b8461ffff1681518110610cc457610cc46124d6565b60200260200101518b8561ffff1681518110610ce257610ce26124d6565b602002602001015184604051610d30949392919060079490940b845273ffffffffffffffffffffffffffffffffffffffff92909216602084015261ffff166040830152606082015260800190565b60405180910390a1610d428188612585565b9650508080610d5090612598565b915050610a81565b50506040517f42966c68000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906342966c6890602401600060405180830381600087803b158015610de257600080fd5b505af1158015610df6573d6000803e3d6000fd5b505050507fbc03807cbae975b0551ce6caa7b86a1ff549b347e16440847a8c03140f59c27c8c84604051610e3992919060079290920b8252602082015260400190565b60405180910390a1600083858a6004018e61ffff1681548110610e5e57610e5e6124d6565b9060005260206000200154610e73919061256c565b610e7d919061256c565b6001546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152602481018390529192507f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015610f18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3c919061260b565b915081610fa5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f526576656e7565207472616e73666572206661696c656400000000000000000060448201526064016104d8565b6040805160078f900b8152602081018390527f0f771b5d5a6b02378d0d1a6b6b371ac1e69759fb677e46109ae1bb55167ea7ad910160405180910390a1886004018c61ffff1681548110610ffb57610ffb6124d6565b90600052602060002001548185876110139190612585565b61101d9190612585565b146110aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f43616c63756c617465642077696e6e696e677320646f206e6f7420616464207560448201527f700000000000000000000000000000000000000000000000000000000000000060648201526084016104d8565b50505050505050505050505050565b6110c1611e4a565b6110e08160070b60009081526002602052604090206005015460ff1690565b61116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e6f2067616d6520696e2070726f677265737320666f7220746869732054656c60448201527f656772616d20636861742049440000000000000000000000000000000000000060648201526084016104d8565b600781900b6000908152600260205260408120905b600382015461ffff821610156113435760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb846003018461ffff16815481106111e8576111e86124d6565b60009182526020909120015460048601805473ffffffffffffffffffffffffffffffffffffffff9092169161ffff8716908110611227576112276124d6565b6000918252602090912001546040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af11580156112a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c7919061260b565b905080611330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f46756e6473207472616e73666572206661696c6564000000000000000000000060448201526064016104d8565b508061133b81612598565b915050611181565b506005810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905561040982611f40565b6060611381611e4a565b60028610156113ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5265766f6c7665722073697a6520746f6f20736d616c6c00000000000000000060448201526064016104d8565b858351111561147d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6f206d616e7920706c617965727320666f7220746869732073697a65207260448201527f65766f6c7665720000000000000000000000000000000000000000000000000060648201526084016104d8565b7f0000000000000000000000000000000000000000000000000000000000000000851015611507576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d696e696d756d2062657420746f6f20736d616c6c000000000000000000000060448201526064016104d8565b8151835114611572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f506c61796572732f62657473206c656e677468206d69736d617463680000000060448201526064016104d8565b60018351116115dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f7420656e6f75676820706c6179657273000000000000000000000000000060448201526064016104d8565b6115fc8760070b60009081526002602052604090206005015460ff1690565b15611689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f546865726520697320616c726561647920612067616d6520696e2070726f677260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016104d8565b6000805b83518161ffff16101561175e5786848261ffff16815181106116b1576116b16124d6565b60200260200101511015611721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f42657420697320736d616c6c6572207468616e20746865206d696e696d756d0060448201526064016104d8565b838161ffff1681518110611737576117376124d6565b60200260200101518261174a9190612585565b91508061175681612598565b91505061168d565b5060005b83518161ffff161015611bc757838161ffff1681518110611785576117856124d6565b602002602001015182611798919061256c565b915081848261ffff16815181106117b1576117b16124d6565b602002602001015111156117e35781848261ffff16815181106117d6576117d66124d6565b6020026020010181815250505b838161ffff16815181106117f9576117f96124d6565b60200260200101518261180c9190612585565b9150838161ffff1681518110611824576118246124d6565b60200260200101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e878461ffff168151811061187e5761187e6124d6565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152306024820152604401602060405180830381865afa1580156118f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191c919061262d565b1015611984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f7420656e6f75676820616c6c6f77616e636500000000000000000000000060448201526064016104d8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd878461ffff16815181106119d8576119d86124d6565b602002602001015130888661ffff16815181106119f7576119f76124d6565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff938416600482015292909116602483015260448201526064016020604051808303816000875af1158015611a7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9f919061260b565b905080611b08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f46756e6473207472616e73666572206661696c6564000000000000000000000060448201526064016104d8565b7f4ca2b6f8214bfec8b3a7c06707618645a8e77d171b22a4eba1d8811fdc30bfdb8a878461ffff1681518110611b4057611b406124d6565b602002602001015184888661ffff1681518110611b5f57611b5f6124d6565b6020026020010151604051611bac949392919060079490940b845273ffffffffffffffffffffffffffffffffffffffff92909216602084015261ffff166040830152606082015260800190565b60405180910390a15080611bbf81612598565b915050611762565b506040805160e0810182526000808252602082018190529181018290526060808201819052608082015260a0810182905260c0810191909152878152602080820188815260408084018981526060850189815260808601899052600160a0870181905260078f900b60009081526002808852949020875181559451908501559051918301919091555180518493611c65926003850192910190612092565b5060808201518051611c8191600484019160209091019061211c565b5060a0820151600591909101805460c0909301517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000009093169115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff169190911761010061ffff90931683021790556003805460018101825560008290527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b600482040180549190921660080290920a67ffffffffffffffff818102199093169b909216919091029990991790985550909695505050505050565b60038181548110611d6c57600080fd5b9060005260206000209060049182820401919006600802915054906101000a900460070b81565b611d9b611e4a565b73ffffffffffffffffffffffffffffffffffffffff8116611e3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104d8565b611e4781611ecb565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461041f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104d8565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005b600354811015610409578160070b60038281548110611f6457611f646124d6565b6000918252602090912060048204015460039091166008026101000a900460070b036120805760038054611f9a9060019061256c565b81548110611faa57611faa6124d6565b90600052602060002090600491828204019190066008029054906101000a900460070b60038281548110611fe057611fe06124d6565b90600052602060002090600491828204019190066008026101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550600380548061202f5761202f612646565b60008281526020902060047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191820401805467ffffffffffffffff600860038516026101000a021916905590555b8061208a81612534565b915050611f43565b82805482825590600052602060002090810192821561210c579160200282015b8281111561210c57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906120b2565b50612118929150612157565b5090565b82805482825590600052602060002090810192821561210c579160200282015b8281111561210c57825182559160200191906001019061213c565b5b808211156121185760008155600101612158565b8035600781900b811461217e57600080fd5b919050565b60006020828403121561219557600080fd5b61219e8261216c565b9392505050565b600080600080606085870312156121bb57600080fd5b6121c48561216c565b9350602085013561ffff811681146121db57600080fd5b9250604085013567ffffffffffffffff808211156121f857600080fd5b818701915087601f83011261220c57600080fd5b81358181111561221b57600080fd5b8860208260051b850101111561223057600080fd5b95989497505060200194505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156122b5576122b561223f565b604052919050565b600067ffffffffffffffff8211156122d7576122d761223f565b5060051b60200190565b803573ffffffffffffffffffffffffffffffffffffffff8116811461217e57600080fd5b600082601f83011261231657600080fd5b8135602061232b612326836122bd565b61226e565b82815260059290921b8401810191818101908684111561234a57600080fd5b8286015b84811015612365578035835291830191830161234e565b509695505050505050565b60008060008060008060c0878903121561238957600080fd5b6123928761216c565b955060208088013595506040880135945060608801359350608088013567ffffffffffffffff808211156123c557600080fd5b818a0191508a601f8301126123d957600080fd5b81356123e7612326826122bd565b81815260059190911b8301840190848101908d83111561240657600080fd5b938501935b8285101561242b5761241c856122e1565b8252938501939085019061240b565b9650505060a08a013592508083111561244357600080fd5b505061245189828a01612305565b9150509295509295509295565b6020808252825182820181905260009190848201906040850190845b818110156124965783518352928401929184019160010161247a565b50909695505050505050565b6000602082840312156124b457600080fd5b5035919050565b6000602082840312156124cd57600080fd5b61219e826122e1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361256557612565612505565b5060010190565b8181038181111561257f5761257f612505565b92915050565b8082018082111561257f5761257f612505565b600061ffff8083168181036125af576125af612505565b6001019392505050565b808202811582820484141761257f5761257f612505565b600082612606577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561261d57600080fd5b8151801515811461219e57600080fd5b60006020828403121561263f57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212205fe85b77960dbe97919455e79a7b56b1d2790fdd99d360327108a4ca22b9cdec64736f6c634300081300330000000000000000000000008ef32a03784c8fd63bbf027251b9620865bd54b600000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003840000000000000000000000000000000000000000000000000000000000000064000000000000000000000000171d311eacd2206d21cb462d661c33f0eddadc03
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80638da5cb5b11610097578063d057fc1f11610066578063d057fc1f14610276578063f2fde38b1461029c578063f3619716146102af578063ff08aa491461032257600080fd5b80638da5cb5b146101fe578063c38a8afd1461021c578063cb99e91f14610243578063ceb7ec041461025657600080fd5b806363c42460116100d357806363c42460146101a057806365816731146101d9578063715018a6146101e357806388b7904d146101eb57600080fd5b806343425e88146100fa578063444784251461014b57806353deb3d61461016b575b600080fd5b6101217f0000000000000000000000008ef32a03784c8fd63bbf027251b9620865bd54b681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6001546101219073ffffffffffffffffffffffffffffffffffffffff1681565b6101927f000000000000000000000000000000000000000000000000000000000000006481565b604051908152602001610142565b6101c96101ae366004612183565b60070b60009081526002602052604090206005015460ff1690565b6040519015158152602001610142565b6101e1610349565b005b6101e161040d565b6101e16101f93660046121a5565b610421565b60005473ffffffffffffffffffffffffffffffffffffffff16610121565b6101927f00000000000000000000000000000000000000000000000000000000000003e881565b6101e1610251366004612183565b6110b9565b610269610264366004612370565b611377565b604051610142919061245e565b6102896102843660046124a2565b611d5c565b60405160079190910b8152602001610142565b6101e16102aa3660046124bb565b611d93565b6102f46102bd366004612183565b600260208190526000918252604090912080546001820154928201546005909201549092919060ff811690610100900461ffff1685565b604080519586526020860194909452928401919091521515606083015261ffff16608082015260a001610142565b6101927f000000000000000000000000000000000000000000000000000000000000038481565b610351611e4a565b600060038054806020026020016040519081016040528092919081815260200182805480156103c257602002820191906000526020600020906000905b825461010083900a900460070b81526020600f830181900493840193600103600890930192909202910180841161038e5790505b5050505050905060005b8151811015610409576103f78282815181106103ea576103ea6124d6565b60200260200101516110b9565b8061040181612534565b9150506103cc565b5050565b610415611e4a565b61041f6000611ecb565b565b610429611e4a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000161ffff8416016104e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4c6f73657220696e6465782073686f756c646e2774206265207468652073656e60448201527f74696e656c2076616c756500000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105008460070b60009081526002602052604090206005015460ff1690565b61058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e6f2067616d6520696e2070726f677265737320666f7220746869732054656c60448201527f656772616d20636861742049440000000000000000000000000000000000000060648201526084016104d8565b600784900b6000908152600260205260409020600381015461ffff851610610610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4c6f73657220696e646578206f7574206f662072616e6765000000000000000060448201526064016104d8565b600381015460011061067e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f7420656e6f75676820706c6179657273000000000000000000000000000060448201526064016104d8565b6005810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001661010061ffff8716027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00161790556106dd85611f40565b60038101546000906106f19060019061256c565b67ffffffffffffffff8111156107095761070961223f565b604051908082528060200260200182016040528015610732578160200160208202803683370190505b50600383015490915060009061074a9060019061256c565b67ffffffffffffffff8111156107625761076261223f565b60405190808252806020026020018201604052801561078b578160200160208202803683370190505b50905060008060005b600386015461ffff821610156108c5578861ffff168161ffff16146108b357856003018161ffff16815481106107cc576107cc6124d6565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16858361ffff168151811061080d5761080d6124d6565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080848361ffff168151811061085e5761085e6124d6565b602002602001019061ffff16908161ffff1681525050856004018161ffff168154811061088d5761088d6124d6565b9060005260206000200154836108a39190612585565b9250816108af81612598565b9250505b806108bd81612598565b915050610794565b506000905062018a886109187f00000000000000000000000000000000000000000000000000000000000003847f0000000000000000000000000000000000000000000000000000000000000064612585565b1061097f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f546f74616c2066656573206d757374206265203c20313030250000000000000060448201526064016104d8565b60006127107f0000000000000000000000000000000000000000000000000000000000000064876004018b61ffff16815481106109be576109be6124d6565b90600052602060002001546109d391906125b9565b6109dd91906125d0565b905060006127107f0000000000000000000000000000000000000000000000000000000000000384886004018c61ffff1681548110610a1e57610a1e6124d6565b9060005260206000200154610a3391906125b9565b610a3d91906125d0565b905060008082848a6004018e61ffff1681548110610a5d57610a5d6124d6565b9060005260206000200154610a72919061256c565b610a7c919061256c565b905060005b88518161ffff161015610d58576000878b6004018a8461ffff1681518110610aab57610aab6124d6565b602002602001015161ffff1681548110610ac757610ac76124d6565b906000526020600020015484610add91906125b9565b610ae791906125d0565b90507f0000000000000000000000008ef32a03784c8fd63bbf027251b9620865bd54b673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8b8461ffff1681518110610b3b57610b3b6124d6565b6020026020010151838e6004018d8761ffff1681518110610b5e57610b5e6124d6565b602002602001015161ffff1681548110610b7a57610b7a6124d6565b9060005260206000200154610b8f9190612585565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af1158015610bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c23919061260b565b935083610c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f46756e6473207472616e73666572206661696c6564000000000000000000000060448201526064016104d8565b7f6b5ed972057bb3f9c6b7b2ea6350bf7abde0e0c5f8a765c5dde8402bb2b6efd38f8b8461ffff1681518110610cc457610cc46124d6565b60200260200101518b8561ffff1681518110610ce257610ce26124d6565b602002602001015184604051610d30949392919060079490940b845273ffffffffffffffffffffffffffffffffffffffff92909216602084015261ffff166040830152606082015260800190565b60405180910390a1610d428188612585565b9650508080610d5090612598565b915050610a81565b50506040517f42966c68000000000000000000000000000000000000000000000000000000008152600481018490527f0000000000000000000000008ef32a03784c8fd63bbf027251b9620865bd54b673ffffffffffffffffffffffffffffffffffffffff16906342966c6890602401600060405180830381600087803b158015610de257600080fd5b505af1158015610df6573d6000803e3d6000fd5b505050507fbc03807cbae975b0551ce6caa7b86a1ff549b347e16440847a8c03140f59c27c8c84604051610e3992919060079290920b8252602082015260400190565b60405180910390a1600083858a6004018e61ffff1681548110610e5e57610e5e6124d6565b9060005260206000200154610e73919061256c565b610e7d919061256c565b6001546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152602481018390529192507f0000000000000000000000008ef32a03784c8fd63bbf027251b9620865bd54b6169063a9059cbb906044016020604051808303816000875af1158015610f18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3c919061260b565b915081610fa5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f526576656e7565207472616e73666572206661696c656400000000000000000060448201526064016104d8565b6040805160078f900b8152602081018390527f0f771b5d5a6b02378d0d1a6b6b371ac1e69759fb677e46109ae1bb55167ea7ad910160405180910390a1886004018c61ffff1681548110610ffb57610ffb6124d6565b90600052602060002001548185876110139190612585565b61101d9190612585565b146110aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f43616c63756c617465642077696e6e696e677320646f206e6f7420616464207560448201527f700000000000000000000000000000000000000000000000000000000000000060648201526084016104d8565b50505050505050505050505050565b6110c1611e4a565b6110e08160070b60009081526002602052604090206005015460ff1690565b61116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e6f2067616d6520696e2070726f677265737320666f7220746869732054656c60448201527f656772616d20636861742049440000000000000000000000000000000000000060648201526084016104d8565b600781900b6000908152600260205260408120905b600382015461ffff821610156113435760007f0000000000000000000000008ef32a03784c8fd63bbf027251b9620865bd54b673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb846003018461ffff16815481106111e8576111e86124d6565b60009182526020909120015460048601805473ffffffffffffffffffffffffffffffffffffffff9092169161ffff8716908110611227576112276124d6565b6000918252602090912001546040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af11580156112a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c7919061260b565b905080611330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f46756e6473207472616e73666572206661696c6564000000000000000000000060448201526064016104d8565b508061133b81612598565b915050611181565b506005810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905561040982611f40565b6060611381611e4a565b60028610156113ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5265766f6c7665722073697a6520746f6f20736d616c6c00000000000000000060448201526064016104d8565b858351111561147d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6f206d616e7920706c617965727320666f7220746869732073697a65207260448201527f65766f6c7665720000000000000000000000000000000000000000000000000060648201526084016104d8565b7f00000000000000000000000000000000000000000000000000000000000003e8851015611507576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d696e696d756d2062657420746f6f20736d616c6c000000000000000000000060448201526064016104d8565b8151835114611572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f506c61796572732f62657473206c656e677468206d69736d617463680000000060448201526064016104d8565b60018351116115dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f7420656e6f75676820706c6179657273000000000000000000000000000060448201526064016104d8565b6115fc8760070b60009081526002602052604090206005015460ff1690565b15611689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f546865726520697320616c726561647920612067616d6520696e2070726f677260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016104d8565b6000805b83518161ffff16101561175e5786848261ffff16815181106116b1576116b16124d6565b60200260200101511015611721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f42657420697320736d616c6c6572207468616e20746865206d696e696d756d0060448201526064016104d8565b838161ffff1681518110611737576117376124d6565b60200260200101518261174a9190612585565b91508061175681612598565b91505061168d565b5060005b83518161ffff161015611bc757838161ffff1681518110611785576117856124d6565b602002602001015182611798919061256c565b915081848261ffff16815181106117b1576117b16124d6565b602002602001015111156117e35781848261ffff16815181106117d6576117d66124d6565b6020026020010181815250505b838161ffff16815181106117f9576117f96124d6565b60200260200101518261180c9190612585565b9150838161ffff1681518110611824576118246124d6565b60200260200101517f0000000000000000000000008ef32a03784c8fd63bbf027251b9620865bd54b673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e878461ffff168151811061187e5761187e6124d6565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152306024820152604401602060405180830381865afa1580156118f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191c919061262d565b1015611984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f7420656e6f75676820616c6c6f77616e636500000000000000000000000060448201526064016104d8565b60007f0000000000000000000000008ef32a03784c8fd63bbf027251b9620865bd54b673ffffffffffffffffffffffffffffffffffffffff166323b872dd878461ffff16815181106119d8576119d86124d6565b602002602001015130888661ffff16815181106119f7576119f76124d6565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff938416600482015292909116602483015260448201526064016020604051808303816000875af1158015611a7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9f919061260b565b905080611b08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f46756e6473207472616e73666572206661696c6564000000000000000000000060448201526064016104d8565b7f4ca2b6f8214bfec8b3a7c06707618645a8e77d171b22a4eba1d8811fdc30bfdb8a878461ffff1681518110611b4057611b406124d6565b602002602001015184888661ffff1681518110611b5f57611b5f6124d6565b6020026020010151604051611bac949392919060079490940b845273ffffffffffffffffffffffffffffffffffffffff92909216602084015261ffff166040830152606082015260800190565b60405180910390a15080611bbf81612598565b915050611762565b506040805160e0810182526000808252602082018190529181018290526060808201819052608082015260a0810182905260c0810191909152878152602080820188815260408084018981526060850189815260808601899052600160a0870181905260078f900b60009081526002808852949020875181559451908501559051918301919091555180518493611c65926003850192910190612092565b5060808201518051611c8191600484019160209091019061211c565b5060a0820151600591909101805460c0909301517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000009093169115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff169190911761010061ffff90931683021790556003805460018101825560008290527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b600482040180549190921660080290920a67ffffffffffffffff818102199093169b909216919091029990991790985550909695505050505050565b60038181548110611d6c57600080fd5b9060005260206000209060049182820401919006600802915054906101000a900460070b81565b611d9b611e4a565b73ffffffffffffffffffffffffffffffffffffffff8116611e3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104d8565b611e4781611ecb565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461041f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104d8565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005b600354811015610409578160070b60038281548110611f6457611f646124d6565b6000918252602090912060048204015460039091166008026101000a900460070b036120805760038054611f9a9060019061256c565b81548110611faa57611faa6124d6565b90600052602060002090600491828204019190066008029054906101000a900460070b60038281548110611fe057611fe06124d6565b90600052602060002090600491828204019190066008026101000a81548167ffffffffffffffff021916908360070b67ffffffffffffffff160217905550600380548061202f5761202f612646565b60008281526020902060047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191820401805467ffffffffffffffff600860038516026101000a021916905590555b8061208a81612534565b915050611f43565b82805482825590600052602060002090810192821561210c579160200282015b8281111561210c57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906120b2565b50612118929150612157565b5090565b82805482825590600052602060002090810192821561210c579160200282015b8281111561210c57825182559160200191906001019061213c565b5b808211156121185760008155600101612158565b8035600781900b811461217e57600080fd5b919050565b60006020828403121561219557600080fd5b61219e8261216c565b9392505050565b600080600080606085870312156121bb57600080fd5b6121c48561216c565b9350602085013561ffff811681146121db57600080fd5b9250604085013567ffffffffffffffff808211156121f857600080fd5b818701915087601f83011261220c57600080fd5b81358181111561221b57600080fd5b8860208260051b850101111561223057600080fd5b95989497505060200194505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156122b5576122b561223f565b604052919050565b600067ffffffffffffffff8211156122d7576122d761223f565b5060051b60200190565b803573ffffffffffffffffffffffffffffffffffffffff8116811461217e57600080fd5b600082601f83011261231657600080fd5b8135602061232b612326836122bd565b61226e565b82815260059290921b8401810191818101908684111561234a57600080fd5b8286015b84811015612365578035835291830191830161234e565b509695505050505050565b60008060008060008060c0878903121561238957600080fd5b6123928761216c565b955060208088013595506040880135945060608801359350608088013567ffffffffffffffff808211156123c557600080fd5b818a0191508a601f8301126123d957600080fd5b81356123e7612326826122bd565b81815260059190911b8301840190848101908d83111561240657600080fd5b938501935b8285101561242b5761241c856122e1565b8252938501939085019061240b565b9650505060a08a013592508083111561244357600080fd5b505061245189828a01612305565b9150509295509295509295565b6020808252825182820181905260009190848201906040850190845b818110156124965783518352928401929184019160010161247a565b50909695505050505050565b6000602082840312156124b457600080fd5b5035919050565b6000602082840312156124cd57600080fd5b61219e826122e1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361256557612565612505565b5060010190565b8181038181111561257f5761257f612505565b92915050565b8082018082111561257f5761257f612505565b600061ffff8083168181036125af576125af612505565b6001019392505050565b808202811582820484141761257f5761257f612505565b600082612606577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561261d57600080fd5b8151801515811461219e57600080fd5b60006020828403121561263f57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212205fe85b77960dbe97919455e79a7b56b1d2790fdd99d360327108a4ca22b9cdec64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008ef32a03784c8fd63bbf027251b9620865bd54b600000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003840000000000000000000000000000000000000000000000000000000000000064000000000000000000000000171d311eacd2206d21cb462d661c33f0eddadc03
-----Decoded View---------------
Arg [0] : _bettingToken (address): 0x8ef32a03784c8Fd63bBf027251b9620865bD54B6
Arg [1] : _minimumBet (uint256): 1000
Arg [2] : _revenueBps (uint256): 900
Arg [3] : _burnBps (uint256): 100
Arg [4] : _revenueWallet (address): 0x171d311eAcd2206d21Cb462d661C33F0eddadC03
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000008ef32a03784c8fd63bbf027251b9620865bd54b6
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000384
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [4] : 000000000000000000000000171d311eacd2206d21cb462d661c33f0eddadc03
Deployed Bytecode Sourcemap
32616:9835:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32706:40;;;;;;;;217:42:1;205:55;;;187:74;;175:2;160:18;32706:40:0;;;;;;;;32669:28;;;;;;;;;32952:32;;;;;;;;649:25:1;;;637:2;622:18;32952:32:0;503:177:1;34727:123:0;;;;;;:::i;:::-;34815:16;;34791:4;34815:16;;;:5;:16;;;;;:27;;;;;;34727:123;;;;1202:14:1;;1195:22;1177:41;;1165:2;1150:18;34727:123:0;1037:187:1;42124:324:0;;;:::i;:::-;;3581:103;;;:::i;38535:2881::-;;;;;;:::i;:::-;;:::i;2933:87::-;2979:7;3006:6;;;2933:87;;32755:35;;;;;41590:466;;;;;;:::i;:::-;;:::i;35741:2170::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33212:29::-;;;;;;:::i;:::-;;:::i;:::-;;;6094:1:1;6083:21;;;;6065:40;;6053:2;6038:18;33212:29:0;5923:188:1;3839:201:0;;;;;;:::i;:::-;;:::i;33039:35::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6558:25:1;;;6614:2;6599:18;;6592:34;;;;6642:18;;;6635:34;;;;6712:14;6705:22;6700:2;6685:18;;6678:50;6777:6;6765:19;6759:3;6744:19;;6737:48;6545:3;6530:19;33039:35:0;6307:484:1;32855:35:0;;;;;42124:324;2819:13;:11;:13::i;:::-;42274:30:::1;42307:14;42274:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;::::1;;;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;::::1;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;;;;;;;;;;;;;42337:9;42332:109;42356:15;:22;42352:1;:26;42332:109;;;42400:29;42410:15;42426:1;42410:18;;;;;;;;:::i;:::-;;;;;;;42400:9;:29::i;:::-;42380:3:::0;::::1;::::0;::::1;:::i;:::-;;;;42332:109;;;;42166:282;42124:324::o:0;3581:103::-;2819:13;:11;:13::i;:::-;3646:30:::1;3673:1;3646:18;:30::i;:::-;3581:103::o:0;38535:2881::-;2819:13;:11;:13::i;:::-;38667:26;38677:16:::1;38667:26:::0;::::1;::::0;38659:82:::1;;;::::0;::::1;::::0;;7576:2:1;38659:82:0::1;::::0;::::1;7558:21:1::0;7615:2;7595:18;;;7588:30;7654:34;7634:18;;;7627:62;7725:13;7705:18;;;7698:41;7756:19;;38659:82:0::1;;;;;;;;;38760:27;38777:9;34815:16:::0;;34791:4;34815:16;;;:5;:16;;;;;:27;;;;;;34727:123;38760:27:::1;38752:85;;;::::0;::::1;::::0;;7988:2:1;38752:85:0::1;::::0;::::1;7970:21:1::0;8027:2;8007:18;;;8000:30;8066:34;8046:18;;;8039:62;8137:15;8117:18;;;8110:43;8170:19;;38752:85:0::1;7786:409:1::0;38752:85:0::1;38867:16;::::0;;::::1;38850:14;38867:16:::0;;;:5:::1;:16;::::0;;;;38913:9:::1;::::0;::::1;:16:::0;38904:25:::1;::::0;::::1;;38896:62;;;::::0;::::1;::::0;;8402:2:1;38896:62:0::1;::::0;::::1;8384:21:1::0;8441:2;8421:18;;;8414:30;8480:26;8460:18;;;8453:54;8524:18;;38896:62:0::1;8200:348:1::0;38896:62:0::1;38977:9;::::0;::::1;:16:::0;38996:1:::1;-1:-1:-1::0;38969:51:0::1;;;::::0;::::1;::::0;;8755:2:1;38969:51:0::1;::::0;::::1;8737:21:1::0;8794:2;8774:18;;;8767:30;8833:20;8813:18;;;8806:48;8871:18;;38969:51:0::1;8553:342:1::0;38969:51:0::1;39033:7;::::0;::::1;:16:::0;;39060:20;;39033:16:::1;;::::0;::::1;;39060:20:::0;;;;;39091:21:::1;39102:9:::0;39091:10:::1;:21::i;:::-;39194:9;::::0;::::1;:16:::0;39153:24:::1;::::0;39194:20:::1;::::0;39213:1:::1;::::0;39194:20:::1;:::i;:::-;39180:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;39180:35:0::1;-1:-1:-1::0;39276:9:0::1;::::0;::::1;:16:::0;39153:62;;-1:-1:-1;39226:34:0::1;::::0;39276:20:::1;::::0;39295:1:::1;::::0;39276:20:::1;:::i;:::-;39263:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;39263:34:0::1;;39226:71;;39353:23;39474:17:::0;39515:8:::1;39510:317;39533:9;::::0;::::1;:16:::0;39529:20:::1;::::0;::::1;;39510:317;;;39584:6;39579:11;;:1;:11;;;39575:237;;39637:1;:9;;39647:1;39637:12;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;39615:7;39623:10;39615:19;;;;;;;;;;:::i;:::-;;;;;;:34;;;;;;;;;::::0;::::1;39705:1;39672:18;39691:10;39672:30;;;;;;;;;;:::i;:::-;;;;;;:34;;;;;;;;;::::0;::::1;39748:1;:6;;39755:1;39748:9;;;;;;;;;;:::i;:::-;;;;;;;;;39729:28;;;;;:::i;:::-;::::0;-1:-1:-1;39780:12:0;::::1;::::0;::::1;:::i;:::-;;;;39575:237;39551:3:::0;::::1;::::0;::::1;:::i;:::-;;;;39510:317;;;-1:-1:-1::0;39850:25:0::1;::::0;-1:-1:-1;39921:7:0::1;39898:20;39908:10;39898:7;:20;:::i;:::-;:30;39890:68;;;::::0;::::1;::::0;;9567:2:1;39890:68:0::1;::::0;::::1;9549:21:1::0;9606:2;9586:18;;;9579:30;9645:27;9625:18;;;9618:55;9690:18;;39890:68:0::1;9365:349:1::0;39890:68:0::1;40012:17;40059:6;40049:7;40032:1;:6;;40039;40032:14;;;;;;;;;;:::i;:::-;;;;;;;;;:24;;;;:::i;:::-;:33;;;;:::i;:::-;40012:53;;40260:26;40319:6;40306:10;40289:1;:6;;40296;40289:14;;;;;;;;;;:::i;:::-;;;;;;;;;:27;;;;:::i;:::-;:36;;;;:::i;:::-;40260:65;;40338:11;40375:21:::0;40428:18:::1;40416:9;40399:1;:6;;40406;40399:14;;;;;;;;;;:::i;:::-;;;;;;;;;:26;;;;:::i;:::-;:47;;;;:::i;:::-;40375:71;;40468:8;40463:460;40486:7;:14;40482:1;:18;;;40463:460;;;40526:16;40593:15;40561:1;:6;;40568:18;40587:1;40568:21;;;;;;;;;;:::i;:::-;;;;;;;40561:29;;;;;;;;;;:::i;:::-;;;;;;;;;40545:13;:45;;;;:::i;:::-;:63;;;;:::i;:::-;40526:82;;40638:12;:21;;;40660:7;40668:1;40660:10;;;;;;;;;;:::i;:::-;;;;;;;40704:8;40672:1;:6;;40679:18;40698:1;40679:21;;;;;;;;;;:::i;:::-;;;;;;;40672:29;;;;;;;;;;:::i;:::-;;;;;;;;;:40;;;;:::i;:::-;40638:75;::::0;;::::1;::::0;;;;;;10375:42:1;10363:55;;;40638:75:0::1;::::0;::::1;10345:74:1::0;10435:18;;;10428:34;10318:18;;40638:75:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40629:84;;40740:6;40732:40;;;::::0;::::1;::::0;;10957:2:1;40732:40:0::1;::::0;::::1;10939:21:1::0;10996:2;10976:18;;;10969:30;11035:23;11015:18;;;11008:51;11076:18;;40732:40:0::1;10755:345:1::0;40732:40:0::1;40798:59;40802:9;40813:7;40821:1;40813:10;;;;;;;;;;:::i;:::-;;;;;;;40825:18;40844:1;40825:21;;;;;;;;;;:::i;:::-;;;;;;;40848:8;40798:59;;;;;;;;11359:1:1::0;11348:21;;;;11330:40;;11418:42;11406:55;;;;11401:2;11386:18;;11379:83;11510:6;11498:19;11493:2;11478:18;;11471:47;11549:2;11534:18;;11527:34;11317:3;11302:19;;11105:462;40798:59:0::1;;;;;;;;40878:29;40899:8:::0;40878:29;::::1;:::i;:::-;;;40507:416;40502:3;;;;;:::i;:::-;;;;40463:460;;;-1:-1:-1::0;;40946:28:0::1;::::0;;;;::::1;::::0;::::1;649:25:1::0;;;40946:12:0::1;:17;;::::0;::::1;::::0;622:18:1;;40946:28:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40990:26;40995:9;41006;40990:26;;;;;;11771:1:1::0;11760:21;;;;11742:40;;11813:2;11798:18;;11791:34;11730:2;11715:18;;11572:259;40990:26:0::1;;;;;;;;41029:24;41093:9;41073:17;41056:1;:6;;41063;41056:14;;;;;;;;;;:::i;:::-;;;;;;;;;:34;;;;:::i;:::-;:46;;;;:::i;:::-;41144:13;::::0;41122:54:::1;::::0;;;;:21:::1;41144:13:::0;;::::1;41122:54;::::0;::::1;10345:74:1::0;10435:18;;;10428:34;;;41029:73:0;;-1:-1:-1;41122:12:0::1;:21;::::0;::::1;::::0;10318:18:1;;41122:54:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41113:63;;41195:6;41187:42;;;::::0;::::1;::::0;;12038:2:1;41187:42:0::1;::::0;::::1;12020:21:1::0;12077:2;12057:18;;;12050:30;12116:25;12096:18;;;12089:53;12159:18;;41187:42:0::1;11836:347:1::0;41187:42:0::1;41245:36;::::0;;11771:1:1;11760:21;;;11742:40;;11813:2;11798:18;;11791:34;;;41245:36:0::1;::::0;11715:18:1;41245:36:0::1;;;;;;;41356:1;:6;;41363;41356:14;;;;;;;;;;:::i;:::-;;;;;;;;;41335:16;41323:9;41303:17;:29;;;;:::i;:::-;:48;;;;:::i;:::-;41302:68;41294:114;;;::::0;::::1;::::0;;12390:2:1;41294:114:0::1;::::0;::::1;12372:21:1::0;12429:2;12409:18;;;12402:30;12468:34;12448:18;;;12441:62;12539:3;12519:18;;;12512:31;12560:19;;41294:114:0::1;12188:397:1::0;41294:114:0::1;38648:2768;;;;;;;;;38535:2881:::0;;;;:::o;41590:466::-;2819:13;:11;:13::i;:::-;41662:27:::1;41679:9;34815:16:::0;;34791:4;34815:16;;;:5;:16;;;;;:27;;;;;;34727:123;41662:27:::1;41654:85;;;::::0;::::1;::::0;;7988:2:1;41654:85:0::1;::::0;::::1;7970:21:1::0;8027:2;8007:18;;;8000:30;8066:34;8046:18;;;8039:62;8137:15;8117:18;;;8110:43;8170:19;;41654:85:0::1;7786:409:1::0;41654:85:0::1;41767:16;::::0;;::::1;41750:14;41767:16:::0;;;:5:::1;:16;::::0;;;;;41796:188:::1;41819:9;::::0;::::1;:16:::0;41815:20:::1;::::0;::::1;;41796:188;;;41857:11;41871:12;:21;;;41893:1;:9;;41903:1;41893:12;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;41907:6:::1;::::0;::::1;:9:::0;;41893:12:::1;::::0;;::::1;::::0;41907:9:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;41871:46:::1;::::0;;::::1;::::0;;;;;;10375:42:1;10363:55;;;41871:46:0::1;::::0;::::1;10345:74:1::0;10435:18;;;10428:34;10318:18;;41871:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41857:60;;41940:6;41932:40;;;::::0;::::1;::::0;;10957:2:1;41932:40:0::1;::::0;::::1;10939:21:1::0;10996:2;10976:18;;;10969:30;11035:23;11015:18;;;11008:51;11076:18;;41932:40:0::1;10755:345:1::0;41932:40:0::1;-1:-1:-1::0;41837:3:0;::::1;::::0;::::1;:::i;:::-;;;;41796:188;;;-1:-1:-1::0;41996:12:0::1;::::0;::::1;:20:::0;;;::::1;::::0;;42027:21:::1;42038:9:::0;42027:10:::1;:21::i;35741:2170::-:0;35982:16;2819:13;:11;:13::i;:::-;36036:1:::1;36019:13;:18;;36011:54;;;::::0;::::1;::::0;;12792:2:1;36011:54:0::1;::::0;::::1;12774:21:1::0;12831:2;12811:18;;;12804:30;12870:25;12850:18;;;12843:53;12913:18;;36011:54:0::1;12590:347:1::0;36011:54:0::1;36103:13;36084:8;:15;:32;;36076:84;;;::::0;::::1;::::0;;13144:2:1;36076:84:0::1;::::0;::::1;13126:21:1::0;13183:2;13163:18;;;13156:30;13222:34;13202:18;;;13195:62;13293:9;13273:18;;;13266:37;13320:19;;36076:84:0::1;12942:403:1::0;36076:84:0::1;36190:10;36179:7;:21;;36171:55;;;::::0;::::1;::::0;;13552:2:1;36171:55:0::1;::::0;::::1;13534:21:1::0;13591:2;13571:18;;;13564:30;13630:23;13610:18;;;13603:51;13671:18;;36171:55:0::1;13350:345:1::0;36171:55:0::1;36264:5;:12;36245:8;:15;:31;36237:72;;;::::0;::::1;::::0;;13902:2:1;36237:72:0::1;::::0;::::1;13884:21:1::0;13941:2;13921:18;;;13914:30;13980;13960:18;;;13953:58;14028:18;;36237:72:0::1;13700:352:1::0;36237:72:0::1;36346:1;36328:8;:15;:19;36320:50;;;::::0;::::1;::::0;;8755:2:1;36320:50:0::1;::::0;::::1;8737:21:1::0;8794:2;8774:18;;;8767:30;8833:20;8813:18;;;8806:48;8871:18;;36320:50:0::1;8553:342:1::0;36320:50:0::1;36390:27;36407:9;34815:16:::0;;34791:4;34815:16;;;:5;:16;;;;;:27;;;;;;34727:123;36390:27:::1;36389:28;36381:76;;;::::0;::::1;::::0;;14259:2:1;36381:76:0::1;::::0;::::1;14241:21:1::0;14298:2;14278:18;;;14271:30;14337:34;14317:18;;;14310:62;14408:5;14388:18;;;14381:33;14431:19;;36381:76:0::1;14057:399:1::0;36381:76:0::1;36812:16;36848:8:::0;36843:167:::1;36866:5;:12;36862:1;:16;;;36843:167;;;36920:7;36908:5;36914:1;36908:8;;;;;;;;;;:::i;:::-;;;;;;;:19;;36900:63;;;::::0;::::1;::::0;;14663:2:1;36900:63:0::1;::::0;::::1;14645:21:1::0;14702:2;14682:18;;;14675:30;14741:33;14721:18;;;14714:61;14792:18;;36900:63:0::1;14461:355:1::0;36900:63:0::1;36990:5;36996:1;36990:8;;;;;;;;;;:::i;:::-;;;;;;;36978:20;;;;;:::i;:::-;::::0;-1:-1:-1;36880:3:0;::::1;::::0;::::1;:::i;:::-;;;;36843:167;;;;37025:8;37020:538;37043:5;:12;37039:1;:16;;;37020:538;;;37089:5;37095:1;37089:8;;;;;;;;;;:::i;:::-;;;;;;;37077:20;;;;;:::i;:::-;;;37127:8;37116:5;37122:1;37116:8;;;;;;;;;;:::i;:::-;;;;;;;:19;37112:79;;;37167:8;37156:5;37162:1;37156:8;;;;;;;;;;:::i;:::-;;;;;;:19;;;::::0;::::1;37112:79;37217:5;37223:1;37217:8;;;;;;;;;;:::i;:::-;;;;;;;37205:20;;;;;:::i;:::-;;;37304:5;37310:1;37304:8;;;;;;;;;;:::i;:::-;;;;;;;37250:12;:22;;;37273:8;37282:1;37273:11;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;37250:50:::1;::::0;;::::1;::::0;;;;;;15005:42:1;15074:15;;;37250:50:0::1;::::0;::::1;15056:34:1::0;37294:4:0::1;15106:18:1::0;;;15099:43;14968:18;;37250:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;37242:95;;;::::0;::::1;::::0;;15544:2:1;37242:95:0::1;::::0;::::1;15526:21:1::0;15583:2;15563:18;;;15556:30;15622:22;15602:18;;;15595:50;15662:18;;37242:95:0::1;15342:344:1::0;37242:95:0::1;37352:11;37366:12;:25;;;37392:8;37401:1;37392:11;;;;;;;;;;:::i;:::-;;;;;;;37413:4;37420:5;37426:1;37420:8;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;37366:63:::1;::::0;;::::1;::::0;;;;;;15903:42:1;15972:15;;;37366:63:0::1;::::0;::::1;15954:34:1::0;16024:15;;;;16004:18;;;15997:43;16056:18;;;16049:34;15866:18;;37366:63:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37352:77;;37452:6;37444:40;;;::::0;::::1;::::0;;10957:2:1;37444:40:0::1;::::0;::::1;10939:21:1::0;10996:2;10976:18;;;10969:30;11035:23;11015:18;;;11008:51;11076:18;;37444:40:0::1;10755:345:1::0;37444:40:0::1;37506;37510:9;37521:8;37530:1;37521:11;;;;;;;;;;:::i;:::-;;;;;;;37534:1;37537:5;37543:1;37537:8;;;;;;;;;;:::i;:::-;;;;;;;37506:40;;;;;;;;11359:1:1::0;11348:21;;;;11330:40;;11418:42;11406:55;;;;11401:2;11386:18;;11379:83;11510:6;11498:19;11493:2;11478:18;;11471:47;11549:2;11534:18;;11527:34;11317:3;11302:19;;11105:462;37506:40:0::1;;;;;;;;-1:-1:-1::0;37057:3:0;::::1;::::0;::::1;:::i;:::-;;;;37020:538;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37594:30:0;;;37635:8:::1;::::0;;::::1;:18:::0;;;37664:26:::1;::::0;;::::1;:54:::0;;;37729:9:::1;::::0;::::1;:20:::0;;;37760:6:::1;::::0;::::1;:14:::0;;;37800:4:::1;37785:12;::::0;::::1;:19:::0;;;37817:16:::1;::::0;;::::1;37594:14;37817:16:::0;;;:5:::1;:16:::0;;;;;;:20;;;;;;;;::::1;::::0;;;;;::::1;::::0;;;;;;;37594:1;;37817:20:::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;37817:20:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;37817:20:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;;;;;::::1;;::::0;;::::1;::::0;::::1;;::::0;;37848:14:::1;:30:::0;;-1:-1:-1;37848:30:0;::::1;::::0;;-1:-1:-1;37848:30:0;;;;::::1;::::0;::::1;;::::0;;;;;;::::1;;::::0;;::::1;;::::0;;::::1;;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;37898:5:0;;35741:2170;-1:-1:-1;;;;;;35741:2170:0:o;33212:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3839:201::-;2819:13;:11;:13::i;:::-;3928:22:::1;::::0;::::1;3920:73;;;::::0;::::1;::::0;;16296:2:1;3920:73:0::1;::::0;::::1;16278:21:1::0;16335:2;16315:18;;;16308:30;16374:34;16354:18;;;16347:62;16445:8;16425:18;;;16418:36;16471:19;;3920:73:0::1;16094:402:1::0;3920:73:0::1;4004:28;4023:8;4004:18;:28::i;:::-;3839:201:::0;:::o;3098:132::-;2979:7;3006:6;3162:23;3006:6;1722:10;3162:23;3154:68;;;;;;;16703:2:1;3154:68:0;;;16685:21:1;;;16722:18;;;16715:30;16781:34;16761:18;;;16754:62;16833:18;;3154:68:0;16501:356:1;4200:191:0;4274:16;4293:6;;;4310:17;;;;;;;;;;4343:40;;4293:6;;;;;;;4343:40;;4274:16;4343:40;4263:128;4200:191;:::o;34983:313::-;35045:9;35040:249;35064:14;:21;35060:25;;35040:249;;;35132:9;35111:30;;:14;35126:1;35111:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:30;35107:171;;35182:14;35197:21;;:25;;35221:1;;35197:25;:::i;:::-;35182:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;35162:14;35177:1;35162:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:61;;;;;;;;;;;;;;;;;;;;35242:14;:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35107:171;35087:3;;;;:::i;:::-;;;;35040:249;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;685:160:1;751:20;;811:1;800:20;;;790:31;;780:59;;835:1;832;825:12;780:59;685:160;;;:::o;850:182::-;907:6;960:2;948:9;939:7;935:23;931:32;928:52;;;976:1;973;966:12;928:52;999:27;1016:9;999:27;:::i;:::-;989:37;850:182;-1:-1:-1;;;850:182:1:o;1229:857::-;1342:6;1350;1358;1366;1419:2;1407:9;1398:7;1394:23;1390:32;1387:52;;;1435:1;1432;1425:12;1387:52;1458:27;1475:9;1458:27;:::i;:::-;1448:37;;1535:2;1524:9;1520:18;1507:32;1579:6;1572:5;1568:18;1561:5;1558:29;1548:57;;1601:1;1598;1591:12;1548:57;1624:5;-1:-1:-1;1680:2:1;1665:18;;1652:32;1703:18;1733:14;;;1730:34;;;1760:1;1757;1750:12;1730:34;1798:6;1787:9;1783:22;1773:32;;1843:7;1836:4;1832:2;1828:13;1824:27;1814:55;;1865:1;1862;1855:12;1814:55;1905:2;1892:16;1931:2;1923:6;1920:14;1917:34;;;1947:1;1944;1937:12;1917:34;2000:7;1995:2;1985:6;1982:1;1978:14;1974:2;1970:23;1966:32;1963:45;1960:65;;;2021:1;2018;2011:12;1960:65;1229:857;;;;-1:-1:-1;;2052:2:1;2044:11;;-1:-1:-1;;;1229:857:1:o;2091:184::-;2143:77;2140:1;2133:88;2240:4;2237:1;2230:15;2264:4;2261:1;2254:15;2280:334;2351:2;2345:9;2407:2;2397:13;;2412:66;2393:86;2381:99;;2510:18;2495:34;;2531:22;;;2492:62;2489:88;;;2557:18;;:::i;:::-;2593:2;2586:22;2280:334;;-1:-1:-1;2280:334:1:o;2619:183::-;2679:4;2712:18;2704:6;2701:30;2698:56;;;2734:18;;:::i;:::-;-1:-1:-1;2779:1:1;2775:14;2791:4;2771:25;;2619:183::o;2807:196::-;2875:20;;2935:42;2924:54;;2914:65;;2904:93;;2993:1;2990;2983:12;3008:662;3062:5;3115:3;3108:4;3100:6;3096:17;3092:27;3082:55;;3133:1;3130;3123:12;3082:55;3169:6;3156:20;3195:4;3219:60;3235:43;3275:2;3235:43;:::i;:::-;3219:60;:::i;:::-;3313:15;;;3399:1;3395:10;;;;3383:23;;3379:32;;;3344:12;;;;3423:15;;;3420:35;;;3451:1;3448;3441:12;3420:35;3487:2;3479:6;3475:15;3499:142;3515:6;3510:3;3507:15;3499:142;;;3581:17;;3569:30;;3619:12;;;;3532;;3499:142;;;-1:-1:-1;3659:5:1;3008:662;-1:-1:-1;;;;;;3008:662:1:o;3675:1421::-;3827:6;3835;3843;3851;3859;3867;3920:3;3908:9;3899:7;3895:23;3891:33;3888:53;;;3937:1;3934;3927:12;3888:53;3960:27;3977:9;3960:27;:::i;:::-;3950:37;;4006:2;4055;4044:9;4040:18;4027:32;4017:42;;4106:2;4095:9;4091:18;4078:32;4068:42;;4157:2;4146:9;4142:18;4129:32;4119:42;;4212:3;4201:9;4197:19;4184:33;4236:18;4277:2;4269:6;4266:14;4263:34;;;4293:1;4290;4283:12;4263:34;4331:6;4320:9;4316:22;4306:32;;4376:7;4369:4;4365:2;4361:13;4357:27;4347:55;;4398:1;4395;4388:12;4347:55;4434:2;4421:16;4457:60;4473:43;4513:2;4473:43;:::i;4457:60::-;4551:15;;;4633:1;4629:10;;;;4621:19;;4617:28;;;4582:12;;;;4657:19;;;4654:39;;;4689:1;4686;4679:12;4654:39;4713:11;;;;4733:148;4749:6;4744:3;4741:15;4733:148;;;4815:23;4834:3;4815:23;:::i;:::-;4803:36;;4766:12;;;;4859;;;;4733:148;;;4900:5;-1:-1:-1;;;4958:3:1;4943:19;;4930:33;;-1:-1:-1;4975:16:1;;;4972:36;;;5004:1;5001;4994:12;4972:36;;;5027:63;5082:7;5071:8;5060:9;5056:24;5027:63;:::i;:::-;5017:73;;;3675:1421;;;;;;;;:::o;5101:632::-;5272:2;5324:21;;;5394:13;;5297:18;;;5416:22;;;5243:4;;5272:2;5495:15;;;;5469:2;5454:18;;;5243:4;5538:169;5552:6;5549:1;5546:13;5538:169;;;5613:13;;5601:26;;5682:15;;;;5647:12;;;;5574:1;5567:9;5538:169;;;-1:-1:-1;5724:3:1;;5101:632;-1:-1:-1;;;;;;5101:632:1:o;5738:180::-;5797:6;5850:2;5838:9;5829:7;5825:23;5821:32;5818:52;;;5866:1;5863;5856:12;5818:52;-1:-1:-1;5889:23:1;;5738:180;-1:-1:-1;5738:180:1:o;6116:186::-;6175:6;6228:2;6216:9;6207:7;6203:23;6199:32;6196:52;;;6244:1;6241;6234:12;6196:52;6267:29;6286:9;6267:29;:::i;6796:184::-;6848:77;6845:1;6838:88;6945:4;6942:1;6935:15;6969:4;6966:1;6959:15;6985:184;7037:77;7034:1;7027:88;7134:4;7131:1;7124:15;7158:4;7155:1;7148:15;7174:195;7213:3;7244:66;7237:5;7234:77;7231:103;;7314:18;;:::i;:::-;-1:-1:-1;7361:1:1;7350:13;;7174:195::o;8900:128::-;8967:9;;;8988:11;;;8985:37;;;9002:18;;:::i;:::-;8900:128;;;;:::o;9033:125::-;9098:9;;;9119:10;;;9116:36;;;9132:18;;:::i;9163:197::-;9201:3;9229:6;9270:2;9263:5;9259:14;9297:2;9288:7;9285:15;9282:41;;9303:18;;:::i;:::-;9352:1;9339:15;;9163:197;-1:-1:-1;;;9163:197:1:o;9719:168::-;9792:9;;;9823;;9840:15;;;9834:22;;9820:37;9810:71;;9861:18;;:::i;9892:274::-;9932:1;9958;9948:189;;9993:77;9990:1;9983:88;10094:4;10091:1;10084:15;10122:4;10119:1;10112:15;9948:189;-1:-1:-1;10151:9:1;;9892:274::o;10473:277::-;10540:6;10593:2;10581:9;10572:7;10568:23;10564:32;10561:52;;;10609:1;10606;10599:12;10561:52;10641:9;10635:16;10694:5;10687:13;10680:21;10673:5;10670:32;10660:60;;10716:1;10713;10706:12;15153:184;15223:6;15276:2;15264:9;15255:7;15251:23;15247:32;15244:52;;;15292:1;15289;15282:12;15244:52;-1:-1:-1;15315:16:1;;15153:184;-1:-1:-1;15153:184:1:o;16862:::-;16914:77;16911:1;16904:88;17011:4;17008:1;17001:15;17035:4;17032:1;17025:15
Swarm Source
ipfs://5fe85b77960dbe97919455e79a7b56b1d2790fdd99d360327108a4ca22b9cdec
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.