Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Governa... | 19072583 | 319 days ago | IN | 0 ETH | 0.0002674 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
19072527 | 319 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
Registry
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-01-23 */ // SPDX-License-Identifier: GNU AGPLv3 pragma solidity 0.8.18; 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); } } interface IFactory { 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 Governance { event NewRelease( uint256 indexed releaseId, address indexed factory, 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 the API version for a specific release to the // place in the order it was released. mapping(string => uint256) public releaseTargets; constructor(address _governance) Governance(_governance) {} /** * @notice Returns the latest factory. * @dev Throws if no releases are registered yet. * @return The address of the factory for the latest release. */ function latestFactory() external view virtual returns (address) { return factories[numReleases - 1]; } /** * @notice Returns the api version of the latest release. * @dev Throws if no releases are registered yet. * @return The api version of the latest release. */ function latestRelease() external view virtual returns (string memory) { return IFactory(factories[numReleases - 1]).apiVersion(); // dev: no release } /** * @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. * Emits a `NewRelease` event. * * @param _factory The factory that will be used create new vaults. */ function newRelease(address _factory) external virtual onlyGovernance { // Check if the release is different from the current one uint256 releaseId = numReleases; string memory apiVersion = IFactory(_factory).apiVersion(); 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; // 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, apiVersion); } } // OpenZeppelin Contracts (last updated v4.8.0) (interfaces/IERC4626.sol) // OpenZeppelin Contracts (last updated v4.6.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); } // 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); } /** * @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); } 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 RoleStatusChanged(uint256 role, uint256 status); 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 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 total_supply() external view returns (uint256); 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 open_roles(uint256) external view returns (bool); 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 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_deposit_limit(uint256 deposit_limit) external; function set_deposit_limit_module( address new_deposit_limit_module ) 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 set_open_role(uint256 role) external; function close_open_role(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 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 increaseAllowance( address spender, uint256 amount ) external returns (bool); function decreaseAllowance( address spender, uint256 amount ) external returns (bool); 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); } 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 * 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 which 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; // 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); } /** * @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); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_governance","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_releaseRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousGovernance","type":"address"},{"indexed":true,"internalType":"address","name":"newGovernance","type":"address"}],"name":"GovernanceTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"releaseVersion","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vaultType","type":"uint256"}],"name":"NewEndorsedVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"releaseVersion","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vaultType","type":"uint256"}],"name":"RemovedVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"UpdateEndorser","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"UpdateTagger","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"}],"name":"VaultTagged","type":"event"},{"inputs":[],"name":"MULTI_STRATEGY_TYPE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SINGLE_STRATEGY_TYPE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"assetIsUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"assets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"endorseMultiStrategyVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"endorseSingleStrategyVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint256","name":"_releaseDelta","type":"uint256"},{"internalType":"uint256","name":"_vaultType","type":"uint256"},{"internalType":"uint256","name":"_deploymentTimestamp","type":"uint256"}],"name":"endorseVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"endorsers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllEndorsedVaults","outputs":[{"internalType":"address[][]","name":"allEndorsedVaults","type":"address[][]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAssets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"}],"name":"getEndorsedVaults","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"isEndorsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_roleManager","type":"address"},{"internalType":"uint256","name":"_profitMaxUnlockTime","type":"uint256"}],"name":"newEndorsedVault","outputs":[{"internalType":"address","name":"_vault","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_roleManager","type":"address"},{"internalType":"uint256","name":"_profitMaxUnlockTime","type":"uint256"},{"internalType":"uint256","name":"_releaseDelta","type":"uint256"}],"name":"newEndorsedVault","outputs":[{"internalType":"address","name":"_vault","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"numAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"}],"name":"numEndorsedVaults","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"releaseRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"removeAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"removeVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_canEndorse","type":"bool"}],"name":"setEndorser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_canTag","type":"bool"}],"name":"setTagger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"string","name":"_tag","type":"string"}],"name":"tagVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taggers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newGovernance","type":"address"}],"name":"transferGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vaultInfo","outputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint96","name":"releaseVersion","type":"uint96"},{"internalType":"uint64","name":"vaultType","type":"uint64"},{"internalType":"uint128","name":"deploymentTimestamp","type":"uint128"},{"internalType":"uint64","name":"index","type":"uint64"},{"internalType":"string","name":"tag","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b50604051620025dd380380620025dd8339810160408190526200003491620000d4565b600080546001600160a01b0319166001600160a01b03851690811782556040518592907f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce80908290a35060016200008b83826200025e565b506001600160a01b0316608052506200032a9050565b80516001600160a01b0381168114620000b957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080600060608486031215620000ea57600080fd5b620000f584620000a1565b602085810151919450906001600160401b03808211156200011557600080fd5b818701915087601f8301126200012a57600080fd5b8151818111156200013f576200013f620000be565b604051601f8201601f19908116603f011681019083821181831017156200016a576200016a620000be565b816040528281528a868487010111156200018357600080fd5b600093505b82841015620001a7578484018601518185018701529285019262000188565b6000868483010152809750505050505050620001c660408501620000a1565b90509250925092565b600181811c90821680620001e457607f821691505b6020821081036200020557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200025957600081815260208120601f850160051c81016020861015620002345750805b601f850160051c820191505b81811015620002555782815560010162000240565b5050505b505050565b81516001600160401b038111156200027a576200027a620000be565b62000292816200028b8454620001cf565b846200020b565b602080601f831160018114620002ca5760008415620002b15750858301515b600019600386901b1c1916600185901b17855562000255565b600085815260208120601f198616915b82811015620002fb57888601518255948401946001909101908401620002da565b50858210156200031a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805161227b620003626000396000818161023a01528181610b0e01528181610bc601528181610e440152610efc015261227b6000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c806360bd68f8116100f9578063a237e94d11610097578063b2c6161c11610071578063b2c6161c146103fa578063ceb68c2314610423578063cf35bdd014610436578063d38bfff41461044957600080fd5b8063a237e94d146103a1578063a46fe83b146103cf578063ac01762a146103d757600080fd5b80637be7b20b116100d35780637be7b20b1461034e57806389c6acec146103615780639164359a1461037457806398a5e07b1461039957600080fd5b806360bd68f81461031e57806367e4ac2c1461033157806370df8ba71461033957600080fd5b80632317ef67116101665780633515a20b116101405780633515a20b1461029557806353d2e949146102c85780635aa6e675146102e85780635b25d2c8146102fb57600080fd5b80632317ef671461025c5780632aa59c921461026f5780632c2a72d51461028257600080fd5b806306fdde03146101ae5780630ab322d9146101cc5780630f7872cc146101e157806317bdd312146101f457806318d1dd831461021f57806319ee073e14610235575b600080fd5b6101b661045c565b6040516101c39190611b0c565b60405180910390f35b6101df6101da366004611b3b565b6104ea565b005b6101df6101ef366004611b3b565b6104fc565b610207610202366004611c1b565b61050b565b6040516001600160a01b0390911681526020016101c3565b610227600181565b6040519081526020016101c3565b6102077f000000000000000000000000000000000000000000000000000000000000000081565b6101df61026a366004611cab565b610526565b6101df61027d366004611cd7565b61071a565b6101df610290366004611cd7565b610782565b6102b86102a3366004611b3b565b60036020526000908152604090205460ff1681565b60405190151581526020016101c3565b6102db6102d6366004611b3b565b6107e2565b6040516101c39190611d15565b600054610207906001600160a01b031681565b6102b8610309366004611b3b565b60026020526000908152604090205460ff1681565b6101df61032c366004611d62565b610858565b6102db610911565b610341610973565b6040516101c39190611db1565b61020761035c366004611e44565b610afd565b6101df61036f366004611ede565b610d1c565b610387610382366004611b3b565b6110fa565b6040516101c396959493929190611f19565b610227600281565b6102b86103af366004611b3b565b6001600160a01b0390811660009081526004602052604090205416151590565b600754610227565b6102b86103e5366004611b3b565b60056020526000908152604090205460ff1681565b610227610408366004611b3b565b6001600160a01b031660009081526006602052604090205490565b6101df610431366004611b3b565b6111e7565b610207610444366004611f7e565b6115dd565b6101df610457366004611b3b565b611607565b6001805461046990611f97565b80601f016020809104026020016040519081016040528092919081815260200182805461049590611f97565b80156104e25780601f106104b7576101008083540402835291602001916104e2565b820191906000526020600020905b8154815290600101906020018083116104c557829003601f168201915b505050505081565b6104f981600060016000610d1c565b50565b6104f981600060026000610d1c565b600061051c86868686866000610afd565b9695505050505050565b61052e6116a4565b6001600160a01b03821660009081526005602052604090205460ff166105855760405162461bcd60e51b815260206004820152600760248201526621696e2075736560c81b60448201526064015b60405180910390fd5b6001600160a01b038216600090815260066020526040902054156105da5760405162461bcd60e51b815260206004820152600c60248201526b7374696c6c20696e2075736560a01b604482015260640161057c565b816001600160a01b0316600782815481106105f7576105f7611fd1565b6000918252602090912001546001600160a01b0316146106475760405162461bcd60e51b815260206004820152600b60248201526a1ddc9bdb99c8185cdcd95d60aa1b604482015260640161057c565b6007805461065790600190611ffd565b8154811061066757610667611fd1565b600091825260209091200154600780546001600160a01b03909216918390811061069357610693611fd1565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060078054806106d2576106d2612016565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0393909316815260059092525060409020805460ff19169055565b610722611706565b6001600160a01b038216600081815260026020908152604091829020805460ff191685151590811790915591519182527fcd202ea0907016dd42e40faedc5cf5c3e6368644993f46c95990dfa7f84bfaa991015b60405180910390a25050565b61078a611706565b6001600160a01b038216600081815260036020908152604091829020805460ff191685151590811790915591519182527fc93ec0e3c82bbe3866d85f7d0915cda166df7c76944b9fae88bcf11608f791bf9101610776565b6001600160a01b03811660009081526006602090815260409182902080548351818402810184019094528084526060939283018282801561084c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161082e575b50505050509050919050565b61086061174e565b6001600160a01b03828116600090815260046020526040902054166108b35760405162461bcd60e51b815260206004820152600960248201526808515b991bdc9cd95960ba1b604482015260640161057c565b6001600160a01b03821660009081526004602052604090206002016108d88282612077565b506040516001600160a01b038316907f9831985c7ff4c3d7dbd921d753150cc58a3a2a21c93795bbaac5bbf32baab3bb90600090a25050565b6060600780548060200260200160405190810160405280929190818152602001828054801561096957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161094b575b5050505050905090565b6060600060078054806020026020016040519081016040528092919081815260200182805480156109cd57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109af575b505060075493945083925050506001600160401b038111156109f1576109f1611b58565b604051908082528060200260200182016040528015610a2457816020015b6060815260200190600190039081610a0f5790505b50925060005b81811015610af75760066000848381518110610a4857610a48611fd1565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610ac457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610aa6575b5050505050848281518110610adb57610adb611fd1565b602002602001018190525080610af090612136565b9050610a2a565b50505090565b6000610b076116a4565b60008260017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356e0a94b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8e919061214f565b610b989190611ffd565b610ba29190611ffd565b6040516319c8e0f160e21b8152600481018290529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063672383c490602401602060405180830381865afa158015610c0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c319190612168565b90506001600160a01b038116610c895760405162461bcd60e51b815260206004820152601960248201527f52656769737472793a20756e6b6e6f776e2072656c6561736500000000000000604482015260640161057c565b60405163b4aeee7760e01b81526001600160a01b0382169063b4aeee7790610cbd908c908c908c908c908c90600401612185565b6020604051808303816000875af1158015610cdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d009190612168565b9250610d10838a846001426117ac565b50509695505050505050565b610d246116a4565b6001600160a01b038481166000908152600460205260409020541615610d775760405162461bcd60e51b8152602060048201526008602482015267195b991bdc9cd95960c21b604482015260640161057c565b81600003610db35760405162461bcd60e51b81526020600482015260096024820152686e6f2030207479706560b81b604482015260640161057c565b6001600160801b03821115610dfa5760405162461bcd60e51b815260206004820152600d60248201526c0e8f2e0ca40e8dede40d0d2ced609b1b604482015260640161057c565b42811115610e3d5760405162461bcd60e51b815260206004820152601060248201526f216465706c6f796d656e742074696d6560801b604482015260640161057c565b60008360017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356e0a94b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec4919061214f565b610ece9190611ffd565b610ed89190611ffd565b6040516319c8e0f160e21b8152600481018290529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063672383c490602401602060405180830381865afa158015610f43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f679190612168565b6001600160a01b031663258294106040518163ffffffff1660e01b8152600401600060405180830381865afa158015610fa4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fcc91908101906121cf565b90508080519060200120866001600160a01b031663258294106040518163ffffffff1660e01b8152600401600060405180830381865afa158015611014573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261103c91908101906121cf565b80519060200120146110845760405162461bcd60e51b81526020600482015260116024820152702bb937b7339020a824902b32b939b4b7b760791b604482015260640161057c565b6110f286876001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ea9190612168565b8487876117ac565b505050505050565b6004602052600090815260409020805460018201546002830180546001600160a01b03841694600160a01b9094046001600160601b0316936001600160401b0380851694600160401b81046001600160801b031694600160c01b9091049091169261116490611f97565b80601f016020809104026020016040519081016040528092919081815260200182805461119090611f97565b80156111dd5780601f106111b2576101008083540402835291602001916111dd565b820191906000526020600020905b8154815290600101906020018083116111c057829003601f168201915b5050505050905086565b6111ef6116a4565b6001600160a01b038181166000908152600460209081526040808320815160c08101835281549586168152600160a01b9095046001600160601b03169285019290925260018201546001600160401b0380821692860192909252600160401b81046001600160801b03166060860152600160c01b900416608084015260028101805492939260a08401919061128390611f97565b80601f01602080910402602001604051908101604052809291908181526020018280546112af90611f97565b80156112fc5780601f106112d1576101008083540402835291602001916112fc565b820191906000526020600020905b8154815290600101906020018083116112df57829003601f168201915b5050509190925250508151919250506001600160a01b031661134c5760405162461bcd60e51b815260206004820152600960248201526808595b991bdc9cd95960ba1b604482015260640161057c565b80516001600160a01b03908116600090815260066020526040902060808301518154928516926001600160401b0390911690811061138c5761138c611fd1565b6000918252602090912001546001600160a01b0316146113dc5760405162461bcd60e51b815260206004820152600b60248201526a1ddc9bdb99c81d985d5b1d60aa1b604482015260640161057c565b80516001600160a01b039081166000908152600660205260408082208451909316825281205490919061141190600190611ffd565b8154811061142157611421611fd1565b6000918252602090912001546001600160a01b039081169150831681146114e05781516001600160a01b03166000908152600660205260409020608083015181548392916001600160401b031690811061147d5761147d611fd1565b6000918252602080832090910180546001600160a01b039485166001600160a01b031990911617905560808501519284168252600490526040902060010180546001600160401b03909216600160c01b026001600160c01b039092169190911790555b81516001600160a01b0316600090815260066020526040902080548061150857611508612016565b6001900381819060005260206000200160006101000a8154906001600160a01b030219169055905581600001516001600160a01b0316836001600160a01b03167fb8d23ba050f8f00e22675f82cf3786ade63b12a46d4ea236927baf4d173c30928460200151856040015160405161159e9291906001600160601b039290921682526001600160401b0316602082015260400190565b60405180910390a36001600160a01b038316600090815260046020526040812081815560018101829055906115d66002830182611a6e565b5050505050565b600781815481106115ed57600080fd5b6000918252602090912001546001600160a01b0316905081565b61160f611706565b6001600160a01b0381166116545760405162461bcd60e51b815260206004820152600c60248201526b5a45524f204144445245535360a01b604482015260640161057c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce809190a35050565b6000546001600160a01b03163314806116cc57503360009081526003602052604090205460ff165b6117045760405162461bcd60e51b815260206004820152600960248201526810b2b73237b939b2b960b91b604482015260640161057c565b565b6000546001600160a01b031633146117045760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015260640161057c565b6000546001600160a01b031633148061177657503360009081526002602052604090205460ff165b6117045760405162461bcd60e51b815260206004820152600760248201526610ba30b3b3b2b960c91b604482015260640161057c565b6040518060c00160405280856001600160a01b03168152602001846001600160601b03168152602001836001600160401b03168152602001826001600160801b0316815260200160066000876001600160a01b03166001600160a01b03168152602001908152602001600020805490506001600160401b031681526020016040518060200160405280600081525081525060046000876001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a8154816001600160601b0302191690836001600160601b0316021790555060408201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160010160086101000a8154816001600160801b0302191690836001600160801b0316021790555060808201518160010160186101000a8154816001600160401b0302191690836001600160401b0316021790555060a08201518160020190816119589190612077565b5050506001600160a01b03848116600081815260066020908152604080832080546001810182559084528284200180546001600160a01b031916958b16959095179094559181526005909152205460ff16611a11576007805460018082019092557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319166001600160a01b0387169081179091556000908152600560205260409020805460ff191690911790555b836001600160a01b0316856001600160a01b03167fa9a7c68f108b706e545bc75ac8590730afa49f639d2e48f367105c9801c18fd28585604051611a5f929190918252602082015260400190565b60405180910390a35050505050565b508054611a7a90611f97565b6000825580601f10611a8a575050565b601f0160209004906000526020600020908101906104f991905b80821115611ab85760008155600101611aa4565b5090565b60005b83811015611ad7578181015183820152602001611abf565b50506000910152565b60008151808452611af8816020860160208601611abc565b601f01601f19169290920160200192915050565b602081526000611b1f6020830184611ae0565b9392505050565b6001600160a01b03811681146104f957600080fd5b600060208284031215611b4d57600080fd5b8135611b1f81611b26565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611b9657611b96611b58565b604052919050565b60006001600160401b03821115611bb757611bb7611b58565b50601f01601f191660200190565b600082601f830112611bd657600080fd5b8135611be9611be482611b9e565b611b6e565b818152846020838601011115611bfe57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611c3357600080fd5b8535611c3e81611b26565b945060208601356001600160401b0380821115611c5a57600080fd5b611c6689838a01611bc5565b95506040880135915080821115611c7c57600080fd5b50611c8988828901611bc5565b9350506060860135611c9a81611b26565b949793965091946080013592915050565b60008060408385031215611cbe57600080fd5b8235611cc981611b26565b946020939093013593505050565b60008060408385031215611cea57600080fd5b8235611cf581611b26565b915060208301358015158114611d0a57600080fd5b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015611d565783516001600160a01b031683529284019291840191600101611d31565b50909695505050505050565b60008060408385031215611d7557600080fd5b8235611d8081611b26565b915060208301356001600160401b03811115611d9b57600080fd5b611da785828601611bc5565b9150509250929050565b6000602080830181845280855180835260408601915060408160051b87010192508387016000805b83811015611e3657888603603f19018552825180518088529088019088880190845b81811015611e205783516001600160a01b03168352928a0192918a0191600101611dfb565b5090975050509386019391860191600101611dd9565b509398975050505050505050565b60008060008060008060c08789031215611e5d57600080fd5b8635611e6881611b26565b955060208701356001600160401b0380821115611e8457600080fd5b611e908a838b01611bc5565b96506040890135915080821115611ea657600080fd5b50611eb389828a01611bc5565b9450506060870135611ec481611b26565b9598949750929560808101359460a0909101359350915050565b60008060008060808587031215611ef457600080fd5b8435611eff81611b26565b966020860135965060408601359560600135945092505050565b6001600160a01b03871681526001600160601b03861660208201526001600160401b0385811660408301526001600160801b03851660608301528316608082015260c060a08201819052600090611f7290830184611ae0565b98975050505050505050565b600060208284031215611f9057600080fd5b5035919050565b600181811c90821680611fab57607f821691505b602082108103611fcb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561201057612010611fe7565b92915050565b634e487b7160e01b600052603160045260246000fd5b601f82111561207257600081815260208120601f850160051c810160208610156120535750805b601f850160051c820191505b818110156110f25782815560010161205f565b505050565b81516001600160401b0381111561209057612090611b58565b6120a48161209e8454611f97565b8461202c565b602080601f8311600181146120d957600084156120c15750858301515b600019600386901b1c1916600185901b1785556110f2565b600085815260208120601f198616915b82811015612108578886015182559484019460019091019084016120e9565b50858210156121265787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001820161214857612148611fe7565b5060010190565b60006020828403121561216157600080fd5b5051919050565b60006020828403121561217a57600080fd5b8151611b1f81611b26565b600060018060a01b03808816835260a060208401526121a760a0840188611ae0565b83810360408501526121b98188611ae0565b9590911660608401525050608001529392505050565b6000602082840312156121e157600080fd5b81516001600160401b038111156121f757600080fd5b8201601f8101841361220857600080fd5b8051612216611be482611b9e565b81815285602083850101111561222b57600080fd5b61223c826020830160208601611abc565b9594505050505056fea2646970667358221220f71ea9871929a0f62cefe02bd56ebcf33de74b314016dc5724699a2eff31727764736f6c63430008120033000000000000000000000000b865aaf1f9f60630934739595f183c4900f65ed90000000000000000000000000000000000000000000000000000000000000060000000000000000000000000990089173d5d5287c344092be0bb37950a67d17b000000000000000000000000000000000000000000000000000000000000000e596561726e205265676973747279000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a95760003560e01c806360bd68f8116100f9578063a237e94d11610097578063b2c6161c11610071578063b2c6161c146103fa578063ceb68c2314610423578063cf35bdd014610436578063d38bfff41461044957600080fd5b8063a237e94d146103a1578063a46fe83b146103cf578063ac01762a146103d757600080fd5b80637be7b20b116100d35780637be7b20b1461034e57806389c6acec146103615780639164359a1461037457806398a5e07b1461039957600080fd5b806360bd68f81461031e57806367e4ac2c1461033157806370df8ba71461033957600080fd5b80632317ef67116101665780633515a20b116101405780633515a20b1461029557806353d2e949146102c85780635aa6e675146102e85780635b25d2c8146102fb57600080fd5b80632317ef671461025c5780632aa59c921461026f5780632c2a72d51461028257600080fd5b806306fdde03146101ae5780630ab322d9146101cc5780630f7872cc146101e157806317bdd312146101f457806318d1dd831461021f57806319ee073e14610235575b600080fd5b6101b661045c565b6040516101c39190611b0c565b60405180910390f35b6101df6101da366004611b3b565b6104ea565b005b6101df6101ef366004611b3b565b6104fc565b610207610202366004611c1b565b61050b565b6040516001600160a01b0390911681526020016101c3565b610227600181565b6040519081526020016101c3565b6102077f000000000000000000000000990089173d5d5287c344092be0bb37950a67d17b81565b6101df61026a366004611cab565b610526565b6101df61027d366004611cd7565b61071a565b6101df610290366004611cd7565b610782565b6102b86102a3366004611b3b565b60036020526000908152604090205460ff1681565b60405190151581526020016101c3565b6102db6102d6366004611b3b565b6107e2565b6040516101c39190611d15565b600054610207906001600160a01b031681565b6102b8610309366004611b3b565b60026020526000908152604090205460ff1681565b6101df61032c366004611d62565b610858565b6102db610911565b610341610973565b6040516101c39190611db1565b61020761035c366004611e44565b610afd565b6101df61036f366004611ede565b610d1c565b610387610382366004611b3b565b6110fa565b6040516101c396959493929190611f19565b610227600281565b6102b86103af366004611b3b565b6001600160a01b0390811660009081526004602052604090205416151590565b600754610227565b6102b86103e5366004611b3b565b60056020526000908152604090205460ff1681565b610227610408366004611b3b565b6001600160a01b031660009081526006602052604090205490565b6101df610431366004611b3b565b6111e7565b610207610444366004611f7e565b6115dd565b6101df610457366004611b3b565b611607565b6001805461046990611f97565b80601f016020809104026020016040519081016040528092919081815260200182805461049590611f97565b80156104e25780601f106104b7576101008083540402835291602001916104e2565b820191906000526020600020905b8154815290600101906020018083116104c557829003601f168201915b505050505081565b6104f981600060016000610d1c565b50565b6104f981600060026000610d1c565b600061051c86868686866000610afd565b9695505050505050565b61052e6116a4565b6001600160a01b03821660009081526005602052604090205460ff166105855760405162461bcd60e51b815260206004820152600760248201526621696e2075736560c81b60448201526064015b60405180910390fd5b6001600160a01b038216600090815260066020526040902054156105da5760405162461bcd60e51b815260206004820152600c60248201526b7374696c6c20696e2075736560a01b604482015260640161057c565b816001600160a01b0316600782815481106105f7576105f7611fd1565b6000918252602090912001546001600160a01b0316146106475760405162461bcd60e51b815260206004820152600b60248201526a1ddc9bdb99c8185cdcd95d60aa1b604482015260640161057c565b6007805461065790600190611ffd565b8154811061066757610667611fd1565b600091825260209091200154600780546001600160a01b03909216918390811061069357610693611fd1565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060078054806106d2576106d2612016565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0393909316815260059092525060409020805460ff19169055565b610722611706565b6001600160a01b038216600081815260026020908152604091829020805460ff191685151590811790915591519182527fcd202ea0907016dd42e40faedc5cf5c3e6368644993f46c95990dfa7f84bfaa991015b60405180910390a25050565b61078a611706565b6001600160a01b038216600081815260036020908152604091829020805460ff191685151590811790915591519182527fc93ec0e3c82bbe3866d85f7d0915cda166df7c76944b9fae88bcf11608f791bf9101610776565b6001600160a01b03811660009081526006602090815260409182902080548351818402810184019094528084526060939283018282801561084c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161082e575b50505050509050919050565b61086061174e565b6001600160a01b03828116600090815260046020526040902054166108b35760405162461bcd60e51b815260206004820152600960248201526808515b991bdc9cd95960ba1b604482015260640161057c565b6001600160a01b03821660009081526004602052604090206002016108d88282612077565b506040516001600160a01b038316907f9831985c7ff4c3d7dbd921d753150cc58a3a2a21c93795bbaac5bbf32baab3bb90600090a25050565b6060600780548060200260200160405190810160405280929190818152602001828054801561096957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161094b575b5050505050905090565b6060600060078054806020026020016040519081016040528092919081815260200182805480156109cd57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109af575b505060075493945083925050506001600160401b038111156109f1576109f1611b58565b604051908082528060200260200182016040528015610a2457816020015b6060815260200190600190039081610a0f5790505b50925060005b81811015610af75760066000848381518110610a4857610a48611fd1565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610ac457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610aa6575b5050505050848281518110610adb57610adb611fd1565b602002602001018190525080610af090612136565b9050610a2a565b50505090565b6000610b076116a4565b60008260017f000000000000000000000000990089173d5d5287c344092be0bb37950a67d17b6001600160a01b03166356e0a94b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8e919061214f565b610b989190611ffd565b610ba29190611ffd565b6040516319c8e0f160e21b8152600481018290529091506000906001600160a01b037f000000000000000000000000990089173d5d5287c344092be0bb37950a67d17b169063672383c490602401602060405180830381865afa158015610c0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c319190612168565b90506001600160a01b038116610c895760405162461bcd60e51b815260206004820152601960248201527f52656769737472793a20756e6b6e6f776e2072656c6561736500000000000000604482015260640161057c565b60405163b4aeee7760e01b81526001600160a01b0382169063b4aeee7790610cbd908c908c908c908c908c90600401612185565b6020604051808303816000875af1158015610cdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d009190612168565b9250610d10838a846001426117ac565b50509695505050505050565b610d246116a4565b6001600160a01b038481166000908152600460205260409020541615610d775760405162461bcd60e51b8152602060048201526008602482015267195b991bdc9cd95960c21b604482015260640161057c565b81600003610db35760405162461bcd60e51b81526020600482015260096024820152686e6f2030207479706560b81b604482015260640161057c565b6001600160801b03821115610dfa5760405162461bcd60e51b815260206004820152600d60248201526c0e8f2e0ca40e8dede40d0d2ced609b1b604482015260640161057c565b42811115610e3d5760405162461bcd60e51b815260206004820152601060248201526f216465706c6f796d656e742074696d6560801b604482015260640161057c565b60008360017f000000000000000000000000990089173d5d5287c344092be0bb37950a67d17b6001600160a01b03166356e0a94b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec4919061214f565b610ece9190611ffd565b610ed89190611ffd565b6040516319c8e0f160e21b8152600481018290529091506000906001600160a01b037f000000000000000000000000990089173d5d5287c344092be0bb37950a67d17b169063672383c490602401602060405180830381865afa158015610f43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f679190612168565b6001600160a01b031663258294106040518163ffffffff1660e01b8152600401600060405180830381865afa158015610fa4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fcc91908101906121cf565b90508080519060200120866001600160a01b031663258294106040518163ffffffff1660e01b8152600401600060405180830381865afa158015611014573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261103c91908101906121cf565b80519060200120146110845760405162461bcd60e51b81526020600482015260116024820152702bb937b7339020a824902b32b939b4b7b760791b604482015260640161057c565b6110f286876001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ea9190612168565b8487876117ac565b505050505050565b6004602052600090815260409020805460018201546002830180546001600160a01b03841694600160a01b9094046001600160601b0316936001600160401b0380851694600160401b81046001600160801b031694600160c01b9091049091169261116490611f97565b80601f016020809104026020016040519081016040528092919081815260200182805461119090611f97565b80156111dd5780601f106111b2576101008083540402835291602001916111dd565b820191906000526020600020905b8154815290600101906020018083116111c057829003601f168201915b5050505050905086565b6111ef6116a4565b6001600160a01b038181166000908152600460209081526040808320815160c08101835281549586168152600160a01b9095046001600160601b03169285019290925260018201546001600160401b0380821692860192909252600160401b81046001600160801b03166060860152600160c01b900416608084015260028101805492939260a08401919061128390611f97565b80601f01602080910402602001604051908101604052809291908181526020018280546112af90611f97565b80156112fc5780601f106112d1576101008083540402835291602001916112fc565b820191906000526020600020905b8154815290600101906020018083116112df57829003601f168201915b5050509190925250508151919250506001600160a01b031661134c5760405162461bcd60e51b815260206004820152600960248201526808595b991bdc9cd95960ba1b604482015260640161057c565b80516001600160a01b03908116600090815260066020526040902060808301518154928516926001600160401b0390911690811061138c5761138c611fd1565b6000918252602090912001546001600160a01b0316146113dc5760405162461bcd60e51b815260206004820152600b60248201526a1ddc9bdb99c81d985d5b1d60aa1b604482015260640161057c565b80516001600160a01b039081166000908152600660205260408082208451909316825281205490919061141190600190611ffd565b8154811061142157611421611fd1565b6000918252602090912001546001600160a01b039081169150831681146114e05781516001600160a01b03166000908152600660205260409020608083015181548392916001600160401b031690811061147d5761147d611fd1565b6000918252602080832090910180546001600160a01b039485166001600160a01b031990911617905560808501519284168252600490526040902060010180546001600160401b03909216600160c01b026001600160c01b039092169190911790555b81516001600160a01b0316600090815260066020526040902080548061150857611508612016565b6001900381819060005260206000200160006101000a8154906001600160a01b030219169055905581600001516001600160a01b0316836001600160a01b03167fb8d23ba050f8f00e22675f82cf3786ade63b12a46d4ea236927baf4d173c30928460200151856040015160405161159e9291906001600160601b039290921682526001600160401b0316602082015260400190565b60405180910390a36001600160a01b038316600090815260046020526040812081815560018101829055906115d66002830182611a6e565b5050505050565b600781815481106115ed57600080fd5b6000918252602090912001546001600160a01b0316905081565b61160f611706565b6001600160a01b0381166116545760405162461bcd60e51b815260206004820152600c60248201526b5a45524f204144445245535360a01b604482015260640161057c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce809190a35050565b6000546001600160a01b03163314806116cc57503360009081526003602052604090205460ff165b6117045760405162461bcd60e51b815260206004820152600960248201526810b2b73237b939b2b960b91b604482015260640161057c565b565b6000546001600160a01b031633146117045760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015260640161057c565b6000546001600160a01b031633148061177657503360009081526002602052604090205460ff165b6117045760405162461bcd60e51b815260206004820152600760248201526610ba30b3b3b2b960c91b604482015260640161057c565b6040518060c00160405280856001600160a01b03168152602001846001600160601b03168152602001836001600160401b03168152602001826001600160801b0316815260200160066000876001600160a01b03166001600160a01b03168152602001908152602001600020805490506001600160401b031681526020016040518060200160405280600081525081525060046000876001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a8154816001600160601b0302191690836001600160601b0316021790555060408201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160010160086101000a8154816001600160801b0302191690836001600160801b0316021790555060808201518160010160186101000a8154816001600160401b0302191690836001600160401b0316021790555060a08201518160020190816119589190612077565b5050506001600160a01b03848116600081815260066020908152604080832080546001810182559084528284200180546001600160a01b031916958b16959095179094559181526005909152205460ff16611a11576007805460018082019092557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319166001600160a01b0387169081179091556000908152600560205260409020805460ff191690911790555b836001600160a01b0316856001600160a01b03167fa9a7c68f108b706e545bc75ac8590730afa49f639d2e48f367105c9801c18fd28585604051611a5f929190918252602082015260400190565b60405180910390a35050505050565b508054611a7a90611f97565b6000825580601f10611a8a575050565b601f0160209004906000526020600020908101906104f991905b80821115611ab85760008155600101611aa4565b5090565b60005b83811015611ad7578181015183820152602001611abf565b50506000910152565b60008151808452611af8816020860160208601611abc565b601f01601f19169290920160200192915050565b602081526000611b1f6020830184611ae0565b9392505050565b6001600160a01b03811681146104f957600080fd5b600060208284031215611b4d57600080fd5b8135611b1f81611b26565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611b9657611b96611b58565b604052919050565b60006001600160401b03821115611bb757611bb7611b58565b50601f01601f191660200190565b600082601f830112611bd657600080fd5b8135611be9611be482611b9e565b611b6e565b818152846020838601011115611bfe57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611c3357600080fd5b8535611c3e81611b26565b945060208601356001600160401b0380821115611c5a57600080fd5b611c6689838a01611bc5565b95506040880135915080821115611c7c57600080fd5b50611c8988828901611bc5565b9350506060860135611c9a81611b26565b949793965091946080013592915050565b60008060408385031215611cbe57600080fd5b8235611cc981611b26565b946020939093013593505050565b60008060408385031215611cea57600080fd5b8235611cf581611b26565b915060208301358015158114611d0a57600080fd5b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015611d565783516001600160a01b031683529284019291840191600101611d31565b50909695505050505050565b60008060408385031215611d7557600080fd5b8235611d8081611b26565b915060208301356001600160401b03811115611d9b57600080fd5b611da785828601611bc5565b9150509250929050565b6000602080830181845280855180835260408601915060408160051b87010192508387016000805b83811015611e3657888603603f19018552825180518088529088019088880190845b81811015611e205783516001600160a01b03168352928a0192918a0191600101611dfb565b5090975050509386019391860191600101611dd9565b509398975050505050505050565b60008060008060008060c08789031215611e5d57600080fd5b8635611e6881611b26565b955060208701356001600160401b0380821115611e8457600080fd5b611e908a838b01611bc5565b96506040890135915080821115611ea657600080fd5b50611eb389828a01611bc5565b9450506060870135611ec481611b26565b9598949750929560808101359460a0909101359350915050565b60008060008060808587031215611ef457600080fd5b8435611eff81611b26565b966020860135965060408601359560600135945092505050565b6001600160a01b03871681526001600160601b03861660208201526001600160401b0385811660408301526001600160801b03851660608301528316608082015260c060a08201819052600090611f7290830184611ae0565b98975050505050505050565b600060208284031215611f9057600080fd5b5035919050565b600181811c90821680611fab57607f821691505b602082108103611fcb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561201057612010611fe7565b92915050565b634e487b7160e01b600052603160045260246000fd5b601f82111561207257600081815260208120601f850160051c810160208610156120535750805b601f850160051c820191505b818110156110f25782815560010161205f565b505050565b81516001600160401b0381111561209057612090611b58565b6120a48161209e8454611f97565b8461202c565b602080601f8311600181146120d957600084156120c15750858301515b600019600386901b1c1916600185901b1785556110f2565b600085815260208120601f198616915b82811015612108578886015182559484019460019091019084016120e9565b50858210156121265787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001820161214857612148611fe7565b5060010190565b60006020828403121561216157600080fd5b5051919050565b60006020828403121561217a57600080fd5b8151611b1f81611b26565b600060018060a01b03808816835260a060208401526121a760a0840188611ae0565b83810360408501526121b98188611ae0565b9590911660608401525050608001529392505050565b6000602082840312156121e157600080fd5b81516001600160401b038111156121f757600080fd5b8201601f8101841361220857600080fd5b8051612216611be482611b9e565b81815285602083850101111561222b57600080fd5b61223c826020830160208601611abc565b9594505050505056fea2646970667358221220f71ea9871929a0f62cefe02bd56ebcf33de74b314016dc5724699a2eff31727764736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b865aaf1f9f60630934739595f183c4900f65ed90000000000000000000000000000000000000000000000000000000000000060000000000000000000000000990089173d5d5287c344092be0bb37950a67d17b000000000000000000000000000000000000000000000000000000000000000e596561726e205265676973747279000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _governance (address): 0xB865AAf1f9f60630934739595f183C4900f65ed9
Arg [1] : _name (string): Yearn Registry
Arg [2] : _releaseRegistry (address): 0x990089173D5d5287c344092Be0bB37950A67d17B
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000b865aaf1f9f60630934739595f183c4900f65ed9
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 000000000000000000000000990089173d5d5287c344092be0bb37950a67d17b
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [4] : 596561726e205265676973747279000000000000000000000000000000000000
Deployed Bytecode Sourcemap
27820:17462:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30318:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37478:134;;;;;;:::i;:::-;;:::i;:::-;;37882:136;;;;;;:::i;:::-;;:::i;34638:495::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3289:32:1;;;3271:51;;3259:2;3244:18;34638:495:0;3125:203:1;30100:47:0;;30146:1;30100:47;;;;;3479:25:1;;;3467:2;3452:18;30100:47:0;3333:177:1;29986:40:0;;;;;43892:536;;;;;;:::i;:::-;;:::i;45076:203::-;;;;;;:::i;:::-;;:::i;44659:221::-;;;;;;:::i;:::-;;:::i;30527:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4421:14:1;;4414:22;4396:41;;4384:2;4369:18;30527:41:0;4256:187:1;32487:157:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;628:25::-;;;;;-1:-1:-1;;;;;628:25:0;;;30409:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;41703:262;;;;;;:::i;:::-;;:::i;31899:102::-;;;:::i;33046:415::-;;;:::i;:::-;;;;;;;:::i;35979:1236::-;;;;;;:::i;:::-;;:::i;38694:1373::-;;;;;;:::i;:::-;;:::i;30624:41::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;30222:48::-;;30269:1;30222:48;;33775:136;;;;;;:::i;:::-;-1:-1:-1;;;;;33866:17:0;;;33842:4;33866:17;;;:9;:17;;;;;:23;;:37;;;33775:136;31651:100;31730:6;:13;31651:100;;30734:43;;;;;;:::i;:::-;;;;;;;;;;;;;;;;32142:153;;;;;;:::i;:::-;-1:-1:-1;;;;;32257:23:0;32230:7;32257:23;;;:15;:23;;;;;:30;;32142:153;42349:1222;;;;;;:::i;:::-;;:::i;30948:23::-;;;;;;:::i;:::-;;:::i;1017:325::-;;;;;;:::i;:::-;;:::i;30318:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37478:134::-;37557:47;37570:6;37578:1;30146;37602;37557:12;:47::i;:::-;37478:134;:::o;37882:136::-;37962:48;37975:6;37983:1;30269;38008;37962:12;:48::i;34638:495::-;34852:14;34899:226;34934:6;34959:5;34983:7;35009:12;35040:20;35079:1;34899:16;:226::i;:::-;34879:246;34638:495;-1:-1:-1;;;;;;34638:495:0:o;43892:536::-;28755:13;:11;:13::i;:::-;-1:-1:-1;;;;;44020:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;;::::1;;44012:39;;;::::0;-1:-1:-1;;;44012:39:0;;9821:2:1;44012:39:0::1;::::0;::::1;9803:21:1::0;9860:1;9840:18;;;9833:29;-1:-1:-1;;;9878:18:1;;;9871:37;9925:18;;44012:39:0::1;;;;;;;;;-1:-1:-1::0;;;;;44070:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;:30;:35;44062:60:::1;;;::::0;-1:-1:-1;;;44062:60:0;;10156:2:1;44062:60:0::1;::::0;::::1;10138:21:1::0;10195:2;10175:18;;;10168:30;-1:-1:-1;;;10214:18:1;;;10207:42;10266:18;;44062:60:0::1;9954:336:1::0;44062:60:0::1;44159:6;-1:-1:-1::0;;;;;44141:24:0::1;:6;44148;44141:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;44141:14:0::1;:24;44133:48;;;::::0;-1:-1:-1;;;44133:48:0;;10629:2:1;44133:48:0::1;::::0;::::1;10611:21:1::0;10668:2;10648:18;;;10641:30;-1:-1:-1;;;10687:18:1;;;10680:41;10738:18;;44133:48:0::1;10427:335:1::0;44133:48:0::1;44261:6;44268:13:::0;;:17:::1;::::0;44284:1:::1;::::0;44268:17:::1;:::i;:::-;44261:25;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;44244:6:::1;:14:::0;;-1:-1:-1;;;;;44261:25:0;;::::1;::::0;44251:6;;44244:14;::::1;;;;;:::i;:::-;;;;;;;;;:42;;;;;-1:-1:-1::0;;;;;44244:42:0::1;;;;;-1:-1:-1::0;;;;;44244:42:0::1;;;;;;44340:6;:12;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;44340:12:0;;;;;-1:-1:-1;;;;;;44340:12:0::1;::::0;;;;;;;;-1:-1:-1;;;;;44393:19:0;;;::::1;::::0;;:11:::1;:19:::0;;;-1:-1:-1;44393:19:0;;;:27;;-1:-1:-1;;44393:27:0::1;::::0;;43892:536::o;45076:203::-;324:18;:16;:18::i;:::-;-1:-1:-1;;;;;45195:17:0;::::1;;::::0;;;:7:::1;:17;::::0;;;;;;;;:27;;-1:-1:-1;;45195:27:0::1;::::0;::::1;;::::0;;::::1;::::0;;;45240:31;;4396:41:1;;;45240:31:0::1;::::0;4369:18:1;45240:31:0::1;;;;;;;;45076:203:::0;;:::o;44659:221::-;324:18;:16;:18::i;:::-;-1:-1:-1;;;;;44784:19:0;::::1;;::::0;;;:9:::1;:19;::::0;;;;;;;;:33;;-1:-1:-1;;44784:33:0::1;::::0;::::1;;::::0;;::::1;::::0;;;44835:37;;4396:41:1;;;44835:37:0::1;::::0;4369:18:1;44835:37:0::1;4256:187:1::0;32487:157:0;-1:-1:-1;;;;;32613:23:0;;;;;;:15;:23;;;;;;;;;32606:30;;;;;;;;;;;;;;;;;32577:16;;32606:30;;;32613:23;32606:30;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32606:30:0;;;;;;;;;;;;;;;;;;;;;;;32487:157;;;:::o;41703:262::-;28878:11;:9;:11::i;:::-;-1:-1:-1;;;;;41830:17:0;;::::1;41865:1;41830:17:::0;;;:9:::1;:17;::::0;;;;:23;::::1;41822:59;;;::::0;-1:-1:-1;;;41822:59:0;;11366:2:1;41822:59:0::1;::::0;::::1;11348:21:1::0;11405:1;11385:18;;;11378:29;-1:-1:-1;;;11423:18:1;;;11416:39;11472:18;;41822:59:0::1;11164:332:1::0;41822:59:0::1;-1:-1:-1::0;;;;;41892:17:0;::::1;;::::0;;;:9:::1;:17;::::0;;;;:21:::1;;:28;41916:4:::0;41892:21;:28:::1;:::i;:::-;-1:-1:-1::0;41938:19:0::1;::::0;-1:-1:-1;;;;;41938:19:0;::::1;::::0;::::1;::::0;;;::::1;41703:262:::0;;:::o;31899:102::-;31951:16;31987:6;31980:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31980:13:0;;;;;;;;;;;;;;;;;;;;;;;31899:102;:::o;33046:415::-;33145:36;33199:26;33228:6;33199:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33199:35:0;;;;;;;;;;;;;;;;-1:-1:-1;;33262:6:0;:13;33199:35;;-1:-1:-1;33262:13:0;;-1:-1:-1;;;;;;;;33308:23:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33288:43;;33347:9;33342:112;33362:6;33358:1;:10;33342:112;;;33413:15;:29;33429:9;33439:1;33429:12;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;33413:29:0;-1:-1:-1;;;;;33413:29:0;;;;;;;;;;;;33390:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33390:52:0;;;;;;;;;;;;;;;;;;;;;:17;33408:1;33390:20;;;;;;;;:::i;:::-;;;;;;:52;;;;33370:3;;;;:::i;:::-;;;33342:112;;;;33188:273;;33046:415;:::o;35979:1236::-;36239:14;28755:13;:11;:13::i;:::-;36327:22:::1;36445:13;36428:1;36368:15;-1:-1:-1::0;;;;;36352:58:0::1;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:77;;;;:::i;:::-;:106;;;;:::i;:::-;36556:82;::::0;-1:-1:-1;;;36556:82:0;;::::1;::::0;::::1;3479:25:1::0;;;36327:131:0;;-1:-1:-1;36538:15:0::1;::::0;-1:-1:-1;;;;;36572:15:0::1;36556:42;::::0;::::1;::::0;3452:18:1;;36556:82:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36538:100:::0;-1:-1:-1;;;;;;36706:21:0;::::1;36698:59;;;::::0;-1:-1:-1;;;36698:59:0;;14492:2:1;36698:59:0::1;::::0;::::1;14474:21:1::0;14531:2;14511:18;;;14504:30;14570:27;14550:18;;;14543:55;14615:18;;36698:59:0::1;14290:349:1::0;36698:59:0::1;36809:175;::::0;-1:-1:-1;;;36809:175:0;;-1:-1:-1;;;;;36809:39:0;::::1;::::0;::::1;::::0;:175:::1;::::0;36863:6;;36884:5;;36904:7;;36926:12;;36953:20;;36809:175:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36800:184;;37047:160;37076:6;37097;37118:14;30146:1;37181:15;37047:14;:160::i;:::-;36255:960;;35979:1236:::0;;;;;;;;:::o;38694:1373::-;28755:13;:11;:13::i;:::-;-1:-1:-1;;;;;38930:17:0;;::::1;38965:1;38930:17:::0;;;:9:::1;:17;::::0;;;;:23;::::1;:37:::0;38922:58:::1;;;::::0;-1:-1:-1;;;38922:58:0;;15506:2:1;38922:58:0::1;::::0;::::1;15488:21:1::0;15545:1;15525:18;;;15518:29;-1:-1:-1;;;15563:18:1;;;15556:38;15611:18;;38922:58:0::1;15304:331:1::0;38922:58:0::1;38999:10;39013:1;38999:15:::0;38991:37:::1;;;::::0;-1:-1:-1;;;38991:37:0;;15842:2:1;38991:37:0::1;::::0;::::1;15824:21:1::0;15881:1;15861:18;;;15854:29;-1:-1:-1;;;15899:18:1;;;15892:39;15948:18;;38991:37:0::1;15640:332:1::0;38991:37:0::1;-1:-1:-1::0;;;;;39047:31:0;::::1;;39039:57;;;::::0;-1:-1:-1;;;39039:57:0;;16179:2:1;39039:57:0::1;::::0;::::1;16161:21:1::0;16218:2;16198:18;;;16191:30;-1:-1:-1;;;16237:18:1;;;16230:43;16290:18;;39039:57:0::1;15977:337:1::0;39039:57:0::1;39139:15;39115:20;:39;;39107:68;;;::::0;-1:-1:-1;;;39107:68:0;;16521:2:1;39107:68:0::1;::::0;::::1;16503:21:1::0;16560:2;16540:18;;;16533:30;-1:-1:-1;;;16579:18:1;;;16572:46;16635:18;;39107:68:0::1;16319:340:1::0;39107:68:0::1;39281:22;39399:13;39382:1;39322:15;-1:-1:-1::0;;;;;39306:58:0::1;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:77;;;;:::i;:::-;:106;;;;:::i;:::-;39557:58;::::0;-1:-1:-1;;;39557:58:0;;::::1;::::0;::::1;3479:25:1::0;;;39281:131:0;;-1:-1:-1;39502:24:0::1;::::0;-1:-1:-1;;;;;39573:15:0::1;39557:42;::::0;::::1;::::0;3452:18:1;;39557:58:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39529:108:0::1;;:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;39529:110:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;39502:137;;39757:10;39740:30;;;;;;39697:6;-1:-1:-1::0;;;;;39690:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;39690:27:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;39674:45;;;;;;:96;39652:163;;;::::0;-1:-1:-1;;;39652:163:0;;17520:2:1;39652:163:0::1;::::0;::::1;17502:21:1::0;17559:2;17539:18;;;17532:30;-1:-1:-1;;;17578:18:1;;;17571:47;17635:18;;39652:163:0::1;17318:341:1::0;39652:163:0::1;39887:172;39916:6;39944;-1:-1:-1::0;;;;;39937:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39974:14;40003:10;40028:20;39887:14;:172::i;:::-;38877:1190;;38694:1373:::0;;;;:::o;30624:41::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30624:41:0;;;-1:-1:-1;;;30624:41:0;;;-1:-1:-1;;;;;30624:41:0;;-1:-1:-1;;;;;30624:41:0;;;;-1:-1:-1;;;30624:41:0;;-1:-1:-1;;;;;30624:41:0;;-1:-1:-1;;;30624:41:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42349:1222::-;28755:13;:11;:13::i;:::-;-1:-1:-1;;;;;42500:17:0;;::::1;42481:16;42500:17:::0;;;:9:::1;:17;::::0;;;;;;;42481:36;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;42481:36:0;;::::1;-1:-1:-1::0;;;;;42481:36:0::1;::::0;;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;;;;;42481:36:0;;::::1;::::0;;;;;;;-1:-1:-1;;;42481:36:0;::::1;-1:-1:-1::0;;;;;42481:36:0::1;::::0;;;;-1:-1:-1;;;42481:36:0;::::1;;::::0;;;;::::1;::::0;::::1;::::0;;:16;;:36;;;;;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;42481:36:0;;;;-1:-1:-1;;42536:10:0;;42481:36;;-1:-1:-1;;;;;;;42536:24:0::1;42528:46;;;::::0;-1:-1:-1;;;42528:46:0;;17866:2:1;42528:46:0::1;::::0;::::1;17848:21:1::0;17905:1;17885:18;;;17878:29;-1:-1:-1;;;17923:18:1;;;17916:39;17972:18;;42528:46:0::1;17664:332:1::0;42528:46:0::1;42623:10:::0;;-1:-1:-1;;;;;42607:27:0;;::::1;;::::0;;;:15:::1;:27;::::0;;;;42635:10:::1;::::0;::::1;::::0;42607:39;;:49;;::::1;::::0;-1:-1:-1;;;;;42607:39:0;;::::1;::::0;;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;42607:39:0::1;:49;42585:110;;;::::0;-1:-1:-1;;;42585:110:0;;18203:2:1;42585:110:0::1;::::0;::::1;18185:21:1::0;18242:2;18222:18;;;18215:30;-1:-1:-1;;;18261:18:1;;;18254:41;18312:18;;42585:110:0::1;18001:335:1::0;42585:110:0::1;42794:10:::0;;-1:-1:-1;;;;;42778:27:0;;::::1;42758:17;42778:27:::0;;;:15:::1;:27;::::0;;;;;42836:10;;42820:27;;::::1;::::0;;;;:34;42758:17;;42778:27;42820:38:::1;::::0;42857:1:::1;::::0;42820:38:::1;:::i;:::-;42778:91;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;42778:91:0;;::::1;::::0;-1:-1:-1;42945:19:0;::::1;::::0;::::1;42941:286;;43061:10:::0;;-1:-1:-1;;;;;43045:27:0::1;;::::0;;;:15:::1;:27;::::0;;;;43073:10:::1;::::0;::::1;::::0;43045:39;;43087:9;;43045:27;-1:-1:-1;;;;;43045:39:0::1;::::0;;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;:51:::0;;-1:-1:-1;;;;;43045:51:0;;::::1;-1:-1:-1::0;;;;;;43045:51:0;;::::1;;::::0;;43204:10:::1;::::0;::::1;::::0;43168:20;;::::1;::::0;;:9:::1;:20:::0;;;;;43045:51;43168:26:::1;:47:::0;;-1:-1:-1;;;;;43168:47:0;;::::1;-1:-1:-1::0;;;43168:47:0::1;-1:-1:-1::0;;;;;43168:47:0;;::::1;::::0;;;::::1;::::0;;42941:286:::1;43300:10:::0;;-1:-1:-1;;;;;43284:27:0::1;;::::0;;;:15:::1;:27;::::0;;;;:33;;;::::1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;43284:33:0::1;;;;;;;43411:4;:10;;;-1:-1:-1::0;;;;;43363:132:0::1;43390:6;-1:-1:-1::0;;;;;43363:132:0::1;;43436:4;:19;;;43470:4;:14;;;43363:132;;;;;;-1:-1:-1::0;;;;;18531:39:1;;;;18513:58;;-1:-1:-1;;;;;18607:31:1;18602:2;18587:18;;18580:59;18501:2;18486:18;;18341:304;43363:132:0::1;;;;;;;;-1:-1:-1::0;;;;;43546:17:0;::::1;;::::0;;;:9:::1;:17;::::0;;;;43539:24;;;;;::::1;::::0;;;43546:17;43539:24:::1;;::::0;::::1;43546:17:::0;43539:24:::1;:::i;:::-;;;42417:1154;;42349:1222:::0;:::o;30948:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30948:23:0;;-1:-1:-1;30948:23:0;:::o;1017:325::-;324:18;:16;:18::i;:::-;-1:-1:-1;;;;;1136:28:0;::::1;1128:53;;;::::0;-1:-1:-1;;;1128:53:0;;18852:2:1;1128:53:0::1;::::0;::::1;18834:21:1::0;18891:2;18871:18;;;18864:30;-1:-1:-1;;;18910:18:1;;;18903:42;18962:18;;1128:53:0::1;18650:336:1::0;1128:53:0::1;1192:21;1216:10:::0;;-1:-1:-1;;;;;1237:27:0;;::::1;-1:-1:-1::0;;;;;;1237:27:0;::::1;::::0;::::1;::::0;;1282:52:::1;::::0;1216:10;;;::::1;::::0;;;1282:52:::1;::::0;1192:21;1282:52:::1;1117:225;1017:325:::0;:::o;28965:127::-;29035:10;;-1:-1:-1;;;;;29035:10:0;29021;:24;;:49;;-1:-1:-1;29059:10:0;29049:21;;;;:9;:21;;;;;;;;29021:49;29013:71;;;;-1:-1:-1;;;29013:71:0;;19193:2:1;29013:71:0;;;19175:21:1;19232:1;19212:18;;;19205:29;-1:-1:-1;;;19250:18:1;;;19243:39;19299:18;;29013:71:0;18991:332:1;29013:71:0;28965:127::o;431:117::-;500:10;;-1:-1:-1;;;;;500:10:0;514;500:24;492:48;;;;-1:-1:-1;;;492:48:0;;19530:2:1;492:48:0;;;19512:21:1;19569:2;19549:18;;;19542:30;-1:-1:-1;;;19588:18:1;;;19581:41;19639:18;;492:48:0;19328:335:1;29145:121:0;29213:10;;-1:-1:-1;;;;;29213:10:0;29199;:24;;:47;;-1:-1:-1;29235:10:0;29227:19;;;;:7;:19;;;;;;;;29199:47;29191:67;;;;-1:-1:-1;;;29191:67:0;;19870:2:1;29191:67:0;;;19852:21:1;19909:1;19889:18;;;19882:29;-1:-1:-1;;;19927:18:1;;;19920:37;19974:18;;29191:67:0;19668:330:1;40365:915:0;40642:289;;;;;;;;40669:6;-1:-1:-1;;;;;40642:289:0;;;;;40713:14;-1:-1:-1;;;;;40642:289:0;;;;;40761:10;-1:-1:-1;;;;;40642:289:0;;;;;40816:20;-1:-1:-1;;;;;40642:289:0;;;;;40866:15;:23;40882:6;-1:-1:-1;;;;;40866:23:0;-1:-1:-1;;;;;40866:23:0;;;;;;;;;;;;:30;;;;-1:-1:-1;;;;;40642:289:0;;;;;;;;;;;;;;;;;;;;40622:9;:17;40632:6;-1:-1:-1;;;;;40622:17:0;-1:-1:-1;;;;;40622:17:0;;;;;;;;;;;;:309;;;;;;;;;;;;;-1:-1:-1;;;;;40622:309:0;;;;;-1:-1:-1;;;;;40622:309:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40622:309:0;;;;;-1:-1:-1;;;;;40622:309:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40622:309:0;;;;;-1:-1:-1;;;;;40622:309:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40622:309:0;;;;;-1:-1:-1;;;;;40622:309:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40622:309:0;;;;;-1:-1:-1;;;;;40622:309:0;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;40990:23:0;;;;;;;:15;:23;;;;;;;;:36;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;40990:36:0;;;;;;;;;;;41044:19;;;:11;:19;;;;;;;41039:156;;41123:6;:19;;;;;;;;;;;;;-1:-1:-1;;;;;;41123:19:0;-1:-1:-1;;;;;41123:19:0;;;;;;;;-1:-1:-1;41157:19:0;;;:11;41123:19;41157;;;;:26;;-1:-1:-1;;41157:26:0;;;;;;41039:156;41237:6;-1:-1:-1;;;;;41212:60:0;41229:6;-1:-1:-1;;;;;41212:60:0;;41245:14;41261:10;41212:60;;;;;;20177:25:1;;;20233:2;20218:18;;20211:34;20165:2;20150:18;;20003:248;41212:60:0;;;;;;;;40365:915;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:271::-;311:3;349:5;343:12;376:6;371:3;364:19;392:76;461:6;454:4;449:3;445:14;438:4;431:5;427:16;392:76;:::i;:::-;522:2;501:15;-1:-1:-1;;497:29:1;488:39;;;;529:4;484:50;;269:271;-1:-1:-1;;269:271:1:o;545:220::-;694:2;683:9;676:21;657:4;714:45;755:2;744:9;740:18;732:6;714:45;:::i;:::-;706:53;545:220;-1:-1:-1;;;545:220:1:o;770:131::-;-1:-1:-1;;;;;845:31:1;;835:42;;825:70;;891:1;888;881:12;906:247;965:6;1018:2;1006:9;997:7;993:23;989:32;986:52;;;1034:1;1031;1024:12;986:52;1073:9;1060:23;1092:31;1117:5;1092:31;:::i;1158:127::-;1219:10;1214:3;1210:20;1207:1;1200:31;1250:4;1247:1;1240:15;1274:4;1271:1;1264:15;1290:275;1361:2;1355:9;1426:2;1407:13;;-1:-1:-1;;1403:27:1;1391:40;;-1:-1:-1;;;;;1446:34:1;;1482:22;;;1443:62;1440:88;;;1508:18;;:::i;:::-;1544:2;1537:22;1290:275;;-1:-1:-1;1290:275:1:o;1570:187::-;1619:4;-1:-1:-1;;;;;1644:6:1;1641:30;1638:56;;;1674:18;;:::i;:::-;-1:-1:-1;1740:2:1;1719:15;-1:-1:-1;;1715:29:1;1746:4;1711:40;;1570:187::o;1762:464::-;1805:5;1858:3;1851:4;1843:6;1839:17;1835:27;1825:55;;1876:1;1873;1866:12;1825:55;1912:6;1899:20;1943:49;1959:32;1988:2;1959:32;:::i;:::-;1943:49;:::i;:::-;2017:2;2008:7;2001:19;2063:3;2056:4;2051:2;2043:6;2039:15;2035:26;2032:35;2029:55;;;2080:1;2077;2070:12;2029:55;2145:2;2138:4;2130:6;2126:17;2119:4;2110:7;2106:18;2093:55;2193:1;2168:16;;;2186:4;2164:27;2157:38;;;;2172:7;1762:464;-1:-1:-1;;;1762:464:1:o;2231:889::-;2346:6;2354;2362;2370;2378;2431:3;2419:9;2410:7;2406:23;2402:33;2399:53;;;2448:1;2445;2438:12;2399:53;2487:9;2474:23;2506:31;2531:5;2506:31;:::i;:::-;2556:5;-1:-1:-1;2612:2:1;2597:18;;2584:32;-1:-1:-1;;;;;2665:14:1;;;2662:34;;;2692:1;2689;2682:12;2662:34;2715:50;2757:7;2748:6;2737:9;2733:22;2715:50;:::i;:::-;2705:60;;2818:2;2807:9;2803:18;2790:32;2774:48;;2847:2;2837:8;2834:16;2831:36;;;2863:1;2860;2853:12;2831:36;;2886:52;2930:7;2919:8;2908:9;2904:24;2886:52;:::i;:::-;2876:62;;;2990:2;2979:9;2975:18;2962:32;3003:33;3028:7;3003:33;:::i;:::-;2231:889;;;;-1:-1:-1;2231:889:1;;3109:3;3094:19;3081:33;;2231:889;-1:-1:-1;;2231:889:1:o;3515:315::-;3583:6;3591;3644:2;3632:9;3623:7;3619:23;3615:32;3612:52;;;3660:1;3657;3650:12;3612:52;3699:9;3686:23;3718:31;3743:5;3718:31;:::i;:::-;3768:5;3820:2;3805:18;;;;3792:32;;-1:-1:-1;;;3515:315:1:o;3835:416::-;3900:6;3908;3961:2;3949:9;3940:7;3936:23;3932:32;3929:52;;;3977:1;3974;3967:12;3929:52;4016:9;4003:23;4035:31;4060:5;4035:31;:::i;:::-;4085:5;-1:-1:-1;4142:2:1;4127:18;;4114:32;4184:15;;4177:23;4165:36;;4155:64;;4215:1;4212;4205:12;4155:64;4238:7;4228:17;;;3835:416;;;;;:::o;4448:658::-;4619:2;4671:21;;;4741:13;;4644:18;;;4763:22;;;4590:4;;4619:2;4842:15;;;;4816:2;4801:18;;;4590:4;4885:195;4899:6;4896:1;4893:13;4885:195;;;4964:13;;-1:-1:-1;;;;;4960:39:1;4948:52;;5055:15;;;;5020:12;;;;4996:1;4914:9;4885:195;;;-1:-1:-1;5097:3:1;;4448:658;-1:-1:-1;;;;;;4448:658:1:o;5111:457::-;5189:6;5197;5250:2;5238:9;5229:7;5225:23;5221:32;5218:52;;;5266:1;5263;5256:12;5218:52;5305:9;5292:23;5324:31;5349:5;5324:31;:::i;:::-;5374:5;-1:-1:-1;5430:2:1;5415:18;;5402:32;-1:-1:-1;;;;;5446:30:1;;5443:50;;;5489:1;5486;5479:12;5443:50;5512;5554:7;5545:6;5534:9;5530:22;5512:50;:::i;:::-;5502:60;;;5111:457;;;;;:::o;5573:1318::-;5765:4;5794:2;5834;5823:9;5819:18;5864:2;5853:9;5846:21;5887:6;5922;5916:13;5953:6;5945;5938:22;5991:2;5980:9;5976:18;5969:25;;6053:2;6043:6;6040:1;6036:14;6025:9;6021:30;6017:39;6003:53;;6091:2;6083:6;6079:15;6112:1;6133;6143:719;6159:6;6154:3;6151:15;6143:719;;;6228:22;;;-1:-1:-1;;6224:36:1;6212:49;;6284:13;;6358:9;;6380:24;;;6470:11;;;;6426:15;;;;6505:1;6519:235;6535:8;6530:3;6527:17;6519:235;;;6616:15;;-1:-1:-1;;;;;6612:41:1;6598:56;;6723:17;;;;6680:14;;;;6650:1;6554:11;6519:235;;;-1:-1:-1;6777:5:1;;-1:-1:-1;;;6840:12:1;;;;6805:15;;;;6185:1;6176:11;6143:719;;;-1:-1:-1;6879:6:1;;5573:1318;-1:-1:-1;;;;;;;;5573:1318:1:o;6896:958::-;7020:6;7028;7036;7044;7052;7060;7113:3;7101:9;7092:7;7088:23;7084:33;7081:53;;;7130:1;7127;7120:12;7081:53;7169:9;7156:23;7188:31;7213:5;7188:31;:::i;:::-;7238:5;-1:-1:-1;7294:2:1;7279:18;;7266:32;-1:-1:-1;;;;;7347:14:1;;;7344:34;;;7374:1;7371;7364:12;7344:34;7397:50;7439:7;7430:6;7419:9;7415:22;7397:50;:::i;:::-;7387:60;;7500:2;7489:9;7485:18;7472:32;7456:48;;7529:2;7519:8;7516:16;7513:36;;;7545:1;7542;7535:12;7513:36;;7568:52;7612:7;7601:8;7590:9;7586:24;7568:52;:::i;:::-;7558:62;;;7672:2;7661:9;7657:18;7644:32;7685:33;7710:7;7685:33;:::i;:::-;6896:958;;;;-1:-1:-1;6896:958:1;;7791:3;7776:19;;7763:33;;7843:3;7828:19;;;7815:33;;-1:-1:-1;6896:958:1;-1:-1:-1;;6896:958:1:o;7859:452::-;7945:6;7953;7961;7969;8022:3;8010:9;8001:7;7997:23;7993:33;7990:53;;;8039:1;8036;8029:12;7990:53;8078:9;8065:23;8097:31;8122:5;8097:31;:::i;:::-;8147:5;8199:2;8184:18;;8171:32;;-1:-1:-1;8250:2:1;8235:18;;8222:32;;8301:2;8286:18;8273:32;;-1:-1:-1;7859:452:1;-1:-1:-1;;;7859:452:1:o;8316:728::-;-1:-1:-1;;;;;8599:32:1;;8581:51;;-1:-1:-1;;;;;8668:39:1;;8663:2;8648:18;;8641:67;-1:-1:-1;;;;;8781:15:1;;;8776:2;8761:18;;8754:43;-1:-1:-1;;;;;8833:47:1;;8828:2;8813:18;;8806:75;8918:15;;8912:3;8897:19;;8890:44;8971:3;8619;8950:19;;8943:32;;;-1:-1:-1;;8992:46:1;;9018:19;;9010:6;8992:46;:::i;:::-;8984:54;8316:728;-1:-1:-1;;;;;;;;8316:728:1:o;9049:180::-;9108:6;9161:2;9149:9;9140:7;9136:23;9132:32;9129:52;;;9177:1;9174;9167:12;9129:52;-1:-1:-1;9200:23:1;;9049:180;-1:-1:-1;9049:180:1:o;9234:380::-;9313:1;9309:12;;;;9356;;;9377:61;;9431:4;9423:6;9419:17;9409:27;;9377:61;9484:2;9476:6;9473:14;9453:18;9450:38;9447:161;;9530:10;9525:3;9521:20;9518:1;9511:31;9565:4;9562:1;9555:15;9593:4;9590:1;9583:15;9447:161;;9234:380;;;:::o;10295:127::-;10356:10;10351:3;10347:20;10344:1;10337:31;10387:4;10384:1;10377:15;10411:4;10408:1;10401:15;10767:127;10828:10;10823:3;10819:20;10816:1;10809:31;10859:4;10856:1;10849:15;10883:4;10880:1;10873:15;10899:128;10966:9;;;10987:11;;;10984:37;;;11001:18;;:::i;:::-;10899:128;;;;:::o;11032:127::-;11093:10;11088:3;11084:20;11081:1;11074:31;11124:4;11121:1;11114:15;11148:4;11145:1;11138:15;11627:545;11729:2;11724:3;11721:11;11718:448;;;11765:1;11790:5;11786:2;11779:17;11835:4;11831:2;11821:19;11905:2;11893:10;11889:19;11886:1;11882:27;11876:4;11872:38;11941:4;11929:10;11926:20;11923:47;;;-1:-1:-1;11964:4:1;11923:47;12019:2;12014:3;12010:12;12007:1;12003:20;11997:4;11993:31;11983:41;;12074:82;12092:2;12085:5;12082:13;12074:82;;;12137:17;;;12118:1;12107:13;12074:82;;11718:448;11627:545;;;:::o;12348:1352::-;12474:3;12468:10;-1:-1:-1;;;;;12493:6:1;12490:30;12487:56;;;12523:18;;:::i;:::-;12552:97;12642:6;12602:38;12634:4;12628:11;12602:38;:::i;:::-;12596:4;12552:97;:::i;:::-;12704:4;;12768:2;12757:14;;12785:1;12780:663;;;;13487:1;13504:6;13501:89;;;-1:-1:-1;13556:19:1;;;13550:26;13501:89;-1:-1:-1;;12305:1:1;12301:11;;;12297:24;12293:29;12283:40;12329:1;12325:11;;;12280:57;13603:81;;12750:944;;12780:663;11574:1;11567:14;;;11611:4;11598:18;;-1:-1:-1;;12816:20:1;;;12934:236;12948:7;12945:1;12942:14;12934:236;;;13037:19;;;13031:26;13016:42;;13129:27;;;;13097:1;13085:14;;;;12964:19;;12934:236;;;12938:3;13198:6;13189:7;13186:19;13183:201;;;13259:19;;;13253:26;-1:-1:-1;;13342:1:1;13338:14;;;13354:3;13334:24;13330:37;13326:42;13311:58;13296:74;;13183:201;-1:-1:-1;;;;;13430:1:1;13414:14;;;13410:22;13397:36;;-1:-1:-1;12348:1352:1:o;13705:135::-;13744:3;13765:17;;;13762:43;;13785:18;;:::i;:::-;-1:-1:-1;13832:1:1;13821:13;;13705:135::o;13845:184::-;13915:6;13968:2;13956:9;13947:7;13943:23;13939:32;13936:52;;;13984:1;13981;13974:12;13936:52;-1:-1:-1;14007:16:1;;13845:184;-1:-1:-1;13845:184:1:o;14034:251::-;14104:6;14157:2;14145:9;14136:7;14132:23;14128:32;14125:52;;;14173:1;14170;14163:12;14125:52;14205:9;14199:16;14224:31;14249:5;14224:31;:::i;14644:655::-;14888:4;14934:1;14930;14925:3;14921:11;14917:19;14975:2;14967:6;14963:15;14952:9;14945:34;15015:3;15010:2;14999:9;14995:18;14988:31;15042:46;15083:3;15072:9;15068:19;15060:6;15042:46;:::i;:::-;15136:9;15128:6;15124:22;15119:2;15108:9;15104:18;15097:50;15164:33;15190:6;15182;15164:33;:::i;:::-;15233:15;;;;15228:2;15213:18;;15206:43;-1:-1:-1;;15280:3:1;15265:19;15258:35;15156:41;14644:655;-1:-1:-1;;;14644:655:1:o;16664:649::-;16744:6;16797:2;16785:9;16776:7;16772:23;16768:32;16765:52;;;16813:1;16810;16803:12;16765:52;16846:9;16840:16;-1:-1:-1;;;;;16871:6:1;16868:30;16865:50;;;16911:1;16908;16901:12;16865:50;16934:22;;16987:4;16979:13;;16975:27;-1:-1:-1;16965:55:1;;17016:1;17013;17006:12;16965:55;17045:2;17039:9;17070:49;17086:32;17115:2;17086:32;:::i;17070:49::-;17142:2;17135:5;17128:17;17182:7;17177:2;17172;17168;17164:11;17160:20;17157:33;17154:53;;;17203:1;17200;17193:12;17154:53;17216:67;17280:2;17275;17268:5;17264:14;17259:2;17255;17251:11;17216:67;:::i;:::-;17302:5;16664:649;-1:-1:-1;;;;;16664:649:1:o
Swarm Source
ipfs://f71ea9871929a0f62cefe02bd56ebcf33de74b314016dc5724699a2eff317277
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.