Contract Overview
Balance:
0 MATIC
MATIC Value:
$0.00
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
QuickSwapAdapter
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-04-13 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.6; // File: Address.sol /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(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) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: Context.sol /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: IController.sol interface IController { function getClusterAmountFromEth(uint256 _ethAmount, address _cluster) external view returns (uint256); function addClusterToRegister(address indexAddr) external; function getDHVPriceInETH(address _cluster) external view returns (uint256); function getUnderlyingsInfo(address _cluster, uint256 _ethAmount) external view returns ( uint256[] memory, uint256[] memory, uint256, uint256 ); function getUnderlyingsAmountsFromClusterAmount(uint256 _clusterAmount, address _clusterAddress) external view returns (uint256[] memory); function getEthAmountFromUnderlyingsAmounts(uint256[] memory _underlyingsAmounts, address _cluster) external view returns (uint256); function adapters(address _cluster) external view returns (address); function dhvTokenInstance() external view returns (address); function getDepositComission(address _cluster, uint256 _ethValue) external view returns (uint256); function getRedeemComission(address _cluster, uint256 _ethValue) external view returns (uint256); function getClusterPrice(address _cluster) external view returns (uint256); } // File: IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: IUniswapV2Router01.sol interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } // File: IERC20Metadata.sol /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: IWETH.sol interface IWETH is IERC20 { function deposit() external payable; function withdraw(uint256 wad) external; } // File: Ownable.sol /** * @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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: SafeERC20.sol /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: DexAdapterCore.sol /// @title DEX Adapter Core /// @author Blaize.tech team /// @notice Contract for interacting with UniswapV2Router contract DexAdapterCore is Ownable { using SafeERC20 for IERC20; using Address for address; enum PathType { ETH_TO_TOKEN, TOKEN_TO_ETH, TOKEN_TO_TOKEN } /// @notice Address of UniswapV2Router. address public router; /// @notice Address of Wrapped ETH token. address public WETH; /// @notice Address of USDT Token. address public USDT; /// @notice Path for swapping ETH for Token. mapping(address => address[]) public ethToToken; /// @notice Path for swapping Token for ETH. mapping(address => address[]) public tokenToEth; /// @notice Path for swapping Token for Token. mapping(address => mapping(address => address[])) public tokenToToken; /// @notice Performs initial setup. /// @param _router Address of router. /// @param _weth Address of Wrapped ETH. /// @param _usdt Address of USDT Token. constructor( address _router, address _weth, address _usdt ) { require(_router != address(0) && _weth != address(0) && _usdt != address(0), "Zero address"); router = _router; WETH = _weth; USDT = _usdt; } receive() external payable {} /********** * SWAP INTERFACE **********/ /// @notice Swaps an amount of ETH to underlying token and sends it to the sender. /// @param underlying Underlying token to be bought for ETH. function swapETHToUnderlying(address underlying, uint256 underlyingAmount) external payable virtual { _swapETHToUnderlying(underlying, underlyingAmount); } /// @notice Swaps underlyings to ETH and sends it to the sender. /// @param underlyingAmounts Amount of each underlying token to be swaped. /// @param underlyings Addresses of underlying tokens to be swaped. function swapUnderlyingsToETH(uint256[] memory underlyingAmounts, address[] memory underlyings) external virtual { for (uint256 i = 0; i < underlyings.length; i++) { if (underlyingAmounts[i] == 0) { continue; } _swapUnderlyingToETH(underlyingAmounts[i], underlyings[i]); } } /// @notice Swaps one token to another one. /// @param _amountToSwap Amount of token to swap. /// @param _tokenToSwap Address of token to be swaped. /// @param _tokenToReceive Address of token to be bought. /// @return Amount of tokens bought. function swapTokenToToken( uint256 _amountToSwap, address _tokenToSwap, address _tokenToReceive ) external virtual returns (uint256) { PathType pathType = _determinePathType(_tokenToSwap, _tokenToReceive); address[] memory path = getPath(pathType, _tokenToSwap, _tokenToReceive); IERC20(_tokenToSwap).safeTransferFrom(msg.sender, address(this), _amountToSwap); IERC20(_tokenToSwap).safeApprove(router, 0); IERC20(_tokenToSwap).safeApprove(router, _amountToSwap); return IUniswapV2Router01(router).swapExactTokensForTokens(_amountToSwap, 0, path, msg.sender, block.timestamp + 100)[path.length - 1]; } /********** * VIEW INTERFACE **********/ /// @notice Gets an amount of tokens, which can be bought for another token's amount. /// @param _amount Amount of tokens to be swaped. /// @param _tokenToSwap Address of token to be swaped. /// @param _tokenToReceive Address of token to be bought. /// @return Amount of tokens which might be bought. function getUnderlyingAmount( uint256 _amount, address _tokenToSwap, address _tokenToReceive ) external view virtual returns (uint256) { if (_tokenToSwap == _tokenToReceive) return _amount; return _getUnderlyingAmount(_amount, _tokenToSwap, _tokenToReceive); } /// @notice Gets prices for underlyings in ETH. /// @param _tokens Array, which containt underlyings' addresses. /// @return Array of underlyings' prices. function getTokensPrices(address[] memory _tokens) external view virtual returns (uint256[] memory) { uint256[] memory prices = new uint256[](_tokens.length); for (uint256 i = 0; i < _tokens.length; i++) { if (_tokens[i] == WETH) { prices[i] = 1 ether; } else { prices[i] = _getTokenPrice(_tokens[i]); } } return prices; } /// @notice Gets ETH price in USDT tokens. /// @return Price for ETH in USDT. function getEthPrice() external view virtual returns (uint256) { address[] memory path = getPath(PathType.ETH_TO_TOKEN, WETH, USDT); return IUniswapV2Router01(router).getAmountsOut(1 ether, path)[path.length - 1]; } /// @notice Gets price of provided DHV token address in ETH. /// @param _dhvToken DHV token address. /// @return Price of DHV token in ETH. function getDHVPriceInETH(address _dhvToken) external view virtual returns (uint256) { address[] memory path = getPath(PathType.TOKEN_TO_ETH, _dhvToken, WETH); address _router = _getRouter(_dhvToken); return IUniswapV2Router01(_router).getAmountsOut(1 ether, path)[1]; } /// @notice Gets a path for exchanging token. /// @param _tokenToSwap Address of token to be swaped. /// @param _tokenToReceive Address of token to be bought. /// @return Array, which contains path for exchanging token. function getPath( PathType _pathType, address _tokenToSwap, address _tokenToReceive ) public view virtual returns (address[] memory) { address[] memory path; if (_pathType == PathType.ETH_TO_TOKEN) { path = ethToToken[_tokenToReceive]; } else if (_pathType == PathType.TOKEN_TO_ETH) { path = tokenToEth[_tokenToSwap]; } else if (_pathType == PathType.TOKEN_TO_TOKEN) { path = tokenToToken[_tokenToSwap][_tokenToReceive]; } if (path.length > 0) { return path; } path = _tokenToSwap == WETH || _tokenToReceive == WETH ? new address[](2) : new address[](3); if (path.length == 2) { path[0] = _tokenToSwap; path[1] = _tokenToReceive; } else { path[0] = _tokenToSwap; path[1] = WETH; path[2] = _tokenToReceive; } return path; } function getEthAmountWithSlippage(uint256 _amount, address _tokenToSwap) external view virtual returns (uint256) { if (_tokenToSwap == WETH) { return _amount; } return _getEthAmountWithSlippage(_amount, _tokenToSwap); } /********** *ADMIN INTERFACE **********/ function setPath( PathType _pathType, address _underlying, address[] memory _path ) public virtual onlyOwner { if (_pathType == PathType.ETH_TO_TOKEN) { ethToToken[_underlying] = _path; } else if (_pathType == PathType.TOKEN_TO_ETH) { tokenToEth[_underlying] = _path; } else if (_pathType == PathType.TOKEN_TO_TOKEN) { tokenToToken[_underlying][_path[_path.length - 1]] = _path; } } /********** *INTERNAL HELPERS **********/ function _swapUnderlyingToETH(uint256 underlyingAmount, address underlying) internal { IERC20(underlying).safeTransferFrom(msg.sender, address(this), underlyingAmount); if (underlying == WETH) { IWETH(WETH).withdraw(underlyingAmount); Address.sendValue(payable(msg.sender), underlyingAmount); } else { uint256 balance = IERC20(underlying).balanceOf(address(this)); address[] memory path = getPath(PathType.TOKEN_TO_ETH, underlying, WETH); address _router = _getRouter(underlying); IERC20(underlying).safeApprove(_router, 0); IERC20(underlying).safeApprove(_router, balance); IUniswapV2Router01(_router).swapExactTokensForETH(balance, 0, path, msg.sender, block.timestamp + 100); } } function _swapETHToUnderlying(address underlying, uint256 underlyingAmount) internal virtual { if (underlying == WETH) { IWETH(WETH).deposit{value: msg.value}(); IERC20(WETH).safeTransfer(msg.sender, msg.value); } else { address[] memory path = getPath(PathType.ETH_TO_TOKEN, WETH, underlying); address _router = _getRouter(underlying); IUniswapV2Router01(_router).swapExactETHForTokens{value: msg.value}(underlyingAmount, path, msg.sender, block.timestamp + 100); } } function _getUnderlyingAmount( uint256 _amount, address _tokenToSwap, address _tokenToReceive ) internal view virtual returns (uint256) { PathType pathType = _determinePathType(_tokenToSwap, _tokenToReceive); address[] memory path = getPath(pathType, _tokenToSwap, _tokenToReceive); address _router = _getRouter(_tokenToSwap); return IUniswapV2Router01(_router).getAmountsOut(_amount, path)[path.length - 1]; } function _getTokenPrice(address _token) internal view virtual returns (uint256) { address[] memory path = getPath(PathType.TOKEN_TO_ETH, _token, WETH); address _router = _getRouter(_token); uint256 price = IUniswapV2Router01(_router).getAmountsOut(10**IERC20Metadata(_token).decimals(), path)[path.length - 1]; return price; } function _getEthAmountWithSlippage(uint256 _amount, address _tokenToSwap) internal view virtual returns (uint256) { address[] memory path = getPath(PathType.ETH_TO_TOKEN, WETH, _tokenToSwap); address _router = _getRouter(_tokenToSwap); return IUniswapV2Router01(_router).getAmountsIn(_amount, path)[0]; } function _getRouter(address _token) internal view virtual returns (address) { return router; } function _determinePathType(address _tokenToSwap, address _tokenToReceive) internal view returns (PathType) { if (_tokenToSwap == WETH) { return PathType.ETH_TO_TOKEN; } if (_tokenToReceive == WETH) { return PathType.TOKEN_TO_ETH; } return PathType.TOKEN_TO_TOKEN; } } // File: QuickSwapAdapter.sol /// @title QuickSwap Adapter /// @author Blaize.tech team /// @notice Contract for interacting with QuickSwap router contract QuickSwapAdapter is DexAdapterCore { using SafeERC20 for IERC20; address public constant dfynRouter = address(0xA102072A4C07F06EC3B4900FDC4C7B80b6c57429); address public constant polycatRouter = address(0x94930a328162957FF1dd48900aF67B5439336cBD); address public constant comethRouter = address(0x93bcDc45f7e62f89a8e901DC4A0E2c6C427D9F25); /// @notice Performs an initial setup. /// @notice Sets an addresses of QuickSwap router, WMATIC and USDT in Polygon. constructor() DexAdapterCore( address(0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff), // QuickSwap router address(0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270), // WMATIC address(0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174) // USDC ) {} /********** *INTERNAL HELPERS **********/ function _getRouter(address _token) internal view override returns (address) { if (_token == address(0x3a3Df212b7AA91Aa0402B9035b098891d276572B)) { // Fish Token return polycatRouter; } if (_token == address(0xC168E40227E4ebD8C1caE80F7a55a4F0e6D66C97)) { // Dfyn Token return dfynRouter; } if (_token == address(0xFbdd194376de19a88118e84E279b977f165d01b8)) { // BiFi Token return comethRouter; } return router; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"USDT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"comethRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dfynRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ethToToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_dhvToken","type":"address"}],"name":"getDHVPriceInETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_tokenToSwap","type":"address"}],"name":"getEthAmountWithSlippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEthPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum DexAdapterCore.PathType","name":"_pathType","type":"uint8"},{"internalType":"address","name":"_tokenToSwap","type":"address"},{"internalType":"address","name":"_tokenToReceive","type":"address"}],"name":"getPath","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"getTokensPrices","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_tokenToSwap","type":"address"},{"internalType":"address","name":"_tokenToReceive","type":"address"}],"name":"getUnderlyingAmount","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":"polycatRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum DexAdapterCore.PathType","name":"_pathType","type":"uint8"},{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"setPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint256","name":"underlyingAmount","type":"uint256"}],"name":"swapETHToUnderlying","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountToSwap","type":"uint256"},{"internalType":"address","name":"_tokenToSwap","type":"address"},{"internalType":"address","name":"_tokenToReceive","type":"address"}],"name":"swapTokenToToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"underlyingAmounts","type":"uint256[]"},{"internalType":"address[]","name":"underlyings","type":"address[]"}],"name":"swapUnderlyingsToETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenToEth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenToToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5073a5e0829caced8ffdd4de3c43696c57f7d7a678ff730d500b1d8e8ef31e21c99d1db9a6444d3adf1270732791bca1f2de4661ed88a30c99a7a9449aa841746200005c3362000115565b6001600160a01b038316158015906200007d57506001600160a01b03821615155b80156200009257506001600160a01b03811615155b620000d25760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b604482015260640160405180910390fd5b600180546001600160a01b039485166001600160a01b03199182161790915560028054938516938216939093179092556003805491909316911617905562000165565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61244680620001756000396000f3fe6080604052600436106101395760003560e01c80638da5cb5b116100ab578063e35565171161006f578063e35565171461036a578063ee27a94014610397578063f08f1ea7146103b7578063f2fde38b146103df578063f887ea40146103ff578063fa12f1961461041f57600080fd5b80638da5cb5b146102cc578063ad5c4648146102ea578063c54e44eb1461030a578063d91efc3b1461032a578063ddd2f2921461034a57600080fd5b806339580f05116100fd57806339580f05146101ff5780634e4f30a21461022d57806367c9b0171461024d578063715018a6146102625780637fe851d214610277578063899149ef1461029f57600080fd5b806311aef3c6146101455780631d7574261461018a5780632457ff73146101ac578063258b7ca4146101cc57806337f324c9146101ec57600080fd5b3661014057005b600080fd5b34801561015157600080fd5b5061016d7393bcdc45f7e62f89a8e901dc4a0e2c6c427d9f2581565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561019657600080fd5b506101aa6101a5366004611f6b565b61043f565b005b3480156101b857600080fd5b506101aa6101c7366004611e46565b610593565b3480156101d857600080fd5b5061016d6101e7366004611d47565b610614565b6101aa6101fa366004611d47565b61064c565b34801561020b57600080fd5b5061021f61021a36600461200e565b61065a565b604051908152602001610181565b34801561023957600080fd5b5061021f610248366004611cf0565b610692565b34801561025957600080fd5b5061021f61076e565b34801561026e57600080fd5b506101aa61084c565b34801561028357600080fd5b5061016d73a102072a4c07f06ec3b4900fdc4c7b80b6c5742981565b3480156102ab57600080fd5b506102bf6102ba366004611d71565b610882565b60405161018191906120c9565b3480156102d857600080fd5b506000546001600160a01b031661016d565b3480156102f657600080fd5b5060025461016d906001600160a01b031681565b34801561031657600080fd5b5060035461016d906001600160a01b031681565b34801561033657600080fd5b5061016d610345366004611d47565b610998565b34801561035657600080fd5b5061021f61036536600461200e565b6109b4565b34801561037657600080fd5b5061038a610385366004611f28565b610ae4565b60405161018191906120b6565b3480156103a357600080fd5b5061016d6103b2366004611d0b565b610e2e565b3480156103c357600080fd5b5061016d7394930a328162957ff1dd48900af67b5439336cbd81565b3480156103eb57600080fd5b506101aa6103fa366004611cf0565b610e73565b34801561040b57600080fd5b5060015461016d906001600160a01b031681565b34801561042b57600080fd5b5061021f61043a366004611fe2565b610f0e565b6000546001600160a01b031633146104725760405162461bcd60e51b815260040161046990612159565b60405180910390fd5b6000836002811115610486576104866123ce565b14156104bb576001600160a01b038216600090815260046020908152604090912082516104b592840190611bd2565b50505050565b60018360028111156104cf576104cf6123ce565b14156104fe576001600160a01b038216600090815260056020908152604090912082516104b592840190611bd2565b6002836002811115610512576105126123ce565b141561058e576001600160a01b0382166000908152600660205260408120825183929083906105439060019061235a565b81518110610553576105536123e4565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002090805190602001906104b5929190611bd2565b505050565b60005b815181101561058e578281815181106105b1576105b16123e4565b6020026020010151600014156105c657610602565b6106028382815181106105db576105db6123e4565b60200260200101518383815181106105f5576105f56123e4565b6020026020010151610f41565b8061060c8161239d565b915050610596565b6005602052816000526040600020818154811061063057600080fd5b6000918252602090912001546001600160a01b03169150829050565b6106568282611143565b5050565b6000816001600160a01b0316836001600160a01b0316141561067d57508261068b565b61068884848461129f565b90505b9392505050565b60025460009081906106b19060019085906001600160a01b0316610ae4565b905060006106be8461137f565b60405163d06ca61f60e01b81529091506001600160a01b0382169063d06ca61f906106f790670de0b6b3a764000090869060040161210d565b60006040518083038186803b15801561070f57600080fd5b505afa158015610723573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261074b9190810190611dae565b60018151811061075d5761075d6123e4565b602002602001015192505050919050565b60025460035460009182916107919183916001600160a01b039182169116610ae4565b60015460405163d06ca61f60e01b81529192506001600160a01b03169063d06ca61f906107cc90670de0b6b3a764000090859060040161210d565b60006040518083038186803b1580156107e457600080fd5b505afa1580156107f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108209190810190611dae565b6001825161082e919061235a565b8151811061083e5761083e6123e4565b602002602001015191505090565b6000546001600160a01b031633146108765760405162461bcd60e51b815260040161046990612159565b6108806000611452565b565b60606000825167ffffffffffffffff8111156108a0576108a06123fa565b6040519080825280602002602001820160405280156108c9578160200160208202803683370190505b50905060005b83518110156109915760025484516001600160a01b03909116908590839081106108fb576108fb6123e4565b60200260200101516001600160a01b0316141561093e57670de0b6b3a764000082828151811061092d5761092d6123e4565b60200260200101818152505061097f565b610960848281518110610953576109536123e4565b60200260200101516114a2565b828281518110610972576109726123e4565b6020026020010181815250505b806109898161239d565b9150506108cf565b5092915050565b6004602052816000526040600020818154811061063057600080fd5b6000806109c18484611602565b905060006109d0828686610ae4565b90506109e76001600160a01b03861633308961164a565b600154610a02906001600160a01b03878116911660006116b5565b600154610a1c906001600160a01b038781169116886116b5565b6001546001600160a01b03166338ed17398760008433610a3d426064612254565b6040518663ffffffff1660e01b8152600401610a5d9594939291906121c3565b600060405180830381600087803b158015610a7757600080fd5b505af1158015610a8b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ab39190810190611dae565b60018251610ac1919061235a565b81518110610ad157610ad16123e4565b6020026020010151925050509392505050565b6060806000856002811115610afb57610afb6123ce565b1415610b75576001600160a01b03831660009081526004602090815260409182902080548351818402810184019094528084529091830182828015610b6957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b4b575b50505050509050610c97565b6001856002811115610b8957610b896123ce565b1415610c01576001600160a01b03841660009081526005602090815260409182902080548351818402810184019094528084529091830182828015610b69576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610b4b5750505050509050610c97565b6002856002811115610c1557610c156123ce565b1415610c97576001600160a01b03808516600090815260066020908152604080832093871683529281529082902080548351818402810184019094528084529091830182828015610c8f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610c71575b505050505090505b805115610ca557905061068b565b6002546001600160a01b0385811691161480610cce57506002546001600160a01b038481169116145b610cf65760408051600380825260808201909252906020820160608036833701905050610d14565b60408051600280825260608201835290916020830190803683375050505b9050805160021415610d8d578381600081518110610d3457610d346123e4565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110610d6857610d686123e4565b60200260200101906001600160a01b031690816001600160a01b031681525050610688565b8381600081518110610da157610da16123e4565b6001600160a01b039283166020918202929092010152600254825191169082906001908110610dd257610dd26123e4565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600281518110610e0657610e066123e4565b60200260200101906001600160a01b031690816001600160a01b031681525050949350505050565b60066020528260005260406000206020528160005260406000208181548110610e5657600080fd5b6000918252602090912001546001600160a01b0316925083915050565b6000546001600160a01b03163314610e9d5760405162461bcd60e51b815260040161046990612159565b6001600160a01b038116610f025760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610469565b610f0b81611452565b50565b6002546000906001600160a01b0383811691161415610f2e575081610f3b565b610f3883836117d9565b90505b92915050565b610f566001600160a01b03821633308561164a565b6002546001600160a01b0382811691161415610fd457600254604051632e1a7d4d60e01b8152600481018490526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b158015610fb257600080fd5b505af1158015610fc6573d6000803e3d6000fd5b5050505061065633836118ac565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b15801561101657600080fd5b505afa15801561102a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104e9190611fc9565b60025490915060009061106e9060019085906001600160a01b0316610ae4565b9050600061107b8461137f565b90506110926001600160a01b0385168260006116b5565b6110a66001600160a01b03851682856116b5565b6001600160a01b0381166318cbafe584600085336110c5426064612254565b6040518663ffffffff1660e01b81526004016110e59594939291906121c3565b600060405180830381600087803b1580156110ff57600080fd5b505af1158015611113573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261113b9190810190611dae565b505050505050565b6002546001600160a01b03838116911614156111db57600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156111a957600080fd5b505af11580156111bd573d6000803e3d6000fd5b505060025461065693506001600160a01b03169150339050346119c5565b6002546000906111f69082906001600160a01b031685610ae4565b905060006112038461137f565b90506001600160a01b038116637ff36ab534858533611223426064612254565b6040518663ffffffff1660e01b8152600401611242949392919061218e565b6000604051808303818588803b15801561125b57600080fd5b505af115801561126f573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526112989190810190611dae565b5050505050565b6000806112ac8484611602565b905060006112bb828686610ae4565b905060006112c88661137f565b60405163d06ca61f60e01b81529091506001600160a01b0382169063d06ca61f906112f9908a90869060040161210d565b60006040518083038186803b15801561131157600080fd5b505afa158015611325573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261134d9190810190611dae565b6001835161135b919061235a565b8151811061136b5761136b6123e4565b602002602001015193505050509392505050565b60006001600160a01b038216733a3df212b7aa91aa0402b9035b098891d276572b14156113c157507394930a328162957ff1dd48900af67b5439336cbd919050565b6001600160a01b03821673c168e40227e4ebd8c1cae80f7a55a4f0e6d66c971415611401575073a102072a4c07f06ec3b4900fdc4c7b80b6c57429919050565b6001600160a01b03821673fbdd194376de19a88118e84e279b977f165d01b8141561144157507393bcdc45f7e62f89a8e901dc4a0e2c6c427d9f25919050565b50506001546001600160a01b031690565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60025460009081906114c19060019085906001600160a01b0316610ae4565b905060006114ce8461137f565b90506000816001600160a01b031663d06ca61f866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561151a57600080fd5b505afa15801561152e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115529190612033565b61155d90600a6122af565b856040518363ffffffff1660e01b815260040161157b92919061210d565b60006040518083038186803b15801561159357600080fd5b505afa1580156115a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115cf9190810190611dae565b600184516115dd919061235a565b815181106115ed576115ed6123e4565b60200260200101519050809350505050919050565b6002546000906001600160a01b038481169116141561162357506000610f3b565b6002546001600160a01b038381169116141561164157506001610f3b565b50600292915050565b6040516001600160a01b03808516602483015283166044820152606481018290526104b59085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526119f5565b80158061173e5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b15801561170457600080fd5b505afa158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c9190611fc9565b155b6117a95760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610469565b6040516001600160a01b03831660248201526044810182905261058e90849063095ea7b360e01b9060640161167e565b60025460009081906117f69082906001600160a01b031685610ae4565b905060006118038461137f565b6040516307c0329d60e21b81529091506001600160a01b03821690631f00ca7490611834908890869060040161210d565b60006040518083038186803b15801561184c57600080fd5b505afa158015611860573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118889190810190611dae565b60008151811061189a5761189a6123e4565b60200260200101519250505092915050565b804710156118fc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610469565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611949576040519150601f19603f3d011682016040523d82523d6000602084013e61194e565b606091505b505090508061058e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610469565b6040516001600160a01b03831660248201526044810182905261058e90849063a9059cbb60e01b9060640161167e565b6000611a4a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ac79092919063ffffffff16565b80519091501561058e5780806020019051810190611a689190611f06565b61058e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610469565b6060610688848460008585843b611b205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610469565b600080866001600160a01b03168587604051611b3c919061209a565b60006040518083038185875af1925050503d8060008114611b79576040519150601f19603f3d011682016040523d82523d6000602084013e611b7e565b606091505b5091509150611b8e828286611b99565b979650505050505050565b60608315611ba857508161068b565b825115611bb85782518084602001fd5b8160405162461bcd60e51b81526004016104699190612126565b828054828255906000526020600020908101928215611c27579160200282015b82811115611c2757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611bf2565b50611c33929150611c37565b5090565b5b80821115611c335760008155600101611c38565b80356001600160a01b0381168114611c6357600080fd5b919050565b600082601f830112611c7957600080fd5b81356020611c8e611c8983612230565b6121ff565b80838252828201915082860187848660051b8901011115611cae57600080fd5b60005b85811015611cd457611cc282611c4c565b84529284019290840190600101611cb1565b5090979650505050505050565b803560038110611c6357600080fd5b600060208284031215611d0257600080fd5b610f3882611c4c565b600080600060608486031215611d2057600080fd5b611d2984611c4c565b9250611d3760208501611c4c565b9150604084013590509250925092565b60008060408385031215611d5a57600080fd5b611d6383611c4c565b946020939093013593505050565b600060208284031215611d8357600080fd5b813567ffffffffffffffff811115611d9a57600080fd5b611da684828501611c68565b949350505050565b60006020808385031215611dc157600080fd5b825167ffffffffffffffff811115611dd857600080fd5b8301601f81018513611de957600080fd5b8051611df7611c8982612230565b80828252848201915084840188868560051b8701011115611e1757600080fd5b600094505b83851015611e3a578051835260019490940193918501918501611e1c565b50979650505050505050565b60008060408385031215611e5957600080fd5b823567ffffffffffffffff80821115611e7157600080fd5b818501915085601f830112611e8557600080fd5b81356020611e95611c8983612230565b8083825282820191508286018a848660051b8901011115611eb557600080fd5b600096505b84871015611ed8578035835260019690960195918301918301611eba565b5096505086013592505080821115611eef57600080fd5b50611efc85828601611c68565b9150509250929050565b600060208284031215611f1857600080fd5b8151801515811461068b57600080fd5b600080600060608486031215611f3d57600080fd5b611f4684611ce1565b9250611f5460208501611c4c565b9150611f6260408501611c4c565b90509250925092565b600080600060608486031215611f8057600080fd5b611f8984611ce1565b9250611f9760208501611c4c565b9150604084013567ffffffffffffffff811115611fb357600080fd5b611fbf86828701611c68565b9150509250925092565b600060208284031215611fdb57600080fd5b5051919050565b60008060408385031215611ff557600080fd5b8235915061200560208401611c4c565b90509250929050565b60008060006060848603121561202357600080fd5b83359250611f5460208501611c4c565b60006020828403121561204557600080fd5b815160ff8116811461068b57600080fd5b600081518084526020808501945080840160005b8381101561208f5781516001600160a01b03168752958201959082019060010161206a565b509495945050505050565b600082516120ac818460208701612371565b9190910192915050565b602081526000610f386020830184612056565b6020808252825182820181905260009190848201906040850190845b81811015612101578351835292840192918401916001016120e5565b50909695505050505050565b8281526040602082015260006106886040830184612056565b6020815260008251806020840152612145816040850160208701612371565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8481526080602082015260006121a76080830186612056565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a0604082015260006121e260a0830186612056565b6001600160a01b0394909416606083015250608001529392505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612228576122286123fa565b604052919050565b600067ffffffffffffffff82111561224a5761224a6123fa565b5060051b60200190565b60008219821115612267576122676123b8565b500190565b600181815b808511156122a757816000190482111561228d5761228d6123b8565b8085161561229a57918102915b93841c9390800290612271565b509250929050565b6000610f3860ff8416836000826122c857506001610f3b565b816122d557506000610f3b565b81600181146122eb57600281146122f557612311565b6001915050610f3b565b60ff841115612306576123066123b8565b50506001821b610f3b565b5060208310610133831016604e8410600b8410161715612334575081810a610f3b565b61233e838361226c565b8060001904821115612352576123526123b8565b029392505050565b60008282101561236c5761236c6123b8565b500390565b60005b8381101561238c578181015183820152602001612374565b838111156104b55750506000910152565b60006000198214156123b1576123b16123b8565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220b9bade412a0b533229d71dde3f5fb84d9d72255aee5b4b32ad92fecd7b82e47464736f6c63430008060033
Deployed ByteCode Sourcemap
34639:1431:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34918:90;;;;;;;;;;;;34965:42;34918:90;;;;;-1:-1:-1;;;;;7557:32:1;;;7539:51;;7527:2;7512:18;34918:90:0;;;;;;;;30832:494;;;;;;;;;;-1:-1:-1;30832:494:0;;;;;:::i;:::-;;:::i;:::-;;25805:353;;;;;;;;;;-1:-1:-1;25805:353:0;;;;;:::i;:::-;;:::i;24510:47::-;;;;;;;;;;-1:-1:-1;24510:47:0;;;;;:::i;:::-;;:::i;25405:169::-;;;;;;:::i;:::-;;:::i;27526:315::-;;;;;;;;;;-1:-1:-1;27526:315:0;;;;;:::i;:::-;;:::i;:::-;;;13521:25:1;;;13509:2;13494:18;27526:315:0;13476:76:1;28952:302:0;;;;;;;;;;-1:-1:-1;28952:302:0;;;;;:::i;:::-;;:::i;28551:238::-;;;;;;;;;;;;;:::i;19309:94::-;;;;;;;;;;;;;:::i;34725:88::-;;;;;;;;;;;;34770:42;34725:88;;28019:436;;;;;;;;;;-1:-1:-1;28019:436:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18658:87::-;;;;;;;;;;-1:-1:-1;18704:7:0;18731:6;-1:-1:-1;;;;;18731:6:0;18658:87;;24264:19;;;;;;;;;;-1:-1:-1;24264:19:0;;;;-1:-1:-1;;;;;24264:19:0;;;24330;;;;;;;;;;-1:-1:-1;24330:19:0;;;;-1:-1:-1;;;;;24330:19:0;;;24406:47;;;;;;;;;;-1:-1:-1;24406:47:0;;;;;:::i;:::-;;:::i;26435:697::-;;;;;;;;;;-1:-1:-1;26435:697:0;;;;;:::i;:::-;;:::i;29502:990::-;;;;;;;;;;-1:-1:-1;29502:990:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24616:69::-;;;;;;;;;;-1:-1:-1;24616:69:0;;;;;:::i;:::-;;:::i;34820:91::-;;;;;;;;;;;;34868:42;34820:91;;19558:192;;;;;;;;;;-1:-1:-1;19558:192:0;;;;;:::i;:::-;;:::i;24189:21::-;;;;;;;;;;-1:-1:-1;24189:21:0;;;;-1:-1:-1;;;;;24189:21:0;;;30500:264;;;;;;;;;;-1:-1:-1;30500:264:0;;;;;:::i;:::-;;:::i;30832:494::-;18704:7;18731:6;-1:-1:-1;;;;;18731:6:0;8521:10;18878:23;18870:68;;;;-1:-1:-1;;;18870:68:0;;;;;;;:::i;:::-;;;;;;;;;31001:21:::1;30988:9;:34;;;;;;;;:::i;:::-;;30984:335;;;-1:-1:-1::0;;;;;31039:23:0;::::1;;::::0;;;:10:::1;:23;::::0;;;;;;;:31;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;30832:494:::0;;;:::o;30984:335::-:1;31105:21;31092:9;:34;;;;;;;;:::i;:::-;;31088:231;;;-1:-1:-1::0;;;;;31143:23:0;::::1;;::::0;;;:10:::1;:23;::::0;;;;;;;:31;;::::1;::::0;;::::1;::::0;::::1;:::i;31088:231::-;31209:23;31196:9;:36;;;;;;;;:::i;:::-;;31192:127;;;-1:-1:-1::0;;;;;31249:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;31281:12;;31302:5;;31249:25;31302:5;;31281:16:::1;::::0;31296:1:::1;::::0;31281:16:::1;:::i;:::-;31275:23;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;31249:50:0::1;-1:-1:-1::0;;;;;31249:50:0::1;;;;;;;;;;;;:58;;;;;;;;;;;;:::i;31192:127::-;30832:494:::0;;;:::o;25805:353::-;25934:9;25929:222;25953:11;:18;25949:1;:22;25929:222;;;25997:17;26015:1;25997:20;;;;;;;;:::i;:::-;;;;;;;26021:1;25997:25;25993:74;;;26043:8;;25993:74;26081:58;26102:17;26120:1;26102:20;;;;;;;;:::i;:::-;;;;;;;26124:11;26136:1;26124:14;;;;;;;;:::i;:::-;;;;;;;26081:20;:58::i;:::-;25973:3;;;;:::i;:::-;;;;25929:222;;24510:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24510:47:0;;-1:-1:-1;24510:47:0;;-1:-1:-1;24510:47:0:o;25405:169::-;25516:50;25537:10;25549:16;25516:20;:50::i;:::-;25405:169;;:::o;27526:315::-;27684:7;27724:15;-1:-1:-1;;;;;27708:31:0;:12;-1:-1:-1;;;;;27708:31:0;;27704:51;;;-1:-1:-1;27748:7:0;27741:14;;27704:51;27773:60;27794:7;27803:12;27817:15;27773:20;:60::i;:::-;27766:67;;27526:315;;;;;;:::o;28952:302::-;29114:4;;29028:7;;;;29072:47;;29080:21;;29103:9;;-1:-1:-1;;;;;29114:4:0;29072:7;:47::i;:::-;29048:71;;29130:15;29148:21;29159:9;29148:10;:21::i;:::-;29187:56;;-1:-1:-1;;;29187:56:0;;29130:39;;-1:-1:-1;;;;;;29187:41:0;;;;;:56;;29229:7;;29238:4;;29187:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29187:56:0;;;;;;;;;;;;:::i;:::-;29244:1;29187:59;;;;;;;;:::i;:::-;;;;;;;29180:66;;;;28952:302;;;:::o;28551:238::-;28680:4;;28686;;28605:7;;;;28649:42;;28605:7;;-1:-1:-1;;;;;28680:4:0;;;;28686;28649:7;:42::i;:::-;28728:6;;28709:55;;-1:-1:-1;;;28709:55:0;;28625:66;;-1:-1:-1;;;;;;28728:6:0;;28709:40;;:55;;28750:7;;28625:66;;28709:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28709:55:0;;;;;;;;;;;;:::i;:::-;28779:1;28765:4;:11;:15;;;;:::i;:::-;28709:72;;;;;;;;:::i;:::-;;;;;;;28702:79;;;28551:238;:::o;19309:94::-;18704:7;18731:6;-1:-1:-1;;;;;18731:6:0;8521:10;18878:23;18870:68;;;;-1:-1:-1;;;18870:68:0;;;;;;;:::i;:::-;19374:21:::1;19392:1;19374:9;:21::i;:::-;19309:94::o:0;28019:436::-;28101:16;28130:23;28170:7;:14;28156:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28156:29:0;;28130:55;;28201:9;28196:228;28220:7;:14;28216:1;:18;28196:228;;;28274:4;;28260:10;;-1:-1:-1;;;;;28274:4:0;;;;28260:7;;28268:1;;28260:10;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;28260:18:0;;28256:157;;;28311:7;28299:6;28306:1;28299:9;;;;;;;;:::i;:::-;;;;;;:19;;;;;28256:157;;;28371:26;28386:7;28394:1;28386:10;;;;;;;;:::i;:::-;;;;;;;28371:14;:26::i;:::-;28359:6;28366:1;28359:9;;;;;;;;:::i;:::-;;;;;;:38;;;;;28256:157;28236:3;;;;:::i;:::-;;;;28196:228;;;-1:-1:-1;28441:6:0;28019:436;-1:-1:-1;;28019:436:0:o;24406:47::-;;;;;;;;;;;;;;;;;;;;26435:697;26591:7;26611:17;26631:49;26650:12;26664:15;26631:18;:49::i;:::-;26611:69;;26693:21;26717:48;26725:8;26735:12;26749:15;26717:7;:48::i;:::-;26693:72;-1:-1:-1;26778:79:0;-1:-1:-1;;;;;26778:37:0;;26816:10;26836:4;26843:13;26778:37;:79::i;:::-;26901:6;;26868:43;;-1:-1:-1;;;;;26868:32:0;;;;26901:6;;26868:32;:43::i;:::-;26955:6;;26922:55;;-1:-1:-1;;;;;26922:32:0;;;;26955:6;26963:13;26922:32;:55::i;:::-;27016:6;;-1:-1:-1;;;;;27016:6:0;26997:51;27049:13;27016:6;27067:4;27073:10;27085:21;:15;27103:3;27085:21;:::i;:::-;26997:110;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26997:110:0;;;;;;;;;;;;:::i;:::-;27122:1;27108:4;:11;:15;;;;:::i;:::-;26997:127;;;;;;;;:::i;:::-;;;;;;;26990:134;;;;26435:697;;;;;:::o;29502:990::-;29649:16;;29727:21;29714:9;:34;;;;;;;;:::i;:::-;;29710:330;;;-1:-1:-1;;;;;29772:27:0;;;;;;:10;:27;;;;;;;;;29765:34;;;;;;;;;;;;;;;;;29772:27;;29765:34;;29772:27;29765:34;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29765:34:0;;;;;;;;;;;;;;;;;;;;;;;29710:330;;;29834:21;29821:9;:34;;;;;;;;:::i;:::-;;29817:223;;;-1:-1:-1;;;;;29879:24:0;;;;;;:10;:24;;;;;;;;;29872:31;;;;;;;;;;;;;;;;;29879:24;;29872:31;;29879:24;29872:31;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29872:31:0;;;;;;;;;;;;;;;;;;;;;;29817:223;;;29938:23;29925:9;:36;;;;;;;;:::i;:::-;;29921:119;;;-1:-1:-1;;;;;29985:26:0;;;;;;;:12;:26;;;;;;;;:43;;;;;;;;;;;;29978:50;;;;;;;;;;;;;;;;;29985:43;;29978:50;;29985:43;29978:50;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29978:50:0;;;;;;;;;;;;;;;;;;;;;;;29921:119;30056:11;;:15;30052:59;;30095:4;-1:-1:-1;30088:11:0;;30052:59;30146:4;;-1:-1:-1;;;;;30130:20:0;;;30146:4;;30130:20;;:47;;-1:-1:-1;30173:4:0;;-1:-1:-1;;;;;30154:23:0;;;30173:4;;30154:23;30130:47;:85;;30199:16;;;30213:1;30199:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30199:16:0;30130:85;;;30180:16;;;30194:1;30180:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30130:85:0;30123:92;;30230:4;:11;30245:1;30230:16;30226:235;;;30273:12;30263:4;30268:1;30263:7;;;;;;;;:::i;:::-;;;;;;:22;-1:-1:-1;;;;;30263:22:0;;;-1:-1:-1;;;;;30263:22:0;;;;;30310:15;30300:4;30305:1;30300:7;;;;;;;;:::i;:::-;;;;;;:25;-1:-1:-1;;;;;30300:25:0;;;-1:-1:-1;;;;;30300:25:0;;;;;30226:235;;;30368:12;30358:4;30363:1;30358:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30358:22:0;;;:7;;;;;;;;;:22;30405:4;;30395:7;;30405:4;;;30395;;30405;;30395:7;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;30395:14:0;;;-1:-1:-1;;;;;30395:14:0;;;;;30434:15;30424:4;30429:1;30424:7;;;;;;;;:::i;:::-;;;;;;:25;-1:-1:-1;;;;;30424:25:0;;;-1:-1:-1;;;;;30424:25:0;;;;;30480:4;29502:990;-1:-1:-1;;;;29502:990:0:o;24616:69::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24616:69:0;;-1:-1:-1;24616:69:0;;-1:-1:-1;;24616:69:0:o;19558:192::-;18704:7;18731:6;-1:-1:-1;;;;;18731:6:0;8521:10;18878:23;18870:68;;;;-1:-1:-1;;;18870:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19647:22:0;::::1;19639:73;;;::::0;-1:-1:-1;;;19639:73:0;;10425:2:1;19639:73:0::1;::::0;::::1;10407:21:1::0;10464:2;10444:18;;;10437:30;10503:34;10483:18;;;10476:62;-1:-1:-1;;;10554:18:1;;;10547:36;10600:19;;19639:73:0::1;10397:228:1::0;19639:73:0::1;19723:19;19733:8;19723:9;:19::i;:::-;19558:192:::0;:::o;30500:264::-;30644:4;;30604:7;;-1:-1:-1;;;;;30628:20:0;;;30644:4;;30628:20;30624:67;;;-1:-1:-1;30672:7:0;30665:14;;30624:67;30708:48;30734:7;30743:12;30708:25;:48::i;:::-;30701:55;;30500:264;;;;;:::o;31395:829::-;31491:80;-1:-1:-1;;;;;31491:35:0;;31527:10;31547:4;31554:16;31491:35;:80::i;:::-;31600:4;;-1:-1:-1;;;;;31586:18:0;;;31600:4;;31586:18;31582:635;;;31627:4;;31621:38;;-1:-1:-1;;;31621:38:0;;;;;13521:25:1;;;-1:-1:-1;;;;;31627:4:0;;;;31621:20;;13494:18:1;;31621:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31674:56;31700:10;31713:16;31674:17;:56::i;31582:635::-;31781:43;;-1:-1:-1;;;31781:43:0;;31818:4;31781:43;;;7539:51:1;31763:15:0;;-1:-1:-1;;;;;31781:28:0;;;;;7512:18:1;;31781:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31906:4;;31763:61;;-1:-1:-1;31839:21:0;;31863:48;;31871:21;;31894:10;;-1:-1:-1;;;;;31906:4:0;31863:7;:48::i;:::-;31839:72;;31926:15;31944:22;31955:10;31944;:22::i;:::-;31926:40;-1:-1:-1;31983:42:0;-1:-1:-1;;;;;31983:30:0;;31926:40;32023:1;31983:30;:42::i;:::-;32040:48;-1:-1:-1;;;;;32040:30:0;;32071:7;32080;32040:30;:48::i;:::-;-1:-1:-1;;;;;32103:49:0;;;32153:7;32162:1;32165:4;32171:10;32183:21;:15;32201:3;32183:21;:::i;:::-;32103:102;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32103:102:0;;;;;;;;;;;;:::i;:::-;;31748:469;;;31395:829;;:::o;32232:565::-;32354:4;;-1:-1:-1;;;;;32340:18:0;;;32354:4;;32340:18;32336:454;;;32381:4;;;;;;;;;-1:-1:-1;;;;;32381:4:0;-1:-1:-1;;;;;32375:19:0;;32402:9;32375:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32436:4:0;;32429:48;;-1:-1:-1;;;;;;32436:4:0;;-1:-1:-1;32455:10:0;;-1:-1:-1;32467:9:0;32429:25;:48::i;32336:454::-;32565:4;;32510:21;;32534:48;;32510:21;;-1:-1:-1;;;;;32565:4:0;32571:10;32534:7;:48::i;:::-;32510:72;;32597:15;32615:22;32626:10;32615;:22::i;:::-;32597:40;-1:-1:-1;;;;;;32652:49:0;;;32709:9;32720:16;32738:4;32744:10;32756:21;:15;32774:3;32756:21;:::i;:::-;32652:126;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32652:126:0;;;;;;;;;;;;:::i;:::-;;32495:295;;32232:565;;:::o;32805:485::-;32964:7;32984:17;33004:49;33023:12;33037:15;33004:18;:49::i;:::-;32984:69;;33064:21;33088:48;33096:8;33106:12;33120:15;33088:7;:48::i;:::-;33064:72;;33147:15;33165:24;33176:12;33165:10;:24::i;:::-;33209:56;;-1:-1:-1;;;33209:56:0;;33147:42;;-1:-1:-1;;;;;;33209:41:0;;;;;:56;;33251:7;;33260:4;;33209:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33209:56:0;;;;;;;;;;;;:::i;:::-;33280:1;33266:4;:11;:15;;;;:::i;:::-;33209:73;;;;;;;;:::i;:::-;;;;;;;33202:80;;;;;32805:485;;;;;:::o;35507:560::-;35575:7;-1:-1:-1;;;;;35599:61:0;;35617:42;35599:61;35595:141;;;-1:-1:-1;34868:42:0;;35507:560;-1:-1:-1;35507:560:0:o;35595:141::-;-1:-1:-1;;;;;35750:61:0;;35768:42;35750:61;35746:138;;;-1:-1:-1;34770:42:0;;35507:560;-1:-1:-1;35507:560:0:o;35746:138::-;-1:-1:-1;;;;;35900:61:0;;35918:42;35900:61;35896:140;;;-1:-1:-1;34965:42:0;;35507:560;-1:-1:-1;35507:560:0:o;35896:140::-;-1:-1:-1;;36053:6:0;;-1:-1:-1;;;;;36053:6:0;;35507:560::o;19758:173::-;19814:16;19833:6;;-1:-1:-1;;;;;19850:17:0;;;-1:-1:-1;;;;;;19850:17:0;;;;;;19883:40;;19833:6;;;;;;;19883:40;;19814:16;19883:40;19803:128;19758:173;:::o;33298:367::-;33452:4;;33369:7;;;;33413:44;;33421:21;;33444:6;;-1:-1:-1;;;;;33452:4:0;33413:7;:44::i;:::-;33389:68;;33468:15;33486:18;33497:6;33486:10;:18::i;:::-;33468:36;;33515:13;33550:7;-1:-1:-1;;;;;33531:41:0;;33592:6;-1:-1:-1;;;;;33577:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33573:37;;:2;:37;:::i;:::-;33612:4;33531:86;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33531:86:0;;;;;;;;;;;;:::i;:::-;33632:1;33618:4;:11;:15;;;;:::i;:::-;33531:103;;;;;;;;:::i;:::-;;;;;;;33515:119;;33652:5;33645:12;;;;;33298:367;;;:::o;34133:346::-;34272:4;;34231:8;;-1:-1:-1;;;;;34256:20:0;;;34272:4;;34256:20;34252:81;;;-1:-1:-1;34300:21:0;34293:28;;34252:81;34368:4;;-1:-1:-1;;;;;34349:23:0;;;34368:4;;34349:23;34345:84;;;-1:-1:-1;34396:21:0;34389:28;;34345:84;-1:-1:-1;34448:23:0;34133:346;;;;:::o;20709:248::-;20880:68;;-1:-1:-1;;;;;8168:15:1;;;20880:68:0;;;8150:34:1;8220:15;;8200:18;;;8193:43;8252:18;;;8245:34;;;20853:96:0;;20873:5;;-1:-1:-1;;;20903:27:0;8085:18:1;;20880:68:0;;;;-1:-1:-1;;20880:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;20880:68:0;-1:-1:-1;;;;;;20880:68:0;;;;;;;;;;20853:19;:96::i;21226:616::-;21590:10;;;21589:62;;-1:-1:-1;21606:39:0;;-1:-1:-1;;;21606:39:0;;21630:4;21606:39;;;7813:34:1;-1:-1:-1;;;;;7883:15:1;;;7863:18;;;7856:43;21606:15:0;;;;;7748:18:1;;21606:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;21589:62;21567:166;;;;-1:-1:-1;;;21567:166:0;;13154:2:1;21567:166:0;;;13136:21:1;13193:2;13173:18;;;13166:30;13232:34;13212:18;;;13205:62;-1:-1:-1;;;13283:18:1;;;13276:52;13345:19;;21567:166:0;13126:244:1;21567:166:0;21771:62;;-1:-1:-1;;;;;8482:32:1;;21771:62:0;;;8464:51:1;8531:18;;;8524:34;;;21744:90:0;;21764:5;;-1:-1:-1;;;21794:22:0;8437:18:1;;21771:62:0;8419:145:1;33673:336:0;33853:4;;33778:7;;;;33822:50;;33778:7;;-1:-1:-1;;;;;33853:4:0;33859:12;33822:7;:50::i;:::-;33798:74;;33883:15;33901:24;33912:12;33901:10;:24::i;:::-;33943:55;;-1:-1:-1;;;33943:55:0;;33883:42;;-1:-1:-1;;;;;;33943:40:0;;;;;:55;;33984:7;;33993:4;;33943:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33943:55:0;;;;;;;;;;;;:::i;:::-;33999:1;33943:58;;;;;;;;:::i;:::-;;;;;;;33936:65;;;;33673:336;;;;:::o;2086:317::-;2201:6;2176:21;:31;;2168:73;;;;-1:-1:-1;;;2168:73:0;;11259:2:1;2168:73:0;;;11241:21:1;11298:2;11278:18;;;11271:30;11337:31;11317:18;;;11310:59;11386:18;;2168:73:0;11231:179:1;2168:73:0;2255:12;2273:9;-1:-1:-1;;;;;2273:14:0;2295:6;2273:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2254:52;;;2325:7;2317:78;;;;-1:-1:-1;;;2317:78:0;;10832:2:1;2317:78:0;;;10814:21:1;10871:2;10851:18;;;10844:30;10910:34;10890:18;;;10883:62;10981:28;10961:18;;;10954:56;11027:19;;2317:78:0;10804:248:1;20490:211:0;20634:58;;-1:-1:-1;;;;;8482:32:1;;20634:58:0;;;8464:51:1;8531:18;;;8524:34;;;20607:86:0;;20627:5;;-1:-1:-1;;;20657:23:0;8437:18:1;;20634:58:0;8419:145:1;23063:716:0;23487:23;23513:69;23541:4;23513:69;;;;;;;;;;;;;;;;;23521:5;-1:-1:-1;;;;;23513:27:0;;;:69;;;;;:::i;:::-;23597:17;;23487:95;;-1:-1:-1;23597:21:0;23593:179;;23694:10;23683:30;;;;;;;;;;;;:::i;:::-;23675:85;;;;-1:-1:-1;;;23675:85:0;;12743:2:1;23675:85:0;;;12725:21:1;12782:2;12762:18;;;12755:30;12821:34;12801:18;;;12794:62;-1:-1:-1;;;12872:18:1;;;12865:40;12922:19;;23675:85:0;12715:232:1;3570:229:0;3707:12;3739:52;3761:6;3769:4;3775:1;3778:12;3707;1087:20;;4977:60;;;;-1:-1:-1;;;4977:60:0;;12385:2:1;4977:60:0;;;12367:21:1;12424:2;12404:18;;;12397:30;12463:31;12443:18;;;12436:59;12512:18;;4977:60:0;12357:179:1;4977:60:0;5051:12;5065:23;5092:6;-1:-1:-1;;;;;5092:11:0;5111:5;5118:4;5092:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5050:73;;;;5141:52;5159:7;5168:10;5180:12;5141:17;:52::i;:::-;5134:59;4690:511;-1:-1:-1;;;;;;;4690:511:0:o;7159:712::-;7309:12;7338:7;7334:530;;;-1:-1:-1;7369:10:0;7362:17;;7334:530;7483:17;;:21;7479:374;;7681:10;7675:17;7742:15;7729:10;7725:2;7721:19;7714:44;7479:374;7824:12;7817:20;;-1:-1:-1;;;7817:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:679::-;246:5;299:3;292:4;284:6;280:17;276:27;266:2;;317:1;314;307:12;266:2;353:6;340:20;379:4;403:60;419:43;459:2;419:43;:::i;:::-;403:60;:::i;:::-;485:3;509:2;504:3;497:15;537:2;532:3;528:12;521:19;;572:2;564:6;560:15;624:3;619:2;613;610:1;606:10;598:6;594:23;590:32;587:41;584:2;;;641:1;638;631:12;584:2;663:1;673:169;687:2;684:1;681:9;673:169;;;744:23;763:3;744:23;:::i;:::-;732:36;;788:12;;;;820;;;;705:1;698:9;673:169;;;-1:-1:-1;860:5:1;;256:615;-1:-1:-1;;;;;;;256:615:1:o;876:149::-;950:20;;999:1;989:12;;979:2;;1015:1;1012;1005:12;1030:186;1089:6;1142:2;1130:9;1121:7;1117:23;1113:32;1110:2;;;1158:1;1155;1148:12;1110:2;1181:29;1200:9;1181:29;:::i;1221:328::-;1298:6;1306;1314;1367:2;1355:9;1346:7;1342:23;1338:32;1335:2;;;1383:1;1380;1373:12;1335:2;1406:29;1425:9;1406:29;:::i;:::-;1396:39;;1454:38;1488:2;1477:9;1473:18;1454:38;:::i;:::-;1444:48;;1539:2;1528:9;1524:18;1511:32;1501:42;;1325:224;;;;;:::o;1554:254::-;1622:6;1630;1683:2;1671:9;1662:7;1658:23;1654:32;1651:2;;;1699:1;1696;1689:12;1651:2;1722:29;1741:9;1722:29;:::i;:::-;1712:39;1798:2;1783:18;;;;1770:32;;-1:-1:-1;;;1641:167:1:o;1813:348::-;1897:6;1950:2;1938:9;1929:7;1925:23;1921:32;1918:2;;;1966:1;1963;1956:12;1918:2;2006:9;1993:23;2039:18;2031:6;2028:30;2025:2;;;2071:1;2068;2061:12;2025:2;2094:61;2147:7;2138:6;2127:9;2123:22;2094:61;:::i;:::-;2084:71;1908:253;-1:-1:-1;;;;1908:253:1:o;2166:892::-;2261:6;2292:2;2335;2323:9;2314:7;2310:23;2306:32;2303:2;;;2351:1;2348;2341:12;2303:2;2384:9;2378:16;2417:18;2409:6;2406:30;2403:2;;;2449:1;2446;2439:12;2403:2;2472:22;;2525:4;2517:13;;2513:27;-1:-1:-1;2503:2:1;;2554:1;2551;2544:12;2503:2;2583;2577:9;2606:60;2622:43;2662:2;2622:43;:::i;2606:60::-;2688:3;2712:2;2707:3;2700:15;2740:2;2735:3;2731:12;2724:19;;2771:2;2767;2763:11;2819:7;2814:2;2808;2805:1;2801:10;2797:2;2793:19;2789:28;2786:41;2783:2;;;2840:1;2837;2830:12;2783:2;2862:1;2853:10;;2872:156;2886:2;2883:1;2880:9;2872:156;;;2943:10;;2931:23;;2904:1;2897:9;;;;;2974:12;;;;3006;;2872:156;;;-1:-1:-1;3047:5:1;2272:786;-1:-1:-1;;;;;;;2272:786:1:o;3063:1151::-;3181:6;3189;3242:2;3230:9;3221:7;3217:23;3213:32;3210:2;;;3258:1;3255;3248:12;3210:2;3298:9;3285:23;3327:18;3368:2;3360:6;3357:14;3354:2;;;3384:1;3381;3374:12;3354:2;3422:6;3411:9;3407:22;3397:32;;3467:7;3460:4;3456:2;3452:13;3448:27;3438:2;;3489:1;3486;3479:12;3438:2;3525;3512:16;3547:4;3571:60;3587:43;3627:2;3587:43;:::i;3571:60::-;3653:3;3677:2;3672:3;3665:15;3705:2;3700:3;3696:12;3689:19;;3736:2;3732;3728:11;3784:7;3779:2;3773;3770:1;3766:10;3762:2;3758:19;3754:28;3751:41;3748:2;;;3805:1;3802;3795:12;3748:2;3827:1;3818:10;;3837:163;3851:2;3848:1;3845:9;3837:163;;;3908:17;;3896:30;;3869:1;3862:9;;;;;3946:12;;;;3978;;3837:163;;;-1:-1:-1;4019:5:1;-1:-1:-1;;4062:18:1;;4049:32;;-1:-1:-1;;4093:16:1;;;4090:2;;;4122:1;4119;4112:12;4090:2;;4145:63;4200:7;4189:8;4178:9;4174:24;4145:63;:::i;:::-;4135:73;;;3200:1014;;;;;:::o;4219:277::-;4286:6;4339:2;4327:9;4318:7;4314:23;4310:32;4307:2;;;4355:1;4352;4345:12;4307:2;4387:9;4381:16;4440:5;4433:13;4426:21;4419:5;4416:32;4406:2;;4462:1;4459;4452:12;4501:353;4591:6;4599;4607;4660:2;4648:9;4639:7;4635:23;4631:32;4628:2;;;4676:1;4673;4666:12;4628:2;4699:35;4724:9;4699:35;:::i;:::-;4689:45;;4753:38;4787:2;4776:9;4772:18;4753:38;:::i;:::-;4743:48;;4810:38;4844:2;4833:9;4829:18;4810:38;:::i;:::-;4800:48;;4618:236;;;;;:::o;4859:515::-;4974:6;4982;4990;5043:2;5031:9;5022:7;5018:23;5014:32;5011:2;;;5059:1;5056;5049:12;5011:2;5082:35;5107:9;5082:35;:::i;:::-;5072:45;;5136:38;5170:2;5159:9;5155:18;5136:38;:::i;:::-;5126:48;;5225:2;5214:9;5210:18;5197:32;5252:18;5244:6;5241:30;5238:2;;;5284:1;5281;5274:12;5238:2;5307:61;5360:7;5351:6;5340:9;5336:22;5307:61;:::i;:::-;5297:71;;;5001:373;;;;;:::o;5379:184::-;5449:6;5502:2;5490:9;5481:7;5477:23;5473:32;5470:2;;;5518:1;5515;5508:12;5470:2;-1:-1:-1;5541:16:1;;5460:103;-1:-1:-1;5460:103:1:o;5568:254::-;5636:6;5644;5697:2;5685:9;5676:7;5672:23;5668:32;5665:2;;;5713:1;5710;5703:12;5665:2;5749:9;5736:23;5726:33;;5778:38;5812:2;5801:9;5797:18;5778:38;:::i;:::-;5768:48;;5655:167;;;;;:::o;5827:328::-;5904:6;5912;5920;5973:2;5961:9;5952:7;5948:23;5944:32;5941:2;;;5989:1;5986;5979:12;5941:2;6025:9;6012:23;6002:33;;6054:38;6088:2;6077:9;6073:18;6054:38;:::i;6160:273::-;6228:6;6281:2;6269:9;6260:7;6256:23;6252:32;6249:2;;;6297:1;6294;6287:12;6249:2;6329:9;6323:16;6379:4;6372:5;6368:16;6361:5;6358:27;6348:2;;6399:1;6396;6389:12;6438:461;6491:3;6529:5;6523:12;6556:6;6551:3;6544:19;6582:4;6611:2;6606:3;6602:12;6595:19;;6648:2;6641:5;6637:14;6669:1;6679:195;6693:6;6690:1;6687:13;6679:195;;;6758:13;;-1:-1:-1;;;;;6754:39:1;6742:52;;6814:12;;;;6849:15;;;;6790:1;6708:9;6679:195;;;-1:-1:-1;6890:3:1;;6499:400;-1:-1:-1;;;;;6499:400:1:o;6904:274::-;7033:3;7071:6;7065:13;7087:53;7133:6;7128:3;7121:4;7113:6;7109:17;7087:53;:::i;:::-;7156:16;;;;;7041:137;-1:-1:-1;;7041:137:1:o;8569:261::-;8748:2;8737:9;8730:21;8711:4;8768:56;8820:2;8809:9;8805:18;8797:6;8768:56;:::i;8835:632::-;9006:2;9058:21;;;9128:13;;9031:18;;;9150:22;;;8977:4;;9006:2;9229:15;;;;9203:2;9188:18;;;8977:4;9272:169;9286:6;9283:1;9280:13;9272:169;;;9347:13;;9335:26;;9416:15;;;;9381:12;;;;9308:1;9301:9;9272:169;;;-1:-1:-1;9458:3:1;;8986:481;-1:-1:-1;;;;;;8986:481:1:o;9472:358::-;9705:6;9694:9;9687:25;9748:2;9743;9732:9;9728:18;9721:30;9668:4;9768:56;9820:2;9809:9;9805:18;9797:6;9768:56;:::i;9835:383::-;9984:2;9973:9;9966:21;9947:4;10016:6;10010:13;10059:6;10054:2;10043:9;10039:18;10032:34;10075:66;10134:6;10129:2;10118:9;10114:18;10109:2;10101:6;10097:15;10075:66;:::i;:::-;10202:2;10181:15;-1:-1:-1;;10177:29:1;10162:45;;;;10209:2;10158:54;;9956:262;-1:-1:-1;;9956:262:1:o;11822:356::-;12024:2;12006:21;;;12043:18;;;12036:30;12102:34;12097:2;12082:18;;12075:62;12169:2;12154:18;;11996:182::o;13894:502::-;14157:6;14146:9;14139:25;14200:3;14195:2;14184:9;14180:18;14173:31;14120:4;14221:57;14273:3;14262:9;14258:19;14250:6;14221:57;:::i;:::-;-1:-1:-1;;;;;14314:32:1;;;;14309:2;14294:18;;14287:60;-1:-1:-1;14378:2:1;14363:18;14356:34;14213:65;14129:267;-1:-1:-1;;14129:267:1:o;14401:582::-;14700:6;14689:9;14682:25;14743:6;14738:2;14727:9;14723:18;14716:34;14786:3;14781:2;14770:9;14766:18;14759:31;14663:4;14807:57;14859:3;14848:9;14844:19;14836:6;14807:57;:::i;:::-;-1:-1:-1;;;;;14900:32:1;;;;14895:2;14880:18;;14873:60;-1:-1:-1;14964:3:1;14949:19;14942:35;14799:65;14672:311;-1:-1:-1;;;14672:311:1:o;14988:275::-;15059:2;15053:9;15124:2;15105:13;;-1:-1:-1;;15101:27:1;15089:40;;15159:18;15144:34;;15180:22;;;15141:62;15138:2;;;15206:18;;:::i;:::-;15242:2;15235:22;15033:230;;-1:-1:-1;15033:230:1:o;15268:183::-;15328:4;15361:18;15353:6;15350:30;15347:2;;;15383:18;;:::i;:::-;-1:-1:-1;15428:1:1;15424:14;15440:4;15420:25;;15337:114::o;15456:128::-;15496:3;15527:1;15523:6;15520:1;15517:13;15514:2;;;15533:18;;:::i;:::-;-1:-1:-1;15569:9:1;;15504:80::o;15589:422::-;15678:1;15721:5;15678:1;15735:270;15756:7;15746:8;15743:21;15735:270;;;15815:4;15811:1;15807:6;15803:17;15797:4;15794:27;15791:2;;;15824:18;;:::i;:::-;15874:7;15864:8;15860:22;15857:2;;;15894:16;;;;15857:2;15973:22;;;;15933:15;;;;15735:270;;;15739:3;15653:358;;;;;:::o;16016:140::-;16074:5;16103:47;16144:4;16134:8;16130:19;16124:4;16210:5;16240:8;16230:2;;-1:-1:-1;16281:1:1;16295:5;;16230:2;16329:4;16319:2;;-1:-1:-1;16366:1:1;16380:5;;16319:2;16411:4;16429:1;16424:59;;;;16497:1;16492:130;;;;16404:218;;16424:59;16454:1;16445:10;;16468:5;;;16492:130;16529:3;16519:8;16516:17;16513:2;;;16536:18;;:::i;:::-;-1:-1:-1;;16592:1:1;16578:16;;16607:5;;16404:218;;16706:2;16696:8;16693:16;16687:3;16681:4;16678:13;16674:36;16668:2;16658:8;16655:16;16650:2;16644:4;16641:12;16637:35;16634:77;16631:2;;;-1:-1:-1;16743:19:1;;;16775:5;;16631:2;16822:34;16847:8;16841:4;16822:34;:::i;:::-;16892:6;16888:1;16884:6;16880:19;16871:7;16868:32;16865:2;;;16903:18;;:::i;:::-;16941:20;;16220:747;-1:-1:-1;;;16220:747:1:o;16972:125::-;17012:4;17040:1;17037;17034:8;17031:2;;;17045:18;;:::i;:::-;-1:-1:-1;17082:9:1;;17021:76::o;17102:258::-;17174:1;17184:113;17198:6;17195:1;17192:13;17184:113;;;17274:11;;;17268:18;17255:11;;;17248:39;17220:2;17213:10;17184:113;;;17315:6;17312:1;17309:13;17306:2;;;-1:-1:-1;;17350:1:1;17332:16;;17325:27;17155:205::o;17365:135::-;17404:3;-1:-1:-1;;17425:17:1;;17422:2;;;17445:18;;:::i;:::-;-1:-1:-1;17492:1:1;17481:13;;17412:88::o;17505:127::-;17566:10;17561:3;17557:20;17554:1;17547:31;17597:4;17594:1;17587:15;17621:4;17618:1;17611:15;17637:127;17698:10;17693:3;17689:20;17686:1;17679:31;17729:4;17726:1;17719:15;17753:4;17750:1;17743:15;17769:127;17830:10;17825:3;17821:20;17818:1;17811:31;17861:4;17858:1;17851:15;17885:4;17882:1;17875:15;17901:127;17962:10;17957:3;17953:20;17950:1;17943:31;17993:4;17990:1;17983:15;18017:4;18014:1;18007:15
Swarm Source
ipfs://b9bade412a0b533229d71dde3f5fb84d9d72255aee5b4b32ad92fecd7b82e474
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.