Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Liquidator
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 300 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.4; import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "../interfaces/INFTVault.sol"; import "../interfaces/IAggregatorV3Interface.sol"; import "../interfaces/IJPEGAuction.sol"; import "../interfaces/ISynthsController.sol"; import "../interfaces/ISynthsDebtAggregator.sol"; /// @title Liquidator escrow contract /// @notice Liquidator contract that allows liquidator bots to liquidate positions without holding any stablecoins/NFTs. /// It's only meant to be used by DAO bots. /// The liquidated NFTs are auctioned. contract Liquidator is OwnableUpgradeable { using AddressUpgradeable for address; error ZeroAddress(); error InvalidLength(); error UnknownVault(INFTVault vault); error InsufficientBalance(IERC20Upgradeable stablecoin); struct OracleInfo { IAggregatorV3Interface oracle; uint8 decimals; } struct VaultInfo { IERC20Upgradeable stablecoin; address nftOrWrapper; bool isWrapped; } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable IJPEGAuction public immutable AUCTION; mapping(IERC20Upgradeable => OracleInfo) public stablecoinOracle; mapping(INFTVault => VaultInfo) public vaultInfo; /// @custom:oz-upgrades-unsafe-allow state-variable-immutable ISynthsController public immutable SYNTHS_CONTROLLER; /// @custom:oz-upgrades-unsafe-allow state-variable-immutable IERC20Upgradeable public immutable PETH; /// @custom:oz-upgrades-unsafe-allow constructor constructor(address _auction, address _controller, address _peth) { if ( _auction == address(0) || _controller == address(0) || _peth == address(0) ) revert ZeroAddress(); AUCTION = IJPEGAuction(_auction); SYNTHS_CONTROLLER = ISynthsController(_controller); PETH = IERC20Upgradeable(_peth); } function initialize() external initializer { __Ownable_init(); } /// @notice Allows any address to liquidate multiple positions at once. /// It assumes enough stablecoin is in the contract. /// The liquidated NFTs are sent to the DAO. /// This function can be called by anyone, however the address calling it doesn't get any stablecoins/NFTs. /// @dev This function doesn't revert if one of the positions is not liquidatable. /// This is done to prevent situations in which multiple positions can't be liquidated /// because of one not liquidatable position. /// It reverts on insufficient balance. /// @param _toLiquidate The positions to liquidate /// @param _nftVault The address of the NFTVault function liquidate( uint256[] memory _toLiquidate, INFTVault _nftVault ) external { VaultInfo memory _vaultInfo = vaultInfo[_nftVault]; if (_vaultInfo.nftOrWrapper == address(0)) revert UnknownVault(_nftVault); uint256 _length = _toLiquidate.length; if (_length == 0) revert InvalidLength(); uint256 _balance = _vaultInfo.stablecoin.balanceOf(address(this)); _vaultInfo.stablecoin.approve(address(_nftVault), _balance); for (uint256 i; i < _length; ++i) { uint256 _nftIndex = _toLiquidate[i]; INFTVault.Position memory _position = _nftVault.positions( _nftIndex ); uint256 _interest = _nftVault.getDebtInterest(_nftIndex); address _destAddress = _vaultInfo.isWrapped ? _vaultInfo.nftOrWrapper : address(this); try _nftVault.liquidate(_nftIndex, _destAddress) { if ( _position.borrowType != INFTVault.BorrowType.USE_INSURANCE ) { uint256 _normalizedDebt = _convertDebtAmount( _position.debtPrincipal + _interest, stablecoinOracle[_vaultInfo.stablecoin] ); if (!_vaultInfo.isWrapped) IERC721Upgradeable(_vaultInfo.nftOrWrapper).approve( address(AUCTION), _nftIndex ); AUCTION.newAuction( _vaultInfo.nftOrWrapper, _nftIndex, _normalizedDebt ); } } catch Error(string memory _reason) { //insufficient allowance -> insufficient balance if ( keccak256(abi.encodePacked(_reason)) == keccak256(abi.encodePacked("ERC20: insufficient allowance")) ) revert InsufficientBalance(_vaultInfo.stablecoin); } } //reset appoval _vaultInfo.stablecoin.approve(address(_nftVault), 0); } /// @notice Allows any address to liquidate multiple synths positions at once. /// It assumes enough stablecoin is in the contract. /// The liquidated stablecoin is sent to the DAO. /// This function can be called by anyone, however the address calling it doesn't get any stablecoins. /// @dev This function doesn't revert if one of the positions is not liquidatable. /// This is done to prevent situations in which multiple positions can't be liquidated /// because of one non-liquidatable position. /// It reverts on insufficient balance. /// @param _toLiquidate The position ids to liquidate function liquidateSynths(uint256[] memory _toLiquidate) external { uint256 _length = _toLiquidate.length; if (_length == 0) revert InvalidLength(); address _debtVault = ISynthsDebtAggregator( SYNTHS_CONTROLLER.debtAggregator() ).debtVaults(address(PETH)).vaultAddress; uint256 _balance = PETH.balanceOf(address(this)); PETH.approve(address(_debtVault), _balance); for (uint256 i; i < _length; ++i) { uint256 _positionId = _toLiquidate[i]; try SYNTHS_CONTROLLER.liquidate(_positionId, owner()) {} catch Error(string memory _reason) { //insufficient allowance -> insufficient balance if ( keccak256(abi.encodePacked(_reason)) == keccak256(abi.encodePacked("ERC20: insufficient allowance")) ) revert InsufficientBalance(PETH); } } //reset appoval PETH.approve(address(_debtVault), 0); } /// @notice Allows any address to claim NFTs from multiple expired insurance postions at once. /// The claimed NFTs are auctioned. /// This function can be called by anyone, however the address calling it doesn't get any stablecoins/NFTs. /// @dev This function doesn't revert if one of the NFTs isn't claimable yet. This is done to prevent /// situations in which multiple NFTs can't be claimed because of one not being claimable yet /// @param _toClaim The indexes of the NFTs to claim /// @param _nftVault The address of the NFTVault function claimExpiredInsuranceNFT( uint256[] memory _toClaim, INFTVault _nftVault ) external { VaultInfo memory _vaultInfo = vaultInfo[_nftVault]; if (_vaultInfo.nftOrWrapper == address(0)) revert UnknownVault(_nftVault); uint256 _length = _toClaim.length; if (_length == 0) revert InvalidLength(); for (uint256 i; i < _length; ++i) { uint256 _nftIndex = _toClaim[i]; INFTVault.Position memory _position = _nftVault.positions( _nftIndex ); address _destAddress = _vaultInfo.isWrapped ? _vaultInfo.nftOrWrapper : address(this); try _nftVault.claimExpiredInsuranceNFT(_nftIndex, _destAddress) { uint256 _normalizedDebt = _convertDebtAmount( _position.debtAmountForRepurchase, stablecoinOracle[_vaultInfo.stablecoin] ); if (!_vaultInfo.isWrapped) IERC721Upgradeable(_vaultInfo.nftOrWrapper).approve( address(AUCTION), _nftIndex ); AUCTION.newAuction( _vaultInfo.nftOrWrapper, _nftIndex, _normalizedDebt ); } catch { //catch and ignore claim errors } } } /// @notice Allows the owner to add information about a NFTVault function addNFTVault( INFTVault _nftVault, address _nftOrWrapper, bool _isWrapped ) external onlyOwner { if (address(_nftVault) == address(0) || _nftOrWrapper == address(0)) revert ZeroAddress(); vaultInfo[_nftVault] = VaultInfo( IERC20Upgradeable(_nftVault.stablecoin()), _nftOrWrapper, _isWrapped ); } /// @notice Allows the owner to remove a NFTVault function removeNFTVault(INFTVault _nftVault) external onlyOwner { delete vaultInfo[_nftVault]; } /// @notice Allows the owner to set the oracle address for a specific stablecoin. function setOracle( IERC20Upgradeable _stablecoin, IAggregatorV3Interface _oracle ) external onlyOwner { if ( address(_stablecoin) == address(0) || address(_oracle) == address(0) ) revert ZeroAddress(); stablecoinOracle[_stablecoin] = OracleInfo(_oracle, _oracle.decimals()); } /// @notice Allows the DAO to perform multiple calls using this contract (recovering funds/NFTs stuck in this contract) /// @param _targets The target addresses /// @param _calldatas The data to pass in each call /// @param _values The ETH value for each call function doCalls( address[] memory _targets, bytes[] memory _calldatas, uint256[] memory _values ) external payable onlyOwner { for (uint256 i = 0; i < _targets.length; i++) { _targets[i].functionCallWithValue(_calldatas[i], _values[i]); } } function _convertDebtAmount( uint256 _debt, OracleInfo memory _info ) internal view returns (uint256) { if (address(_info.oracle) == address(0)) return _debt; else { //not checking for stale prices because we have no fallback oracle //and stale/wrong prices are not an issue since they are only needed //to set the minimum bid for the auction (, int256 _answer, , , ) = _info.oracle.latestRoundData(); return (_debt * 10 ** _info.decimals) / uint256(_answer); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_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 { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165Upgradeable.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.4; interface IAggregatorV3Interface { function decimals() external view returns (uint8); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.4; interface IJPEGAuction { function newAuction(address _nft, uint256 _idx, uint256 _minBid) external; }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.4; interface INFTVault { struct Rate { uint128 numerator; uint128 denominator; } struct VaultSettings { Rate debtInterestApr; /// @custom:oz-renamed-from creditLimitRate Rate unused15; /// @custom:oz-renamed-from liquidationLimitRate Rate unused16; /// @custom:oz-renamed-from cigStakedCreditLimitRate Rate unused17; /// @custom:oz-renamed-from cigStakedLiquidationLimitRate Rate unused18; /// @custom:oz-renamed-from valueIncreaseLockRate Rate unused12; Rate organizationFeeRate; Rate insurancePurchaseRate; Rate insuranceLiquidationPenaltyRate; uint256 insuranceRepurchaseTimeLimit; uint256 borrowAmountCap; } enum BorrowType { NOT_CONFIRMED, NON_INSURANCE, USE_INSURANCE } struct Position { BorrowType borrowType; uint256 debtPrincipal; uint256 debtPortion; uint256 debtAmountForRepurchase; uint256 liquidatedAt; address liquidator; address strategy; } function settings() external view returns (VaultSettings memory); function accrue() external; function setSettings(VaultSettings calldata _settings) external; function doActionsFor( address _account, uint8[] calldata _actions, bytes[] calldata _data ) external; function hasStrategy(address _strategy) external view returns (bool); function stablecoin() external view returns (address); function nftContract() external view returns (address); function positions(uint256 _idx) external view returns (Position memory); function getDebtInterest(uint256 _nftIndex) external view returns (uint256); function liquidate(uint256 _nftIndex, address _recipient) external; function claimExpiredInsuranceNFT( uint256 _nftIndex, address _recipient ) external; function forceClosePosition( address _account, uint256 _nftIndex, address _recipient ) external returns (uint256); function importPosition( address _account, uint256 _nftIndex, uint256 _amount, bool _insurance, address _strategy ) external; }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.4; import "./ISynthsDebtAggregator.sol"; interface ISynthsController { struct VaultData { address vaultAddress; uint8 assetDecimals; } function debtAggregator() external returns (address); function liquidate(uint256 _positionId, address _receiver) external; }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.4; interface ISynthsDebtAggregator { struct VaultData { address vaultAddress; uint8 assetDecimals; } function debtVaults(address _asset) external returns (VaultData memory); }
{ "optimizer": { "enabled": true, "runs": 300 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_auction","type":"address"},{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_peth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"contract IERC20Upgradeable","name":"stablecoin","type":"address"}],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidLength","type":"error"},{"inputs":[{"internalType":"contract INFTVault","name":"vault","type":"address"}],"name":"UnknownVault","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"AUCTION","outputs":[{"internalType":"contract IJPEGAuction","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PETH","outputs":[{"internalType":"contract IERC20Upgradeable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYNTHS_CONTROLLER","outputs":[{"internalType":"contract ISynthsController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract INFTVault","name":"_nftVault","type":"address"},{"internalType":"address","name":"_nftOrWrapper","type":"address"},{"internalType":"bool","name":"_isWrapped","type":"bool"}],"name":"addNFTVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_toClaim","type":"uint256[]"},{"internalType":"contract INFTVault","name":"_nftVault","type":"address"}],"name":"claimExpiredInsuranceNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_targets","type":"address[]"},{"internalType":"bytes[]","name":"_calldatas","type":"bytes[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"doCalls","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_toLiquidate","type":"uint256[]"},{"internalType":"contract INFTVault","name":"_nftVault","type":"address"}],"name":"liquidate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_toLiquidate","type":"uint256[]"}],"name":"liquidateSynths","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract INFTVault","name":"_nftVault","type":"address"}],"name":"removeNFTVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20Upgradeable","name":"_stablecoin","type":"address"},{"internalType":"contract IAggregatorV3Interface","name":"_oracle","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20Upgradeable","name":"","type":"address"}],"name":"stablecoinOracle","outputs":[{"internalType":"contract IAggregatorV3Interface","name":"oracle","type":"address"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract INFTVault","name":"","type":"address"}],"name":"vaultInfo","outputs":[{"internalType":"contract IERC20Upgradeable","name":"stablecoin","type":"address"},{"internalType":"address","name":"nftOrWrapper","type":"address"},{"internalType":"bool","name":"isWrapped","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60e06040523480156200001157600080fd5b5060405162002696380380620026968339810160408190526200003491620000c9565b6001600160a01b03831615806200005257506001600160a01b038216155b806200006557506001600160a01b038116155b15620000845760405163d92e233d60e01b815260040160405180910390fd5b6001600160601b0319606093841b811660805291831b821660a05290911b1660c05262000112565b80516001600160a01b0381168114620000c457600080fd5b919050565b600080600060608486031215620000de578283fd5b620000e984620000ac565b9250620000f960208501620000ac565b91506200010960408501620000ac565b90509250925092565b60805160601c60a05160601c60c05160601c6124fe620001986000396000818161031d0152818161147001528181611511015281816115bc015281816117be0152611825015260008181610384015281816113c8015261167401526000818161016c0152818161060a015281816106a901528181610be60152610c8501526124fe6000f3fe6080604052600436106100f35760003560e01c80638da5cb5b1161008a578063efbba8ce11610059578063efbba8ce1461033f578063f2fde38b14610352578063f6feddaf14610372578063ff618c07146103a657600080fd5b80638da5cb5b146102155780639164359a14610233578063a833e2fa146102a8578063ad23da891461030b57600080fd5b80636ed848ea116100c65780636ed848ea146101ab578063715018a6146101cb5780637a46ea53146101e05780638129fc1c1461020057600080fd5b80631fe281b8146100f857806333f150af1461011a5780635c38eb3a1461013a57806363779c741461015a575b600080fd5b34801561010457600080fd5b50610118610113366004611eb1565b6103c6565b005b34801561012657600080fd5b50610118610135366004611eb1565b610724565b34801561014657600080fd5b50610118610155366004611f1d565b610d88565b34801561016657600080fd5b5061018e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101b757600080fd5b506101186101c6366004611d4e565b610ee5565b3480156101d757600080fd5b50610118610f65565b3480156101ec57600080fd5b506101186101fb366004611f4a565b610fb9565b34801561020c57600080fd5b5061011861112d565b34801561022157600080fd5b506033546001600160a01b031661018e565b34801561023f57600080fd5b5061028061024e366004611d4e565b606660205260009081526040902080546001909101546001600160a01b0391821691811690600160a01b900460ff1683565b604080516001600160a01b0394851681529390921660208401521515908201526060016101a2565b3480156102b457600080fd5b506102ea6102c3366004611d4e565b6065602052600090815260409020546001600160a01b03811690600160a01b900460ff1682565b604080516001600160a01b03909316835260ff9091166020830152016101a2565b34801561031757600080fd5b5061018e7f000000000000000000000000000000000000000000000000000000000000000081565b61011861034d366004611d86565b6111ee565b34801561035e57600080fd5b5061011861036d366004611d4e565b6112ee565b34801561037e57600080fd5b5061018e7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103b257600080fd5b506101186103c1366004611e76565b6113a4565b6001600160a01b038181166000908152606660209081526040918290208251606081018452815485168152600190910154938416918101829052600160a01b90930460ff16151591830191909152610441576040516376bfd6b960e01b81526001600160a01b03831660048201526024015b60405180910390fd5b8251806104615760405163251f56a160e21b815260040160405180910390fd5b60005b8181101561071d57600085828151811061048e57634e487b7160e01b600052603260045260246000fd5b602002602001015190506000856001600160a01b03166399fbab88836040518263ffffffff1660e01b81526004016104c891815260200190565b60e06040518083038186803b1580156104e057600080fd5b505afa1580156104f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105189190611f94565b90506000856040015161052b5730610531565b85602001515b60405163f800467560e01b8152600481018590526001600160a01b0380831660248301529192509088169063f800467590604401600060405180830381600087803b15801561057f57600080fd5b505af1925050508015610590575060015b61059957610709565b606082015186516001600160a01b0390811660009081526065602090815260408083208151808301909252549384168152600160a01b90930460ff1690830152916105e3916118a1565b9050866040015161067757602087015160405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790529091169063095ea7b390604401600060405180830381600087803b15801561065e57600080fd5b505af1158015610672573d6000803e3d6000fd5b505050505b6020870151604051639ef1e4a160e01b81526001600160a01b03918216600482015260248101869052604481018390527f000000000000000000000000000000000000000000000000000000000000000090911690639ef1e4a190606401600060405180830381600087803b1580156106ef57600080fd5b505af1158015610703573d6000803e3d6000fd5b50505050505b5050508061071690612373565b9050610464565b5050505050565b6001600160a01b038181166000908152606660209081526040918290208251606081018452815485168152600190910154938416918101829052600160a01b90930460ff1615159183019190915261079a576040516376bfd6b960e01b81526001600160a01b0383166004820152602401610438565b8251806107ba5760405163251f56a160e21b815260040160405180910390fd5b81516040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156107fd57600080fd5b505afa158015610811573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108359190612070565b835160405163095ea7b360e01b81526001600160a01b0387811660048301526024820184905292935091169063095ea7b390604401602060405180830381600087803b15801561088457600080fd5b505af1158015610898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bc9190611f01565b5060005b82811015610cfa5760008682815181106108ea57634e487b7160e01b600052603260045260246000fd5b602002602001015190506000866001600160a01b03166399fbab88836040518263ffffffff1660e01b815260040161092491815260200190565b60e06040518083038186803b15801561093c57600080fd5b505afa158015610950573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109749190611f94565b6040516327c0b28560e11b8152600481018490529091506000906001600160a01b03891690634f81650a9060240160206040518083038186803b1580156109ba57600080fd5b505afa1580156109ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f29190612070565b905060008760400151610a055730610a0b565b87602001515b604051635fae8b3d60e01b8152600481018690526001600160a01b038083166024830152919250908a1690635fae8b3d90604401600060405180830381600087803b158015610a5957600080fd5b505af1925050508015610a6a575060015b610b3e57610a766123ba565b806308c379a01415610b325750610a8b6123d2565b80610a965750610b34565b6040517f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006020820152603d016040516020818303038152906040528051906020012081604051602001610ae991906120f1565b604051602081830303815290604052805190602001201415610b2c57885160405163112fed8b60e31b81526001600160a01b039091166004820152602401610438565b50610ce5565b505b3d6000803e3d6000fd5b600283516002811115610b6157634e487b7160e01b600052602160045260246000fd5b14610ce5576000610bbf838560200151610b7b91906121af565b8a516001600160a01b039081166000908152606560209081526040918290208251808401909352549283168252600160a01b90920460ff16918101919091526118a1565b90508860400151610c5357602089015160405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018890529091169063095ea7b390604401600060405180830381600087803b158015610c3a57600080fd5b505af1158015610c4e573d6000803e3d6000fd5b505050505b6020890151604051639ef1e4a160e01b81526001600160a01b03918216600482015260248101879052604481018390527f000000000000000000000000000000000000000000000000000000000000000090911690639ef1e4a190606401600060405180830381600087803b158015610ccb57600080fd5b505af1158015610cdf573d6000803e3d6000fd5b50505050505b5050505080610cf390612373565b90506108c0565b50825160405163095ea7b360e01b81526001600160a01b038681166004830152600060248301529091169063095ea7b390604401602060405180830381600087803b158015610d4857600080fd5b505af1158015610d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d809190611f01565b505050505050565b6033546001600160a01b03163314610dd05760405162461bcd60e51b815260206004820181905260248201526000805160206124a98339815191526044820152606401610438565b6001600160a01b0382161580610ded57506001600160a01b038116155b15610e0b5760405163d92e233d60e01b815260040160405180910390fd5b6040518060400160405280826001600160a01b03168152602001826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610e5e57600080fd5b505afa158015610e72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9691906120d7565b60ff9081169091526001600160a01b039384166000908152606560209081526040909120835181549490920151909216600160a01b026001600160a81b03199093169416939093171790915550565b6033546001600160a01b03163314610f2d5760405162461bcd60e51b815260206004820181905260248201526000805160206124a98339815191526044820152606401610438565b6001600160a01b0316600090815260666020526040902080546001600160a01b031916815560010180546001600160a81b0319169055565b6033546001600160a01b03163314610fad5760405162461bcd60e51b815260206004820181905260248201526000805160206124a98339815191526044820152606401610438565b610fb76000611967565b565b6033546001600160a01b031633146110015760405162461bcd60e51b815260206004820181905260248201526000805160206124a98339815191526044820152606401610438565b6001600160a01b038316158061101e57506001600160a01b038216155b1561103c5760405163d92e233d60e01b815260040160405180910390fd5b6040518060600160405280846001600160a01b031663e9cbd8226040518163ffffffff1660e01b815260040160206040518083038186803b15801561108057600080fd5b505afa158015611094573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b89190611d6a565b6001600160a01b039081168252938416602080830191909152921515604091820152938316600090815260668352849020815181549085166001600160a01b0319909116178155918101516001909201805491909401511515600160a01b026001600160a81b03199091169190921617179055565b600054610100900460ff166111485760005460ff161561114c565b303b155b6111af5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610438565b600054610100900460ff161580156111d1576000805461ffff19166101011790555b6111d96119b9565b80156111eb576000805461ff00191690555b50565b6033546001600160a01b031633146112365760405162461bcd60e51b815260206004820181905260248201526000805160206124a98339815191526044820152606401610438565b60005b83518110156112e8576112d583828151811061126557634e487b7160e01b600052603260045260246000fd5b602002602001015183838151811061128d57634e487b7160e01b600052603260045260246000fd5b60200260200101518684815181106112b557634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166119e89092919063ffffffff16565b50806112e081612373565b915050611239565b50505050565b6033546001600160a01b031633146113365760405162461bcd60e51b815260206004820181905260248201526000805160206124a98339815191526044820152606401610438565b6001600160a01b03811661139b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610438565b6111eb81611967565b8051806113c45760405163251f56a160e21b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a7934c3f6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561142157600080fd5b505af1158015611435573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114599190611d6a565b6040516305dbbdaf60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301529190911690630bb77b5e906024016040805180830381600087803b1580156114bd57600080fd5b505af11580156114d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f59190612014565b516040516370a0823160e01b81523060048201529091506000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561155b57600080fd5b505afa15801561156f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115939190612070565b60405163095ea7b360e01b81526001600160a01b038481166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b390604401602060405180830381600087803b15801561160257600080fd5b505af1158015611616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163a9190611f01565b5060005b838110156117fe57600085828151811061166857634e487b7160e01b600052603260045260246000fd5b602002602001015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635fae8b3d826116b46033546001600160a01b031690565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401600060405180830381600087803b1580156116fb57600080fd5b505af192505050801561170c575060015b6117ed576117186123ba565b806308c379a01415610b32575061172d6123d2565b806117385750610b34565b6040517f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006020820152603d01604051602081830303815290604052805190602001208160405160200161178b91906120f1565b6040516020818303038152906040528051906020012014156117eb5760405163112fed8b60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166004820152602401610438565b505b506117f781612373565b905061163e565b5060405163095ea7b360e01b81526001600160a01b038381166004830152600060248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b390604401602060405180830381600087803b15801561186957600080fd5b505af115801561187d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071d9190611f01565b80516000906001600160a01b03166118ba575081611961565b600082600001516001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156118f957600080fd5b505afa15801561190d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119319190612088565b505050915050808360200151600a611949919061222a565b61195390866122d5565b61195d91906121c7565b9150505b92915050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166119e05760405162461bcd60e51b815260040161043890612140565b610fb7611a18565b6060611a0e84848460405180606001604052806029815260200161248060299139611a48565b90505b9392505050565b600054610100900460ff16611a3f5760405162461bcd60e51b815260040161043890612140565b610fb733611967565b606082471015611aa95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610438565b6001600160a01b0385163b611b005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610438565b600080866001600160a01b03168587604051611b1c91906120f1565b60006040518083038185875af1925050503d8060008114611b59576040519150601f19603f3d011682016040523d82523d6000602084013e611b5e565b606091505b5091509150611b6e828286611b79565b979650505050505050565b60608315611b88575081611a11565b825115611b985782518084602001fd5b8160405162461bcd60e51b8152600401610438919061210d565b8051611bbd8161245c565b919050565b6000601f8381840112611bd3578182fd5b82356020611be08261218b565b60408051611bee8382612346565b8481528381019250878401600586901b890185018a1015611c0d578788fd5b875b86811015611ca057813567ffffffffffffffff80821115611c2e578a8bfd5b818c0191508c603f830112611c41578a8bfd5b8782013581811115611c5557611c556123a4565b86519150611c6b818c01601f19168a0183612346565b8082528d87828501011115611c7e578b8cfd5b808784018a840137810188018b90528652509385019390850190600101611c0f565b50909998505050505050505050565b600082601f830112611cbf578081fd5b81356020611ccc8261218b565b604051611cd98282612346565b8381528281019150858301600585901b87018401881015611cf8578586fd5b855b85811015611d1657813584529284019290840190600101611cfa565b5090979650505050505050565b805169ffffffffffffffffffff81168114611bbd57600080fd5b805160ff81168114611bbd57600080fd5b600060208284031215611d5f578081fd5b8135611a118161245c565b600060208284031215611d7b578081fd5b8151611a118161245c565b600080600060608486031215611d9a578182fd5b833567ffffffffffffffff80821115611db1578384fd5b818601915086601f830112611dc4578384fd5b81356020611dd18261218b565b604051611dde8282612346565b8381528281019150858301600585901b870184018c1015611dfd578889fd5b8896505b84871015611e28578035611e148161245c565b835260019690960195918301918301611e01565b5097505087013592505080821115611e3e578384fd5b611e4a87838801611bc2565b93506040860135915080821115611e5f578283fd5b50611e6c86828701611caf565b9150509250925092565b600060208284031215611e87578081fd5b813567ffffffffffffffff811115611e9d578182fd5b611ea984828501611caf565b949350505050565b60008060408385031215611ec3578182fd5b823567ffffffffffffffff811115611ed9578283fd5b611ee585828601611caf565b9250506020830135611ef68161245c565b809150509250929050565b600060208284031215611f12578081fd5b8151611a1181612471565b60008060408385031215611f2f578182fd5b8235611f3a8161245c565b91506020830135611ef68161245c565b600080600060608486031215611f5e578081fd5b8335611f698161245c565b92506020840135611f798161245c565b91506040840135611f8981612471565b809150509250925092565b600060e08284031215611fa5578081fd5b604051611fb181612320565b825160038110611fbf578283fd5b8082525060208301516020820152604083015160408201526060830151606082015260808301516080820152611ff760a08401611bb2565b60a082015261200860c08401611bb2565b60c08201529392505050565b600060408284031215612025578081fd5b6040516040810181811067ffffffffffffffff82111715612048576120486123a4565b60405282516120568161245c565b815261206460208401611d3d565b60208201529392505050565b600060208284031215612081578081fd5b5051919050565b600080600080600060a0868803121561209f578283fd5b6120a886611d23565b94506020860151935060408601519250606086015191506120cb60808701611d23565b90509295509295909350565b6000602082840312156120e8578081fd5b611a1182611d3d565b600082516121038184602087016122f4565b9190910192915050565b602081526000825180602084015261212c8160408501602087016122f4565b601f01601f19169190910160400192915050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600067ffffffffffffffff8211156121a5576121a56123a4565b5060051b60200190565b600082198211156121c2576121c261238e565b500190565b6000826121e257634e487b7160e01b81526012600452602481fd5b500490565b600181815b808511156122225781600019048211156122085761220861238e565b8085161561221557918102915b93841c93908002906121ec565b509250929050565b6000611a1160ff84168360008261224357506001611961565b8161225057506000611961565b816001811461226657600281146122705761228c565b6001915050611961565b60ff8411156122815761228161238e565b50506001821b611961565b5060208310610133831016604e8410600b84101617156122af575081810a611961565b6122b983836121e7565b80600019048211156122cd576122cd61238e565b029392505050565b60008160001904831182151516156122ef576122ef61238e565b500290565b60005b8381101561230f5781810151838201526020016122f7565b838111156112e85750506000910152565b60e0810181811067ffffffffffffffff82111715612340576123406123a4565b60405250565b601f8201601f1916810167ffffffffffffffff8111828210171561236c5761236c6123a4565b6040525050565b60006000198214156123875761238761238e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156123cf57600481823e5160e01c5b90565b600060443d10156123e05790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561241057505050505090565b82850191508151818111156124285750505050505090565b843d87010160208285010111156124425750505050505090565b61245160208286010187612346565b509095945050505050565b6001600160a01b03811681146111eb57600080fd5b80151581146111eb57600080fdfe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c65644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212207d69ac38acb68548fdc6b8c75eaa0cfedbde88415acb233217f9147181d1b0ea64736f6c6343000804003300000000000000000000000052280f10e64a2f866ce49c1da9ce5db1e65c14af00000000000000000000000076a4697389406683e84b4b42fd1bab51e4b8eda2000000000000000000000000821a278dfff762c76410264303f25bf42e195c0c
Deployed Bytecode
0x6080604052600436106100f35760003560e01c80638da5cb5b1161008a578063efbba8ce11610059578063efbba8ce1461033f578063f2fde38b14610352578063f6feddaf14610372578063ff618c07146103a657600080fd5b80638da5cb5b146102155780639164359a14610233578063a833e2fa146102a8578063ad23da891461030b57600080fd5b80636ed848ea116100c65780636ed848ea146101ab578063715018a6146101cb5780637a46ea53146101e05780638129fc1c1461020057600080fd5b80631fe281b8146100f857806333f150af1461011a5780635c38eb3a1461013a57806363779c741461015a575b600080fd5b34801561010457600080fd5b50610118610113366004611eb1565b6103c6565b005b34801561012657600080fd5b50610118610135366004611eb1565b610724565b34801561014657600080fd5b50610118610155366004611f1d565b610d88565b34801561016657600080fd5b5061018e7f00000000000000000000000052280f10e64a2f866ce49c1da9ce5db1e65c14af81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101b757600080fd5b506101186101c6366004611d4e565b610ee5565b3480156101d757600080fd5b50610118610f65565b3480156101ec57600080fd5b506101186101fb366004611f4a565b610fb9565b34801561020c57600080fd5b5061011861112d565b34801561022157600080fd5b506033546001600160a01b031661018e565b34801561023f57600080fd5b5061028061024e366004611d4e565b606660205260009081526040902080546001909101546001600160a01b0391821691811690600160a01b900460ff1683565b604080516001600160a01b0394851681529390921660208401521515908201526060016101a2565b3480156102b457600080fd5b506102ea6102c3366004611d4e565b6065602052600090815260409020546001600160a01b03811690600160a01b900460ff1682565b604080516001600160a01b03909316835260ff9091166020830152016101a2565b34801561031757600080fd5b5061018e7f000000000000000000000000821a278dfff762c76410264303f25bf42e195c0c81565b61011861034d366004611d86565b6111ee565b34801561035e57600080fd5b5061011861036d366004611d4e565b6112ee565b34801561037e57600080fd5b5061018e7f00000000000000000000000076a4697389406683e84b4b42fd1bab51e4b8eda281565b3480156103b257600080fd5b506101186103c1366004611e76565b6113a4565b6001600160a01b038181166000908152606660209081526040918290208251606081018452815485168152600190910154938416918101829052600160a01b90930460ff16151591830191909152610441576040516376bfd6b960e01b81526001600160a01b03831660048201526024015b60405180910390fd5b8251806104615760405163251f56a160e21b815260040160405180910390fd5b60005b8181101561071d57600085828151811061048e57634e487b7160e01b600052603260045260246000fd5b602002602001015190506000856001600160a01b03166399fbab88836040518263ffffffff1660e01b81526004016104c891815260200190565b60e06040518083038186803b1580156104e057600080fd5b505afa1580156104f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105189190611f94565b90506000856040015161052b5730610531565b85602001515b60405163f800467560e01b8152600481018590526001600160a01b0380831660248301529192509088169063f800467590604401600060405180830381600087803b15801561057f57600080fd5b505af1925050508015610590575060015b61059957610709565b606082015186516001600160a01b0390811660009081526065602090815260408083208151808301909252549384168152600160a01b90930460ff1690830152916105e3916118a1565b9050866040015161067757602087015160405163095ea7b360e01b81526001600160a01b037f00000000000000000000000052280f10e64a2f866ce49c1da9ce5db1e65c14af81166004830152602482018790529091169063095ea7b390604401600060405180830381600087803b15801561065e57600080fd5b505af1158015610672573d6000803e3d6000fd5b505050505b6020870151604051639ef1e4a160e01b81526001600160a01b03918216600482015260248101869052604481018390527f00000000000000000000000052280f10e64a2f866ce49c1da9ce5db1e65c14af90911690639ef1e4a190606401600060405180830381600087803b1580156106ef57600080fd5b505af1158015610703573d6000803e3d6000fd5b50505050505b5050508061071690612373565b9050610464565b5050505050565b6001600160a01b038181166000908152606660209081526040918290208251606081018452815485168152600190910154938416918101829052600160a01b90930460ff1615159183019190915261079a576040516376bfd6b960e01b81526001600160a01b0383166004820152602401610438565b8251806107ba5760405163251f56a160e21b815260040160405180910390fd5b81516040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156107fd57600080fd5b505afa158015610811573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108359190612070565b835160405163095ea7b360e01b81526001600160a01b0387811660048301526024820184905292935091169063095ea7b390604401602060405180830381600087803b15801561088457600080fd5b505af1158015610898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bc9190611f01565b5060005b82811015610cfa5760008682815181106108ea57634e487b7160e01b600052603260045260246000fd5b602002602001015190506000866001600160a01b03166399fbab88836040518263ffffffff1660e01b815260040161092491815260200190565b60e06040518083038186803b15801561093c57600080fd5b505afa158015610950573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109749190611f94565b6040516327c0b28560e11b8152600481018490529091506000906001600160a01b03891690634f81650a9060240160206040518083038186803b1580156109ba57600080fd5b505afa1580156109ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f29190612070565b905060008760400151610a055730610a0b565b87602001515b604051635fae8b3d60e01b8152600481018690526001600160a01b038083166024830152919250908a1690635fae8b3d90604401600060405180830381600087803b158015610a5957600080fd5b505af1925050508015610a6a575060015b610b3e57610a766123ba565b806308c379a01415610b325750610a8b6123d2565b80610a965750610b34565b6040517f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006020820152603d016040516020818303038152906040528051906020012081604051602001610ae991906120f1565b604051602081830303815290604052805190602001201415610b2c57885160405163112fed8b60e31b81526001600160a01b039091166004820152602401610438565b50610ce5565b505b3d6000803e3d6000fd5b600283516002811115610b6157634e487b7160e01b600052602160045260246000fd5b14610ce5576000610bbf838560200151610b7b91906121af565b8a516001600160a01b039081166000908152606560209081526040918290208251808401909352549283168252600160a01b90920460ff16918101919091526118a1565b90508860400151610c5357602089015160405163095ea7b360e01b81526001600160a01b037f00000000000000000000000052280f10e64a2f866ce49c1da9ce5db1e65c14af81166004830152602482018890529091169063095ea7b390604401600060405180830381600087803b158015610c3a57600080fd5b505af1158015610c4e573d6000803e3d6000fd5b505050505b6020890151604051639ef1e4a160e01b81526001600160a01b03918216600482015260248101879052604481018390527f00000000000000000000000052280f10e64a2f866ce49c1da9ce5db1e65c14af90911690639ef1e4a190606401600060405180830381600087803b158015610ccb57600080fd5b505af1158015610cdf573d6000803e3d6000fd5b50505050505b5050505080610cf390612373565b90506108c0565b50825160405163095ea7b360e01b81526001600160a01b038681166004830152600060248301529091169063095ea7b390604401602060405180830381600087803b158015610d4857600080fd5b505af1158015610d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d809190611f01565b505050505050565b6033546001600160a01b03163314610dd05760405162461bcd60e51b815260206004820181905260248201526000805160206124a98339815191526044820152606401610438565b6001600160a01b0382161580610ded57506001600160a01b038116155b15610e0b5760405163d92e233d60e01b815260040160405180910390fd5b6040518060400160405280826001600160a01b03168152602001826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610e5e57600080fd5b505afa158015610e72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9691906120d7565b60ff9081169091526001600160a01b039384166000908152606560209081526040909120835181549490920151909216600160a01b026001600160a81b03199093169416939093171790915550565b6033546001600160a01b03163314610f2d5760405162461bcd60e51b815260206004820181905260248201526000805160206124a98339815191526044820152606401610438565b6001600160a01b0316600090815260666020526040902080546001600160a01b031916815560010180546001600160a81b0319169055565b6033546001600160a01b03163314610fad5760405162461bcd60e51b815260206004820181905260248201526000805160206124a98339815191526044820152606401610438565b610fb76000611967565b565b6033546001600160a01b031633146110015760405162461bcd60e51b815260206004820181905260248201526000805160206124a98339815191526044820152606401610438565b6001600160a01b038316158061101e57506001600160a01b038216155b1561103c5760405163d92e233d60e01b815260040160405180910390fd5b6040518060600160405280846001600160a01b031663e9cbd8226040518163ffffffff1660e01b815260040160206040518083038186803b15801561108057600080fd5b505afa158015611094573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b89190611d6a565b6001600160a01b039081168252938416602080830191909152921515604091820152938316600090815260668352849020815181549085166001600160a01b0319909116178155918101516001909201805491909401511515600160a01b026001600160a81b03199091169190921617179055565b600054610100900460ff166111485760005460ff161561114c565b303b155b6111af5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610438565b600054610100900460ff161580156111d1576000805461ffff19166101011790555b6111d96119b9565b80156111eb576000805461ff00191690555b50565b6033546001600160a01b031633146112365760405162461bcd60e51b815260206004820181905260248201526000805160206124a98339815191526044820152606401610438565b60005b83518110156112e8576112d583828151811061126557634e487b7160e01b600052603260045260246000fd5b602002602001015183838151811061128d57634e487b7160e01b600052603260045260246000fd5b60200260200101518684815181106112b557634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166119e89092919063ffffffff16565b50806112e081612373565b915050611239565b50505050565b6033546001600160a01b031633146113365760405162461bcd60e51b815260206004820181905260248201526000805160206124a98339815191526044820152606401610438565b6001600160a01b03811661139b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610438565b6111eb81611967565b8051806113c45760405163251f56a160e21b815260040160405180910390fd5b60007f00000000000000000000000076a4697389406683e84b4b42fd1bab51e4b8eda26001600160a01b031663a7934c3f6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561142157600080fd5b505af1158015611435573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114599190611d6a565b6040516305dbbdaf60e11b81526001600160a01b037f000000000000000000000000821a278dfff762c76410264303f25bf42e195c0c811660048301529190911690630bb77b5e906024016040805180830381600087803b1580156114bd57600080fd5b505af11580156114d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f59190612014565b516040516370a0823160e01b81523060048201529091506000907f000000000000000000000000821a278dfff762c76410264303f25bf42e195c0c6001600160a01b0316906370a082319060240160206040518083038186803b15801561155b57600080fd5b505afa15801561156f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115939190612070565b60405163095ea7b360e01b81526001600160a01b038481166004830152602482018390529192507f000000000000000000000000821a278dfff762c76410264303f25bf42e195c0c9091169063095ea7b390604401602060405180830381600087803b15801561160257600080fd5b505af1158015611616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163a9190611f01565b5060005b838110156117fe57600085828151811061166857634e487b7160e01b600052603260045260246000fd5b602002602001015190507f00000000000000000000000076a4697389406683e84b4b42fd1bab51e4b8eda26001600160a01b0316635fae8b3d826116b46033546001600160a01b031690565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401600060405180830381600087803b1580156116fb57600080fd5b505af192505050801561170c575060015b6117ed576117186123ba565b806308c379a01415610b32575061172d6123d2565b806117385750610b34565b6040517f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006020820152603d01604051602081830303815290604052805190602001208160405160200161178b91906120f1565b6040516020818303038152906040528051906020012014156117eb5760405163112fed8b60e31b81526001600160a01b037f000000000000000000000000821a278dfff762c76410264303f25bf42e195c0c166004820152602401610438565b505b506117f781612373565b905061163e565b5060405163095ea7b360e01b81526001600160a01b038381166004830152600060248301527f000000000000000000000000821a278dfff762c76410264303f25bf42e195c0c169063095ea7b390604401602060405180830381600087803b15801561186957600080fd5b505af115801561187d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071d9190611f01565b80516000906001600160a01b03166118ba575081611961565b600082600001516001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156118f957600080fd5b505afa15801561190d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119319190612088565b505050915050808360200151600a611949919061222a565b61195390866122d5565b61195d91906121c7565b9150505b92915050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166119e05760405162461bcd60e51b815260040161043890612140565b610fb7611a18565b6060611a0e84848460405180606001604052806029815260200161248060299139611a48565b90505b9392505050565b600054610100900460ff16611a3f5760405162461bcd60e51b815260040161043890612140565b610fb733611967565b606082471015611aa95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610438565b6001600160a01b0385163b611b005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610438565b600080866001600160a01b03168587604051611b1c91906120f1565b60006040518083038185875af1925050503d8060008114611b59576040519150601f19603f3d011682016040523d82523d6000602084013e611b5e565b606091505b5091509150611b6e828286611b79565b979650505050505050565b60608315611b88575081611a11565b825115611b985782518084602001fd5b8160405162461bcd60e51b8152600401610438919061210d565b8051611bbd8161245c565b919050565b6000601f8381840112611bd3578182fd5b82356020611be08261218b565b60408051611bee8382612346565b8481528381019250878401600586901b890185018a1015611c0d578788fd5b875b86811015611ca057813567ffffffffffffffff80821115611c2e578a8bfd5b818c0191508c603f830112611c41578a8bfd5b8782013581811115611c5557611c556123a4565b86519150611c6b818c01601f19168a0183612346565b8082528d87828501011115611c7e578b8cfd5b808784018a840137810188018b90528652509385019390850190600101611c0f565b50909998505050505050505050565b600082601f830112611cbf578081fd5b81356020611ccc8261218b565b604051611cd98282612346565b8381528281019150858301600585901b87018401881015611cf8578586fd5b855b85811015611d1657813584529284019290840190600101611cfa565b5090979650505050505050565b805169ffffffffffffffffffff81168114611bbd57600080fd5b805160ff81168114611bbd57600080fd5b600060208284031215611d5f578081fd5b8135611a118161245c565b600060208284031215611d7b578081fd5b8151611a118161245c565b600080600060608486031215611d9a578182fd5b833567ffffffffffffffff80821115611db1578384fd5b818601915086601f830112611dc4578384fd5b81356020611dd18261218b565b604051611dde8282612346565b8381528281019150858301600585901b870184018c1015611dfd578889fd5b8896505b84871015611e28578035611e148161245c565b835260019690960195918301918301611e01565b5097505087013592505080821115611e3e578384fd5b611e4a87838801611bc2565b93506040860135915080821115611e5f578283fd5b50611e6c86828701611caf565b9150509250925092565b600060208284031215611e87578081fd5b813567ffffffffffffffff811115611e9d578182fd5b611ea984828501611caf565b949350505050565b60008060408385031215611ec3578182fd5b823567ffffffffffffffff811115611ed9578283fd5b611ee585828601611caf565b9250506020830135611ef68161245c565b809150509250929050565b600060208284031215611f12578081fd5b8151611a1181612471565b60008060408385031215611f2f578182fd5b8235611f3a8161245c565b91506020830135611ef68161245c565b600080600060608486031215611f5e578081fd5b8335611f698161245c565b92506020840135611f798161245c565b91506040840135611f8981612471565b809150509250925092565b600060e08284031215611fa5578081fd5b604051611fb181612320565b825160038110611fbf578283fd5b8082525060208301516020820152604083015160408201526060830151606082015260808301516080820152611ff760a08401611bb2565b60a082015261200860c08401611bb2565b60c08201529392505050565b600060408284031215612025578081fd5b6040516040810181811067ffffffffffffffff82111715612048576120486123a4565b60405282516120568161245c565b815261206460208401611d3d565b60208201529392505050565b600060208284031215612081578081fd5b5051919050565b600080600080600060a0868803121561209f578283fd5b6120a886611d23565b94506020860151935060408601519250606086015191506120cb60808701611d23565b90509295509295909350565b6000602082840312156120e8578081fd5b611a1182611d3d565b600082516121038184602087016122f4565b9190910192915050565b602081526000825180602084015261212c8160408501602087016122f4565b601f01601f19169190910160400192915050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600067ffffffffffffffff8211156121a5576121a56123a4565b5060051b60200190565b600082198211156121c2576121c261238e565b500190565b6000826121e257634e487b7160e01b81526012600452602481fd5b500490565b600181815b808511156122225781600019048211156122085761220861238e565b8085161561221557918102915b93841c93908002906121ec565b509250929050565b6000611a1160ff84168360008261224357506001611961565b8161225057506000611961565b816001811461226657600281146122705761228c565b6001915050611961565b60ff8411156122815761228161238e565b50506001821b611961565b5060208310610133831016604e8410600b84101617156122af575081810a611961565b6122b983836121e7565b80600019048211156122cd576122cd61238e565b029392505050565b60008160001904831182151516156122ef576122ef61238e565b500290565b60005b8381101561230f5781810151838201526020016122f7565b838111156112e85750506000910152565b60e0810181811067ffffffffffffffff82111715612340576123406123a4565b60405250565b601f8201601f1916810167ffffffffffffffff8111828210171561236c5761236c6123a4565b6040525050565b60006000198214156123875761238761238e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156123cf57600481823e5160e01c5b90565b600060443d10156123e05790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561241057505050505090565b82850191508151818111156124285750505050505090565b843d87010160208285010111156124425750505050505090565b61245160208286010187612346565b509095945050505050565b6001600160a01b03811681146111eb57600080fd5b80151581146111eb57600080fdfe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c65644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212207d69ac38acb68548fdc6b8c75eaa0cfedbde88415acb233217f9147181d1b0ea64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000052280f10e64a2f866ce49c1da9ce5db1e65c14af00000000000000000000000076a4697389406683e84b4b42fd1bab51e4b8eda2000000000000000000000000821a278dfff762c76410264303f25bf42e195c0c
-----Decoded View---------------
Arg [0] : _auction (address): 0x52280f10e64a2F866Ce49C1DA9cE5dB1e65C14af
Arg [1] : _controller (address): 0x76A4697389406683E84B4b42Fd1baB51E4b8EDA2
Arg [2] : _peth (address): 0x821A278dFff762c76410264303F25bF42e195C0C
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000052280f10e64a2f866ce49c1da9ce5db1e65c14af
Arg [1] : 00000000000000000000000076a4697389406683e84b4b42fd1bab51e4b8eda2
Arg [2] : 000000000000000000000000821a278dfff762c76410264303f25bf42e195c0c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.