Overview
S Balance
0 S
S Value
-More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
307784 | 22 days ago | Contract Creation | 0 S |
Loading...
Loading
Contract Name:
RegistryFactory
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2024-12-11 */ // SPDX-License-Identifier: GNU AGPLv3 pragma solidity >=0.8.18 ^0.8.0; // lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // lib/tokenized-strategy-periphery/src/utils/Governance.sol contract Governance { /// @notice Emitted when the governance address is updated. event GovernanceTransferred( address indexed previousGovernance, address indexed newGovernance ); modifier onlyGovernance() { _checkGovernance(); _; } /// @notice Checks if the msg sender is the governance. function _checkGovernance() internal view virtual { require(governance == msg.sender, "!governance"); } /// @notice Address that can set the default base fee and provider address public governance; constructor(address _governance) { governance = _governance; emit GovernanceTransferred(address(0), _governance); } /** * @notice Sets a new address as the governance of the contract. * @dev Throws if the caller is not current governance. * @param _newGovernance The new governance address. */ function transferGovernance( address _newGovernance ) external virtual onlyGovernance { require(_newGovernance != address(0), "ZERO ADDRESS"); address oldGovernance = governance; governance = _newGovernance; emit GovernanceTransferred(oldGovernance, _newGovernance); } } // lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // lib/tokenized-strategy-periphery/src/utils/Governance2Step.sol contract Governance2Step is Governance { /// @notice Emitted when the pending governance address is set. event UpdatePendingGovernance(address indexed newPendingGovernance); /// @notice Address that is set to take over governance. address public pendingGovernance; constructor(address _governance) Governance(_governance) {} /** * @notice Sets a new address as the `pendingGovernance` of the contract. * @dev Throws if the caller is not current governance. * @param _newGovernance The new governance address. */ function transferGovernance( address _newGovernance ) external virtual override onlyGovernance { require(_newGovernance != address(0), "ZERO ADDRESS"); pendingGovernance = _newGovernance; emit UpdatePendingGovernance(_newGovernance); } /** * @notice Allows the `pendingGovernance` to accept the role. */ function acceptGovernance() external virtual { require(msg.sender == pendingGovernance, "!pending governance"); emit GovernanceTransferred(governance, msg.sender); governance = msg.sender; pendingGovernance = address(0); } } // lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC4626.sol) /** * @dev Interface of the ERC4626 "Tokenized Vault Standard", as defined in * https://eips.ethereum.org/EIPS/eip-4626[ERC-4626]. * * _Available since v4.7._ */ interface IERC4626 is IERC20, IERC20Metadata { event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares); event Withdraw( address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares ); /** * @dev Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing. * * - MUST be an ERC-20 token contract. * - MUST NOT revert. */ function asset() external view returns (address assetTokenAddress); /** * @dev Returns the total amount of the underlying asset that is “managed” by Vault. * * - SHOULD include any compounding that occurs from yield. * - MUST be inclusive of any fees that are charged against assets in the Vault. * - MUST NOT revert. */ function totalAssets() external view returns (uint256 totalManagedAssets); /** * @dev Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal * scenario where all the conditions are met. * * - MUST NOT be inclusive of any fees that are charged against assets in the Vault. * - MUST NOT show any variations depending on the caller. * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. * - MUST NOT revert. * * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and * from. */ function convertToShares(uint256 assets) external view returns (uint256 shares); /** * @dev Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal * scenario where all the conditions are met. * * - MUST NOT be inclusive of any fees that are charged against assets in the Vault. * - MUST NOT show any variations depending on the caller. * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. * - MUST NOT revert. * * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and * from. */ function convertToAssets(uint256 shares) external view returns (uint256 assets); /** * @dev Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver, * through a deposit call. * * - MUST return a limited value if receiver is subject to some deposit limit. * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited. * - MUST NOT revert. */ function maxDeposit(address receiver) external view returns (uint256 maxAssets); /** * @dev Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given * current on-chain conditions. * * - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit * call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called * in the same transaction. * - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the * deposit would be accepted, regardless if the user has enough tokens approved, etc. * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. * - MUST NOT revert. * * NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in * share price or some other type of condition, meaning the depositor will lose assets by depositing. */ function previewDeposit(uint256 assets) external view returns (uint256 shares); /** * @dev Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens. * * - MUST emit the Deposit event. * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the * deposit execution, and are accounted for during deposit. * - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not * approving enough underlying tokens to the Vault contract, etc). * * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. */ function deposit(uint256 assets, address receiver) external returns (uint256 shares); /** * @dev Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call. * - MUST return a limited value if receiver is subject to some mint limit. * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted. * - MUST NOT revert. */ function maxMint(address receiver) external view returns (uint256 maxShares); /** * @dev Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given * current on-chain conditions. * * - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call * in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the * same transaction. * - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint * would be accepted, regardless if the user has enough tokens approved, etc. * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. * - MUST NOT revert. * * NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in * share price or some other type of condition, meaning the depositor will lose assets by minting. */ function previewMint(uint256 shares) external view returns (uint256 assets); /** * @dev Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens. * * - MUST emit the Deposit event. * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint * execution, and are accounted for during mint. * - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not * approving enough underlying tokens to the Vault contract, etc). * * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. */ function mint(uint256 shares, address receiver) external returns (uint256 assets); /** * @dev Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the * Vault, through a withdraw call. * * - MUST return a limited value if owner is subject to some withdrawal limit or timelock. * - MUST NOT revert. */ function maxWithdraw(address owner) external view returns (uint256 maxAssets); /** * @dev Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block, * given current on-chain conditions. * * - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw * call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if * called * in the same transaction. * - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though * the withdrawal would be accepted, regardless if the user has enough shares, etc. * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. * - MUST NOT revert. * * NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in * share price or some other type of condition, meaning the depositor will lose assets by depositing. */ function previewWithdraw(uint256 assets) external view returns (uint256 shares); /** * @dev Burns shares from owner and sends exactly assets of underlying tokens to receiver. * * - MUST emit the Withdraw event. * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the * withdraw execution, and are accounted for during withdraw. * - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner * not having enough shares, etc). * * Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed. * Those methods should be performed separately. */ function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares); /** * @dev Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault, * through a redeem call. * * - MUST return a limited value if owner is subject to some withdrawal limit or timelock. * - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock. * - MUST NOT revert. */ function maxRedeem(address owner) external view returns (uint256 maxShares); /** * @dev Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block, * given current on-chain conditions. * * - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call * in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the * same transaction. * - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the * redemption would be accepted, regardless if the user has enough shares, etc. * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. * - MUST NOT revert. * * NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in * share price or some other type of condition, meaning the depositor will lose assets by redeeming. */ function previewRedeem(uint256 shares) external view returns (uint256 assets); /** * @dev Burns exactly shares from owner and sends assets of underlying tokens to receiver. * * - MUST emit the Withdraw event. * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the * redeem execution, and are accounted for during redeem. * - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner * not having enough shares, etc). * * NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed. * Those methods should be performed separately. */ function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets); } // src/registry/ReleaseRegistry.sol interface IFactory { function apiVersion() external view returns (string memory); } interface ITokenizedStrategy { function apiVersion() external view returns (string memory); } /** * @title YearnV3 Release Registry * @author yearn.finance * @notice * Used by Yearn Governance to track on chain all * releases of the V3 vaults by API Version. */ contract ReleaseRegistry is Governance2Step { event NewRelease( uint256 indexed releaseId, address indexed factory, address indexed tokenizedStrategy, string apiVersion ); string public constant name = "Yearn V3 Release Registry"; // The total number of releases that have been deployed uint256 public numReleases; // Mapping of release id starting at 0 to the address // of the corresponding factory for that release. mapping(uint256 => address) public factories; // Mapping of release id starting at 0 to the address // of the corresponding Tokenized Strategy for that release. mapping(uint256 => address) public tokenizedStrategies; // Mapping of the API version for a specific release to the // place in the order it was released. mapping(string => uint256) public releaseTargets; constructor(address _governance) Governance2Step(_governance) {} /** * @notice Returns the latest factory. * @return The address of the factory for the latest release. */ function latestFactory() external view virtual returns (address) { uint256 _numReleases = numReleases; if (_numReleases == 0) return address(0); return factories[numReleases - 1]; } /** * @notice Returns the latest tokenized strategy. * @return The address of the tokenized strategy for the latest release. */ function latestTokenizedStrategy() external view virtual returns (address) { uint256 _numReleases = numReleases; if (_numReleases == 0) return address(0); return tokenizedStrategies[numReleases - 1]; } /** * @notice Returns the api version of the latest release. * @return The api version of the latest release. */ function latestRelease() external view virtual returns (string memory) { uint256 _numReleases = numReleases; if (_numReleases == 0) return ""; return IFactory(factories[numReleases - 1]).apiVersion(); } /** * @notice Issue a new release using a deployed factory. * @dev Stores the factory address in `factories` and the release * target in `releaseTargets` with its associated API version. * * Throws if caller isn't `governance`. * Throws if the api version is the same as the previous release. * Throws if the factory does not have the same api version as the tokenized strategy. * Emits a `NewRelease` event. * * @param _factory The factory that will be used create new vaults. */ function newRelease( address _factory, address _tokenizedStrategy ) external virtual onlyGovernance { // Check if the release is different from the current one uint256 releaseId = numReleases; string memory apiVersion = IFactory(_factory).apiVersion(); string memory tokenizedStrategyApiVersion = ITokenizedStrategy( _tokenizedStrategy ).apiVersion(); require( keccak256(bytes(apiVersion)) == keccak256(bytes(tokenizedStrategyApiVersion)), "ReleaseRegistry: api version mismatch" ); if (releaseId > 0) { // Make sure this isn't the same as the last one require( keccak256( bytes(IFactory(factories[releaseId - 1]).apiVersion()) ) != keccak256(bytes(apiVersion)), "ReleaseRegistry: same api version" ); } // Update latest release. factories[releaseId] = _factory; tokenizedStrategies[releaseId] = _tokenizedStrategy; // Set the api to the target. releaseTargets[apiVersion] = releaseId; // Increase our number of releases. numReleases = releaseId + 1; // Log the release for external listeners emit NewRelease(releaseId, _factory, _tokenizedStrategy, apiVersion); } } // lib/yearn-vaults-v3/contracts/interfaces/IVault.sol interface IVault is IERC4626 { // STRATEGY EVENTS event StrategyChanged(address indexed strategy, uint256 change_type); event StrategyReported( address indexed strategy, uint256 gain, uint256 loss, uint256 current_debt, uint256 protocol_fees, uint256 total_fees, uint256 total_refunds ); // DEBT MANAGEMENT EVENTS event DebtUpdated( address indexed strategy, uint256 current_debt, uint256 new_debt ); // ROLE UPDATES event RoleSet(address indexed account, uint256 role); event UpdateRoleManager(address indexed role_manager); event UpdateAccountant(address indexed accountant); event UpdateDefaultQueue(address[] new_default_queue); event UpdateUseDefaultQueue(bool use_default_queue); event UpdatedMaxDebtForStrategy( address indexed sender, address indexed strategy, uint256 new_debt ); event UpdateAutoAllocate(bool auto_allocate); event UpdateDepositLimit(uint256 deposit_limit); event UpdateMinimumTotalIdle(uint256 minimum_total_idle); event UpdateProfitMaxUnlockTime(uint256 profit_max_unlock_time); event DebtPurchased(address indexed strategy, uint256 amount); event Shutdown(); struct StrategyParams { uint256 activation; uint256 last_report; uint256 current_debt; uint256 max_debt; } function FACTORY() external view returns (uint256); function strategies(address) external view returns (StrategyParams memory); function default_queue(uint256) external view returns (address); function use_default_queue() external view returns (bool); function auto_allocate() external view returns (bool); function minimum_total_idle() external view returns (uint256); function deposit_limit() external view returns (uint256); function deposit_limit_module() external view returns (address); function withdraw_limit_module() external view returns (address); function accountant() external view returns (address); function roles(address) external view returns (uint256); function role_manager() external view returns (address); function future_role_manager() external view returns (address); function isShutdown() external view returns (bool); function nonces(address) external view returns (uint256); function initialize( address, string memory, string memory, address, uint256 ) external; function setName(string memory) external; function setSymbol(string memory) external; function set_accountant(address new_accountant) external; function set_default_queue(address[] memory new_default_queue) external; function set_use_default_queue(bool) external; function set_auto_allocate(bool) external; function set_deposit_limit(uint256 deposit_limit) external; function set_deposit_limit( uint256 deposit_limit, bool should_override ) external; function set_deposit_limit_module( address new_deposit_limit_module ) external; function set_deposit_limit_module( address new_deposit_limit_module, bool should_override ) external; function set_withdraw_limit_module( address new_withdraw_limit_module ) external; function set_minimum_total_idle(uint256 minimum_total_idle) external; function setProfitMaxUnlockTime( uint256 new_profit_max_unlock_time ) external; function set_role(address account, uint256 role) external; function add_role(address account, uint256 role) external; function remove_role(address account, uint256 role) external; function transfer_role_manager(address role_manager) external; function accept_role_manager() external; function unlockedShares() external view returns (uint256); function pricePerShare() external view returns (uint256); function get_default_queue() external view returns (address[] memory); function process_report( address strategy ) external returns (uint256, uint256); function buy_debt(address strategy, uint256 amount) external; function add_strategy(address new_strategy) external; function revoke_strategy(address strategy) external; function force_revoke_strategy(address strategy) external; function update_max_debt_for_strategy( address strategy, uint256 new_max_debt ) external; function update_debt( address strategy, uint256 target_debt ) external returns (uint256); function update_debt( address strategy, uint256 target_debt, uint256 max_loss ) external returns (uint256); function shutdown_vault() external; function totalIdle() external view returns (uint256); function totalDebt() external view returns (uint256); function apiVersion() external view returns (string memory); function assess_share_of_unrealised_losses( address strategy, uint256 assets_needed ) external view returns (uint256); function profitMaxUnlockTime() external view returns (uint256); function fullProfitUnlockDate() external view returns (uint256); function profitUnlockingRate() external view returns (uint256); function lastProfitUpdate() external view returns (uint256); //// NON-STANDARD ERC-4626 FUNCTIONS \\\\ function withdraw( uint256 assets, address receiver, address owner, uint256 max_loss ) external returns (uint256); function withdraw( uint256 assets, address receiver, address owner, uint256 max_loss, address[] memory strategies ) external returns (uint256); function redeem( uint256 shares, address receiver, address owner, uint256 max_loss ) external returns (uint256); function redeem( uint256 shares, address receiver, address owner, uint256 max_loss, address[] memory strategies ) external returns (uint256); function maxWithdraw( address owner, uint256 max_loss ) external view returns (uint256); function maxWithdraw( address owner, uint256 max_loss, address[] memory strategies ) external view returns (uint256); function maxRedeem( address owner, uint256 max_loss ) external view returns (uint256); function maxRedeem( address owner, uint256 max_loss, address[] memory strategies ) external view returns (uint256); //// NON-STANDARD ERC-20 FUNCTIONS \\\\ function DOMAIN_SEPARATOR() external view returns (bytes32); function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external returns (bool); } // src/registry/Registry.sol interface IVaultFactory { function deploy_new_vault( address asset, string memory name, string memory symbol, address role_manager, uint256 profit_max_unlock_time ) external returns (address); function apiVersion() external view returns (string memory); } /** * @title YearnV3 Registry * @author yearn.finance * @notice * Serves as an on chain registry to track any Yearn V3 * vaults and strategies that a certain party wants to * endorse. * * Can also be used to deploy new vaults of any specific * API version. */ contract Registry is Governance { /// @notice Emitted when a new vault is deployed or added. event NewEndorsedVault( address indexed vault, address indexed asset, uint256 releaseVersion, uint256 vaultType ); /// @notice Emitted when a vault is removed. event RemovedVault( address indexed vault, address indexed asset, uint256 releaseVersion, uint256 vaultType ); /// @notice Emitted when a vault is tagged with a string. event VaultTagged(address indexed vault); /// @notice Emitted when gov adds ore removes a `tagger`. event UpdateTagger(address indexed account, bool status); /// @notice Emitted when gov adds ore removes a `endorser`. event UpdateEndorser(address indexed account, bool status); /// @notice Can only be gov or an `endorser`. modifier onlyEndorsers() { _isEndorser(); _; } /// @notice Can only be gov or a `tagger`. modifier onlyTaggers() { _isTagger(); _; } /// @notice Check is gov or an `endorser`. function _isEndorser() internal view { require(msg.sender == governance || endorsers[msg.sender], "!endorser"); } /// @notice Check is gov or a `tagger`. function _isTagger() internal view { require(msg.sender == governance || taggers[msg.sender], "!tagger"); } // Struct stored for every endorsed vault or strategy for // off chain use to easily retrieve info. struct Info { // The token thats being used. address asset; // The release number corresponding to the release registries version. uint96 releaseVersion; // Type of vault. uint64 vaultType; // Time when the vault was deployed for easier indexing. uint128 deploymentTimestamp; // Index the vault is at in array for easy removals. uint64 index; // String so that management can tag a vault with any info for FE's. string tag; } // Address used to get the specific versions from. address public immutable releaseRegistry; // Default type used for Multi strategy "Allocator" vaults. uint256 public constant MULTI_STRATEGY_TYPE = 1; // Default type used for Single "Tokenized" Strategy vaults. uint256 public constant SINGLE_STRATEGY_TYPE = 2; // Custom name for this Registry. string public name; // Old version of the registry to fall back to if exists. address public legacyRegistry; // Mapping for any address that is allowed to tag a vault. mapping(address => bool) public taggers; // Mapping for any address that is allowed to deploy or endorse. mapping(address => bool) public endorsers; // vault/strategy address => Info struct. mapping(address => Info) public vaultInfo; // Mapping to check if a specific `asset` has a vault. mapping(address => bool) public assetIsUsed; // asset => array of all endorsed vaults. mapping(address => address[]) internal _endorsedVaults; // Array of all tokens used as the underlying. address[] public assets; /** * @param _governance Address to set as owner of the Registry. * @param _name The custom string for this custom registry to be called. * @param _releaseRegistry The Permissionless releaseRegistry to deploy vaults through. */ constructor( address _governance, string memory _name, address _releaseRegistry ) Governance(_governance) { // Set name. name = _name; // Set releaseRegistry. releaseRegistry = _releaseRegistry; } /** * @notice Returns the total number of assets being used as the underlying. * @return The amount of assets. */ function numAssets() external view virtual returns (uint256) { return assets.length; } /** * @notice Get the full array of tokens being used. * @return The full array of underlying tokens being used/. */ function getAssets() external view virtual returns (address[] memory) { return assets; } /** * @notice The amount of endorsed vaults for a specific token. * @return The amount of endorsed vaults. */ function numEndorsedVaults( address _asset ) public view virtual returns (uint256) { return _endorsedVaults[_asset].length; } /** * @notice Get the array of vaults endorsed for an `_asset`. * @param _asset The underlying token used by the vaults. * @return The endorsed vaults. */ function getEndorsedVaults( address _asset ) external view virtual returns (address[] memory) { return _endorsedVaults[_asset]; } /** * @notice Get all endorsed vaults deployed using the Registry. * @dev This will return a nested array of all vaults deployed * separated by their underlying asset. * * This is only meant for off chain viewing and should not be used during any * on chain tx's. * * @return allEndorsedVaults A nested array containing all vaults. */ function getAllEndorsedVaults() external view virtual returns (address[][] memory allEndorsedVaults) { address[] memory allAssets = assets; uint256 length = assets.length; allEndorsedVaults = new address[][](length); for (uint256 i; i < length; ++i) { allEndorsedVaults[i] = _endorsedVaults[allAssets[i]]; } } /** * @notice Check if a vault is endorsed in this registry. * @dev This will check if the `asset` variable in the struct has been * set for an easy external view check. * @param _vault Address of the vault to check. * @return . The vaults endorsement status. */ function isEndorsed(address _vault) external view virtual returns (bool) { return vaultInfo[_vault].asset != address(0) || isLegacyVault(_vault); } /** * @notice Check if a vault is endorsed in the legacy registry. * @param _vault The vault to check. * @return True if the vault is endorsed in the legacy registry, false otherwise. */ function isLegacyVault(address _vault) public view virtual returns (bool) { address _legacy = legacyRegistry; if (_legacy == address(0)) return false; return Registry(_legacy).isEndorsed(_vault); } /** * @notice * Create and endorse a new multi strategy "Allocator" * vault and endorse it in this registry. * @dev * Throws if caller isn't `owner`. * Throws if no releases are registered yet. * Emits a `NewEndorsedVault` event. * @param _asset The asset that may be deposited into the new Vault. * @param _name Specify a custom Vault name. . * @param _symbol Specify a custom Vault symbol name. * @param _roleManager The address authorized for guardian interactions in the new Vault. * @param _profitMaxUnlockTime The time strategy profits will unlock over. * @return _vault address of the newly-deployed vault */ function newEndorsedVault( address _asset, string memory _name, string memory _symbol, address _roleManager, uint256 _profitMaxUnlockTime ) public virtual returns (address _vault) { return newEndorsedVault( _asset, _name, _symbol, _roleManager, _profitMaxUnlockTime, 0 // Default to latest version. ); } /** * @notice * Create and endorse a new multi strategy "Allocator" * vault and endorse it in this registry. * @dev * Throws if caller isn't `owner`. * Throws if no releases are registered yet. * Emits a `NewEndorsedVault` event. * @param _asset The asset that may be deposited into the new Vault. * @param _name Specify a custom Vault name. . * @param _symbol Specify a custom Vault symbol name. * @param _roleManager The address authorized for guardian interactions in the new Vault. * @param _profitMaxUnlockTime The time strategy profits will unlock over. * @param _releaseDelta The number of releases prior to the latest to use as a target. NOTE: Set to 0 for latest. * @return _vault address of the newly-deployed vault */ function newEndorsedVault( address _asset, string memory _name, string memory _symbol, address _roleManager, uint256 _profitMaxUnlockTime, uint256 _releaseDelta ) public virtual onlyEndorsers returns (address _vault) { // Get the target release based on the delta given. uint256 _releaseTarget = ReleaseRegistry(releaseRegistry) .numReleases() - 1 - _releaseDelta; // Get the factory address for that specific Api version. address factory = ReleaseRegistry(releaseRegistry).factories( _releaseTarget ); // Make sure we got an actual factory require(factory != address(0), "Registry: unknown release"); // Deploy New vault. _vault = IVaultFactory(factory).deploy_new_vault( _asset, _name, _symbol, _roleManager, _profitMaxUnlockTime ); // Register the vault with this Registry _registerVault( _vault, _asset, _releaseTarget, MULTI_STRATEGY_TYPE, block.timestamp ); } /** * @notice Endorse an already deployed multi strategy vault. * @dev To be used with default values for `_releaseDelta`, `_vaultType` * and `_deploymentTimestamp`. * * @param _vault Address of the vault to endorse. */ function endorseMultiStrategyVault(address _vault) external virtual { endorseVault(_vault, 0, MULTI_STRATEGY_TYPE, 0); } /** * @notice Endorse an already deployed Single Strategy vault. * @dev To be used with default values for `_releaseDelta`, `_vaultType` * and `_deploymentTimestamp`. * * @param _vault Address of the vault to endorse. */ function endorseSingleStrategyVault(address _vault) external virtual { endorseVault(_vault, 0, SINGLE_STRATEGY_TYPE, 0); } /** * @notice * Adds an existing vault to the list of "endorsed" vaults for that asset. * @dev * Throws if caller isn't `owner`. * Throws if no releases are registered yet. * Throws if `vault`'s api version does not match the release specified. * Emits a `NewEndorsedVault` event. * @param _vault The vault that will be endorsed by the Registry. * @param _releaseDelta Specify the number of releases prior to the latest to use as a target. * @param _vaultType Type of vault to endorse. * @param _deploymentTimestamp The timestamp of when the vault was deployed for FE use. */ function endorseVault( address _vault, uint256 _releaseDelta, uint256 _vaultType, uint256 _deploymentTimestamp ) public virtual onlyEndorsers { // Cannot endorse twice. require(vaultInfo[_vault].asset == address(0), "endorsed"); require(_vaultType != 0, "no 0 type"); require(_vaultType <= type(uint128).max, "type too high"); require(_deploymentTimestamp <= block.timestamp, "!deployment time"); // Will underflow if no releases created yet, or targeting prior to release history uint256 _releaseTarget = ReleaseRegistry(releaseRegistry) .numReleases() - 1 - _releaseDelta; // dev: no releases // Get the API version for the target specified string memory apiVersion = IVaultFactory( ReleaseRegistry(releaseRegistry).factories(_releaseTarget) ).apiVersion(); require( keccak256(bytes(IVault(_vault).apiVersion())) == keccak256(bytes((apiVersion))), "Wrong API Version" ); // Add to the end of the list of vaults for asset _registerVault( _vault, IVault(_vault).asset(), _releaseTarget, _vaultType, _deploymentTimestamp ); } /** * @dev Function used to register a newly deployed or added vault. * * This well set all of the values for the vault in the `vaultInfo` * mapping as well as add the vault and the underlying asset to any * relevant arrays for tracking. * */ function _registerVault( address _vault, address _asset, uint256 _releaseTarget, uint256 _vaultType, uint256 _deploymentTimestamp ) internal virtual { // Set the Info struct for this vault vaultInfo[_vault] = Info({ asset: _asset, releaseVersion: uint96(_releaseTarget), vaultType: uint64(_vaultType), deploymentTimestamp: uint128(_deploymentTimestamp), index: uint64(_endorsedVaults[_asset].length), tag: "" }); // Add to the endorsed vaults array. _endorsedVaults[_asset].push(_vault); if (!assetIsUsed[_asset]) { // We have a new asset to add assets.push(_asset); assetIsUsed[_asset] = true; } emit NewEndorsedVault(_vault, _asset, _releaseTarget, _vaultType); } /** * @notice Tag a vault with a specific string. * @dev This is available to governance to tag any vault or strategy * on chain if desired to arbitrarily classify any vaults. * i.e. Certain ratings ("A") / Vault status ("Shutdown") etc. * * @param _vault Address of the vault or strategy to tag. * @param _tag The string to tag the vault or strategy with. */ function tagVault( address _vault, string memory _tag ) external virtual onlyTaggers { require(vaultInfo[_vault].asset != address(0), "!Endorsed"); vaultInfo[_vault].tag = _tag; emit VaultTagged(_vault); } /** * @notice Remove a `_vault`. * @dev Can be used as an efficient way to remove a vault * to not have to iterate over the full array. * * NOTE: This will not remove the asset from the `assets` array * if it is no longer in use and will have to be done manually. * * @param _vault Address of the vault to remove. */ function removeVault(address _vault) external virtual onlyEndorsers { // Get the struct with all the vaults data. Info memory info = vaultInfo[_vault]; require(info.asset != address(0), "!endorsed"); require( _endorsedVaults[info.asset][info.index] == _vault, "wrong vault" ); // Get the vault at the end of the array address lastVault = _endorsedVaults[info.asset][ _endorsedVaults[info.asset].length - 1 ]; // If `_vault` is not the last item in the array. if (lastVault != _vault) { // Set the last index to the spot we are removing. _endorsedVaults[info.asset][info.index] = lastVault; // Update the index of the vault we moved vaultInfo[lastVault].index = uint64(info.index); } // Pop the last item off the array. _endorsedVaults[info.asset].pop(); // Emit the event. emit RemovedVault( _vault, info.asset, info.releaseVersion, info.vaultType ); // Delete the struct. delete vaultInfo[_vault]; } /** * @notice Removes a specific `_asset` at `_index` from `assets`. * @dev Can be used if an asset is no longer in use after a vault or * strategy has also been removed. * * @param _asset The asset to remove from the array. * @param _index The index it sits at. */ function removeAsset( address _asset, uint256 _index ) external virtual onlyEndorsers { require(assetIsUsed[_asset], "!in use"); require(_endorsedVaults[_asset].length == 0, "still in use"); require(assets[_index] == _asset, "wrong asset"); // Replace `_asset` with the last index. assets[_index] = assets[assets.length - 1]; // Pop last item off the array. assets.pop(); // No longer used. assetIsUsed[_asset] = false; } /** * @notice Set a new address to be able to endorse or remove an existing endorser. * @param _account The address to set. * @param _canEndorse Bool if the `_account` can or cannot endorse. */ function setEndorser( address _account, bool _canEndorse ) external virtual onlyGovernance { endorsers[_account] = _canEndorse; emit UpdateEndorser(_account, _canEndorse); } /** * @notice Set a new address to be able to tag a vault. * @param _account The address to set. * @param _canTag Bool if the `_account` can or cannot tag. */ function setTagger( address _account, bool _canTag ) external virtual onlyGovernance { taggers[_account] = _canTag; emit UpdateTagger(_account, _canTag); } /** * @notice Set a legacy registry if one exists. * @param _legacyRegistry The address of the legacy registry. */ function setLegacyRegistry( address _legacyRegistry ) external virtual onlyGovernance { legacyRegistry = _legacyRegistry; } } // src/registry/RegistryFactory.sol /** * @title YearnV3 Registry Factory * @author yearn.finance * @notice * Factory for anyone to easily deploy their own Registry. */ contract RegistryFactory { event NewRegistry( address indexed newRegistry, address indexed governance, string name ); // The release registry to use for all Registries. address public immutable releaseRegistry; constructor(address _releaseRegistry) { releaseRegistry = _releaseRegistry; } function name() external pure virtual returns (string memory) { return "Yearn V3 Vault Registry Factory"; } /** * @notice Deploy a new Registry. * @dev Default to msg.sender for governance. * @param _name The name of the new registry. * @return Address of the new Registry. */ function createNewRegistry( string memory _name ) external virtual returns (address) { return createNewRegistry(_name, msg.sender); } /** * @notice Deploy a new Registry. * @param _name The name of the new registry. * @param _governance Address to set as governance. * @return Address of the new Registry. */ function createNewRegistry( string memory _name, address _governance ) public virtual returns (address) { Registry newRegistry = new Registry( _governance, _name, releaseRegistry ); emit NewRegistry(address(newRegistry), _governance, _name); return address(newRegistry); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_releaseRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRegistry","type":"address"},{"indexed":true,"internalType":"address","name":"governance","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NewRegistry","type":"event"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_governance","type":"address"}],"name":"createNewRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"createNewRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"releaseRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a060405234801561001057600080fd5b50604051612b97380380612b9783398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b608051612b0661009160003960008181609e01526101050152612b066000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806306fdde031461005157806319ee073e1461009957806396b60f51146100d8578063e2eb36ee146100eb575b600080fd5b604080518082018252601f81527f596561726e205633205661756c7420526567697374727920466163746f727900602082015290516100909190610212565b60405180910390f35b6100c07f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610090565b6100c06100e63660046102cf565b6100fe565b6100c06100f936600461032d565b6101ad565b60008082847f0000000000000000000000000000000000000000000000000000000000000000604051610130906101bf565b61013c9392919061036a565b604051809103906000f080158015610158573d6000803e3d6000fd5b509050826001600160a01b0316816001600160a01b03167f9ae0c36b9499b323d42aa4b4f00f0fb81394b12086a416e9fdf8e9889e40a2f88660405161019e9190610212565b60405180910390a39392505050565b60006101b982336100fe565b92915050565b612731806103a083390190565b6000815180845260005b818110156101f2576020818501810151868301820152016101d6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061022560208301846101cc565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261025357600080fd5b813567ffffffffffffffff8082111561026e5761026e61022c565b604051601f8301601f19908116603f011681019082821181831017156102965761029661022c565b816040528381528660208588010111156102af57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080604083850312156102e257600080fd5b823567ffffffffffffffff8111156102f957600080fd5b61030585828601610242565b92505060208301356001600160a01b038116811461032257600080fd5b809150509250929050565b60006020828403121561033f57600080fd5b813567ffffffffffffffff81111561035657600080fd5b61036284828501610242565b949350505050565b600060018060a01b0380861683526060602084015261038c60608401866101cc565b915080841660408401525094935050505056fe60a06040523480156200001157600080fd5b5060405162002731380380620027318339810160408190526200003491620000d4565b600080546001600160a01b0319166001600160a01b03851690811782556040518592907f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce80908290a35060016200008b83826200025e565b506001600160a01b0316608052506200032a9050565b80516001600160a01b0381168114620000b957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080600060608486031215620000ea57600080fd5b620000f584620000a1565b602085810151919450906001600160401b03808211156200011557600080fd5b818701915087601f8301126200012a57600080fd5b8151818111156200013f576200013f620000be565b604051601f8201601f19908116603f011681019083821181831017156200016a576200016a620000be565b816040528281528a868487010111156200018357600080fd5b600093505b82841015620001a7578484018601518185018701529285019262000188565b6000868483010152809750505050505050620001c660408501620000a1565b90509250925092565b600181811c90821680620001e457607f821691505b6020821081036200020557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200025957600081815260208120601f850160051c81016020861015620002345750805b601f850160051c820191505b81811015620002555782815560010162000240565b5050505b505050565b81516001600160401b038111156200027a576200027a620000be565b62000292816200028b8454620001cf565b846200020b565b602080601f831160018114620002ca5760008415620002b15750858301515b600019600386901b1c1916600185901b17855562000255565b600085815260208120601f198616915b82811015620002fb57888601518255948401946001909101908401620002da565b50858210156200031a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6080516123cf620003626000396000818161026b01528181610b5d01528181610c1501528181610e930152610f4b01526123cf6000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806370df8ba711610104578063a4fc5922116100a2578063ceb68c2311610071578063ceb68c231461045f578063cf35bdd014610472578063d38bfff414610485578063da1281dd1461049857600080fd5b8063a4fc5922146103ed578063ac01762a14610400578063ae8c9d1314610423578063b2c6161c1461043657600080fd5b80639164359a116100de5780639164359a146103a557806398a5e07b146103ca578063a237e94d146103d2578063a46fe83b146103e557600080fd5b806370df8ba71461036a5780637be7b20b1461037f57806389c6acec1461039257600080fd5b80632aa59c921161017c5780635aa6e6751161014b5780635aa6e675146103195780635b25d2c81461032c57806360bd68f81461034f57806367e4ac2c1461036257600080fd5b80632aa59c92146102a05780632c2a72d5146102b35780633515a20b146102c657806353d2e949146102f957600080fd5b806317bdd312116101b857806317bdd3121461022557806318d1dd831461025057806319ee073e146102665780632317ef671461028d57600080fd5b806306fdde03146101df5780630ab322d9146101fd5780630f7872cc14610212575b600080fd5b6101e76104ab565b6040516101f49190611c47565b60405180910390f35b61021061020b366004611c6f565b610539565b005b610210610220366004611c6f565b61054b565b610238610233366004611d4f565b61055a565b6040516001600160a01b0390911681526020016101f4565b610258600181565b6040519081526020016101f4565b6102387f000000000000000000000000000000000000000000000000000000000000000081565b61021061029b366004611ddf565b610575565b6102106102ae366004611e19565b610769565b6102106102c1366004611e19565b6107d1565b6102e96102d4366004611c6f565b60046020526000908152604090205460ff1681565b60405190151581526020016101f4565b61030c610307366004611c6f565b610831565b6040516101f49190611e52565b600054610238906001600160a01b031681565b6102e961033a366004611c6f565b60036020526000908152604090205460ff1681565b61021061035d366004611e9f565b6108a7565b61030c610960565b6103726109c2565b6040516101f49190611eee565b61023861038d366004611f81565b610b4c565b6102106103a036600461201b565b610d6b565b6103b86103b3366004611c6f565b611149565b6040516101f496959493929190612056565b610258600281565b6102e96103e0366004611c6f565b611236565b600854610258565b6102106103fb366004611c6f565b61126a565b6102e961040e366004611c6f565b60066020526000908152604090205460ff1681565b600254610238906001600160a01b031681565b610258610444366004611c6f565b6001600160a01b031660009081526007602052604090205490565b61021061046d366004611c6f565b611294565b6102386104803660046120bb565b61168a565b610210610493366004611c6f565b6116b4565b6102e96104a6366004611c6f565b611751565b600180546104b8906120d4565b80601f01602080910402602001604051908101604052809291908181526020018280546104e4906120d4565b80156105315780601f1061050657610100808354040283529160200191610531565b820191906000526020600020905b81548152906001019060200180831161051457829003601f168201915b505050505081565b61054881600060016000610d6b565b50565b61054881600060026000610d6b565b600061056b86868686866000610b4c565b9695505050505050565b61057d6117df565b6001600160a01b03821660009081526006602052604090205460ff166105d45760405162461bcd60e51b815260206004820152600760248201526621696e2075736560c81b60448201526064015b60405180910390fd5b6001600160a01b038216600090815260076020526040902054156106295760405162461bcd60e51b815260206004820152600c60248201526b7374696c6c20696e2075736560a01b60448201526064016105cb565b816001600160a01b0316600882815481106106465761064661210e565b6000918252602090912001546001600160a01b0316146106965760405162461bcd60e51b815260206004820152600b60248201526a1ddc9bdb99c8185cdcd95d60aa1b60448201526064016105cb565b600880546106a69060019061213a565b815481106106b6576106b661210e565b600091825260209091200154600880546001600160a01b0390921691839081106106e2576106e261210e565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060088054806107215761072161214d565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0393909316815260069092525060409020805460ff19169055565b610771611841565b6001600160a01b038216600081815260036020908152604091829020805460ff191685151590811790915591519182527fcd202ea0907016dd42e40faedc5cf5c3e6368644993f46c95990dfa7f84bfaa991015b60405180910390a25050565b6107d9611841565b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915591519182527fc93ec0e3c82bbe3866d85f7d0915cda166df7c76944b9fae88bcf11608f791bf91016107c5565b6001600160a01b03811660009081526007602090815260409182902080548351818402810184019094528084526060939283018282801561089b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161087d575b50505050509050919050565b6108af611889565b6001600160a01b03828116600090815260056020526040902054166109025760405162461bcd60e51b815260206004820152600960248201526808515b991bdc9cd95960ba1b60448201526064016105cb565b6001600160a01b038216600090815260056020526040902060020161092782826121ae565b506040516001600160a01b038316907f9831985c7ff4c3d7dbd921d753150cc58a3a2a21c93795bbaac5bbf32baab3bb90600090a25050565b606060088054806020026020016040519081016040528092919081815260200182805480156109b857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161099a575b5050505050905090565b606060006008805480602002602001604051908101604052809291908181526020018280548015610a1c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109fe575b505060085493945083925050506001600160401b03811115610a4057610a40611c8c565b604051908082528060200260200182016040528015610a7357816020015b6060815260200190600190039081610a5e5790505b50925060005b81811015610b465760076000848381518110610a9757610a9761210e565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610b1357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610af5575b5050505050848281518110610b2a57610b2a61210e565b602002602001018190525080610b3f9061226d565b9050610a79565b50505090565b6000610b566117df565b60008260017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356e0a94b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdd9190612286565b610be7919061213a565b610bf1919061213a565b6040516319c8e0f160e21b8152600481018290529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063672383c490602401602060405180830381865afa158015610c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c80919061229f565b90506001600160a01b038116610cd85760405162461bcd60e51b815260206004820152601960248201527f52656769737472793a20756e6b6e6f776e2072656c656173650000000000000060448201526064016105cb565b60405163b4aeee7760e01b81526001600160a01b0382169063b4aeee7790610d0c908c908c908c908c908c906004016122bc565b6020604051808303816000875af1158015610d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4f919061229f565b9250610d5f838a846001426118e7565b50509695505050505050565b610d736117df565b6001600160a01b038481166000908152600560205260409020541615610dc65760405162461bcd60e51b8152602060048201526008602482015267195b991bdc9cd95960c21b60448201526064016105cb565b81600003610e025760405162461bcd60e51b81526020600482015260096024820152686e6f2030207479706560b81b60448201526064016105cb565b6001600160801b03821115610e495760405162461bcd60e51b815260206004820152600d60248201526c0e8f2e0ca40e8dede40d0d2ced609b1b60448201526064016105cb565b42811115610e8c5760405162461bcd60e51b815260206004820152601060248201526f216465706c6f796d656e742074696d6560801b60448201526064016105cb565b60008360017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356e0a94b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f139190612286565b610f1d919061213a565b610f27919061213a565b6040516319c8e0f160e21b8152600481018290529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063672383c490602401602060405180830381865afa158015610f92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb6919061229f565b6001600160a01b031663258294106040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ff3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261101b9190810190612306565b90508080519060200120866001600160a01b031663258294106040518163ffffffff1660e01b8152600401600060405180830381865afa158015611063573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261108b9190810190612306565b80519060200120146110d35760405162461bcd60e51b81526020600482015260116024820152702bb937b7339020a824902b32b939b4b7b760791b60448201526064016105cb565b61114186876001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611139919061229f565b8487876118e7565b505050505050565b6005602052600090815260409020805460018201546002830180546001600160a01b03841694600160a01b9094046001600160601b0316936001600160401b0380851694600160401b81046001600160801b031694600160c01b909104909116926111b3906120d4565b80601f01602080910402602001604051908101604052809291908181526020018280546111df906120d4565b801561122c5780601f106112015761010080835404028352916020019161122c565b820191906000526020600020905b81548152906001019060200180831161120f57829003601f168201915b5050505050905086565b6001600160a01b03818116600090815260056020526040812054909116151580611264575061126482611751565b92915050565b611272611841565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61129c6117df565b6001600160a01b038181166000908152600560209081526040808320815160c08101835281549586168152600160a01b9095046001600160601b03169285019290925260018201546001600160401b0380821692860192909252600160401b81046001600160801b03166060860152600160c01b900416608084015260028101805492939260a084019190611330906120d4565b80601f016020809104026020016040519081016040528092919081815260200182805461135c906120d4565b80156113a95780601f1061137e576101008083540402835291602001916113a9565b820191906000526020600020905b81548152906001019060200180831161138c57829003601f168201915b5050509190925250508151919250506001600160a01b03166113f95760405162461bcd60e51b815260206004820152600960248201526808595b991bdc9cd95960ba1b60448201526064016105cb565b80516001600160a01b03908116600090815260076020526040902060808301518154928516926001600160401b039091169081106114395761143961210e565b6000918252602090912001546001600160a01b0316146114895760405162461bcd60e51b815260206004820152600b60248201526a1ddc9bdb99c81d985d5b1d60aa1b60448201526064016105cb565b80516001600160a01b03908116600090815260076020526040808220845190931682528120549091906114be9060019061213a565b815481106114ce576114ce61210e565b6000918252602090912001546001600160a01b0390811691508316811461158d5781516001600160a01b03166000908152600760205260409020608083015181548392916001600160401b031690811061152a5761152a61210e565b6000918252602080832090910180546001600160a01b039485166001600160a01b031990911617905560808501519284168252600590526040902060010180546001600160401b03909216600160c01b026001600160c01b039092169190911790555b81516001600160a01b031660009081526007602052604090208054806115b5576115b561214d565b6001900381819060005260206000200160006101000a8154906001600160a01b030219169055905581600001516001600160a01b0316836001600160a01b03167fb8d23ba050f8f00e22675f82cf3786ade63b12a46d4ea236927baf4d173c30928460200151856040015160405161164b9291906001600160601b039290921682526001600160401b0316602082015260400190565b60405180910390a36001600160a01b038316600090815260056020526040812081815560018101829055906116836002830182611ba9565b5050505050565b6008818154811061169a57600080fd5b6000918252602090912001546001600160a01b0316905081565b6116bc611841565b6001600160a01b0381166117015760405162461bcd60e51b815260206004820152600c60248201526b5a45524f204144445245535360a01b60448201526064016105cb565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce809190a35050565b6002546000906001600160a01b03168061176e5750600092915050565b60405163a237e94d60e01b81526001600160a01b03848116600483015282169063a237e94d90602401602060405180830381865afa1580156117b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d8919061237c565b9392505050565b6000546001600160a01b031633148061180757503360009081526004602052604090205460ff165b61183f5760405162461bcd60e51b815260206004820152600960248201526810b2b73237b939b2b960b91b60448201526064016105cb565b565b6000546001600160a01b0316331461183f5760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b60448201526064016105cb565b6000546001600160a01b03163314806118b157503360009081526003602052604090205460ff165b61183f5760405162461bcd60e51b815260206004820152600760248201526610ba30b3b3b2b960c91b60448201526064016105cb565b6040518060c00160405280856001600160a01b03168152602001846001600160601b03168152602001836001600160401b03168152602001826001600160801b0316815260200160076000876001600160a01b03166001600160a01b03168152602001908152602001600020805490506001600160401b031681526020016040518060200160405280600081525081525060056000876001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a8154816001600160601b0302191690836001600160601b0316021790555060408201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160010160086101000a8154816001600160801b0302191690836001600160801b0316021790555060808201518160010160186101000a8154816001600160401b0302191690836001600160401b0316021790555060a0820151816002019081611a9391906121ae565b5050506001600160a01b03848116600081815260076020908152604080832080546001810182559084528284200180546001600160a01b031916958b16959095179094559181526006909152205460ff16611b4c576008805460018082019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0387169081179091556000908152600660205260409020805460ff191690911790555b836001600160a01b0316856001600160a01b03167fa9a7c68f108b706e545bc75ac8590730afa49f639d2e48f367105c9801c18fd28585604051611b9a929190918252602082015260400190565b60405180910390a35050505050565b508054611bb5906120d4565b6000825580601f10611bc5575050565b601f01602090049060005260206000209081019061054891905b80821115611bf35760008155600101611bdf565b5090565b60005b83811015611c12578181015183820152602001611bfa565b50506000910152565b60008151808452611c33816020860160208601611bf7565b601f01601f19169290920160200192915050565b6020815260006117d86020830184611c1b565b6001600160a01b038116811461054857600080fd5b600060208284031215611c8157600080fd5b81356117d881611c5a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611cca57611cca611c8c565b604052919050565b60006001600160401b03821115611ceb57611ceb611c8c565b50601f01601f191660200190565b600082601f830112611d0a57600080fd5b8135611d1d611d1882611cd2565b611ca2565b818152846020838601011115611d3257600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611d6757600080fd5b8535611d7281611c5a565b945060208601356001600160401b0380821115611d8e57600080fd5b611d9a89838a01611cf9565b95506040880135915080821115611db057600080fd5b50611dbd88828901611cf9565b9350506060860135611dce81611c5a565b949793965091946080013592915050565b60008060408385031215611df257600080fd5b8235611dfd81611c5a565b946020939093013593505050565b801515811461054857600080fd5b60008060408385031215611e2c57600080fd5b8235611e3781611c5a565b91506020830135611e4781611e0b565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015611e935783516001600160a01b031683529284019291840191600101611e6e565b50909695505050505050565b60008060408385031215611eb257600080fd5b8235611ebd81611c5a565b915060208301356001600160401b03811115611ed857600080fd5b611ee485828601611cf9565b9150509250929050565b6000602080830181845280855180835260408601915060408160051b87010192508387016000805b83811015611f7357888603603f19018552825180518088529088019088880190845b81811015611f5d5783516001600160a01b03168352928a0192918a0191600101611f38565b5090975050509386019391860191600101611f16565b509398975050505050505050565b60008060008060008060c08789031215611f9a57600080fd5b8635611fa581611c5a565b955060208701356001600160401b0380821115611fc157600080fd5b611fcd8a838b01611cf9565b96506040890135915080821115611fe357600080fd5b50611ff089828a01611cf9565b945050606087013561200181611c5a565b9598949750929560808101359460a0909101359350915050565b6000806000806080858703121561203157600080fd5b843561203c81611c5a565b966020860135965060408601359560600135945092505050565b6001600160a01b03871681526001600160601b03861660208201526001600160401b0385811660408301526001600160801b03851660608301528316608082015260c060a082018190526000906120af90830184611c1b565b98975050505050505050565b6000602082840312156120cd57600080fd5b5035919050565b600181811c908216806120e857607f821691505b60208210810361210857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561126457611264612124565b634e487b7160e01b600052603160045260246000fd5b601f8211156121a957600081815260208120601f850160051c8101602086101561218a5750805b601f850160051c820191505b8181101561114157828155600101612196565b505050565b81516001600160401b038111156121c7576121c7611c8c565b6121db816121d584546120d4565b84612163565b602080601f83116001811461221057600084156121f85750858301515b600019600386901b1c1916600185901b178555611141565b600085815260208120601f198616915b8281101561223f57888601518255948401946001909101908401612220565b508582101561225d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001820161227f5761227f612124565b5060010190565b60006020828403121561229857600080fd5b5051919050565b6000602082840312156122b157600080fd5b81516117d881611c5a565b600060018060a01b03808816835260a060208401526122de60a0840188611c1b565b83810360408501526122f08188611c1b565b9590911660608401525050608001529392505050565b60006020828403121561231857600080fd5b81516001600160401b0381111561232e57600080fd5b8201601f8101841361233f57600080fd5b805161234d611d1882611cd2565b81815285602083850101111561236257600080fd5b612373826020830160208601611bf7565b95945050505050565b60006020828403121561238e57600080fd5b81516117d881611e0b56fea264697066735822122032af84f44144191d21bfedf6440b7cf6f688c01398754784981243c95a2c111a64736f6c63430008120033a2646970667358221220b15951fbf73993d8fac7d1e564873394bbc12f5b11309fc973db08216e1c36c364736f6c634300081200330000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f7198
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806306fdde031461005157806319ee073e1461009957806396b60f51146100d8578063e2eb36ee146100eb575b600080fd5b604080518082018252601f81527f596561726e205633205661756c7420526567697374727920466163746f727900602082015290516100909190610212565b60405180910390f35b6100c07f0000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f719881565b6040516001600160a01b039091168152602001610090565b6100c06100e63660046102cf565b6100fe565b6100c06100f936600461032d565b6101ad565b60008082847f0000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f7198604051610130906101bf565b61013c9392919061036a565b604051809103906000f080158015610158573d6000803e3d6000fd5b509050826001600160a01b0316816001600160a01b03167f9ae0c36b9499b323d42aa4b4f00f0fb81394b12086a416e9fdf8e9889e40a2f88660405161019e9190610212565b60405180910390a39392505050565b60006101b982336100fe565b92915050565b612731806103a083390190565b6000815180845260005b818110156101f2576020818501810151868301820152016101d6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061022560208301846101cc565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261025357600080fd5b813567ffffffffffffffff8082111561026e5761026e61022c565b604051601f8301601f19908116603f011681019082821181831017156102965761029661022c565b816040528381528660208588010111156102af57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080604083850312156102e257600080fd5b823567ffffffffffffffff8111156102f957600080fd5b61030585828601610242565b92505060208301356001600160a01b038116811461032257600080fd5b809150509250929050565b60006020828403121561033f57600080fd5b813567ffffffffffffffff81111561035657600080fd5b61036284828501610242565b949350505050565b600060018060a01b0380861683526060602084015261038c60608401866101cc565b915080841660408401525094935050505056fe60a06040523480156200001157600080fd5b5060405162002731380380620027318339810160408190526200003491620000d4565b600080546001600160a01b0319166001600160a01b03851690811782556040518592907f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce80908290a35060016200008b83826200025e565b506001600160a01b0316608052506200032a9050565b80516001600160a01b0381168114620000b957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080600060608486031215620000ea57600080fd5b620000f584620000a1565b602085810151919450906001600160401b03808211156200011557600080fd5b818701915087601f8301126200012a57600080fd5b8151818111156200013f576200013f620000be565b604051601f8201601f19908116603f011681019083821181831017156200016a576200016a620000be565b816040528281528a868487010111156200018357600080fd5b600093505b82841015620001a7578484018601518185018701529285019262000188565b6000868483010152809750505050505050620001c660408501620000a1565b90509250925092565b600181811c90821680620001e457607f821691505b6020821081036200020557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200025957600081815260208120601f850160051c81016020861015620002345750805b601f850160051c820191505b81811015620002555782815560010162000240565b5050505b505050565b81516001600160401b038111156200027a576200027a620000be565b62000292816200028b8454620001cf565b846200020b565b602080601f831160018114620002ca5760008415620002b15750858301515b600019600386901b1c1916600185901b17855562000255565b600085815260208120601f198616915b82811015620002fb57888601518255948401946001909101908401620002da565b50858210156200031a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6080516123cf620003626000396000818161026b01528181610b5d01528181610c1501528181610e930152610f4b01526123cf6000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806370df8ba711610104578063a4fc5922116100a2578063ceb68c2311610071578063ceb68c231461045f578063cf35bdd014610472578063d38bfff414610485578063da1281dd1461049857600080fd5b8063a4fc5922146103ed578063ac01762a14610400578063ae8c9d1314610423578063b2c6161c1461043657600080fd5b80639164359a116100de5780639164359a146103a557806398a5e07b146103ca578063a237e94d146103d2578063a46fe83b146103e557600080fd5b806370df8ba71461036a5780637be7b20b1461037f57806389c6acec1461039257600080fd5b80632aa59c921161017c5780635aa6e6751161014b5780635aa6e675146103195780635b25d2c81461032c57806360bd68f81461034f57806367e4ac2c1461036257600080fd5b80632aa59c92146102a05780632c2a72d5146102b35780633515a20b146102c657806353d2e949146102f957600080fd5b806317bdd312116101b857806317bdd3121461022557806318d1dd831461025057806319ee073e146102665780632317ef671461028d57600080fd5b806306fdde03146101df5780630ab322d9146101fd5780630f7872cc14610212575b600080fd5b6101e76104ab565b6040516101f49190611c47565b60405180910390f35b61021061020b366004611c6f565b610539565b005b610210610220366004611c6f565b61054b565b610238610233366004611d4f565b61055a565b6040516001600160a01b0390911681526020016101f4565b610258600181565b6040519081526020016101f4565b6102387f000000000000000000000000000000000000000000000000000000000000000081565b61021061029b366004611ddf565b610575565b6102106102ae366004611e19565b610769565b6102106102c1366004611e19565b6107d1565b6102e96102d4366004611c6f565b60046020526000908152604090205460ff1681565b60405190151581526020016101f4565b61030c610307366004611c6f565b610831565b6040516101f49190611e52565b600054610238906001600160a01b031681565b6102e961033a366004611c6f565b60036020526000908152604090205460ff1681565b61021061035d366004611e9f565b6108a7565b61030c610960565b6103726109c2565b6040516101f49190611eee565b61023861038d366004611f81565b610b4c565b6102106103a036600461201b565b610d6b565b6103b86103b3366004611c6f565b611149565b6040516101f496959493929190612056565b610258600281565b6102e96103e0366004611c6f565b611236565b600854610258565b6102106103fb366004611c6f565b61126a565b6102e961040e366004611c6f565b60066020526000908152604090205460ff1681565b600254610238906001600160a01b031681565b610258610444366004611c6f565b6001600160a01b031660009081526007602052604090205490565b61021061046d366004611c6f565b611294565b6102386104803660046120bb565b61168a565b610210610493366004611c6f565b6116b4565b6102e96104a6366004611c6f565b611751565b600180546104b8906120d4565b80601f01602080910402602001604051908101604052809291908181526020018280546104e4906120d4565b80156105315780601f1061050657610100808354040283529160200191610531565b820191906000526020600020905b81548152906001019060200180831161051457829003601f168201915b505050505081565b61054881600060016000610d6b565b50565b61054881600060026000610d6b565b600061056b86868686866000610b4c565b9695505050505050565b61057d6117df565b6001600160a01b03821660009081526006602052604090205460ff166105d45760405162461bcd60e51b815260206004820152600760248201526621696e2075736560c81b60448201526064015b60405180910390fd5b6001600160a01b038216600090815260076020526040902054156106295760405162461bcd60e51b815260206004820152600c60248201526b7374696c6c20696e2075736560a01b60448201526064016105cb565b816001600160a01b0316600882815481106106465761064661210e565b6000918252602090912001546001600160a01b0316146106965760405162461bcd60e51b815260206004820152600b60248201526a1ddc9bdb99c8185cdcd95d60aa1b60448201526064016105cb565b600880546106a69060019061213a565b815481106106b6576106b661210e565b600091825260209091200154600880546001600160a01b0390921691839081106106e2576106e261210e565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060088054806107215761072161214d565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0393909316815260069092525060409020805460ff19169055565b610771611841565b6001600160a01b038216600081815260036020908152604091829020805460ff191685151590811790915591519182527fcd202ea0907016dd42e40faedc5cf5c3e6368644993f46c95990dfa7f84bfaa991015b60405180910390a25050565b6107d9611841565b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915591519182527fc93ec0e3c82bbe3866d85f7d0915cda166df7c76944b9fae88bcf11608f791bf91016107c5565b6001600160a01b03811660009081526007602090815260409182902080548351818402810184019094528084526060939283018282801561089b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161087d575b50505050509050919050565b6108af611889565b6001600160a01b03828116600090815260056020526040902054166109025760405162461bcd60e51b815260206004820152600960248201526808515b991bdc9cd95960ba1b60448201526064016105cb565b6001600160a01b038216600090815260056020526040902060020161092782826121ae565b506040516001600160a01b038316907f9831985c7ff4c3d7dbd921d753150cc58a3a2a21c93795bbaac5bbf32baab3bb90600090a25050565b606060088054806020026020016040519081016040528092919081815260200182805480156109b857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161099a575b5050505050905090565b606060006008805480602002602001604051908101604052809291908181526020018280548015610a1c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109fe575b505060085493945083925050506001600160401b03811115610a4057610a40611c8c565b604051908082528060200260200182016040528015610a7357816020015b6060815260200190600190039081610a5e5790505b50925060005b81811015610b465760076000848381518110610a9757610a9761210e565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610b1357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610af5575b5050505050848281518110610b2a57610b2a61210e565b602002602001018190525080610b3f9061226d565b9050610a79565b50505090565b6000610b566117df565b60008260017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356e0a94b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdd9190612286565b610be7919061213a565b610bf1919061213a565b6040516319c8e0f160e21b8152600481018290529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063672383c490602401602060405180830381865afa158015610c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c80919061229f565b90506001600160a01b038116610cd85760405162461bcd60e51b815260206004820152601960248201527f52656769737472793a20756e6b6e6f776e2072656c656173650000000000000060448201526064016105cb565b60405163b4aeee7760e01b81526001600160a01b0382169063b4aeee7790610d0c908c908c908c908c908c906004016122bc565b6020604051808303816000875af1158015610d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4f919061229f565b9250610d5f838a846001426118e7565b50509695505050505050565b610d736117df565b6001600160a01b038481166000908152600560205260409020541615610dc65760405162461bcd60e51b8152602060048201526008602482015267195b991bdc9cd95960c21b60448201526064016105cb565b81600003610e025760405162461bcd60e51b81526020600482015260096024820152686e6f2030207479706560b81b60448201526064016105cb565b6001600160801b03821115610e495760405162461bcd60e51b815260206004820152600d60248201526c0e8f2e0ca40e8dede40d0d2ced609b1b60448201526064016105cb565b42811115610e8c5760405162461bcd60e51b815260206004820152601060248201526f216465706c6f796d656e742074696d6560801b60448201526064016105cb565b60008360017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356e0a94b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f139190612286565b610f1d919061213a565b610f27919061213a565b6040516319c8e0f160e21b8152600481018290529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063672383c490602401602060405180830381865afa158015610f92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb6919061229f565b6001600160a01b031663258294106040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ff3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261101b9190810190612306565b90508080519060200120866001600160a01b031663258294106040518163ffffffff1660e01b8152600401600060405180830381865afa158015611063573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261108b9190810190612306565b80519060200120146110d35760405162461bcd60e51b81526020600482015260116024820152702bb937b7339020a824902b32b939b4b7b760791b60448201526064016105cb565b61114186876001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611139919061229f565b8487876118e7565b505050505050565b6005602052600090815260409020805460018201546002830180546001600160a01b03841694600160a01b9094046001600160601b0316936001600160401b0380851694600160401b81046001600160801b031694600160c01b909104909116926111b3906120d4565b80601f01602080910402602001604051908101604052809291908181526020018280546111df906120d4565b801561122c5780601f106112015761010080835404028352916020019161122c565b820191906000526020600020905b81548152906001019060200180831161120f57829003601f168201915b5050505050905086565b6001600160a01b03818116600090815260056020526040812054909116151580611264575061126482611751565b92915050565b611272611841565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61129c6117df565b6001600160a01b038181166000908152600560209081526040808320815160c08101835281549586168152600160a01b9095046001600160601b03169285019290925260018201546001600160401b0380821692860192909252600160401b81046001600160801b03166060860152600160c01b900416608084015260028101805492939260a084019190611330906120d4565b80601f016020809104026020016040519081016040528092919081815260200182805461135c906120d4565b80156113a95780601f1061137e576101008083540402835291602001916113a9565b820191906000526020600020905b81548152906001019060200180831161138c57829003601f168201915b5050509190925250508151919250506001600160a01b03166113f95760405162461bcd60e51b815260206004820152600960248201526808595b991bdc9cd95960ba1b60448201526064016105cb565b80516001600160a01b03908116600090815260076020526040902060808301518154928516926001600160401b039091169081106114395761143961210e565b6000918252602090912001546001600160a01b0316146114895760405162461bcd60e51b815260206004820152600b60248201526a1ddc9bdb99c81d985d5b1d60aa1b60448201526064016105cb565b80516001600160a01b03908116600090815260076020526040808220845190931682528120549091906114be9060019061213a565b815481106114ce576114ce61210e565b6000918252602090912001546001600160a01b0390811691508316811461158d5781516001600160a01b03166000908152600760205260409020608083015181548392916001600160401b031690811061152a5761152a61210e565b6000918252602080832090910180546001600160a01b039485166001600160a01b031990911617905560808501519284168252600590526040902060010180546001600160401b03909216600160c01b026001600160c01b039092169190911790555b81516001600160a01b031660009081526007602052604090208054806115b5576115b561214d565b6001900381819060005260206000200160006101000a8154906001600160a01b030219169055905581600001516001600160a01b0316836001600160a01b03167fb8d23ba050f8f00e22675f82cf3786ade63b12a46d4ea236927baf4d173c30928460200151856040015160405161164b9291906001600160601b039290921682526001600160401b0316602082015260400190565b60405180910390a36001600160a01b038316600090815260056020526040812081815560018101829055906116836002830182611ba9565b5050505050565b6008818154811061169a57600080fd5b6000918252602090912001546001600160a01b0316905081565b6116bc611841565b6001600160a01b0381166117015760405162461bcd60e51b815260206004820152600c60248201526b5a45524f204144445245535360a01b60448201526064016105cb565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce809190a35050565b6002546000906001600160a01b03168061176e5750600092915050565b60405163a237e94d60e01b81526001600160a01b03848116600483015282169063a237e94d90602401602060405180830381865afa1580156117b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d8919061237c565b9392505050565b6000546001600160a01b031633148061180757503360009081526004602052604090205460ff165b61183f5760405162461bcd60e51b815260206004820152600960248201526810b2b73237b939b2b960b91b60448201526064016105cb565b565b6000546001600160a01b0316331461183f5760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b60448201526064016105cb565b6000546001600160a01b03163314806118b157503360009081526003602052604090205460ff165b61183f5760405162461bcd60e51b815260206004820152600760248201526610ba30b3b3b2b960c91b60448201526064016105cb565b6040518060c00160405280856001600160a01b03168152602001846001600160601b03168152602001836001600160401b03168152602001826001600160801b0316815260200160076000876001600160a01b03166001600160a01b03168152602001908152602001600020805490506001600160401b031681526020016040518060200160405280600081525081525060056000876001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a8154816001600160601b0302191690836001600160601b0316021790555060408201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160010160086101000a8154816001600160801b0302191690836001600160801b0316021790555060808201518160010160186101000a8154816001600160401b0302191690836001600160401b0316021790555060a0820151816002019081611a9391906121ae565b5050506001600160a01b03848116600081815260076020908152604080832080546001810182559084528284200180546001600160a01b031916958b16959095179094559181526006909152205460ff16611b4c576008805460018082019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0387169081179091556000908152600660205260409020805460ff191690911790555b836001600160a01b0316856001600160a01b03167fa9a7c68f108b706e545bc75ac8590730afa49f639d2e48f367105c9801c18fd28585604051611b9a929190918252602082015260400190565b60405180910390a35050505050565b508054611bb5906120d4565b6000825580601f10611bc5575050565b601f01602090049060005260206000209081019061054891905b80821115611bf35760008155600101611bdf565b5090565b60005b83811015611c12578181015183820152602001611bfa565b50506000910152565b60008151808452611c33816020860160208601611bf7565b601f01601f19169290920160200192915050565b6020815260006117d86020830184611c1b565b6001600160a01b038116811461054857600080fd5b600060208284031215611c8157600080fd5b81356117d881611c5a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611cca57611cca611c8c565b604052919050565b60006001600160401b03821115611ceb57611ceb611c8c565b50601f01601f191660200190565b600082601f830112611d0a57600080fd5b8135611d1d611d1882611cd2565b611ca2565b818152846020838601011115611d3257600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611d6757600080fd5b8535611d7281611c5a565b945060208601356001600160401b0380821115611d8e57600080fd5b611d9a89838a01611cf9565b95506040880135915080821115611db057600080fd5b50611dbd88828901611cf9565b9350506060860135611dce81611c5a565b949793965091946080013592915050565b60008060408385031215611df257600080fd5b8235611dfd81611c5a565b946020939093013593505050565b801515811461054857600080fd5b60008060408385031215611e2c57600080fd5b8235611e3781611c5a565b91506020830135611e4781611e0b565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015611e935783516001600160a01b031683529284019291840191600101611e6e565b50909695505050505050565b60008060408385031215611eb257600080fd5b8235611ebd81611c5a565b915060208301356001600160401b03811115611ed857600080fd5b611ee485828601611cf9565b9150509250929050565b6000602080830181845280855180835260408601915060408160051b87010192508387016000805b83811015611f7357888603603f19018552825180518088529088019088880190845b81811015611f5d5783516001600160a01b03168352928a0192918a0191600101611f38565b5090975050509386019391860191600101611f16565b509398975050505050505050565b60008060008060008060c08789031215611f9a57600080fd5b8635611fa581611c5a565b955060208701356001600160401b0380821115611fc157600080fd5b611fcd8a838b01611cf9565b96506040890135915080821115611fe357600080fd5b50611ff089828a01611cf9565b945050606087013561200181611c5a565b9598949750929560808101359460a0909101359350915050565b6000806000806080858703121561203157600080fd5b843561203c81611c5a565b966020860135965060408601359560600135945092505050565b6001600160a01b03871681526001600160601b03861660208201526001600160401b0385811660408301526001600160801b03851660608301528316608082015260c060a082018190526000906120af90830184611c1b565b98975050505050505050565b6000602082840312156120cd57600080fd5b5035919050565b600181811c908216806120e857607f821691505b60208210810361210857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561126457611264612124565b634e487b7160e01b600052603160045260246000fd5b601f8211156121a957600081815260208120601f850160051c8101602086101561218a5750805b601f850160051c820191505b8181101561114157828155600101612196565b505050565b81516001600160401b038111156121c7576121c7611c8c565b6121db816121d584546120d4565b84612163565b602080601f83116001811461221057600084156121f85750858301515b600019600386901b1c1916600185901b178555611141565b600085815260208120601f198616915b8281101561223f57888601518255948401946001909101908401612220565b508582101561225d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001820161227f5761227f612124565b5060010190565b60006020828403121561229857600080fd5b5051919050565b6000602082840312156122b157600080fd5b81516117d881611c5a565b600060018060a01b03808816835260a060208401526122de60a0840188611c1b565b83810360408501526122f08188611c1b565b9590911660608401525050608001529392505050565b60006020828403121561231857600080fd5b81516001600160401b0381111561232e57600080fd5b8201601f8101841361233f57600080fd5b805161234d611d1882611cd2565b81815285602083850101111561236257600080fd5b612373826020830160208601611bf7565b95945050505050565b60006020828403121561238e57600080fd5b81516117d881611e0b56fea264697066735822122032af84f44144191d21bfedf6440b7cf6f688c01398754784981243c95a2c111a64736f6c63430008120033a2646970667358221220b15951fbf73993d8fac7d1e564873394bbc12f5b11309fc973db08216e1c36c364736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f7198
-----Decoded View---------------
Arg [0] : _releaseRegistry (address): 0x0377b4daDDA86C89A0091772B79ba67d0E5F7198
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f7198
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.