My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
WooRouterV2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2022-04-27 */ // Sources flattened with hardhat v2.6.4 https://hardhat.org // File contracts/interfaces/IWooPP.sol // SPDX-License-Identifier: MIT pragma solidity 0.6.12; /* ░██╗░░░░░░░██╗░█████╗░░█████╗░░░░░░░███████╗██╗ ░██║░░██╗░░██║██╔══██╗██╔══██╗░░░░░░██╔════╝██║ ░╚██╗████╗██╔╝██║░░██║██║░░██║█████╗█████╗░░██║ ░░████╔═████║░██║░░██║██║░░██║╚════╝██╔══╝░░██║ ░░╚██╔╝░╚██╔╝░╚█████╔╝╚█████╔╝░░░░░░██║░░░░░██║ ░░░╚═╝░░░╚═╝░░░╚════╝░░╚════╝░░░░░░░╚═╝░░░░░╚═╝ * * MIT License * =========== * * Copyright (c) 2020 WooTrade * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /// @title Woo private pool for swap. /// @notice Use this contract to directly interfact with woo's synthetic proactive /// marketing making pool. /// @author woo.network interface IWooPP { /* ----- Type declarations ----- */ /// @dev struct info to store the token info struct TokenInfo { uint112 reserve; // Token balance uint112 threshold; // Threshold for reserve update uint32 lastResetTimestamp; // Timestamp for last param update uint64 R; // Rebalance coefficient [0, 1] uint112 target; // Targeted balance for pricing bool isValid; // is this token info valid } /* ----- Events ----- */ event StrategistUpdated(address indexed strategist, bool flag); event FeeManagerUpdated(address indexed newFeeManager); event RewardManagerUpdated(address indexed newRewardManager); event WooracleUpdated(address indexed newWooracle); event WooGuardianUpdated(address indexed newWooGuardian); event ParametersUpdated(address indexed baseToken, uint256 newThreshold, uint256 newR); event Withdraw(address indexed token, address indexed to, uint256 amount); event WooSwap( address indexed fromToken, address indexed toToken, uint256 fromAmount, uint256 toAmount, address from, address indexed to, address rebateTo ); /* ----- External Functions ----- */ /// @dev Swap baseToken into quoteToken /// @param baseToken the base token /// @param baseAmount amount of baseToken that user want to swap /// @param minQuoteAmount minimum amount of quoteToken that user accept to receive /// @param to quoteToken receiver address /// @param rebateTo the wallet address for rebate /// @return quoteAmount the swapped amount of quote token function sellBase( address baseToken, uint256 baseAmount, uint256 minQuoteAmount, address to, address rebateTo ) external returns (uint256 quoteAmount); /// @dev Swap quoteToken into baseToken /// @param baseToken the base token /// @param quoteAmount amount of quoteToken that user want to swap /// @param minBaseAmount minimum amount of baseToken that user accept to receive /// @param to baseToken receiver address /// @param rebateTo the wallet address for rebate /// @return baseAmount the swapped amount of base token function sellQuote( address baseToken, uint256 quoteAmount, uint256 minBaseAmount, address to, address rebateTo ) external returns (uint256 baseAmount); /// @dev Query the amount for selling the base token amount. /// @param baseToken the base token to sell /// @param baseAmount the amount to sell /// @return quoteAmount the swapped quote amount function querySellBase(address baseToken, uint256 baseAmount) external view returns (uint256 quoteAmount); /// @dev Query the amount for selling the quote token. /// @param baseToken the base token to receive (buy) /// @param quoteAmount the amount to sell /// @return baseAmount the swapped base token amount function querySellQuote(address baseToken, uint256 quoteAmount) external view returns (uint256 baseAmount); /// @dev get the quote token address (immutable) /// @return address of quote token function quoteToken() external view returns (address); } // File contracts/interfaces/IWETH.sol /// @title Wrapped ETH. /// BSC: https://bscscan.com/address/0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c#code interface IWETH { /// @dev Deposit ETH into WETH function deposit() external payable; /// @dev Transfer WETH to receiver /// @param to address of WETH receiver /// @param value amount of WETH to transfer /// @return get true when succeed, else false function transfer(address to, uint256 value) external returns (bool); /// @dev Withdraw WETH to ETH function withdraw(uint256) external; } // File contracts/interfaces/IWooRouterV2.sol /* ░██╗░░░░░░░██╗░█████╗░░█████╗░░░░░░░███████╗██╗ ░██║░░██╗░░██║██╔══██╗██╔══██╗░░░░░░██╔════╝██║ ░╚██╗████╗██╔╝██║░░██║██║░░██║█████╗█████╗░░██║ ░░████╔═████║░██║░░██║██║░░██║╚════╝██╔══╝░░██║ ░░╚██╔╝░╚██╔╝░╚█████╔╝╚█████╔╝░░░░░░██║░░░░░██║ ░░░╚═╝░░░╚═╝░░░╚════╝░░╚════╝░░░░░░░╚═╝░░░░░╚═╝ * * MIT License * =========== * * Copyright (c) 2020 WooTrade * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /// @title Woo router interface /// @notice functions to interface with WooFi swap interface IWooRouterV2 { /* ----- Type declarations ----- */ enum SwapType { WooSwap, DodoSwap } /* ----- Events ----- */ event WooRouterSwap( SwapType swapType, address indexed fromToken, address indexed toToken, uint256 fromAmount, uint256 toAmount, address from, address indexed to, address rebateTo ); event WooPoolChanged(address newPool); /* ----- Router properties ----- */ function WETH() external pure returns (address); function wooPool() external pure returns (IWooPP); /* ----- Main query & swap APIs ----- */ /// @dev query the amount to swap fromToken -> toToken /// @param fromToken the from token /// @param toToken the to token /// @param fromAmount the amount of fromToken to swap /// @return toAmount the predicted amount to receive function querySwap( address fromToken, address toToken, uint256 fromAmount ) external view returns (uint256 toAmount); /// @dev swap fromToken -> toToken /// @param fromToken the from token /// @param toToken the to token /// @param fromAmount the amount of fromToken to swap /// @param minToAmount the amount of fromToken to swap /// @param to the destination address /// @param rebateTo the rebate address (optional, can be 0) /// @return realToAmount the amount of toToken to receive function swap( address fromToken, address toToken, uint256 fromAmount, uint256 minToAmount, address payable to, address rebateTo ) external payable returns (uint256 realToAmount); /* ----- 3rd party DEX swap ----- */ /// @dev swap fromToken -> toToken via an external 3rd swap /// @param approveTarget the contract address for token transfer approval /// @param swapTarget the contract address for swap /// @param fromToken the from token /// @param toToken the to token /// @param fromAmount the amount of fromToken to swap /// @param minToAmount the min amount of swapped toToken /// @param to the destination address /// @param data call data for external call function externalSwap( address approveTarget, address swapTarget, address fromToken, address toToken, uint256 fromAmount, uint256 minToAmount, address payable to, bytes calldata data ) external payable returns (uint256 realToAmount); } // File @openzeppelin/contracts/utils/[email protected] /* * @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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File @openzeppelin/contracts/access/[email protected] /** * @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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File @openzeppelin/contracts/utils/[email protected] /** * @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; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // 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 () internal { _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 make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _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/math/[email protected] /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File @openzeppelin/contracts/token/ERC20/[email protected] /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/token/ERC20/[email protected] /** * @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 SafeMath for uint256; 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' // solhint-disable-next-line max-line-length 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).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _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 // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File @uniswap/lib/contracts/libraries/[email protected] pragma solidity >=0.6.0; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeApprove: approve failed' ); } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeTransfer: transfer failed' ); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::transferFrom: transferFrom failed' ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'TransferHelper::safeTransferETH: ETH transfer failed'); } } // File contracts/WooRouterV2.sol /* ░██╗░░░░░░░██╗░█████╗░░█████╗░░░░░░░███████╗██╗ ░██║░░██╗░░██║██╔══██╗██╔══██╗░░░░░░██╔════╝██║ ░╚██╗████╗██╔╝██║░░██║██║░░██║█████╗█████╗░░██║ ░░████╔═████║░██║░░██║██║░░██║╚════╝██╔══╝░░██║ ░░╚██╔╝░╚██╔╝░╚█████╔╝╚█████╔╝░░░░░░██║░░░░░██║ ░░░╚═╝░░░╚═╝░░░╚════╝░░╚════╝░░░░░░░╚═╝░░░░░╚═╝ * * MIT License * =========== * * Copyright (c) 2020 WooTrade * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /// @title Woo Router implementation. /// @notice Router for stateless execution of swaps against Woo private pool. contract WooRouterV2 is IWooRouterV2, Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; /* ----- Constant variables ----- */ // Erc20 placeholder address for native tokens (e.g. eth, bnb, matic, etc) address constant ETH_PLACEHOLDER_ADDR = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; /* ----- State variables ----- */ // Wrapper for native tokens (e.g. eth, bnb, matic, etc) // BSC WBNB: 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c address public immutable override WETH; IWooPP public override wooPool; mapping(address => bool) public isWhitelisted; address public quoteToken; /* ----- Callback Function ----- */ receive() external payable { // only accept ETH from WETH or whitelisted external swaps. assert(msg.sender == WETH || isWhitelisted[msg.sender]); } /* ----- Query & swap APIs ----- */ constructor(address _weth, address _pool) public { require(_weth != address(0), 'WooRouter: weth_ZERO_ADDR'); WETH = _weth; setPool(_pool); } /// @inheritdoc IWooRouterV2 function querySwap( address fromToken, address toToken, uint256 fromAmount ) external view override returns (uint256 toAmount) { require(fromToken != address(0), 'WooRouter: fromToken_ADDR_ZERO'); require(toToken != address(0), 'WooRouter: toToken_ADDR_ZERO'); fromToken = (fromToken == ETH_PLACEHOLDER_ADDR) ? WETH : fromToken; toToken = (toToken == ETH_PLACEHOLDER_ADDR) ? WETH : toToken; if (fromToken == quoteToken) { toAmount = wooPool.querySellQuote(toToken, fromAmount); } else if (toToken == quoteToken) { toAmount = wooPool.querySellBase(fromToken, fromAmount); } else { uint256 quoteAmount = wooPool.querySellBase(fromToken, fromAmount); toAmount = wooPool.querySellQuote(toToken, quoteAmount); } } /// @inheritdoc IWooRouterV2 function swap( address fromToken, address toToken, uint256 fromAmount, uint256 minToAmount, address payable to, address rebateTo ) external payable override nonReentrant returns (uint256 realToAmount) { require(fromToken != address(0), 'WooRouter: fromToken_ADDR_ZERO'); require(toToken != address(0), 'WooRouter: toToken_ADDR_ZERO'); require(to != address(0), 'WooRouter: to_ADDR_ZERO'); bool isFromETH = fromToken == ETH_PLACEHOLDER_ADDR; bool isToETH = toToken == ETH_PLACEHOLDER_ADDR; fromToken = isFromETH ? WETH : fromToken; toToken = isToETH ? WETH : toToken; // Step 1: transfer the source tokens to WooRouter if (isFromETH) { require(fromAmount <= msg.value, 'WooRouter: fromAmount_INVALID'); IWETH(WETH).deposit{value: msg.value}(); } else { TransferHelper.safeTransferFrom(fromToken, msg.sender, address(this), fromAmount); } // Step 2: swap and transfer TransferHelper.safeApprove(fromToken, address(wooPool), fromAmount); if (fromToken == quoteToken) { // case 1: quoteToken --> baseToken realToAmount = _sellQuoteAndTransfer(isToETH, toToken, fromAmount, minToAmount, to, rebateTo); } else if (toToken == quoteToken) { // case 2: fromToken --> quoteToken realToAmount = wooPool.sellBase(fromToken, fromAmount, minToAmount, to, rebateTo); } else { // case 3: fromToken --> quoteToken --> toToken uint256 quoteAmount = wooPool.sellBase(fromToken, fromAmount, 0, address(this), rebateTo); TransferHelper.safeApprove(quoteToken, address(wooPool), quoteAmount); realToAmount = _sellQuoteAndTransfer(isToETH, toToken, quoteAmount, minToAmount, to, rebateTo); } // Step 3: firing event emit WooRouterSwap( SwapType.WooSwap, isFromETH ? ETH_PLACEHOLDER_ADDR : fromToken, isToETH ? ETH_PLACEHOLDER_ADDR : toToken, fromAmount, realToAmount, msg.sender, to, rebateTo ); } /// @inheritdoc IWooRouterV2 function externalSwap( address approveTarget, address swapTarget, address fromToken, address toToken, uint256 fromAmount, uint256 minToAmount, address payable to, bytes calldata data ) public payable override nonReentrant returns (uint256 realToAmount) { require(approveTarget != address(0), 'WooRouter: approveTarget_ADDR_ZERO'); require(swapTarget != address(0), 'WooRouter: swapTarget_ADDR_ZERO'); require(fromToken != address(0), 'WooRouter: fromToken_ADDR_ZERO'); require(toToken != address(0), 'WooRouter: toToken_ADDR_ZERO'); require(to != address(0), 'WooRouter: to_ADDR_ZERO'); require(isWhitelisted[approveTarget], 'WooRouter: APPROVE_TARGET_NOT_ALLOWED'); require(isWhitelisted[swapTarget], 'WooRouter: SWAP_TARGET_NOT_ALLOWED'); uint256 preBalance = _generalBalanceOf(toToken, address(this)); _internalFallbackSwap(approveTarget, swapTarget, fromToken, fromAmount, data); uint256 postBalance = _generalBalanceOf(toToken, address(this)); require(preBalance <= postBalance, 'WooRouter: balance_ERROR'); realToAmount = postBalance.sub(preBalance); require(realToAmount >= minToAmount && realToAmount > 0, 'WooRouter: realToAmount_NOT_ENOUGH'); _generalTransfer(toToken, to, realToAmount); emit WooRouterSwap(SwapType.DodoSwap, fromToken, toToken, fromAmount, realToAmount, msg.sender, to, address(0)); } /* ----- External Functions ---- */ /// @dev query the swap price for baseToken -> quoteToken. /// @param baseToken the base token to sell /// @param baseAmount the amout of base token to sell /// @return quoteAmount the amount of swapped quote token function querySellBase(address baseToken, uint256 baseAmount) external view returns (uint256 quoteAmount) { require(baseToken != address(0), 'WooRouter: baseToken_ADDR_ZERO'); baseToken = (baseToken == ETH_PLACEHOLDER_ADDR) ? WETH : baseToken; quoteAmount = wooPool.querySellBase(baseToken, baseAmount); } /// @dev query the swap price for quoteToken -> baseToken. /// @param baseToken the base token to swap /// @param quoteAmount the amount of quote token to swap /// @return baseAmount the amount of base token after swap function querySellQuote(address baseToken, uint256 quoteAmount) external view returns (uint256 baseAmount) { require(baseToken != address(0), 'WooRouter: baseToken_ADDR_ZERO'); baseToken = (baseToken == ETH_PLACEHOLDER_ADDR) ? WETH : baseToken; baseAmount = wooPool.querySellQuote(baseToken, quoteAmount); } /// @dev swap baseToken -> quoteToken /// @param baseToken the base token /// @param baseAmount the amount of base token to sell /// @param minQuoteAmount the minimum quote amount to receive /// @param to the destination address /// @param rebateTo the rebate address /// @return realQuoteAmount the exact received amount of quote token function sellBase( address baseToken, uint256 baseAmount, uint256 minQuoteAmount, address to, address rebateTo ) external nonReentrant returns (uint256 realQuoteAmount) { require(baseToken != address(0), 'WooRouter: baseToken_ADDR_ZERO'); require(to != address(0), 'WooRouter: to_ADDR_ZERO'); TransferHelper.safeTransferFrom(baseToken, msg.sender, address(this), baseAmount); TransferHelper.safeApprove(baseToken, address(wooPool), baseAmount); realQuoteAmount = wooPool.sellBase(baseToken, baseAmount, minQuoteAmount, to, rebateTo); emit WooRouterSwap( SwapType.WooSwap, baseToken, quoteToken, baseAmount, realQuoteAmount, msg.sender, to, rebateTo ); } /// @dev swap quoteToken -> baseToken /// @param baseToken the base token to receive /// @param quoteAmount the amount of quote token to sell /// @param minBaseAmount the minimum amount of base token for swap /// @param to the destination address /// @param rebateTo the address for the rebate /// @return realBaseAmount the exact received amount of base token to receive function sellQuote( address baseToken, uint256 quoteAmount, uint256 minBaseAmount, address to, address rebateTo ) external nonReentrant returns (uint256 realBaseAmount) { require(baseToken != address(0), 'WooRouter: baseToken_ADDR_ZERO'); require(to != address(0), 'WooRouter: to_ADDR_ZERO'); TransferHelper.safeTransferFrom(quoteToken, msg.sender, address(this), quoteAmount); TransferHelper.safeApprove(quoteToken, address(wooPool), quoteAmount); realBaseAmount = wooPool.sellQuote(baseToken, quoteAmount, minBaseAmount, to, rebateTo); emit WooRouterSwap( SwapType.WooSwap, quoteToken, baseToken, quoteAmount, realBaseAmount, msg.sender, to, rebateTo ); } /* ----- Admin functions ----- */ /// @dev Rescue the specified funds when stuck happen /// @param token token address /// @param amount amount of token to rescue function rescueFunds(address token, uint256 amount) external nonReentrant onlyOwner { require(token != address(0), 'WooRouter: token_ADDR_ZERO'); TransferHelper.safeTransfer(token, msg.sender, amount); } /// @dev Rescue the native token funds when stuck happen function rescueNativeFunds() external nonReentrant onlyOwner { TransferHelper.safeTransferETH(msg.sender, address(this).balance); } /// @dev Set wooPool from newPool /// @param newPool Wooracle address function setPool(address newPool) public nonReentrant onlyOwner { require(newPool != address(0), 'WooRouter: newPool_ADDR_ZERO'); wooPool = IWooPP(newPool); quoteToken = wooPool.quoteToken(); require(quoteToken != address(0), 'WooRouter: quoteToken_ADDR_ZERO'); emit WooPoolChanged(newPool); } /// @dev Add target address into whitelist /// @param target address that approved by WooRouter /// @param whitelisted approve to using WooRouter or not function setWhitelisted(address target, bool whitelisted) external nonReentrant onlyOwner { require(target != address(0), 'WooRouter: target_ADDR_ZERO'); isWhitelisted[target] = whitelisted; } /* ----- Private Function ----- */ function _sellQuoteAndTransfer( bool isToETH, address toToken, uint256 quoteAmount, uint256 minToAmount, address payable to, address rebateTo ) private returns (uint256 realToAmount) { if (isToETH) { realToAmount = wooPool.sellQuote(toToken, quoteAmount, minToAmount, address(this), rebateTo); IWETH(WETH).withdraw(realToAmount); require(to != address(0), 'WooRouter: to_ZERO_ADDR'); TransferHelper.safeTransferETH(to, realToAmount); } else { realToAmount = wooPool.sellQuote(toToken, quoteAmount, minToAmount, to, rebateTo); } } function _internalFallbackSwap( address approveTarget, address swapTarget, address fromToken, uint256 fromAmount, bytes calldata data ) private { require(isWhitelisted[approveTarget], 'WooRouter: APPROVE_TARGET_NOT_ALLOWED'); require(isWhitelisted[swapTarget], 'WooRouter: SWAP_TARGET_NOT_ALLOWED'); if (fromToken != ETH_PLACEHOLDER_ADDR) { TransferHelper.safeTransferFrom(fromToken, msg.sender, address(this), fromAmount); TransferHelper.safeApprove(fromToken, approveTarget, fromAmount); } else { require(fromAmount <= msg.value, 'WooRouter: fromAmount_INVALID'); } (bool success, ) = swapTarget.call{value: fromToken == ETH_PLACEHOLDER_ADDR ? fromAmount : 0}(data); require(success, 'WooRouter: FALLBACK_SWAP_FAILED'); } function _generalTransfer( address token, address payable to, uint256 amount ) private { if (amount > 0) { if (token == ETH_PLACEHOLDER_ADDR) { TransferHelper.safeTransferETH(to, amount); } else { TransferHelper.safeTransfer(token, to, amount); } } } function _generalBalanceOf(address token, address who) private view returns (uint256) { return token == ETH_PLACEHOLDER_ADDR ? who.balance : IERC20(token).balanceOf(who); } }
[{"inputs":[{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_pool","type":"address"}],"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPool","type":"address"}],"name":"WooPoolChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum IWooRouterV2.SwapType","name":"swapType","type":"uint8"},{"indexed":true,"internalType":"address","name":"fromToken","type":"address"},{"indexed":true,"internalType":"address","name":"toToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"fromAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"rebateTo","type":"address"}],"name":"WooRouterSwap","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"approveTarget","type":"address"},{"internalType":"address","name":"swapTarget","type":"address"},{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"},{"internalType":"uint256","name":"minToAmount","type":"uint256"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"externalSwap","outputs":[{"internalType":"uint256","name":"realToAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"uint256","name":"baseAmount","type":"uint256"}],"name":"querySellBase","outputs":[{"internalType":"uint256","name":"quoteAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"uint256","name":"quoteAmount","type":"uint256"}],"name":"querySellQuote","outputs":[{"internalType":"uint256","name":"baseAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"}],"name":"querySwap","outputs":[{"internalType":"uint256","name":"toAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quoteToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueNativeFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"uint256","name":"baseAmount","type":"uint256"},{"internalType":"uint256","name":"minQuoteAmount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"rebateTo","type":"address"}],"name":"sellBase","outputs":[{"internalType":"uint256","name":"realQuoteAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"uint256","name":"quoteAmount","type":"uint256"},{"internalType":"uint256","name":"minBaseAmount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"rebateTo","type":"address"}],"name":"sellQuote","outputs":[{"internalType":"uint256","name":"realBaseAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPool","type":"address"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"setWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"},{"internalType":"uint256","name":"minToAmount","type":"uint256"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"address","name":"rebateTo","type":"address"}],"name":"swap","outputs":[{"internalType":"uint256","name":"realToAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wooPool","outputs":[{"internalType":"contract IWooPP","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040523480156200001157600080fd5b506040516200309838038062003098833981810160405260408110156200003757600080fd5b50805160209091015160006200004c6200011b565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180556001600160a01b038216620000f6576040805162461bcd60e51b815260206004820152601960248201527f576f6f526f757465723a20776574685f5a45524f5f4144445200000000000000604482015290519081900360640190fd5b6001600160601b0319606083901b1660805262000113816200011f565b5050620003a0565b3390565b6002600154141562000178576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600155620001876200011b565b6001600160a01b03166200019a62000391565b6001600160a01b031614620001f6576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811662000252576040805162461bcd60e51b815260206004820152601c60248201527f576f6f526f757465723a206e6577506f6f6c5f414444525f5a45524f00000000604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b03838116919091179182905560408051630217a4b760e41b81529051929091169163217a4b7091600480820192602092909190829003018186803b158015620002af57600080fd5b505afa158015620002c4573d6000803e3d6000fd5b505050506040513d6020811015620002db57600080fd5b5051600480546001600160a01b0319166001600160a01b039283161790819055166200034e576040805162461bcd60e51b815260206004820152601f60248201527f576f6f526f757465723a2071756f7465546f6b656e5f414444525f5a45524f00604482015290519081900360640190fd5b604080516001600160a01b038316815290517f4577a21bd8e55848c574b7582f8e6cc6a7cf1c1958f36a9751eab6329d656b1e9181900360200190a15060018055565b6000546001600160a01b031690565b60805160601c612cad620003eb6000398061011d5280610d2f528061123b528061143d528061146c52806114eb52806119505280611a565280611aa452806129195250612cad6000f3fe60806040526004361061010d5760003560e01c806379a0487611610095578063a739460311610064578063a739460314610490578063ad5c4648146104a5578063e94803f4146104ba578063f2fde38b146104fd578063f3287c2f1461053057610160565b806379a04876146103bd5780637dc20382146103f65780638da5cb5b146104405780639281aa0b1461045557610160565b80634437152a116100dc5780634437152a146102b257806366410a21146102e55780636846fb501461031e578063715018a61461036f57806378e3214f1461038457610160565b8063063c27f814610165578063199b83fa1461017a578063217a4b701461023a5780633af32abf1461026b57610160565b3661016057336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061015857503360009081526003602052604090205460ff165b61015e57fe5b005b600080fd5b34801561017157600080fd5b5061015e610581565b610228600480360361010081101561019157600080fd5b6001600160a01b03823581169260208101358216926040820135831692606083013581169260808101359260a08201359260c0830135169190810190610100810160e08201356401000000008111156101e957600080fd5b8201836020820111156101fb57600080fd5b8035906020019184600183028401116401000000008311171561021d57600080fd5b50909250905061063e565b60408051918252519081900360200190f35b34801561024657600080fd5b5061024f610a51565b604080516001600160a01b039092168252519081900360200190f35b34801561027757600080fd5b5061029e6004803603602081101561028e57600080fd5b50356001600160a01b0316610a60565b604080519115158252519081900360200190f35b3480156102be57600080fd5b5061015e600480360360208110156102d557600080fd5b50356001600160a01b0316610a75565b3480156102f157600080fd5b506102286004803603604081101561030857600080fd5b506001600160a01b038135169060200135610cb8565b34801561032a57600080fd5b50610228600480360360a081101561034157600080fd5b506001600160a01b038135811691602081013591604082013591606081013582169160809091013516610dd8565b34801561037b57600080fd5b5061015e610ffd565b34801561039057600080fd5b5061015e600480360360408110156103a757600080fd5b506001600160a01b0381351690602001356110a9565b3480156103c957600080fd5b50610228600480360360408110156103e057600080fd5b506001600160a01b0381351690602001356111c4565b610228600480360360c081101561040c57600080fd5b506001600160a01b0381358116916020810135821691604082013591606081013591608082013581169160a00135166112b1565b34801561044c57600080fd5b5061024f6117f9565b34801561046157600080fd5b5061015e6004803603604081101561047857600080fd5b506001600160a01b0381351690602001351515611808565b34801561049c57600080fd5b5061024f61193f565b3480156104b157600080fd5b5061024f61194e565b3480156104c657600080fd5b50610228600480360360608110156104dd57600080fd5b506001600160a01b03813581169160208101359091169060400135611972565b34801561050957600080fd5b5061015e6004803603602081101561052057600080fd5b50356001600160a01b0316611cdf565b34801561053c57600080fd5b50610228600480360360a081101561055357600080fd5b506001600160a01b038135811691602081013591604082013591606081013582169160809091013516611de1565b600260015414156105c7576040805162461bcd60e51b815260206004820152601f6024820152600080516020612a8a833981519152604482015290519081900360640190fd5b60026001556105d4611fd9565b6001600160a01b03166105e56117f9565b6001600160a01b03161461062e576040805162461bcd60e51b81526020600482018190526024820152600080516020612c00833981519152604482015290519081900360640190fd5b6106383347611fdd565b60018055565b600060026001541415610686576040805162461bcd60e51b815260206004820152601f6024820152600080516020612a8a833981519152604482015290519081900360640190fd5b60026001556001600160a01b038a166106d05760405162461bcd60e51b8152600401808060200182810382526022815260200180612bde6022913960400191505060405180910390fd5b6001600160a01b03891661072b576040805162461bcd60e51b815260206004820152601f60248201527f576f6f526f757465723a20737761705461726765745f414444525f5a45524f00604482015290519081900360640190fd5b6001600160a01b038816610786576040805162461bcd60e51b815260206004820152601e60248201527f576f6f526f757465723a2066726f6d546f6b656e5f414444525f5a45524f0000604482015290519081900360640190fd5b6001600160a01b0387166107e1576040805162461bcd60e51b815260206004820152601c60248201527f576f6f526f757465723a20746f546f6b656e5f414444525f5a45524f00000000604482015290519081900360640190fd5b6001600160a01b038416610836576040805162461bcd60e51b8152602060048201526017602482015276576f6f526f757465723a20746f5f414444525f5a45524f60481b604482015290519081900360640190fd5b6001600160a01b038a1660009081526003602052604090205460ff1661088d5760405162461bcd60e51b8152600401808060200182810382526025815260200180612b976025913960400191505060405180910390fd5b6001600160a01b03891660009081526003602052604090205460ff166108e45760405162461bcd60e51b8152600401808060200182810382526022815260200180612b556022913960400191505060405180910390fd5b60006108f088306120d5565b90506109008b8b8b8a8888612189565b600061090c89306120d5565b905080821115610963576040805162461bcd60e51b815260206004820152601860248201527f576f6f526f757465723a2062616c616e63655f4552524f520000000000000000604482015290519081900360640190fd5b61096d81836123b6565b925086831015801561097f5750600083115b6109ba5760405162461bcd60e51b8152600401808060200182810382526022815260200180612bbc6022913960400191505060405180910390fd5b6109c5898785612413565b856001600160a01b0316896001600160a01b03168b6001600160a01b0316600080516020612b7783398151915260018c8833600060405180866001811115610a0957fe5b81526020810195909552506040808501939093526001600160a01b039182166060850152166080830152519081900360a0019150a45050600180559998505050505050505050565b6004546001600160a01b031681565b60036020526000908152604090205460ff1681565b60026001541415610abb576040805162461bcd60e51b815260206004820152601f6024820152600080516020612a8a833981519152604482015290519081900360640190fd5b6002600155610ac8611fd9565b6001600160a01b0316610ad96117f9565b6001600160a01b031614610b22576040805162461bcd60e51b81526020600482018190526024820152600080516020612c00833981519152604482015290519081900360640190fd5b6001600160a01b038116610b7d576040805162461bcd60e51b815260206004820152601c60248201527f576f6f526f757465723a206e6577506f6f6c5f414444525f5a45524f00000000604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b03838116919091179182905560408051630217a4b760e41b81529051929091169163217a4b7091600480820192602092909190829003018186803b158015610bd957600080fd5b505afa158015610bed573d6000803e3d6000fd5b505050506040513d6020811015610c0357600080fd5b5051600480546001600160a01b0319166001600160a01b03928316179081905516610c75576040805162461bcd60e51b815260206004820152601f60248201527f576f6f526f757465723a2071756f7465546f6b656e5f414444525f5a45524f00604482015290519081900360640190fd5b604080516001600160a01b038316815290517f4577a21bd8e55848c574b7582f8e6cc6a7cf1c1958f36a9751eab6329d656b1e9181900360200190a15060018055565b60006001600160a01b038316610d03576040805162461bcd60e51b815260206004820152601e6024820152600080516020612ad0833981519152604482015290519081900360640190fd5b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610d2d5782610d4f565b7f00000000000000000000000000000000000000000000000000000000000000005b600254604080516366410a2160e01b81526001600160a01b0380851660048301526024820187905291519396509116916366410a2191604480820192602092909190829003018186803b158015610da557600080fd5b505afa158015610db9573d6000803e3d6000fd5b505050506040513d6020811015610dcf57600080fd5b50519392505050565b600060026001541415610e20576040805162461bcd60e51b815260206004820152601f6024820152600080516020612a8a833981519152604482015290519081900360640190fd5b60026001556001600160a01b038616610e6e576040805162461bcd60e51b815260206004820152601e6024820152600080516020612ad0833981519152604482015290519081900360640190fd5b6001600160a01b038316610ec3576040805162461bcd60e51b8152602060048201526017602482015276576f6f526f757465723a20746f5f414444525f5a45524f60481b604482015290519081900360640190fd5b610ecf86333088612458565b600254610ee79087906001600160a01b0316876125b5565b600254604080516306846fb560e41b81526001600160a01b03898116600483015260248201899052604482018890528681166064830152858116608483015291519190921691636846fb509160a48083019260209291908290030181600087803b158015610f5457600080fd5b505af1158015610f68573d6000803e3d6000fd5b505050506040513d6020811015610f7e57600080fd5b50516004546040519192506001600160a01b03808616929181169190891690600080516020612b77833981519152906000908a90879033908a9080865b81526020810195909552506040808501939093526001600160a01b039182166060850152166080830152519081900360a0019150a46001805595945050505050565b611005611fd9565b6001600160a01b03166110166117f9565b6001600160a01b03161461105f576040805162461bcd60e51b81526020600482018190526024820152600080516020612c00833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600260015414156110ef576040805162461bcd60e51b815260206004820152601f6024820152600080516020612a8a833981519152604482015290519081900360640190fd5b60026001556110fc611fd9565b6001600160a01b031661110d6117f9565b6001600160a01b031614611156576040805162461bcd60e51b81526020600482018190526024820152600080516020612c00833981519152604482015290519081900360640190fd5b6001600160a01b0382166111b1576040805162461bcd60e51b815260206004820152601a60248201527f576f6f526f757465723a20746f6b656e5f414444525f5a45524f000000000000604482015290519081900360640190fd5b6111bc823383612709565b505060018055565b60006001600160a01b03831661120f576040805162461bcd60e51b815260206004820152601e6024820152600080516020612ad0833981519152604482015290519081900360640190fd5b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611239578261125b565b7f00000000000000000000000000000000000000000000000000000000000000005b60025460408051633cd0243b60e11b81526001600160a01b0380851660048301526024820187905291519396509116916379a0487691604480820192602092909190829003018186803b158015610da557600080fd5b6000600260015414156112f9576040805162461bcd60e51b815260206004820152601f6024820152600080516020612a8a833981519152604482015290519081900360640190fd5b60026001556001600160a01b038716611359576040805162461bcd60e51b815260206004820152601e60248201527f576f6f526f757465723a2066726f6d546f6b656e5f414444525f5a45524f0000604482015290519081900360640190fd5b6001600160a01b0386166113b4576040805162461bcd60e51b815260206004820152601c60248201527f576f6f526f757465723a20746f546f6b656e5f414444525f5a45524f00000000604482015290519081900360640190fd5b6001600160a01b038316611409576040805162461bcd60e51b8152602060048201526017602482015276576f6f526f757465723a20746f5f414444525f5a45524f60481b604482015290519081900360640190fd5b6001600160a01b0387811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee908114918816148161143b578861145d565b7f00000000000000000000000000000000000000000000000000000000000000005b98508061146a578761148c565b7f00000000000000000000000000000000000000000000000000000000000000005b9750811561156257348711156114e9576040805162461bcd60e51b815260206004820152601d60248201527f576f6f526f757465723a2066726f6d416d6f756e745f494e56414c4944000000604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561154457600080fd5b505af1158015611558573d6000803e3d6000fd5b505050505061156e565b61156e8933308a612458565b600254611586908a906001600160a01b0316896125b5565b6004546001600160a01b038a8116911614156115b1576115aa818989898989612856565b9250611731565b6004546001600160a01b038981169116141561166757600254604080516306846fb560e41b81526001600160a01b038c81166004830152602482018b9052604482018a90528881166064830152878116608483015291519190921691636846fb509160a48083019260209291908290030181600087803b15801561163457600080fd5b505af1158015611648573d6000803e3d6000fd5b505050506040513d602081101561165e57600080fd5b50519250611731565b600254604080516306846fb560e41b81526001600160a01b038c81166004830152602482018b90526000604483018190523060648401528882166084840152925192931691636846fb509160a48082019260209290919082900301818787803b1580156116d357600080fd5b505af11580156116e7573d6000803e3d6000fd5b505050506040513d60208110156116fd57600080fd5b505160045460025491925061171f916001600160a01b039182169116836125b5565b61172d828a838a8a8a612856565b9350505b846001600160a01b031681611746578861175c565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b6001600160a01b031683611770578a611786565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b6001600160a01b0316600080516020612b7783398151915260008b88338b604051808660018111156117b457fe5b81526020810195909552506040808501939093526001600160a01b039182166060850152166080830152519081900360a0019150a45050600180559695505050505050565b6000546001600160a01b031690565b6002600154141561184e576040805162461bcd60e51b815260206004820152601f6024820152600080516020612a8a833981519152604482015290519081900360640190fd5b600260015561185b611fd9565b6001600160a01b031661186c6117f9565b6001600160a01b0316146118b5576040805162461bcd60e51b81526020600482018190526024820152600080516020612c00833981519152604482015290519081900360640190fd5b6001600160a01b038216611910576040805162461bcd60e51b815260206004820152601b60248201527f576f6f526f757465723a207461726765745f414444525f5a45524f0000000000604482015290519081900360640190fd5b6001600160a01b03919091166000908152600360205260409020805460ff191691151591909117905560018055565b6002546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006001600160a01b0384166119cf576040805162461bcd60e51b815260206004820152601e60248201527f576f6f526f757465723a2066726f6d546f6b656e5f414444525f5a45524f0000604482015290519081900360640190fd5b6001600160a01b038316611a2a576040805162461bcd60e51b815260206004820152601c60248201527f576f6f526f757465723a20746f546f6b656e5f414444525f5a45524f00000000604482015290519081900360640190fd5b6001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611a545783611a76565b7f00000000000000000000000000000000000000000000000000000000000000005b93506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611aa25782611ac4565b7f00000000000000000000000000000000000000000000000000000000000000005b6004549093506001600160a01b0385811691161415611b6457600254604080516366410a2160e01b81526001600160a01b03868116600483015260248201869052915191909216916366410a21916044808301926020929190829003018186803b158015611b3157600080fd5b505afa158015611b45573d6000803e3d6000fd5b505050506040513d6020811015611b5b57600080fd5b50519050611cd8565b6004546001600160a01b0384811691161415611bce5760025460408051633cd0243b60e11b81526001600160a01b03878116600483015260248201869052915191909216916379a04876916044808301926020929190829003018186803b158015611b3157600080fd5b60025460408051633cd0243b60e11b81526001600160a01b03878116600483015260248201869052915160009392909216916379a0487691604480820192602092909190829003018186803b158015611c2657600080fd5b505afa158015611c3a573d6000803e3d6000fd5b505050506040513d6020811015611c5057600080fd5b5051600254604080516366410a2160e01b81526001600160a01b0388811660048301526024820185905291519394509116916366410a2191604480820192602092909190829003018186803b158015611ca857600080fd5b505afa158015611cbc573d6000803e3d6000fd5b505050506040513d6020811015611cd257600080fd5b50519150505b9392505050565b611ce7611fd9565b6001600160a01b0316611cf86117f9565b6001600160a01b031614611d41576040805162461bcd60e51b81526020600482018190526024820152600080516020612c00833981519152604482015290519081900360640190fd5b6001600160a01b038116611d865760405162461bcd60e51b8152600401808060200182810382526026815260200180612aaa6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600060026001541415611e29576040805162461bcd60e51b815260206004820152601f6024820152600080516020612a8a833981519152604482015290519081900360640190fd5b60026001556001600160a01b038616611e77576040805162461bcd60e51b815260206004820152601e6024820152600080516020612ad0833981519152604482015290519081900360640190fd5b6001600160a01b038316611ecc576040805162461bcd60e51b8152602060048201526017602482015276576f6f526f757465723a20746f5f414444525f5a45524f60481b604482015290519081900360640190fd5b600454611ee4906001600160a01b0316333088612458565b600454600254611f01916001600160a01b039081169116876125b5565b6002546040805163f3287c2f60e01b81526001600160a01b0389811660048301526024820189905260448201889052868116606483015285811660848301529151919092169163f3287c2f9160a48083019260209291908290030181600087803b158015611f6e57600080fd5b505af1158015611f82573d6000803e3d6000fd5b505050506040513d6020811015611f9857600080fd5b50516004546040519192506001600160a01b03808616928982169290911690600080516020612b77833981519152906000908a90879033908a908086610fbb565b3390565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106120295780518252601f19909201916020918201910161200a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461208b576040519150601f19603f3d011682016040523d82523d6000602084013e612090565b606091505b50509050806120d05760405162461bcd60e51b8152600401808060200182810382526034815260200180612b216034913960400191505060405180910390fd5b505050565b60006001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461217957826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561214857600080fd5b505afa15801561215c573d6000803e3d6000fd5b505050506040513d602081101561217257600080fd5b5051611cd8565b506001600160a01b031631919050565b6001600160a01b03861660009081526003602052604090205460ff166121e05760405162461bcd60e51b8152600401808060200182810382526025815260200180612b976025913960400191505060405180910390fd5b6001600160a01b03851660009081526003602052604090205460ff166122375760405162461bcd60e51b8152600401808060200182810382526022815260200180612b556022913960400191505060405180910390fd5b6001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146122775761226784333086612458565b6122728487856125b5565b6122cc565b348311156122cc576040805162461bcd60e51b815260206004820152601d60248201527f576f6f526f757465723a2066726f6d416d6f756e745f494e56414c4944000000604482015290519081900360640190fd5b60006001600160a01b0380871690861673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146122fd5760006122ff565b845b8484604051808383808284376040519201945060009350909150508083038185875af1925050503d8060008114612352576040519150601f19603f3d011682016040523d82523d6000602084013e612357565b606091505b50509050806123ad576040805162461bcd60e51b815260206004820152601f60248201527f576f6f526f757465723a2046414c4c4241434b5f535741505f4641494c454400604482015290519081900360640190fd5b50505050505050565b60008282111561240d576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b80156120d0576001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561244d576124488282611fdd565b6120d0565b6120d0838383612709565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106124dd5780518252601f1990920191602091820191016124be565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461253f576040519150601f19603f3d011682016040523d82523d6000602084013e612544565b606091505b5091509150818015612572575080511580612572575080806020019051602081101561256f57600080fd5b50515b6125ad5760405162461bcd60e51b8152600401808060200182810382526031815260200180612af06031913960400191505060405180910390fd5b505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b602083106126325780518252601f199092019160209182019101612613565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612694576040519150601f19603f3d011682016040523d82523d6000602084013e612699565b606091505b50915091508180156126c75750805115806126c757508080602001905160208110156126c457600080fd5b50515b6127025760405162461bcd60e51b815260040180806020018281038252602b815260200180612c20602b913960400191505060405180910390fd5b5050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106127865780518252601f199092019160209182019101612767565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146127e8576040519150601f19603f3d011682016040523d82523d6000602084013e6127ed565b606091505b509150915081801561281b57508051158061281b575080806020019051602081101561281857600080fd5b50515b6127025760405162461bcd60e51b815260040180806020018281038252602d815260200180612c4b602d913960400191505060405180910390fd5b600086156129e3576002546040805163f3287c2f60e01b81526001600160a01b038981166004830152602482018990526044820188905230606483015285811660848301529151919092169163f3287c2f9160a48083019260209291908290030181600087803b1580156128c957600080fd5b505af11580156128dd573d6000803e3d6000fd5b505050506040513d60208110156128f357600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691632e1a7d4d9160248082019260009290919082900301818387803b15801561296157600080fd5b505af1158015612975573d6000803e3d6000fd5b505050506001600160a01b0383166129d4576040805162461bcd60e51b815260206004820152601760248201527f576f6f526f757465723a20746f5f5a45524f5f41444452000000000000000000604482015290519081900360640190fd5b6129de8382611fdd565b612a7f565b6002546040805163f3287c2f60e01b81526001600160a01b0389811660048301526024820189905260448201889052868116606483015285811660848301529151919092169163f3287c2f9160a48083019260209291908290030181600087803b158015612a5057600080fd5b505af1158015612a64573d6000803e3d6000fd5b505050506040513d6020811015612a7a57600080fd5b505190505b969550505050505056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c004f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373576f6f526f757465723a2062617365546f6b656e5f414444525f5a45524f00005472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c6564576f6f526f757465723a20535741505f5441524745545f4e4f545f414c4c4f57454427c98e911efdd224f4002f6cd831c3ad0d2759ee176f9ee8466d95826af22a1c576f6f526f757465723a20415050524f56455f5441524745545f4e4f545f414c4c4f574544576f6f526f757465723a207265616c546f416d6f756e745f4e4f545f454e4f554748576f6f526f757465723a20617070726f76655461726765745f414444525f5a45524f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725472616e7366657248656c7065723a3a73616665417070726f76653a20617070726f7665206661696c65645472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564a264697066735822122014d5ed1ec42ccd63157ae58d3a23ae6a4ca4a578de09763c9c250d762392802f64736f6c634300060c0033000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c70000000000000000000000001df3009c57a8b143c6246149f00b090bce3b8f88
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c70000000000000000000000001df3009c57a8b143c6246149f00b090bce3b8f88
-----Decoded View---------------
Arg [0] : _weth (address): 0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7
Arg [1] : _pool (address): 0x1df3009c57a8b143c6246149f00b090bce3b8f88
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7
Arg [1] : 0000000000000000000000001df3009c57a8b143c6246149f00b090bce3b8f88
Deployed ByteCode Sourcemap
43057:13355:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43905:10;-1:-1:-1;;;;;43919:4:0;43905:18;;;:47;;-1:-1:-1;43941:10:0;43927:25;;;;:13;:25;;;;;;;;43905:47;43898:55;;;;43057:13355;;;;;53235:145;;;;;;;;;;;;;:::i;47453:1535::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47453:1535:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47453:1535:0;;-1:-1:-1;47453:1535:0;-1:-1:-1;47453:1535:0;:::i;:::-;;;;;;;;;;;;;;;;43714:25;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;43714:25:0;;;;;;;;;;;;;;43660:45;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43660:45:0;-1:-1:-1;;;;;43660:45:0;;:::i;:::-;;;;;;;;;;;;;;;;;;53468:343;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53468:343:0;-1:-1:-1;;;;;53468:343:0;;:::i;49858:339::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;49858:339:0;;;;;;;;:::i;50577:875::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50577:875:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13782:148::-;;;;;;;;;;;;;:::i;52939:226::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52939:226:0;;;;;;;;:::i;49274:337::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;49274:337:0;;;;;;;;:::i;45138:2273::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45138:2273:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13131:87::-;;;;;;;;;;;;;:::i;53987:215::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53987:215:0;;;;;;;;;;:::i;43621:30::-;;;;;;;;;;;;;:::i;43574:38::-;;;;;;;;;;;;;:::i;44227:869::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44227:869:0;;;;;;;;;;;;;;;;;:::i;14085:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14085:244:0;-1:-1:-1;;;;;14085:244:0;;:::i;51867:879::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;51867:879:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;53235:145::-;24075:1;24681:7;;:19;;24673:63;;;;;-1:-1:-1;;;24673:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24673:63:0;;;;;;;;;;;;;;;24075:1;24814:7;:18;13362:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;13351:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;13351:23:0::1;;13343:68;;;::::0;;-1:-1:-1;;;13343:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;13343:68:0;;;;;;;;;;;;;::::1;;53307:65:::2;53338:10;53350:21;53307:30;:65::i;:::-;24031:1:::0;24993:22;;53235:145::o;47453:1535::-;47761:20;24075:1;24681:7;;:19;;24673:63;;;;;-1:-1:-1;;;24673:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24673:63:0;;;;;;;;;;;;;;;24075:1;24814:7;:18;-1:-1:-1;;;;;47802:27:0;::::1;47794:74;;;;-1:-1:-1::0;;;47794:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;47887:24:0;::::1;47879:68;;;::::0;;-1:-1:-1;;;47879:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;47966:23:0;::::1;47958:66;;;::::0;;-1:-1:-1;;;47958:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;48043:21:0;::::1;48035:62;;;::::0;;-1:-1:-1;;;48035:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;48116:16:0;::::1;48108:52;;;::::0;;-1:-1:-1;;;48108:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48108:52:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;48179:28:0;::::1;;::::0;;;:13:::1;:28;::::0;;;;;::::1;;48171:78;;;;-1:-1:-1::0;;;48171:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;48268:25:0;::::1;;::::0;;;:13:::1;:25;::::0;;;;;::::1;;48260:72;;;;-1:-1:-1::0;;;48260:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48345:18;48366:41;48384:7;48401:4;48366:17;:41::i;:::-;48345:62;;48418:77;48440:13;48455:10;48467:9;48478:10;48490:4;;48418:21;:77::i;:::-;48506:19;48528:41;48546:7;48563:4;48528:17;:41::i;:::-;48506:63;;48604:11;48590:10;:25;;48582:62;;;::::0;;-1:-1:-1;;;48582:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;48670:27;:11:::0;48686:10;48670:15:::1;:27::i;:::-;48655:42;;48732:11;48716:12;:27;;:47;;;;;48762:1;48747:12;:16;48716:47;48708:94;;;;-1:-1:-1::0;;;48708:94:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48813:43;48830:7;48839:2;48843:12;48813:16;:43::i;:::-;48965:2;-1:-1:-1::0;;;;;48874:106:0::1;48918:7;-1:-1:-1::0;;;;;48874:106:0::1;48907:9;-1:-1:-1::0;;;;;48874:106:0::1;-1:-1:-1::0;;;;;;;;;;;48888:17:0::1;48927:10;48939:12;48953:10;48977:1;48874:106;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;48874:106:0;;;;;;;;-1:-1:-1;;;;;48874:106:0;;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;-1:-1:-1;48874:106:0::1;-1:-1:-1::0;;24031:1:0;24993:22;;47453:1535;;-1:-1:-1;;;;;;;;;47453:1535:0:o;43714:25::-;;;-1:-1:-1;;;;;43714:25:0;;:::o;43660:45::-;;;;;;;;;;;;;;;:::o;53468:343::-;24075:1;24681:7;;:19;;24673:63;;;;;-1:-1:-1;;;24673:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24673:63:0;;;;;;;;;;;;;;;24075:1;24814:7;:18;13362:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;13351:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;13351:23:0::1;;13343:68;;;::::0;;-1:-1:-1;;;13343:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;13343:68:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;53551:21:0;::::2;53543:62;;;::::0;;-1:-1:-1;;;53543:62:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;53616:7;:25:::0;;-1:-1:-1;;;;;;53616:25:0::2;-1:-1:-1::0;;;;;53616:25:0;;::::2;::::0;;;::::2;::::0;;;;53665:20:::2;::::0;;-1:-1:-1;;;53665:20:0;;;;:7;;;::::2;::::0;:18:::2;::::0;:20:::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;;:7;:20;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;53665:20:0;53652:10:::2;:33:::0;;-1:-1:-1;;;;;;53652:33:0::2;-1:-1:-1::0;;;;;53652:33:0;;::::2;;::::0;;;;53704:10:::2;53696:68;;;::::0;;-1:-1:-1;;;53696:68:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;53780:23;::::0;;-1:-1:-1;;;;;53780:23:0;::::2;::::0;;;;::::2;::::0;;;;::::2;::::0;;::::2;-1:-1:-1::0;24031:1:0;24993:22;;53468:343::o;49858:339::-;49945:18;-1:-1:-1;;;;;49984:23:0;;49976:66;;;;;-1:-1:-1;;;49976:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;49976:66:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;50066:33:0;;43359:42;50066:33;50065:54;;50110:9;50065:54;;;50103:4;50065:54;50143:7;;:46;;;-1:-1:-1;;;50143:46:0;;-1:-1:-1;;;;;50143:46:0;;;;;;;;;;;;;;;50053:66;;-1:-1:-1;50143:7:0;;;:22;;:46;;;;;;;;;;;;;;;:7;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50143:46:0;;49858:339;-1:-1:-1;;;49858:339:0:o;50577:875::-;50771:23;24075:1;24681:7;;:19;;24673:63;;;;;-1:-1:-1;;;24673:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24673:63:0;;;;;;;;;;;;;;;24075:1;24814:7;:18;-1:-1:-1;;;;;50815:23:0;::::1;50807:66;;;::::0;;-1:-1:-1;;;50807:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;50807:66:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;50892:16:0;::::1;50884:52;;;::::0;;-1:-1:-1;;;50884:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;50884:52:0;;;;;;;;;;;;;::::1;;50947:81;50979:9;50990:10;51010:4;51017:10;50947:31;:81::i;:::-;51085:7;::::0;51039:67:::1;::::0;51066:9;;-1:-1:-1;;;;;51085:7:0::1;51095:10:::0;51039:26:::1;:67::i;:::-;51135:7;::::0;:69:::1;::::0;;-1:-1:-1;;;51135:69:0;;-1:-1:-1;;;;;51135:69:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;:7;;;::::1;::::0;:16:::1;::::0;:69;;;;;::::1;::::0;;;;;;;;:7:::1;::::0;:69;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;51135:69:0;51303:10:::1;::::0;51220:224:::1;::::0;51135:69;;-1:-1:-1;;;;;;51220:224:0;;::::1;::::0;51303:10;;::::1;::::0;51220:224;;::::1;::::0;-1:-1:-1;;;;;;;;;;;51220:224:0;51303:10:::1;::::0;51328;;51135:69;;51383:10:::1;::::0;51425:8;;51220:224;51303:10;51220:224:::1;::::0;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;51220:224:0;;;;;;;;-1:-1:-1;;;;;51220:224:0;;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;-1:-1:-1;51220:224:0::1;24031:1:::0;24993:22;;50577:875;;-1:-1:-1;;;;;50577:875:0:o;13782:148::-;13362:12;:10;:12::i;:::-;-1:-1:-1;;;;;13351:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;13351:23:0;;13343:68;;;;;-1:-1:-1;;;13343:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;13343:68:0;;;;;;;;;;;;;;;13889:1:::1;13873:6:::0;;13852:40:::1;::::0;-1:-1:-1;;;;;13873:6:0;;::::1;::::0;13852:40:::1;::::0;13889:1;;13852:40:::1;13920:1;13903:19:::0;;-1:-1:-1;;;;;;13903:19:0::1;::::0;;13782:148::o;52939:226::-;24075:1;24681:7;;:19;;24673:63;;;;;-1:-1:-1;;;24673:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24673:63:0;;;;;;;;;;;;;;;24075:1;24814:7;:18;13362:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;13351:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;13351:23:0::1;;13343:68;;;::::0;;-1:-1:-1;;;13343:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;13343:68:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;53042:19:0;::::2;53034:58;;;::::0;;-1:-1:-1;;;53034:58:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;53103:54;53131:5;53138:10;53150:6;53103:27;:54::i;:::-;-1:-1:-1::0;;24031:1:0;24993:22;;52939:226::o;49274:337::-;49359:19;-1:-1:-1;;;;;49399:23:0;;49391:66;;;;;-1:-1:-1;;;49391:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;49391:66:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;49481:33:0;;43359:42;49481:33;49480:54;;49525:9;49480:54;;;49518:4;49480:54;49559:7;;:44;;;-1:-1:-1;;;49559:44:0;;-1:-1:-1;;;;;49559:44:0;;;;;;;;;;;;;;;49468:66;;-1:-1:-1;49559:7:0;;;:21;;:44;;;;;;;;;;;;;;;:7;:44;;;;;;;;;;45138:2273;45376:20;24075:1;24681:7;;:19;;24673:63;;;;;-1:-1:-1;;;24673:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24673:63:0;;;;;;;;;;;;;;;24075:1;24814:7;:18;-1:-1:-1;;;;;45417:23:0;::::1;45409:66;;;::::0;;-1:-1:-1;;;45409:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;45494:21:0;::::1;45486:62;;;::::0;;-1:-1:-1;;;45486:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;45567:16:0;::::1;45559:52;;;::::0;;-1:-1:-1;;;45559:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;45559:52:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;45641:33:0;;::::1;43359:42;45641:33:::0;;::::1;::::0;45700:31;::::1;;45641:33:::0;45754:28:::1;;45773:9;45754:28;;;45766:4;45754:28;45742:40;;45803:7;:24;;45820:7;45803:24;;;45813:4;45803:24;45793:34;;45904:9;45900:275;;;45952:9;45938:10;:23;;45930:65;;;::::0;;-1:-1:-1;;;45930:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;46016:4;-1:-1:-1::0;;;;;46010:19:0::1;;46037:9;46010:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;45900:275;;;46082:81;46114:9;46125:10;46145:4;46152:10;46082:31;:81::i;:::-;46271:7;::::0;46225:67:::1;::::0;46252:9;;-1:-1:-1;;;;;46271:7:0::1;46281:10:::0;46225:26:::1;:67::i;:::-;46320:10;::::0;-1:-1:-1;;;;;46307:23:0;;::::1;46320:10:::0;::::1;46307:23;46303:764;;;46411:78;46433:7;46442;46451:10;46463:11;46476:2;46480:8;46411:21;:78::i;:::-;46396:93;;46303:764;;;46522:10;::::0;-1:-1:-1;;;;;46511:21:0;;::::1;46522:10:::0;::::1;46511:21;46507:560;;;46613:7;::::0;:66:::1;::::0;;-1:-1:-1;;;46613:66:0;;-1:-1:-1;;;;;46613:66:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;:7;;;::::1;::::0;:16:::1;::::0;:66;;;;;::::1;::::0;;;;;;;;:7:::1;::::0;:66;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;46613:66:0;;-1:-1:-1;46507:560:0::1;;;46795:7;::::0;:67:::1;::::0;;-1:-1:-1;;;46795:67:0;;-1:-1:-1;;;;;46795:67:0;;::::1;;::::0;::::1;::::0;;;;;;;46773:19:::1;46795:67:::0;;;;;;46846:4:::1;46795:67:::0;;;;;;::::1;::::0;;;;;;46773:19;;46795:7:::1;::::0;:16:::1;::::0;:67;;;;;::::1;::::0;;;;;;;;;46773:19;46795:7;:67;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;46795:67:0;46904:10:::1;::::0;46924:7:::1;::::0;46795:67;;-1:-1:-1;46877:69:0::1;::::0;-1:-1:-1;;;;;46904:10:0;;::::1;::::0;46924:7:::1;46795:67:::0;46877:26:::1;:69::i;:::-;46976:79;46998:7;47007;47016:11;47029;47042:2;47046:8;46976:21;:79::i;:::-;46961:94;;46507:560;;47367:2;-1:-1:-1::0;;;;;47117:286:0::1;47235:7;:40;;47268:7;47235:40;;;43359:42;47235:40;-1:-1:-1::0;;;;;47117:286:0::1;47176:9;:44;;47211:9;47176:44;;;43359:42;47176:44;-1:-1:-1::0;;;;;47117:286:0::1;-1:-1:-1::0;;;;;;;;;;;47145:16:0::1;47290:10;47315:12;47342:10;47384:8;47117:286;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;47117:286:0;;;;;;;;-1:-1:-1;;;;;47117:286:0;;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;-1:-1:-1;47117:286:0::1;-1:-1:-1::0;;24031:1:0;24993:22;;45138:2273;;-1:-1:-1;;;;;;45138:2273:0:o;13131:87::-;13177:7;13204:6;-1:-1:-1;;;;;13204:6:0;13131:87;:::o;53987:215::-;24075:1;24681:7;;:19;;24673:63;;;;;-1:-1:-1;;;24673:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24673:63:0;;;;;;;;;;;;;;;24075:1;24814:7;:18;13362:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;13351:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;13351:23:0::1;;13343:68;;;::::0;;-1:-1:-1;;;13343:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;13343:68:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;54096:20:0;::::2;54088:60;;;::::0;;-1:-1:-1;;;54088:60:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;54159:21:0;;;::::2;;::::0;;;:13:::2;:21;::::0;;;;:35;;-1:-1:-1;;54159:35:0::2;::::0;::::2;;::::0;;;::::2;::::0;;-1:-1:-1;24993:22:0;;53987:215::o;43621:30::-;;;-1:-1:-1;;;;;43621:30:0;;:::o;43574:38::-;;;:::o;44227:869::-;44368:16;-1:-1:-1;;;;;44405:23:0;;44397:66;;;;;-1:-1:-1;;;44397:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44482:21:0;;44474:62;;;;;-1:-1:-1;;;44474:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44560:33:0;;43359:42;44560:33;44559:54;;44604:9;44559:54;;;44597:4;44559:54;44547:66;-1:-1:-1;;;;;;44635:31:0;;43359:42;44635:31;44634:50;;44677:7;44634:50;;;44670:4;44634:50;44712:10;;44624:60;;-1:-1:-1;;;;;;44699:23:0;;;44712:10;;44699:23;44695:394;;;44750:7;;:43;;;-1:-1:-1;;;44750:43:0;;-1:-1:-1;;;;;44750:43:0;;;;;;;;;;;;;;;:7;;;;;:22;;:43;;;;;;;;;;;;;;:7;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44750:43:0;;-1:-1:-1;44695:394:0;;;44826:10;;-1:-1:-1;;;;;44815:21:0;;;44826:10;;44815:21;44811:278;;;44864:7;;:44;;;-1:-1:-1;;;44864:44:0;;-1:-1:-1;;;;;44864:44:0;;;;;;;;;;;;;;;:7;;;;;:21;;:44;;;;;;;;;;;;;;:7;:44;;;;;;;;;;44811:278;44963:7;;:44;;;-1:-1:-1;;;44963:44:0;;-1:-1:-1;;;;;44963:44:0;;;;;;;;;;;;;;;44941:19;;44963:7;;;;;:21;;:44;;;;;;;;;;;;;;;:7;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44963:44:0;45033:7;;:44;;;-1:-1:-1;;;45033:44:0;;-1:-1:-1;;;;;45033:44:0;;;;;;;;;;;;;;;44963;;-1:-1:-1;45033:7:0;;;:22;;:44;;;;;44963;;45033;;;;;;;;:7;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45033:44:0;;-1:-1:-1;;44811:278:0;44227:869;;;;;:::o;14085:244::-;13362:12;:10;:12::i;:::-;-1:-1:-1;;;;;13351:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;13351:23:0;;13343:68;;;;;-1:-1:-1;;;13343:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;13343:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;14174:22:0;::::1;14166:73;;;;-1:-1:-1::0;;;14166:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14276:6;::::0;;14255:38:::1;::::0;-1:-1:-1;;;;;14255:38:0;;::::1;::::0;14276:6;::::1;::::0;14255:38:::1;::::0;::::1;14304:6;:17:::0;;-1:-1:-1;;;;;;14304:17:0::1;-1:-1:-1::0;;;;;14304:17:0;;;::::1;::::0;;;::::1;::::0;;14085:244::o;51867:879::-;52062:22;24075:1;24681:7;;:19;;24673:63;;;;;-1:-1:-1;;;24673:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24673:63:0;;;;;;;;;;;;;;;24075:1;24814:7;:18;-1:-1:-1;;;;;52105:23:0;::::1;52097:66;;;::::0;;-1:-1:-1;;;52097:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;52097:66:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;52182:16:0;::::1;52174:52;;;::::0;;-1:-1:-1;;;52174:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;52174:52:0;;;;;;;;;;;;;::::1;;52269:10;::::0;52237:83:::1;::::0;-1:-1:-1;;;;;52269:10:0::1;52281;52301:4;52308:11:::0;52237:31:::1;:83::i;:::-;52358:10;::::0;52378:7:::1;::::0;52331:69:::1;::::0;-1:-1:-1;;;;;52358:10:0;;::::1;::::0;52378:7:::1;52388:11:::0;52331:26:::1;:69::i;:::-;52428:7;::::0;:70:::1;::::0;;-1:-1:-1;;;52428:70:0;;-1:-1:-1;;;;;52428:70:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;:7;;;::::1;::::0;:17:::1;::::0;:70;;;;;::::1;::::0;;;;;;;;:7:::1;::::0;:70;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52428:70:0;52573:10:::1;::::0;52514:224:::1;::::0;52428:70;;-1:-1:-1;;;;;;52514:224:0;;::::1;::::0;;;::::1;::::0;52573:10;;::::1;::::0;-1:-1:-1;;;;;;;;;;;52514:224:0;52573:10:::1;::::0;52622:11;;52428:70;;52677:10:::1;::::0;52719:8;;52514:224;52573:10;52514:224:::1;::::0;11689:106;11777:10;11689:106;:::o;40641:217::-;40754:12;;;40714;40754;;;;;;;;;-1:-1:-1;;;;;40732:7:0;;;40747:5;;40732:35;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40732:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40713:54;;;40786:7;40778:72;;;;-1:-1:-1;;;40778:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40641:217;;;:::o;56223:186::-;56300:7;-1:-1:-1;;;;;56327:29:0;;43359:42;56327:29;:74;;56380:5;-1:-1:-1;;;;;56373:23:0;;56397:3;56373:28;;;;;;;;;;;;;-1:-1:-1;;;;;56373:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56373:28:0;56327:74;;;-1:-1:-1;;;;;;56359:11:0;;;56320:81;-1:-1:-1;56223:186:0:o;54945:884::-;-1:-1:-1;;;;;55158:28:0;;;;;;:13;:28;;;;;;;;55150:78;;;;-1:-1:-1;;;55150:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55247:25:0;;;;;;:13;:25;;;;;;;;55239:72;;;;-1:-1:-1;;;55239:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55328:33:0;;43359:42;55328:33;55324:324;;55378:81;55410:9;55421:10;55441:4;55448:10;55378:31;:81::i;:::-;55474:64;55501:9;55512:13;55527:10;55474:26;:64::i;:::-;55324:324;;;55593:9;55579:10;:23;;55571:65;;;;;-1:-1:-1;;;55571:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55661:12;-1:-1:-1;;;;;55679:15:0;;;;55702:33;;43359:42;55702:33;:50;;55751:1;55702:50;;;55738:10;55702:50;55754:4;;55679:80;;;;;;;;;;;;;;-1:-1:-1;55679:80:0;;-1:-1:-1;55679:80:0;;-1:-1:-1;;55679:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55660:99;;;55778:7;55770:51;;;;;-1:-1:-1;;;55770:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54945:884;;;;;;;:::o;28266:158::-;28324:7;28357:1;28352;:6;;28344:49;;;;;-1:-1:-1;;;28344:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28411:5:0;;;28266:158::o;55837:378::-;55971:10;;55967:241;;-1:-1:-1;;;;;56002:29:0;;43359:42;56002:29;55998:199;;;56052:42;56083:2;56087:6;56052:30;:42::i;:::-;55998:199;;;56135:46;56163:5;56170:2;56174:6;56135:27;:46::i;40135:498::-;40406:51;;;-1:-1:-1;;;;;40406:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40406:51:0;-1:-1:-1;;;40406:51:0;;;40395:63;;;;40360:12;;40374:17;;40395:10;;;;40406:51;40395:63;;;40406:51;40395:63;;40406:51;40395:63;;;;;;;;;;-1:-1:-1;;40395:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40359:99;;;;40491:7;:57;;;;-1:-1:-1;40503:11:0;;:16;;:44;;;40534:4;40523:24;;;;;;;;;;;;;;;-1:-1:-1;40523:24:0;40503:44;40469:156;;;;-1:-1:-1;;;40469:156:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40135:498;;;;;;:::o;39225:445::-;39455:45;;;-1:-1:-1;;;;;39455:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39455:45:0;-1:-1:-1;;;39455:45:0;;;39444:57;;;;39409:12;;39423:17;;39444:10;;;;39455:45;39444:57;;;39455:45;39444:57;;39455:45;39444:57;;;;;;;;;;-1:-1:-1;;39444:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39408:93;;;;39534:7;:57;;;;-1:-1:-1;39546:11:0;;:16;;:44;;;39577:4;39566:24;;;;;;;;;;;;;;;-1:-1:-1;39566:24:0;39546:44;39512:150;;;;-1:-1:-1;;;39512:150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39225:445;;;;;:::o;39678:449::-;39910:45;;;-1:-1:-1;;;;;39910:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39910:45:0;-1:-1:-1;;;39910:45:0;;;39899:57;;;;39864:12;;39878:17;;39899:10;;;;39910:45;39899:57;;;39910:45;39899:57;;39910:45;39899:57;;;;;;;;;;-1:-1:-1;;39899:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39863:93;;;;39989:7;:57;;;;-1:-1:-1;40001:11:0;;:16;;:44;;;40032:4;40021:24;;;;;;;;;;;;;;;-1:-1:-1;40021:24:0;40001:44;39967:152;;;;-1:-1:-1;;;39967:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54252:685;54472:20;54509:7;54505:425;;;54548:7;;:77;;;-1:-1:-1;;;54548:77:0;;-1:-1:-1;;;;;54548:77:0;;;;;;;;;;;;;;;;;;;54609:4;54548:77;;;;;;;;;;;;;:7;;;;;:17;;:77;;;;;;;;;;;;;;:7;;:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54548:77:0;54640:34;;;-1:-1:-1;;;54640:34:0;;;;;;;;;;54548:77;;-1:-1:-1;;;;;;54646:4:0;54640:20;;;;:34;;;;;-1:-1:-1;;54640:34:0;;;;;;;;-1:-1:-1;54640:20:0;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;54697:16:0;;54689:52;;;;;-1:-1:-1;;;54689:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54756:48;54787:2;54791:12;54756:30;:48::i;:::-;54505:425;;;54852:7;;:66;;;-1:-1:-1;;;54852:66:0;;-1:-1:-1;;;;;54852:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;;;;;:17;;:66;;;;;;;;;;;;;;:7;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54852:66:0;;-1:-1:-1;54505:425:0;54252:685;;;;;;;;:::o
Swarm Source
ipfs://14d5ed1ec42ccd63157ae58d3a23ae6a4ca4a578de09763c9c250d762392802f
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.