More Info
Private Name Tags
ContractCreator
Latest 16 from a total of 16 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Liquidity Ba... | 16414900 | 745 days ago | IN | 0 ETH | 0.00156954 | ||||
Set Liquidity Ba... | 16344260 | 754 days ago | IN | 0 ETH | 0.00095419 | ||||
Set Liquidity Ba... | 16333414 | 756 days ago | IN | 0 ETH | 0.0003713 | ||||
Set Liquidity Ba... | 16313254 | 759 days ago | IN | 0 ETH | 0.00050231 | ||||
Set Price Impact... | 16299604 | 761 days ago | IN | 0 ETH | 0.00091102 | ||||
Set Liquidity Ba... | 16299604 | 761 days ago | IN | 0 ETH | 0.0009104 | ||||
Set Price Impact... | 16299201 | 761 days ago | IN | 0 ETH | 0.00050575 | ||||
Set Liquidity Ba... | 16299039 | 761 days ago | IN | 0 ETH | 0.00060206 | ||||
Set Liquidity Ba... | 16259869 | 766 days ago | IN | 0 ETH | 0.00060046 | ||||
Set Price Impact... | 16243446 | 769 days ago | IN | 0 ETH | 0.00048134 | ||||
Set Price Impact... | 16234589 | 770 days ago | IN | 0 ETH | 0.00054833 | ||||
Set Price Impact... | 16234255 | 770 days ago | IN | 0 ETH | 0.00077287 | ||||
Set Primary Pool | 16234191 | 770 days ago | IN | 0 ETH | 0.00127058 | ||||
Add Exchange Poo... | 16234183 | 770 days ago | IN | 0 ETH | 0.00300515 | ||||
Set Primary Pool | 16234027 | 770 days ago | IN | 0 ETH | 0.00079152 | ||||
Add Exchange Poo... | 16234025 | 770 days ago | IN | 0 ETH | 0.00145394 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
18901848 | 395 days ago | 0.00002653 ETH | ||||
18901848 | 395 days ago | 0.00002653 ETH | ||||
17949212 | 529 days ago | 0.00004601 ETH | ||||
17949212 | 529 days ago | 0.00004601 ETH | ||||
17095911 | 649 days ago | 0.00275225 ETH | ||||
17095911 | 649 days ago | 0.00275225 ETH | ||||
17057903 | 654 days ago | 0.00057659 ETH | ||||
17057903 | 654 days ago | 0.00057659 ETH | ||||
17020872 | 660 days ago | 0.00178097 ETH | ||||
17020872 | 660 days ago | 0.00178097 ETH | ||||
16982991 | 665 days ago | 0.00174954 ETH | ||||
16982991 | 665 days ago | 0.00174954 ETH | ||||
16965393 | 667 days ago | 0.00255039 ETH | ||||
16965393 | 667 days ago | 0.00255039 ETH | ||||
16956757 | 669 days ago | 0.00597266 ETH | ||||
16956757 | 669 days ago | 0.00597266 ETH | ||||
16901351 | 676 days ago | 0.00243417 ETH | ||||
16901351 | 676 days ago | 0.00243417 ETH | ||||
16901195 | 676 days ago | 0.00460316 ETH | ||||
16901195 | 676 days ago | 0.00460316 ETH | ||||
16892881 | 678 days ago | 0.00131133 ETH | ||||
16892881 | 678 days ago | 0.00131133 ETH | ||||
16874317 | 680 days ago | 0.00762776 ETH | ||||
16874317 | 680 days ago | 0.00762776 ETH | ||||
16861758 | 682 days ago | 0.00101984 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
TreasuryHandlerAlpha
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-15 */ // SPDX-License-Identifier: MIT // File: ITreasuryHandler.sol pragma solidity 0.8.11; /** * @title Treasury handler interface * @dev Any class that implements this interface can be used for protocol-specific operations pertaining to the treasury. */ interface ITreasuryHandler { /** * @notice Perform operations before a transfer is executed. * @param benefactor Address of the benefactor. * @param beneficiary Address of the beneficiary. * @param amount Number of tokens in the transfer. */ function beforeTransferHandler( address benefactor, address beneficiary, uint256 amount ) external; /** * @notice Perform operations after a transfer is executed. * @param benefactor Address of the benefactor. * @param beneficiary Address of the beneficiary. * @param amount Number of tokens in the transfer. */ function afterTransferHandler( address benefactor, address beneficiary, uint256 amount ) external; } // File: LenientReentrancyGuard.sol pragma solidity 0.8.11; /** * @title Lenient Reentrancy Guard * @dev A near carbon copy of OpenZeppelin's ReentrancyGuard contract. The difference between the two being that this * contract will silently return instead of failing. */ abstract contract LenientReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { if (_status == _ENTERED) { return; } _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: ExchangePoolProcessor.sol pragma solidity 0.8.11; /** * @title Exchange pool processor abstract contract. * @dev Keeps an enumerable set of designated exchange addresses as well as a single primary pool address. */ abstract contract ExchangePoolProcessor is Ownable { using EnumerableSet for EnumerableSet.AddressSet; /// @dev Set of exchange pool addresses. EnumerableSet.AddressSet internal _exchangePools; /// @notice Primary exchange pool address. address public primaryPool; /// @notice Emitted when an exchange pool address is added to the set of tracked pool addresses. event ExchangePoolAdded(address exchangePool); /// @notice Emitted when an exchange pool address is removed from the set of tracked pool addresses. event ExchangePoolRemoved(address exchangePool); /// @notice Emitted when the primary pool address is updated. event PrimaryPoolUpdated(address oldPrimaryPool, address newPrimaryPool); /** * @notice Get list of addresses designated as exchange pools. * @return An array of exchange pool addresses. */ function getExchangePoolAddresses() external view returns (address[] memory) { return _exchangePools.values(); } /** * @notice Add an address to the set of exchange pool addresses. * @dev Nothing happens if the pool already exists in the set. * @param exchangePool Address of exchange pool to add. */ function addExchangePool(address exchangePool) external onlyOwner { if (_exchangePools.add(exchangePool)) { emit ExchangePoolAdded(exchangePool); } } /** * @notice Remove an address from the set of exchange pool addresses. * @dev Nothing happens if the pool doesn't exist in the set.. * @param exchangePool Address of exchange pool to remove. */ function removeExchangePool(address exchangePool) external onlyOwner { if (_exchangePools.remove(exchangePool)) { emit ExchangePoolRemoved(exchangePool); } } /** * @notice Set exchange pool address as primary pool. * @dev To prevent issues, only addresses inside the set of exchange pool addresses can be selected as primary pool. * @param exchangePool Address of exchange pool to set as primary pool. */ function setPrimaryPool(address exchangePool) external onlyOwner { require( _exchangePools.contains(exchangePool), "ExchangePoolProcessor:setPrimaryPool:INVALID_POOL: Given address is not registered as exchange pool." ); require( primaryPool != exchangePool, "ExchangePoolProcessor:setPrimaryPool:ALREADY_SET: This address is already the primary pool address." ); address oldPrimaryPool = primaryPool; primaryPool = exchangePool; emit PrimaryPoolUpdated(oldPrimaryPool, exchangePool); } } // File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ 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 * ==== * * [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://diligence.consensys.net/posts/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); } } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: TreasuryHandlerAlpha.sol pragma solidity 0.8.11; /** * @title Treasury handler alpha contract * @dev Sells tokens that have accumulated through taxes and sends the resulting ETH to the treasury. If * `liquidityBasisPoints` has been set to a non-zero value, then that percentage will instead be added to the designated * liquidity pool. */ contract TreasuryHandlerAlpha is ITreasuryHandler, LenientReentrancyGuard, ExchangePoolProcessor { using Address for address payable; using EnumerableSet for EnumerableSet.AddressSet; /// @notice The treasury address. address payable public treasury; /// @notice The token that accumulates through taxes. This will be sold for ETH. IERC20 public token; /// @notice The basis points of tokens to sell and add as liquidity to the pool. uint256 public liquidityBasisPoints; /// @notice The maximum price impact the sell (initiated from this contract) may have. uint256 public priceImpactBasisPoints; /// @notice The Uniswap router that handles the sell and liquidity operations. IUniswapV2Router02 public router; /// @notice Emitted when the basis points value of tokens to add as liquidity is updated. event LiquidityBasisPointsUpdated(uint256 oldBasisPoints, uint256 newBasisPoints); /// @notice Emitted when the maximum price impact basis points value is updated. event PriceImpactBasisPointsUpdated(uint256 oldBasisPoints, uint256 newBasisPoints); /// @notice Emitted when the treasury address is updated. event TreasuryAddressUpdated(address oldTreasuryAddress, address newTreasuryAddress); /** * @param treasuryAddress Address of treasury to use. * @param tokenAddress Address of token to accumulate and sell. * @param routerAddress Address of Uniswap router for sell and liquidity operations. * @param initialLiquidityBasisPoints Initial basis points value of swap to add to liquidity. * @param initialPriceImpactBasisPoints Initial basis points value of price impact to account for during swaps. */ constructor( address treasuryAddress, address tokenAddress, address routerAddress, uint256 initialLiquidityBasisPoints, uint256 initialPriceImpactBasisPoints ) { treasury = payable(treasuryAddress); token = IERC20(tokenAddress); router = IUniswapV2Router02(routerAddress); liquidityBasisPoints = initialLiquidityBasisPoints; priceImpactBasisPoints = initialPriceImpactBasisPoints; } /** * @notice Perform operations before a sell action (or a liquidity addition) is executed. The accumulated tokens are * then sold for ETH. In case the number of accumulated tokens exceeds the price impact percentage threshold, then * the number will be adjusted to stay within the threshold. If a non-zero percentage is set for liquidity, then * that percentage will be added to the primary liquidity pool instead of being sold for ETH and sent to the * treasury. * @param benefactor Address of the benefactor. * @param beneficiary Address of the beneficiary. * @param amount Number of tokens in the transfer. */ function beforeTransferHandler( address benefactor, address beneficiary, uint256 amount ) external nonReentrant { // Silence a few warnings. This will be optimized out by the compiler. benefactor; amount; // No actions are done on transfers other than sells. if (!_exchangePools.contains(beneficiary)) { return; } uint256 contractTokenBalance = token.balanceOf(address(this)); if (contractTokenBalance > 0) { uint256 primaryPoolBalance = token.balanceOf(primaryPool); uint256 maxPriceImpactSale = (primaryPoolBalance * priceImpactBasisPoints) / 10000; // Ensure the price impact is within reasonable bounds. if (contractTokenBalance > maxPriceImpactSale) { contractTokenBalance = maxPriceImpactSale; } // The number of tokens to sell for liquidity purposes. This is calculated as follows: // // B P // L = - * ----- // 2 10000 // // Where: // L = tokens to sell for liquidity // B = available token balance // P = basis points of tokens to use for liquidity // // The number is divided by two to preserve the token side of the token/WETH pool. uint256 tokensForLiquidity = (contractTokenBalance * liquidityBasisPoints) / 20000; uint256 tokensForSwap = contractTokenBalance - tokensForLiquidity; uint256 currentWeiBalance = address(this).balance; _swapTokensForEth(tokensForSwap); uint256 weiEarned = address(this).balance - currentWeiBalance; // No need to divide this number, because that was only to have enough tokens remaining to pair with this // ETH value. uint256 weiForLiquidity = (weiEarned * liquidityBasisPoints) / 10000; if (tokensForLiquidity > 0) { _addLiquidity(tokensForLiquidity, weiForLiquidity); } // It's cheaper to get the active balance rather than calculating based off of the `currentWeiBalance` and // `weiForLiquidity` numbers. uint256 remainingWeiBalance = address(this).balance; if (remainingWeiBalance > 0) { treasury.sendValue(remainingWeiBalance); } } } /** * @notice Perform post-transfer operations. This contract ignores those operations, hence nothing happens. * @param benefactor Address of the benefactor. * @param beneficiary Address of the beneficiary. * @param amount Number of tokens in the transfer. */ function afterTransferHandler( address benefactor, address beneficiary, uint256 amount ) external nonReentrant { // Silence a few warnings. This will be optimized out by the compiler. benefactor; beneficiary; amount; return; } /** * @notice Set new liquidity basis points value. * @param newBasisPoints New liquidity basis points value. Cannot exceed 10,000 (i.e., 100%) as that would break the * calculation. */ function setLiquidityBasisPoints(uint256 newBasisPoints) external onlyOwner { require( newBasisPoints <= 10000, "TreasuryHandlerAlpha:setLiquidityPercentage:INVALID_PERCENTAGE: Cannot set more than 10,000 basis points." ); uint256 oldBasisPoints = liquidityBasisPoints; liquidityBasisPoints = newBasisPoints; emit LiquidityBasisPointsUpdated(oldBasisPoints, newBasisPoints); } /** * @notice Set new price impact basis points value. * @param newBasisPoints New price impact basis points value. */ function setPriceImpactBasisPoints(uint256 newBasisPoints) external onlyOwner { require( newBasisPoints < 1500, "TreasuryHandlerAlpha:setPriceImpactBasisPoints:OUT_OF_BOUNDS: Cannot set price impact too high." ); uint256 oldBasisPoints = priceImpactBasisPoints; priceImpactBasisPoints = newBasisPoints; emit PriceImpactBasisPointsUpdated(oldBasisPoints, newBasisPoints); } /** * @notice Set new treasury address. * @param newTreasuryAddress New treasury address. */ function setTreasury(address newTreasuryAddress) external onlyOwner { require( newTreasuryAddress != address(0), "TreasuryHandlerAlpha:setTreasury:ZERO_TREASURY: Cannot set zero address as treasury." ); address oldTreasuryAddress = address(treasury); treasury = payable(newTreasuryAddress); emit TreasuryAddressUpdated(oldTreasuryAddress, newTreasuryAddress); } /** * @notice Withdraw any tokens or ETH stuck in the treasury handler. * @param tokenAddress Address of the token to withdraw. If set to the zero address, ETH will be withdrawn. * @param amount The number of tokens to withdraw. */ function withdraw(address tokenAddress, uint256 amount) external onlyOwner { require( tokenAddress != address(token), "TreasuryHandlerAlpha:withdraw:INVALID_TOKEN: Not allowed to withdraw token required for swaps." ); if (tokenAddress == address(0)) { treasury.sendValue(amount); } else { IERC20(tokenAddress).transferFrom(address(this), address(treasury), amount); } } /** * @dev Swap accumulated tokens for ETH. * @param tokenAmount Number of tokens to swap for ETH. */ function _swapTokensForEth(uint256 tokenAmount) private { // The ETH/token pool is the primary pool. It always exists. address[] memory path = new address[](2); path[0] = address(token); path[1] = router.WETH(); // Ensure the router can perform the swap for the designated number of tokens. token.approve(address(router), tokenAmount); router.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount, 0, path, address(this), block.timestamp); } /** * @dev Add liquidity to primary pool. * @param tokenAmount Number of tokens to add as liquidity. * @param weiAmount ETH value to pair with the tokens. */ function _addLiquidity(uint256 tokenAmount, uint256 weiAmount) private { // Ensure the router can perform the transfer for the designated number of tokens. token.approve(address(router), tokenAmount); // Both minimum values are set to zero to allow for any form of slippage. router.addLiquidityETH{ value: weiAmount }( address(token), tokenAmount, 0, 0, address(treasury), block.timestamp ); } /** * @notice Allow contract to accept ETH. */ receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"treasuryAddress","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"routerAddress","type":"address"},{"internalType":"uint256","name":"initialLiquidityBasisPoints","type":"uint256"},{"internalType":"uint256","name":"initialPriceImpactBasisPoints","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"exchangePool","type":"address"}],"name":"ExchangePoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"exchangePool","type":"address"}],"name":"ExchangePoolRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldBasisPoints","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBasisPoints","type":"uint256"}],"name":"LiquidityBasisPointsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldBasisPoints","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBasisPoints","type":"uint256"}],"name":"PriceImpactBasisPointsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldPrimaryPool","type":"address"},{"indexed":false,"internalType":"address","name":"newPrimaryPool","type":"address"}],"name":"PrimaryPoolUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldTreasuryAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newTreasuryAddress","type":"address"}],"name":"TreasuryAddressUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"exchangePool","type":"address"}],"name":"addExchangePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"benefactor","type":"address"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"afterTransferHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"benefactor","type":"address"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"beforeTransferHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getExchangePoolAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceImpactBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primaryPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"exchangePool","type":"address"}],"name":"removeExchangePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBasisPoints","type":"uint256"}],"name":"setLiquidityBasisPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBasisPoints","type":"uint256"}],"name":"setPriceImpactBasisPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"exchangePool","type":"address"}],"name":"setPrimaryPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTreasuryAddress","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002b5538038062002b558339818101604052810190620000379190620002ae565b60016000819055506200005f620000536200013b60201b60201c565b6200014360201b60201c565b84600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160078190555080600881905550505050505062000336565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200023b826200020e565b9050919050565b6200024d816200022e565b81146200025957600080fd5b50565b6000815190506200026d8162000242565b92915050565b6000819050919050565b620002888162000273565b81146200029457600080fd5b50565b600081519050620002a8816200027d565b92915050565b600080600080600060a08688031215620002cd57620002cc62000209565b5b6000620002dd888289016200025c565b9550506020620002f0888289016200025c565b945050604062000303888289016200025c565b9350506060620003168882890162000297565b9250506080620003298882890162000297565b9150509295509295909350565b61280f80620003466000396000f3fe6080604052600436106101185760003560e01c8063b7bd0848116100a0578063f0f4426011610064578063f0f442601461035c578063f2fde38b14610385578063f3fef3a3146103ae578063f887ea40146103d7578063fc0c546a146104025761011f565b8063b7bd08481461028b578063c2510346146102b6578063c6512cc1146102df578063dc8f7fa514610308578063e613b1cd146103335761011f565b8063715018a6116100e7578063715018a6146101cc5780637a81085c146101e35780638da5cb5b1461020c5780639be3d69c14610237578063b6044b68146102625761011f565b80630c6df5e4146101245780633f91d69d1461014f5780634a27affb1461017857806361d027b3146101a15761011f565b3661011f57005b600080fd5b34801561013057600080fd5b5061013961042d565b604051610146919061197a565b60405180910390f35b34801561015b57600080fd5b50610176600480360381019061017191906119cd565b61043e565b005b34801561018457600080fd5b5061019f600480360381019061019a9190611a30565b6105cf565b005b3480156101ad57600080fd5b506101b6610666565b6040516101c39190611a7e565b60405180910390f35b3480156101d857600080fd5b506101e161068c565b005b3480156101ef57600080fd5b5061020a60048036038101906102059190611a30565b6106a0565b005b34801561021857600080fd5b50610221610738565b60405161022e9190611aa8565b60405180910390f35b34801561024357600080fd5b5061024c610762565b6040516102599190611aa8565b60405180910390f35b34801561026e57600080fd5b50610289600480360381019061028491906119cd565b610788565b005b34801561029757600080fd5b506102a06107e4565b6040516102ad9190611ad2565b60405180910390f35b3480156102c257600080fd5b506102dd60048036038101906102d891906119cd565b6107ea565b005b3480156102eb57600080fd5b5061030660048036038101906103019190611aed565b610846565b005b34801561031457600080fd5b5061031d610b04565b60405161032a9190611ad2565b60405180910390f35b34801561033f57600080fd5b5061035a60048036038101906103559190611aed565b610b0a565b005b34801561036857600080fd5b50610383600480360381019061037e91906119cd565b610b30565b005b34801561039157600080fd5b506103ac60048036038101906103a791906119cd565b610c4d565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190611b40565b610cd1565b005b3480156103e357600080fd5b506103ec610e97565b6040516103f99190611bdf565b60405180910390f35b34801561040e57600080fd5b50610417610ebd565b6040516104249190611c1b565b60405180910390f35b60606104396002610ee3565b905090565b610446610f04565b61045a816002610f8290919063ffffffff16565b610499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049090611d05565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561052a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052190611de3565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff9df320023cbf5726cbd5bdd99ae23c9382d03b65180d0611d0d72edab96cf8981836040516105c3929190611e03565b60405180910390a15050565b6105d7610f04565b6105dc811061061b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061290611ec4565b60405180910390fd5b60006008549050816008819055507ff033b469dcde9883de2ddbc43cedaa1822d16d33e0f6cc05f4bafd7f0c230300818360405161065a929190611ee4565b60405180910390a15050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610694610f04565b61069e6000610fb2565b565b6106a8610f04565b6127108111156106ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e490611fcb565b60405180910390fd5b60006007549050816007819055507f30509903fd312ceb98221bbdccbef5c72abb85487de2c5053f343438195ded6c818360405161072c929190611ee4565b60405180910390a15050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610790610f04565b6107a481600261107890919063ffffffff16565b156107e1577f1caec4f1ef0e654f520edf2d95d3d035ea6382500dbdd179d37017442e535284816040516107d89190611aa8565b60405180910390a15b50565b60085481565b6107f2610f04565b6108068160026110a890919063ffffffff16565b15610843577f3186e21fde26faa448666270e7a0d53c887d8f040950e4330a2b622e34ed6f448160405161083a9190611aa8565b60405180910390a15b50565b6002600054141561085657610aff565b6002600081905550610872826002610f8290919063ffffffff16565b61087b57610af6565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016108d89190611aa8565b602060405180830381865afa1580156108f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109199190612000565b90506000811115610af4576000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016109a39190611aa8565b602060405180830381865afa1580156109c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e49190612000565b90506000612710600854836109f9919061205c565b610a0391906120e5565b905080831115610a11578092505b6000614e2060075485610a24919061205c565b610a2e91906120e5565b905060008185610a3e9190612116565b90506000479050610a4e826110d8565b60008147610a5c9190612116565b9050600061271060075483610a71919061205c565b610a7b91906120e5565b90506000851115610a9157610a9085826113d3565b5b60004790506000811115610aeb57610aea81600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661158b90919063ffffffff16565b5b50505050505050505b505b60016000819055505b505050565b60075481565b60026000541415610b1a57610b2b565b600260008190555060016000819055505b505050565b610b38610f04565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9f906121e2565b60405180910390fd5b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f430359a6d97ced2b6f93c77a91e7ce9dfd43252eb91e916adba170485cd8a6a48183604051610c41929190611e03565b60405180910390a15050565b610c55610f04565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc90612274565b60405180910390fd5b610cce81610fb2565b50565b610cd9610f04565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d619061232c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610def57610dea81600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661158b90919063ffffffff16565b610e93565b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd30600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401610e4e9392919061234c565b6020604051808303816000875af1158015610e6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9191906123bb565b505b5050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000610ef38360000161167f565b905060608190508092505050919050565b610f0c6116db565b73ffffffffffffffffffffffffffffffffffffffff16610f2a610738565b73ffffffffffffffffffffffffffffffffffffffff1614610f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7790612434565b60405180910390fd5b565b6000610faa836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6116e3565b905092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006110a0836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611706565b905092915050565b60006110d0836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611776565b905092915050565b6000600267ffffffffffffffff8111156110f5576110f4612454565b5b6040519080825280602002602001820160405280156111235781602001602082028036833780820191505090505b509050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160008151811061115d5761115c612483565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611204573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122891906124c7565b8160018151811061123c5761123b612483565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b81526004016112f59291906124f4565b6020604051808303816000875af1158015611314573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133891906123bb565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161139d959493929190612558565b600060405180830381600087803b1580156113b757600080fd5b505af11580156113cb573d6000803e3d6000fd5b505050505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b81526004016114529291906124f4565b6020604051808303816000875af1158015611471573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149591906123bb565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71982600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401611541969594939291906125b2565b60606040518083038185885af115801561155f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906115849190612613565b5050505050565b804710156115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c5906126b2565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516115f490612703565b60006040518083038185875af1925050503d8060008114611631576040519150601f19603f3d011682016040523d82523d6000602084013e611636565b606091505b505090508061167a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116719061278a565b60405180910390fd5b505050565b6060816000018054806020026020016040519081016040528092919081815260200182805480156116cf57602002820191906000526020600020905b8154815260200190600101908083116116bb575b50505050509050919050565b600033905090565b600080836001016000848152602001908152602001600020541415905092915050565b600061171283836116e3565b61176b578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611770565b600090505b92915050565b6000808360010160008481526020019081526020016000205490506000811461187e5760006001826117a89190612116565b90506000600186600001805490506117c09190612116565b905081811461182f5760008660000182815481106117e1576117e0612483565b5b906000526020600020015490508087600001848154811061180557611804612483565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611843576118426127aa565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611884565b60009150505b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006118e1826118b6565b9050919050565b6118f1816118d6565b82525050565b600061190383836118e8565b60208301905092915050565b6000602082019050919050565b60006119278261188a565b6119318185611895565b935061193c836118a6565b8060005b8381101561196d57815161195488826118f7565b975061195f8361190f565b925050600181019050611940565b5085935050505092915050565b60006020820190508181036000830152611994818461191c565b905092915050565b600080fd5b6119aa816118d6565b81146119b557600080fd5b50565b6000813590506119c7816119a1565b92915050565b6000602082840312156119e3576119e261199c565b5b60006119f1848285016119b8565b91505092915050565b6000819050919050565b611a0d816119fa565b8114611a1857600080fd5b50565b600081359050611a2a81611a04565b92915050565b600060208284031215611a4657611a4561199c565b5b6000611a5484828501611a1b565b91505092915050565b6000611a68826118b6565b9050919050565b611a7881611a5d565b82525050565b6000602082019050611a936000830184611a6f565b92915050565b611aa2816118d6565b82525050565b6000602082019050611abd6000830184611a99565b92915050565b611acc816119fa565b82525050565b6000602082019050611ae76000830184611ac3565b92915050565b600080600060608486031215611b0657611b0561199c565b5b6000611b14868287016119b8565b9350506020611b25868287016119b8565b9250506040611b3686828701611a1b565b9150509250925092565b60008060408385031215611b5757611b5661199c565b5b6000611b65858286016119b8565b9250506020611b7685828601611a1b565b9150509250929050565b6000819050919050565b6000611ba5611ba0611b9b846118b6565b611b80565b6118b6565b9050919050565b6000611bb782611b8a565b9050919050565b6000611bc982611bac565b9050919050565b611bd981611bbe565b82525050565b6000602082019050611bf46000830184611bd0565b92915050565b6000611c0582611bac565b9050919050565b611c1581611bfa565b82525050565b6000602082019050611c306000830184611c0c565b92915050565b600082825260208201905092915050565b7f45786368616e6765506f6f6c50726f636573736f723a7365745072696d61727960008201527f506f6f6c3a494e56414c49445f504f4f4c3a20476976656e206164647265737360208201527f206973206e6f7420726567697374657265642061732065786368616e6765207060408201527f6f6f6c2e00000000000000000000000000000000000000000000000000000000606082015250565b6000611cef606483611c36565b9150611cfa82611c47565b608082019050919050565b60006020820190508181036000830152611d1e81611ce2565b9050919050565b7f45786368616e6765506f6f6c50726f636573736f723a7365745072696d61727960008201527f506f6f6c3a414c52454144595f5345543a20546869732061646472657373206960208201527f7320616c726561647920746865207072696d61727920706f6f6c20616464726560408201527f73732e0000000000000000000000000000000000000000000000000000000000606082015250565b6000611dcd606383611c36565b9150611dd882611d25565b608082019050919050565b60006020820190508181036000830152611dfc81611dc0565b9050919050565b6000604082019050611e186000830185611a99565b611e256020830184611a99565b9392505050565b7f547265617375727948616e646c6572416c7068613a7365745072696365496d7060008201527f6163744261736973506f696e74733a4f55545f4f465f424f554e44533a20436160208201527f6e6e6f742073657420707269636520696d7061637420746f6f20686967682e00604082015250565b6000611eae605f83611c36565b9150611eb982611e2c565b606082019050919050565b60006020820190508181036000830152611edd81611ea1565b9050919050565b6000604082019050611ef96000830185611ac3565b611f066020830184611ac3565b9392505050565b7f547265617375727948616e646c6572416c7068613a7365744c6971756964697460008201527f7950657263656e746167653a494e56414c49445f50455243454e544147453a2060208201527f43616e6e6f7420736574206d6f7265207468616e2031302c303030206261736960408201527f7320706f696e74732e0000000000000000000000000000000000000000000000606082015250565b6000611fb5606983611c36565b9150611fc082611f0d565b608082019050919050565b60006020820190508181036000830152611fe481611fa8565b9050919050565b600081519050611ffa81611a04565b92915050565b6000602082840312156120165761201561199c565b5b600061202484828501611feb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612067826119fa565b9150612072836119fa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156120ab576120aa61202d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006120f0826119fa565b91506120fb836119fa565b92508261210b5761210a6120b6565b5b828204905092915050565b6000612121826119fa565b915061212c836119fa565b92508282101561213f5761213e61202d565b5b828203905092915050565b7f547265617375727948616e646c6572416c7068613a736574547265617375727960008201527f3a5a45524f5f54524541535552593a2043616e6e6f7420736574207a65726f2060208201527f616464726573732061732074726561737572792e000000000000000000000000604082015250565b60006121cc605483611c36565b91506121d78261214a565b606082019050919050565b600060208201905081810360008301526121fb816121bf565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061225e602683611c36565b915061226982612202565b604082019050919050565b6000602082019050818103600083015261228d81612251565b9050919050565b7f547265617375727948616e646c6572416c7068613a77697468647261773a494e60008201527f56414c49445f544f4b454e3a204e6f7420616c6c6f77656420746f207769746860208201527f6472617720746f6b656e20726571756972656420666f722073776170732e0000604082015250565b6000612316605e83611c36565b915061232182612294565b606082019050919050565b6000602082019050818103600083015261234581612309565b9050919050565b60006060820190506123616000830186611a99565b61236e6020830185611a99565b61237b6040830184611ac3565b949350505050565b60008115159050919050565b61239881612383565b81146123a357600080fd5b50565b6000815190506123b58161238f565b92915050565b6000602082840312156123d1576123d061199c565b5b60006123df848285016123a6565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061241e602083611c36565b9150612429826123e8565b602082019050919050565b6000602082019050818103600083015261244d81612411565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506124c1816119a1565b92915050565b6000602082840312156124dd576124dc61199c565b5b60006124eb848285016124b2565b91505092915050565b60006040820190506125096000830185611a99565b6125166020830184611ac3565b9392505050565b6000819050919050565b600061254261253d6125388461251d565b611b80565b6119fa565b9050919050565b61255281612527565b82525050565b600060a08201905061256d6000830188611ac3565b61257a6020830187612549565b818103604083015261258c818661191c565b905061259b6060830185611a99565b6125a86080830184611ac3565b9695505050505050565b600060c0820190506125c76000830189611a99565b6125d46020830188611ac3565b6125e16040830187612549565b6125ee6060830186612549565b6125fb6080830185611a99565b61260860a0830184611ac3565b979650505050505050565b60008060006060848603121561262c5761262b61199c565b5b600061263a86828701611feb565b935050602061264b86828701611feb565b925050604061265c86828701611feb565b9150509250925092565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b600061269c601d83611c36565b91506126a782612666565b602082019050919050565b600060208201905081810360008301526126cb8161268f565b9050919050565b600081905092915050565b50565b60006126ed6000836126d2565b91506126f8826126dd565b600082019050919050565b600061270e826126e0565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000612774603a83611c36565b915061277f82612718565b604082019050919050565b600060208201905081810360008301526127a381612767565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122096acfa3ea93f007a6e869bc24a727db9ea8ae9c87eb588781750b276d34c6dda64736f6c634300080b0033000000000000000000000000dd1c8c22593ec7dd8aacd96f914550e0d3d568fb0000000000000000000000000283d310d682284ebc24db33a41bb5a01bdd140b0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012c
Deployed Bytecode
0x6080604052600436106101185760003560e01c8063b7bd0848116100a0578063f0f4426011610064578063f0f442601461035c578063f2fde38b14610385578063f3fef3a3146103ae578063f887ea40146103d7578063fc0c546a146104025761011f565b8063b7bd08481461028b578063c2510346146102b6578063c6512cc1146102df578063dc8f7fa514610308578063e613b1cd146103335761011f565b8063715018a6116100e7578063715018a6146101cc5780637a81085c146101e35780638da5cb5b1461020c5780639be3d69c14610237578063b6044b68146102625761011f565b80630c6df5e4146101245780633f91d69d1461014f5780634a27affb1461017857806361d027b3146101a15761011f565b3661011f57005b600080fd5b34801561013057600080fd5b5061013961042d565b604051610146919061197a565b60405180910390f35b34801561015b57600080fd5b50610176600480360381019061017191906119cd565b61043e565b005b34801561018457600080fd5b5061019f600480360381019061019a9190611a30565b6105cf565b005b3480156101ad57600080fd5b506101b6610666565b6040516101c39190611a7e565b60405180910390f35b3480156101d857600080fd5b506101e161068c565b005b3480156101ef57600080fd5b5061020a60048036038101906102059190611a30565b6106a0565b005b34801561021857600080fd5b50610221610738565b60405161022e9190611aa8565b60405180910390f35b34801561024357600080fd5b5061024c610762565b6040516102599190611aa8565b60405180910390f35b34801561026e57600080fd5b50610289600480360381019061028491906119cd565b610788565b005b34801561029757600080fd5b506102a06107e4565b6040516102ad9190611ad2565b60405180910390f35b3480156102c257600080fd5b506102dd60048036038101906102d891906119cd565b6107ea565b005b3480156102eb57600080fd5b5061030660048036038101906103019190611aed565b610846565b005b34801561031457600080fd5b5061031d610b04565b60405161032a9190611ad2565b60405180910390f35b34801561033f57600080fd5b5061035a60048036038101906103559190611aed565b610b0a565b005b34801561036857600080fd5b50610383600480360381019061037e91906119cd565b610b30565b005b34801561039157600080fd5b506103ac60048036038101906103a791906119cd565b610c4d565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190611b40565b610cd1565b005b3480156103e357600080fd5b506103ec610e97565b6040516103f99190611bdf565b60405180910390f35b34801561040e57600080fd5b50610417610ebd565b6040516104249190611c1b565b60405180910390f35b60606104396002610ee3565b905090565b610446610f04565b61045a816002610f8290919063ffffffff16565b610499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049090611d05565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561052a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052190611de3565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff9df320023cbf5726cbd5bdd99ae23c9382d03b65180d0611d0d72edab96cf8981836040516105c3929190611e03565b60405180910390a15050565b6105d7610f04565b6105dc811061061b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061290611ec4565b60405180910390fd5b60006008549050816008819055507ff033b469dcde9883de2ddbc43cedaa1822d16d33e0f6cc05f4bafd7f0c230300818360405161065a929190611ee4565b60405180910390a15050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610694610f04565b61069e6000610fb2565b565b6106a8610f04565b6127108111156106ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e490611fcb565b60405180910390fd5b60006007549050816007819055507f30509903fd312ceb98221bbdccbef5c72abb85487de2c5053f343438195ded6c818360405161072c929190611ee4565b60405180910390a15050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610790610f04565b6107a481600261107890919063ffffffff16565b156107e1577f1caec4f1ef0e654f520edf2d95d3d035ea6382500dbdd179d37017442e535284816040516107d89190611aa8565b60405180910390a15b50565b60085481565b6107f2610f04565b6108068160026110a890919063ffffffff16565b15610843577f3186e21fde26faa448666270e7a0d53c887d8f040950e4330a2b622e34ed6f448160405161083a9190611aa8565b60405180910390a15b50565b6002600054141561085657610aff565b6002600081905550610872826002610f8290919063ffffffff16565b61087b57610af6565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016108d89190611aa8565b602060405180830381865afa1580156108f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109199190612000565b90506000811115610af4576000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016109a39190611aa8565b602060405180830381865afa1580156109c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e49190612000565b90506000612710600854836109f9919061205c565b610a0391906120e5565b905080831115610a11578092505b6000614e2060075485610a24919061205c565b610a2e91906120e5565b905060008185610a3e9190612116565b90506000479050610a4e826110d8565b60008147610a5c9190612116565b9050600061271060075483610a71919061205c565b610a7b91906120e5565b90506000851115610a9157610a9085826113d3565b5b60004790506000811115610aeb57610aea81600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661158b90919063ffffffff16565b5b50505050505050505b505b60016000819055505b505050565b60075481565b60026000541415610b1a57610b2b565b600260008190555060016000819055505b505050565b610b38610f04565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9f906121e2565b60405180910390fd5b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f430359a6d97ced2b6f93c77a91e7ce9dfd43252eb91e916adba170485cd8a6a48183604051610c41929190611e03565b60405180910390a15050565b610c55610f04565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc90612274565b60405180910390fd5b610cce81610fb2565b50565b610cd9610f04565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d619061232c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610def57610dea81600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661158b90919063ffffffff16565b610e93565b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd30600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401610e4e9392919061234c565b6020604051808303816000875af1158015610e6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9191906123bb565b505b5050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000610ef38360000161167f565b905060608190508092505050919050565b610f0c6116db565b73ffffffffffffffffffffffffffffffffffffffff16610f2a610738565b73ffffffffffffffffffffffffffffffffffffffff1614610f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7790612434565b60405180910390fd5b565b6000610faa836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6116e3565b905092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006110a0836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611706565b905092915050565b60006110d0836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611776565b905092915050565b6000600267ffffffffffffffff8111156110f5576110f4612454565b5b6040519080825280602002602001820160405280156111235781602001602082028036833780820191505090505b509050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160008151811061115d5761115c612483565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611204573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122891906124c7565b8160018151811061123c5761123b612483565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b81526004016112f59291906124f4565b6020604051808303816000875af1158015611314573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133891906123bb565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161139d959493929190612558565b600060405180830381600087803b1580156113b757600080fd5b505af11580156113cb573d6000803e3d6000fd5b505050505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b81526004016114529291906124f4565b6020604051808303816000875af1158015611471573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149591906123bb565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71982600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401611541969594939291906125b2565b60606040518083038185885af115801561155f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906115849190612613565b5050505050565b804710156115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c5906126b2565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516115f490612703565b60006040518083038185875af1925050503d8060008114611631576040519150601f19603f3d011682016040523d82523d6000602084013e611636565b606091505b505090508061167a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116719061278a565b60405180910390fd5b505050565b6060816000018054806020026020016040519081016040528092919081815260200182805480156116cf57602002820191906000526020600020905b8154815260200190600101908083116116bb575b50505050509050919050565b600033905090565b600080836001016000848152602001908152602001600020541415905092915050565b600061171283836116e3565b61176b578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611770565b600090505b92915050565b6000808360010160008481526020019081526020016000205490506000811461187e5760006001826117a89190612116565b90506000600186600001805490506117c09190612116565b905081811461182f5760008660000182815481106117e1576117e0612483565b5b906000526020600020015490508087600001848154811061180557611804612483565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611843576118426127aa565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611884565b60009150505b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006118e1826118b6565b9050919050565b6118f1816118d6565b82525050565b600061190383836118e8565b60208301905092915050565b6000602082019050919050565b60006119278261188a565b6119318185611895565b935061193c836118a6565b8060005b8381101561196d57815161195488826118f7565b975061195f8361190f565b925050600181019050611940565b5085935050505092915050565b60006020820190508181036000830152611994818461191c565b905092915050565b600080fd5b6119aa816118d6565b81146119b557600080fd5b50565b6000813590506119c7816119a1565b92915050565b6000602082840312156119e3576119e261199c565b5b60006119f1848285016119b8565b91505092915050565b6000819050919050565b611a0d816119fa565b8114611a1857600080fd5b50565b600081359050611a2a81611a04565b92915050565b600060208284031215611a4657611a4561199c565b5b6000611a5484828501611a1b565b91505092915050565b6000611a68826118b6565b9050919050565b611a7881611a5d565b82525050565b6000602082019050611a936000830184611a6f565b92915050565b611aa2816118d6565b82525050565b6000602082019050611abd6000830184611a99565b92915050565b611acc816119fa565b82525050565b6000602082019050611ae76000830184611ac3565b92915050565b600080600060608486031215611b0657611b0561199c565b5b6000611b14868287016119b8565b9350506020611b25868287016119b8565b9250506040611b3686828701611a1b565b9150509250925092565b60008060408385031215611b5757611b5661199c565b5b6000611b65858286016119b8565b9250506020611b7685828601611a1b565b9150509250929050565b6000819050919050565b6000611ba5611ba0611b9b846118b6565b611b80565b6118b6565b9050919050565b6000611bb782611b8a565b9050919050565b6000611bc982611bac565b9050919050565b611bd981611bbe565b82525050565b6000602082019050611bf46000830184611bd0565b92915050565b6000611c0582611bac565b9050919050565b611c1581611bfa565b82525050565b6000602082019050611c306000830184611c0c565b92915050565b600082825260208201905092915050565b7f45786368616e6765506f6f6c50726f636573736f723a7365745072696d61727960008201527f506f6f6c3a494e56414c49445f504f4f4c3a20476976656e206164647265737360208201527f206973206e6f7420726567697374657265642061732065786368616e6765207060408201527f6f6f6c2e00000000000000000000000000000000000000000000000000000000606082015250565b6000611cef606483611c36565b9150611cfa82611c47565b608082019050919050565b60006020820190508181036000830152611d1e81611ce2565b9050919050565b7f45786368616e6765506f6f6c50726f636573736f723a7365745072696d61727960008201527f506f6f6c3a414c52454144595f5345543a20546869732061646472657373206960208201527f7320616c726561647920746865207072696d61727920706f6f6c20616464726560408201527f73732e0000000000000000000000000000000000000000000000000000000000606082015250565b6000611dcd606383611c36565b9150611dd882611d25565b608082019050919050565b60006020820190508181036000830152611dfc81611dc0565b9050919050565b6000604082019050611e186000830185611a99565b611e256020830184611a99565b9392505050565b7f547265617375727948616e646c6572416c7068613a7365745072696365496d7060008201527f6163744261736973506f696e74733a4f55545f4f465f424f554e44533a20436160208201527f6e6e6f742073657420707269636520696d7061637420746f6f20686967682e00604082015250565b6000611eae605f83611c36565b9150611eb982611e2c565b606082019050919050565b60006020820190508181036000830152611edd81611ea1565b9050919050565b6000604082019050611ef96000830185611ac3565b611f066020830184611ac3565b9392505050565b7f547265617375727948616e646c6572416c7068613a7365744c6971756964697460008201527f7950657263656e746167653a494e56414c49445f50455243454e544147453a2060208201527f43616e6e6f7420736574206d6f7265207468616e2031302c303030206261736960408201527f7320706f696e74732e0000000000000000000000000000000000000000000000606082015250565b6000611fb5606983611c36565b9150611fc082611f0d565b608082019050919050565b60006020820190508181036000830152611fe481611fa8565b9050919050565b600081519050611ffa81611a04565b92915050565b6000602082840312156120165761201561199c565b5b600061202484828501611feb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612067826119fa565b9150612072836119fa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156120ab576120aa61202d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006120f0826119fa565b91506120fb836119fa565b92508261210b5761210a6120b6565b5b828204905092915050565b6000612121826119fa565b915061212c836119fa565b92508282101561213f5761213e61202d565b5b828203905092915050565b7f547265617375727948616e646c6572416c7068613a736574547265617375727960008201527f3a5a45524f5f54524541535552593a2043616e6e6f7420736574207a65726f2060208201527f616464726573732061732074726561737572792e000000000000000000000000604082015250565b60006121cc605483611c36565b91506121d78261214a565b606082019050919050565b600060208201905081810360008301526121fb816121bf565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061225e602683611c36565b915061226982612202565b604082019050919050565b6000602082019050818103600083015261228d81612251565b9050919050565b7f547265617375727948616e646c6572416c7068613a77697468647261773a494e60008201527f56414c49445f544f4b454e3a204e6f7420616c6c6f77656420746f207769746860208201527f6472617720746f6b656e20726571756972656420666f722073776170732e0000604082015250565b6000612316605e83611c36565b915061232182612294565b606082019050919050565b6000602082019050818103600083015261234581612309565b9050919050565b60006060820190506123616000830186611a99565b61236e6020830185611a99565b61237b6040830184611ac3565b949350505050565b60008115159050919050565b61239881612383565b81146123a357600080fd5b50565b6000815190506123b58161238f565b92915050565b6000602082840312156123d1576123d061199c565b5b60006123df848285016123a6565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061241e602083611c36565b9150612429826123e8565b602082019050919050565b6000602082019050818103600083015261244d81612411565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506124c1816119a1565b92915050565b6000602082840312156124dd576124dc61199c565b5b60006124eb848285016124b2565b91505092915050565b60006040820190506125096000830185611a99565b6125166020830184611ac3565b9392505050565b6000819050919050565b600061254261253d6125388461251d565b611b80565b6119fa565b9050919050565b61255281612527565b82525050565b600060a08201905061256d6000830188611ac3565b61257a6020830187612549565b818103604083015261258c818661191c565b905061259b6060830185611a99565b6125a86080830184611ac3565b9695505050505050565b600060c0820190506125c76000830189611a99565b6125d46020830188611ac3565b6125e16040830187612549565b6125ee6060830186612549565b6125fb6080830185611a99565b61260860a0830184611ac3565b979650505050505050565b60008060006060848603121561262c5761262b61199c565b5b600061263a86828701611feb565b935050602061264b86828701611feb565b925050604061265c86828701611feb565b9150509250925092565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b600061269c601d83611c36565b91506126a782612666565b602082019050919050565b600060208201905081810360008301526126cb8161268f565b9050919050565b600081905092915050565b50565b60006126ed6000836126d2565b91506126f8826126dd565b600082019050919050565b600061270e826126e0565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000612774603a83611c36565b915061277f82612718565b604082019050919050565b600060208201905081810360008301526127a381612767565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122096acfa3ea93f007a6e869bc24a727db9ea8ae9c87eb588781750b276d34c6dda64736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000dd1c8c22593ec7dd8aacd96f914550e0d3d568fb0000000000000000000000000283d310d682284ebc24db33a41bb5a01bdd140b0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012c
-----Decoded View---------------
Arg [0] : treasuryAddress (address): 0xdd1c8C22593ec7dd8AaCd96F914550e0D3D568FB
Arg [1] : tokenAddress (address): 0x0283d310d682284EbC24DB33A41Bb5a01BDD140B
Arg [2] : routerAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [3] : initialLiquidityBasisPoints (uint256): 0
Arg [4] : initialPriceImpactBasisPoints (uint256): 300
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000dd1c8c22593ec7dd8aacd96f914550e0d3d568fb
Arg [1] : 0000000000000000000000000283d310d682284ebc24db33a41bb5a01bdd140b
Arg [2] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 000000000000000000000000000000000000000000000000000000000000012c
Deployed Bytecode Sourcemap
40782:10114:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21160:126;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22406:610;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47662:452;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41022:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19194:103;;;;;;;;;;;;;:::i;:::-;;47058:454;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18546:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20520:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21511:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41398:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21929:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43704:2518;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41262:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46525:310;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48238:441;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19452:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48948:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41528:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41148:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21160:126;21219:16;21255:23;:14;:21;:23::i;:::-;21248:30;;21160:126;:::o;22406:610::-;18432:13;:11;:13::i;:::-;22504:37:::1;22528:12;22504:14;:23;;:37;;;;:::i;:::-;22482:187;;;;;;;;;;;;:::i;:::-;;;;;;;;;22717:12;22702:27;;:11;;;;;;;;;;;:27;;;;22680:176;;;;;;;;;;;;:::i;:::-;;;;;;;;;22869:22;22894:11;;;;;;;;;;;22869:36;;22930:12;22916:11;;:26;;;;;;;;;;;;;;;;;;22960:48;22979:14;22995:12;22960:48;;;;;;;:::i;:::-;;;;;;;;22471:545;22406:610:::0;:::o;47662:452::-;18432:13;:11;:13::i;:::-;47790:4:::1;47773:14;:21;47751:166;;;;;;;;;;;;:::i;:::-;;;;;;;;;47930:22;47955;;47930:47;;48013:14;47988:22;:39;;;;48045:61;48075:14;48091;48045:61;;;;;;;:::i;:::-;;;;;;;;47740:374;47662:452:::0;:::o;41022:31::-;;;;;;;;;;;;;:::o;19194:103::-;18432:13;:11;:13::i;:::-;19259:30:::1;19286:1;19259:18;:30::i;:::-;19194:103::o:0;47058:454::-;18432:13;:11;:13::i;:::-;47185:5:::1;47167:14;:23;;47145:178;;;;;;;;;;;;:::i;:::-;;;;;;;;;47334:22;47359:20;;47334:45;;47413:14;47390:20;:37;;;;47445:59;47473:14;47489;47445:59;;;;;;;:::i;:::-;;;;;;;;47134:378;47058:454:::0;:::o;18546:87::-;18592:7;18619:6;;;;;;;;;;;18612:13;;18546:87;:::o;20520:26::-;;;;;;;;;;;;;:::o;21511:185::-;18432:13;:11;:13::i;:::-;21592:32:::1;21611:12;21592:14;:18;;:32;;;;:::i;:::-;21588:101;;;21646:31;21664:12;21646:31;;;;;;:::i;:::-;;;;;;;;21588:101;21511:185:::0;:::o;41398:37::-;;;;:::o;21929:193::-;18432:13;:11;:13::i;:::-;22013:35:::1;22035:12;22013:14;:21;;:35;;;;:::i;:::-;22009:106;;;22070:33;22090:12;22070:33;;;;;;:::i;:::-;;;;;;;;22009:106;21929:193:::0;:::o;43704:2518::-;2249:1;2771:7;;:19;2767:58;;;2807:7;;2767:58;2249:1;2837:7;:18;;;;44047:36:::1;44071:11;44047:14;:23;;:36;;;;:::i;:::-;44042:76;;44100:7;;44042:76;44130:28;44161:5;;;;;;;;;;;:15;;;44185:4;44161:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44130:61;;44229:1;44206:20;:24;44202:2013;;;44247:26;44276:5;;;;;;;;;;;:15;;;44292:11;;;;;;;;;;;44276:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44247:57;;44319:26;44396:5;44370:22;;44349:18;:43;;;;:::i;:::-;44348:53;;;;:::i;:::-;44319:82;;44514:18;44491:20;:41;44487:123;;;44576:18;44553:41;;44487:123;45144:26;45221:5;45197:20;;45174;:43;;;;:::i;:::-;45173:53;;;;:::i;:::-;45144:82;;45241:21;45288:18;45265:20;:41;;;;:::i;:::-;45241:65;;45323:25;45351:21;45323:49;;45387:32;45405:13;45387:17;:32::i;:::-;45434:17;45478;45454:21;:41;;;;:::i;:::-;45434:61;;45658:23;45721:5;45697:20;;45685:9;:32;;;;:::i;:::-;45684:42;;;;:::i;:::-;45658:68;;45768:1;45747:18;:22;45743:113;;;45790:50;45804:18;45824:15;45790:13;:50::i;:::-;45743:113;46035:27;46065:21;46035:51;;46127:1;46105:19;:23;46101:103;;;46149:39;46168:19;46149:8;;;;;;;;;;;:18;;;;:39;;;;:::i;:::-;46101:103;44232:1983;;;;;;;;44202:2013;43848:2374;2866:1;2205::::0;3014:7;:22;;;;43704:2518;;;;:::o;41262:35::-;;;;:::o;46525:310::-;2249:1;2771:7;;:19;2767:58;;;2807:7;;2767:58;2249:1;2837:7;:18;;;;2205:1;3014:7;:22;;;;46525:310;;;;:::o;48238:441::-;18432:13;:11;:13::i;:::-;48369:1:::1;48339:32;;:18;:32;;;;48317:166;;;;;;;;;;;;:::i;:::-;;;;;;;;;48496:26;48533:8;;;;;;;;;;;48496:46;;48572:18;48553:8;;:38;;;;;;;;;;;;;;;;;;48609:62;48632:18;48652;48609:62;;;;;;;:::i;:::-;;;;;;;;48306:373;48238:441:::0;:::o;19452:201::-;18432:13;:11;:13::i;:::-;19561:1:::1;19541:22;;:8;:22;;;;19533:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19617:28;19636:8;19617:18;:28::i;:::-;19452:201:::0;:::o;48948:473::-;18432:13;:11;:13::i;:::-;49080:5:::1;;;;;;;;;;;49056:30;;:12;:30;;;;49034:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;49249:1;49225:26;;:12;:26;;;49221:193;;;49268:26;49287:6;49268:8;;;;;;;;;;;:18;;;;:26;;;;:::i;:::-;49221:193;;;49334:12;49327:33;;;49369:4;49384:8;;;;;;;;;;;49395:6;49327:75;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49221:193;48948:473:::0;;:::o;41528:32::-;;;;;;;;;;;;;:::o;41148:19::-;;;;;;;;;;;;;:::o;13629:310::-;13692:16;13721:22;13746:19;13754:3;:10;;13746:7;:19::i;:::-;13721:44;;13776:23;13890:5;13880:15;;13925:6;13918:13;;;;13629:310;;;:::o;18711:132::-;18786:12;:10;:12::i;:::-;18775:23;;:7;:5;:7::i;:::-;:23;;;18767:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18711:132::o;12197:167::-;12277:4;12301:55;12311:3;:10;;12347:5;12331:23;;12323:32;;12301:9;:55::i;:::-;12294:62;;12197:167;;;;:::o;19813:191::-;19887:16;19906:6;;;;;;;;;;;19887:25;;19932:8;19923:6;;:17;;;;;;;;;;;;;;;;;;19987:8;19956:40;;19977:8;19956:40;;;;;;;;;;;;19876:128;19813:191;:::o;11625:152::-;11695:4;11719:50;11724:3;:10;;11760:5;11744:23;;11736:32;;11719:4;:50::i;:::-;11712:57;;11625:152;;;;:::o;11953:158::-;12026:4;12050:53;12058:3;:10;;12094:5;12078:23;;12070:32;;12050:7;:53::i;:::-;12043:60;;11953:158;;;;:::o;49554:520::-;49691:21;49729:1;49715:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49691:40;;49760:5;;;;;;;;;;;49742:4;49747:1;49742:7;;;;;;;;:::i;:::-;;;;;;;:24;;;;;;;;;;;49787:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49777:4;49782:1;49777:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;49901:5;;;;;;;;;;;:13;;;49923:6;;;;;;;;;;;49932:11;49901:43;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49955:6;;;;;;;;;;;:57;;;50013:11;50026:1;50029:4;50043;50050:15;49955:111;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49610:464;49554:520;:::o;50269:523::-;50443:5;;;;;;;;;;;:13;;;50465:6;;;;;;;;;;;50474:11;50443:43;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50582:6;;;;;;;;;;;:22;;;50613:9;50647:5;;;;;;;;;;;50668:11;50694:1;50710;50734:8;;;;;;;;;;;50758:15;50582:202;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;50269:523;;:::o;30590:317::-;30705:6;30680:21;:31;;30672:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30759:12;30777:9;:14;;30799:6;30777:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30758:52;;;30829:7;30821:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;30661:246;30590:317;;:::o;8800:111::-;8856:16;8892:3;:11;;8885:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8800:111;;;:::o;17097:98::-;17150:7;17177:10;17170:17;;17097:98;:::o;7452:129::-;7525:4;7572:1;7549:3;:12;;:19;7562:5;7549:19;;;;;;;;;;;;:24;;7542:31;;7452:129;;;;:::o;5356:414::-;5419:4;5441:21;5451:3;5456:5;5441:9;:21::i;:::-;5436:327;;5479:3;:11;;5496:5;5479:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5662:3;:11;;:18;;;;5640:3;:12;;:19;5653:5;5640:19;;;;;;;;;;;:40;;;;5702:4;5695:11;;;;5436:327;5746:5;5739:12;;5356:414;;;;;:::o;5946:1420::-;6012:4;6130:18;6151:3;:12;;:19;6164:5;6151:19;;;;;;;;;;;;6130:40;;6201:1;6187:10;:15;6183:1176;;6562:21;6599:1;6586:10;:14;;;;:::i;:::-;6562:38;;6615:17;6656:1;6635:3;:11;;:18;;;;:22;;;;:::i;:::-;6615:42;;6691:13;6678:9;:26;6674:405;;6725:17;6745:3;:11;;6757:9;6745:22;;;;;;;;:::i;:::-;;;;;;;;;;6725:42;;6899:9;6870:3;:11;;6882:13;6870:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;7010:10;6984:3;:12;;:23;6997:9;6984:23;;;;;;;;;;;:36;;;;6706:373;6674:405;7160:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7255:3;:12;;:19;7268:5;7255:19;;;;;;;;;;;7248:26;;;7298:4;7291:11;;;;;;;6183:1176;7342:5;7335:12;;;5946:1420;;;;;:::o;7:114:1:-;74:6;108:5;102:12;92:22;;7:114;;;:::o;127:184::-;226:11;260:6;255:3;248:19;300:4;295:3;291:14;276:29;;127:184;;;;:::o;317:132::-;384:4;407:3;399:11;;437:4;432:3;428:14;420:22;;317:132;;;:::o;455:126::-;492:7;532:42;525:5;521:54;510:65;;455:126;;;:::o;587:96::-;624:7;653:24;671:5;653:24;:::i;:::-;642:35;;587:96;;;:::o;689:108::-;766:24;784:5;766:24;:::i;:::-;761:3;754:37;689:108;;:::o;803:179::-;872:10;893:46;935:3;927:6;893:46;:::i;:::-;971:4;966:3;962:14;948:28;;803:179;;;;:::o;988:113::-;1058:4;1090;1085:3;1081:14;1073:22;;988:113;;;:::o;1137:732::-;1256:3;1285:54;1333:5;1285:54;:::i;:::-;1355:86;1434:6;1429:3;1355:86;:::i;:::-;1348:93;;1465:56;1515:5;1465:56;:::i;:::-;1544:7;1575:1;1560:284;1585:6;1582:1;1579:13;1560:284;;;1661:6;1655:13;1688:63;1747:3;1732:13;1688:63;:::i;:::-;1681:70;;1774:60;1827:6;1774:60;:::i;:::-;1764:70;;1620:224;1607:1;1604;1600:9;1595:14;;1560:284;;;1564:14;1860:3;1853:10;;1261:608;;;1137:732;;;;:::o;1875:373::-;2018:4;2056:2;2045:9;2041:18;2033:26;;2105:9;2099:4;2095:20;2091:1;2080:9;2076:17;2069:47;2133:108;2236:4;2227:6;2133:108;:::i;:::-;2125:116;;1875:373;;;;:::o;2335:117::-;2444:1;2441;2434:12;2581:122;2654:24;2672:5;2654:24;:::i;:::-;2647:5;2644:35;2634:63;;2693:1;2690;2683:12;2634:63;2581:122;:::o;2709:139::-;2755:5;2793:6;2780:20;2771:29;;2809:33;2836:5;2809:33;:::i;:::-;2709:139;;;;:::o;2854:329::-;2913:6;2962:2;2950:9;2941:7;2937:23;2933:32;2930:119;;;2968:79;;:::i;:::-;2930:119;3088:1;3113:53;3158:7;3149:6;3138:9;3134:22;3113:53;:::i;:::-;3103:63;;3059:117;2854:329;;;;:::o;3189:77::-;3226:7;3255:5;3244:16;;3189:77;;;:::o;3272:122::-;3345:24;3363:5;3345:24;:::i;:::-;3338:5;3335:35;3325:63;;3384:1;3381;3374:12;3325:63;3272:122;:::o;3400:139::-;3446:5;3484:6;3471:20;3462:29;;3500:33;3527:5;3500:33;:::i;:::-;3400:139;;;;:::o;3545:329::-;3604:6;3653:2;3641:9;3632:7;3628:23;3624:32;3621:119;;;3659:79;;:::i;:::-;3621:119;3779:1;3804:53;3849:7;3840:6;3829:9;3825:22;3804:53;:::i;:::-;3794:63;;3750:117;3545:329;;;;:::o;3880:104::-;3925:7;3954:24;3972:5;3954:24;:::i;:::-;3943:35;;3880:104;;;:::o;3990:142::-;4093:32;4119:5;4093:32;:::i;:::-;4088:3;4081:45;3990:142;;:::o;4138:254::-;4247:4;4285:2;4274:9;4270:18;4262:26;;4298:87;4382:1;4371:9;4367:17;4358:6;4298:87;:::i;:::-;4138:254;;;;:::o;4398:118::-;4485:24;4503:5;4485:24;:::i;:::-;4480:3;4473:37;4398:118;;:::o;4522:222::-;4615:4;4653:2;4642:9;4638:18;4630:26;;4666:71;4734:1;4723:9;4719:17;4710:6;4666:71;:::i;:::-;4522:222;;;;:::o;4750:118::-;4837:24;4855:5;4837:24;:::i;:::-;4832:3;4825:37;4750:118;;:::o;4874:222::-;4967:4;5005:2;4994:9;4990:18;4982:26;;5018:71;5086:1;5075:9;5071:17;5062:6;5018:71;:::i;:::-;4874:222;;;;:::o;5102:619::-;5179:6;5187;5195;5244:2;5232:9;5223:7;5219:23;5215:32;5212:119;;;5250:79;;:::i;:::-;5212:119;5370:1;5395:53;5440:7;5431:6;5420:9;5416:22;5395:53;:::i;:::-;5385:63;;5341:117;5497:2;5523:53;5568:7;5559:6;5548:9;5544:22;5523:53;:::i;:::-;5513:63;;5468:118;5625:2;5651:53;5696:7;5687:6;5676:9;5672:22;5651:53;:::i;:::-;5641:63;;5596:118;5102:619;;;;;:::o;5727:474::-;5795:6;5803;5852:2;5840:9;5831:7;5827:23;5823:32;5820:119;;;5858:79;;:::i;:::-;5820:119;5978:1;6003:53;6048:7;6039:6;6028:9;6024:22;6003:53;:::i;:::-;5993:63;;5949:117;6105:2;6131:53;6176:7;6167:6;6156:9;6152:22;6131:53;:::i;:::-;6121:63;;6076:118;5727:474;;;;;:::o;6207:60::-;6235:3;6256:5;6249:12;;6207:60;;;:::o;6273:142::-;6323:9;6356:53;6374:34;6383:24;6401:5;6383:24;:::i;:::-;6374:34;:::i;:::-;6356:53;:::i;:::-;6343:66;;6273:142;;;:::o;6421:126::-;6471:9;6504:37;6535:5;6504:37;:::i;:::-;6491:50;;6421:126;;;:::o;6553:153::-;6630:9;6663:37;6694:5;6663:37;:::i;:::-;6650:50;;6553:153;;;:::o;6712:185::-;6826:64;6884:5;6826:64;:::i;:::-;6821:3;6814:77;6712:185;;:::o;6903:276::-;7023:4;7061:2;7050:9;7046:18;7038:26;;7074:98;7169:1;7158:9;7154:17;7145:6;7074:98;:::i;:::-;6903:276;;;;:::o;7185:141::-;7250:9;7283:37;7314:5;7283:37;:::i;:::-;7270:50;;7185:141;;;:::o;7332:161::-;7434:52;7480:5;7434:52;:::i;:::-;7429:3;7422:65;7332:161;;:::o;7499:252::-;7607:4;7645:2;7634:9;7630:18;7622:26;;7658:86;7741:1;7730:9;7726:17;7717:6;7658:86;:::i;:::-;7499:252;;;;:::o;7757:169::-;7841:11;7875:6;7870:3;7863:19;7915:4;7910:3;7906:14;7891:29;;7757:169;;;;:::o;7932:361::-;8072:34;8068:1;8060:6;8056:14;8049:58;8141:34;8136:2;8128:6;8124:15;8117:59;8210:34;8205:2;8197:6;8193:15;8186:59;8279:6;8274:2;8266:6;8262:15;8255:31;7932:361;:::o;8299:368::-;8441:3;8462:68;8526:3;8521;8462:68;:::i;:::-;8455:75;;8539:93;8628:3;8539:93;:::i;:::-;8657:3;8652;8648:13;8641:20;;8299:368;;;:::o;8673:419::-;8839:4;8877:2;8866:9;8862:18;8854:26;;8926:9;8920:4;8916:20;8912:1;8901:9;8897:17;8890:47;8954:131;9080:4;8954:131;:::i;:::-;8946:139;;8673:419;;;:::o;9098:360::-;9238:34;9234:1;9226:6;9222:14;9215:58;9307:34;9302:2;9294:6;9290:15;9283:59;9376:34;9371:2;9363:6;9359:15;9352:59;9445:5;9440:2;9432:6;9428:15;9421:30;9098:360;:::o;9464:367::-;9606:3;9627:67;9691:2;9686:3;9627:67;:::i;:::-;9620:74;;9703:93;9792:3;9703:93;:::i;:::-;9821:3;9816;9812:13;9805:20;;9464:367;;;:::o;9837:419::-;10003:4;10041:2;10030:9;10026:18;10018:26;;10090:9;10084:4;10080:20;10076:1;10065:9;10061:17;10054:47;10118:131;10244:4;10118:131;:::i;:::-;10110:139;;9837:419;;;:::o;10262:332::-;10383:4;10421:2;10410:9;10406:18;10398:26;;10434:71;10502:1;10491:9;10487:17;10478:6;10434:71;:::i;:::-;10515:72;10583:2;10572:9;10568:18;10559:6;10515:72;:::i;:::-;10262:332;;;;;:::o;10600:319::-;10740:34;10736:1;10728:6;10724:14;10717:58;10809:34;10804:2;10796:6;10792:15;10785:59;10878:33;10873:2;10865:6;10861:15;10854:58;10600:319;:::o;10925:366::-;11067:3;11088:67;11152:2;11147:3;11088:67;:::i;:::-;11081:74;;11164:93;11253:3;11164:93;:::i;:::-;11282:2;11277:3;11273:12;11266:19;;10925:366;;;:::o;11297:419::-;11463:4;11501:2;11490:9;11486:18;11478:26;;11550:9;11544:4;11540:20;11536:1;11525:9;11521:17;11514:47;11578:131;11704:4;11578:131;:::i;:::-;11570:139;;11297:419;;;:::o;11722:332::-;11843:4;11881:2;11870:9;11866:18;11858:26;;11894:71;11962:1;11951:9;11947:17;11938:6;11894:71;:::i;:::-;11975:72;12043:2;12032:9;12028:18;12019:6;11975:72;:::i;:::-;11722:332;;;;;:::o;12060:366::-;12200:34;12196:1;12188:6;12184:14;12177:58;12269:34;12264:2;12256:6;12252:15;12245:59;12338:34;12333:2;12325:6;12321:15;12314:59;12407:11;12402:2;12394:6;12390:15;12383:36;12060:366;:::o;12432:368::-;12574:3;12595:68;12659:3;12654;12595:68;:::i;:::-;12588:75;;12672:93;12761:3;12672:93;:::i;:::-;12790:3;12785;12781:13;12774:20;;12432:368;;;:::o;12806:419::-;12972:4;13010:2;12999:9;12995:18;12987:26;;13059:9;13053:4;13049:20;13045:1;13034:9;13030:17;13023:47;13087:131;13213:4;13087:131;:::i;:::-;13079:139;;12806:419;;;:::o;13231:143::-;13288:5;13319:6;13313:13;13304:22;;13335:33;13362:5;13335:33;:::i;:::-;13231:143;;;;:::o;13380:351::-;13450:6;13499:2;13487:9;13478:7;13474:23;13470:32;13467:119;;;13505:79;;:::i;:::-;13467:119;13625:1;13650:64;13706:7;13697:6;13686:9;13682:22;13650:64;:::i;:::-;13640:74;;13596:128;13380:351;;;;:::o;13737:180::-;13785:77;13782:1;13775:88;13882:4;13879:1;13872:15;13906:4;13903:1;13896:15;13923:348;13963:7;13986:20;14004:1;13986:20;:::i;:::-;13981:25;;14020:20;14038:1;14020:20;:::i;:::-;14015:25;;14208:1;14140:66;14136:74;14133:1;14130:81;14125:1;14118:9;14111:17;14107:105;14104:131;;;14215:18;;:::i;:::-;14104:131;14263:1;14260;14256:9;14245:20;;13923:348;;;;:::o;14277:180::-;14325:77;14322:1;14315:88;14422:4;14419:1;14412:15;14446:4;14443:1;14436:15;14463:185;14503:1;14520:20;14538:1;14520:20;:::i;:::-;14515:25;;14554:20;14572:1;14554:20;:::i;:::-;14549:25;;14593:1;14583:35;;14598:18;;:::i;:::-;14583:35;14640:1;14637;14633:9;14628:14;;14463:185;;;;:::o;14654:191::-;14694:4;14714:20;14732:1;14714:20;:::i;:::-;14709:25;;14748:20;14766:1;14748:20;:::i;:::-;14743:25;;14787:1;14784;14781:8;14778:34;;;14792:18;;:::i;:::-;14778:34;14837:1;14834;14830:9;14822:17;;14654:191;;;;:::o;14851:308::-;14991:34;14987:1;14979:6;14975:14;14968:58;15060:34;15055:2;15047:6;15043:15;15036:59;15129:22;15124:2;15116:6;15112:15;15105:47;14851:308;:::o;15165:366::-;15307:3;15328:67;15392:2;15387:3;15328:67;:::i;:::-;15321:74;;15404:93;15493:3;15404:93;:::i;:::-;15522:2;15517:3;15513:12;15506:19;;15165:366;;;:::o;15537:419::-;15703:4;15741:2;15730:9;15726:18;15718:26;;15790:9;15784:4;15780:20;15776:1;15765:9;15761:17;15754:47;15818:131;15944:4;15818:131;:::i;:::-;15810:139;;15537:419;;;:::o;15962:225::-;16102:34;16098:1;16090:6;16086:14;16079:58;16171:8;16166:2;16158:6;16154:15;16147:33;15962:225;:::o;16193:366::-;16335:3;16356:67;16420:2;16415:3;16356:67;:::i;:::-;16349:74;;16432:93;16521:3;16432:93;:::i;:::-;16550:2;16545:3;16541:12;16534:19;;16193:366;;;:::o;16565:419::-;16731:4;16769:2;16758:9;16754:18;16746:26;;16818:9;16812:4;16808:20;16804:1;16793:9;16789:17;16782:47;16846:131;16972:4;16846:131;:::i;:::-;16838:139;;16565:419;;;:::o;16990:318::-;17130:34;17126:1;17118:6;17114:14;17107:58;17199:34;17194:2;17186:6;17182:15;17175:59;17268:32;17263:2;17255:6;17251:15;17244:57;16990:318;:::o;17314:366::-;17456:3;17477:67;17541:2;17536:3;17477:67;:::i;:::-;17470:74;;17553:93;17642:3;17553:93;:::i;:::-;17671:2;17666:3;17662:12;17655:19;;17314:366;;;:::o;17686:419::-;17852:4;17890:2;17879:9;17875:18;17867:26;;17939:9;17933:4;17929:20;17925:1;17914:9;17910:17;17903:47;17967:131;18093:4;17967:131;:::i;:::-;17959:139;;17686:419;;;:::o;18111:442::-;18260:4;18298:2;18287:9;18283:18;18275:26;;18311:71;18379:1;18368:9;18364:17;18355:6;18311:71;:::i;:::-;18392:72;18460:2;18449:9;18445:18;18436:6;18392:72;:::i;:::-;18474;18542:2;18531:9;18527:18;18518:6;18474:72;:::i;:::-;18111:442;;;;;;:::o;18559:90::-;18593:7;18636:5;18629:13;18622:21;18611:32;;18559:90;;;:::o;18655:116::-;18725:21;18740:5;18725:21;:::i;:::-;18718:5;18715:32;18705:60;;18761:1;18758;18751:12;18705:60;18655:116;:::o;18777:137::-;18831:5;18862:6;18856:13;18847:22;;18878:30;18902:5;18878:30;:::i;:::-;18777:137;;;;:::o;18920:345::-;18987:6;19036:2;19024:9;19015:7;19011:23;19007:32;19004:119;;;19042:79;;:::i;:::-;19004:119;19162:1;19187:61;19240:7;19231:6;19220:9;19216:22;19187:61;:::i;:::-;19177:71;;19133:125;18920:345;;;;:::o;19271:182::-;19411:34;19407:1;19399:6;19395:14;19388:58;19271:182;:::o;19459:366::-;19601:3;19622:67;19686:2;19681:3;19622:67;:::i;:::-;19615:74;;19698:93;19787:3;19698:93;:::i;:::-;19816:2;19811:3;19807:12;19800:19;;19459:366;;;:::o;19831:419::-;19997:4;20035:2;20024:9;20020:18;20012:26;;20084:9;20078:4;20074:20;20070:1;20059:9;20055:17;20048:47;20112:131;20238:4;20112:131;:::i;:::-;20104:139;;19831:419;;;:::o;20256:180::-;20304:77;20301:1;20294:88;20401:4;20398:1;20391:15;20425:4;20422:1;20415:15;20442:180;20490:77;20487:1;20480:88;20587:4;20584:1;20577:15;20611:4;20608:1;20601:15;20628:143;20685:5;20716:6;20710:13;20701:22;;20732:33;20759:5;20732:33;:::i;:::-;20628:143;;;;:::o;20777:351::-;20847:6;20896:2;20884:9;20875:7;20871:23;20867:32;20864:119;;;20902:79;;:::i;:::-;20864:119;21022:1;21047:64;21103:7;21094:6;21083:9;21079:22;21047:64;:::i;:::-;21037:74;;20993:128;20777:351;;;;:::o;21134:332::-;21255:4;21293:2;21282:9;21278:18;21270:26;;21306:71;21374:1;21363:9;21359:17;21350:6;21306:71;:::i;:::-;21387:72;21455:2;21444:9;21440:18;21431:6;21387:72;:::i;:::-;21134:332;;;;;:::o;21472:85::-;21517:7;21546:5;21535:16;;21472:85;;;:::o;21563:158::-;21621:9;21654:61;21672:42;21681:32;21707:5;21681:32;:::i;:::-;21672:42;:::i;:::-;21654:61;:::i;:::-;21641:74;;21563:158;;;:::o;21727:147::-;21822:45;21861:5;21822:45;:::i;:::-;21817:3;21810:58;21727:147;;:::o;21880:831::-;22143:4;22181:3;22170:9;22166:19;22158:27;;22195:71;22263:1;22252:9;22248:17;22239:6;22195:71;:::i;:::-;22276:80;22352:2;22341:9;22337:18;22328:6;22276:80;:::i;:::-;22403:9;22397:4;22393:20;22388:2;22377:9;22373:18;22366:48;22431:108;22534:4;22525:6;22431:108;:::i;:::-;22423:116;;22549:72;22617:2;22606:9;22602:18;22593:6;22549:72;:::i;:::-;22631:73;22699:3;22688:9;22684:19;22675:6;22631:73;:::i;:::-;21880:831;;;;;;;;:::o;22717:807::-;22966:4;23004:3;22993:9;22989:19;22981:27;;23018:71;23086:1;23075:9;23071:17;23062:6;23018:71;:::i;:::-;23099:72;23167:2;23156:9;23152:18;23143:6;23099:72;:::i;:::-;23181:80;23257:2;23246:9;23242:18;23233:6;23181:80;:::i;:::-;23271;23347:2;23336:9;23332:18;23323:6;23271:80;:::i;:::-;23361:73;23429:3;23418:9;23414:19;23405:6;23361:73;:::i;:::-;23444;23512:3;23501:9;23497:19;23488:6;23444:73;:::i;:::-;22717:807;;;;;;;;;:::o;23530:663::-;23618:6;23626;23634;23683:2;23671:9;23662:7;23658:23;23654:32;23651:119;;;23689:79;;:::i;:::-;23651:119;23809:1;23834:64;23890:7;23881:6;23870:9;23866:22;23834:64;:::i;:::-;23824:74;;23780:128;23947:2;23973:64;24029:7;24020:6;24009:9;24005:22;23973:64;:::i;:::-;23963:74;;23918:129;24086:2;24112:64;24168:7;24159:6;24148:9;24144:22;24112:64;:::i;:::-;24102:74;;24057:129;23530:663;;;;;:::o;24199:179::-;24339:31;24335:1;24327:6;24323:14;24316:55;24199:179;:::o;24384:366::-;24526:3;24547:67;24611:2;24606:3;24547:67;:::i;:::-;24540:74;;24623:93;24712:3;24623:93;:::i;:::-;24741:2;24736:3;24732:12;24725:19;;24384:366;;;:::o;24756:419::-;24922:4;24960:2;24949:9;24945:18;24937:26;;25009:9;25003:4;24999:20;24995:1;24984:9;24980:17;24973:47;25037:131;25163:4;25037:131;:::i;:::-;25029:139;;24756:419;;;:::o;25181:147::-;25282:11;25319:3;25304:18;;25181:147;;;;:::o;25334:114::-;;:::o;25454:398::-;25613:3;25634:83;25715:1;25710:3;25634:83;:::i;:::-;25627:90;;25726:93;25815:3;25726:93;:::i;:::-;25844:1;25839:3;25835:11;25828:18;;25454:398;;;:::o;25858:379::-;26042:3;26064:147;26207:3;26064:147;:::i;:::-;26057:154;;26228:3;26221:10;;25858:379;;;:::o;26243:245::-;26383:34;26379:1;26371:6;26367:14;26360:58;26452:28;26447:2;26439:6;26435:15;26428:53;26243:245;:::o;26494:366::-;26636:3;26657:67;26721:2;26716:3;26657:67;:::i;:::-;26650:74;;26733:93;26822:3;26733:93;:::i;:::-;26851:2;26846:3;26842:12;26835:19;;26494:366;;;:::o;26866:419::-;27032:4;27070:2;27059:9;27055:18;27047:26;;27119:9;27113:4;27109:20;27105:1;27094:9;27090:17;27083:47;27147:131;27273:4;27147:131;:::i;:::-;27139:139;;26866:419;;;:::o;27291:180::-;27339:77;27336:1;27329:88;27436:4;27433:1;27426:15;27460:4;27457:1;27450:15
Swarm Source
ipfs://96acfa3ea93f007a6e869bc24a727db9ea8ae9c87eb588781750b276d34c6dda
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.