Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 23 from a total of 23 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Migrate Lp To Dm... | 12836140 | 1229 days ago | IN | 0 ETH | 0.00047509 | ||||
Migrate Lp To Dm... | 12740205 | 1244 days ago | IN | 0 ETH | 0.06574037 | ||||
Migrate Lp To Dm... | 12630596 | 1261 days ago | IN | 0 ETH | 0.00331084 | ||||
Migrate Lp To Dm... | 12522651 | 1278 days ago | IN | 0 ETH | 0.00690349 | ||||
Migrate Lp To Dm... | 12522549 | 1278 days ago | IN | 0 ETH | 0.00715557 | ||||
Migrate Lp To Dm... | 12477099 | 1285 days ago | IN | 0 ETH | 0.01249492 | ||||
Migrate Lp To Dm... | 12474308 | 1285 days ago | IN | 0 ETH | 0.00198425 | ||||
Migrate Lp To Dm... | 12401919 | 1297 days ago | IN | 0 ETH | 0.02278304 | ||||
Migrate Lp To Dm... | 12390308 | 1298 days ago | IN | 0 ETH | 0.0124056 | ||||
Migrate Lp To Dm... | 12390257 | 1298 days ago | IN | 0 ETH | 0.00109854 | ||||
Migrate Lp To Dm... | 12390037 | 1298 days ago | IN | 0 ETH | 0.01153354 | ||||
Migrate Lp To Dm... | 12389360 | 1299 days ago | IN | 0 ETH | 0.01633327 | ||||
Migrate Lp To Dm... | 12388819 | 1299 days ago | IN | 0 ETH | 0.0016454 | ||||
Migrate Lp To Dm... | 12387680 | 1299 days ago | IN | 0 ETH | 0.02206671 | ||||
Migrate Lp To Dm... | 12386274 | 1299 days ago | IN | 0 ETH | 0.00125013 | ||||
Migrate Lp To Dm... | 12386095 | 1299 days ago | IN | 0 ETH | 0.01436935 | ||||
Migrate Lp To Dm... | 12385772 | 1299 days ago | IN | 0 ETH | 0.01288818 | ||||
Migrate Lp To Dm... | 12385343 | 1299 days ago | IN | 0 ETH | 0.00822478 | ||||
Migrate Lp To Dm... | 12385025 | 1299 days ago | IN | 0 ETH | 0.01021938 | ||||
Migrate Lp To Dm... | 12384469 | 1299 days ago | IN | 0 ETH | 0.01286791 | ||||
Migrate Lp To Dm... | 12384290 | 1299 days ago | IN | 0 ETH | 0.01349289 | ||||
Migrate Lp To Dm... | 12383849 | 1299 days ago | IN | 0 ETH | 0.01865966 | ||||
0x60a06040 | 12322058 | 1309 days ago | IN | 0 ETH | 0.0943453 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
LiquidityMigrator2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-04-27 */ // SPDX-License-Identifier: BUSL-1.1 // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @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/math/Math.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol pragma solidity >=0.6.0 <0.8.0; /** * @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/token/ERC20/IERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @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/token/ERC20/SafeERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @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: @openzeppelin/contracts/utils/Context.sol pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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/Ownable.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () 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: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File: contracts/interfaces/IDMMLiquidityRouter.sol pragma solidity 0.6.12; /// @dev an simple interface for integration dApp to contribute liquidity interface IDMMLiquidityRouter { /** * @param tokenA address of token in the pool * @param tokenB address of token in the pool * @param pool the address of the pool * @param amountADesired the amount of tokenA users want to add to the pool * @param amountBDesired the amount of tokenB users want to add to the pool * @param amountAMin bounds to the extents to which amountB/amountA can go up * @param amountBMin bounds to the extents to which amountB/amountA can go down * @param vReserveRatioBounds bounds to the extents to which vReserveB/vReserveA can go (precision: 2 ** 112) * @param to Recipient of the liquidity tokens. * @param deadline Unix timestamp after which the transaction will revert. */ function addLiquidity( IERC20 tokenA, IERC20 tokenB, address pool, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, uint256[2] calldata vReserveRatioBounds, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityNewPool( IERC20 tokenA, IERC20 tokenB, uint32 ampBps, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityNewPoolETH( IERC20 token, uint32 ampBps, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); /** * @param token address of token in the pool * @param pool the address of the pool * @param amountTokenDesired the amount of token users want to add to the pool * @dev msg.value equals to amountEthDesired * @param amountTokenMin bounds to the extents to which WETH/token can go up * @param amountETHMin bounds to the extents to which WETH/token can go down * @param vReserveRatioBounds bounds to the extents to which vReserveB/vReserveA can go (precision: 2 ** 112) * @param to Recipient of the liquidity tokens. * @param deadline Unix timestamp after which the transaction will revert. */ function addLiquidityETH( IERC20 token, address pool, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, uint256[2] calldata vReserveRatioBounds, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); /** * @param tokenA address of token in the pool * @param tokenB address of token in the pool * @param pool the address of the pool * @param liquidity the amount of lp token users want to burn * @param amountAMin the minimum token retuned after burning * @param amountBMin the minimum token retuned after burning * @param to Recipient of the returned tokens. * @param deadline Unix timestamp after which the transaction will revert. */ function removeLiquidity( IERC20 tokenA, IERC20 tokenB, address pool, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); /** * @param tokenA address of token in the pool * @param tokenB address of token in the pool * @param pool the address of the pool * @param liquidity the amount of lp token users want to burn * @param amountAMin the minimum token retuned after burning * @param amountBMin the minimum token retuned after burning * @param to Recipient of the returned tokens. * @param deadline Unix timestamp after which the transaction will revert. * @param approveMax whether users permit the router spending max lp token or not. * @param r s v Signature of user to permit the router spending lp token */ function removeLiquidityWithPermit( IERC20 tokenA, IERC20 tokenB, address pool, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); /** * @param token address of token in the pool * @param pool the address of the pool * @param liquidity the amount of lp token users want to burn * @param amountTokenMin the minimum token retuned after burning * @param amountETHMin the minimum eth in wei retuned after burning * @param to Recipient of the returned tokens. * @param deadline Unix timestamp after which the transaction will revert */ function removeLiquidityETH( IERC20 token, address pool, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); /** * @param token address of token in the pool * @param pool the address of the pool * @param liquidity the amount of lp token users want to burn * @param amountTokenMin the minimum token retuned after burning * @param amountETHMin the minimum eth in wei retuned after burning * @param to Recipient of the returned tokens. * @param deadline Unix timestamp after which the transaction will revert * @param approveMax whether users permit the router spending max lp token * @param r s v signatures of user to permit the router spending lp token. */ function removeLiquidityETHWithPermit( IERC20 token, address pool, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); /** * @param amountA amount of 1 side token added to the pool * @param reserveA current reserve of the pool * @param reserveB current reserve of the pool * @return amountB amount of the other token added to the pool */ function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); } // File: contracts/interfaces/IERC20Permit.sol pragma solidity 0.6.12; interface IERC20Permit is IERC20 { function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } // File: contracts/wrapper/LiquidityMigrator.sol pragma solidity 0.6.12; pragma experimental ABIEncoderV2; interface ILiquidityMigrator { struct PermitData { bool approveMax; uint8 v; bytes32 r; bytes32 s; } struct PoolInfo { address poolAddress; uint32 poolAmp; uint256[2] dmmVReserveRatioBounds; } event RemoveLiquidity( address indexed tokenA, address indexed tokenB, address indexed uniPair, uint256 liquidity, uint256 amountA, uint256 amountB ); event Migrated( address indexed tokenA, address indexed tokenB, uint256 dmmAmountA, uint256 dmmAmountB, uint256 dmmLiquidity, PoolInfo info ); /** * @dev Migrate tokens from a pair to a Kyber Dmm Pool * Supporting both normal tokens and tokens with fee on transfer * Support create new pool with received tokens from removing, or * add tokens to a given pool address * @param uniPair pair for token that user wants to migrate from * it should be compatible with UniswapPair's interface * @param tokenA first token of the pool * @param tokenB second token of the pool * @param liquidity amount of LP tokens to migrate * @param amountAMin min amount for tokenA when removing * @param amountBMin min amount for tokenB when removing * @param dmmAmountAMin min amount for tokenA when adding * @param dmmAmountBMin min amount for tokenB when adding * @param poolInfo info the the Kyber DMM Pool - (poolAddress, poolAmp) * if poolAddress is 0x0 -> create new pool with amp factor of poolAmp * otherwise add liquidity to poolAddress * @param deadline only allow transaction to be executed before the deadline */ function migrateLpToDmmPool( address uniPair, address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, uint256 dmmAmountAMin, uint256 dmmAmountBMin, PoolInfo calldata poolInfo, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 addedLiquidity ); /** * @dev Migrate tokens from a pair to a Kyber Dmm Pool with permit * User doesn't have to make an approve allowance transaction, just need to sign the data * Supporting both normal tokens and tokens with fee on transfer * Support create new pool with received tokens from removing, or * add tokens to a given pool address * @param uniPair pair for token that user wants to migrate from * it should be compatible with UniswapPair's interface * @param tokenA first token of the pool * @param tokenB second token of the pool * @param liquidity amount of LP tokens to migrate * @param amountAMin min amount for tokenA when removing * @param amountBMin min amount for tokenB when removing * @param dmmAmountAMin min amount for tokenA when adding * @param dmmAmountBMin min amount for tokenB when adding * @param poolInfo info the the Kyber DMM Pool - (poolAddress, poolAmp) * if poolAddress is 0x0 -> create new pool with amp factor of poolAmp * otherwise add liquidity to poolAddress * @param deadline only allow transaction to be executed before the deadline * @param permitData data of approve allowance */ function migrateLpToDmmPoolWithPermit( address uniPair, address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, uint256 dmmAmountAMin, uint256 dmmAmountBMin, PoolInfo calldata poolInfo, uint256 deadline, PermitData calldata permitData ) external returns ( uint256 amountA, uint256 amountB, uint256 addedLiquidity ); } /** * @dev Liquidity Migrator contract to help migrating liquidity * from other sources to Kyber DMM Pool */ contract LiquidityMigrator2 is ILiquidityMigrator, Ownable { using SafeERC20 for IERC20; using SafeMath for uint256; address public immutable dmmRouter; constructor(address _dmmRouter) public { require(_dmmRouter != address(0), "Migrator: INVALID_ROUTER"); dmmRouter = _dmmRouter; } /** * @dev Use only for some special tokens */ function manualApproveAllowance( IERC20[] calldata tokens, address[] calldata spenders, uint256 allowance ) external onlyOwner { for (uint256 i = 0; i < tokens.length; i++) { for (uint256 j = 0; j < spenders.length; j++) { tokens[i].safeApprove(spenders[j], allowance); } } } /** * @dev Migrate tokens from a pair to a Kyber Dmm Pool * Supporting both normal tokens and tokens with fee on transfer * Support create new pool with received tokens from removing, or * add tokens to a given pool address * @param uniPair pair for token that user wants to migrate from * it should be compatible with UniswapPair's interface * @param tokenA first token of the pool * @param tokenB second token of the pool * @param liquidity amount of LP tokens to migrate * @param amountAMin min amount for tokenA when removing/adding * @param amountBMin min amount for tokenB when removing/adding * @param poolInfo info the the Kyber DMM Pool - (poolAddress, poolAmp) * if poolAddress is 0x0 -> create new pool with amp factor of poolAmp * otherwise add liquidity to poolAddress * @param deadline only allow transaction to be executed before the deadline * @param permitData data of approve allowance */ function migrateLpToDmmPoolWithPermit( address uniPair, address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, uint256 dmmAmountAMin, uint256 dmmAmountBMin, PoolInfo calldata poolInfo, uint256 deadline, PermitData calldata permitData ) external override returns ( uint256 amountA, uint256 amountB, uint256 addedLiquidity ) { IERC20Permit(uniPair).permit( msg.sender, address(this), permitData.approveMax ? uint256(-1) : liquidity, deadline, permitData.v, permitData.r, permitData.s ); (amountA, amountB, addedLiquidity) = migrateLpToDmmPool( uniPair, tokenA, tokenB, liquidity, amountAMin, amountBMin, dmmAmountAMin, dmmAmountBMin, poolInfo, deadline ); } /** * @dev Migrate tokens from a pair to a Kyber Dmm Pool with permit * User doesn't have to make an approve allowance transaction, just need to sign the data * Supporting both normal tokens and tokens with fee on transfer * Support create new pool with received tokens from removing, or * add tokens to a given pool address * @param uniPair pair for token that user wants to migrate from * it should be compatible with UniswapPair's interface * @param tokenA first token of the pool * @param tokenB second token of the pool * @param liquidity amount of LP tokens to migrate * @param amountAMin min amount for tokenA when removing/adding * @param amountBMin min amount for tokenB when removing/adding * @param poolInfo info the the Kyber DMM Pool - (poolAddress, poolAmp) * if poolAddress is 0x0 -> create new pool with amp factor of poolAmp * otherwise add liquidity to poolAddress * @param deadline only allow transaction to be executed before the deadline */ function migrateLpToDmmPool( address uniPair, address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, uint256 dmmAmountAMin, uint256 dmmAmountBMin, PoolInfo memory poolInfo, uint256 deadline ) public override returns ( uint256 dmmAmountA, uint256 dmmAmountB, uint256 dmmLiquidity ) { // support for both normal token and token with fee on transfer { uint256 balanceTokenA = IERC20(tokenA).balanceOf(address(this)); uint256 balanceTokenB = IERC20(tokenB).balanceOf(address(this)); _removeUniLiquidity( uniPair, tokenA, tokenB, liquidity, amountAMin, amountBMin, deadline ); dmmAmountA = IERC20(tokenA).balanceOf(address(this)).sub(balanceTokenA); dmmAmountB = IERC20(tokenB).balanceOf(address(this)).sub(balanceTokenB); require(dmmAmountA > 0 && dmmAmountB > 0, "Migrator: INVALID_AMOUNT"); emit RemoveLiquidity(tokenA, tokenB, uniPair, liquidity, dmmAmountA, dmmAmountB); } (dmmAmountA, dmmAmountB, dmmLiquidity) = _addLiquidityToDmmPool( tokenA, tokenB, dmmAmountA, dmmAmountB, dmmAmountAMin, dmmAmountBMin, poolInfo, deadline ); emit Migrated(tokenA, tokenB, dmmAmountA, dmmAmountB, dmmLiquidity, poolInfo); } /** @dev Allow the Owner to withdraw any funds that have been 'wrongly' * transferred to the migrator contract */ function withdrawFund(IERC20 token, uint256 amount) external onlyOwner { if (token == IERC20(0)) { (bool success, ) = owner().call{value: amount}(""); require(success, "Migrator: TRANSFER_ETH_FAILED"); } else { token.safeTransfer(owner(), amount); } } /** * @dev Add liquidity to Kyber dmm pool, support adding to new pool or an existing pool */ function _addLiquidityToDmmPool( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, PoolInfo memory poolInfo, uint256 deadline ) internal returns ( uint256 amountA, uint256 amountB, uint256 liquidity ) { // safe approve only if needed _safeApproveAllowance(IERC20(tokenA), address(dmmRouter)); _safeApproveAllowance(IERC20(tokenB), address(dmmRouter)); if (poolInfo.poolAddress == address(0)) { // add to new pool (amountA, amountB, liquidity) = _addLiquidityNewPool( tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin, poolInfo.poolAmp, deadline ); } else { (amountA, amountB, liquidity) = _addLiquidityExistingPool( tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin, poolInfo.poolAddress, poolInfo.dmmVReserveRatioBounds, deadline ); } } /** * @dev Add liquidity to an existing pool, and return back tokens to users if any */ function _addLiquidityExistingPool( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address dmmPool, uint256[2] memory vReserveRatioBounds, uint256 deadline ) internal returns ( uint256 amountA, uint256 amountB, uint256 liquidity ) { (amountA, amountB, liquidity) = IDMMLiquidityRouter(dmmRouter).addLiquidity( IERC20(tokenA), IERC20(tokenB), dmmPool, amountADesired, amountBDesired, amountAMin, amountBMin, vReserveRatioBounds, msg.sender, deadline ); // return back token if needed if (amountA < amountADesired) { IERC20(tokenA).safeTransfer(msg.sender, amountADesired - amountA); } if (amountB < amountBDesired) { IERC20(tokenB).safeTransfer(msg.sender, amountBDesired - amountB); } } /** * @dev Add liquidity to a new pool, and return back tokens to users if any */ function _addLiquidityNewPool( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, uint32 amps, uint256 deadline ) internal returns ( uint256 amountA, uint256 amountB, uint256 liquidity ) { (amountA, amountB, liquidity) = IDMMLiquidityRouter(dmmRouter).addLiquidityNewPool( IERC20(tokenA), IERC20(tokenB), amps, amountADesired, amountBDesired, amountAMin, amountBMin, msg.sender, deadline ); // return back token if needed if (amountA < amountADesired) { IERC20(tokenA).safeTransfer(msg.sender, amountADesired - amountA); } if (amountB < amountBDesired) { IERC20(tokenB).safeTransfer(msg.sender, amountBDesired - amountB); } } /** * @dev Re-write remove liquidity function from Uniswap */ function _removeUniLiquidity( address pair, address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, uint256 deadline ) internal { require(deadline >= block.timestamp, "Migratior: EXPIRED"); IERC20(pair).safeTransferFrom(msg.sender, pair, liquidity); // send liquidity to pair (uint256 amount0, uint256 amount1) = IUniswapV2Pair(pair).burn(address(this)); (address token0, ) = _sortTokens(tokenA, tokenB); (uint256 amountA, uint256 amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require(amountA >= amountAMin, "Migratior: UNI_INSUFFICIENT_A_AMOUNT"); require(amountB >= amountBMin, "Migratior: UNI_INSUFFICIENT_B_AMOUNT"); } /** * @dev only approve if the current allowance is 0 */ function _safeApproveAllowance(IERC20 token, address spender) internal { if (token.allowance(address(this), spender) == 0) { token.safeApprove(spender, uint256(-1)); } } /** * @dev Copy logic of sort token from Uniswap lib */ function _sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) { require(tokenA != tokenB, "Migrator: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "Migrator: ZERO_ADDRESS"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_dmmRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenA","type":"address"},{"indexed":true,"internalType":"address","name":"tokenB","type":"address"},{"indexed":false,"internalType":"uint256","name":"dmmAmountA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dmmAmountB","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dmmLiquidity","type":"uint256"},{"components":[{"internalType":"address","name":"poolAddress","type":"address"},{"internalType":"uint32","name":"poolAmp","type":"uint32"},{"internalType":"uint256[2]","name":"dmmVReserveRatioBounds","type":"uint256[2]"}],"indexed":false,"internalType":"struct ILiquidityMigrator.PoolInfo","name":"info","type":"tuple"}],"name":"Migrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenA","type":"address"},{"indexed":true,"internalType":"address","name":"tokenB","type":"address"},{"indexed":true,"internalType":"address","name":"uniPair","type":"address"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountB","type":"uint256"}],"name":"RemoveLiquidity","type":"event"},{"inputs":[],"name":"dmmRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"address[]","name":"spenders","type":"address[]"},{"internalType":"uint256","name":"allowance","type":"uint256"}],"name":"manualApproveAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"uniPair","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"uint256","name":"dmmAmountAMin","type":"uint256"},{"internalType":"uint256","name":"dmmAmountBMin","type":"uint256"},{"components":[{"internalType":"address","name":"poolAddress","type":"address"},{"internalType":"uint32","name":"poolAmp","type":"uint32"},{"internalType":"uint256[2]","name":"dmmVReserveRatioBounds","type":"uint256[2]"}],"internalType":"struct ILiquidityMigrator.PoolInfo","name":"poolInfo","type":"tuple"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"migrateLpToDmmPool","outputs":[{"internalType":"uint256","name":"dmmAmountA","type":"uint256"},{"internalType":"uint256","name":"dmmAmountB","type":"uint256"},{"internalType":"uint256","name":"dmmLiquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"uniPair","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"uint256","name":"dmmAmountAMin","type":"uint256"},{"internalType":"uint256","name":"dmmAmountBMin","type":"uint256"},{"components":[{"internalType":"address","name":"poolAddress","type":"address"},{"internalType":"uint32","name":"poolAmp","type":"uint32"},{"internalType":"uint256[2]","name":"dmmVReserveRatioBounds","type":"uint256[2]"}],"internalType":"struct ILiquidityMigrator.PoolInfo","name":"poolInfo","type":"tuple"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"components":[{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ILiquidityMigrator.PermitData","name":"permitData","type":"tuple"}],"name":"migrateLpToDmmPoolWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"addedLiquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFund","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5060405162002245380380620022458339810160408190526200003491620000d6565b600062000040620000d2565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b038116620000bc5760405162461bcd60e51b8152600401620000b39062000106565b60405180910390fd5b60601b6001600160601b0319166080526200013d565b3390565b600060208284031215620000e8578081fd5b81516001600160a01b0381168114620000ff578182fd5b9392505050565b60208082526018908201527f4d69677261746f723a20494e56414c49445f524f555445520000000000000000604082015260600190565b60805160601c6120d66200016f600039806102365280610e195280610e4352806111bd52806112da52506120d66000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063715018a61161005b578063715018a6146100f55780638da5cb5b146100fd578063f2fde38b14610105578063f7c8d2211461011857610088565b806318c091641461008d57806319ca9178146100b85780633904a5ef146100cd5780633eb5e1a1146100e2575b600080fd5b6100a061009b366004611697565b61012b565b6040516100af93929190611f87565b60405180910390f35b6100c0610234565b6040516100af9190611990565b6100e06100db3660046117d6565b610258565b005b6100a06100f0366004611740565b610366565b6100e06106c6565b6100c06107a8565b6100e061011336600461167b565b6107c4565b6100e061012636600461187f565b610911565b6000808073ffffffffffffffffffffffffffffffffffffffff8e1663d505accf333061015a6020890189611847565b610164578e610186565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b8961019760408b0160208c0161192d565b8a604001358b606001356040518863ffffffff1660e01b81526004016101c397969594939291906119b1565b600060405180830381600087803b1580156101dd57600080fd5b505af11580156101f1573d6000803e3d6000fd5b505050506102178e8e8e8e8e8e8e8e8e80360381019061021191906118aa565b8e610366565b8093508194508295505050509b509b509b98505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610260610a7c565b73ffffffffffffffffffffffffffffffffffffffff1661027e6107a8565b73ffffffffffffffffffffffffffffffffffffffff16146102d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611d02565b60405180910390fd5b60005b8481101561035e5760005b838110156103555761034d8585838181106102f957fe5b905060200201602081019061030e919061167b565b8489898681811061031b57fe5b9050602002016020810190610330919061167b565b73ffffffffffffffffffffffffffffffffffffffff169190610a80565b6001016102e2565b506001016102d7565b505050505050565b6000806000808c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016103a59190611990565b60206040518083038186803b1580156103bd57600080fd5b505afa1580156103d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f591906118c5565b905060008c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104329190611990565b60206040518083038186803b15801561044a57600080fd5b505afa15801561045e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048291906118c5565b90506104938f8f8f8f8f8f8c610c0a565b610526828f73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104d09190611990565b60206040518083038186803b1580156104e857600080fd5b505afa1580156104fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052091906118c5565b90610dcc565b9450610565818e73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104d09190611990565b93506000851180156105775750600084115b6105ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611ccb565b8e73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff168f73ffffffffffffffffffffffffffffffffffffffff167f094577f52c15f75d98e8b7e35fd170e61ac73ad9fb3135eae6674b39828d4d6e8f898960405161062593929190611f87565b60405180910390a4505061063f8c8c85858b8b8b8b610e0e565b8093508194508295505050508a73ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f508a039123cf87508a308c557a86025dcb8b3fea3b682250339652536f1f2baa8585858a6040516106ae9493929190611f9d565b60405180910390a39a509a509a975050505050505050565b6106ce610a7c565b73ffffffffffffffffffffffffffffffffffffffff166106ec6107a8565b73ffffffffffffffffffffffffffffffffffffffff1614610739576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611d02565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6107cc610a7c565b73ffffffffffffffffffffffffffffffffffffffff166107ea6107a8565b73ffffffffffffffffffffffffffffffffffffffff1614610837576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611d02565b73ffffffffffffffffffffffffffffffffffffffff8116610884576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611ba3565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610919610a7c565b73ffffffffffffffffffffffffffffffffffffffff166109376107a8565b73ffffffffffffffffffffffffffffffffffffffff1614610984576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611d02565b73ffffffffffffffffffffffffffffffffffffffff8216610a4f5760006109a96107a8565b73ffffffffffffffffffffffffffffffffffffffff16826040516109cc9061198d565b60006040518083038185875af1925050503d8060008114610a09576040519150601f19603f3d011682016040523d82523d6000602084013e610a0e565b606091505b5050905080610a49576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611c94565b50610a78565b610a78610a5a6107a8565b73ffffffffffffffffffffffffffffffffffffffff84169083610ed2565b5050565b3390565b801580610b2e57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e90610adc90309086906004016119ff565b60206040518083038186803b158015610af457600080fd5b505afa158015610b08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2c91906118c5565b155b610b64576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611f2a565b610c058363095ea7b360e01b8484604051602401610b83929190611a57565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610ef1565b505050565b42811015610c44576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611ef3565b610c6673ffffffffffffffffffffffffffffffffffffffff8816338987610fa7565b6000808873ffffffffffffffffffffffffffffffffffffffff166389afcb44306040518263ffffffff1660e01b8152600401610ca29190611990565b6040805180830381600087803b158015610cbb57600080fd5b505af1158015610ccf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf391906118dd565b915091506000610d038989610fce565b5090506000808273ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614610d43578385610d46565b84845b9150915087821015610d84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611d6e565b86811015610dbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611e96565b505050505050505050505050565b600082821115610e08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611c00565b50900390565b6000806000610e3d8b7f00000000000000000000000000000000000000000000000000000000000000006110cd565b610e678a7f00000000000000000000000000000000000000000000000000000000000000006110cd565b845173ffffffffffffffffffffffffffffffffffffffff16610ea357610e978b8b8b8b8b8b8b602001518b6111b6565b91945092509050610ec4565b610ebc8b8b8b8b8b8b8b600001518c604001518c6112d3565b919450925090505b985098509895505050505050565b610c058363a9059cbb60e01b8484604051602401610b83929190611a57565b6060610f53826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166114019092919063ffffffff16565b805190915015610c055780806020019051810190610f719190611863565b610c05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611e39565b610fc8846323b872dd60e01b858585604051602401610b8393929190611a26565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611037576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611dcb565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610611071578284611074565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff82166110c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611d37565b9250929050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063dd62ed3e9061112190309085906004016119ff565b60206040518083038186803b15801561113957600080fd5b505afa15801561114d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117191906118c5565b610a7857610a7873ffffffffffffffffffffffffffffffffffffffff8316827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610a80565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631c5d0a6b8c8c888d8d8d8d338d6040518a63ffffffff1660e01b815260040161122499989796959493929190611af0565b606060405180830381600087803b15801561123e57600080fd5b505af1158015611252573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112769190611900565b91945092509050888310156112a8576112a873ffffffffffffffffffffffffffffffffffffffff8c1633858c03610ed2565b87821015610ec457610ec473ffffffffffffffffffffffffffffffffffffffff8b1633848b03610ed2565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663243419348d8d898e8e8e8e8d338e6040518b63ffffffff1660e01b81526004016113439a99989796959493929190611a7d565b606060405180830381600087803b15801561135d57600080fd5b505af1158015611371573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113959190611900565b91945092509050898310156113c7576113c773ffffffffffffffffffffffffffffffffffffffff8d1633858d03610ed2565b888210156113f2576113f273ffffffffffffffffffffffffffffffffffffffff8c1633848c03610ed2565b99509950999650505050505050565b6060611410848460008561141a565b90505b9392505050565b606082471015611456576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611c37565b61145f8561151c565b611495576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611e02565b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040516114bf9190611971565b60006040518083038185875af1925050503d80600081146114fc576040519150601f19603f3d011682016040523d82523d6000602084013e611501565b606091505b5091509150611511828286611522565b979650505050505050565b3b151590565b60608315611531575081611413565b8251156115415782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb9190611b52565b60008083601f840112611586578182fd5b50813567ffffffffffffffff81111561159d578182fd5b60208301915083602080830285010111156110c657600080fd5b6000608082840312156115c8578081fd5b50919050565b6000608082840312156115df578081fd5b6115e96060611ffd565b905081356115f68161206d565b815260208281013563ffffffff8116811461161057600080fd5b82820152605f8301841361162357600080fd5b600261163661163182612024565b611ffd565b80604086018760808801111561164b57600080fd5b60005b8481101561166a5781358452928501929085019060010161164e565b505060408501525091949350505050565b60006020828403121561168c578081fd5b81356114138161206d565b60008060008060008060008060008060006102208c8e0312156116b8578687fd5b8b356116c38161206d565b9a5060208c01356116d38161206d565b995060408c01356116e38161206d565b985060608c0135975060808c0135965060a08c0135955060c08c0135945060e08c013593506117168d6101008e016115b7565b92506101808c0135915061172e8d6101a08e016115b7565b90509295989b509295989b9093969950565b6000806000806000806000806000806101a08b8d03121561175f578586fd5b8a3561176a8161206d565b995060208b013561177a8161206d565b985060408b013561178a8161206d565b975060608b0135965060808b0135955060a08b0135945060c08b0135935060e08b013592506117bd8c6101008d016115ce565b91506101808b013590509295989b9194979a5092959850565b6000806000806000606086880312156117ed578081fd5b853567ffffffffffffffff80821115611804578283fd5b61181089838a01611575565b90975095506020880135915080821115611828578283fd5b5061183588828901611575565b96999598509660400135949350505050565b600060208284031215611858578081fd5b813561141381612092565b600060208284031215611874578081fd5b815161141381612092565b60008060408385031215611891578182fd5b823561189c8161206d565b946020939093013593505050565b6000608082840312156118bb578081fd5b61141383836115ce565b6000602082840312156118d6578081fd5b5051919050565b600080604083850312156118ef578182fd5b505080516020909101519092909150565b600080600060608486031215611914578081fd5b8351925060208401519150604084015190509250925092565b60006020828403121561193e578081fd5b813560ff81168114611413578182fd5b8060005b6002811015610fc8578151845260209384019390910190600101611952565b60008251611983818460208701612041565b9190910192915050565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff97881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60006101608201905073ffffffffffffffffffffffffffffffffffffffff808d168352808c166020840152808b1660408401528960608401528860808401528760a08401528660c0840152611ad560e084018761194e565b93909316610120820152610140015298975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff998a168152978916602089015263ffffffff9690961660408801526060870194909452608086019290925260a085015260c084015290921660e08201526101008101919091526101200190565b6000602082528251806020840152611b71816040850160208701612041565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60408201527f722063616c6c0000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f4d69677261746f723a205452414e534645525f4554485f4641494c4544000000604082015260600190565b60208082526018908201527f4d69677261746f723a20494e56414c49445f414d4f554e540000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526016908201527f4d69677261746f723a205a45524f5f4144445245535300000000000000000000604082015260600190565b60208082526024908201527f4d6967726174696f723a20554e495f494e53554646494349454e545f415f414d60408201527f4f554e5400000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f4d69677261746f723a204944454e544943414c5f414444524553534553000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f4d6967726174696f723a20554e495f494e53554646494349454e545f425f414d60408201527f4f554e5400000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f4d6967726174696f723a20455850495245440000000000000000000000000000604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b9283526020830191909152604082015260600190565b600060e08201905085825284602083015283604083015273ffffffffffffffffffffffffffffffffffffffff835116606083015263ffffffff60208401511660808301526040830151611ff360a084018261194e565b5095945050505050565b60405181810167ffffffffffffffff8111828210171561201c57600080fd5b604052919050565b600067ffffffffffffffff82111561203a578081fd5b5060200290565b60005b8381101561205c578181015183820152602001612044565b83811115610fc85750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461208f57600080fd5b50565b801515811461208f57600080fdfea2646970667358221220a7e7b9f751541322bc216d649eaac702de9e71ba126cb46110b1f5d42c4092d064736f6c634300060c00330000000000000000000000001c87257f5e8609940bc751a07bb085bb7f8cdbe6
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063715018a61161005b578063715018a6146100f55780638da5cb5b146100fd578063f2fde38b14610105578063f7c8d2211461011857610088565b806318c091641461008d57806319ca9178146100b85780633904a5ef146100cd5780633eb5e1a1146100e2575b600080fd5b6100a061009b366004611697565b61012b565b6040516100af93929190611f87565b60405180910390f35b6100c0610234565b6040516100af9190611990565b6100e06100db3660046117d6565b610258565b005b6100a06100f0366004611740565b610366565b6100e06106c6565b6100c06107a8565b6100e061011336600461167b565b6107c4565b6100e061012636600461187f565b610911565b6000808073ffffffffffffffffffffffffffffffffffffffff8e1663d505accf333061015a6020890189611847565b610164578e610186565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b8961019760408b0160208c0161192d565b8a604001358b606001356040518863ffffffff1660e01b81526004016101c397969594939291906119b1565b600060405180830381600087803b1580156101dd57600080fd5b505af11580156101f1573d6000803e3d6000fd5b505050506102178e8e8e8e8e8e8e8e8e80360381019061021191906118aa565b8e610366565b8093508194508295505050509b509b509b98505050505050505050565b7f0000000000000000000000001c87257f5e8609940bc751a07bb085bb7f8cdbe681565b610260610a7c565b73ffffffffffffffffffffffffffffffffffffffff1661027e6107a8565b73ffffffffffffffffffffffffffffffffffffffff16146102d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611d02565b60405180910390fd5b60005b8481101561035e5760005b838110156103555761034d8585838181106102f957fe5b905060200201602081019061030e919061167b565b8489898681811061031b57fe5b9050602002016020810190610330919061167b565b73ffffffffffffffffffffffffffffffffffffffff169190610a80565b6001016102e2565b506001016102d7565b505050505050565b6000806000808c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016103a59190611990565b60206040518083038186803b1580156103bd57600080fd5b505afa1580156103d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f591906118c5565b905060008c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104329190611990565b60206040518083038186803b15801561044a57600080fd5b505afa15801561045e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048291906118c5565b90506104938f8f8f8f8f8f8c610c0a565b610526828f73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104d09190611990565b60206040518083038186803b1580156104e857600080fd5b505afa1580156104fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052091906118c5565b90610dcc565b9450610565818e73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104d09190611990565b93506000851180156105775750600084115b6105ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611ccb565b8e73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff168f73ffffffffffffffffffffffffffffffffffffffff167f094577f52c15f75d98e8b7e35fd170e61ac73ad9fb3135eae6674b39828d4d6e8f898960405161062593929190611f87565b60405180910390a4505061063f8c8c85858b8b8b8b610e0e565b8093508194508295505050508a73ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f508a039123cf87508a308c557a86025dcb8b3fea3b682250339652536f1f2baa8585858a6040516106ae9493929190611f9d565b60405180910390a39a509a509a975050505050505050565b6106ce610a7c565b73ffffffffffffffffffffffffffffffffffffffff166106ec6107a8565b73ffffffffffffffffffffffffffffffffffffffff1614610739576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611d02565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6107cc610a7c565b73ffffffffffffffffffffffffffffffffffffffff166107ea6107a8565b73ffffffffffffffffffffffffffffffffffffffff1614610837576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611d02565b73ffffffffffffffffffffffffffffffffffffffff8116610884576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611ba3565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610919610a7c565b73ffffffffffffffffffffffffffffffffffffffff166109376107a8565b73ffffffffffffffffffffffffffffffffffffffff1614610984576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611d02565b73ffffffffffffffffffffffffffffffffffffffff8216610a4f5760006109a96107a8565b73ffffffffffffffffffffffffffffffffffffffff16826040516109cc9061198d565b60006040518083038185875af1925050503d8060008114610a09576040519150601f19603f3d011682016040523d82523d6000602084013e610a0e565b606091505b5050905080610a49576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611c94565b50610a78565b610a78610a5a6107a8565b73ffffffffffffffffffffffffffffffffffffffff84169083610ed2565b5050565b3390565b801580610b2e57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063dd62ed3e90610adc90309086906004016119ff565b60206040518083038186803b158015610af457600080fd5b505afa158015610b08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2c91906118c5565b155b610b64576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611f2a565b610c058363095ea7b360e01b8484604051602401610b83929190611a57565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610ef1565b505050565b42811015610c44576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611ef3565b610c6673ffffffffffffffffffffffffffffffffffffffff8816338987610fa7565b6000808873ffffffffffffffffffffffffffffffffffffffff166389afcb44306040518263ffffffff1660e01b8152600401610ca29190611990565b6040805180830381600087803b158015610cbb57600080fd5b505af1158015610ccf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf391906118dd565b915091506000610d038989610fce565b5090506000808273ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614610d43578385610d46565b84845b9150915087821015610d84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611d6e565b86811015610dbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611e96565b505050505050505050505050565b600082821115610e08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611c00565b50900390565b6000806000610e3d8b7f0000000000000000000000001c87257f5e8609940bc751a07bb085bb7f8cdbe66110cd565b610e678a7f0000000000000000000000001c87257f5e8609940bc751a07bb085bb7f8cdbe66110cd565b845173ffffffffffffffffffffffffffffffffffffffff16610ea357610e978b8b8b8b8b8b8b602001518b6111b6565b91945092509050610ec4565b610ebc8b8b8b8b8b8b8b600001518c604001518c6112d3565b919450925090505b985098509895505050505050565b610c058363a9059cbb60e01b8484604051602401610b83929190611a57565b6060610f53826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166114019092919063ffffffff16565b805190915015610c055780806020019051810190610f719190611863565b610c05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611e39565b610fc8846323b872dd60e01b858585604051602401610b8393929190611a26565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611037576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611dcb565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610611071578284611074565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff82166110c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611d37565b9250929050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063dd62ed3e9061112190309085906004016119ff565b60206040518083038186803b15801561113957600080fd5b505afa15801561114d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117191906118c5565b610a7857610a7873ffffffffffffffffffffffffffffffffffffffff8316827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610a80565b60008060007f0000000000000000000000001c87257f5e8609940bc751a07bb085bb7f8cdbe673ffffffffffffffffffffffffffffffffffffffff16631c5d0a6b8c8c888d8d8d8d338d6040518a63ffffffff1660e01b815260040161122499989796959493929190611af0565b606060405180830381600087803b15801561123e57600080fd5b505af1158015611252573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112769190611900565b91945092509050888310156112a8576112a873ffffffffffffffffffffffffffffffffffffffff8c1633858c03610ed2565b87821015610ec457610ec473ffffffffffffffffffffffffffffffffffffffff8b1633848b03610ed2565b60008060007f0000000000000000000000001c87257f5e8609940bc751a07bb085bb7f8cdbe673ffffffffffffffffffffffffffffffffffffffff1663243419348d8d898e8e8e8e8d338e6040518b63ffffffff1660e01b81526004016113439a99989796959493929190611a7d565b606060405180830381600087803b15801561135d57600080fd5b505af1158015611371573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113959190611900565b91945092509050898310156113c7576113c773ffffffffffffffffffffffffffffffffffffffff8d1633858d03610ed2565b888210156113f2576113f273ffffffffffffffffffffffffffffffffffffffff8c1633848c03610ed2565b99509950999650505050505050565b6060611410848460008561141a565b90505b9392505050565b606082471015611456576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611c37565b61145f8561151c565b611495576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb90611e02565b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040516114bf9190611971565b60006040518083038185875af1925050503d80600081146114fc576040519150601f19603f3d011682016040523d82523d6000602084013e611501565b606091505b5091509150611511828286611522565b979650505050505050565b3b151590565b60608315611531575081611413565b8251156115415782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102cb9190611b52565b60008083601f840112611586578182fd5b50813567ffffffffffffffff81111561159d578182fd5b60208301915083602080830285010111156110c657600080fd5b6000608082840312156115c8578081fd5b50919050565b6000608082840312156115df578081fd5b6115e96060611ffd565b905081356115f68161206d565b815260208281013563ffffffff8116811461161057600080fd5b82820152605f8301841361162357600080fd5b600261163661163182612024565b611ffd565b80604086018760808801111561164b57600080fd5b60005b8481101561166a5781358452928501929085019060010161164e565b505060408501525091949350505050565b60006020828403121561168c578081fd5b81356114138161206d565b60008060008060008060008060008060006102208c8e0312156116b8578687fd5b8b356116c38161206d565b9a5060208c01356116d38161206d565b995060408c01356116e38161206d565b985060608c0135975060808c0135965060a08c0135955060c08c0135945060e08c013593506117168d6101008e016115b7565b92506101808c0135915061172e8d6101a08e016115b7565b90509295989b509295989b9093969950565b6000806000806000806000806000806101a08b8d03121561175f578586fd5b8a3561176a8161206d565b995060208b013561177a8161206d565b985060408b013561178a8161206d565b975060608b0135965060808b0135955060a08b0135945060c08b0135935060e08b013592506117bd8c6101008d016115ce565b91506101808b013590509295989b9194979a5092959850565b6000806000806000606086880312156117ed578081fd5b853567ffffffffffffffff80821115611804578283fd5b61181089838a01611575565b90975095506020880135915080821115611828578283fd5b5061183588828901611575565b96999598509660400135949350505050565b600060208284031215611858578081fd5b813561141381612092565b600060208284031215611874578081fd5b815161141381612092565b60008060408385031215611891578182fd5b823561189c8161206d565b946020939093013593505050565b6000608082840312156118bb578081fd5b61141383836115ce565b6000602082840312156118d6578081fd5b5051919050565b600080604083850312156118ef578182fd5b505080516020909101519092909150565b600080600060608486031215611914578081fd5b8351925060208401519150604084015190509250925092565b60006020828403121561193e578081fd5b813560ff81168114611413578182fd5b8060005b6002811015610fc8578151845260209384019390910190600101611952565b60008251611983818460208701612041565b9190910192915050565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff97881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60006101608201905073ffffffffffffffffffffffffffffffffffffffff808d168352808c166020840152808b1660408401528960608401528860808401528760a08401528660c0840152611ad560e084018761194e565b93909316610120820152610140015298975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff998a168152978916602089015263ffffffff9690961660408801526060870194909452608086019290925260a085015260c084015290921660e08201526101008101919091526101200190565b6000602082528251806020840152611b71816040850160208701612041565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60408201527f722063616c6c0000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f4d69677261746f723a205452414e534645525f4554485f4641494c4544000000604082015260600190565b60208082526018908201527f4d69677261746f723a20494e56414c49445f414d4f554e540000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526016908201527f4d69677261746f723a205a45524f5f4144445245535300000000000000000000604082015260600190565b60208082526024908201527f4d6967726174696f723a20554e495f494e53554646494349454e545f415f414d60408201527f4f554e5400000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f4d69677261746f723a204944454e544943414c5f414444524553534553000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f4d6967726174696f723a20554e495f494e53554646494349454e545f425f414d60408201527f4f554e5400000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f4d6967726174696f723a20455850495245440000000000000000000000000000604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b9283526020830191909152604082015260600190565b600060e08201905085825284602083015283604083015273ffffffffffffffffffffffffffffffffffffffff835116606083015263ffffffff60208401511660808301526040830151611ff360a084018261194e565b5095945050505050565b60405181810167ffffffffffffffff8111828210171561201c57600080fd5b604052919050565b600067ffffffffffffffff82111561203a578081fd5b5060200290565b60005b8381101561205c578181015183820152602001612044565b83811115610fc85750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461208f57600080fd5b50565b801515811461208f57600080fdfea2646970667358221220a7e7b9f751541322bc216d649eaac702de9e71ba126cb46110b1f5d42c4092d064736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001c87257f5e8609940bc751a07bb085bb7f8cdbe6
-----Decoded View---------------
Arg [0] : _dmmRouter (address): 0x1c87257F5e8609940Bc751a07BB085Bb7f8cDBE6
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001c87257f5e8609940bc751a07bb085bb7f8cdbe6
Deployed Bytecode Sourcemap
48505:11836:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50317:1139;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;48639:34;;;:::i;:::-;;;;;;;:::i;48906:373::-;;;;;;:::i;:::-;;:::i;:::-;;52551:1713;;;;;;:::i;:::-;;:::i;28377:148::-;;;:::i;27726:87::-;;;:::i;28680:244::-;;;;;;:::i;:::-;;:::i;54409:322::-;;;;;;:::i;:::-;;:::i;50317:1139::-;50761:15;;;50871:28;;;;50914:10;50947:4;50967:21;;;;:10;:21;:::i;:::-;:47;;51005:9;50967:47;;;50999:2;50967:47;51029:8;51052:12;;;;;;;;:::i;:::-;51079:10;:12;;;51106:10;:12;;;50871:258;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51179:269;51212:7;51234:6;51255;51276:9;51300:10;51325;51350:13;51378;51406:8;51179:269;;;;;;;;;;:::i;:::-;51429:8;51179:18;:269::i;:::-;51142:306;;;;;;;;;;;;50317:1139;;;;;;;;;;;;;;;:::o;48639:34::-;;;:::o;48906:373::-;27957:12;:10;:12::i;:::-;27946:23;;:7;:5;:7::i;:::-;:23;;;27938:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49081:9:::1;49076:196;49096:17:::0;;::::1;49076:196;;;49140:9;49135:126;49155:19:::0;;::::1;49135:126;;;49200:45;49222:8;;49231:1;49222:11;;;;;;;;;;;;;;;;;;;;:::i;:::-;49235:9;49200:6;;49207:1;49200:9;;;;;;;;;;;;;;;;;;;;:::i;:::-;:21;;::::0;:45;:21:::1;:45::i;:::-;49176:3;;49135:126;;;-1:-1:-1::0;49115:3:0::1;;49076:196;;;;48906:373:::0;;;;;:::o;52551:1713::-;52940:18;52973;53006:20;53142:21;53173:6;53166:24;;;53199:4;53166:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53142:63;;53220:21;53251:6;53244:24;;;53277:4;53244:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53220:63;;53298:223;53336:7;53362:6;53387;53412:9;53440:10;53469;53498:8;53298:19;:223::i;:::-;53549:58;53593:13;53556:6;53549:24;;;53582:4;53549:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;:58::i;:::-;53536:71;;53635:58;53679:13;53642:6;53635:24;;;53668:4;53635:39;;;;;;;;;;;;;;;:::i;:58::-;53622:71;;53729:1;53716:10;:14;:32;;;;;53747:1;53734:10;:14;53716:32;53708:69;;;;;;;;;;;;:::i;:::-;53831:7;53799:75;;53823:6;53799:75;;53815:6;53799:75;;;53840:9;53851:10;53863;53799:75;;;;;;;;:::i;:::-;;;;;;;;52551:1713;;53939:227;53976:6;53997;54018:10;54043;54068:13;54096;54124:8;54147;53939:22;:227::i;:::-;53898:268;;;;;;;;;;;;54201:6;54184:72;;54193:6;54184:72;;;54209:10;54221;54233:12;54247:8;54184:72;;;;;;;;;:::i;:::-;;;;;;;;52551:1713;;;;;;;;;;;;;;:::o;28377:148::-;27957:12;:10;:12::i;:::-;27946:23;;:7;:5;:7::i;:::-;:23;;;27938:68;;;;;;;;;;;;:::i;:::-;28484:1:::1;28468:6:::0;;28447:40:::1;::::0;::::1;28468:6:::0;;::::1;::::0;28447:40:::1;::::0;28484:1;;28447:40:::1;28515:1;28498:19:::0;;;::::1;::::0;;28377:148::o;27726:87::-;27772:7;27799:6;;;27726:87;:::o;28680:244::-;27957:12;:10;:12::i;:::-;27946:23;;:7;:5;:7::i;:::-;:23;;;27938:68;;;;;;;;;;;;:::i;:::-;28769:22:::1;::::0;::::1;28761:73;;;;;;;;;;;;:::i;:::-;28871:6;::::0;;28850:38:::1;::::0;::::1;::::0;;::::1;::::0;28871:6;::::1;::::0;28850:38:::1;::::0;::::1;28899:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;28680:244::o;54409:322::-;27957:12;:10;:12::i;:::-;27946:23;;:7;:5;:7::i;:::-;:23;;;27938:68;;;;;;;;;;;;:::i;:::-;54495:18:::1;::::0;::::1;54491:233;;54531:12;54549:7;:5;:7::i;:::-;:12;;54569:6;54549:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54530:50;;;54603:7;54595:49;;;;;;;;;;;;:::i;:::-;54491:233;;;;54677:35;54696:7;:5;:7::i;:::-;54677:18;::::0;::::1;::::0;54705:6;54677:18:::1;:35::i;:::-;54409:322:::0;;:::o;26265:106::-;26353:10;26265:106;:::o;23219:622::-;23589:10;;;23588:62;;-1:-1:-1;23605:39:0;;;;;:15;;;;;;:39;;23629:4;;23636:7;;23605:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;23588:62;23580:152;;;;;;;;;;;;:::i;:::-;23743:90;23763:5;23793:22;;;23817:7;23826:5;23770:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23743:19;:90::i;:::-;23219:622;;;:::o;58760:844::-;59022:15;59010:8;:27;;59002:58;;;;;;;;;;;;:::i;:::-;59071;:29;;;59101:10;59113:4;59119:9;59071:29;:58::i;:::-;59167:15;59184;59218:4;59203:25;;;59237:4;59203:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59166:77;;;;59255:14;59275:27;59287:6;59295;59275:11;:27::i;:::-;59254:48;;;59314:15;59331;59360:6;59350:16;;:6;:16;;;:84;;59417:7;59426;59350:84;;;59383:7;59392;59350:84;59313:121;;;;59464:10;59453:7;:21;;59445:70;;;;;;;;;;;;:::i;:::-;59545:10;59534:7;:21;;59526:70;;;;;;;;;;;;:::i;:::-;58760:844;;;;;;;;;;;;:::o;3295:158::-;3353:7;3386:1;3381;:6;;3373:49;;;;;;;;;;;;:::i;:::-;-1:-1:-1;3440:5:0;;;3295:158::o;54850:1410::-;55175:15;55205;55235:17;55320:57;55349:6;55366:9;55320:21;:57::i;:::-;55388;55417:6;55434:9;55388:21;:57::i;:::-;55460:20;;:34;;55456:797;;55575:271;55614:6;55639;55664:14;55697;55730:10;55759;55788:8;:16;;;55823:8;55575:20;:271::i;:::-;55543:303;;-1:-1:-1;55543:303:0;-1:-1:-1;55543:303:0;-1:-1:-1;55456:797:0;;;55911:330;55955:6;55980;56005:14;56038;56071:10;56100;56129:8;:20;;;56168:8;:31;;;56218:8;55911:25;:330::i;:::-;55879:362;;-1:-1:-1;55879:362:0;-1:-1:-1;55879:362:0;-1:-1:-1;55456:797:0;54850:1410;;;;;;;;;;;;:::o;22560:177::-;22643:86;22663:5;22693:23;;;22718:2;22722:5;22670:58;;;;;;;;;:::i;24865:761::-;25289:23;25315:69;25343:4;25315:69;;;;;;;;;;;;;;;;;25323:5;25315:27;;;;:69;;;;;:::i;:::-;25399:17;;25289:95;;-1:-1:-1;25399:21:0;25395:224;;25541:10;25530:30;;;;;;;;;;;;:::i;:::-;25522:85;;;;;;;;;;;;:::i;22745:205::-;22846:96;22866:5;22896:27;;;22925:4;22931:2;22935:5;22873:68;;;;;;;;;;:::i;22846:96::-;22745:205;;;;:::o;59972:366::-;60075:14;60091;60141:6;60131:16;;:6;:16;;;;60123:58;;;;;;;;;;;;:::i;:::-;60220:6;60211:15;;:6;:15;;;:53;;60249:6;60257;60211:53;;;60230:6;60238;60211:53;60192:72;;-1:-1:-1;60192:72:0;-1:-1:-1;60283:20:0;;;60275:55;;;;;;;;;;;;:::i;:::-;59972:366;;;;;:::o;59686:205::-;59772:39;;;;;:15;;;;;;:39;;59796:4;;59803:7;;59772:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59768:116;;59833:39;:17;;;59851:7;59868:2;59833:17;:39::i;57620:1053::-;57930:15;57960;57990:17;58087:9;58067:50;;;58139:6;58168;58190:4;58209:14;58238;58267:10;58292;58317;58342:8;58067:294;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58035:326;;-1:-1:-1;58035:326:0;-1:-1:-1;58035:326:0;-1:-1:-1;58416:24:0;;;58412:122;;;58457:65;:27;;;58485:10;58497:24;;;58457:27;:65::i;:::-;58558:14;58548:7;:24;58544:122;;;58589:65;:27;;;58617:10;58629:24;;;58589:27;:65::i;56373:1140::-;56740:15;56770;56800:17;56897:9;56877:43;;;56942:6;56971;56993:7;57015:14;57044;57073:10;57098;57123:19;57157:10;57182:8;56877:324;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56845:356;;-1:-1:-1;56845:356:0;-1:-1:-1;56845:356:0;-1:-1:-1;57256:24:0;;;57252:122;;;57297:65;:27;;;57325:10;57337:24;;;57297:27;:65::i;:::-;57398:14;57388:7;:24;57384:122;;;57429:65;:27;;;57457:10;57469:24;;;57429:27;:65::i;:::-;56373:1140;;;;;;;;;;;;;:::o;17557:195::-;17660:12;17692:52;17714:6;17722:4;17728:1;17731:12;17692:21;:52::i;:::-;17685:59;;17557:195;;;;;;:::o;18609:530::-;18736:12;18794:5;18769:21;:30;;18761:81;;;;;;;;;;;;:::i;:::-;18861:18;18872:6;18861:10;:18::i;:::-;18853:60;;;;;;;;;;;;:::i;:::-;18987:12;19001:23;19028:6;:11;;19048:5;19056:4;19028:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18986:75;;;;19079:52;19097:7;19106:10;19118:12;19079:17;:52::i;:::-;19072:59;18609:530;-1:-1:-1;;;;;;;18609:530:0:o;14639:422::-;15006:20;15045:8;;;14639:422::o;21149:742::-;21264:12;21293:7;21289:595;;;-1:-1:-1;21324:10:0;21317:17;;21289:595;21438:17;;:21;21434:439;;21701:10;21695:17;21762:15;21749:10;21745:2;21741:19;21734:44;21649:148;21844:12;21837:20;;;;;;;;;;;:::i;160:352:-1:-;;;290:3;283:4;275:6;271:17;267:27;257:2;;-1:-1;;298:12;257:2;-1:-1;328:20;;368:18;357:30;;354:2;;;-1:-1;;390:12;354:2;434:4;426:6;422:17;410:29;;485:3;434:4;;469:6;465:17;426:6;451:32;;448:41;445:2;;;502:1;;492:12;2039:162;;2153:3;2144:6;2139:3;2135:16;2131:26;2128:2;;;-1:-1;;2160:12;2128:2;-1:-1;2180:15;2121:80;-1:-1;2121:80::o;2459:662::-;;2574:4;2562:9;2557:3;2553:19;2549:30;2546:2;;;-1:-1;;2582:12;2546:2;2610:20;2625:4;2610:20;:::i;:::-;2601:29;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2694:75;;2833:2;2886:22;;;3472:20;35625:10;35614:22;;37358:34;;37348:2;;-1:-1;;37396:12;37348:2;2848:16;;;2841:74;1035:17;;;1031:27;-1:-1;1021:2;;-1:-1;;1062:12;1021:2;1096:4;1115:78;1130:62;1096:4;1130:62;:::i;:::-;1115:78;:::i;:::-;1199:16;2994:2;3075:9;3071:22;1316:3;2574:4;3075:9;1287:27;1284:36;1281:2;;;-1:-1;;1323:12;1281:2;-1:-1;1343:206;1096:4;1365:1;1362:13;1343:206;;;3195:20;;1436:50;;1500:14;;;;1528;;;;1390:1;1383:9;1343:206;;;-1:-1;;2994:2;3009:16;;3002:98;-1:-1;3013:5;;2540:581;-1:-1;;;;2540:581::o;3674:241::-;;3778:2;3766:9;3757:7;3753:23;3749:32;3746:2;;;-1:-1;;3784:12;3746:2;85:6;72:20;97:33;124:5;97:33;:::i;3922:1617::-;;;;;;;;;;;;4255:3;4243:9;4234:7;4230:23;4226:33;4223:2;;;-1:-1;;4262:12;4223:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4314:63;-1:-1;4414:2;4453:22;;72:20;97:33;72:20;97:33;:::i;:::-;4422:63;-1:-1;4522:2;4561:22;;72:20;97:33;72:20;97:33;:::i;:::-;4530:63;-1:-1;4630:2;4669:22;;3195:20;;-1:-1;4738:3;4778:22;;3195:20;;-1:-1;4847:3;4887:22;;3195:20;;-1:-1;4956:3;4996:22;;3195:20;;-1:-1;5065:3;5105:22;;3195:20;;-1:-1;5193:81;5266:7;5174:3;5242:22;;5193:81;:::i;:::-;5183:91;;5311:3;5355:9;5351:22;3195:20;5320:63;;5440:83;5515:7;5420:3;5495:9;5491:22;5440:83;:::i;:::-;5429:94;;4217:1322;;;;;;;;;;;;;;:::o;5546:1425::-;;;;;;;;;;;5829:3;5817:9;5808:7;5804:23;5800:33;5797:2;;;-1:-1;;5836:12;5797:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5888:63;-1:-1;5988:2;6027:22;;72:20;97:33;72:20;97:33;:::i;:::-;5996:63;-1:-1;6096:2;6135:22;;72:20;97:33;72:20;97:33;:::i;:::-;6104:63;-1:-1;6204:2;6243:22;;3195:20;;-1:-1;6312:3;6352:22;;3195:20;;-1:-1;6421:3;6461:22;;3195:20;;-1:-1;6530:3;6570:22;;3195:20;;-1:-1;6639:3;6679:22;;3195:20;;-1:-1;6767:79;6838:7;6748:3;6814:22;;6767:79;:::i;:::-;6757:89;;6883:3;6927:9;6923:22;3195:20;6892:63;;5791:1180;;;;;;;;;;;;;:::o;6978:831::-;;;;;;7200:2;7188:9;7179:7;7175:23;7171:32;7168:2;;;-1:-1;;7206:12;7168:2;7264:17;7251:31;7302:18;;7294:6;7291:30;7288:2;;;-1:-1;;7324:12;7288:2;7362:94;7448:7;7439:6;7428:9;7424:22;7362:94;:::i;:::-;7344:112;;-1:-1;7344:112;-1:-1;7521:2;7506:18;;7493:32;;-1:-1;7534:30;;;7531:2;;;-1:-1;;7567:12;7531:2;;7605:80;7677:7;7668:6;7657:9;7653:22;7605:80;:::i;:::-;7162:647;;;;-1:-1;7587:98;7722:2;7761:22;3195:20;;7162:647;-1:-1;;;;7162:647::o;7816:235::-;;7917:2;7905:9;7896:7;7892:23;7888:32;7885:2;;;-1:-1;;7923:12;7885:2;1640:6;1627:20;1652:30;1676:5;1652:30;:::i;8058:257::-;;8170:2;8158:9;8149:7;8145:23;8141:32;8138:2;;;-1:-1;;8176:12;8138:2;1775:6;1769:13;1787:30;1811:5;1787:30;:::i;8598:394::-;;;8733:2;8721:9;8712:7;8708:23;8704:32;8701:2;;;-1:-1;;8739:12;8701:2;1923:6;1910:20;1935:47;1976:5;1935:47;:::i;:::-;8791:77;8905:2;8944:22;;;;3195:20;;-1:-1;;;8695:297::o;8999:294::-;;9129:3;9117:9;9108:7;9104:23;9100:33;9097:2;;;-1:-1;;9136:12;9097:2;9198:79;9269:7;9245:22;9198:79;:::i;9300:263::-;;9415:2;9403:9;9394:7;9390:23;9386:32;9383:2;;;-1:-1;;9421:12;9383:2;-1:-1;3343:13;;9377:186;-1:-1;9377:186::o;9570:399::-;;;9702:2;9690:9;9681:7;9677:23;9673:32;9670:2;;;-1:-1;;9708:12;9670:2;-1:-1;;3343:13;;9871:2;9921:22;;;3343:13;;;;;-1:-1;9664:305::o;9976:535::-;;;;10125:2;10113:9;10104:7;10100:23;10096:32;10093:2;;;-1:-1;;10131:12;10093:2;3349:6;3343:13;10183:74;;10294:2;10348:9;10344:22;3343:13;10302:74;;10413:2;10467:9;10463:22;3343:13;10421:74;;10087:424;;;;;:::o;10518:237::-;;10620:2;10608:9;10599:7;10595:23;10591:32;10588:2;;;-1:-1;;10626:12;10588:2;3619:6;3606:20;35719:4;37505:5;35708:16;37482:5;37479:33;37469:2;;-1:-1;;37516:12;11356:640;11699:21;11741:1;11726:258;33961:4;11748:1;11745:13;11726:258;;;11812:13;;12776:37;;10925:4;10916:14;;;;34326;;;;11773:1;11766:9;11726:258;;20371:271;;12985:5;34069:12;13096:52;13141:6;13136:3;13129:4;13122:5;13118:16;13096:52;:::i;:::-;13160:16;;;;;20505:137;-1:-1;;20505:137::o;20649:379::-;21013:10;20837:191::o;21035:222::-;35419:42;35408:54;;;;11154:37;;21162:2;21147:18;;21133:124::o;21264:900::-;35419:42;35408:54;;;11023:58;;35408:54;;;;21736:2;21721:18;;11154:37;21819:2;21804:18;;12776:37;;;;21902:2;21887:18;;12776:37;;;;35719:4;35708:16;21981:3;21966:19;;20324:35;22065:3;22050:19;;12776:37;22149:3;22134:19;;12776:37;;;;21563:3;21548:19;;21534:630::o;22171:333::-;35419:42;35408:54;;;11154:37;;35408:54;;22490:2;22475:18;;11154:37;22326:2;22311:18;;22297:207::o;22511:444::-;35419:42;35408:54;;;11154:37;;35408:54;;;;22858:2;22843:18;;11154:37;22941:2;22926:18;;12776:37;;;;22694:2;22679:18;;22665:290::o;22962:333::-;35419:42;35408:54;;;;11154:37;;23281:2;23266:18;;12776:37;23117:2;23102:18;;23088:207::o;23302:1392::-;;23763:3;23752:9;23748:19;23740:27;;35419:42;;13330:5;35408:54;13280:3;13273:64;35419:42;13330:5;35408:54;23956:2;23945:9;23941:18;13273:64;35419:42;11184:5;35408:54;24039:2;24028:9;24024:18;11154:37;12806:5;24122:2;24111:9;24107:18;12776:37;12806:5;24205:3;24194:9;24190:19;12776:37;12806:5;24289:3;24278:9;24274:19;12776:37;12806:5;24373:3;24362:9;24358:19;12776:37;24389:119;24503:3;24492:9;24488:19;24479:6;24389:119;:::i;:::-;35408:54;;;;24595:3;24580:19;;11023:58;24679:3;24664:19;12776:37;23734:960;;-1:-1;;;;;;;;23734:960::o;24701:1184::-;35419:42;35408:54;;;13273:64;;35408:54;;;25279:2;25264:18;;13273:64;35625:10;35614:22;;;;25360:2;25345:18;;20092:36;25443:2;25428:18;;12776:37;;;;25526:3;25511:19;;12776:37;;;;25610:3;25595:19;;12776:37;25694:3;25679:19;;12776:37;35408:54;;;25786:3;25771:19;;11023:58;25870:3;25855:19;;12776:37;;;;25086:3;25071:19;;25057:828::o;25892:310::-;;26039:2;26060:17;26053:47;13494:5;34069:12;34909:6;26039:2;26028:9;26024:18;34897:19;13588:52;13633:6;34937:14;26028:9;34937:14;26039:2;13614:5;13610:16;13588:52;:::i;:::-;36765:2;36745:14;36761:7;36741:28;13652:39;;;;34937:14;13652:39;;26010:192;-1:-1;;26010:192::o;26209:416::-;26409:2;26423:47;;;13928:2;26394:18;;;34897:19;13964:34;34937:14;;;13944:55;14033:8;14019:12;;;14012:30;14061:12;;;26380:245::o;26632:416::-;26832:2;26846:47;;;14312:2;26817:18;;;34897:19;14348:32;34937:14;;;14328:53;14400:12;;;26803:245::o;27055:416::-;27255:2;27269:47;;;14651:2;27240:18;;;34897:19;14687:34;34937:14;;;14667:55;14756:8;14742:12;;;14735:30;14784:12;;;27226:245::o;27478:416::-;27678:2;27692:47;;;15035:2;27663:18;;;34897:19;15071:31;34937:14;;;15051:52;15122:12;;;27649:245::o;27901:416::-;28101:2;28115:47;;;15373:2;28086:18;;;34897:19;15409:26;34937:14;;;15389:47;15455:12;;;28072:245::o;28324:416::-;28524:2;28538:47;;;28509:18;;;34897:19;15742:34;34937:14;;;15722:55;15796:12;;;28495:245::o;28747:416::-;28947:2;28961:47;;;16047:2;28932:18;;;34897:19;16083:24;34937:14;;;16063:45;16127:12;;;28918:245::o;29170:416::-;29370:2;29384:47;;;16378:2;29355:18;;;34897:19;16414:34;34937:14;;;16394:55;16483:6;16469:12;;;16462:28;16509:12;;;29341:245::o;29593:416::-;29793:2;29807:47;;;16760:2;29778:18;;;34897:19;16796:31;34937:14;;;16776:52;16847:12;;;29764:245::o;30016:416::-;30216:2;30230:47;;;17403:2;30201:18;;;34897:19;17439:31;34937:14;;;17419:52;17490:12;;;30187:245::o;30439:416::-;30639:2;30653:47;;;17741:2;30624:18;;;34897:19;17777:34;34937:14;;;17757:55;17846:12;17832;;;17825:34;17878:12;;;30610:245::o;30862:416::-;31062:2;31076:47;;;18129:2;31047:18;;;34897:19;18165:34;34937:14;;;18145:55;18234:6;18220:12;;;18213:28;18260:12;;;31033:245::o;31285:416::-;31485:2;31499:47;;;18511:2;31470:18;;;34897:19;18547:20;34937:14;;;18527:41;18587:12;;;31456:245::o;31708:416::-;31908:2;31922:47;;;18838:2;31893:18;;;34897:19;18874:34;34937:14;;;18854:55;18943:24;18929:12;;;18922:46;18987:12;;;31879:245::o;32131:444::-;12776:37;;;32478:2;32463:18;;12776:37;;;;32561:2;32546:18;;12776:37;32314:2;32299:18;;32285:290::o;32582:660::-;;32845:3;32834:9;32830:19;32822:27;;12806:5;12783:3;12776:37;12806:5;33010:2;32999:9;32995:18;12776:37;12806:5;33093:2;33082:9;33078:18;12776:37;35419:42;19316:16;19310:23;35408:54;33228:2;33217:9;33213:18;11154:37;35625:10;33010:2;19477:5;19473:16;19467:23;35614:22;19542:14;33217:9;19542:14;20092:36;33093:2;19647:5;19643:16;19637:23;19666:109;19760:14;33217:9;19760:14;19746:12;19666:109;:::i;:::-;;32816:426;;;;;;;:::o;33249:256::-;33311:2;33305:9;33337:17;;;33412:18;33397:34;;33433:22;;;33394:62;33391:2;;;33469:1;;33459:12;33391:2;33311;33478:22;33289:216;;-1:-1;33289:216::o;33512:244::-;;33669:18;33661:6;33658:30;33655:2;;;-1:-1;;33691:12;33655:2;-1:-1;33736:4;33724:17;;33592:164::o;36401:268::-;36466:1;36473:101;36487:6;36484:1;36481:13;36473:101;;;36554:11;;;36548:18;36535:11;;;36528:39;36509:2;36502:10;36473:101;;;36589:6;36586:1;36583:13;36580:2;;;-1:-1;;36466:1;36636:16;;36629:27;36450:219::o;36782:117::-;35419:42;36869:5;35408:54;36844:5;36841:35;36831:2;;36890:1;;36880:12;36831:2;36825:74;:::o;36906:111::-;36987:5;35129:13;35122:21;36965:5;36962:32;36952:2;;37008:1;;36998:12
Swarm Source
ipfs://a7e7b9f751541322bc216d649eaac702de9e71ba126cb46110b1f5d42c4092d0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.