Contract Overview
Balance:
0 CRO
CRO Value:
$0.00
[ Download CSV Export ]
Contract Source Code Verified (Exact Match)
Contract Name:
Test
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2023-03-16 */ // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File @openzeppelin/contracts/access/[email protected] pragma solidity ^0.8.0; /** * @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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The defaut value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); _approve(sender, _msgSender(), currentAllowance - amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); _approve(_msgSender(), spender, currentAllowance - subtractedValue); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); _balances[sender] = senderBalance - amount; _balances[recipient] += amount; emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } // File contracts/access/Operatable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an operator) that can be granted exclusive access to * specific functions. * * By default, the operator account will be the one that deploys the contract. This * can later be changed with {transferOperator}. * * This module is used through inheritance. It will make available the modifier * `onlyOperator`, which can be applied to your functions to restrict their use to * the operator. * * It is recommended to use with Operator.sol to set permissions per specific functions */ abstract contract Operatable is Context { address private _operator; event OperatorTransferred(address indexed previousOperator, address indexed newOperator); /** * @dev Initializes the contract setting the deployer as the initial operator. */ constructor() { _transferOperator(_msgSender()); } /** * @dev Throws if called by any account other than the operator. */ modifier onlyOperator() { _checkOperator(); _; } /** * @dev Returns the address of the current operator. */ function operator() public view virtual returns (address) { return _operator; } /** * @dev Throws if the sender is not the operator. */ function _checkOperator() internal view virtual { require(operator() == _msgSender(), "Operatable: caller is not the operator"); } /** * @dev Leaves the contract without operator. It will not be possible to call * `onlyOperator` functions anymore. Can only be called by the current operator. * * NOTE: Renouncing operator will leave the contract without an operator, * thereby removing any functionality that is only available to the operator. */ function renounceOperator() public virtual onlyOperator { _transferOperator(address(0)); } /** * @dev Transfers operator of the contract to a new account (`newOperator`). * Can only be called by the current operator. */ function transferOperator(address newOperator) public virtual onlyOperator { require(newOperator != address(0), "Ownable: new operator is the zero address"); _transferOperator(newOperator); } /** * @dev Transfers operator of the contract to a new account (`newOperator`). * Internal function without access restriction. */ function _transferOperator(address newOperator) internal virtual { address oldOperator = _operator; _operator = newOperator; emit OperatorTransferred(oldOperator, newOperator); } } // File contracts/interfaces/IUniswapAmm.sol // File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol pragma solidity ^0.8.4; interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); 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(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol interface IUniswapV2Pair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 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 (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 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 (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); 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 (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } // File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } // File contracts/candy/AntiBotHelper.sol pragma solidity ^0.8.0; /** * @notice Anti-Bot Helper * Blacklis feature * Max TX Amount feature * Max Wallet Amount feature */ contract AntiBotHelper is Ownable { address private constant DEAD = 0x000000000000000000000000000000000000dEaD; address private constant ZERO = address(0); uint256 public constant MAX_TX_AMOUNT_MIN_LIMIT = 100 ether; uint256 public constant MAX_WALLET_AMOUNT_MIN_LIMIT = 1000 ether; mapping(address => bool) internal _excludedFromTxLimit; mapping(address => bool) internal _excludedFromHoldLimit; mapping(address => bool) internal _blacklist; uint256 internal _txLimit = 50000 ether; uint256 internal _holdLimit = 500000 ether; constructor() { _excludedFromTxLimit[_msgSender()] = true; _excludedFromTxLimit[DEAD] = true; _excludedFromTxLimit[ZERO] = true; _excludedFromTxLimit[address(this)] = true; _excludedFromHoldLimit[_msgSender()] = true; _excludedFromHoldLimit[DEAD] = true; _excludedFromHoldLimit[ZERO] = true; _excludedFromHoldLimit[address(this)] = true; } /** * @notice Blacklist the account * @dev Only callable by owner */ function blacklistAccount(address account, bool flag) external onlyOwner { _blacklist[account] = flag; } /** * @notice Check if the account is included in black list * @param account: the account to be checked */ function blacklisted(address account) external view returns (bool) { return _blacklist[account]; } /** * @notice Exclude / Include the account from max tx limit * @dev Only callable by owner */ function excludeFromTxLimit(address account, bool flag) external onlyOwner { _excludedFromTxLimit[account] = flag; } /** * @notice Check if the account is excluded from max tx limit * @param account: the account to be checked */ function excludedFromTxLimit(address account) external view returns (bool) { return _excludedFromTxLimit[account]; } /** * @notice Exclude / Include the account from max wallet limit * @dev Only callable by owner */ function excludeFromHoldLimit(address account, bool flag) external onlyOwner { _excludedFromHoldLimit[account] = flag; } /** * @notice Check if the account is excluded from max wallet limit * @param account: the account to be checked */ function excludedFromHoldLimit(address account) external view returns (bool) { return _excludedFromHoldLimit[account]; } /** * @notice Set anti whales limit configuration * @param txLimit: max amount of token in a transaction * @param holdLimit: max amount of token can be kept in a wallet * @dev Only callable by owner */ function setAntiWhalesConfiguration(uint256 txLimit, uint256 holdLimit) external onlyOwner { require(txLimit >= MAX_TX_AMOUNT_MIN_LIMIT, "Max tx amount too small"); require( holdLimit >= MAX_WALLET_AMOUNT_MIN_LIMIT, "Max wallet amount too small" ); _txLimit = txLimit; _holdLimit = holdLimit; } function viewHoldLimit() external view returns (uint256) { return _holdLimit; } function viewTxLimit() external view returns (uint256) { return _txLimit; } } // File contracts/candy/FeeHelper.sol pragma solidity ^0.8.0; /** * @notice Tax Helper * Marketing fee * Burn fee * Fee in buy/sell/transfer separately */ contract FeeHelper is Ownable { enum TX_CASE { TRANSFER, BUY, SELL } struct TokenFee { uint16 marketingFee; uint16 treasuryFee; uint16 burnFee; } address private constant DEAD = 0x000000000000000000000000000000000000dEaD; address private constant ZERO = address(0); mapping(TX_CASE => TokenFee) internal _tokenFees; mapping(address => bool) internal _excludedFromTax; mapping(address => bool) internal _isSelfPair; constructor() { _excludedFromTax[_msgSender()] = true; _excludedFromTax[DEAD] = true; _excludedFromTax[ZERO] = true; _excludedFromTax[address(this)] = true; _tokenFees[TX_CASE.TRANSFER].marketingFee = 100; _tokenFees[TX_CASE.TRANSFER].treasuryFee = 0; _tokenFees[TX_CASE.TRANSFER].burnFee = 50; _tokenFees[TX_CASE.BUY].marketingFee = 400; _tokenFees[TX_CASE.TRANSFER].treasuryFee = 50; _tokenFees[TX_CASE.BUY].burnFee = 150; _tokenFees[TX_CASE.SELL].marketingFee = 500; _tokenFees[TX_CASE.TRANSFER].treasuryFee = 50; _tokenFees[TX_CASE.SELL].burnFee = 150; } /** * @notice Update fee in the token * @param feeCase: which case the fee is for: transfer / buy / sell * @param marketingFee: fee percent for marketing * @param treasuryFee: fee percent for treasury * @param burnFee: fee percent for burning */ function setFee( TX_CASE feeCase, uint16 marketingFee, uint16 treasuryFee, uint16 burnFee ) external onlyOwner { require(marketingFee + treasuryFee + burnFee <= 10000, "Overflow"); _tokenFees[feeCase].marketingFee = marketingFee; _tokenFees[feeCase].treasuryFee = treasuryFee; _tokenFees[feeCase].burnFee = burnFee; } /** * @notice Exclude / Include the account from fee * @dev Only callable by owner */ function excludeFromTax(address account, bool flag) external onlyOwner { _excludedFromTax[account] = flag; } /** * @notice Check if the account is excluded from the fees * @param account: the account to be checked */ function excludedFromTax(address account) external view returns (bool) { return _excludedFromTax[account]; } function viewFees(TX_CASE feeCase) external view returns (TokenFee memory) { return _tokenFees[feeCase]; } /** * @notice Check if fee should be applied */ function shouldFeeApplied(address from, address to) internal view returns (bool feeApplied, TX_CASE txCase) { // Sender or receiver is excluded from fee if (_excludedFromTax[from] || _excludedFromTax[to]) { feeApplied = false; } // Buying tokens else if (_isSelfPair[from]) { TokenFee memory buyFee = _tokenFees[TX_CASE.BUY]; feeApplied = (buyFee.marketingFee + buyFee.treasuryFee + buyFee.burnFee) > 0; txCase = TX_CASE.BUY; } // Selling tokens else if (_isSelfPair[to]) { TokenFee memory sellFee = _tokenFees[TX_CASE.SELL]; feeApplied = (sellFee.marketingFee + sellFee.treasuryFee + sellFee.burnFee) > 0; txCase = TX_CASE.SELL; } // Transferring tokens else { TokenFee memory transferFee = _tokenFees[TX_CASE.TRANSFER]; feeApplied = (transferFee.marketingFee + transferFee.treasuryFee + transferFee.burnFee) > 0; txCase = TX_CASE.TRANSFER; } } /** * @notice Include / Exclude lp address in self pairs */ function includeInSelfPair(address lpAddress, bool flag) external onlyOwner { _isSelfPair[lpAddress] = flag; } /** * @notice Check if the lp address is self pair */ function isSelfPair(address lpAddress) external view returns (bool) { return _isSelfPair[lpAddress]; } } // File contracts/candy/Test.sol pragma solidity ^0.8.0; /** * @dev Governace token in Bored Candy City * */ contract Test is AntiBotHelper, FeeHelper, ERC20, Operatable { address constant DEAD = 0x000000000000000000000000000000000000dEaD; address constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; uint256 constant MAX_SUPPLY = 250000000 ether; address private _marketingWallet; address private _marketingToken; address private _treasuryWallet; bool private _inSwap; bool private _swapEnabled = true; uint256 private _thresholdAmount = 10000 ether; // Threshold amount of accumlated tax until swap to marketing token IUniswapV2Router02 private _swapRouter; event SwapToMarketingTokenSucceed( address indexed marketingToken, address indexed to, uint256 amountIn, uint256 amountOut ); event SwapToMarketingTokenFailed( address indexed marketingToken, address indexed to, uint256 amount ); modifier lockTheSwap() { _inSwap = true; _; _inSwap = false; } constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_) {} function mint(uint256 amount) external onlyOperator { _mint(_msgSender(), amount); } function mint(address account, uint256 amount) external onlyOperator { _mint(account, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual override { super._mint(account, amount); _afterTokenTransfer(address(0), account, amount); } function burn(uint256 amount) external { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual override { super._burn(account, amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual { require(!_blacklist[from] && !_blacklist[to], "blacklisted account"); // Check max tx limit require( _excludedFromTxLimit[from] || _excludedFromTxLimit[to] || amount <= _txLimit, "Tx amount limited" ); // Check max wallet amount limit require( _excludedFromHoldLimit[to] || balanceOf(to) <= _holdLimit, "Receiver hold limited" ); require(totalSupply() <= MAX_SUPPLY, "Exceeds MAX_SUPPLY"); } function setSwapRouter(address newSwapRouter) external onlyOwner { require(newSwapRouter != address(0), "Invalid swap router"); _swapRouter = IUniswapV2Router02(newSwapRouter); } function viewSwapRouter() external view returns (address) { return address(_swapRouter); } function enableSwap(bool flag) external onlyOwner { _swapEnabled = flag; } function swapEnabled() external view returns (bool) { return _swapEnabled; } function setMarketingWallet(address wallet) external onlyOwner { require(wallet != address(0), "Invalid marketing wallet"); _marketingWallet = wallet; } function viewMarketingWallet() external view returns (address) { return _marketingWallet; } function setMarketingToken(address token) external onlyOwner { _marketingToken = token; } function viewMarketingToken() external view returns (address) { return _marketingToken; } function setTreasuryWallet(address wallet) external onlyOwner { require(wallet != address(0), "Invalid treasury wallet"); _treasuryWallet = wallet; } function viewTreasuryWallet() external view returns (address) { return _treasuryWallet; } /** * @dev Set threshold amount to be swapped to the marketing token * Too small value will cause sell tx happens in every tx */ function setThresholdAmount(uint256 amount) external onlyOwner { require(amount > 0, "Invalid threshold"); _thresholdAmount = amount; } function viewThresholdAmount() external view returns (uint256) { return _thresholdAmount; } function _transfer( address from, address to, uint256 amount ) internal override { require(amount > 0, "Zero transfer"); // is the token balance of this contract address over the min number of // tokens that we need to initiate a swap + liquidity lock? // also, don't get caught in a circular liquidity event. // also, don't swap & liquify if sender is uniswap pair. uint256 contractTokenBalance = balanceOf(address(this)); // indicates if fee should be deducted from transfer (bool feeApplied, TX_CASE txCase) = shouldFeeApplied(from, to); // Swap and liquify also triggered when the tx needs to have fee if ( !_inSwap && feeApplied && _swapEnabled && contractTokenBalance >= _thresholdAmount ) { swapToMarketingToken(_thresholdAmount); } //transfer amount, it will take tax, burn fee _tokenTransfer(from, to, amount, feeApplied, txCase); } // this method is responsible for taking all fee, if takeFee is true function _tokenTransfer( address sender, address recipient, uint256 amount, bool feeApplied, TX_CASE txCase ) private { if (feeApplied) { uint16 marketingFee = _tokenFees[txCase].marketingFee; uint16 treasuryFee = _tokenFees[txCase].treasuryFee; uint16 burnFee = _tokenFees[txCase].burnFee; uint256 burnFeeAmount = (amount * burnFee) / 10000; uint256 treasuryFeeAmount = (amount * treasuryFee) / 10000; uint256 marketingFeeAmount = (amount * marketingFee) / 10000; if (burnFeeAmount > 0) { _burn(sender, burnFeeAmount); amount -= burnFeeAmount; } if (treasuryFeeAmount > 0) { super._transfer(sender, _treasuryWallet, treasuryFeeAmount); amount -= treasuryFeeAmount; } if (marketingFeeAmount > 0) { super._transfer(sender, address(this), marketingFeeAmount); amount -= marketingFeeAmount; } } if (amount > 0) { super._transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } } /** * @dev Swap token accumlated in this contract to the marketing token * * According to the marketing token * - when marketing token is ETH, swapToETH function is called * - when marketing token is another token, swapToToken is called */ function swapToMarketingToken(uint256 amount) private lockTheSwap { if (_marketingToken == address(this)) { super._transfer(address(this), _marketingWallet, amount); _afterTokenTransfer(address(this), _marketingWallet, amount); } else if (isETH(_marketingToken)) { swapToETH(amount, payable(_marketingWallet)); } else { swapToToken(_marketingToken, amount, _marketingWallet); } } function swapToToken( address token, uint256 amount, address to ) private { // generate the uniswap pair path of token -> busd address[] memory path = new address[](2); path[0] = address(this); path[1] = token; _approve(address(this), address(_swapRouter), amount); // capture the target address's current BNB balance. uint256 balanceBefore = IERC20(_marketingToken).balanceOf(to); // make the swap try _swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens( amount, 0, // accept any amount of tokens path, to, block.timestamp + 300 ) { uint256 amountOut = IERC20(_marketingToken).balanceOf(to) - balanceBefore; emit SwapToMarketingTokenSucceed( _marketingToken, to, amount, amountOut ); } catch ( bytes memory /* lowLevelData */ ) { emit SwapToMarketingTokenFailed(_marketingToken, to, amount); } } function swapToETH(uint256 amount, address payable to) private { // generate the uniswap pair path of token -> busd address[] memory path = new address[](2); path[0] = address(this); path[1] = _swapRouter.WETH(); _approve(address(this), address(_swapRouter), amount); // capture the target address's current BNB balance. uint256 balanceBefore = to.balance; // make the swap try _swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens( amount, 0, // accept any amount of BNB path, to, block.timestamp + 300 ) { // how much BNB did we just swap into? uint256 amountOut = to.balance - balanceBefore; emit SwapToMarketingTokenSucceed( _marketingToken, to, amount, amountOut ); } catch ( bytes memory /* lowLevelData */ ) { // how much BNB did we just swap into? emit SwapToMarketingTokenFailed(_marketingToken, to, amount); } } function isETH(address token) internal pure returns (bool) { return (token == address(0) || token == ETH_ADDRESS); } }
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","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":true,"internalType":"address","name":"marketingToken","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SwapToMarketingTokenFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"marketingToken","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"SwapToMarketingTokenSucceed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TX_AMOUNT_MIN_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WALLET_AMOUNT_MIN_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"blacklistAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"blacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"enableSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"excludeFromHoldLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"excludeFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"excludeFromTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludedFromHoldLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludedFromTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludedFromTxLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lpAddress","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"includeInSelfPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lpAddress","type":"address"}],"name":"isSelfPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"txLimit","type":"uint256"},{"internalType":"uint256","name":"holdLimit","type":"uint256"}],"name":"setAntiWhalesConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum FeeHelper.TX_CASE","name":"feeCase","type":"uint8"},{"internalType":"uint16","name":"marketingFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"burnFee","type":"uint16"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"setMarketingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSwapRouter","type":"address"}],"name":"setSwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setThresholdAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum FeeHelper.TX_CASE","name":"feeCase","type":"uint8"}],"name":"viewFees","outputs":[{"components":[{"internalType":"uint16","name":"marketingFee","type":"uint16"},{"internalType":"uint16","name":"treasuryFee","type":"uint16"},{"internalType":"uint16","name":"burnFee","type":"uint16"}],"internalType":"struct FeeHelper.TokenFee","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewHoldLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewMarketingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewMarketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewSwapRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewThresholdAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewTreasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewTxLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052690a968163f0a57b4000006004556969e10de76676d08000006005556011805460ff60a81b1916600160a81b17905569021e19e0c9bab24000006012553480156200004e57600080fd5b506040516200302438038062003024833981016040819052620000719162000422565b600080546001600160a01b03191633908117825560405184928492918291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350336000818152600160208181526040808420805460ff1990811685179091557fb34209a263f6c38fe55f099e9e70f9d67e93982480ff3234a5e0108028ad164d80548216851790557fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb498054821685179055308086528286208054831686179055868652600280855283872080548416871790557f6a9609baa168169acaea398c4407efea4be641bb08e21e88806d9836fd9333cc80548416871790557fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b805484168717905581875283872080548416871790559686526007845282862080548316861790557fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d80548316861790557f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df805483168617905585529084208054909116909217909155600690527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f880547f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a31805465ffffffffffff199092166432003200641790925564960000019065ffff0000ffff19918216179091557f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29805493909252919091166496000001f4179055600c620002d383826200051b565b50600d620002e282826200051b565b505050620002ff620002f96200030760201b60201c565b6200030b565b5050620005e7565b3390565b600e80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed90600090a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200038557600080fd5b81516001600160401b0380821115620003a257620003a26200035d565b604051601f8301601f19908116603f01168101908282118183101715620003cd57620003cd6200035d565b81604052838152602092508683858801011115620003ea57600080fd5b600091505b838210156200040e5785820183015181830184015290820190620003ef565b600093810190920192909252949350505050565b600080604083850312156200043657600080fd5b82516001600160401b03808211156200044e57600080fd5b6200045c8683870162000373565b935060208501519150808211156200047357600080fd5b50620004828582860162000373565b9150509250929050565b600181811c90821680620004a157607f821691505b602082108103620004c257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200051657600081815260208120601f850160051c81016020861015620004f15750805b601f850160051c820191505b818110156200051257828155600101620004fd565b5050505b505050565b81516001600160401b038111156200053757620005376200035d565b6200054f816200054884546200048c565b84620004c8565b602080601f8311600181146200058757600084156200056e5750858301515b600019600386901b1c1916600185901b17855562000512565b600085815260208120601f198616915b82811015620005b85788860151825594840194600190910190840162000597565b5085821015620005d75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612a2d80620005f76000396000f3fe608060405234801561001057600080fd5b50600436106102bb5760003560e01c8063715018a611610182578063a9059cbb116100e9578063d045a824116100a2578063dd62ed3e1161007c578063dd62ed3e14610697578063e1511372146106d0578063f2fde38b146106fc578063f3ec8cc31461070f57600080fd5b8063d045a82414610647578063d2a09c7114610658578063dbac26e91461066b57600080fd5b8063a9059cbb146105b8578063aa324667146105cb578063b3195dea146105d3578063b9038fe114610613578063c4467db414610623578063c6a306471461063457600080fd5b8063961e2e7c1161013b578063961e2e7c1461053857806397d70ac61461054b578063989763ef14610553578063a0712d681461057f578063a457c2d714610592578063a8602fea146105a557600080fd5b8063715018a6146104de5780637cdcdea3146104e657806382fa05ed146104f95780638da5cb5b1461050c578063931e48e61461051d57806395d89b411461053057600080fd5b8063313ce5671161022657806342966c68116101df57806342966c68146104645780635275c70314610477578063570ca7351461047f5780635d098b38146104905780636ddd1713146104a357806370a08231146104b557600080fd5b8063313ce567146103cb57806336767731146103da57806339509351146103ff57806340c10f19146104125780634127365714610425578063418135371461043857600080fd5b806320d947e81161027857806320d947e81461036757806323b872dd1461037757806329605e771461038a5780632ab6f8db1461039d5780632d5a5d34146103a557806330280a71146103b857600080fd5b80630146e278146102c057806306fdde03146102d5578063095ea7b3146102f357806316b2a5a31461031657806318160ddd146103295780631fac0e521461033b575b600080fd5b6102d36102ce3660046125dc565b610720565b005b6102dd61077e565b6040516102ea9190612611565b60405180910390f35b61030661030136600461265f565b610810565b60405190151581526020016102ea565b6102d36103243660046125dc565b610827565b600b545b6040519081526020016102ea565b61030661034936600461268b565b6001600160a01b031660009081526001602052604090205460ff1690565b61032d68056bc75e2d6310000081565b6103066103853660046126af565b61087c565b6102d361039836600461268b565b61092d565b6102d36109a9565b6102d36103b33660046125dc565b6109bd565b6102d36103c63660046125dc565b610a12565b604051601281526020016102ea565b6013546001600160a01b03165b6040516001600160a01b0390911681526020016102ea565b61030661040d36600461265f565b610a67565b6102d361042036600461265f565b610a9e565b6102d361043336600461268b565b610ab4565b61030661044636600461268b565b6001600160a01b031660009081526008602052604090205460ff1690565b6102d36104723660046126f0565b610b4c565b60125461032d565b600e546001600160a01b03166103e7565b6102d361049e36600461268b565b610b56565b601154600160a81b900460ff16610306565b61032d6104c336600461268b565b6001600160a01b031660009081526009602052604090205490565b6102d3610bf8565b6102d36104f436600461268b565b610c6c565b6102d361050736600461272a565b610cb8565b6000546001600160a01b03166103e7565b6102d361052b36600461277e565b610e36565b6102dd610f1d565b6102d36105463660046126f0565b610f2c565b60055461032d565b61030661056136600461268b565b6001600160a01b031660009081526007602052604090205460ff1690565b6102d361058d3660046126f0565b610f9f565b6103066105a036600461265f565b610fb1565b6102d36105b336600461268b565b61104c565b6103066105c636600461265f565b6110ee565b60045461032d565b6105e66105e13660046127a0565b6110fb565b60408051825161ffff908116825260208085015182169083015292820151909216908201526060016102ea565b61032d683635c9adc5dea0000081565b600f546001600160a01b03166103e7565b6102d36106423660046125dc565b611188565b6011546001600160a01b03166103e7565b6102d36106663660046127bb565b6111dd565b61030661067936600461268b565b6001600160a01b031660009081526003602052604090205460ff1690565b61032d6106a53660046127d6565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205490565b6103066106de36600461268b565b6001600160a01b031660009081526002602052604090205460ff1690565b6102d361070a36600461268b565b611225565b6010546001600160a01b03166103e7565b6000546001600160a01b031633146107535760405162461bcd60e51b815260040161074a9061280f565b60405180910390fd5b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6060600c805461078d90612844565b80601f01602080910402602001604051908101604052809291908181526020018280546107b990612844565b80156108065780601f106107db57610100808354040283529160200191610806565b820191906000526020600020905b8154815290600101906020018083116107e957829003601f168201915b5050505050905090565b600061081d33848461130f565b5060015b92915050565b6000546001600160a01b031633146108515760405162461bcd60e51b815260040161074a9061280f565b6001600160a01b03919091166000908152600260205260409020805460ff1916911515919091179055565b6000610889848484611434565b6001600160a01b0384166000908152600a602090815260408083203384529091529020548281101561090e5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b606482015260840161074a565b610922853361091d8685612894565b61130f565b506001949350505050565b6109356114f4565b6001600160a01b03811661099d5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c653a206e6577206f70657261746f7220697320746865207a65726044820152686f206164647265737360b81b606482015260840161074a565b6109a68161155d565b50565b6109b16114f4565b6109bb600061155d565b565b6000546001600160a01b031633146109e75760405162461bcd60e51b815260040161074a9061280f565b6001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314610a3c5760405162461bcd60e51b815260040161074a9061280f565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b336000818152600a602090815260408083206001600160a01b0387168452909152812054909161081d91859061091d9086906128a7565b610aa66114f4565b610ab082826115af565b5050565b6000546001600160a01b03163314610ade5760405162461bcd60e51b815260040161074a9061280f565b6001600160a01b038116610b2a5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21039bbb0b8103937baba32b960691b604482015260640161074a565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6109a633826115c5565b6000546001600160a01b03163314610b805760405162461bcd60e51b815260040161074a9061280f565b6001600160a01b038116610bd65760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206d61726b6574696e672077616c6c65740000000000000000604482015260640161074a565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610c225760405162461bcd60e51b815260040161074a9061280f565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610c965760405162461bcd60e51b815260040161074a9061280f565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610ce25760405162461bcd60e51b815260040161074a9061280f565b61271081610cf084866128ba565b610cfa91906128ba565b61ffff161115610d375760405162461bcd60e51b81526020600482015260086024820152674f766572666c6f7760c01b604482015260640161074a565b8260066000866002811115610d4e57610d4e6128dc565b6002811115610d5f57610d5f6128dc565b815260200190815260200160002060000160006101000a81548161ffff021916908361ffff1602179055508160066000866002811115610da157610da16128dc565b6002811115610db257610db26128dc565b815260200190815260200160002060000160026101000a81548161ffff021916908361ffff1602179055508060066000866002811115610df457610df46128dc565b6002811115610e0557610e056128dc565b815260200190815260200160002060000160046101000a81548161ffff021916908361ffff16021790555050505050565b6000546001600160a01b03163314610e605760405162461bcd60e51b815260040161074a9061280f565b68056bc75e2d63100000821015610eb95760405162461bcd60e51b815260206004820152601760248201527f4d617820747820616d6f756e7420746f6f20736d616c6c000000000000000000604482015260640161074a565b683635c9adc5dea00000811015610f125760405162461bcd60e51b815260206004820152601b60248201527f4d61782077616c6c657420616d6f756e7420746f6f20736d616c6c0000000000604482015260640161074a565b600491909155600555565b6060600d805461078d90612844565b6000546001600160a01b03163314610f565760405162461bcd60e51b815260040161074a9061280f565b60008111610f9a5760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081d1a1c995cda1bdb19607a1b604482015260640161074a565b601255565b610fa76114f4565b6109a633826115af565b336000908152600a602090815260408083206001600160a01b0386168452909152812054828110156110335760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161074a565b611042338561091d8685612894565b5060019392505050565b6000546001600160a01b031633146110765760405162461bcd60e51b815260040161074a9061280f565b6001600160a01b0381166110cc5760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642074726561737572792077616c6c6574000000000000000000604482015260640161074a565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b600061081d338484611434565b60408051606081018252600080825260208201819052918101919091526006600083600281111561112e5761112e6128dc565b600281111561113f5761113f6128dc565b815260208082019290925260409081016000208151606081018352905461ffff808216835262010000820481169483019490945264010000000090049092169082015292915050565b6000546001600160a01b031633146111b25760405162461bcd60e51b815260040161074a9061280f565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146112075760405162461bcd60e51b815260040161074a9061280f565b60118054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b0316331461124f5760405162461bcd60e51b815260040161074a9061280f565b6001600160a01b0381166112b45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161074a565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166113715760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161074a565b6001600160a01b0382166113d25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161074a565b6001600160a01b038381166000818152600a602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600081116114745760405162461bcd60e51b815260206004820152600d60248201526c2d32b937903a3930b739b332b960991b604482015260640161074a565b30600090815260096020526040812054908061149086866115db565b6011549193509150600160a01b900460ff161580156114ac5750815b80156114c15750601154600160a81b900460ff165b80156114cf57506012548310155b156114df576114df601254611805565b6114ec86868685856118c1565b505050505050565b600e546001600160a01b031633146109bb5760405162461bcd60e51b815260206004820152602660248201527f4f706572617461626c653a2063616c6c6572206973206e6f7420746865206f7060448201526532b930ba37b960d11b606482015260840161074a565b600e80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed90600090a35050565b6115b98282611a7c565b610ab060008383611b5b565b6115cf8282611d4d565b610ab082600083611b5b565b6001600160a01b038216600090815260076020526040812054819060ff168061161c57506001600160a01b03831660009081526007602052604090205460ff165b1561162a57600091506117fe565b6001600160a01b03841660009081526008602052604090205460ff16156116d3576001600090815260066020908152604080516060810182527f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a315461ffff8082168084526201000083048216958401869052640100000000909204169282018390529093926116b8916128ba565b6116c291906128ba565b61ffff1611925060019150506117fe565b6001600160a01b03831660009081526008602052604090205460ff161561177c576002600090815260066020908152604080516060810182527f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace295461ffff808216808452620100008304821695840186905264010000000090920416928201839052909392611761916128ba565b61176b91906128ba565b61ffff1611925060029150506117fe565b600080805260066020908152604080516060810182527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85461ffff8082168084526201000083048216958401869052640100000000909204169282018390529093926117e7916128ba565b6117f191906128ba565b61ffff1611925060009150505b9250929050565b6011805460ff60a01b1916600160a01b179055601054306001600160a01b03919091160361186257600f546118459030906001600160a01b031683611e9c565b600f5461185d9030906001600160a01b031683611b5b565b6118b1565b601054611877906001600160a01b0316612074565b1561189357600f5461185d9082906001600160a01b03166120ad565b601054600f546118b1916001600160a01b03908116918491166122f4565b506011805460ff60a01b19169055565b8115611a59576000600660008360028111156118df576118df6128dc565b60028111156118f0576118f06128dc565b8152602081019190915260400160009081205461ffff16915060068184600281111561191e5761191e6128dc565b600281111561192f5761192f6128dc565b8152602081019190915260400160009081205462010000900461ffff169150600681856002811115611963576119636128dc565b6002811115611974576119746128dc565b81526020810191909152604001600090812054640100000000900461ffff1691506127106119a283896128f2565b6119ac9190612909565b905060006127106119c161ffff86168a6128f2565b6119cb9190612909565b905060006127106119e061ffff88168b6128f2565b6119ea9190612909565b90508215611a09576119fc8b846115c5565b611a06838a612894565b98505b8115611a3457601154611a27908c906001600160a01b031684611e9c565b611a31828a612894565b98505b8015611a5257611a458b3083611e9c565b611a4f818a612894565b98505b5050505050505b8215611a7557611a6a858585611e9c565b611a75858585611b5b565b5050505050565b6001600160a01b038216611ad25760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161074a565b80600b6000828254611ae491906128a7565b90915550506001600160a01b03821660009081526009602052604081208054839290611b119084906128a7565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b03831660009081526003602052604090205460ff16158015611b9d57506001600160a01b03821660009081526003602052604090205460ff16155b611bdf5760405162461bcd60e51b8152602060048201526013602482015272189b1858dadb1a5cdd1959081858d8dbdd5b9d606a1b604482015260640161074a565b6001600160a01b03831660009081526001602052604090205460ff1680611c1e57506001600160a01b03821660009081526001602052604090205460ff165b80611c2b57506004548111155b611c6b5760405162461bcd60e51b8152602060048201526011602482015270151e08185b5bdd5b9d081b1a5b5a5d1959607a1b604482015260640161074a565b6001600160a01b03821660009081526002602052604090205460ff1680611cac57506005546001600160a01b03831660009081526009602052604090205411155b611cf05760405162461bcd60e51b8152602060048201526015602482015274149958d95a5d995c881a1bdb19081b1a5b5a5d1959605a1b604482015260640161074a565b6acecb8f27f4200f3a000000611d05600b5490565b1115611d485760405162461bcd60e51b815260206004820152601260248201527145786365656473204d41585f535550504c5960701b604482015260640161074a565b505050565b6001600160a01b038216611dad5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161074a565b6001600160a01b03821660009081526009602052604090205481811015611e215760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161074a565b611e2b8282612894565b6001600160a01b038416600090815260096020526040812091909155600b8054849290611e59908490612894565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611427565b6001600160a01b038316611f005760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161074a565b6001600160a01b038216611f625760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161074a565b6001600160a01b03831660009081526009602052604090205481811015611fda5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161074a565b611fe48282612894565b6001600160a01b03808616600090815260096020526040808220939093559085168152908120805484929061201a9084906128a7565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161206691815260200190565b60405180910390a350505050565b60006001600160a01b038216158061082157506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1492915050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106120e2576120e261292b565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561213b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215f9190612941565b816001815181106121725761217261292b565b6001600160a01b039283166020918202929092010152601354612198913091168561130f565b6013546001600160a01b0380841631911663791ac94785600085876121bf4261012c6128a7565b6040518663ffffffff1660e01b81526004016121df9594939291906129a2565b600060405180830381600087803b1580156121f957600080fd5b505af192505050801561220a575060015b612288573d808015612238576040519150601f19603f3d011682016040523d82523d6000602084013e61223d565b606091505b506010546040518681526001600160a01b038681169216907f606d992ad3ca50e926e8cc0a69c5f8b2582c664c584cd4c4f43037d392e5ddbc9060200160405180910390a3506122ee565b600061229e826001600160a01b03861631612894565b60105460408051888152602081018490529293506001600160a01b03878116939216917ff9d1427f4e951dab492e12d5a69efc72debccbeaf18ddeb9d576c1fc6a0dc1f9910160405180910390a3505b50505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106123295761232961292b565b60200260200101906001600160a01b031690816001600160a01b031681525050838160018151811061235d5761235d61292b565b6001600160a01b039283166020918202929092010152601354612383913091168561130f565b6010546040516370a0823160e01b81526001600160a01b03848116600483015260009216906370a0823190602401602060405180830381865afa1580156123ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123f291906129de565b6013549091506001600160a01b0316635c11d79585600085876124174261012c6128a7565b6040518663ffffffff1660e01b81526004016124379594939291906129a2565b600060405180830381600087803b15801561245157600080fd5b505af1925050508015612462575060015b6124e0573d808015612490576040519150601f19603f3d011682016040523d82523d6000602084013e612495565b606091505b506010546040518681526001600160a01b038681169216907f606d992ad3ca50e926e8cc0a69c5f8b2582c664c584cd4c4f43037d392e5ddbc9060200160405180910390a350611a75565b6010546040516370a0823160e01b81526001600160a01b03858116600483015260009284929116906370a0823190602401602060405180830381865afa15801561252e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061255291906129de565b61255c9190612894565b60105460408051888152602081018490529293506001600160a01b03878116939216917ff9d1427f4e951dab492e12d5a69efc72debccbeaf18ddeb9d576c1fc6a0dc1f9910160405180910390a3505050505050565b6001600160a01b03811681146109a657600080fd5b803580151581146125d757600080fd5b919050565b600080604083850312156125ef57600080fd5b82356125fa816125b2565b9150612608602084016125c7565b90509250929050565b600060208083528351808285015260005b8181101561263e57858101830151858201604001528201612622565b506000604082860101526040601f19601f8301168501019250505092915050565b6000806040838503121561267257600080fd5b823561267d816125b2565b946020939093013593505050565b60006020828403121561269d57600080fd5b81356126a8816125b2565b9392505050565b6000806000606084860312156126c457600080fd5b83356126cf816125b2565b925060208401356126df816125b2565b929592945050506040919091013590565b60006020828403121561270257600080fd5b5035919050565b8035600381106125d757600080fd5b803561ffff811681146125d757600080fd5b6000806000806080858703121561274057600080fd5b61274985612709565b935061275760208601612718565b925061276560408601612718565b915061277360608601612718565b905092959194509250565b6000806040838503121561279157600080fd5b50508035926020909101359150565b6000602082840312156127b257600080fd5b6126a882612709565b6000602082840312156127cd57600080fd5b6126a8826125c7565b600080604083850312156127e957600080fd5b82356127f4816125b2565b91506020830135612804816125b2565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061285857607f821691505b60208210810361287857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108215761082161287e565b808201808211156108215761082161287e565b61ffff8181168382160190808211156128d5576128d561287e565b5092915050565b634e487b7160e01b600052602160045260246000fd5b80820281158282048414176108215761082161287e565b60008261292657634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561295357600080fd5b81516126a8816125b2565b600081518084526020808501945080840160005b838110156129975781516001600160a01b031687529582019590820190600101612972565b509495945050505050565b85815284602082015260a0604082015260006129c160a083018661295e565b6001600160a01b0394909416606083015250608001529392505050565b6000602082840312156129f057600080fd5b505191905056fea2646970667358221220690299b5dbbb8d0e010fdf3a344f7356c9bcc306c080f17a2cd3c4afa20b73ae64736f6c63430008130033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004546573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045453543100000000000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004546573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045453543100000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): Test
Arg [1] : symbol_ (string): TST1
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [3] : 5465737400000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 5453543100000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
38403:11312:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37928:147;;;;;;:::i;:::-;;:::i;:::-;;8861:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11028:169;;;;;;:::i;:::-;;:::i;:::-;;;1673:14:1;;1666:22;1648:41;;1636:2;1621:18;11028:169:0;1508:187:1;32499:157:0;;;;;;:::i;:::-;;:::i;9981:108::-;10069:12;;9981:108;;;1846:25:1;;;1834:2;1819:18;9981:108:0;1700:177:1;32239:130:0;;;;;;:::i;:::-;-1:-1:-1;;;;;32332:29:0;32308:4;32332:29;;;:20;:29;;;;;;;;;32239:130;30540:59;;30590:9;30540:59;;11679:422;;;;;;:::i;:::-;;:::i;19862:214::-;;;;;;:::i;:::-;;:::i;19598:104::-;;;:::i;31471:118::-;;;;;;:::i;:::-;;:::i;31966:130::-;;;;;;:::i;:::-;;:::i;9823:93::-;;;9906:2;2737:36:1;;2725:2;2710:18;9823:93:0;2595:184:1;42344:104:0;42428:11;;-1:-1:-1;;;;;42428:11:0;42344:104;;;-1:-1:-1;;;;;2948:32:1;;;2930:51;;2918:2;2903:18;42344:104:0;2784:203:1;12510:215:0;;;;;;:::i;:::-;;:::i;39654:110::-;;;;;;:::i;:::-;;:::i;42133:203::-;;;;;;:::i;:::-;;:::i;38154:116::-;;;;;;:::i;:::-;-1:-1:-1;;;;;38240:22:0;38216:4;38240:22;;;:11;:22;;;;;;;;;38154:116;40239:85;;;;;;:::i;:::-;;:::i;43777:105::-;43858:16;;43777:105;;18915:93;18991:9;;-1:-1:-1;;;;;18991:9:0;18915:93;;42650:175;;;;;;:::i;:::-;;:::i;42552:90::-;42622:12;;-1:-1:-1;;;42622:12:0;;;;42552:90;;10152:127;;;;;;:::i;:::-;-1:-1:-1;;;;;10253:18:0;10226:7;10253:18;;;:9;:18;;;;;;;10152:127;2762:148;;;:::i;42946:103::-;;;;;;:::i;:::-;;:::i;35496:399::-;;;;;;:::i;:::-;;:::i;2111:87::-;2157:7;2184:6;-1:-1:-1;;;;;2184:6:0;2111:87;;33214:393;;;;;;:::i;:::-;;:::i;9080:104::-;;;:::i;43611:158::-;;;;;;:::i;:::-;;:::i;33615:93::-;33690:10;;33615:93;;36273:122;;;;;;:::i;:::-;-1:-1:-1;;;;;36362:25:0;36338:4;36362:25;;;:16;:25;;;;;;;;;36273:122;39548:98;;;;;;:::i;:::-;;:::i;13228:377::-;;;;;;:::i;:::-;;:::i;43168:172::-;;;;;;:::i;:::-;;:::i;10492:175::-;;;;;;:::i;:::-;;:::i;33716:89::-;33789:8;;33716:89;;36403:120;;;;;;:::i;:::-;;:::i;:::-;;;;4625:13:1;;4588:6;4621:22;;;4603:41;;4704:4;4692:17;;;4686:24;4682:33;;4660:20;;;4653:63;4764:17;;;4758:24;4754:33;;;4732:20;;;4725:63;4566:2;4551:18;36403:120:0;4380:414:1;30606:64:0;;30660:10;30606:64;;42833:105;42914:16;;-1:-1:-1;;;;;42914:16:0;42833:105;;36012:122;;;;;;:::i;:::-;;:::i;43348:103::-;43428:15;;-1:-1:-1;;;;;43428:15:0;43348:103;;42456:88;;;;;;:::i;:::-;;:::i;31728:112::-;;;;;;:::i;:::-;-1:-1:-1;;;;;31813:19:0;31789:4;31813:19;;;:10;:19;;;;;;;;;31728:112;10730:151;;;;;;:::i;:::-;-1:-1:-1;;;;;10846:18:0;;;10819:7;10846:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10730:151;32803:166;;;;;;:::i;:::-;-1:-1:-1;;;;;32930:31:0;32901:4;32930:31;;;:22;:31;;;;;;;;;32803:166;3065:244;;;;;;:::i;:::-;;:::i;43057:103::-;43137:15;;-1:-1:-1;;;;;43137:15:0;43057:103;;37928:147;2157:7;2184:6;-1:-1:-1;;;;;2184:6:0;741:10;2331:23;2323:68;;;;-1:-1:-1;;;2323:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;38038:22:0;;;::::1;;::::0;;;:11:::1;:22;::::0;;;;:29;;-1:-1:-1;;38038:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37928:147::o;8861:100::-;8915:13;8948:5;8941:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8861:100;:::o;11028:169::-;11111:4;11128:39;741:10;11151:7;11160:6;11128:8;:39::i;:::-;-1:-1:-1;11185:4:0;11028:169;;;;;:::o;32499:157::-;2157:7;2184:6;-1:-1:-1;;;;;2184:6:0;741:10;2331:23;2323:68;;;;-1:-1:-1;;;2323:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32610:31:0;;;::::1;;::::0;;;:22:::1;:31;::::0;;;;:38;;-1:-1:-1;;32610:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32499:157::o;11679:422::-;11785:4;11802:36;11812:6;11820:9;11831:6;11802:9;:36::i;:::-;-1:-1:-1;;;;;11878:19:0;;11851:24;11878:19;;;:11;:19;;;;;;;;741:10;11878:33;;;;;;;;11930:26;;;;11922:79;;;;-1:-1:-1;;;11922:79:0;;6325:2:1;11922:79:0;;;6307:21:1;6364:2;6344:18;;;6337:30;6403:34;6383:18;;;6376:62;-1:-1:-1;;;6454:18:1;;;6447:38;6502:19;;11922:79:0;6123:404:1;11922:79:0;12012:57;12021:6;741:10;12043:25;12062:6;12043:16;:25;:::i;:::-;12012:8;:57::i;:::-;-1:-1:-1;12089:4:0;;11679:422;-1:-1:-1;;;;11679:422:0:o;19862:214::-;18795:16;:14;:16::i;:::-;-1:-1:-1;;;;;19956:25:0;::::1;19948:79;;;::::0;-1:-1:-1;;;19948:79:0;;6999:2:1;19948:79:0::1;::::0;::::1;6981:21:1::0;7038:2;7018:18;;;7011:30;7077:34;7057:18;;;7050:62;-1:-1:-1;;;7128:18:1;;;7121:39;7177:19;;19948:79:0::1;6797:405:1::0;19948:79:0::1;20038:30;20056:11;20038:17;:30::i;:::-;19862:214:::0;:::o;19598:104::-;18795:16;:14;:16::i;:::-;19665:29:::1;19691:1;19665:17;:29::i;:::-;19598:104::o:0;31471:118::-;2157:7;2184:6;-1:-1:-1;;;;;2184:6:0;741:10;2331:23;2323:68;;;;-1:-1:-1;;;2323:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31555:19:0;;;::::1;;::::0;;;:10:::1;:19;::::0;;;;:26;;-1:-1:-1;;31555:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31471:118::o;31966:130::-;2157:7;2184:6;-1:-1:-1;;;;;2184:6:0;741:10;2331:23;2323:68;;;;-1:-1:-1;;;2323:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32052:29:0;;;::::1;;::::0;;;:20:::1;:29;::::0;;;;:36;;-1:-1:-1;;32052:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31966:130::o;12510:215::-;741:10;12598:4;12647:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12647:34:0;;;;;;;;;;12598:4;;12615:80;;12638:7;;12647:47;;12684:10;;12647:47;:::i;39654:110::-;18795:16;:14;:16::i;:::-;39734:22:::1;39740:7;39749:6;39734:5;:22::i;:::-;39654:110:::0;;:::o;42133:203::-;2157:7;2184:6;-1:-1:-1;;;;;2184:6:0;741:10;2331:23;2323:68;;;;-1:-1:-1;;;2323:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42217:27:0;::::1;42209:59;;;::::0;-1:-1:-1;;;42209:59:0;;7539:2:1;42209:59:0::1;::::0;::::1;7521:21:1::0;7578:2;7558:18;;;7551:30;-1:-1:-1;;;7597:18:1;;;7590:49;7656:18;;42209:59:0::1;7337:343:1::0;42209:59:0::1;42281:11;:47:::0;;-1:-1:-1;;;;;;42281:47:0::1;-1:-1:-1::0;;;;;42281:47:0;;;::::1;::::0;;;::::1;::::0;;42133:203::o;40239:85::-;40289:27;741:10;40309:6;40289:5;:27::i;42650:175::-;2157:7;2184:6;-1:-1:-1;;;;;2184:6:0;741:10;2331:23;2323:68;;;;-1:-1:-1;;;2323:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42732:20:0;::::1;42724:57;;;::::0;-1:-1:-1;;;42724:57:0;;7887:2:1;42724:57:0::1;::::0;::::1;7869:21:1::0;7926:2;7906:18;;;7899:30;7965:26;7945:18;;;7938:54;8009:18;;42724:57:0::1;7685:348:1::0;42724:57:0::1;42792:16;:25:::0;;-1:-1:-1;;;;;;42792:25:0::1;-1:-1:-1::0;;;;;42792:25:0;;;::::1;::::0;;;::::1;::::0;;42650:175::o;2762:148::-;2157:7;2184:6;-1:-1:-1;;;;;2184:6:0;741:10;2331:23;2323:68;;;;-1:-1:-1;;;2323:68:0;;;;;;;:::i;:::-;2869:1:::1;2853:6:::0;;2832:40:::1;::::0;-1:-1:-1;;;;;2853:6:0;;::::1;::::0;2832:40:::1;::::0;2869:1;;2832:40:::1;2900:1;2883:19:::0;;-1:-1:-1;;;;;;2883:19:0::1;::::0;;2762:148::o;42946:103::-;2157:7;2184:6;-1:-1:-1;;;;;2184:6:0;741:10;2331:23;2323:68;;;;-1:-1:-1;;;2323:68:0;;;;;;;:::i;:::-;43018:15:::1;:23:::0;;-1:-1:-1;;;;;;43018:23:0::1;-1:-1:-1::0;;;;;43018:23:0;;;::::1;::::0;;;::::1;::::0;;42946:103::o;35496:399::-;2157:7;2184:6;-1:-1:-1;;;;;2184:6:0;741:10;2331:23;2323:68;;;;-1:-1:-1;;;2323:68:0;;;;;;;:::i;:::-;35707:5:::1;35696:7:::0;35667:26:::1;35682:11:::0;35667:12;:26:::1;:::i;:::-;:36;;;;:::i;:::-;:45;;;;35659:66;;;::::0;-1:-1:-1;;;35659:66:0;;8413:2:1;35659:66:0::1;::::0;::::1;8395:21:1::0;8452:1;8432:18;;;8425:29;-1:-1:-1;;;8470:18:1;;;8463:38;8518:18;;35659:66:0::1;8211:331:1::0;35659:66:0::1;35771:12;35736:10;:19;35747:7;35736:19;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:32;;;:47;;;;;;;;;;;;;;;;;;35828:11;35794:10;:19;35805:7;35794:19;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;;:45;;;;;;;;;;;;;;;;;;35880:7;35850:10;:19;35861:7;35850:19;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:27;;;:37;;;;;;;;;;;;;;;;;;35496:399:::0;;;;:::o;33214:393::-;2157:7;2184:6;-1:-1:-1;;;;;2184:6:0;741:10;2331:23;2323:68;;;;-1:-1:-1;;;2323:68:0;;;;;;;:::i;:::-;30590:9:::1;33347:7;:34;;33339:70;;;::::0;-1:-1:-1;;;33339:70:0;;8881:2:1;33339:70:0::1;::::0;::::1;8863:21:1::0;8920:2;8900:18;;;8893:30;8959:25;8939:18;;;8932:53;9002:18;;33339:70:0::1;8679:347:1::0;33339:70:0::1;30660:10;33442:9;:40;;33420:117;;;::::0;-1:-1:-1;;;33420:117:0;;9233:2:1;33420:117:0::1;::::0;::::1;9215:21:1::0;9272:2;9252:18;;;9245:30;9311:29;9291:18;;;9284:57;9358:18;;33420:117:0::1;9031:351:1::0;33420:117:0::1;33548:8;:18:::0;;;;33577:10:::1;:22:::0;33214:393::o;9080:104::-;9136:13;9169:7;9162:14;;;;;:::i;43611:158::-;2157:7;2184:6;-1:-1:-1;;;;;2184:6:0;741:10;2331:23;2323:68;;;;-1:-1:-1;;;2323:68:0;;;;;;;:::i;:::-;43702:1:::1;43693:6;:10;43685:40;;;::::0;-1:-1:-1;;;43685:40:0;;9589:2:1;43685:40:0::1;::::0;::::1;9571:21:1::0;9628:2;9608:18;;;9601:30;-1:-1:-1;;;9647:18:1;;;9640:47;9704:18;;43685:40:0::1;9387:341:1::0;43685:40:0::1;43736:16;:25:::0;43611:158::o;39548:98::-;18795:16;:14;:16::i;:::-;39611:27:::1;741:10:::0;39631:6:::1;39611:5;:27::i;13228:377::-:0;741:10;13321:4;13365:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13365:34:0;;;;;;;;;;13418:35;;;;13410:85;;;;-1:-1:-1;;;13410:85:0;;9935:2:1;13410:85:0;;;9917:21:1;9974:2;9954:18;;;9947:30;10013:34;9993:18;;;9986:62;-1:-1:-1;;;10064:18:1;;;10057:35;10109:19;;13410:85:0;9733:401:1;13410:85:0;13506:67;741:10;13529:7;13538:34;13557:15;13538:16;:34;:::i;13506:67::-;-1:-1:-1;13593:4:0;;13228:377;-1:-1:-1;;;13228:377:0:o;43168:172::-;2157:7;2184:6;-1:-1:-1;;;;;2184:6:0;741:10;2331:23;2323:68;;;;-1:-1:-1;;;2323:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43249:20:0;::::1;43241:56;;;::::0;-1:-1:-1;;;43241:56:0;;10341:2:1;43241:56:0::1;::::0;::::1;10323:21:1::0;10380:2;10360:18;;;10353:30;10419:25;10399:18;;;10392:53;10462:18;;43241:56:0::1;10139:347:1::0;43241:56:0::1;43308:15;:24:::0;;-1:-1:-1;;;;;;43308:24:0::1;-1:-1:-1::0;;;;;43308:24:0;;;::::1;::::0;;;::::1;::::0;;43168:172::o;10492:175::-;10578:4;10595:42;741:10;10619:9;10630:6;10595:9;:42::i;36403:120::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;36496:10:0;:19;36507:7;36496:19;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;36496:19:0;36489:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36403:120;-1:-1:-1;;36403:120:0:o;36012:122::-;2157:7;2184:6;-1:-1:-1;;;;;2184:6:0;741:10;2331:23;2323:68;;;;-1:-1:-1;;;2323:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36094:25:0;;;::::1;;::::0;;;:16:::1;:25;::::0;;;;:32;;-1:-1:-1;;36094:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36012:122::o;42456:88::-;2157:7;2184:6;-1:-1:-1;;;;;2184:6:0;741:10;2331:23;2323:68;;;;-1:-1:-1;;;2323:68:0;;;;;;;:::i;:::-;42517:12:::1;:19:::0;;;::::1;;-1:-1:-1::0;;;42517:19:0::1;-1:-1:-1::0;;;;42517:19:0;;::::1;::::0;;;::::1;::::0;;42456:88::o;3065:244::-;2157:7;2184:6;-1:-1:-1;;;;;2184:6:0;741:10;2331:23;2323:68;;;;-1:-1:-1;;;2323:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3154:22:0;::::1;3146:73;;;::::0;-1:-1:-1;;;3146:73:0;;10693:2:1;3146:73:0::1;::::0;::::1;10675:21:1::0;10732:2;10712:18;;;10705:30;10771:34;10751:18;;;10744:62;-1:-1:-1;;;10822:18:1;;;10815:36;10868:19;;3146:73:0::1;10491:402:1::0;3146:73:0::1;3256:6;::::0;;3235:38:::1;::::0;-1:-1:-1;;;;;3235:38:0;;::::1;::::0;3256:6;::::1;::::0;3235:38:::1;::::0;::::1;3284:6;:17:::0;;-1:-1:-1;;;;;;3284:17:0::1;-1:-1:-1::0;;;;;3284:17:0;;;::::1;::::0;;;::::1;::::0;;3065:244::o;16584:346::-;-1:-1:-1;;;;;16686:19:0;;16678:68;;;;-1:-1:-1;;;16678:68:0;;11100:2:1;16678:68:0;;;11082:21:1;11139:2;11119:18;;;11112:30;11178:34;11158:18;;;11151:62;-1:-1:-1;;;11229:18:1;;;11222:34;11273:19;;16678:68:0;10898:400:1;16678:68:0;-1:-1:-1;;;;;16765:21:0;;16757:68;;;;-1:-1:-1;;;16757:68:0;;11505:2:1;16757:68:0;;;11487:21:1;11544:2;11524:18;;;11517:30;11583:34;11563:18;;;11556:62;-1:-1:-1;;;11634:18:1;;;11627:32;11676:19;;16757:68:0;11303:398:1;16757:68:0;-1:-1:-1;;;;;16838:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;16890:32;;1846:25:1;;;16890:32:0;;1819:18:1;16890:32:0;;;;;;;;16584:346;;;:::o;43890:1077::-;44031:1;44022:6;:10;44014:36;;;;-1:-1:-1;;;44014:36:0;;11908:2:1;44014:36:0;;;11890:21:1;11947:2;11927:18;;;11920:30;-1:-1:-1;;;11966:18:1;;;11959:43;12019:18;;44014:36:0;11706:337:1;44014:36:0;44394:4;44345:28;10253:18;;;:9;:18;;;;;;;44345:28;44511:26;44528:4;44534:2;44511:16;:26::i;:::-;44643:7;;44475:62;;-1:-1:-1;44475:62:0;-1:-1:-1;;;;44643:7:0;;;;44642:8;:35;;;;;44667:10;44642:35;:64;;;;-1:-1:-1;44694:12:0;;-1:-1:-1;;;44694:12:0;;;;44642:64;:121;;;;;44747:16;;44723:20;:40;;44642:121;44624:216;;;44790:38;44811:16;;44790:20;:38::i;:::-;44907:52;44922:4;44928:2;44932:6;44940:10;44952:6;44907:14;:52::i;:::-;44003:964;;;43890:1077;;;:::o;19089:144::-;18991:9;;-1:-1:-1;;;;;18991:9:0;741:10;19156:26;19148:77;;;;-1:-1:-1;;;19148:77:0;;12250:2:1;19148:77:0;;;12232:21:1;12289:2;12269:18;;;12262:30;12328:34;12308:18;;;12301:62;-1:-1:-1;;;12379:18:1;;;12372:36;12425:19;;19148:77:0;12048:402:1;20238:210:0;20336:9;;;-1:-1:-1;;;;;20356:23:0;;;-1:-1:-1;;;;;;20356:23:0;;;;;;;20395:45;;20336:9;;;20356:23;20336:9;;20395:45;;20314:19;;20395:45;20303:145;20238:210;:::o;40051:180::-;40136:28;40148:7;40157:6;40136:11;:28::i;:::-;40175:48;40203:1;40207:7;40216:6;40175:19;:48::i;40657:180::-;40742:28;40754:7;40763:6;40742:11;:28::i;:::-;40781:48;40801:7;40818:1;40822:6;40781:19;:48::i;36596:1247::-;-1:-1:-1;;;;;36803:22:0;;36698:15;36803:22;;;:16;:22;;;;;;36698:15;;36803:22;;;:46;;-1:-1:-1;;;;;;36829:20:0;;;;;;:16;:20;;;;;;;;36803:46;36799:1037;;;36879:5;36866:18;;36799:1037;;;-1:-1:-1;;;;;36941:17:0;;;;;;:11;:17;;;;;;;;36937:899;;;37011:11;36975:22;37000:23;;;:10;:23;;;;;36975:48;;;;;;;37000:23;36975:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:22;37069:40;;;:::i;:::-;:57;;;;:::i;:::-;37068:63;;;37038:93;;37155:11;37146:20;;36960:218;36937:899;;;-1:-1:-1;;;;;37224:15:0;;;;;;:11;:15;;;;;;;;37220:616;;;37293:12;37256:23;37282:24;;;:10;:24;;;;;37256:50;;;;;;;37282:24;37256:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;37352:42;;;:::i;:::-;:60;;;;:::i;:::-;37351:83;;;37321:113;;37458:12;37449:21;;37241:241;37220:616;;;37544:27;37574:28;;;:10;:28;;;;;37544:58;;;;;;;37574:28;37544:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:27;37648:71;;;:::i;:::-;:114;;;;:::i;:::-;37647:137;;;37617:167;;37808:16;37799:25;;37529:307;37220:616;36596:1247;;;;;:::o;46627:472::-;39378:7;:14;;-1:-1:-1;;;;39378:14:0;-1:-1:-1;;;39378:14:0;;;46708:15:::1;::::0;46735:4:::1;-1:-1:-1::0;;;;;46708:15:0;;;::::1;:32:::0;46704:388:::1;;46788:16;::::0;46757:56:::1;::::0;46781:4:::1;::::0;-1:-1:-1;;;;;46788:16:0::1;46806:6:::0;46757:15:::1;:56::i;:::-;46863:16;::::0;46828:60:::1;::::0;46856:4:::1;::::0;-1:-1:-1;;;;;46863:16:0::1;46881:6:::0;46828:19:::1;:60::i;:::-;46704:388;;;46916:15;::::0;46910:22:::1;::::0;-1:-1:-1;;;;;46916:15:0::1;46910:5;:22::i;:::-;46906:186;;;46975:16;::::0;46949:44:::1;::::0;46959:6;;-1:-1:-1;;;;;46975:16:0::1;46949:9;:44::i;46906:186::-;47038:15;::::0;47063:16:::1;::::0;47026:54:::1;::::0;-1:-1:-1;;;;;47038:15:0;;::::1;::::0;47055:6;;47063:16:::1;47026:11;:54::i;:::-;-1:-1:-1::0;39415:7:0;:15;;-1:-1:-1;;;;39415:15:0;;;46627:472::o;45049:1284::-;45232:10;45228:942;;;45259:19;45281:10;:18;45292:6;45281:18;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;45281:18:0;;;:31;;;;-1:-1:-1;45348:10:0;-1:-1:-1;45359:6:0;45348:18;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;45348:18:0;;;:30;;;;;;;-1:-1:-1;45410:10:0;-1:-1:-1;45421:6:0;45348:30;45410:18;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;45410:18:0;;;:26;;;;;;;-1:-1:-1;45498:5:0;45478:16;45410:26;45478:6;:16;:::i;:::-;45477:26;;;;:::i;:::-;45453:50;-1:-1:-1;45518:25:0;45571:5;45547:20;;;;:6;:20;:::i;:::-;45546:30;;;;:::i;:::-;45518:58;-1:-1:-1;45591:26:0;45646:5;45621:21;;;;:6;:21;:::i;:::-;45620:31;;;;:::i;:::-;45591:60;-1:-1:-1;45672:17:0;;45668:128;;45710:28;45716:6;45724:13;45710:5;:28::i;:::-;45757:23;45767:13;45757:23;;:::i;:::-;;;45668:128;45814:21;;45810:167;;45880:15;;45856:59;;45872:6;;-1:-1:-1;;;;;45880:15:0;45897:17;45856:15;:59::i;:::-;45934:27;45944:17;45934:27;;:::i;:::-;;;45810:167;45995:22;;45991:168;;46038:58;46054:6;46070:4;46077:18;46038:15;:58::i;:::-;46115:28;46125:18;46115:28;;:::i;:::-;;;45991:168;45244:926;;;;;;45228:942;46184:10;;46180:146;;46211:42;46227:6;46235:9;46246:6;46211:15;:42::i;:::-;46268:46;46288:6;46296:9;46307:6;46268:19;:46::i;:::-;45049:1284;;;;;:::o;14981:338::-;-1:-1:-1;;;;;15065:21:0;;15057:65;;;;-1:-1:-1;;;15057:65:0;;13052:2:1;15057:65:0;;;13034:21:1;13091:2;13071:18;;;13064:30;13130:33;13110:18;;;13103:61;13181:18;;15057:65:0;12850:355:1;15057:65:0;15213:6;15197:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;15230:18:0;;;;;;:9;:18;;;;;:28;;15252:6;;15230:18;:28;;15252:6;;15230:28;:::i;:::-;;;;-1:-1:-1;;15274:37:0;;1846:25:1;;;-1:-1:-1;;;;;15274:37:0;;;15291:1;;15274:37;;1834:2:1;1819:18;15274:37:0;;;;;;;14981:338;;:::o;41441:684::-;-1:-1:-1;;;;;41583:16:0;;;;;;:10;:16;;;;;;;;41582:17;:36;;;;-1:-1:-1;;;;;;41604:14:0;;;;;;:10;:14;;;;;;;;41603:15;41582:36;41574:68;;;;-1:-1:-1;;;41574:68:0;;13412:2:1;41574:68:0;;;13394:21:1;13451:2;13431:18;;;13424:30;-1:-1:-1;;;13470:18:1;;;13463:49;13529:18;;41574:68:0;13210:343:1;41574:68:0;-1:-1:-1;;;;;41708:26:0;;;;;;:20;:26;;;;;;;;;:71;;-1:-1:-1;;;;;;41755:24:0;;;;;;:20;:24;;;;;;;;41708:71;:110;;;;41810:8;;41800:6;:18;;41708:110;41686:177;;;;-1:-1:-1;;;41686:177:0;;13760:2:1;41686:177:0;;;13742:21:1;13799:2;13779:18;;;13772:30;-1:-1:-1;;;13818:18:1;;;13811:47;13875:18;;41686:177:0;13558:341:1;41686:177:0;-1:-1:-1;;;;;41940:26:0;;;;;;:22;:26;;;;;;;;;:57;;-1:-1:-1;41987:10:0;;-1:-1:-1;;;;;10253:18:0;;10226:7;10253:18;;;:9;:18;;;;;;41970:27;;41940:57;41918:128;;;;-1:-1:-1;;;41918:128:0;;14106:2:1;41918:128:0;;;14088:21:1;14145:2;14125:18;;;14118:30;-1:-1:-1;;;14164:18:1;;;14157:51;14225:18;;41918:128:0;13904:345:1;41918:128:0;38654:15;42067:13;10069:12;;;9981:108;42067:13;:27;;42059:58;;;;-1:-1:-1;;;42059:58:0;;14456:2:1;42059:58:0;;;14438:21:1;14495:2;14475:18;;;14468:30;-1:-1:-1;;;14514:18:1;;;14507:48;14572:18;;42059:58:0;14254:342:1;42059:58:0;41441:684;;;:::o;15652:494::-;-1:-1:-1;;;;;15736:21:0;;15728:67;;;;-1:-1:-1;;;15728:67:0;;14803:2:1;15728:67:0;;;14785:21:1;14842:2;14822:18;;;14815:30;14881:34;14861:18;;;14854:62;-1:-1:-1;;;14932:18:1;;;14925:31;14973:19;;15728:67:0;14601:397:1;15728:67:0;-1:-1:-1;;;;;15895:18:0;;15870:22;15895:18;;;:9;:18;;;;;;15932:24;;;;15924:71;;;;-1:-1:-1;;;15924:71:0;;15205:2:1;15924:71:0;;;15187:21:1;15244:2;15224:18;;;15217:30;15283:34;15263:18;;;15256:62;-1:-1:-1;;;15334:18:1;;;15327:32;15376:19;;15924:71:0;15003:398:1;15924:71:0;16027:23;16044:6;16027:14;:23;:::i;:::-;-1:-1:-1;;;;;16006:18:0;;;;;;:9;:18;;;;;:44;;;;16061:12;:22;;16077:6;;16006:18;16061:22;;16077:6;;16061:22;:::i;:::-;;;;-1:-1:-1;;16101:37:0;;1846:25:1;;;16127:1:0;;-1:-1:-1;;;;;16101:37:0;;;;;1834:2:1;1819:18;16101:37:0;1700:177:1;14095:604:0;-1:-1:-1;;;;;14201:20:0;;14193:70;;;;-1:-1:-1;;;14193:70:0;;15608:2:1;14193:70:0;;;15590:21:1;15647:2;15627:18;;;15620:30;15686:34;15666:18;;;15659:62;-1:-1:-1;;;15737:18:1;;;15730:35;15782:19;;14193:70:0;15406:401:1;14193:70:0;-1:-1:-1;;;;;14282:23:0;;14274:71;;;;-1:-1:-1;;;14274:71:0;;16014:2:1;14274:71:0;;;15996:21:1;16053:2;16033:18;;;16026:30;16092:34;16072:18;;;16065:62;-1:-1:-1;;;16143:18:1;;;16136:33;16186:19;;14274:71:0;15812:399:1;14274:71:0;-1:-1:-1;;;;;14442:17:0;;14418:21;14442:17;;;:9;:17;;;;;;14478:23;;;;14470:74;;;;-1:-1:-1;;;14470:74:0;;16418:2:1;14470:74:0;;;16400:21:1;16457:2;16437:18;;;16430:30;16496:34;16476:18;;;16469:62;-1:-1:-1;;;16547:18:1;;;16540:36;16593:19;;14470:74:0;16216:402:1;14470:74:0;14575:22;14591:6;14575:13;:22;:::i;:::-;-1:-1:-1;;;;;14555:17:0;;;;;;;:9;:17;;;;;;:42;;;;14608:20;;;;;;;;:30;;14632:6;;14555:17;14608:30;;14632:6;;14608:30;:::i;:::-;;;;;;;;14673:9;-1:-1:-1;;;;;14656:35:0;14665:6;-1:-1:-1;;;;;14656:35:0;;14684:6;14656:35;;;;1846:25:1;;1834:2;1819:18;;1700:177;14656:35:0;;;;;;;;14182:517;14095:604;;;:::o;49582:130::-;49635:4;-1:-1:-1;;;;;49660:19:0;;;;:43;;-1:-1:-1;;;;;;49683:20:0;;38575:42;49683:20;49652:52;49582:130;-1:-1:-1;;49582:130:0:o;48346:1228::-;48504:16;;;48518:1;48504:16;;;;;;;;48480:21;;48504:16;;;;;;;;;;-1:-1:-1;48504:16:0;48480:40;;48549:4;48531;48536:1;48531:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;48531:23:0;;;:7;;;;;;;;;;:23;;;;48575:11;;:18;;;-1:-1:-1;;;48575:18:0;;;;:11;;;;;:16;;:18;;;;;48531:7;;48575:18;;;;;:11;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48565:4;48570:1;48565:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;48565:28:0;;;:7;;;;;;;;;:28;48638:11;;48606:53;;48623:4;;48638:11;48652:6;48606:8;:53::i;:::-;48824:11;;-1:-1:-1;;;;;48758:10:0;;;;;48824:11;:62;48905:6;48734:21;48978:4;48758:2;49022:21;:15;49040:3;49022:21;:::i;:::-;48824:234;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48807:760;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49527:15:0;;49500:55;;1846:25:1;;;-1:-1:-1;;;;;49500:55:0;;;;49527:15;;49500:55;;1834:2:1;1819:18;49500:55:0;;;;;;;49364:203;48807:760;;;49135:17;49155:26;49168:13;-1:-1:-1;;;;;49155:10:0;;;:26;:::i;:::-;49247:15;;49201:150;;;18378:25:1;;;18434:2;18419:18;;18412:34;;;49135:46:0;;-1:-1:-1;;;;;;49201:150:0;;;;49247:15;;;49201:150;;18351:18:1;49201:150:0;;;;;;;49068:295;48807:760;48409:1165;;48346:1228;;:::o;47107:1231::-;47308:16;;;47322:1;47308:16;;;;;;;;47284:21;;47308:16;;;;;;;;;;-1:-1:-1;47308:16:0;47284:40;;47353:4;47335;47340:1;47335:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;47335:23:0;;;-1:-1:-1;;;;;47335:23:0;;;;;47379:5;47369:4;47374:1;47369:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47369:15:0;;;:7;;;;;;;;;:15;47429:11;;47397:53;;47414:4;;47429:11;47443:6;47397:8;:53::i;:::-;47556:15;;47549:37;;-1:-1:-1;;;47549:37:0;;-1:-1:-1;;;;;2948:32:1;;;47549:37:0;;;2930:51:1;47525:21:0;;47556:15;;47549:33;;2903:18:1;;47549:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47642:11;;47525:61;;-1:-1:-1;;;;;;47642:11:0;:65;47726:6;47642:11;47802:4;47825:2;47846:21;:15;47864:3;47846:21;:::i;:::-;47642:240;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47625:706;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48291:15:0;;48264:55;;1846:25:1;;;-1:-1:-1;;;;;48264:55:0;;;;48291:15;;48264:55;;1834:2:1;1819:18;48264:55:0;;;;;;;48180:151;47625:706;;;47934:15;;47927:37;;-1:-1:-1;;;47927:37:0;;-1:-1:-1;;;;;2948:32:1;;;47927:37:0;;;2930:51:1;47907:17:0;;47984:13;;47934:15;;;47927:33;;2903:18:1;;47927:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:70;;;;:::i;:::-;48063:15;;48017:150;;;18378:25:1;;;18434:2;18419:18;;18412:34;;;47907:90:0;;-1:-1:-1;;;;;;48017:150:0;;;;48063:15;;;48017:150;;18351:18:1;48017:150:0;;;;;;;47892:287;47213:1125;;47107:1231;;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:160;215:20;;271:13;;264:21;254:32;;244:60;;300:1;297;290:12;244:60;150:160;;;:::o;315:315::-;380:6;388;441:2;429:9;420:7;416:23;412:32;409:52;;;457:1;454;447:12;409:52;496:9;483:23;515:31;540:5;515:31;:::i;:::-;565:5;-1:-1:-1;589:35:1;620:2;605:18;;589:35;:::i;:::-;579:45;;315:315;;;;;:::o;635:548::-;747:4;776:2;805;794:9;787:21;837:6;831:13;880:6;875:2;864:9;860:18;853:34;905:1;915:140;929:6;926:1;923:13;915:140;;;1024:14;;;1020:23;;1014:30;990:17;;;1009:2;986:26;979:66;944:10;;915:140;;;919:3;1104:1;1099:2;1090:6;1079:9;1075:22;1071:31;1064:42;1174:2;1167;1163:7;1158:2;1150:6;1146:15;1142:29;1131:9;1127:45;1123:54;1115:62;;;;635:548;;;;:::o;1188:315::-;1256:6;1264;1317:2;1305:9;1296:7;1292:23;1288:32;1285:52;;;1333:1;1330;1323:12;1285:52;1372:9;1359:23;1391:31;1416:5;1391:31;:::i;:::-;1441:5;1493:2;1478:18;;;;1465:32;;-1:-1:-1;;;1188:315:1:o;1882:247::-;1941:6;1994:2;1982:9;1973:7;1969:23;1965:32;1962:52;;;2010:1;2007;2000:12;1962:52;2049:9;2036:23;2068:31;2093:5;2068:31;:::i;:::-;2118:5;1882:247;-1:-1:-1;;;1882:247:1:o;2134:456::-;2211:6;2219;2227;2280:2;2268:9;2259:7;2255:23;2251:32;2248:52;;;2296:1;2293;2286:12;2248:52;2335:9;2322:23;2354:31;2379:5;2354:31;:::i;:::-;2404:5;-1:-1:-1;2461:2:1;2446:18;;2433:32;2474:33;2433:32;2474:33;:::i;:::-;2134:456;;2526:7;;-1:-1:-1;;;2580:2:1;2565:18;;;;2552:32;;2134:456::o;2992:180::-;3051:6;3104:2;3092:9;3083:7;3079:23;3075:32;3072:52;;;3120:1;3117;3110:12;3072:52;-1:-1:-1;3143:23:1;;2992:180;-1:-1:-1;2992:180:1:o;3177:148::-;3250:20;;3299:1;3289:12;;3279:40;;3315:1;3312;3305:12;3330:159;3397:20;;3457:6;3446:18;;3436:29;;3426:57;;3479:1;3476;3469:12;3494:420;3589:6;3597;3605;3613;3666:3;3654:9;3645:7;3641:23;3637:33;3634:53;;;3683:1;3680;3673:12;3634:53;3706:34;3730:9;3706:34;:::i;:::-;3696:44;;3759:37;3792:2;3781:9;3777:18;3759:37;:::i;:::-;3749:47;;3815:37;3848:2;3837:9;3833:18;3815:37;:::i;:::-;3805:47;;3871:37;3904:2;3893:9;3889:18;3871:37;:::i;:::-;3861:47;;3494:420;;;;;;;:::o;3919:248::-;3987:6;3995;4048:2;4036:9;4027:7;4023:23;4019:32;4016:52;;;4064:1;4061;4054:12;4016:52;-1:-1:-1;;4087:23:1;;;4157:2;4142:18;;;4129:32;;-1:-1:-1;3919:248:1:o;4172:203::-;4243:6;4296:2;4284:9;4275:7;4271:23;4267:32;4264:52;;;4312:1;4309;4302:12;4264:52;4335:34;4359:9;4335:34;:::i;4799:180::-;4855:6;4908:2;4896:9;4887:7;4883:23;4879:32;4876:52;;;4924:1;4921;4914:12;4876:52;4947:26;4963:9;4947:26;:::i;4984:388::-;5052:6;5060;5113:2;5101:9;5092:7;5088:23;5084:32;5081:52;;;5129:1;5126;5119:12;5081:52;5168:9;5155:23;5187:31;5212:5;5187:31;:::i;:::-;5237:5;-1:-1:-1;5294:2:1;5279:18;;5266:32;5307:33;5266:32;5307:33;:::i;:::-;5359:7;5349:17;;;4984:388;;;;;:::o;5377:356::-;5579:2;5561:21;;;5598:18;;;5591:30;5657:34;5652:2;5637:18;;5630:62;5724:2;5709:18;;5377:356::o;5738:380::-;5817:1;5813:12;;;;5860;;;5881:61;;5935:4;5927:6;5923:17;5913:27;;5881:61;5988:2;5980:6;5977:14;5957:18;5954:38;5951:161;;6034:10;6029:3;6025:20;6022:1;6015:31;6069:4;6066:1;6059:15;6097:4;6094:1;6087:15;5951:161;;5738:380;;;:::o;6532:127::-;6593:10;6588:3;6584:20;6581:1;6574:31;6624:4;6621:1;6614:15;6648:4;6645:1;6638:15;6664:128;6731:9;;;6752:11;;;6749:37;;;6766:18;;:::i;7207:125::-;7272:9;;;7293:10;;;7290:36;;;7306:18;;:::i;8038:168::-;8105:6;8131:10;;;8143;;;8127:27;;8166:11;;;8163:37;;;8180:18;;:::i;:::-;8163:37;8038:168;;;;:::o;8547:127::-;8608:10;8603:3;8599:20;8596:1;8589:31;8639:4;8636:1;8629:15;8663:4;8660:1;8653:15;12455:168;12528:9;;;12559;;12576:15;;;12570:22;;12556:37;12546:71;;12597:18;;:::i;12628:217::-;12668:1;12694;12684:132;;12738:10;12733:3;12729:20;12726:1;12719:31;12773:4;12770:1;12763:15;12801:4;12798:1;12791:15;12684:132;-1:-1:-1;12830:9:1;;12628:217::o;16755:127::-;16816:10;16811:3;16807:20;16804:1;16797:31;16847:4;16844:1;16837:15;16871:4;16868:1;16861:15;16887:251;16957:6;17010:2;16998:9;16989:7;16985:23;16981:32;16978:52;;;17026:1;17023;17016:12;16978:52;17058:9;17052:16;17077:31;17102:5;17077:31;:::i;17143:461::-;17196:3;17234:5;17228:12;17261:6;17256:3;17249:19;17287:4;17316:2;17311:3;17307:12;17300:19;;17353:2;17346:5;17342:14;17374:1;17384:195;17398:6;17395:1;17392:13;17384:195;;;17463:13;;-1:-1:-1;;;;;17459:39:1;17447:52;;17519:12;;;;17554:15;;;;17495:1;17413:9;17384:195;;;-1:-1:-1;17595:3:1;;17143:461;-1:-1:-1;;;;;17143:461:1:o;17609:590::-;17916:6;17905:9;17898:25;17959:6;17954:2;17943:9;17939:18;17932:34;18002:3;17997:2;17986:9;17982:18;17975:31;17879:4;18023:57;18075:3;18064:9;18060:19;18052:6;18023:57;:::i;:::-;-1:-1:-1;;;;;18116:32:1;;;;18111:2;18096:18;;18089:60;-1:-1:-1;18180:3:1;18165:19;18158:35;18015:65;17609:590;-1:-1:-1;;;17609:590:1:o;18457:184::-;18527:6;18580:2;18568:9;18559:7;18555:23;18551:32;18548:52;;;18596:1;18593;18586:12;18548:52;-1:-1:-1;18619:16:1;;18457:184;-1:-1:-1;18457:184:1:o
Swarm Source
ipfs://690299b5dbbb8d0e010fdf3a344f7356c9bcc306c080f17a2cd3c4afa20b73ae
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.