Overview
Max Total Supply
100,000,000 UNDX
Holders
938 (0.00%)
Market
Price
$0.00 @ 0.000001 ETH (+1.36%)
Onchain Market Cap
$210,423.21
Circulating Supply Market Cap
$0.00
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Unodex
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-12-27 */ //SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.7; library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } interface IOwnable { function owner() external view returns (address); } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address _owner, address spender) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } interface IBurnable { function burn(uint256 value) external; function burnFrom(address account, uint256 value) external; } interface IDEXFactory { function createPair(address tokenA, address tokenB) external returns (address pair); } interface IDEXRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity); function addLiquidity(address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB, uint liquidity); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); } interface IDividendDistributor { function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external; function setShare(address shareholder, uint256 amount) external; function depositNative() external payable; function depositToken(address from, uint256 amount) external; function process(uint256 gas) external; function inSwap() external view returns (bool); } interface ITaxDistributorLight { receive() external payable; function lastSwapTime() external view returns (uint256); function inSwap() external view returns (bool); function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external; function distribute() external payable; function getSellTax() external view returns (uint256); function getBuyTax() external view returns (uint256); function getTaxWallet(string memory taxName) external view returns(address); function setTaxWallet(string memory taxName, address wallet) external; function setSellTax(string memory taxName, uint256 taxPercentage) external; function setBuyTax(string memory taxName, uint256 taxPercentage) external; function takeSellTax(uint256 value) external returns (uint256); function takeBuyTax(uint256 value) external returns (uint256); } interface ITaxDistributor is ITaxDistributorLight { function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external; function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external; function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) external; function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address holder) external; } interface IWalletDistributor { function receiveToken(address token, address from, uint256 amount) external; } interface IRewards { function sendFeeToHolders(uint256 feeEpoch) external payable; function setNewBalance(address a1, uint256 a1Balance, address a2, uint256 a2balance) external; } interface IRewardsTaxDistributor { receive() external payable; function lastSwapTime() external view returns (uint256); function inSwap() external view returns (bool); function distribute() external payable; function getSellTax() external view returns (uint256); function getBuyTax() external view returns (uint256); function getTaxWallet() external view returns(address); function setTaxWallet(address wallet) external; function setSellTax(uint256 taxPercentage) external; function setBuyTax(uint256 taxPercentage) external; function setRewardPercentage(uint256 amount) external; function setRewardContract(address who) external; function takeSellTax(uint256 value) external returns (uint256); function takeBuyTax(uint256 value) external returns (uint256); } /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } abstract contract BaseErc20 is IERC20, Ownable { mapping (address => uint256) internal _balances; mapping (address => mapping (address => uint256)) internal _allowed; uint256 internal _totalSupply; string public symbol; string public name; uint8 public decimals; bool public launched; uint256 public launchBlock; mapping (address => bool) internal exchanges; modifier isLaunched() { require(launched, "can only be called once token is launched"); _; } // @dev Trading is allowed before launch if the sender is the owner, we are transferring from the owner, or in canAlwaysTrade list modifier tradingEnabled(address from) virtual { require(launched || from == owner(), "trading not enabled"); _; } constructor(address _owner) Ownable(_owner) { } /** * @dev Total number of tokens in existence */ function totalSupply() external override view returns (uint256) { return _totalSupply; } /** * @dev Gets the balance of the specified address. * @param _owner The address to query the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address _owner) external override view returns (uint256) { return _balances[_owner]; } /** * @dev Function to check the amount of tokens that an owner allowed to a spender. * @param _owner address The address which owns the funds. * @param spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance(address _owner, address spender) external override view returns (uint256) { return _allowed[_owner][spender]; } /** * @dev Transfer token for a specified address * @param to The address to transfer to. * @param value The amount to be transferred. */ function transfer(address to, uint256 value) external override tradingEnabled(msg.sender) returns (bool) { _transfer(msg.sender, to, value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * 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 * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. */ function approve(address spender, uint256 value) external override tradingEnabled(msg.sender) returns (bool) { require(spender != address(0), "cannot approve the 0 address"); _allowed[msg.sender][spender] = value; emit Approval(msg.sender, spender, value); return true; } /** * @dev Transfer tokens from one address to another. * Note that while this function emits an Approval event, this is not required as per the specification, * and other compliant implementations may not emit the event. * @param from address The address which you want to send tokens from * @param to address The address which you want to transfer to * @param value uint256 the amount of tokens to be transferred */ function transferFrom(address from, address to, uint256 value) external override tradingEnabled(from) returns (bool) { _allowed[from][msg.sender] = _allowed[from][msg.sender] - value; _transfer(from, to, value); emit Approval(from, msg.sender, _allowed[from][msg.sender]); return true; } // Virtual methods function launch() virtual external onlyOwner { require(launched == false, "contract already launched"); launched = true; launchBlock = block.number; } function calculateTransferAmount(address from, address to, uint256 value) virtual internal returns (uint256) { require(from != to, "you cannot transfer to yourself"); return value; } function preTransfer(address from, address to, uint256 value) virtual internal { } function postTransfer(address from, uint256 fromBalance, address to, uint256 toBalance) virtual internal { } // Admin methods function setExchange(address who, bool on) external onlyOwner { require(exchanges[who] != on, "already set"); exchanges[who] = on; } // Private methods function getRouterAddress() internal view returns (address routerAddress) { if (block.chainid == 1 || block.chainid == 3 || block.chainid == 4 || block.chainid == 5) { routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ; // ETHEREUM } else if (block.chainid == 11155111) { routerAddress = 0xC532a74256D3Db42D0Bf7a0400fEFDbad7694008; // SEPOLIA } else if (block.chainid == 56) { routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // BSC MAINNET } else if (block.chainid == 8453) { routerAddress = 0xfCD3842f85ed87ba2889b4D35893403796e67FF1; // BASE } else { revert("Unknown Chain ID"); } } /** * @dev Transfer token for a specified addresses * @param from The address to transfer from. * @param to The address to transfer to. * @param value The amount to be transferred. */ function _transfer(address from, address to, uint256 value) private { require(to != address(0), "cannot be zero address"); preTransfer(from, to, value); uint256 modifiedAmount = calculateTransferAmount(from, to, value); _balances[from] = _balances[from] - value; _balances[to] = _balances[to] + modifiedAmount; postTransfer(from, _balances[from], to, _balances[to]); emit Transfer(from, to, modifiedAmount); } } abstract contract Taxable is BaseErc20 { IRewardsTaxDistributor internal taxDistributor; IRewards internal rewardContract; bool internal autoSwapTax; uint256 internal deadBlocks = 3; uint256 internal minimumTimeBetweenSwaps; uint256 internal minimumTokensBeforeSwap; mapping (address => bool) internal excludedFromTax; uint256 private swapStartTime; // Overrides constructor (address owner, address rewards) BaseErc20(owner) { rewardContract = IRewards(rewards); } function calculateTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) { uint256 amountAfterTax = value; if (excludedFromTax[from] == false && excludedFromTax[to] == false && launched) { if (exchanges[from]) { // we are BUYING amountAfterTax = taxDistributor.takeBuyTax(value); } else if (exchanges[to]) { // we are SELLING amountAfterTax = taxDistributor.takeSellTax(value); } } uint256 taxAmount = value - amountAfterTax; if (taxAmount > 0) { _balances[address(taxDistributor)] = _balances[address(taxDistributor)] + taxAmount; } return super.calculateTransferAmount(from, to, amountAfterTax); } function preTransfer(address from, address to, uint256 value) override virtual internal { uint256 timeSinceLastSwap = block.timestamp - taxDistributor.lastSwapTime(); if ( launched && autoSwapTax && exchanges[to] && swapStartTime + 60 <= block.timestamp && timeSinceLastSwap >= minimumTimeBetweenSwaps && _balances[address(taxDistributor)] >= minimumTokensBeforeSwap && taxDistributor.inSwap() == false ) { swapStartTime = block.timestamp; try taxDistributor.distribute() {} catch {} } super.preTransfer(from, to, value); } function postTransfer(address from, uint256 fromBalance, address to, uint256 toBalance) override virtual internal { rewardContract.setNewBalance(from, fromBalance, to, toBalance); super.postTransfer(from, fromBalance, to, toBalance); } // Public methods /** * @dev Return the current total sell tax from the tax distributor */ function sellTax() external view returns (uint256) { return taxDistributor.getSellTax(); } /** * @dev Return the current total sell tax from the tax distributor */ function buyTax() external view returns (uint256) { return taxDistributor.getBuyTax(); } /** * @dev Return the address of the tax distributor contract */ function taxDistributorAddress() external view returns (address) { return address(taxDistributor); } // Admin methods function setAutoSwaptax(bool enabled) external onlyOwner { autoSwapTax = enabled; } function setExcludedFromTax(address who, bool enabled) external onlyOwner { require(exchanges[who] == false || enabled == false, "Cannot exclude an exchange from tax"); excludedFromTax[who] = enabled; } function setTaxDistributionThresholds(uint256 minAmount, uint256 minTime) external onlyOwner { minimumTokensBeforeSwap = minAmount; minimumTimeBetweenSwaps = minTime; } function setSellTax(uint256 taxAmount) external onlyOwner { taxDistributor.setSellTax(taxAmount); } function setBuyTax(uint256 taxAmount) external onlyOwner { taxDistributor.setBuyTax(taxAmount); } function setTaxWallet(address who) external onlyOwner { taxDistributor.setTaxWallet(who); } function setRewardPercentage(uint256 amount) external onlyOwner { taxDistributor.setRewardPercentage(amount); } function setRewardContract(address who) external onlyOwner { taxDistributor.setRewardContract(who); rewardContract = IRewards(who); } function runSwapManually() external isLaunched { taxDistributor.distribute(); } } contract RewardTaxDistributor is IRewardsTaxDistributor { using Address for address; address immutable private tokenPair; address immutable private routerAddress; address immutable private _token; address immutable private _wbnb; IDEXRouter private _router; bool public override inSwap; uint256 public override lastSwapTime; uint256 immutable private maxSellTax; uint256 immutable private maxBuyTax; uint256 buyTaxPercentage; uint256 sellTaxPercentage; address location; uint256 rewardShare; IRewards rewardContract; event TaxesDistributed(uint256 tokensSwapped, uint256 ethReceived); event DistributionError(string text); modifier onlyToken() { require(msg.sender == _token, "no permissions"); _; } modifier swapLock() { require(inSwap == false, "already swapping"); inSwap = true; _; inSwap = false; } constructor (address router, address pair, address wbnb, uint256 _maxSellTax, uint256 _maxBuyTax, address rewards) { require(wbnb != address(0), "pairedToken cannot be 0 address"); require(pair != address(0), "pair cannot be 0 address"); require(router != address(0), "router cannot be 0 address"); _token = msg.sender; _wbnb = wbnb; _router = IDEXRouter(router); maxSellTax = _maxSellTax; maxBuyTax = _maxBuyTax; tokenPair = pair; routerAddress = router; rewardContract = IRewards(rewards); } receive() external override payable {} function currentEpoch() private view returns(uint256) { return block.timestamp / 3 hours; } function distribute() external payable override onlyToken swapLock { address[] memory path = new address[](2); path[0] = _token; path[1] = _wbnb; IERC20 token = IERC20(_token); uint256 totalTokens; totalTokens = token.balanceOf(address(this)); uint256[] memory amts = _router.swapExactTokensForETH( totalTokens, 0, path, address(this), block.timestamp + 300 ); uint256 balance = address(this).balance; uint256 ownerShare = balance * (100_00 - rewardShare) / 100_00; uint256 holderShare = balance - ownerShare; payable(location).transfer(ownerShare); if (holderShare > 0) { rewardContract.sendFeeToHolders{ value: holderShare }(currentEpoch() - 1); } emit TaxesDistributed(totalTokens, amts[1]); lastSwapTime = block.timestamp; } function getSellTax() public override onlyToken view returns (uint256) { return sellTaxPercentage; } function getBuyTax() public override onlyToken view returns (uint256) { return buyTaxPercentage; } function getTaxWallet()external override view onlyToken returns (address) { return location; } function setTaxWallet(address wallet) external override onlyToken { location = wallet; } function setSellTax(uint256 taxPercentage) external override onlyToken { sellTaxPercentage = taxPercentage; require(getSellTax() <= maxSellTax, "tax cannot be set this high"); } function setBuyTax(uint256 taxPercentage) external override onlyToken { buyTaxPercentage = taxPercentage; require(getBuyTax() <= maxBuyTax, "tax cannot be set this high"); } function setRewardPercentage(uint256 taxPercentage) external override onlyToken { rewardShare = taxPercentage; require(taxPercentage <= 100_00, "Cannot be higher than 100%"); } function setRewardContract(address who) external override onlyToken { rewardContract = IRewards(who); } function takeSellTax(uint256 value) external view override onlyToken returns (uint256) { if (sellTaxPercentage > 0) { uint256 taxAmount = (value * sellTaxPercentage) / 10000; value = value - taxAmount; } return value; } function takeBuyTax(uint256 value) view external override onlyToken returns (uint256) { if (buyTaxPercentage > 0) { uint256 taxAmount = (value * buyTaxPercentage) / 10000; value = value - taxAmount; } return value; } } contract Unodex is BaseErc20, Taxable { uint256 immutable public mhAmount; constructor () Taxable(msg.sender, 0x0130D3A9E98812159EdFa037F4Ad1Cf0E46645E7) { symbol = "UNDX"; name = "UNODEX"; decimals = 18; // Swap address routerAddress = getRouterAddress(); IDEXRouter router = IDEXRouter(routerAddress); address native = router.WETH(); address pair = IDEXFactory(router.factory()).createPair(native, address(this)); exchanges[pair] = true; taxDistributor = new RewardTaxDistributor(routerAddress, pair, native, 30_00, 30_00, 0x0130D3A9E98812159EdFa037F4Ad1Cf0E46645E7); // Tax minimumTimeBetweenSwaps = 30 seconds; minimumTokensBeforeSwap = 160_000 * 10 ** decimals; excludedFromTax[address(taxDistributor)] = true; excludedFromTax[owner()] = true; taxDistributor.setBuyTax(30_00); taxDistributor.setSellTax(30_00); taxDistributor.setRewardPercentage(0); taxDistributor.setTaxWallet(0x9EA06865fd1b1808660cCfdd9224e017742dEcE8); autoSwapTax = true; // Max Hold mhAmount = 1_000_005 * 10 ** decimals; // Finalise _allowed[address(taxDistributor)][routerAddress] = 2**256 - 1; _totalSupply = _totalSupply + (100_000_000 * 10 ** decimals); _balances[owner()] = _balances[owner()] + _totalSupply; emit Transfer(address(0), owner(), _totalSupply); } // Overrides function preTransfer(address from, address to, uint256 value) override(Taxable, BaseErc20) internal { if (launched && from != owner() && to != owner() && exchanges[to] == false && to != getRouterAddress() && to != address(taxDistributor) && from != address(taxDistributor) ) { require (_balances[to] + value <= mhAmount, "this is over the max hold amount"); } super.preTransfer(from, to, value); } function postTransfer(address from, uint256 fromBalance, address to, uint256 toBalance) override(Taxable, BaseErc20) internal { return super.postTransfer(from, fromBalance, to, toBalance); } function calculateTransferAmount(address from, address to, uint256 value) override(Taxable, BaseErc20) internal returns (uint256) { return super.calculateTransferAmount(from, to, value); } function setTax(uint256 taxAmount) external onlyOwner { taxDistributor.setSellTax(taxAmount); taxDistributor.setBuyTax(taxAmount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":[{"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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mhAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"runSwapManually","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAutoSwaptax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"on","type":"bool"}],"name":"setExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"setRewardContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setRewardPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"minTime","type":"uint256"}],"name":"setTaxDistributionThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"setTaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxDistributorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040526003600b553480156200001657600080fd5b5033730130d3a9e98812159edfa037f4ad1cf0e46645e78180806200005657604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6200006181620006dd565b5050600a80546001600160a01b0319166001600160a01b039290921691909117905550604080518082019091526004808252630aa9c88b60e31b6020909201918252620000af91816200081e565b50604080518082019091526006808252650aa9c9e888ab60d31b6020909201918252620000df916005916200081e565b506006805460ff191660121790556000620000f96200072d565b905060008190506000816001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200013c57600080fd5b505afa15801562000151573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001779190620008d2565b90506000826001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620001b557600080fd5b505afa158015620001ca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f09190620008d2565b6040516364e329cb60e11b81526001600160a01b038481166004830152306024830152919091169063c9c6539690604401602060405180830381600087803b1580156200023c57600080fd5b505af115801562000251573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002779190620008d2565b6001600160a01b03811660009081526008602052604090819020805460ff1916600117905551909150849082908490610bb8908190730130d3a9e98812159edfa037f4ad1cf0e46645e790620002cd90620008ad565b6001600160a01b039687168152948616602086015292851660408501526060840191909152608083015290911660a082015260c001604051809103906000f0801580156200031f573d6000803e3d6000fd5b50600980546001600160a01b0319166001600160a01b0392909216919091179055601e600c55600654620003589060ff16600a62000968565b62000367906202710062000a29565b600d556009546001600160a01b03166000908152600e602081905260408220805460ff1916600190811790915591620003a86000546001600160a01b031690565b6001600160a01b03908116825260208201929092526040908101600020805460ff1916931515939093179092556009549151636e08297160e11b8152610bb8600482015291169063dc1052e290602401600060405180830381600087803b1580156200041357600080fd5b505af115801562000428573d6000803e3d6000fd5b50506009546040516308cd09d560e41b8152610bb860048201526001600160a01b039091169250638cd09d509150602401600060405180830381600087803b1580156200047457600080fd5b505af115801562000489573d6000803e3d6000fd5b50506009546040516302594d9d60e21b8152600060048201526001600160a01b03909116925063096536749150602401600060405180830381600087803b158015620004d457600080fd5b505af1158015620004e9573d6000803e3d6000fd5b5050600954604051631d48296560e31b8152739ea06865fd1b1808660ccfdd9224e017742dece860048201526001600160a01b03909116925063ea414b289150602401600060405180830381600087803b1580156200054757600080fd5b505af11580156200055c573d6000803e3d6000fd5b5050600a805460ff60a01b1916600160a01b17815560065462000585935060ff16915062000968565b6200059490620f424562000a29565b6080526009546001600160a01b0390811660009081526002602090815260408083209388168352929052206000199055600654620005d79060ff16600a62000968565b620005e7906305f5e10062000a29565b600354620005f6919062000904565b600381905560016000620006126000546001600160a01b031690565b6001600160a01b03166001600160a01b03168152602001908152602001600020546200063f919062000904565b60016000620006566000546001600160a01b031690565b6001600160a01b03168152602081019190915260400160002055620006836000546001600160a01b031690565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600354604051620006cb91815260200190565b60405180910390a35050505062000a9e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600046600114806200073f5750466003145b806200074b5750466004145b80620007575750466005145b15620007765750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b4662aa36a714156200079b575073c532a74256d3db42d0bf7a0400fefdbad769400890565b4660381415620007be57507310ed43c718714eb63d5aa57b78b54704e256024e90565b466121051415620007e2575073fcd3842f85ed87ba2889b4d35893403796e67ff190565b60405162461bcd60e51b815260206004820152601060248201526f155b9adb9bdddb8810da185a5b88125160821b60448201526064016200004d565b8280546200082c9062000a4b565b90600052602060002090601f0160209004810192826200085057600085556200089b565b82601f106200086b57805160ff19168380011785556200089b565b828001600101855582156200089b579182015b828111156200089b5782518255916020019190600101906200087e565b50620008a9929150620008bb565b5090565b6110af806200244483390190565b5b80821115620008a95760008155600101620008bc565b600060208284031215620008e557600080fd5b81516001600160a01b0381168114620008fd57600080fd5b9392505050565b600082198211156200091a576200091a62000a88565b500190565b600181815b808511156200096057816000190482111562000944576200094462000a88565b808516156200095257918102915b93841c939080029062000924565b509250929050565b6000620008fd60ff841683600082620009845750600162000a23565b81620009935750600062000a23565b8160018114620009ac5760028114620009b757620009d7565b600191505062000a23565b60ff841115620009cb57620009cb62000a88565b50506001821b62000a23565b5060208310610133831016604e8410600b8410161715620009fc575081810a62000a23565b62000a0883836200091f565b806000190482111562000a1f5762000a1f62000a88565b0290505b92915050565b600081600019048311821515161562000a465762000a4662000a88565b500290565b600181811c9082168062000a6057607f821691505b6020821081141562000a8257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60805161198362000ac160003960008181610307015261100601526119836000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063c2ed286b116100a2578063dc1052e211610071578063dc1052e2146103e2578063dd62ed3e146103f5578063ea414b281461042e578063f2fde38b1461044157600080fd5b8063c2ed286b146103ab578063cc1776d3146103be578063d00efb2f146103c6578063d31acb28146103cf57600080fd5b80638cd09d50116100de5780638cd09d501461036c5780638da5cb5b1461037f57806395d89b4114610390578063a9059cbb1461039857600080fd5b806370a0823114610329578063715018a6146103525780638091f3bf1461035a57600080fd5b806328be90381161017c5780634f7041a51161014b5780634f7041a5146102d45780634f72e2a2146102dc57806351508f0a146102ef5780636331bf651461030257600080fd5b806328be9038146102875780632e5bb6ff1461029a578063313ce567146102ad578063442ef7d2146102cc57600080fd5b806309653674116101b8578063096536741461022a57806318160ddd1461023d578063185511081461024f57806323b872dd1461027457600080fd5b806301339c21146101df57806306fdde03146101e9578063095ea7b314610207575b600080fd5b6101e7610454565b005b6101f16104ce565b6040516101fe919061183d565b60405180910390f35b61021a610215366004611785565b61055c565b60405190151581526020016101fe565b6101e76102383660046117e9565b61065b565b6003545b6040519081526020016101fe565b6009546001600160a01b03165b6040516001600160a01b0390911681526020016101fe565b61021a610282366004611712565b6106c5565b6101e761029536600461174e565b6107cc565b6101e76102a83660046117e9565b61085c565b6006546102ba9060ff1681565b60405160ff90911681526020016101fe565b6101e76108f3565b6102416109c6565b6101e76102ea3660046117af565b610a48565b6101e76102fd3660046116bd565b610a6e565b6102417f000000000000000000000000000000000000000000000000000000000000000081565b6102416103373660046116bd565b6001600160a01b031660009081526001602052604090205490565b6101e7610af8565b60065461021a90610100900460ff1681565b6101e761037a3660046117e9565b610b0c565b6000546001600160a01b031661025c565b6101f1610b45565b61021a6103a6366004611785565b610b52565b6101e76103b936600461174e565b610bab565b610241610c5c565b61024160075481565b6101e76103dd36600461181b565b610ca1565b6101e76103f03660046117e9565b610cb4565b6102416104033660046116df565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6101e761043c3660046116bd565b610ced565b6101e761044f3660046116bd565b610d27565b61045c610d65565b600654610100900460ff16156104b95760405162461bcd60e51b815260206004820152601960248201527f636f6e747261637420616c7265616479206c61756e636865640000000000000060448201526064015b60405180910390fd5b6006805461ff00191661010017905543600755565b600580546104db906118ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610507906118ee565b80156105545780601f1061052957610100808354040283529160200191610554565b820191906000526020600020905b81548152906001019060200180831161053757829003601f168201915b505050505081565b6006546000903390610100900460ff168061058457506000546001600160a01b038281169116145b6105a05760405162461bcd60e51b81526004016104b090611892565b6001600160a01b0384166105f65760405162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420617070726f766520746865203020616464726573730000000060448201526064016104b0565b3360008181526002602090815260408083206001600160a01b03891680855290835292819020879055518681529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35060019392505050565b610663610d65565b6009546040516302594d9d60e21b8152600481018390526001600160a01b03909116906309653674906024015b600060405180830381600087803b1580156106aa57600080fd5b505af11580156106be573d6000803e3d6000fd5b5050505050565b6006546000908490610100900460ff16806106ed57506000546001600160a01b038281169116145b6107095760405162461bcd60e51b81526004016104b090611892565b6001600160a01b03851660009081526002602090815260408083203384529091529020546107389084906118d7565b6001600160a01b0386166000908152600260209081526040808320338452909152902055610767858585610d92565b6001600160a01b038516600081815260026020908152604080832033808552908352928190205490519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3506001949350505050565b6107d4610d65565b6001600160a01b03821660009081526008602052604090205460ff16151581151514156108315760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b60448201526064016104b0565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b610864610d65565b6009546040516308cd09d560e41b8152600481018390526001600160a01b0390911690638cd09d5090602401600060405180830381600087803b1580156108aa57600080fd5b505af11580156108be573d6000803e3d6000fd5b5050600954604051636e08297160e11b8152600481018590526001600160a01b03909116925063dc1052e29150602401610690565b600654610100900460ff1661095c5760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b60648201526084016104b0565b600960009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156109ac57600080fd5b505af11580156109c0573d6000803e3d6000fd5b50505050565b60095460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a916004808301926020929190829003018186803b158015610a0b57600080fd5b505afa158015610a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a439190611802565b905090565b610a50610d65565b600a8054911515600160a01b0260ff60a01b19909216919091179055565b610a76610d65565b6009546040516328a8478560e11b81526001600160a01b038381166004830152909116906351508f0a90602401600060405180830381600087803b158015610abd57600080fd5b505af1158015610ad1573d6000803e3d6000fd5b5050600a80546001600160a01b0319166001600160a01b0394909416939093179092555050565b610b00610d65565b610b0a6000610ed9565b565b610b14610d65565b6009546040516308cd09d560e41b8152600481018390526001600160a01b0390911690638cd09d5090602401610690565b600480546104db906118ee565b6006546000903390610100900460ff1680610b7a57506000546001600160a01b038281169116145b610b965760405162461bcd60e51b81526004016104b090611892565b610ba1338585610d92565b5060019392505050565b610bb3610d65565b6001600160a01b03821660009081526008602052604090205460ff161580610bd9575080155b610c315760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b60648201526084016104b0565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6009546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de916004808301926020929190829003018186803b158015610a0b57600080fd5b610ca9610d65565b600d91909155600c55565b610cbc610d65565b600954604051636e08297160e11b8152600481018390526001600160a01b039091169063dc1052e290602401610690565b610cf5610d65565b600954604051631d48296560e31b81526001600160a01b0383811660048301529091169063ea414b2890602401610690565b610d2f610d65565b6001600160a01b038116610d5957604051631e4fbdf760e01b8152600060048201526024016104b0565b610d6281610ed9565b50565b6000546001600160a01b03163314610b0a5760405163118cdaa760e01b81523360048201526024016104b0565b6001600160a01b038216610de15760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b60448201526064016104b0565b610dec838383610f29565b6000610df984848461108f565b6001600160a01b038516600090815260016020526040902054909150610e209083906118d7565b6001600160a01b038086166000908152600160205260408082209390935590851681522054610e509082906118bf565b6001600160a01b038085166000818152600160205260408082208590559288168152918220549152610e869186919086906110a4565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610ecb91815260200190565b60405180910390a350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600654610100900460ff168015610f4e57506000546001600160a01b03848116911614155b8015610f6857506000546001600160a01b03838116911614155b8015610f8d57506001600160a01b03821660009081526008602052604090205460ff16155b8015610fb25750610f9c6110b0565b6001600160a01b0316826001600160a01b031614155b8015610fcc57506009546001600160a01b03838116911614155b8015610fe657506009546001600160a01b03848116911614155b1561107f576001600160a01b0382166000908152600160205260409020547f0000000000000000000000000000000000000000000000000000000000000000906110319083906118bf565b111561107f5760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e7460448201526064016104b0565b61108a838383611199565b505050565b600061109c8484846113ad565b949350505050565b6109c0848484846115bc565b600046600114806110c15750466003145b806110cc5750466004145b806110d75750466005145b156110f55750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b4662aa36a71415611119575073c532a74256d3db42d0bf7a0400fefdbad769400890565b466038141561113b57507310ed43c718714eb63d5aa57b78b54704e256024e90565b46612105141561115e575073fcd3842f85ed87ba2889b4d35893403796e67ff190565b60405162461bcd60e51b815260206004820152601060248201526f155b9adb9bdddb8810da185a5b88125160821b60448201526064016104b0565b60095460408051630dd8715760e01b815290516000926001600160a01b031691630dd87157916004808301926020929190829003018186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112169190611802565b61122090426118d7565b600654909150610100900460ff1680156112435750600a54600160a01b900460ff165b801561126757506001600160a01b03831660009081526008602052604090205460ff165b8015611281575042600f54603c61127e91906118bf565b11155b801561128f5750600c548110155b80156112b75750600d546009546001600160a01b031660009081526001602052604090205410155b80156113465750600960009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b815260040160206040518083038186803b15801561130c57600080fd5b505afa158015611320573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134491906117cc565b155b156113a85742600f556009546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b15801561139557600080fd5b505af19250505080156113a6575060015b505b6109c0565b6001600160a01b0383166000908152600e6020526040812054829060ff161580156113f157506001600160a01b0384166000908152600e602052604090205460ff16155b80156114045750600654610100900460ff165b15611551576001600160a01b03851660009081526008602052604090205460ff16156114af5760095460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc790602401602060405180830381600087803b15801561147057600080fd5b505af1158015611484573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a89190611802565b9050611551565b6001600160a01b03841660009081526008602052604090205460ff161561155157600954604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd590602401602060405180830381600087803b15801561151657600080fd5b505af115801561152a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154e9190611802565b90505b600061155d82856118d7565b905080156115a7576009546001600160a01b031660009081526001602052604090205461158b9082906118bf565b6009546001600160a01b03166000908152600160205260409020555b6115b2868684611636565b9695505050505050565b600a546040516347d64b2f60e11b81526001600160a01b0386811660048301526024820186905284811660448301526064820184905290911690638fac965e90608401600060405180830381600087803b15801561161957600080fd5b505af115801561162d573d6000803e3d6000fd5b505050506109c0565b6000826001600160a01b0316846001600160a01b0316141561169a5760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c660060448201526064016104b0565b5092915050565b80356001600160a01b03811681146116b857600080fd5b919050565b6000602082840312156116cf57600080fd5b6116d8826116a1565b9392505050565b600080604083850312156116f257600080fd5b6116fb836116a1565b9150611709602084016116a1565b90509250929050565b60008060006060848603121561172757600080fd5b611730846116a1565b925061173e602085016116a1565b9150604084013590509250925092565b6000806040838503121561176157600080fd5b61176a836116a1565b9150602083013561177a8161193f565b809150509250929050565b6000806040838503121561179857600080fd5b6117a1836116a1565b946020939093013593505050565b6000602082840312156117c157600080fd5b81356116d88161193f565b6000602082840312156117de57600080fd5b81516116d88161193f565b6000602082840312156117fb57600080fd5b5035919050565b60006020828403121561181457600080fd5b5051919050565b6000806040838503121561182e57600080fd5b50508035926020909101359150565b600060208083528351808285015260005b8181101561186a5785810183015185820160400152820161184e565b8181111561187c576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b600082198211156118d2576118d2611929565b500190565b6000828210156118e9576118e9611929565b500390565b600181811c9082168061190257607f821691505b6020821081141561192357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8015158114610d6257600080fdfea26469706673582212206d48d949a9b073adc7107a3fde862889837a308374a96eb58ea9ff4d99d1e2de64736f6c634300080700336101406040523480156200001257600080fd5b50604051620010af380380620010af8339810160408190526200003591620001cd565b6001600160a01b038416620000915760405162461bcd60e51b815260206004820152601f60248201527f706169726564546f6b656e2063616e6e6f74206265203020616464726573730060448201526064015b60405180910390fd5b6001600160a01b038516620000e95760405162461bcd60e51b815260206004820152601860248201527f706169722063616e6e6f74206265203020616464726573730000000000000000604482015260640162000088565b6001600160a01b038616620001415760405162461bcd60e51b815260206004820152601a60248201527f726f757465722063616e6e6f7420626520302061646472657373000000000000604482015260640162000088565b33606090811b60c0526001600160601b031994811b851660e052600080546001600160a01b038981166001600160a01b031992831617909255610100959095526101209390935294851b84166080529490931b90911660a052600680549390921692169190911790556200023c565b80516001600160a01b0381168114620001c857600080fd5b919050565b60008060008060008060c08789031215620001e757600080fd5b620001f287620001b0565b95506200020260208801620001b0565b94506200021260408801620001b0565b935060608701519250608087015191506200023060a08801620001b0565b90509295509295509295565b60805160601c60a05160601c60c05160601c60e05160601c6101005161012051610dc9620002e66000396000610679015260006104ff015260006107be0152600081816102780152818161032501528181610376015281816103f701528181610463015281816104bb01528181610581015281816105d201528181610635015281816106ab0152818161076a0152818161081b0152610aaf01526000505060005050610dc96000f3fe6080604052600436106100c65760003560e01c80638cd09d501161007f578063db017dc711610059578063db017dc714610205578063dc1052e214610225578063e4fc6b6d14610245578063ea414b281461024d57600080fd5b80638cd09d501461019f578063b0bc85de146101bf578063d8306786146101d457600080fd5b806309653674146100d25780630dd87157146100f4578063252d723a1461011d5780634fa26fd51461013257806351508f0a1461015257806352894ceb1461017257600080fd5b366100cd57005b600080fd5b3480156100de57600080fd5b506100f26100ed366004610c16565b61026d565b005b34801561010057600080fd5b5061010a60015481565b6040519081526020015b60405180910390f35b34801561012957600080fd5b5061010a610318565b34801561013e57600080fd5b5061010a61014d366004610c16565b610369565b34801561015e57600080fd5b506100f261016d366004610b21565b6103ec565b34801561017e57600080fd5b50610187610456565b6040516001600160a01b039091168152602001610114565b3480156101ab57600080fd5b506100f26101ba366004610c16565b6104b0565b3480156101cb57600080fd5b5061010a610574565b3480156101e057600080fd5b506000546101f590600160a01b900460ff1681565b6040519015158152602001610114565b34801561021157600080fd5b5061010a610220366004610c16565b6105c5565b34801561023157600080fd5b506100f2610240366004610c16565b61062a565b6100f26106a0565b34801561025957600080fd5b506100f2610268366004610b21565b610aa4565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102be5760405162461bcd60e51b81526004016102b590610c48565b60405180910390fd5b60058190556127108111156103155760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f7420626520686967686572207468616e203130302500000000000060448201526064016102b5565b50565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103625760405162461bcd60e51b81526004016102b590610c48565b5060025490565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103b35760405162461bcd60e51b81526004016102b590610c48565b600354156103e8576000612710600354846103ce9190610d1b565b6103d89190610cf9565b90506103e48184610d3a565b9250505b5090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104345760405162461bcd60e51b81526004016102b590610c48565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104a05760405162461bcd60e51b81526004016102b590610c48565b506004546001600160a01b031690565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104f85760405162461bcd60e51b81526004016102b590610c48565b60038190557f0000000000000000000000000000000000000000000000000000000000000000610526610574565b11156103155760405162461bcd60e51b815260206004820152601b60248201527f7461782063616e6e6f742062652073657420746869732068696768000000000060448201526064016102b5565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105be5760405162461bcd60e51b81526004016102b590610c48565b5060035490565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461060f5760405162461bcd60e51b81526004016102b590610c48565b600254156103e8576000612710600254846103ce9190610d1b565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106725760405162461bcd60e51b81526004016102b590610c48565b60028190557f0000000000000000000000000000000000000000000000000000000000000000610526610318565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106e85760405162461bcd60e51b81526004016102b590610c48565b600054600160a01b900460ff16156107355760405162461bcd60e51b815260206004820152601060248201526f616c7265616479207377617070696e6760801b60448201526064016102b5565b6000805460ff60a01b1916600160a01b17815560408051600280825260608201835290916020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061079c5761079c610d67565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106107f0576107f0610d67565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b81523060048201527f000000000000000000000000000000000000000000000000000000000000000091600091908316906370a082319060240160206040518083038186803b15801561086357600080fd5b505afa158015610877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089b9190610c2f565b60008054919250906001600160a01b03166318cbafe5838387306108c14261012c610ce1565b6040518663ffffffff1660e01b81526004016108e1959493929190610c70565b600060405180830381600087803b1580156108fb57600080fd5b505af115801561090f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109379190810190610b51565b9050600047905060006127106005546127106109539190610d3a565b61095d9084610d1b565b6109679190610cf9565b905060006109758284610d3a565b6004546040519192506001600160a01b03169083156108fc029084906000818181858888f193505050501580156109b0573d6000803e3d6000fd5b508015610a2e576006546001600160a01b031663dde436c08260016109d3610b0e565b6109dd9190610d3a565b6040518363ffffffff1660e01b81526004016109fb91815260200190565b6000604051808303818588803b158015610a1457600080fd5b505af1158015610a28573d6000803e3d6000fd5b50505050505b7f5e20c9aee521e656eed033c4ae35378c79c584706f5ce7f410ab3fba389607a18585600181518110610a6357610a63610d67565b6020026020010151604051610a82929190918252602082015260400190565b60405180910390a150504260015550506000805460ff60a01b19169055505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610aec5760405162461bcd60e51b81526004016102b590610c48565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000610b1c612a3042610cf9565b905090565b600060208284031215610b3357600080fd5b81356001600160a01b0381168114610b4a57600080fd5b9392505050565b60006020808385031215610b6457600080fd5b825167ffffffffffffffff80821115610b7c57600080fd5b818501915085601f830112610b9057600080fd5b815181811115610ba257610ba2610d7d565b8060051b604051601f19603f83011681018181108582111715610bc757610bc7610d7d565b604052828152858101935084860182860187018a1015610be657600080fd5b600095505b83861015610c09578051855260019590950194938601938601610beb565b5098975050505050505050565b600060208284031215610c2857600080fd5b5035919050565b600060208284031215610c4157600080fd5b5051919050565b6020808252600e908201526d6e6f207065726d697373696f6e7360901b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015610cc05784516001600160a01b031683529383019391830191600101610c9b565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115610cf457610cf4610d51565b500190565b600082610d1657634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615610d3557610d35610d51565b500290565b600082821015610d4c57610d4c610d51565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220158a643784b44c3c2739fc4173c9757cdd83d7b4083f9539b8c2bce91518db6164736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063c2ed286b116100a2578063dc1052e211610071578063dc1052e2146103e2578063dd62ed3e146103f5578063ea414b281461042e578063f2fde38b1461044157600080fd5b8063c2ed286b146103ab578063cc1776d3146103be578063d00efb2f146103c6578063d31acb28146103cf57600080fd5b80638cd09d50116100de5780638cd09d501461036c5780638da5cb5b1461037f57806395d89b4114610390578063a9059cbb1461039857600080fd5b806370a0823114610329578063715018a6146103525780638091f3bf1461035a57600080fd5b806328be90381161017c5780634f7041a51161014b5780634f7041a5146102d45780634f72e2a2146102dc57806351508f0a146102ef5780636331bf651461030257600080fd5b806328be9038146102875780632e5bb6ff1461029a578063313ce567146102ad578063442ef7d2146102cc57600080fd5b806309653674116101b8578063096536741461022a57806318160ddd1461023d578063185511081461024f57806323b872dd1461027457600080fd5b806301339c21146101df57806306fdde03146101e9578063095ea7b314610207575b600080fd5b6101e7610454565b005b6101f16104ce565b6040516101fe919061183d565b60405180910390f35b61021a610215366004611785565b61055c565b60405190151581526020016101fe565b6101e76102383660046117e9565b61065b565b6003545b6040519081526020016101fe565b6009546001600160a01b03165b6040516001600160a01b0390911681526020016101fe565b61021a610282366004611712565b6106c5565b6101e761029536600461174e565b6107cc565b6101e76102a83660046117e9565b61085c565b6006546102ba9060ff1681565b60405160ff90911681526020016101fe565b6101e76108f3565b6102416109c6565b6101e76102ea3660046117af565b610a48565b6101e76102fd3660046116bd565b610a6e565b6102417f00000000000000000000000000000000000000000000d3c261325e6fe5f4000081565b6102416103373660046116bd565b6001600160a01b031660009081526001602052604090205490565b6101e7610af8565b60065461021a90610100900460ff1681565b6101e761037a3660046117e9565b610b0c565b6000546001600160a01b031661025c565b6101f1610b45565b61021a6103a6366004611785565b610b52565b6101e76103b936600461174e565b610bab565b610241610c5c565b61024160075481565b6101e76103dd36600461181b565b610ca1565b6101e76103f03660046117e9565b610cb4565b6102416104033660046116df565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6101e761043c3660046116bd565b610ced565b6101e761044f3660046116bd565b610d27565b61045c610d65565b600654610100900460ff16156104b95760405162461bcd60e51b815260206004820152601960248201527f636f6e747261637420616c7265616479206c61756e636865640000000000000060448201526064015b60405180910390fd5b6006805461ff00191661010017905543600755565b600580546104db906118ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610507906118ee565b80156105545780601f1061052957610100808354040283529160200191610554565b820191906000526020600020905b81548152906001019060200180831161053757829003601f168201915b505050505081565b6006546000903390610100900460ff168061058457506000546001600160a01b038281169116145b6105a05760405162461bcd60e51b81526004016104b090611892565b6001600160a01b0384166105f65760405162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420617070726f766520746865203020616464726573730000000060448201526064016104b0565b3360008181526002602090815260408083206001600160a01b03891680855290835292819020879055518681529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35060019392505050565b610663610d65565b6009546040516302594d9d60e21b8152600481018390526001600160a01b03909116906309653674906024015b600060405180830381600087803b1580156106aa57600080fd5b505af11580156106be573d6000803e3d6000fd5b5050505050565b6006546000908490610100900460ff16806106ed57506000546001600160a01b038281169116145b6107095760405162461bcd60e51b81526004016104b090611892565b6001600160a01b03851660009081526002602090815260408083203384529091529020546107389084906118d7565b6001600160a01b0386166000908152600260209081526040808320338452909152902055610767858585610d92565b6001600160a01b038516600081815260026020908152604080832033808552908352928190205490519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3506001949350505050565b6107d4610d65565b6001600160a01b03821660009081526008602052604090205460ff16151581151514156108315760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b60448201526064016104b0565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b610864610d65565b6009546040516308cd09d560e41b8152600481018390526001600160a01b0390911690638cd09d5090602401600060405180830381600087803b1580156108aa57600080fd5b505af11580156108be573d6000803e3d6000fd5b5050600954604051636e08297160e11b8152600481018590526001600160a01b03909116925063dc1052e29150602401610690565b600654610100900460ff1661095c5760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b60648201526084016104b0565b600960009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156109ac57600080fd5b505af11580156109c0573d6000803e3d6000fd5b50505050565b60095460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a916004808301926020929190829003018186803b158015610a0b57600080fd5b505afa158015610a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a439190611802565b905090565b610a50610d65565b600a8054911515600160a01b0260ff60a01b19909216919091179055565b610a76610d65565b6009546040516328a8478560e11b81526001600160a01b038381166004830152909116906351508f0a90602401600060405180830381600087803b158015610abd57600080fd5b505af1158015610ad1573d6000803e3d6000fd5b5050600a80546001600160a01b0319166001600160a01b0394909416939093179092555050565b610b00610d65565b610b0a6000610ed9565b565b610b14610d65565b6009546040516308cd09d560e41b8152600481018390526001600160a01b0390911690638cd09d5090602401610690565b600480546104db906118ee565b6006546000903390610100900460ff1680610b7a57506000546001600160a01b038281169116145b610b965760405162461bcd60e51b81526004016104b090611892565b610ba1338585610d92565b5060019392505050565b610bb3610d65565b6001600160a01b03821660009081526008602052604090205460ff161580610bd9575080155b610c315760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b60648201526084016104b0565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6009546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de916004808301926020929190829003018186803b158015610a0b57600080fd5b610ca9610d65565b600d91909155600c55565b610cbc610d65565b600954604051636e08297160e11b8152600481018390526001600160a01b039091169063dc1052e290602401610690565b610cf5610d65565b600954604051631d48296560e31b81526001600160a01b0383811660048301529091169063ea414b2890602401610690565b610d2f610d65565b6001600160a01b038116610d5957604051631e4fbdf760e01b8152600060048201526024016104b0565b610d6281610ed9565b50565b6000546001600160a01b03163314610b0a5760405163118cdaa760e01b81523360048201526024016104b0565b6001600160a01b038216610de15760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b60448201526064016104b0565b610dec838383610f29565b6000610df984848461108f565b6001600160a01b038516600090815260016020526040902054909150610e209083906118d7565b6001600160a01b038086166000908152600160205260408082209390935590851681522054610e509082906118bf565b6001600160a01b038085166000818152600160205260408082208590559288168152918220549152610e869186919086906110a4565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610ecb91815260200190565b60405180910390a350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600654610100900460ff168015610f4e57506000546001600160a01b03848116911614155b8015610f6857506000546001600160a01b03838116911614155b8015610f8d57506001600160a01b03821660009081526008602052604090205460ff16155b8015610fb25750610f9c6110b0565b6001600160a01b0316826001600160a01b031614155b8015610fcc57506009546001600160a01b03838116911614155b8015610fe657506009546001600160a01b03848116911614155b1561107f576001600160a01b0382166000908152600160205260409020547f00000000000000000000000000000000000000000000d3c261325e6fe5f40000906110319083906118bf565b111561107f5760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e7460448201526064016104b0565b61108a838383611199565b505050565b600061109c8484846113ad565b949350505050565b6109c0848484846115bc565b600046600114806110c15750466003145b806110cc5750466004145b806110d75750466005145b156110f55750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b4662aa36a71415611119575073c532a74256d3db42d0bf7a0400fefdbad769400890565b466038141561113b57507310ed43c718714eb63d5aa57b78b54704e256024e90565b46612105141561115e575073fcd3842f85ed87ba2889b4d35893403796e67ff190565b60405162461bcd60e51b815260206004820152601060248201526f155b9adb9bdddb8810da185a5b88125160821b60448201526064016104b0565b60095460408051630dd8715760e01b815290516000926001600160a01b031691630dd87157916004808301926020929190829003018186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112169190611802565b61122090426118d7565b600654909150610100900460ff1680156112435750600a54600160a01b900460ff165b801561126757506001600160a01b03831660009081526008602052604090205460ff165b8015611281575042600f54603c61127e91906118bf565b11155b801561128f5750600c548110155b80156112b75750600d546009546001600160a01b031660009081526001602052604090205410155b80156113465750600960009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b815260040160206040518083038186803b15801561130c57600080fd5b505afa158015611320573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134491906117cc565b155b156113a85742600f556009546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b15801561139557600080fd5b505af19250505080156113a6575060015b505b6109c0565b6001600160a01b0383166000908152600e6020526040812054829060ff161580156113f157506001600160a01b0384166000908152600e602052604090205460ff16155b80156114045750600654610100900460ff165b15611551576001600160a01b03851660009081526008602052604090205460ff16156114af5760095460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc790602401602060405180830381600087803b15801561147057600080fd5b505af1158015611484573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a89190611802565b9050611551565b6001600160a01b03841660009081526008602052604090205460ff161561155157600954604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd590602401602060405180830381600087803b15801561151657600080fd5b505af115801561152a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154e9190611802565b90505b600061155d82856118d7565b905080156115a7576009546001600160a01b031660009081526001602052604090205461158b9082906118bf565b6009546001600160a01b03166000908152600160205260409020555b6115b2868684611636565b9695505050505050565b600a546040516347d64b2f60e11b81526001600160a01b0386811660048301526024820186905284811660448301526064820184905290911690638fac965e90608401600060405180830381600087803b15801561161957600080fd5b505af115801561162d573d6000803e3d6000fd5b505050506109c0565b6000826001600160a01b0316846001600160a01b0316141561169a5760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c660060448201526064016104b0565b5092915050565b80356001600160a01b03811681146116b857600080fd5b919050565b6000602082840312156116cf57600080fd5b6116d8826116a1565b9392505050565b600080604083850312156116f257600080fd5b6116fb836116a1565b9150611709602084016116a1565b90509250929050565b60008060006060848603121561172757600080fd5b611730846116a1565b925061173e602085016116a1565b9150604084013590509250925092565b6000806040838503121561176157600080fd5b61176a836116a1565b9150602083013561177a8161193f565b809150509250929050565b6000806040838503121561179857600080fd5b6117a1836116a1565b946020939093013593505050565b6000602082840312156117c157600080fd5b81356116d88161193f565b6000602082840312156117de57600080fd5b81516116d88161193f565b6000602082840312156117fb57600080fd5b5035919050565b60006020828403121561181457600080fd5b5051919050565b6000806040838503121561182e57600080fd5b50508035926020909101359150565b600060208083528351808285015260005b8181101561186a5785810183015185820160400152820161184e565b8181111561187c576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b600082198211156118d2576118d2611929565b500190565b6000828210156118e9576118e9611929565b500390565b600181811c9082168061190257607f821691505b6020821081141561192357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8015158114610d6257600080fdfea26469706673582212206d48d949a9b073adc7107a3fde862889837a308374a96eb58ea9ff4d99d1e2de64736f6c63430008070033
Deployed Bytecode Sourcemap
33574:2681:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22434:182;;;:::i;:::-;;18657:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21287:314;;;;;;:::i;:::-;;:::i;:::-;;;3508:14:1;;3501:22;3483:41;;3471:2;3456:18;21287:314:0;3343:187:1;28667:125:0;;;;;;:::i;:::-;;:::i;19369:102::-;19451:12;;19369:102;;;7913:25:1;;;7901:2;7886:18;19369:102:0;7767:177:1;27609:114:0;27700:14;;-1:-1:-1;;;;;27700:14:0;27609:114;;;-1:-1:-1;;;;;2847:32:1;;;2829:51;;2817:2;2802:18;27609:114:0;2683:203:1;22074:328:0;;;;;;:::i;:::-;;:::i;23071:155::-;;;;;;:::i;:::-;;:::i;36097:::-;;;;;;:::i;:::-;;:::i;18682:21::-;;;;;;;;;;;;8121:4:1;8109:17;;;8091:36;;8079:2;8064:18;18682:21:0;7949:184:1;28964:93:0;;;:::i;27417:102::-;;;:::i;27769:97::-;;;;;;:::i;:::-;;:::i;28800:156::-;;;;;;:::i;:::-;;:::i;33621:33::-;;;;;19688:119;;;;;;:::i;:::-;-1:-1:-1;;;;;19782:17:0;19755:7;19782:17;;;:9;:17;;;;;;;19688:119;17570:103;;;:::i;18716:20::-;;;;;;;;;;;;28310:113;;;;;;:::i;:::-;;:::i;16895:87::-;16941:7;16968:6;-1:-1:-1;;;;;16968:6:0;16895:87;;18630:20;;;:::i;20462:178::-;;;;;;:::i;:::-;;:::i;27874:225::-;;;;;;:::i;:::-;;:::i;27215:104::-;;;:::i;18743:26::-;;;;;;28107:191;;;;;;:::i;:::-;;:::i;28431:111::-;;;;;;:::i;:::-;;:::i;20147:144::-;;;;;;:::i;:::-;-1:-1:-1;;;;;20258:16:0;;;20231:7;20258:16;;;:8;:16;;;;;;;;:25;;;;;;;;;;;;;20147:144;28554:105;;;;;;:::i;:::-;;:::i;17828:220::-;;;;;;:::i;:::-;;:::i;22434:182::-;16781:13;:11;:13::i;:::-;22498:8:::1;::::0;::::1;::::0;::::1;;;:17;22490:55;;;::::0;-1:-1:-1;;;22490:55:0;;6915:2:1;22490:55:0::1;::::0;::::1;6897:21:1::0;6954:2;6934:18;;;6927:30;6993:27;6973:18;;;6966:55;7038:18;;22490:55:0::1;;;;;;;;;22556:8;:15:::0;;-1:-1:-1;;22556:15:0::1;;;::::0;;22596:12:::1;22582:11;:26:::0;22434:182::o;18657:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21287:314::-;19159:8;;21390:4;;21369:10;;19159:8;;;;;;:27;;-1:-1:-1;16941:7:0;16968:6;-1:-1:-1;;;;;19171:15:0;;;16968:6;;19171:15;19159:27;19151:59;;;;-1:-1:-1;;;19151:59:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21415:21:0;::::1;21407:62;;;::::0;-1:-1:-1;;;21407:62:0;;4339:2:1;21407:62:0::1;::::0;::::1;4321:21:1::0;4378:2;4358:18;;;4351:30;4417;4397:18;;;4390:58;4465:18;;21407:62:0::1;4137:352:1::0;21407:62:0::1;21491:10;21482:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;21482:29:0;::::1;::::0;;;;;;;;;;:37;;;21535:36;7913:25:1;;;21482:29:0;;21491:10;21535:36:::1;::::0;7886:18:1;21535:36:0::1;;;;;;;-1:-1:-1::0;21589:4:0::1;::::0;21287:314;-1:-1:-1;;;21287:314:0:o;28667:125::-;16781:13;:11;:13::i;:::-;28742:14:::1;::::0;:42:::1;::::0;-1:-1:-1;;;28742:42:0;;::::1;::::0;::::1;7913:25:1::0;;;-1:-1:-1;;;;;28742:14:0;;::::1;::::0;:34:::1;::::0;7886:18:1;;28742:42:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28667:125:::0;:::o;22074:328::-;19159:8;;22185:4;;22170;;19159:8;;;;;;:27;;-1:-1:-1;16941:7:0;16968:6;-1:-1:-1;;;;;19171:15:0;;;16968:6;;19171:15;19159:27;19151:59;;;;-1:-1:-1;;;19151:59:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22231:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;22246:10:::1;22231:26:::0;;;;;;;;:34:::1;::::0;22260:5;;22231:34:::1;:::i;:::-;-1:-1:-1::0;;;;;22202:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;22217:10:::1;22202:26:::0;;;;;;;:63;22276:26:::1;22211:4:::0;22292:2;22296:5;22276:9:::1;:26::i;:::-;-1:-1:-1::0;;;;;22318:54:0;::::1;22345:14;::::0;;;:8:::1;:14;::::0;;;;;;;22333:10:::1;22345:26:::0;;;;;;;;;;;22318:54;;7913:25:1;;;22333:10:0;;22318:54;::::1;::::0;7886:18:1;22318:54:0::1;;;;;;;-1:-1:-1::0;22390:4:0::1;::::0;22074:328;-1:-1:-1;;;;22074:328:0:o;23071:155::-;16781:13;:11;:13::i;:::-;-1:-1:-1;;;;;23152:14:0;::::1;;::::0;;;:9:::1;:14;::::0;;;;;::::1;;:20;;::::0;::::1;;;;23144:44;;;::::0;-1:-1:-1;;;23144:44:0;;7629:2:1;23144:44:0::1;::::0;::::1;7611:21:1::0;7668:2;7648:18;;;7641:30;-1:-1:-1;;;7687:18:1;;;7680:41;7738:18;;23144:44:0::1;7427:335:1::0;23144:44:0::1;-1:-1:-1::0;;;;;23199:14:0;;;::::1;;::::0;;;:9:::1;:14;::::0;;;;:19;;-1:-1:-1;;23199:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;23071:155::o;36097:::-;16781:13;:11;:13::i;:::-;36162:14:::1;::::0;:36:::1;::::0;-1:-1:-1;;;36162:36:0;;::::1;::::0;::::1;7913:25:1::0;;;-1:-1:-1;;;;;36162:14:0;;::::1;::::0;:25:::1;::::0;7886:18:1;;36162:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36209:14:0::1;::::0;:35:::1;::::0;-1:-1:-1;;;36209:35:0;;::::1;::::0;::::1;7913:25:1::0;;;-1:-1:-1;;;;;36209:14:0;;::::1;::::0;-1:-1:-1;36209:24:0::1;::::0;-1:-1:-1;7886:18:1;;36209:35:0::1;7767:177:1::0;28964:93:0;18876:8;;;;;;;18868:62;;;;-1:-1:-1;;;18868:62:0;;4696:2:1;18868:62:0;;;4678:21:1;4735:2;4715:18;;;4708:30;4774:34;4754:18;;;4747:62;-1:-1:-1;;;4825:18:1;;;4818:39;4874:19;;18868:62:0;4494:405:1;18868:62:0;29022:14:::1;;;;;;;;;-1:-1:-1::0;;;;;29022:14:0::1;-1:-1:-1::0;;;;;29022:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28964:93::o:0;27417:102::-;27485:14;;:26;;;-1:-1:-1;;;27485:26:0;;;;27458:7;;-1:-1:-1;;;;;27485:14:0;;:24;;:26;;;;;;;;;;;;;;:14;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27478:33;;27417:102;:::o;27769:97::-;16781:13;:11;:13::i;:::-;27837:11:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;27837:21:0::1;-1:-1:-1::0;;;;27837:21:0;;::::1;::::0;;;::::1;::::0;;27769:97::o;28800:156::-;16781:13;:11;:13::i;:::-;28870:14:::1;::::0;:37:::1;::::0;-1:-1:-1;;;28870:37:0;;-1:-1:-1;;;;;2847:32:1;;;28870:37:0::1;::::0;::::1;2829:51:1::0;28870:14:0;;::::1;::::0;:32:::1;::::0;2802:18:1;;28870:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;28918:14:0::1;:30:::0;;-1:-1:-1;;;;;;28918:30:0::1;-1:-1:-1::0;;;;;28918:30:0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;28800:156:0:o;17570:103::-;16781:13;:11;:13::i;:::-;17635:30:::1;17662:1;17635:18;:30::i;:::-;17570:103::o:0;28310:113::-;16781:13;:11;:13::i;:::-;28379:14:::1;::::0;:36:::1;::::0;-1:-1:-1;;;28379:36:0;;::::1;::::0;::::1;7913:25:1::0;;;-1:-1:-1;;;;;28379:14:0;;::::1;::::0;:25:::1;::::0;7886:18:1;;28379:36:0::1;7767:177:1::0;18630:20:0;;;;;;;:::i;20462:178::-;19159:8;;20561:4;;20540:10;;19159:8;;;;;;:27;;-1:-1:-1;16941:7:0;16968:6;-1:-1:-1;;;;;19171:15:0;;;16968:6;;19171:15;19159:27;19151:59;;;;-1:-1:-1;;;19151:59:0;;;;;;;:::i;:::-;20578:32:::1;20588:10;20600:2;20604:5;20578:9;:32::i;:::-;-1:-1:-1::0;20628:4:0::1;::::0;20462:178;-1:-1:-1;;;20462:178:0:o;27874:225::-;16781:13;:11;:13::i;:::-;-1:-1:-1;;;;;27967:14:0;::::1;;::::0;;;:9:::1;:14;::::0;;;;;::::1;;:23;::::0;:43:::1;;-1:-1:-1::0;27994:16:0;::::1;27967:43;27959:91;;;::::0;-1:-1:-1;;;27959:91:0;;6511:2:1;27959:91:0::1;::::0;::::1;6493:21:1::0;6550:2;6530:18;;;6523:30;6589:34;6569:18;;;6562:62;-1:-1:-1;;;6640:18:1;;;6633:33;6683:19;;27959:91:0::1;6309:399:1::0;27959:91:0::1;-1:-1:-1::0;;;;;28061:20:0;;;::::1;;::::0;;;:15:::1;:20;::::0;;;;:30;;-1:-1:-1;;28061:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;27874:225::o;27215:104::-;27284:14;;:27;;;-1:-1:-1;;;27284:27:0;;;;27257:7;;-1:-1:-1;;;;;27284:14:0;;:25;;:27;;;;;;;;;;;;;;:14;:27;;;;;;;;;;28107:191;16781:13;:11;:13::i;:::-;28211:23:::1;:35:::0;;;;28257:23:::1;:33:::0;28107:191::o;28431:111::-;16781:13;:11;:13::i;:::-;28499:14:::1;::::0;:35:::1;::::0;-1:-1:-1;;;28499:35:0;;::::1;::::0;::::1;7913:25:1::0;;;-1:-1:-1;;;;;28499:14:0;;::::1;::::0;:24:::1;::::0;7886:18:1;;28499:35:0::1;7767:177:1::0;28554:105:0;16781:13;:11;:13::i;:::-;28619:14:::1;::::0;:32:::1;::::0;-1:-1:-1;;;28619:32:0;;-1:-1:-1;;;;;2847:32:1;;;28619::0::1;::::0;::::1;2829:51:1::0;28619:14:0;;::::1;::::0;:27:::1;::::0;2802:18:1;;28619:32:0::1;2683:203:1::0;17828:220:0;16781:13;:11;:13::i;:::-;-1:-1:-1;;;;;17913:22:0;::::1;17909:93;;17959:31;::::0;-1:-1:-1;;;17959:31:0;;17987:1:::1;17959:31;::::0;::::1;2829:51:1::0;2802:18;;17959:31:0::1;2683:203:1::0;17909:93:0::1;18012:28;18031:8;18012:18;:28::i;:::-;17828:220:::0;:::o;17060:166::-;16941:7;16968:6;-1:-1:-1;;;;;16968:6:0;15250:10;17120:23;17116:103;;17167:40;;-1:-1:-1;;;17167:40:0;;15250:10;17167:40;;;2829:51:1;2802:18;;17167:40:0;2683:203:1;24214:485:0;-1:-1:-1;;;;;24301:16:0;;24293:51;;;;-1:-1:-1;;;24293:51:0;;6160:2:1;24293:51:0;;;6142:21:1;6199:2;6179:18;;;6172:30;-1:-1:-1;;;6218:18:1;;;6211:52;6280:18;;24293:51:0;5958:346:1;24293:51:0;24357:28;24369:4;24375:2;24379:5;24357:11;:28::i;:::-;24398:22;24423:40;24447:4;24453:2;24457:5;24423:23;:40::i;:::-;-1:-1:-1;;;;;24492:15:0;;;;;;:9;:15;;;;;;24398:65;;-1:-1:-1;24492:23:0;;24510:5;;24492:23;:::i;:::-;-1:-1:-1;;;;;24474:15:0;;;;;;;:9;:15;;;;;;:41;;;;24542:13;;;;;;;:30;;24558:14;;24542:30;:::i;:::-;-1:-1:-1;;;;;24526:13:0;;;;;;;:9;:13;;;;;;:46;;;24604:15;;;;;;;;;24625:13;;24585:54;;24598:4;;24604:15;24536:2;;24585:12;:54::i;:::-;24672:2;-1:-1:-1;;;;;24657:34:0;24666:4;-1:-1:-1;;;;;24657:34:0;;24676:14;24657:34;;;;7913:25:1;;7901:2;7886:18;;7767:177;24657:34:0;;;;;;;;24282:417;24214:485;;;:::o;18208:191::-;18282:16;18301:6;;-1:-1:-1;;;;;18318:17:0;;;-1:-1:-1;;;;;;18318:17:0;;;;;;18351:40;;18301:6;;;;;;;18351:40;;18282:16;18351:40;18271:128;18208:191;:::o;35123:535::-;35244:8;;;;;;;:41;;;;-1:-1:-1;16941:7:0;16968:6;-1:-1:-1;;;;;35270:15:0;;;16968:6;;35270:15;;35244:41;:58;;;;-1:-1:-1;16941:7:0;16968:6;-1:-1:-1;;;;;35289:13:0;;;16968:6;;35289:13;;35244:58;:98;;;;-1:-1:-1;;;;;;35320:13:0;;;;;;:9;:13;;;;;;;;:22;35244:98;:140;;;;;35366:18;:16;:18::i;:::-;-1:-1:-1;;;;;35360:24:0;:2;-1:-1:-1;;;;;35360:24:0;;;35244:140;:186;;;;-1:-1:-1;35415:14:0;;-1:-1:-1;;;;;35401:29:0;;;35415:14;;35401:29;;35244:186;:234;;;;-1:-1:-1;35463:14:0;;-1:-1:-1;;;;;35447:31:0;;;35463:14;;35447:31;;35244:234;35240:356;;;-1:-1:-1;;;;;35514:13:0;;;;;;:9;:13;;;;;;35539:8;;35514:21;;35530:5;;35514:21;:::i;:::-;:33;;35505:79;;;;-1:-1:-1;;;35505:79:0;;5106:2:1;35505:79:0;;;5088:21:1;;;5125:18;;;5118:30;5184:34;5164:18;;;5157:62;5236:18;;35505:79:0;4904:356:1;35505:79:0;35616:34;35634:4;35640:2;35644:5;35616:17;:34::i;:::-;35123:535;;;:::o;35887:202::-;36008:7;36035:46;36065:4;36071:2;36075:5;36035:29;:46::i;:::-;36028:53;35887:202;-1:-1:-1;;;;35887:202:0:o;35670:205::-;35815:52;35834:4;35840:11;35853:2;35857:9;35815:18;:52::i;23260:732::-;23311:21;23349:13;23366:1;23349:18;:40;;;;23371:13;23388:1;23371:18;23349:40;:62;;;;23393:13;23410:1;23393:18;23349:62;:85;;;;23416:13;23433:1;23416:18;23349:85;23345:640;;;-1:-1:-1;23467:42:0;23260:732;:::o;23345:640::-;23544:13;23561:8;23544:25;23540:445;;;-1:-1:-1;23603:42:0;23260:732;:::o;23540:445::-;23678:13;23695:2;23678:19;23674:311;;;-1:-1:-1;23730:42:0;23260:732;:::o;23674:311::-;23810:13;23827:4;23810:21;23806:179;;;-1:-1:-1;23864:42:0;23260:732;:::o;23806:179::-;23947:26;;-1:-1:-1;;;23947:26:0;;5815:2:1;23947:26:0;;;5797:21:1;5854:2;5834:18;;;5827:30;-1:-1:-1;;;5873:18:1;;;5866:46;5929:18;;23947:26:0;5613:340:1;26118:693:0;26263:14;;:29;;;-1:-1:-1;;;26263:29:0;;;;26217:25;;-1:-1:-1;;;;;26263:14:0;;:27;;:29;;;;;;;;;;;;;;:14;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26245:47;;:15;:47;:::i;:::-;26321:8;;26217:75;;-1:-1:-1;26321:8:0;;;;;:37;;;;-1:-1:-1;26347:11:0;;-1:-1:-1;;;26347:11:0;;;;26321:37;:68;;;;-1:-1:-1;;;;;;26376:13:0;;;;;;:9;:13;;;;;;;;26321:68;:123;;;;;26429:15;26407:13;;26423:2;26407:18;;;;:::i;:::-;:37;;26321:123;:184;;;;;26482:23;;26461:17;:44;;26321:184;:262;;;;-1:-1:-1;26560:23:0;;26540:14;;-1:-1:-1;;;;;26540:14:0;26522:34;;;;:9;:34;;;;;;:61;;26321:262;:311;;;;;26600:14;;;;;;;;;-1:-1:-1;;;;;26600:14:0;-1:-1:-1;;;;;26600:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;26321:311;26303:456;;;26675:15;26659:13;:31;26709:14;;:27;;;-1:-1:-1;;;26709:27:0;;;;-1:-1:-1;;;;;26709:14:0;;;;:25;;:27;;;;;:14;;:27;;;;;;;;:14;;:27;;;;;;;;;;;;;;;;;;;;;;;;;26705:43;;26769:34;35123:535;25260:848;-1:-1:-1;;;;;25446:21:0;;25369:7;25446:21;;;:15;:21;;;;;;25424:5;;25446:21;;:30;;;:62;;-1:-1:-1;;;;;;25480:19:0;;;;;;:15;:19;;;;;;;;:28;25446:62;:74;;;;-1:-1:-1;25512:8:0;;;;;;;25446:74;25442:390;;;-1:-1:-1;;;;;25541:15:0;;;;;;:9;:15;;;;;;;;25537:284;;;25628:14;;:32;;-1:-1:-1;;;25628:32:0;;;;;7913:25:1;;;-1:-1:-1;;;;;25628:14:0;;;;:25;;7886:18:1;;25628:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25611:49;;25537:284;;;-1:-1:-1;;;;;25686:13:0;;;;;;:9;:13;;;;;;;;25682:139;;;25772:14;;:33;;-1:-1:-1;;;25772:33:0;;;;;7913:25:1;;;-1:-1:-1;;;;;25772:14:0;;;;:26;;7886:18:1;;25772:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25755:50;;25682:139;25844:17;25864:22;25872:14;25864:5;:22;:::i;:::-;25844:42;-1:-1:-1;25901:13:0;;25897:129;;25986:14;;-1:-1:-1;;;;;25986:14:0;25968:34;;;;:9;:34;;;;;;:46;;26005:9;;25968:46;:::i;:::-;25949:14;;-1:-1:-1;;;;;25949:14:0;25931:34;;;;:9;:34;;;;;:83;25897:129;26045:55;26075:4;26081:2;26085:14;26045:29;:55::i;:::-;26038:62;25260:848;-1:-1:-1;;;;;;25260:848:0:o;26819:259::-;26945:14;;:62;;-1:-1:-1;;;26945:62:0;;-1:-1:-1;;;;;3178:15:1;;;26945:62:0;;;3160:34:1;3210:18;;;3203:34;;;3273:15;;;3253:18;;;3246:43;3305:18;;;3298:34;;;26945:14:0;;;;:28;;3094:19:1;;26945:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27018:52;28964:93;22624:205;22724:7;22760:2;-1:-1:-1;;;;;22752:10:0;:4;-1:-1:-1;;;;;22752:10:0;;;22744:54;;;;-1:-1:-1;;;22744:54:0;;7269:2:1;22744:54:0;;;7251:21:1;7308:2;7288:18;;;7281:30;7347:33;7327:18;;;7320:61;7398:18;;22744:54:0;7067:355:1;22744:54:0;-1:-1:-1;22816:5:0;22624:205;-1:-1:-1;;22624:205:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:315::-;1046:6;1054;1107:2;1095:9;1086:7;1082:23;1078:32;1075:52;;;1123:1;1120;1113:12;1075:52;1146:29;1165:9;1146:29;:::i;:::-;1136:39;;1225:2;1214:9;1210:18;1197:32;1238:28;1260:5;1238:28;:::i;:::-;1285:5;1275:15;;;981:315;;;;;:::o;1301:254::-;1369:6;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1469:29;1488:9;1469:29;:::i;:::-;1459:39;1545:2;1530:18;;;;1517:32;;-1:-1:-1;;;1301:254:1:o;1560:241::-;1616:6;1669:2;1657:9;1648:7;1644:23;1640:32;1637:52;;;1685:1;1682;1675:12;1637:52;1724:9;1711:23;1743:28;1765:5;1743:28;:::i;1806:245::-;1873:6;1926:2;1914:9;1905:7;1901:23;1897:32;1894:52;;;1942:1;1939;1932:12;1894:52;1974:9;1968:16;1993:28;2015:5;1993:28;:::i;2056:180::-;2115:6;2168:2;2156:9;2147:7;2143:23;2139:32;2136:52;;;2184:1;2181;2174:12;2136:52;-1:-1:-1;2207:23:1;;2056:180;-1:-1:-1;2056:180:1:o;2241:184::-;2311:6;2364:2;2352:9;2343:7;2339:23;2335:32;2332:52;;;2380:1;2377;2370:12;2332:52;-1:-1:-1;2403:16:1;;2241:184;-1:-1:-1;2241:184:1:o;2430:248::-;2498:6;2506;2559:2;2547:9;2538:7;2534:23;2530:32;2527:52;;;2575:1;2572;2565:12;2527:52;-1:-1:-1;;2598:23:1;;;2668:2;2653:18;;;2640:32;;-1:-1:-1;2430:248:1:o;3535:597::-;3647:4;3676:2;3705;3694:9;3687:21;3737:6;3731:13;3780:6;3775:2;3764:9;3760:18;3753:34;3805:1;3815:140;3829:6;3826:1;3823:13;3815:140;;;3924:14;;;3920:23;;3914:30;3890:17;;;3909:2;3886:26;3879:66;3844:10;;3815:140;;;3973:6;3970:1;3967:13;3964:91;;;4043:1;4038:2;4029:6;4018:9;4014:22;4010:31;4003:42;3964:91;-1:-1:-1;4116:2:1;4095:15;-1:-1:-1;;4091:29:1;4076:45;;;;4123:2;4072:54;;3535:597;-1:-1:-1;;;3535:597:1:o;5265:343::-;5467:2;5449:21;;;5506:2;5486:18;;;5479:30;-1:-1:-1;;;5540:2:1;5525:18;;5518:49;5599:2;5584:18;;5265:343::o;8138:128::-;8178:3;8209:1;8205:6;8202:1;8199:13;8196:39;;;8215:18;;:::i;:::-;-1:-1:-1;8251:9:1;;8138:128::o;8271:125::-;8311:4;8339:1;8336;8333:8;8330:34;;;8344:18;;:::i;:::-;-1:-1:-1;8381:9:1;;8271:125::o;8401:380::-;8480:1;8476:12;;;;8523;;;8544:61;;8598:4;8590:6;8586:17;8576:27;;8544:61;8651:2;8643:6;8640:14;8620:18;8617:38;8614:161;;;8697:10;8692:3;8688:20;8685:1;8678:31;8732:4;8729:1;8722:15;8760:4;8757:1;8750:15;8614:161;;8401:380;;;:::o;8786:127::-;8847:10;8842:3;8838:20;8835:1;8828:31;8878:4;8875:1;8868:15;8902:4;8899:1;8892:15;8918:118;9004:5;8997:13;8990:21;8983:5;8980:32;8970:60;;9026:1;9023;9016:12
Swarm Source
ipfs://158a643784b44c3c2739fc4173c9757cdd83d7b4083f9539b8c2bce91518db61
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.