Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
20987199 | 49 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-10-17 */ // SPDX-License-Identifier: GNU AGPLv3 pragma solidity >=0.8.18 ^0.8.0; // lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // lib/tokenized-strategy-periphery/src/utils/Governance.sol contract Governance { /// @notice Emitted when the governance address is updated. event GovernanceTransferred( address indexed previousGovernance, address indexed newGovernance ); modifier onlyGovernance() { _checkGovernance(); _; } /// @notice Checks if the msg sender is the governance. function _checkGovernance() internal view virtual { require(governance == msg.sender, "!governance"); } /// @notice Address that can set the default base fee and provider address public governance; constructor(address _governance) { governance = _governance; emit GovernanceTransferred(address(0), _governance); } /** * @notice Sets a new address as the governance of the contract. * @dev Throws if the caller is not current governance. * @param _newGovernance The new governance address. */ function transferGovernance( address _newGovernance ) external virtual onlyGovernance { require(_newGovernance != address(0), "ZERO ADDRESS"); address oldGovernance = governance; governance = _newGovernance; emit GovernanceTransferred(oldGovernance, _newGovernance); } } // lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // lib/tokenized-strategy-periphery/src/utils/Governance2Step.sol contract Governance2Step is Governance { /// @notice Emitted when the pending governance address is set. event UpdatePendingGovernance(address indexed newPendingGovernance); /// @notice Address that is set to take over governance. address public pendingGovernance; constructor(address _governance) Governance(_governance) {} /** * @notice Sets a new address as the `pendingGovernance` of the contract. * @dev Throws if the caller is not current governance. * @param _newGovernance The new governance address. */ function transferGovernance( address _newGovernance ) external virtual override onlyGovernance { require(_newGovernance != address(0), "ZERO ADDRESS"); pendingGovernance = _newGovernance; emit UpdatePendingGovernance(_newGovernance); } /** * @notice Allows the `pendingGovernance` to accept the role. */ function acceptGovernance() external virtual { require(msg.sender == pendingGovernance, "!pending governance"); emit GovernanceTransferred(governance, msg.sender); governance = msg.sender; pendingGovernance = address(0); } } // lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC4626.sol) /** * @dev Interface of the ERC4626 "Tokenized Vault Standard", as defined in * https://eips.ethereum.org/EIPS/eip-4626[ERC-4626]. * * _Available since v4.7._ */ interface IERC4626 is IERC20, IERC20Metadata { event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares); event Withdraw( address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares ); /** * @dev Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing. * * - MUST be an ERC-20 token contract. * - MUST NOT revert. */ function asset() external view returns (address assetTokenAddress); /** * @dev Returns the total amount of the underlying asset that is “managed” by Vault. * * - SHOULD include any compounding that occurs from yield. * - MUST be inclusive of any fees that are charged against assets in the Vault. * - MUST NOT revert. */ function totalAssets() external view returns (uint256 totalManagedAssets); /** * @dev Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal * scenario where all the conditions are met. * * - MUST NOT be inclusive of any fees that are charged against assets in the Vault. * - MUST NOT show any variations depending on the caller. * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. * - MUST NOT revert. * * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and * from. */ function convertToShares(uint256 assets) external view returns (uint256 shares); /** * @dev Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal * scenario where all the conditions are met. * * - MUST NOT be inclusive of any fees that are charged against assets in the Vault. * - MUST NOT show any variations depending on the caller. * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. * - MUST NOT revert. * * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and * from. */ function convertToAssets(uint256 shares) external view returns (uint256 assets); /** * @dev Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver, * through a deposit call. * * - MUST return a limited value if receiver is subject to some deposit limit. * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited. * - MUST NOT revert. */ function maxDeposit(address receiver) external view returns (uint256 maxAssets); /** * @dev Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given * current on-chain conditions. * * - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit * call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called * in the same transaction. * - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the * deposit would be accepted, regardless if the user has enough tokens approved, etc. * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. * - MUST NOT revert. * * NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in * share price or some other type of condition, meaning the depositor will lose assets by depositing. */ function previewDeposit(uint256 assets) external view returns (uint256 shares); /** * @dev Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens. * * - MUST emit the Deposit event. * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the * deposit execution, and are accounted for during deposit. * - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not * approving enough underlying tokens to the Vault contract, etc). * * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. */ function deposit(uint256 assets, address receiver) external returns (uint256 shares); /** * @dev Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call. * - MUST return a limited value if receiver is subject to some mint limit. * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted. * - MUST NOT revert. */ function maxMint(address receiver) external view returns (uint256 maxShares); /** * @dev Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given * current on-chain conditions. * * - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call * in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the * same transaction. * - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint * would be accepted, regardless if the user has enough tokens approved, etc. * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. * - MUST NOT revert. * * NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in * share price or some other type of condition, meaning the depositor will lose assets by minting. */ function previewMint(uint256 shares) external view returns (uint256 assets); /** * @dev Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens. * * - MUST emit the Deposit event. * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint * execution, and are accounted for during mint. * - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not * approving enough underlying tokens to the Vault contract, etc). * * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. */ function mint(uint256 shares, address receiver) external returns (uint256 assets); /** * @dev Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the * Vault, through a withdraw call. * * - MUST return a limited value if owner is subject to some withdrawal limit or timelock. * - MUST NOT revert. */ function maxWithdraw(address owner) external view returns (uint256 maxAssets); /** * @dev Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block, * given current on-chain conditions. * * - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw * call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if * called * in the same transaction. * - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though * the withdrawal would be accepted, regardless if the user has enough shares, etc. * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. * - MUST NOT revert. * * NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in * share price or some other type of condition, meaning the depositor will lose assets by depositing. */ function previewWithdraw(uint256 assets) external view returns (uint256 shares); /** * @dev Burns shares from owner and sends exactly assets of underlying tokens to receiver. * * - MUST emit the Withdraw event. * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the * withdraw execution, and are accounted for during withdraw. * - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner * not having enough shares, etc). * * Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed. * Those methods should be performed separately. */ function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares); /** * @dev Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault, * through a redeem call. * * - MUST return a limited value if owner is subject to some withdrawal limit or timelock. * - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock. * - MUST NOT revert. */ function maxRedeem(address owner) external view returns (uint256 maxShares); /** * @dev Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block, * given current on-chain conditions. * * - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call * in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the * same transaction. * - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the * redemption would be accepted, regardless if the user has enough shares, etc. * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. * - MUST NOT revert. * * NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in * share price or some other type of condition, meaning the depositor will lose assets by redeeming. */ function previewRedeem(uint256 shares) external view returns (uint256 assets); /** * @dev Burns exactly shares from owner and sends assets of underlying tokens to receiver. * * - MUST emit the Withdraw event. * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the * redeem execution, and are accounted for during redeem. * - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner * not having enough shares, etc). * * NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed. * Those methods should be performed separately. */ function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets); } // src/registry/ReleaseRegistry.sol interface IFactory { function apiVersion() external view returns (string memory); } interface ITokenizedStrategy { function apiVersion() external view returns (string memory); } /** * @title YearnV3 Release Registry * @author yearn.finance * @notice * Used by Yearn Governance to track on chain all * releases of the V3 vaults by API Version. */ contract ReleaseRegistry is Governance2Step { event NewRelease( uint256 indexed releaseId, address indexed factory, address indexed tokenizedStrategy, string apiVersion ); string public constant name = "Yearn V3 Release Registry"; // The total number of releases that have been deployed uint256 public numReleases; // Mapping of release id starting at 0 to the address // of the corresponding factory for that release. mapping(uint256 => address) public factories; // Mapping of release id starting at 0 to the address // of the corresponding Tokenized Strategy for that release. mapping(uint256 => address) public tokenizedStrategies; // Mapping of the API version for a specific release to the // place in the order it was released. mapping(string => uint256) public releaseTargets; constructor(address _governance) Governance2Step(_governance) {} /** * @notice Returns the latest factory. * @return The address of the factory for the latest release. */ function latestFactory() external view virtual returns (address) { uint256 _numReleases = numReleases; if (_numReleases == 0) return address(0); return factories[numReleases - 1]; } /** * @notice Returns the latest tokenized strategy. * @return The address of the tokenized strategy for the latest release. */ function latestTokenizedStrategy() external view virtual returns (address) { uint256 _numReleases = numReleases; if (_numReleases == 0) return address(0); return tokenizedStrategies[numReleases - 1]; } /** * @notice Returns the api version of the latest release. * @return The api version of the latest release. */ function latestRelease() external view virtual returns (string memory) { uint256 _numReleases = numReleases; if (_numReleases == 0) return ""; return IFactory(factories[numReleases - 1]).apiVersion(); } /** * @notice Issue a new release using a deployed factory. * @dev Stores the factory address in `factories` and the release * target in `releaseTargets` with its associated API version. * * Throws if caller isn't `governance`. * Throws if the api version is the same as the previous release. * Throws if the factory does not have the same api version as the tokenized strategy. * Emits a `NewRelease` event. * * @param _factory The factory that will be used create new vaults. */ function newRelease( address _factory, address _tokenizedStrategy ) external virtual onlyGovernance { // Check if the release is different from the current one uint256 releaseId = numReleases; string memory apiVersion = IFactory(_factory).apiVersion(); string memory tokenizedStrategyApiVersion = ITokenizedStrategy( _tokenizedStrategy ).apiVersion(); require( keccak256(bytes(apiVersion)) == keccak256(bytes(tokenizedStrategyApiVersion)), "ReleaseRegistry: api version mismatch" ); if (releaseId > 0) { // Make sure this isn't the same as the last one require( keccak256( bytes(IFactory(factories[releaseId - 1]).apiVersion()) ) != keccak256(bytes(apiVersion)), "ReleaseRegistry: same api version" ); } // Update latest release. factories[releaseId] = _factory; tokenizedStrategies[releaseId] = _tokenizedStrategy; // Set the api to the target. releaseTargets[apiVersion] = releaseId; // Increase our number of releases. numReleases = releaseId + 1; // Log the release for external listeners emit NewRelease(releaseId, _factory, _tokenizedStrategy, apiVersion); } } // lib/yearn-vaults-v3/contracts/interfaces/IVault.sol interface IVault is IERC4626 { // STRATEGY EVENTS event StrategyChanged(address indexed strategy, uint256 change_type); event StrategyReported( address indexed strategy, uint256 gain, uint256 loss, uint256 current_debt, uint256 protocol_fees, uint256 total_fees, uint256 total_refunds ); // DEBT MANAGEMENT EVENTS event DebtUpdated( address indexed strategy, uint256 current_debt, uint256 new_debt ); // ROLE UPDATES event RoleSet(address indexed account, uint256 role); event UpdateRoleManager(address indexed role_manager); event UpdateAccountant(address indexed accountant); event UpdateDefaultQueue(address[] new_default_queue); event UpdateUseDefaultQueue(bool use_default_queue); event UpdatedMaxDebtForStrategy( address indexed sender, address indexed strategy, uint256 new_debt ); event UpdateAutoAllocate(bool auto_allocate); event UpdateDepositLimit(uint256 deposit_limit); event UpdateMinimumTotalIdle(uint256 minimum_total_idle); event UpdateProfitMaxUnlockTime(uint256 profit_max_unlock_time); event DebtPurchased(address indexed strategy, uint256 amount); event Shutdown(); struct StrategyParams { uint256 activation; uint256 last_report; uint256 current_debt; uint256 max_debt; } function FACTORY() external view returns (uint256); function strategies(address) external view returns (StrategyParams memory); function default_queue(uint256) external view returns (address); function use_default_queue() external view returns (bool); function auto_allocate() external view returns (bool); function minimum_total_idle() external view returns (uint256); function deposit_limit() external view returns (uint256); function deposit_limit_module() external view returns (address); function withdraw_limit_module() external view returns (address); function accountant() external view returns (address); function roles(address) external view returns (uint256); function role_manager() external view returns (address); function future_role_manager() external view returns (address); function isShutdown() external view returns (bool); function nonces(address) external view returns (uint256); function initialize( address, string memory, string memory, address, uint256 ) external; function setName(string memory) external; function setSymbol(string memory) external; function set_accountant(address new_accountant) external; function set_default_queue(address[] memory new_default_queue) external; function set_use_default_queue(bool) external; function set_auto_allocate(bool) external; function set_deposit_limit(uint256 deposit_limit) external; function set_deposit_limit( uint256 deposit_limit, bool should_override ) external; function set_deposit_limit_module( address new_deposit_limit_module ) external; function set_deposit_limit_module( address new_deposit_limit_module, bool should_override ) external; function set_withdraw_limit_module( address new_withdraw_limit_module ) external; function set_minimum_total_idle(uint256 minimum_total_idle) external; function setProfitMaxUnlockTime( uint256 new_profit_max_unlock_time ) external; function set_role(address account, uint256 role) external; function add_role(address account, uint256 role) external; function remove_role(address account, uint256 role) external; function transfer_role_manager(address role_manager) external; function accept_role_manager() external; function unlockedShares() external view returns (uint256); function pricePerShare() external view returns (uint256); function get_default_queue() external view returns (address[] memory); function process_report( address strategy ) external returns (uint256, uint256); function buy_debt(address strategy, uint256 amount) external; function add_strategy(address new_strategy) external; function revoke_strategy(address strategy) external; function force_revoke_strategy(address strategy) external; function update_max_debt_for_strategy( address strategy, uint256 new_max_debt ) external; function update_debt( address strategy, uint256 target_debt ) external returns (uint256); function update_debt( address strategy, uint256 target_debt, uint256 max_loss ) external returns (uint256); function shutdown_vault() external; function totalIdle() external view returns (uint256); function totalDebt() external view returns (uint256); function apiVersion() external view returns (string memory); function assess_share_of_unrealised_losses( address strategy, uint256 assets_needed ) external view returns (uint256); function profitMaxUnlockTime() external view returns (uint256); function fullProfitUnlockDate() external view returns (uint256); function profitUnlockingRate() external view returns (uint256); function lastProfitUpdate() external view returns (uint256); //// NON-STANDARD ERC-4626 FUNCTIONS \\\\ function withdraw( uint256 assets, address receiver, address owner, uint256 max_loss ) external returns (uint256); function withdraw( uint256 assets, address receiver, address owner, uint256 max_loss, address[] memory strategies ) external returns (uint256); function redeem( uint256 shares, address receiver, address owner, uint256 max_loss ) external returns (uint256); function redeem( uint256 shares, address receiver, address owner, uint256 max_loss, address[] memory strategies ) external returns (uint256); function maxWithdraw( address owner, uint256 max_loss ) external view returns (uint256); function maxWithdraw( address owner, uint256 max_loss, address[] memory strategies ) external view returns (uint256); function maxRedeem( address owner, uint256 max_loss ) external view returns (uint256); function maxRedeem( address owner, uint256 max_loss, address[] memory strategies ) external view returns (uint256); //// NON-STANDARD ERC-20 FUNCTIONS \\\\ function DOMAIN_SEPARATOR() external view returns (bytes32); function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external returns (bool); } // src/registry/Registry.sol interface IVaultFactory { function deploy_new_vault( address asset, string memory name, string memory symbol, address role_manager, uint256 profit_max_unlock_time ) external returns (address); function apiVersion() external view returns (string memory); } /** * @title YearnV3 Registry * @author yearn.finance * @notice * Serves as an on chain registry to track any Yearn V3 * vaults and strategies that a certain party wants to * endorse. * * Can also be used to deploy new vaults of any specific * API version. */ contract Registry is Governance { /// @notice Emitted when a new vault is deployed or added. event NewEndorsedVault( address indexed vault, address indexed asset, uint256 releaseVersion, uint256 vaultType ); /// @notice Emitted when a vault is removed. event RemovedVault( address indexed vault, address indexed asset, uint256 releaseVersion, uint256 vaultType ); /// @notice Emitted when a vault is tagged with a string. event VaultTagged(address indexed vault); /// @notice Emitted when gov adds ore removes a `tagger`. event UpdateTagger(address indexed account, bool status); /// @notice Emitted when gov adds ore removes a `endorser`. event UpdateEndorser(address indexed account, bool status); /// @notice Can only be gov or an `endorser`. modifier onlyEndorsers() { _isEndorser(); _; } /// @notice Can only be gov or a `tagger`. modifier onlyTaggers() { _isTagger(); _; } /// @notice Check is gov or an `endorser`. function _isEndorser() internal view { require(msg.sender == governance || endorsers[msg.sender], "!endorser"); } /// @notice Check is gov or a `tagger`. function _isTagger() internal view { require(msg.sender == governance || taggers[msg.sender], "!tagger"); } // Struct stored for every endorsed vault or strategy for // off chain use to easily retrieve info. struct Info { // The token thats being used. address asset; // The release number corresponding to the release registries version. uint96 releaseVersion; // Type of vault. uint64 vaultType; // Time when the vault was deployed for easier indexing. uint128 deploymentTimestamp; // Index the vault is at in array for easy removals. uint64 index; // String so that management can tag a vault with any info for FE's. string tag; } // Address used to get the specific versions from. address public immutable releaseRegistry; // Default type used for Multi strategy "Allocator" vaults. uint256 public constant MULTI_STRATEGY_TYPE = 1; // Default type used for Single "Tokenized" Strategy vaults. uint256 public constant SINGLE_STRATEGY_TYPE = 2; // Custom name for this Registry. string public name; // Old version of the registry to fall back to if exists. address public legacyRegistry; // Mapping for any address that is allowed to tag a vault. mapping(address => bool) public taggers; // Mapping for any address that is allowed to deploy or endorse. mapping(address => bool) public endorsers; // vault/strategy address => Info struct. mapping(address => Info) public vaultInfo; // Mapping to check if a specific `asset` has a vault. mapping(address => bool) public assetIsUsed; // asset => array of all endorsed vaults. mapping(address => address[]) internal _endorsedVaults; // Array of all tokens used as the underlying. address[] public assets; /** * @param _governance Address to set as owner of the Registry. * @param _name The custom string for this custom registry to be called. * @param _releaseRegistry The Permissionless releaseRegistry to deploy vaults through. */ constructor( address _governance, string memory _name, address _releaseRegistry ) Governance(_governance) { // Set name. name = _name; // Set releaseRegistry. releaseRegistry = _releaseRegistry; } /** * @notice Returns the total number of assets being used as the underlying. * @return The amount of assets. */ function numAssets() external view virtual returns (uint256) { return assets.length; } /** * @notice Get the full array of tokens being used. * @return The full array of underlying tokens being used/. */ function getAssets() external view virtual returns (address[] memory) { return assets; } /** * @notice The amount of endorsed vaults for a specific token. * @return The amount of endorsed vaults. */ function numEndorsedVaults( address _asset ) public view virtual returns (uint256) { return _endorsedVaults[_asset].length; } /** * @notice Get the array of vaults endorsed for an `_asset`. * @param _asset The underlying token used by the vaults. * @return The endorsed vaults. */ function getEndorsedVaults( address _asset ) external view virtual returns (address[] memory) { return _endorsedVaults[_asset]; } /** * @notice Get all endorsed vaults deployed using the Registry. * @dev This will return a nested array of all vaults deployed * separated by their underlying asset. * * This is only meant for off chain viewing and should not be used during any * on chain tx's. * * @return allEndorsedVaults A nested array containing all vaults. */ function getAllEndorsedVaults() external view virtual returns (address[][] memory allEndorsedVaults) { address[] memory allAssets = assets; uint256 length = assets.length; allEndorsedVaults = new address[][](length); for (uint256 i; i < length; ++i) { allEndorsedVaults[i] = _endorsedVaults[allAssets[i]]; } } /** * @notice Check if a vault is endorsed in this registry. * @dev This will check if the `asset` variable in the struct has been * set for an easy external view check. * @param _vault Address of the vault to check. * @return . The vaults endorsement status. */ function isEndorsed(address _vault) external view virtual returns (bool) { return vaultInfo[_vault].asset != address(0) || isLegacyVault(_vault); } /** * @notice Check if a vault is endorsed in the legacy registry. * @param _vault The vault to check. * @return True if the vault is endorsed in the legacy registry, false otherwise. */ function isLegacyVault(address _vault) public view virtual returns (bool) { address _legacy = legacyRegistry; if (_legacy == address(0)) return false; return Registry(_legacy).isEndorsed(_vault); } /** * @notice * Create and endorse a new multi strategy "Allocator" * vault and endorse it in this registry. * @dev * Throws if caller isn't `owner`. * Throws if no releases are registered yet. * Emits a `NewEndorsedVault` event. * @param _asset The asset that may be deposited into the new Vault. * @param _name Specify a custom Vault name. . * @param _symbol Specify a custom Vault symbol name. * @param _roleManager The address authorized for guardian interactions in the new Vault. * @param _profitMaxUnlockTime The time strategy profits will unlock over. * @return _vault address of the newly-deployed vault */ function newEndorsedVault( address _asset, string memory _name, string memory _symbol, address _roleManager, uint256 _profitMaxUnlockTime ) public virtual returns (address _vault) { return newEndorsedVault( _asset, _name, _symbol, _roleManager, _profitMaxUnlockTime, 0 // Default to latest version. ); } /** * @notice * Create and endorse a new multi strategy "Allocator" * vault and endorse it in this registry. * @dev * Throws if caller isn't `owner`. * Throws if no releases are registered yet. * Emits a `NewEndorsedVault` event. * @param _asset The asset that may be deposited into the new Vault. * @param _name Specify a custom Vault name. . * @param _symbol Specify a custom Vault symbol name. * @param _roleManager The address authorized for guardian interactions in the new Vault. * @param _profitMaxUnlockTime The time strategy profits will unlock over. * @param _releaseDelta The number of releases prior to the latest to use as a target. NOTE: Set to 0 for latest. * @return _vault address of the newly-deployed vault */ function newEndorsedVault( address _asset, string memory _name, string memory _symbol, address _roleManager, uint256 _profitMaxUnlockTime, uint256 _releaseDelta ) public virtual onlyEndorsers returns (address _vault) { // Get the target release based on the delta given. uint256 _releaseTarget = ReleaseRegistry(releaseRegistry) .numReleases() - 1 - _releaseDelta; // Get the factory address for that specific Api version. address factory = ReleaseRegistry(releaseRegistry).factories( _releaseTarget ); // Make sure we got an actual factory require(factory != address(0), "Registry: unknown release"); // Deploy New vault. _vault = IVaultFactory(factory).deploy_new_vault( _asset, _name, _symbol, _roleManager, _profitMaxUnlockTime ); // Register the vault with this Registry _registerVault( _vault, _asset, _releaseTarget, MULTI_STRATEGY_TYPE, block.timestamp ); } /** * @notice Endorse an already deployed multi strategy vault. * @dev To be used with default values for `_releaseDelta`, `_vaultType` * and `_deploymentTimestamp`. * * @param _vault Address of the vault to endorse. */ function endorseMultiStrategyVault(address _vault) external virtual { endorseVault(_vault, 0, MULTI_STRATEGY_TYPE, 0); } /** * @notice Endorse an already deployed Single Strategy vault. * @dev To be used with default values for `_releaseDelta`, `_vaultType` * and `_deploymentTimestamp`. * * @param _vault Address of the vault to endorse. */ function endorseSingleStrategyVault(address _vault) external virtual { endorseVault(_vault, 0, SINGLE_STRATEGY_TYPE, 0); } /** * @notice * Adds an existing vault to the list of "endorsed" vaults for that asset. * @dev * Throws if caller isn't `owner`. * Throws if no releases are registered yet. * Throws if `vault`'s api version does not match the release specified. * Emits a `NewEndorsedVault` event. * @param _vault The vault that will be endorsed by the Registry. * @param _releaseDelta Specify the number of releases prior to the latest to use as a target. * @param _vaultType Type of vault to endorse. * @param _deploymentTimestamp The timestamp of when the vault was deployed for FE use. */ function endorseVault( address _vault, uint256 _releaseDelta, uint256 _vaultType, uint256 _deploymentTimestamp ) public virtual onlyEndorsers { // Cannot endorse twice. require(vaultInfo[_vault].asset == address(0), "endorsed"); require(_vaultType != 0, "no 0 type"); require(_vaultType <= type(uint128).max, "type too high"); require(_deploymentTimestamp <= block.timestamp, "!deployment time"); // Will underflow if no releases created yet, or targeting prior to release history uint256 _releaseTarget = ReleaseRegistry(releaseRegistry) .numReleases() - 1 - _releaseDelta; // dev: no releases // Get the API version for the target specified string memory apiVersion = IVaultFactory( ReleaseRegistry(releaseRegistry).factories(_releaseTarget) ).apiVersion(); require( keccak256(bytes(IVault(_vault).apiVersion())) == keccak256(bytes((apiVersion))), "Wrong API Version" ); // Add to the end of the list of vaults for asset _registerVault( _vault, IVault(_vault).asset(), _releaseTarget, _vaultType, _deploymentTimestamp ); } /** * @dev Function used to register a newly deployed or added vault. * * This well set all of the values for the vault in the `vaultInfo` * mapping as well as add the vault and the underlying asset to any * relevant arrays for tracking. * */ function _registerVault( address _vault, address _asset, uint256 _releaseTarget, uint256 _vaultType, uint256 _deploymentTimestamp ) internal virtual { // Set the Info struct for this vault vaultInfo[_vault] = Info({ asset: _asset, releaseVersion: uint96(_releaseTarget), vaultType: uint64(_vaultType), deploymentTimestamp: uint128(_deploymentTimestamp), index: uint64(_endorsedVaults[_asset].length), tag: "" }); // Add to the endorsed vaults array. _endorsedVaults[_asset].push(_vault); if (!assetIsUsed[_asset]) { // We have a new asset to add assets.push(_asset); assetIsUsed[_asset] = true; } emit NewEndorsedVault(_vault, _asset, _releaseTarget, _vaultType); } /** * @notice Tag a vault with a specific string. * @dev This is available to governance to tag any vault or strategy * on chain if desired to arbitrarily classify any vaults. * i.e. Certain ratings ("A") / Vault status ("Shutdown") etc. * * @param _vault Address of the vault or strategy to tag. * @param _tag The string to tag the vault or strategy with. */ function tagVault( address _vault, string memory _tag ) external virtual onlyTaggers { require(vaultInfo[_vault].asset != address(0), "!Endorsed"); vaultInfo[_vault].tag = _tag; emit VaultTagged(_vault); } /** * @notice Remove a `_vault`. * @dev Can be used as an efficient way to remove a vault * to not have to iterate over the full array. * * NOTE: This will not remove the asset from the `assets` array * if it is no longer in use and will have to be done manually. * * @param _vault Address of the vault to remove. */ function removeVault(address _vault) external virtual onlyEndorsers { // Get the struct with all the vaults data. Info memory info = vaultInfo[_vault]; require(info.asset != address(0), "!endorsed"); require( _endorsedVaults[info.asset][info.index] == _vault, "wrong vault" ); // Get the vault at the end of the array address lastVault = _endorsedVaults[info.asset][ _endorsedVaults[info.asset].length - 1 ]; // If `_vault` is not the last item in the array. if (lastVault != _vault) { // Set the last index to the spot we are removing. _endorsedVaults[info.asset][info.index] = lastVault; // Update the index of the vault we moved vaultInfo[lastVault].index = uint64(info.index); } // Pop the last item off the array. _endorsedVaults[info.asset].pop(); // Emit the event. emit RemovedVault( _vault, info.asset, info.releaseVersion, info.vaultType ); // Delete the struct. delete vaultInfo[_vault]; } /** * @notice Removes a specific `_asset` at `_index` from `assets`. * @dev Can be used if an asset is no longer in use after a vault or * strategy has also been removed. * * @param _asset The asset to remove from the array. * @param _index The index it sits at. */ function removeAsset( address _asset, uint256 _index ) external virtual onlyEndorsers { require(assetIsUsed[_asset], "!in use"); require(_endorsedVaults[_asset].length == 0, "still in use"); require(assets[_index] == _asset, "wrong asset"); // Replace `_asset` with the last index. assets[_index] = assets[assets.length - 1]; // Pop last item off the array. assets.pop(); // No longer used. assetIsUsed[_asset] = false; } /** * @notice Set a new address to be able to endorse or remove an existing endorser. * @param _account The address to set. * @param _canEndorse Bool if the `_account` can or cannot endorse. */ function setEndorser( address _account, bool _canEndorse ) external virtual onlyGovernance { endorsers[_account] = _canEndorse; emit UpdateEndorser(_account, _canEndorse); } /** * @notice Set a new address to be able to tag a vault. * @param _account The address to set. * @param _canTag Bool if the `_account` can or cannot tag. */ function setTagger( address _account, bool _canTag ) external virtual onlyGovernance { taggers[_account] = _canTag; emit UpdateTagger(_account, _canTag); } /** * @notice Set a legacy registry if one exists. * @param _legacyRegistry The address of the legacy registry. */ function setLegacyRegistry( address _legacyRegistry ) external virtual onlyGovernance { legacyRegistry = _legacyRegistry; } }
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":[{"internalType":"address","name":"_vault","type":"address"}],"name":"isLegacyVault","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"legacyRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"_legacyRegistry","type":"address"}],"name":"setLegacyRegistry","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
60a06040523480156200001157600080fd5b5060405162002731380380620027318339810160408190526200003491620000d4565b600080546001600160a01b0319166001600160a01b03851690811782556040518592907f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce80908290a35060016200008b83826200025e565b506001600160a01b0316608052506200032a9050565b80516001600160a01b0381168114620000b957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080600060608486031215620000ea57600080fd5b620000f584620000a1565b602085810151919450906001600160401b03808211156200011557600080fd5b818701915087601f8301126200012a57600080fd5b8151818111156200013f576200013f620000be565b604051601f8201601f19908116603f011681019083821181831017156200016a576200016a620000be565b816040528281528a868487010111156200018357600080fd5b600093505b82841015620001a7578484018601518185018701529285019262000188565b6000868483010152809750505050505050620001c660408501620000a1565b90509250925092565b600181811c90821680620001e457607f821691505b6020821081036200020557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200025957600081815260208120601f850160051c81016020861015620002345750805b601f850160051c820191505b81811015620002555782815560010162000240565b5050505b505050565b81516001600160401b038111156200027a576200027a620000be565b62000292816200028b8454620001cf565b846200020b565b602080601f831160018114620002ca5760008415620002b15750858301515b600019600386901b1c1916600185901b17855562000255565b600085815260208120601f198616915b82811015620002fb57888601518255948401946001909101908401620002da565b50858210156200031a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6080516123cf620003626000396000818161026b01528181610b5d01528181610c1501528181610e930152610f4b01526123cf6000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806370df8ba711610104578063a4fc5922116100a2578063ceb68c2311610071578063ceb68c231461045f578063cf35bdd014610472578063d38bfff414610485578063da1281dd1461049857600080fd5b8063a4fc5922146103ed578063ac01762a14610400578063ae8c9d1314610423578063b2c6161c1461043657600080fd5b80639164359a116100de5780639164359a146103a557806398a5e07b146103ca578063a237e94d146103d2578063a46fe83b146103e557600080fd5b806370df8ba71461036a5780637be7b20b1461037f57806389c6acec1461039257600080fd5b80632aa59c921161017c5780635aa6e6751161014b5780635aa6e675146103195780635b25d2c81461032c57806360bd68f81461034f57806367e4ac2c1461036257600080fd5b80632aa59c92146102a05780632c2a72d5146102b35780633515a20b146102c657806353d2e949146102f957600080fd5b806317bdd312116101b857806317bdd3121461022557806318d1dd831461025057806319ee073e146102665780632317ef671461028d57600080fd5b806306fdde03146101df5780630ab322d9146101fd5780630f7872cc14610212575b600080fd5b6101e76104ab565b6040516101f49190611c47565b60405180910390f35b61021061020b366004611c6f565b610539565b005b610210610220366004611c6f565b61054b565b610238610233366004611d4f565b61055a565b6040516001600160a01b0390911681526020016101f4565b610258600181565b6040519081526020016101f4565b6102387f000000000000000000000000000000000000000000000000000000000000000081565b61021061029b366004611ddf565b610575565b6102106102ae366004611e19565b610769565b6102106102c1366004611e19565b6107d1565b6102e96102d4366004611c6f565b60046020526000908152604090205460ff1681565b60405190151581526020016101f4565b61030c610307366004611c6f565b610831565b6040516101f49190611e52565b600054610238906001600160a01b031681565b6102e961033a366004611c6f565b60036020526000908152604090205460ff1681565b61021061035d366004611e9f565b6108a7565b61030c610960565b6103726109c2565b6040516101f49190611eee565b61023861038d366004611f81565b610b4c565b6102106103a036600461201b565b610d6b565b6103b86103b3366004611c6f565b611149565b6040516101f496959493929190612056565b610258600281565b6102e96103e0366004611c6f565b611236565b600854610258565b6102106103fb366004611c6f565b61126a565b6102e961040e366004611c6f565b60066020526000908152604090205460ff1681565b600254610238906001600160a01b031681565b610258610444366004611c6f565b6001600160a01b031660009081526007602052604090205490565b61021061046d366004611c6f565b611294565b6102386104803660046120bb565b61168a565b610210610493366004611c6f565b6116b4565b6102e96104a6366004611c6f565b611751565b600180546104b8906120d4565b80601f01602080910402602001604051908101604052809291908181526020018280546104e4906120d4565b80156105315780601f1061050657610100808354040283529160200191610531565b820191906000526020600020905b81548152906001019060200180831161051457829003601f168201915b505050505081565b61054881600060016000610d6b565b50565b61054881600060026000610d6b565b600061056b86868686866000610b4c565b9695505050505050565b61057d6117df565b6001600160a01b03821660009081526006602052604090205460ff166105d45760405162461bcd60e51b815260206004820152600760248201526621696e2075736560c81b60448201526064015b60405180910390fd5b6001600160a01b038216600090815260076020526040902054156106295760405162461bcd60e51b815260206004820152600c60248201526b7374696c6c20696e2075736560a01b60448201526064016105cb565b816001600160a01b0316600882815481106106465761064661210e565b6000918252602090912001546001600160a01b0316146106965760405162461bcd60e51b815260206004820152600b60248201526a1ddc9bdb99c8185cdcd95d60aa1b60448201526064016105cb565b600880546106a69060019061213a565b815481106106b6576106b661210e565b600091825260209091200154600880546001600160a01b0390921691839081106106e2576106e261210e565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060088054806107215761072161214d565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0393909316815260069092525060409020805460ff19169055565b610771611841565b6001600160a01b038216600081815260036020908152604091829020805460ff191685151590811790915591519182527fcd202ea0907016dd42e40faedc5cf5c3e6368644993f46c95990dfa7f84bfaa991015b60405180910390a25050565b6107d9611841565b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915591519182527fc93ec0e3c82bbe3866d85f7d0915cda166df7c76944b9fae88bcf11608f791bf91016107c5565b6001600160a01b03811660009081526007602090815260409182902080548351818402810184019094528084526060939283018282801561089b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161087d575b50505050509050919050565b6108af611889565b6001600160a01b03828116600090815260056020526040902054166109025760405162461bcd60e51b815260206004820152600960248201526808515b991bdc9cd95960ba1b60448201526064016105cb565b6001600160a01b038216600090815260056020526040902060020161092782826121ae565b506040516001600160a01b038316907f9831985c7ff4c3d7dbd921d753150cc58a3a2a21c93795bbaac5bbf32baab3bb90600090a25050565b606060088054806020026020016040519081016040528092919081815260200182805480156109b857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161099a575b5050505050905090565b606060006008805480602002602001604051908101604052809291908181526020018280548015610a1c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109fe575b505060085493945083925050506001600160401b03811115610a4057610a40611c8c565b604051908082528060200260200182016040528015610a7357816020015b6060815260200190600190039081610a5e5790505b50925060005b81811015610b465760076000848381518110610a9757610a9761210e565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610b1357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610af5575b5050505050848281518110610b2a57610b2a61210e565b602002602001018190525080610b3f9061226d565b9050610a79565b50505090565b6000610b566117df565b60008260017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356e0a94b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdd9190612286565b610be7919061213a565b610bf1919061213a565b6040516319c8e0f160e21b8152600481018290529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063672383c490602401602060405180830381865afa158015610c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c80919061229f565b90506001600160a01b038116610cd85760405162461bcd60e51b815260206004820152601960248201527f52656769737472793a20756e6b6e6f776e2072656c656173650000000000000060448201526064016105cb565b60405163b4aeee7760e01b81526001600160a01b0382169063b4aeee7790610d0c908c908c908c908c908c906004016122bc565b6020604051808303816000875af1158015610d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4f919061229f565b9250610d5f838a846001426118e7565b50509695505050505050565b610d736117df565b6001600160a01b038481166000908152600560205260409020541615610dc65760405162461bcd60e51b8152602060048201526008602482015267195b991bdc9cd95960c21b60448201526064016105cb565b81600003610e025760405162461bcd60e51b81526020600482015260096024820152686e6f2030207479706560b81b60448201526064016105cb565b6001600160801b03821115610e495760405162461bcd60e51b815260206004820152600d60248201526c0e8f2e0ca40e8dede40d0d2ced609b1b60448201526064016105cb565b42811115610e8c5760405162461bcd60e51b815260206004820152601060248201526f216465706c6f796d656e742074696d6560801b60448201526064016105cb565b60008360017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356e0a94b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f139190612286565b610f1d919061213a565b610f27919061213a565b6040516319c8e0f160e21b8152600481018290529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063672383c490602401602060405180830381865afa158015610f92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb6919061229f565b6001600160a01b031663258294106040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ff3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261101b9190810190612306565b90508080519060200120866001600160a01b031663258294106040518163ffffffff1660e01b8152600401600060405180830381865afa158015611063573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261108b9190810190612306565b80519060200120146110d35760405162461bcd60e51b81526020600482015260116024820152702bb937b7339020a824902b32b939b4b7b760791b60448201526064016105cb565b61114186876001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611139919061229f565b8487876118e7565b505050505050565b6005602052600090815260409020805460018201546002830180546001600160a01b03841694600160a01b9094046001600160601b0316936001600160401b0380851694600160401b81046001600160801b031694600160c01b909104909116926111b3906120d4565b80601f01602080910402602001604051908101604052809291908181526020018280546111df906120d4565b801561122c5780601f106112015761010080835404028352916020019161122c565b820191906000526020600020905b81548152906001019060200180831161120f57829003601f168201915b5050505050905086565b6001600160a01b03818116600090815260056020526040812054909116151580611264575061126482611751565b92915050565b611272611841565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61129c6117df565b6001600160a01b038181166000908152600560209081526040808320815160c08101835281549586168152600160a01b9095046001600160601b03169285019290925260018201546001600160401b0380821692860192909252600160401b81046001600160801b03166060860152600160c01b900416608084015260028101805492939260a084019190611330906120d4565b80601f016020809104026020016040519081016040528092919081815260200182805461135c906120d4565b80156113a95780601f1061137e576101008083540402835291602001916113a9565b820191906000526020600020905b81548152906001019060200180831161138c57829003601f168201915b5050509190925250508151919250506001600160a01b03166113f95760405162461bcd60e51b815260206004820152600960248201526808595b991bdc9cd95960ba1b60448201526064016105cb565b80516001600160a01b03908116600090815260076020526040902060808301518154928516926001600160401b039091169081106114395761143961210e565b6000918252602090912001546001600160a01b0316146114895760405162461bcd60e51b815260206004820152600b60248201526a1ddc9bdb99c81d985d5b1d60aa1b60448201526064016105cb565b80516001600160a01b03908116600090815260076020526040808220845190931682528120549091906114be9060019061213a565b815481106114ce576114ce61210e565b6000918252602090912001546001600160a01b0390811691508316811461158d5781516001600160a01b03166000908152600760205260409020608083015181548392916001600160401b031690811061152a5761152a61210e565b6000918252602080832090910180546001600160a01b039485166001600160a01b031990911617905560808501519284168252600590526040902060010180546001600160401b03909216600160c01b026001600160c01b039092169190911790555b81516001600160a01b031660009081526007602052604090208054806115b5576115b561214d565b6001900381819060005260206000200160006101000a8154906001600160a01b030219169055905581600001516001600160a01b0316836001600160a01b03167fb8d23ba050f8f00e22675f82cf3786ade63b12a46d4ea236927baf4d173c30928460200151856040015160405161164b9291906001600160601b039290921682526001600160401b0316602082015260400190565b60405180910390a36001600160a01b038316600090815260056020526040812081815560018101829055906116836002830182611ba9565b5050505050565b6008818154811061169a57600080fd5b6000918252602090912001546001600160a01b0316905081565b6116bc611841565b6001600160a01b0381166117015760405162461bcd60e51b815260206004820152600c60248201526b5a45524f204144445245535360a01b60448201526064016105cb565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce809190a35050565b6002546000906001600160a01b03168061176e5750600092915050565b60405163a237e94d60e01b81526001600160a01b03848116600483015282169063a237e94d90602401602060405180830381865afa1580156117b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d8919061237c565b9392505050565b6000546001600160a01b031633148061180757503360009081526004602052604090205460ff165b61183f5760405162461bcd60e51b815260206004820152600960248201526810b2b73237b939b2b960b91b60448201526064016105cb565b565b6000546001600160a01b0316331461183f5760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b60448201526064016105cb565b6000546001600160a01b03163314806118b157503360009081526003602052604090205460ff165b61183f5760405162461bcd60e51b815260206004820152600760248201526610ba30b3b3b2b960c91b60448201526064016105cb565b6040518060c00160405280856001600160a01b03168152602001846001600160601b03168152602001836001600160401b03168152602001826001600160801b0316815260200160076000876001600160a01b03166001600160a01b03168152602001908152602001600020805490506001600160401b031681526020016040518060200160405280600081525081525060056000876001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a8154816001600160601b0302191690836001600160601b0316021790555060408201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160010160086101000a8154816001600160801b0302191690836001600160801b0316021790555060808201518160010160186101000a8154816001600160401b0302191690836001600160401b0316021790555060a0820151816002019081611a9391906121ae565b5050506001600160a01b03848116600081815260076020908152604080832080546001810182559084528284200180546001600160a01b031916958b16959095179094559181526006909152205460ff16611b4c576008805460018082019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0387169081179091556000908152600660205260409020805460ff191690911790555b836001600160a01b0316856001600160a01b03167fa9a7c68f108b706e545bc75ac8590730afa49f639d2e48f367105c9801c18fd28585604051611b9a929190918252602082015260400190565b60405180910390a35050505050565b508054611bb5906120d4565b6000825580601f10611bc5575050565b601f01602090049060005260206000209081019061054891905b80821115611bf35760008155600101611bdf565b5090565b60005b83811015611c12578181015183820152602001611bfa565b50506000910152565b60008151808452611c33816020860160208601611bf7565b601f01601f19169290920160200192915050565b6020815260006117d86020830184611c1b565b6001600160a01b038116811461054857600080fd5b600060208284031215611c8157600080fd5b81356117d881611c5a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611cca57611cca611c8c565b604052919050565b60006001600160401b03821115611ceb57611ceb611c8c565b50601f01601f191660200190565b600082601f830112611d0a57600080fd5b8135611d1d611d1882611cd2565b611ca2565b818152846020838601011115611d3257600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611d6757600080fd5b8535611d7281611c5a565b945060208601356001600160401b0380821115611d8e57600080fd5b611d9a89838a01611cf9565b95506040880135915080821115611db057600080fd5b50611dbd88828901611cf9565b9350506060860135611dce81611c5a565b949793965091946080013592915050565b60008060408385031215611df257600080fd5b8235611dfd81611c5a565b946020939093013593505050565b801515811461054857600080fd5b60008060408385031215611e2c57600080fd5b8235611e3781611c5a565b91506020830135611e4781611e0b565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015611e935783516001600160a01b031683529284019291840191600101611e6e565b50909695505050505050565b60008060408385031215611eb257600080fd5b8235611ebd81611c5a565b915060208301356001600160401b03811115611ed857600080fd5b611ee485828601611cf9565b9150509250929050565b6000602080830181845280855180835260408601915060408160051b87010192508387016000805b83811015611f7357888603603f19018552825180518088529088019088880190845b81811015611f5d5783516001600160a01b03168352928a0192918a0191600101611f38565b5090975050509386019391860191600101611f16565b509398975050505050505050565b60008060008060008060c08789031215611f9a57600080fd5b8635611fa581611c5a565b955060208701356001600160401b0380821115611fc157600080fd5b611fcd8a838b01611cf9565b96506040890135915080821115611fe357600080fd5b50611ff089828a01611cf9565b945050606087013561200181611c5a565b9598949750929560808101359460a0909101359350915050565b6000806000806080858703121561203157600080fd5b843561203c81611c5a565b966020860135965060408601359560600135945092505050565b6001600160a01b03871681526001600160601b03861660208201526001600160401b0385811660408301526001600160801b03851660608301528316608082015260c060a082018190526000906120af90830184611c1b565b98975050505050505050565b6000602082840312156120cd57600080fd5b5035919050565b600181811c908216806120e857607f821691505b60208210810361210857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561126457611264612124565b634e487b7160e01b600052603160045260246000fd5b601f8211156121a957600081815260208120601f850160051c8101602086101561218a5750805b601f850160051c820191505b8181101561114157828155600101612196565b505050565b81516001600160401b038111156121c7576121c7611c8c565b6121db816121d584546120d4565b84612163565b602080601f83116001811461221057600084156121f85750858301515b600019600386901b1c1916600185901b178555611141565b600085815260208120601f198616915b8281101561223f57888601518255948401946001909101908401612220565b508582101561225d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001820161227f5761227f612124565b5060010190565b60006020828403121561229857600080fd5b5051919050565b6000602082840312156122b157600080fd5b81516117d881611c5a565b600060018060a01b03808816835260a060208401526122de60a0840188611c1b565b83810360408501526122f08188611c1b565b9590911660608401525050608001529392505050565b60006020828403121561231857600080fd5b81516001600160401b0381111561232e57600080fd5b8201601f8101841361233f57600080fd5b805161234d611d1882611cd2565b81815285602083850101111561236257600080fd5b612373826020830160208601611bf7565b95945050505050565b60006020828403121561238e57600080fd5b81516117d881611e0b56fea264697066735822122032af84f44144191d21bfedf6440b7cf6f688c01398754784981243c95a2c111a64736f6c63430008120033000000000000000000000000feb4acf3df3cdea7399794d0869ef76a6efaff5200000000000000000000000000000000000000000000000000000000000000600000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f71980000000000000000000000000000000000000000000000000000000000000011596561726e205633205265676973747279000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806370df8ba711610104578063a4fc5922116100a2578063ceb68c2311610071578063ceb68c231461045f578063cf35bdd014610472578063d38bfff414610485578063da1281dd1461049857600080fd5b8063a4fc5922146103ed578063ac01762a14610400578063ae8c9d1314610423578063b2c6161c1461043657600080fd5b80639164359a116100de5780639164359a146103a557806398a5e07b146103ca578063a237e94d146103d2578063a46fe83b146103e557600080fd5b806370df8ba71461036a5780637be7b20b1461037f57806389c6acec1461039257600080fd5b80632aa59c921161017c5780635aa6e6751161014b5780635aa6e675146103195780635b25d2c81461032c57806360bd68f81461034f57806367e4ac2c1461036257600080fd5b80632aa59c92146102a05780632c2a72d5146102b35780633515a20b146102c657806353d2e949146102f957600080fd5b806317bdd312116101b857806317bdd3121461022557806318d1dd831461025057806319ee073e146102665780632317ef671461028d57600080fd5b806306fdde03146101df5780630ab322d9146101fd5780630f7872cc14610212575b600080fd5b6101e76104ab565b6040516101f49190611c47565b60405180910390f35b61021061020b366004611c6f565b610539565b005b610210610220366004611c6f565b61054b565b610238610233366004611d4f565b61055a565b6040516001600160a01b0390911681526020016101f4565b610258600181565b6040519081526020016101f4565b6102387f0000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f719881565b61021061029b366004611ddf565b610575565b6102106102ae366004611e19565b610769565b6102106102c1366004611e19565b6107d1565b6102e96102d4366004611c6f565b60046020526000908152604090205460ff1681565b60405190151581526020016101f4565b61030c610307366004611c6f565b610831565b6040516101f49190611e52565b600054610238906001600160a01b031681565b6102e961033a366004611c6f565b60036020526000908152604090205460ff1681565b61021061035d366004611e9f565b6108a7565b61030c610960565b6103726109c2565b6040516101f49190611eee565b61023861038d366004611f81565b610b4c565b6102106103a036600461201b565b610d6b565b6103b86103b3366004611c6f565b611149565b6040516101f496959493929190612056565b610258600281565b6102e96103e0366004611c6f565b611236565b600854610258565b6102106103fb366004611c6f565b61126a565b6102e961040e366004611c6f565b60066020526000908152604090205460ff1681565b600254610238906001600160a01b031681565b610258610444366004611c6f565b6001600160a01b031660009081526007602052604090205490565b61021061046d366004611c6f565b611294565b6102386104803660046120bb565b61168a565b610210610493366004611c6f565b6116b4565b6102e96104a6366004611c6f565b611751565b600180546104b8906120d4565b80601f01602080910402602001604051908101604052809291908181526020018280546104e4906120d4565b80156105315780601f1061050657610100808354040283529160200191610531565b820191906000526020600020905b81548152906001019060200180831161051457829003601f168201915b505050505081565b61054881600060016000610d6b565b50565b61054881600060026000610d6b565b600061056b86868686866000610b4c565b9695505050505050565b61057d6117df565b6001600160a01b03821660009081526006602052604090205460ff166105d45760405162461bcd60e51b815260206004820152600760248201526621696e2075736560c81b60448201526064015b60405180910390fd5b6001600160a01b038216600090815260076020526040902054156106295760405162461bcd60e51b815260206004820152600c60248201526b7374696c6c20696e2075736560a01b60448201526064016105cb565b816001600160a01b0316600882815481106106465761064661210e565b6000918252602090912001546001600160a01b0316146106965760405162461bcd60e51b815260206004820152600b60248201526a1ddc9bdb99c8185cdcd95d60aa1b60448201526064016105cb565b600880546106a69060019061213a565b815481106106b6576106b661210e565b600091825260209091200154600880546001600160a01b0390921691839081106106e2576106e261210e565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060088054806107215761072161214d565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0393909316815260069092525060409020805460ff19169055565b610771611841565b6001600160a01b038216600081815260036020908152604091829020805460ff191685151590811790915591519182527fcd202ea0907016dd42e40faedc5cf5c3e6368644993f46c95990dfa7f84bfaa991015b60405180910390a25050565b6107d9611841565b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915591519182527fc93ec0e3c82bbe3866d85f7d0915cda166df7c76944b9fae88bcf11608f791bf91016107c5565b6001600160a01b03811660009081526007602090815260409182902080548351818402810184019094528084526060939283018282801561089b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161087d575b50505050509050919050565b6108af611889565b6001600160a01b03828116600090815260056020526040902054166109025760405162461bcd60e51b815260206004820152600960248201526808515b991bdc9cd95960ba1b60448201526064016105cb565b6001600160a01b038216600090815260056020526040902060020161092782826121ae565b506040516001600160a01b038316907f9831985c7ff4c3d7dbd921d753150cc58a3a2a21c93795bbaac5bbf32baab3bb90600090a25050565b606060088054806020026020016040519081016040528092919081815260200182805480156109b857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161099a575b5050505050905090565b606060006008805480602002602001604051908101604052809291908181526020018280548015610a1c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109fe575b505060085493945083925050506001600160401b03811115610a4057610a40611c8c565b604051908082528060200260200182016040528015610a7357816020015b6060815260200190600190039081610a5e5790505b50925060005b81811015610b465760076000848381518110610a9757610a9761210e565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610b1357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610af5575b5050505050848281518110610b2a57610b2a61210e565b602002602001018190525080610b3f9061226d565b9050610a79565b50505090565b6000610b566117df565b60008260017f0000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f71986001600160a01b03166356e0a94b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdd9190612286565b610be7919061213a565b610bf1919061213a565b6040516319c8e0f160e21b8152600481018290529091506000906001600160a01b037f0000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f7198169063672383c490602401602060405180830381865afa158015610c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c80919061229f565b90506001600160a01b038116610cd85760405162461bcd60e51b815260206004820152601960248201527f52656769737472793a20756e6b6e6f776e2072656c656173650000000000000060448201526064016105cb565b60405163b4aeee7760e01b81526001600160a01b0382169063b4aeee7790610d0c908c908c908c908c908c906004016122bc565b6020604051808303816000875af1158015610d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4f919061229f565b9250610d5f838a846001426118e7565b50509695505050505050565b610d736117df565b6001600160a01b038481166000908152600560205260409020541615610dc65760405162461bcd60e51b8152602060048201526008602482015267195b991bdc9cd95960c21b60448201526064016105cb565b81600003610e025760405162461bcd60e51b81526020600482015260096024820152686e6f2030207479706560b81b60448201526064016105cb565b6001600160801b03821115610e495760405162461bcd60e51b815260206004820152600d60248201526c0e8f2e0ca40e8dede40d0d2ced609b1b60448201526064016105cb565b42811115610e8c5760405162461bcd60e51b815260206004820152601060248201526f216465706c6f796d656e742074696d6560801b60448201526064016105cb565b60008360017f0000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f71986001600160a01b03166356e0a94b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f139190612286565b610f1d919061213a565b610f27919061213a565b6040516319c8e0f160e21b8152600481018290529091506000906001600160a01b037f0000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f7198169063672383c490602401602060405180830381865afa158015610f92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb6919061229f565b6001600160a01b031663258294106040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ff3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261101b9190810190612306565b90508080519060200120866001600160a01b031663258294106040518163ffffffff1660e01b8152600401600060405180830381865afa158015611063573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261108b9190810190612306565b80519060200120146110d35760405162461bcd60e51b81526020600482015260116024820152702bb937b7339020a824902b32b939b4b7b760791b60448201526064016105cb565b61114186876001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611139919061229f565b8487876118e7565b505050505050565b6005602052600090815260409020805460018201546002830180546001600160a01b03841694600160a01b9094046001600160601b0316936001600160401b0380851694600160401b81046001600160801b031694600160c01b909104909116926111b3906120d4565b80601f01602080910402602001604051908101604052809291908181526020018280546111df906120d4565b801561122c5780601f106112015761010080835404028352916020019161122c565b820191906000526020600020905b81548152906001019060200180831161120f57829003601f168201915b5050505050905086565b6001600160a01b03818116600090815260056020526040812054909116151580611264575061126482611751565b92915050565b611272611841565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61129c6117df565b6001600160a01b038181166000908152600560209081526040808320815160c08101835281549586168152600160a01b9095046001600160601b03169285019290925260018201546001600160401b0380821692860192909252600160401b81046001600160801b03166060860152600160c01b900416608084015260028101805492939260a084019190611330906120d4565b80601f016020809104026020016040519081016040528092919081815260200182805461135c906120d4565b80156113a95780601f1061137e576101008083540402835291602001916113a9565b820191906000526020600020905b81548152906001019060200180831161138c57829003601f168201915b5050509190925250508151919250506001600160a01b03166113f95760405162461bcd60e51b815260206004820152600960248201526808595b991bdc9cd95960ba1b60448201526064016105cb565b80516001600160a01b03908116600090815260076020526040902060808301518154928516926001600160401b039091169081106114395761143961210e565b6000918252602090912001546001600160a01b0316146114895760405162461bcd60e51b815260206004820152600b60248201526a1ddc9bdb99c81d985d5b1d60aa1b60448201526064016105cb565b80516001600160a01b03908116600090815260076020526040808220845190931682528120549091906114be9060019061213a565b815481106114ce576114ce61210e565b6000918252602090912001546001600160a01b0390811691508316811461158d5781516001600160a01b03166000908152600760205260409020608083015181548392916001600160401b031690811061152a5761152a61210e565b6000918252602080832090910180546001600160a01b039485166001600160a01b031990911617905560808501519284168252600590526040902060010180546001600160401b03909216600160c01b026001600160c01b039092169190911790555b81516001600160a01b031660009081526007602052604090208054806115b5576115b561214d565b6001900381819060005260206000200160006101000a8154906001600160a01b030219169055905581600001516001600160a01b0316836001600160a01b03167fb8d23ba050f8f00e22675f82cf3786ade63b12a46d4ea236927baf4d173c30928460200151856040015160405161164b9291906001600160601b039290921682526001600160401b0316602082015260400190565b60405180910390a36001600160a01b038316600090815260056020526040812081815560018101829055906116836002830182611ba9565b5050505050565b6008818154811061169a57600080fd5b6000918252602090912001546001600160a01b0316905081565b6116bc611841565b6001600160a01b0381166117015760405162461bcd60e51b815260206004820152600c60248201526b5a45524f204144445245535360a01b60448201526064016105cb565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce809190a35050565b6002546000906001600160a01b03168061176e5750600092915050565b60405163a237e94d60e01b81526001600160a01b03848116600483015282169063a237e94d90602401602060405180830381865afa1580156117b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d8919061237c565b9392505050565b6000546001600160a01b031633148061180757503360009081526004602052604090205460ff165b61183f5760405162461bcd60e51b815260206004820152600960248201526810b2b73237b939b2b960b91b60448201526064016105cb565b565b6000546001600160a01b0316331461183f5760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b60448201526064016105cb565b6000546001600160a01b03163314806118b157503360009081526003602052604090205460ff165b61183f5760405162461bcd60e51b815260206004820152600760248201526610ba30b3b3b2b960c91b60448201526064016105cb565b6040518060c00160405280856001600160a01b03168152602001846001600160601b03168152602001836001600160401b03168152602001826001600160801b0316815260200160076000876001600160a01b03166001600160a01b03168152602001908152602001600020805490506001600160401b031681526020016040518060200160405280600081525081525060056000876001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a8154816001600160601b0302191690836001600160601b0316021790555060408201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160010160086101000a8154816001600160801b0302191690836001600160801b0316021790555060808201518160010160186101000a8154816001600160401b0302191690836001600160401b0316021790555060a0820151816002019081611a9391906121ae565b5050506001600160a01b03848116600081815260076020908152604080832080546001810182559084528284200180546001600160a01b031916958b16959095179094559181526006909152205460ff16611b4c576008805460018082019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0387169081179091556000908152600660205260409020805460ff191690911790555b836001600160a01b0316856001600160a01b03167fa9a7c68f108b706e545bc75ac8590730afa49f639d2e48f367105c9801c18fd28585604051611b9a929190918252602082015260400190565b60405180910390a35050505050565b508054611bb5906120d4565b6000825580601f10611bc5575050565b601f01602090049060005260206000209081019061054891905b80821115611bf35760008155600101611bdf565b5090565b60005b83811015611c12578181015183820152602001611bfa565b50506000910152565b60008151808452611c33816020860160208601611bf7565b601f01601f19169290920160200192915050565b6020815260006117d86020830184611c1b565b6001600160a01b038116811461054857600080fd5b600060208284031215611c8157600080fd5b81356117d881611c5a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611cca57611cca611c8c565b604052919050565b60006001600160401b03821115611ceb57611ceb611c8c565b50601f01601f191660200190565b600082601f830112611d0a57600080fd5b8135611d1d611d1882611cd2565b611ca2565b818152846020838601011115611d3257600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611d6757600080fd5b8535611d7281611c5a565b945060208601356001600160401b0380821115611d8e57600080fd5b611d9a89838a01611cf9565b95506040880135915080821115611db057600080fd5b50611dbd88828901611cf9565b9350506060860135611dce81611c5a565b949793965091946080013592915050565b60008060408385031215611df257600080fd5b8235611dfd81611c5a565b946020939093013593505050565b801515811461054857600080fd5b60008060408385031215611e2c57600080fd5b8235611e3781611c5a565b91506020830135611e4781611e0b565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015611e935783516001600160a01b031683529284019291840191600101611e6e565b50909695505050505050565b60008060408385031215611eb257600080fd5b8235611ebd81611c5a565b915060208301356001600160401b03811115611ed857600080fd5b611ee485828601611cf9565b9150509250929050565b6000602080830181845280855180835260408601915060408160051b87010192508387016000805b83811015611f7357888603603f19018552825180518088529088019088880190845b81811015611f5d5783516001600160a01b03168352928a0192918a0191600101611f38565b5090975050509386019391860191600101611f16565b509398975050505050505050565b60008060008060008060c08789031215611f9a57600080fd5b8635611fa581611c5a565b955060208701356001600160401b0380821115611fc157600080fd5b611fcd8a838b01611cf9565b96506040890135915080821115611fe357600080fd5b50611ff089828a01611cf9565b945050606087013561200181611c5a565b9598949750929560808101359460a0909101359350915050565b6000806000806080858703121561203157600080fd5b843561203c81611c5a565b966020860135965060408601359560600135945092505050565b6001600160a01b03871681526001600160601b03861660208201526001600160401b0385811660408301526001600160801b03851660608301528316608082015260c060a082018190526000906120af90830184611c1b565b98975050505050505050565b6000602082840312156120cd57600080fd5b5035919050565b600181811c908216806120e857607f821691505b60208210810361210857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561126457611264612124565b634e487b7160e01b600052603160045260246000fd5b601f8211156121a957600081815260208120601f850160051c8101602086101561218a5750805b601f850160051c820191505b8181101561114157828155600101612196565b505050565b81516001600160401b038111156121c7576121c7611c8c565b6121db816121d584546120d4565b84612163565b602080601f83116001811461221057600084156121f85750858301515b600019600386901b1c1916600185901b178555611141565b600085815260208120601f198616915b8281101561223f57888601518255948401946001909101908401612220565b508582101561225d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001820161227f5761227f612124565b5060010190565b60006020828403121561229857600080fd5b5051919050565b6000602082840312156122b157600080fd5b81516117d881611c5a565b600060018060a01b03808816835260a060208401526122de60a0840188611c1b565b83810360408501526122f08188611c1b565b9590911660608401525050608001529392505050565b60006020828403121561231857600080fd5b81516001600160401b0381111561232e57600080fd5b8201601f8101841361233f57600080fd5b805161234d611d1882611cd2565b81815285602083850101111561236257600080fd5b612373826020830160208601611bf7565b95945050505050565b60006020828403121561238e57600080fd5b81516117d881611e0b56fea264697066735822122032af84f44144191d21bfedf6440b7cf6f688c01398754784981243c95a2c111a64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000feb4acf3df3cdea7399794d0869ef76a6efaff5200000000000000000000000000000000000000000000000000000000000000600000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f71980000000000000000000000000000000000000000000000000000000000000011596561726e205633205265676973747279000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _governance (address): 0xFEB4acf3df3cDEA7399794D0869ef76A6EfAff52
Arg [1] : _name (string): Yearn V3 Registry
Arg [2] : _releaseRegistry (address): 0x0377b4daDDA86C89A0091772B79ba67d0E5F7198
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000feb4acf3df3cdea7399794d0869ef76a6efaff52
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 0000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f7198
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [4] : 596561726e205633205265676973747279000000000000000000000000000000
Deployed Bytecode Sourcemap
31050:18347:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33547:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41296:134;;;;;;:::i;:::-;;:::i;:::-;;41700:136;;;;;;:::i;:::-;;:::i;38450:495::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3289:32:1;;;3271:51;;3259:2;3244:18;38450:495:0;3125:203:1;33329:47:0;;33375:1;33329:47;;;;;3479:25:1;;;3467:2;3452:18;33329:47:0;3333:177:1;33215:40:0;;;;;47710:536;;;;;;:::i;:::-;;:::i;48894:203::-;;;;;;:::i;:::-;;:::i;48477:221::-;;;;;;:::i;:::-;;:::i;33857:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4510:14:1;;4503:22;4485:41;;4473:2;4458:18;33857:41:0;4345:187:1;35817:157:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3524:25::-;;;;;-1:-1:-1;;;;;3524:25:0;;;33739:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;45521:262;;;;;;:::i;:::-;;:::i;35229:102::-;;;:::i;36376:415::-;;;:::i;:::-;;;;;;;:::i;39791:1236::-;;;;;;:::i;:::-;;:::i;42512:1373::-;;;;;;:::i;:::-;;:::i;33954:41::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;33451:48::-;;33498:1;33451:48;;37105:161;;;;;;:::i;:::-;;:::i;34981:100::-;35060:6;:13;34981:100;;49243:151;;;;;;:::i;:::-;;:::i;34064:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;33637:29;;;;;-1:-1:-1;;;;;33637:29:0;;;35472:153;;;;;;:::i;:::-;-1:-1:-1;;;;;35587:23:0;35560:7;35587:23;;;:15;:23;;;;;:30;;35472:153;46167:1222;;;;;;:::i;:::-;;:::i;34278:23::-;;;;;;:::i;:::-;;:::i;3913:325::-;;;;;;:::i;:::-;;:::i;37490:233::-;;;;;;:::i;:::-;;:::i;33547:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41296:134::-;41375:47;41388:6;41396:1;33375;41420;41375:12;:47::i;:::-;41296:134;:::o;41700:136::-;41780:48;41793:6;41801:1;33498;41826;41780:12;:48::i;38450:495::-;38664:14;38711:226;38746:6;38771:5;38795:7;38821:12;38852:20;38891:1;38711:16;:226::i;:::-;38691:246;38450:495;-1:-1:-1;;;;;;38450:495:0:o;47710:536::-;31984:13;:11;:13::i;:::-;-1:-1:-1;;;;;47838:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;;::::1;;47830:39;;;::::0;-1:-1:-1;;;47830:39:0;;9910:2:1;47830:39:0::1;::::0;::::1;9892:21:1::0;9949:1;9929:18;;;9922:29;-1:-1:-1;;;9967:18:1;;;9960:37;10014:18;;47830:39:0::1;;;;;;;;;-1:-1:-1::0;;;;;47888:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;:30;:35;47880:60:::1;;;::::0;-1:-1:-1;;;47880:60:0;;10245:2:1;47880:60:0::1;::::0;::::1;10227:21:1::0;10284:2;10264:18;;;10257:30;-1:-1:-1;;;10303:18:1;;;10296:42;10355:18;;47880:60:0::1;10043:336:1::0;47880:60:0::1;47977:6;-1:-1:-1::0;;;;;47959:24:0::1;:6;47966;47959:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;47959:14:0::1;:24;47951:48;;;::::0;-1:-1:-1;;;47951:48:0;;10718:2:1;47951:48:0::1;::::0;::::1;10700:21:1::0;10757:2;10737:18;;;10730:30;-1:-1:-1;;;10776:18:1;;;10769:41;10827:18;;47951:48:0::1;10516:335:1::0;47951:48:0::1;48079:6;48086:13:::0;;:17:::1;::::0;48102:1:::1;::::0;48086:17:::1;:::i;:::-;48079:25;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;48062:6:::1;:14:::0;;-1:-1:-1;;;;;48079:25:0;;::::1;::::0;48069:6;;48062:14;::::1;;;;;:::i;:::-;;;;;;;;;:42;;;;;-1:-1:-1::0;;;;;48062:42:0::1;;;;;-1:-1:-1::0;;;;;48062:42:0::1;;;;;;48158:6;:12;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;48158:12:0;;;;;-1:-1:-1;;;;;;48158:12:0::1;::::0;;;;;;;;-1:-1:-1;;;;;48211:19:0;;;::::1;::::0;;:11:::1;:19:::0;;;-1:-1:-1;48211:19:0;;;:27;;-1:-1:-1;;48211:27:0::1;::::0;;47710:536::o;48894:203::-;3220:18;:16;:18::i;:::-;-1:-1:-1;;;;;49013:17:0;::::1;;::::0;;;:7:::1;:17;::::0;;;;;;;;:27;;-1:-1:-1;;49013:27:0::1;::::0;::::1;;::::0;;::::1;::::0;;;49058:31;;4485:41:1;;;49058:31:0::1;::::0;4458:18:1;49058:31:0::1;;;;;;;;48894:203:::0;;:::o;48477:221::-;3220:18;:16;:18::i;:::-;-1:-1:-1;;;;;48602:19:0;::::1;;::::0;;;:9:::1;:19;::::0;;;;;;;;:33;;-1:-1:-1;;48602:33:0::1;::::0;::::1;;::::0;;::::1;::::0;;;48653:37;;4485:41:1;;;48653:37:0::1;::::0;4458:18:1;48653:37:0::1;4345:187:1::0;35817:157:0;-1:-1:-1;;;;;35943:23:0;;;;;;:15;:23;;;;;;;;;35936:30;;;;;;;;;;;;;;;;;35907:16;;35936:30;;;35943:23;35936:30;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35936:30:0;;;;;;;;;;;;;;;;;;;;;;;35817:157;;;:::o;45521:262::-;32107:11;:9;:11::i;:::-;-1:-1:-1;;;;;45648:17:0;;::::1;45683:1;45648:17:::0;;;:9:::1;:17;::::0;;;;:23;::::1;45640:59;;;::::0;-1:-1:-1;;;45640:59:0;;11455:2:1;45640:59:0::1;::::0;::::1;11437:21:1::0;11494:1;11474:18;;;11467:29;-1:-1:-1;;;11512:18:1;;;11505:39;11561:18;;45640:59:0::1;11253:332:1::0;45640:59:0::1;-1:-1:-1::0;;;;;45710:17:0;::::1;;::::0;;;:9:::1;:17;::::0;;;;:21:::1;;:28;45734:4:::0;45710:21;:28:::1;:::i;:::-;-1:-1:-1::0;45756:19:0::1;::::0;-1:-1:-1;;;;;45756:19:0;::::1;::::0;::::1;::::0;;;::::1;45521:262:::0;;:::o;35229:102::-;35281:16;35317:6;35310:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35310:13:0;;;;;;;;;;;;;;;;;;;;;;;35229:102;:::o;36376:415::-;36475:36;36529:26;36558:6;36529:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36529:35:0;;;;;;;;;;;;;;;;-1:-1:-1;;36592:6:0;:13;36529:35;;-1:-1:-1;36592:13:0;;-1:-1:-1;;;;;;;;36638:23:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36618:43;;36677:9;36672:112;36692:6;36688:1;:10;36672:112;;;36743:15;:29;36759:9;36769:1;36759:12;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;36743:29:0;-1:-1:-1;;;;;36743:29:0;;;;;;;;;;;;36720:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36720:52:0;;;;;;;;;;;;;;;;;;;;;:17;36738:1;36720:20;;;;;;;;:::i;:::-;;;;;;:52;;;;36700:3;;;;:::i;:::-;;;36672:112;;;;36518:273;;36376:415;:::o;39791:1236::-;40051:14;31984:13;:11;:13::i;:::-;40139:22:::1;40257:13;40240:1;40180:15;-1:-1:-1::0;;;;;40164:58:0::1;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:77;;;;:::i;:::-;:106;;;;:::i;:::-;40368:82;::::0;-1:-1:-1;;;40368:82:0;;::::1;::::0;::::1;3479:25:1::0;;;40139:131:0;;-1:-1:-1;40350:15:0::1;::::0;-1:-1:-1;;;;;40384:15:0::1;40368:42;::::0;::::1;::::0;3452:18:1;;40368:82:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40350:100:::0;-1:-1:-1;;;;;;40518:21:0;::::1;40510:59;;;::::0;-1:-1:-1;;;40510:59:0;;14581:2:1;40510:59:0::1;::::0;::::1;14563:21:1::0;14620:2;14600:18;;;14593:30;14659:27;14639:18;;;14632:55;14704:18;;40510:59:0::1;14379:349:1::0;40510:59:0::1;40621:175;::::0;-1:-1:-1;;;40621:175:0;;-1:-1:-1;;;;;40621:39:0;::::1;::::0;::::1;::::0;:175:::1;::::0;40675:6;;40696:5;;40716:7;;40738:12;;40765:20;;40621:175:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40612:184;;40859:160;40888:6;40909;40930:14;33375:1;40993:15;40859:14;:160::i;:::-;40067:960;;39791:1236:::0;;;;;;;;:::o;42512:1373::-;31984:13;:11;:13::i;:::-;-1:-1:-1;;;;;42748:17:0;;::::1;42783:1;42748:17:::0;;;:9:::1;:17;::::0;;;;:23;::::1;:37:::0;42740:58:::1;;;::::0;-1:-1:-1;;;42740:58:0;;15595:2:1;42740:58:0::1;::::0;::::1;15577:21:1::0;15634:1;15614:18;;;15607:29;-1:-1:-1;;;15652:18:1;;;15645:38;15700:18;;42740:58:0::1;15393:331:1::0;42740:58:0::1;42817:10;42831:1;42817:15:::0;42809:37:::1;;;::::0;-1:-1:-1;;;42809:37:0;;15931:2:1;42809:37:0::1;::::0;::::1;15913:21:1::0;15970:1;15950:18;;;15943:29;-1:-1:-1;;;15988:18:1;;;15981:39;16037:18;;42809:37:0::1;15729:332:1::0;42809:37:0::1;-1:-1:-1::0;;;;;42865:31:0;::::1;;42857:57;;;::::0;-1:-1:-1;;;42857:57:0;;16268:2:1;42857:57:0::1;::::0;::::1;16250:21:1::0;16307:2;16287:18;;;16280:30;-1:-1:-1;;;16326:18:1;;;16319:43;16379:18;;42857:57:0::1;16066:337:1::0;42857:57:0::1;42957:15;42933:20;:39;;42925:68;;;::::0;-1:-1:-1;;;42925:68:0;;16610:2:1;42925:68:0::1;::::0;::::1;16592:21:1::0;16649:2;16629:18;;;16622:30;-1:-1:-1;;;16668:18:1;;;16661:46;16724:18;;42925:68:0::1;16408:340:1::0;42925:68:0::1;43099:22;43217:13;43200:1;43140:15;-1:-1:-1::0;;;;;43124:58:0::1;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:77;;;;:::i;:::-;:106;;;;:::i;:::-;43375:58;::::0;-1:-1:-1;;;43375:58:0;;::::1;::::0;::::1;3479:25:1::0;;;43099:131:0;;-1:-1:-1;43320:24:0::1;::::0;-1:-1:-1;;;;;43391:15:0::1;43375:42;::::0;::::1;::::0;3452:18:1;;43375:58:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43347:108:0::1;;:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;43347:110:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;43320:137;;43575:10;43558:30;;;;;;43515:6;-1:-1:-1::0;;;;;43508:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;43508:27:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;43492:45;;;;;;:96;43470:163;;;::::0;-1:-1:-1;;;43470:163:0;;17609:2:1;43470:163:0::1;::::0;::::1;17591:21:1::0;17648:2;17628:18;;;17621:30;-1:-1:-1;;;17667:18:1;;;17660:47;17724:18;;43470:163:0::1;17407:341:1::0;43470:163:0::1;43705:172;43734:6;43762;-1:-1:-1::0;;;;;43755:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43792:14;43821:10;43846:20;43705:14;:172::i;:::-;42695:1190;;42512:1373:::0;;;;:::o;33954:41::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33954:41:0;;;-1:-1:-1;;;33954:41:0;;;-1:-1:-1;;;;;33954:41:0;;-1:-1:-1;;;;;33954:41:0;;;;-1:-1:-1;;;33954:41:0;;-1:-1:-1;;;;;33954:41:0;;-1:-1:-1;;;33954:41:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37105:161::-;-1:-1:-1;;;;;37196:17:0;;;37172:4;37196:17;;;:9;:17;;;;;:23;37172:4;;37196:23;:37;;;:62;;;37237:21;37251:6;37237:13;:21::i;:::-;37189:69;37105:161;-1:-1:-1;;37105:161:0:o;49243:151::-;3220:18;:16;:18::i;:::-;49354:14:::1;:32:::0;;-1:-1:-1;;;;;;49354:32:0::1;-1:-1:-1::0;;;;;49354:32:0;;;::::1;::::0;;;::::1;::::0;;49243:151::o;46167:1222::-;31984:13;:11;:13::i;:::-;-1:-1:-1;;;;;46318:17:0;;::::1;46299:16;46318:17:::0;;;:9:::1;:17;::::0;;;;;;;46299:36;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;46299:36:0;;::::1;-1:-1:-1::0;;;;;46299:36:0::1;::::0;;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;;;;;46299:36:0;;::::1;::::0;;;;;;;-1:-1:-1;;;46299:36:0;::::1;-1:-1:-1::0;;;;;46299:36:0::1;::::0;;;;-1:-1:-1;;;46299:36:0;::::1;;::::0;;;;::::1;::::0;::::1;::::0;;:16;;:36;;;;;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;46299:36:0;;;;-1:-1:-1;;46354:10:0;;46299:36;;-1:-1:-1;;;;;;;46354:24:0::1;46346:46;;;::::0;-1:-1:-1;;;46346:46:0;;17955:2:1;46346:46:0::1;::::0;::::1;17937:21:1::0;17994:1;17974:18;;;17967:29;-1:-1:-1;;;18012:18:1;;;18005:39;18061:18;;46346:46:0::1;17753:332:1::0;46346:46:0::1;46441:10:::0;;-1:-1:-1;;;;;46425:27:0;;::::1;;::::0;;;:15:::1;:27;::::0;;;;46453:10:::1;::::0;::::1;::::0;46425:39;;:49;;::::1;::::0;-1:-1:-1;;;;;46425:39:0;;::::1;::::0;;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;46425:39:0::1;:49;46403:110;;;::::0;-1:-1:-1;;;46403:110:0;;18292:2:1;46403:110:0::1;::::0;::::1;18274:21:1::0;18331:2;18311:18;;;18304:30;-1:-1:-1;;;18350:18:1;;;18343:41;18401:18;;46403:110:0::1;18090:335:1::0;46403:110:0::1;46612:10:::0;;-1:-1:-1;;;;;46596:27:0;;::::1;46576:17;46596:27:::0;;;:15:::1;:27;::::0;;;;;46654:10;;46638:27;;::::1;::::0;;;;:34;46576:17;;46596:27;46638:38:::1;::::0;46675:1:::1;::::0;46638:38:::1;:::i;:::-;46596:91;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;46596:91:0;;::::1;::::0;-1:-1:-1;46763:19:0;::::1;::::0;::::1;46759:286;;46879:10:::0;;-1:-1:-1;;;;;46863:27:0::1;;::::0;;;:15:::1;:27;::::0;;;;46891:10:::1;::::0;::::1;::::0;46863:39;;46905:9;;46863:27;-1:-1:-1;;;;;46863:39:0::1;::::0;;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;:51:::0;;-1:-1:-1;;;;;46863:51:0;;::::1;-1:-1:-1::0;;;;;;46863:51:0;;::::1;;::::0;;47022:10:::1;::::0;::::1;::::0;46986:20;;::::1;::::0;;:9:::1;:20:::0;;;;;46863:51;46986:26:::1;:47:::0;;-1:-1:-1;;;;;46986:47:0;;::::1;-1:-1:-1::0;;;46986:47:0::1;-1:-1:-1::0;;;;;46986:47:0;;::::1;::::0;;;::::1;::::0;;46759:286:::1;47118:10:::0;;-1:-1:-1;;;;;47102:27:0::1;;::::0;;;:15:::1;:27;::::0;;;;:33;;;::::1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;47102:33:0::1;;;;;;;47229:4;:10;;;-1:-1:-1::0;;;;;47181:132:0::1;47208:6;-1:-1:-1::0;;;;;47181:132:0::1;;47254:4;:19;;;47288:4;:14;;;47181:132;;;;;;-1:-1:-1::0;;;;;18620:39:1;;;;18602:58;;-1:-1:-1;;;;;18696:31:1;18691:2;18676:18;;18669:59;18590:2;18575:18;;18430:304;47181:132:0::1;;;;;;;;-1:-1:-1::0;;;;;47364:17:0;::::1;;::::0;;;:9:::1;:17;::::0;;;;47357:24;;;;;::::1;::::0;;;47364:17;47357:24:::1;;::::0;::::1;47364:17:::0;47357:24:::1;:::i;:::-;;;46235:1154;;46167:1222:::0;:::o;34278:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34278:23:0;;-1:-1:-1;34278:23:0;:::o;3913:325::-;3220:18;:16;:18::i;:::-;-1:-1:-1;;;;;4032:28:0;::::1;4024:53;;;::::0;-1:-1:-1;;;4024:53:0;;18941:2:1;4024:53:0::1;::::0;::::1;18923:21:1::0;18980:2;18960:18;;;18953:30;-1:-1:-1;;;18999:18:1;;;18992:42;19051:18;;4024:53:0::1;18739:336:1::0;4024:53:0::1;4088:21;4112:10:::0;;-1:-1:-1;;;;;4133:27:0;;::::1;-1:-1:-1::0;;;;;;4133:27:0;::::1;::::0;::::1;::::0;;4178:52:::1;::::0;4112:10;;;::::1;::::0;;;4178:52:::1;::::0;4088:21;4178:52:::1;4013:225;3913:325:::0;:::o;37490:233::-;37593:14;;37558:4;;-1:-1:-1;;;;;37593:14:0;;37620:39;;-1:-1:-1;37654:5:0;;37490:233;-1:-1:-1;;37490:233:0:o;37620:39::-;37679:36;;-1:-1:-1;;;37679:36:0;;-1:-1:-1;;;;;3289:32:1;;;37679:36:0;;;3271:51:1;37679:28:0;;;;;3244:18:1;;37679:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37672:43;37490:233;-1:-1:-1;;;37490:233:0:o;32194:127::-;32264:10;;-1:-1:-1;;;;;32264:10:0;32250;:24;;:49;;-1:-1:-1;32288:10:0;32278:21;;;;:9;:21;;;;;;;;32250:49;32242:71;;;;-1:-1:-1;;;32242:71:0;;19532:2:1;32242:71:0;;;19514:21:1;19571:1;19551:18;;;19544:29;-1:-1:-1;;;19589:18:1;;;19582:39;19638:18;;32242:71:0;19330:332:1;32242:71:0;32194:127::o;3327:117::-;3396:10;;-1:-1:-1;;;;;3396:10:0;3410;3396:24;3388:48;;;;-1:-1:-1;;;3388:48:0;;19869:2:1;3388:48:0;;;19851:21:1;19908:2;19888:18;;;19881:30;-1:-1:-1;;;19927:18:1;;;19920:41;19978:18;;3388:48:0;19667:335:1;32374:121:0;32442:10;;-1:-1:-1;;;;;32442:10:0;32428;:24;;:47;;-1:-1:-1;32464:10:0;32456:19;;;;:7;:19;;;;;;;;32428:47;32420:67;;;;-1:-1:-1;;;32420:67:0;;20209:2:1;32420:67:0;;;20191:21:1;20248:1;20228:18;;;20221:29;-1:-1:-1;;;20266:18:1;;;20259:37;20313:18;;32420:67:0;20007:330:1;44183:915:0;44460:289;;;;;;;;44487:6;-1:-1:-1;;;;;44460:289:0;;;;;44531:14;-1:-1:-1;;;;;44460:289:0;;;;;44579:10;-1:-1:-1;;;;;44460:289:0;;;;;44634:20;-1:-1:-1;;;;;44460:289:0;;;;;44684:15;:23;44700:6;-1:-1:-1;;;;;44684:23:0;-1:-1:-1;;;;;44684:23:0;;;;;;;;;;;;:30;;;;-1:-1:-1;;;;;44460:289:0;;;;;;;;;;;;;;;;;;;;44440:9;:17;44450:6;-1:-1:-1;;;;;44440:17:0;-1:-1:-1;;;;;44440:17:0;;;;;;;;;;;;:309;;;;;;;;;;;;;-1:-1:-1;;;;;44440:309:0;;;;;-1:-1:-1;;;;;44440:309:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44440:309:0;;;;;-1:-1:-1;;;;;44440:309:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44440:309:0;;;;;-1:-1:-1;;;;;44440:309:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44440:309:0;;;;;-1:-1:-1;;;;;44440:309:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44440:309:0;;;;;-1:-1:-1;;;;;44440:309:0;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;44808:23:0;;;;;;;:15;:23;;;;;;;;:36;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44808:36:0;;;;;;;;;;;44862:19;;;:11;:19;;;;;;;44857:156;;44941:6;:19;;;;;;;;;;;;;-1:-1:-1;;;;;;44941:19:0;-1:-1:-1;;;;;44941:19:0;;;;;;;;-1:-1:-1;44975:19:0;;;:11;44941:19;44975;;;;:26;;-1:-1:-1;;44975:26:0;;;;;;44857:156;45055:6;-1:-1:-1;;;;;45030:60:0;45047:6;-1:-1:-1;;;;;45030:60:0;;45063:14;45079:10;45030:60;;;;;;20516:25:1;;;20572:2;20557:18;;20550:34;20504:2;20489:18;;20342:248;45030:60:0;;;;;;;;44183: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;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:118::-;3921:5;3914:13;3907:21;3900:5;3897:32;3887:60;;3943:1;3940;3933:12;3958:382;4023:6;4031;4084:2;4072:9;4063:7;4059:23;4055:32;4052:52;;;4100:1;4097;4090:12;4052:52;4139:9;4126:23;4158:31;4183:5;4158:31;:::i;:::-;4208:5;-1:-1:-1;4265:2:1;4250:18;;4237:32;4278:30;4237:32;4278:30;:::i;:::-;4327:7;4317:17;;;3958:382;;;;;:::o;4537:658::-;4708:2;4760:21;;;4830:13;;4733:18;;;4852:22;;;4679:4;;4708:2;4931:15;;;;4905:2;4890:18;;;4679:4;4974:195;4988:6;4985:1;4982:13;4974:195;;;5053:13;;-1:-1:-1;;;;;5049:39:1;5037:52;;5144:15;;;;5109:12;;;;5085:1;5003:9;4974:195;;;-1:-1:-1;5186:3:1;;4537:658;-1:-1:-1;;;;;;4537:658:1:o;5200:457::-;5278:6;5286;5339:2;5327:9;5318:7;5314:23;5310:32;5307:52;;;5355:1;5352;5345:12;5307:52;5394:9;5381:23;5413:31;5438:5;5413:31;:::i;:::-;5463:5;-1:-1:-1;5519:2:1;5504:18;;5491:32;-1:-1:-1;;;;;5535:30:1;;5532:50;;;5578:1;5575;5568:12;5532:50;5601;5643:7;5634:6;5623:9;5619:22;5601:50;:::i;:::-;5591:60;;;5200:457;;;;;:::o;5662:1318::-;5854:4;5883:2;5923;5912:9;5908:18;5953:2;5942:9;5935:21;5976:6;6011;6005:13;6042:6;6034;6027:22;6080:2;6069:9;6065:18;6058:25;;6142:2;6132:6;6129:1;6125:14;6114:9;6110:30;6106:39;6092:53;;6180:2;6172:6;6168:15;6201:1;6222;6232:719;6248:6;6243:3;6240:15;6232:719;;;6317:22;;;-1:-1:-1;;6313:36:1;6301:49;;6373:13;;6447:9;;6469:24;;;6559:11;;;;6515:15;;;;6594:1;6608:235;6624:8;6619:3;6616:17;6608:235;;;6705:15;;-1:-1:-1;;;;;6701:41:1;6687:56;;6812:17;;;;6769:14;;;;6739:1;6643:11;6608:235;;;-1:-1:-1;6866:5:1;;-1:-1:-1;;;6929:12:1;;;;6894:15;;;;6274:1;6265:11;6232:719;;;-1:-1:-1;6968:6:1;;5662:1318;-1:-1:-1;;;;;;;;5662:1318:1:o;6985:958::-;7109:6;7117;7125;7133;7141;7149;7202:3;7190:9;7181:7;7177:23;7173:33;7170:53;;;7219:1;7216;7209:12;7170:53;7258:9;7245:23;7277:31;7302:5;7277:31;:::i;:::-;7327:5;-1:-1:-1;7383:2:1;7368:18;;7355:32;-1:-1:-1;;;;;7436:14:1;;;7433:34;;;7463:1;7460;7453:12;7433:34;7486:50;7528:7;7519:6;7508:9;7504:22;7486:50;:::i;:::-;7476:60;;7589:2;7578:9;7574:18;7561:32;7545:48;;7618:2;7608:8;7605:16;7602:36;;;7634:1;7631;7624:12;7602:36;;7657:52;7701:7;7690:8;7679:9;7675:24;7657:52;:::i;:::-;7647:62;;;7761:2;7750:9;7746:18;7733:32;7774:33;7799:7;7774:33;:::i;:::-;6985:958;;;;-1:-1:-1;6985:958:1;;7880:3;7865:19;;7852:33;;7932:3;7917:19;;;7904:33;;-1:-1:-1;6985:958:1;-1:-1:-1;;6985:958:1:o;7948:452::-;8034:6;8042;8050;8058;8111:3;8099:9;8090:7;8086:23;8082:33;8079:53;;;8128:1;8125;8118:12;8079:53;8167:9;8154:23;8186:31;8211:5;8186:31;:::i;:::-;8236:5;8288:2;8273:18;;8260:32;;-1:-1:-1;8339:2:1;8324:18;;8311:32;;8390:2;8375:18;8362:32;;-1:-1:-1;7948:452:1;-1:-1:-1;;;7948:452:1:o;8405:728::-;-1:-1:-1;;;;;8688:32:1;;8670:51;;-1:-1:-1;;;;;8757:39:1;;8752:2;8737:18;;8730:67;-1:-1:-1;;;;;8870:15:1;;;8865:2;8850:18;;8843:43;-1:-1:-1;;;;;8922:47:1;;8917:2;8902:18;;8895:75;9007:15;;9001:3;8986:19;;8979:44;9060:3;8708;9039:19;;9032:32;;;-1:-1:-1;;9081:46:1;;9107:19;;9099:6;9081:46;:::i;:::-;9073:54;8405:728;-1:-1:-1;;;;;;;;8405:728:1:o;9138:180::-;9197:6;9250:2;9238:9;9229:7;9225:23;9221:32;9218:52;;;9266:1;9263;9256:12;9218:52;-1:-1:-1;9289:23:1;;9138:180;-1:-1:-1;9138:180:1:o;9323:380::-;9402:1;9398:12;;;;9445;;;9466:61;;9520:4;9512:6;9508:17;9498:27;;9466:61;9573:2;9565:6;9562:14;9542:18;9539:38;9536:161;;9619:10;9614:3;9610:20;9607:1;9600:31;9654:4;9651:1;9644:15;9682:4;9679:1;9672:15;9536:161;;9323:380;;;:::o;10384:127::-;10445:10;10440:3;10436:20;10433:1;10426:31;10476:4;10473:1;10466:15;10500:4;10497:1;10490:15;10856:127;10917:10;10912:3;10908:20;10905:1;10898:31;10948:4;10945:1;10938:15;10972:4;10969:1;10962:15;10988:128;11055:9;;;11076:11;;;11073:37;;;11090:18;;:::i;11121:127::-;11182:10;11177:3;11173:20;11170:1;11163:31;11213:4;11210:1;11203:15;11237:4;11234:1;11227:15;11716:545;11818:2;11813:3;11810:11;11807:448;;;11854:1;11879:5;11875:2;11868:17;11924:4;11920:2;11910:19;11994:2;11982:10;11978:19;11975:1;11971:27;11965:4;11961:38;12030:4;12018:10;12015:20;12012:47;;;-1:-1:-1;12053:4:1;12012:47;12108:2;12103:3;12099:12;12096:1;12092:20;12086:4;12082:31;12072:41;;12163:82;12181:2;12174:5;12171:13;12163:82;;;12226:17;;;12207:1;12196:13;12163:82;;11807:448;11716:545;;;:::o;12437:1352::-;12563:3;12557:10;-1:-1:-1;;;;;12582:6:1;12579:30;12576:56;;;12612:18;;:::i;:::-;12641:97;12731:6;12691:38;12723:4;12717:11;12691:38;:::i;:::-;12685:4;12641:97;:::i;:::-;12793:4;;12857:2;12846:14;;12874:1;12869:663;;;;13576:1;13593:6;13590:89;;;-1:-1:-1;13645:19:1;;;13639:26;13590:89;-1:-1:-1;;12394:1:1;12390:11;;;12386:24;12382:29;12372:40;12418:1;12414:11;;;12369:57;13692:81;;12839:944;;12869:663;11663:1;11656:14;;;11700:4;11687:18;;-1:-1:-1;;12905:20:1;;;13023:236;13037:7;13034:1;13031:14;13023:236;;;13126:19;;;13120:26;13105:42;;13218:27;;;;13186:1;13174:14;;;;13053:19;;13023:236;;;13027:3;13287:6;13278:7;13275:19;13272:201;;;13348:19;;;13342:26;-1:-1:-1;;13431:1:1;13427:14;;;13443:3;13423:24;13419:37;13415:42;13400:58;13385:74;;13272:201;-1:-1:-1;;;;;13519:1:1;13503:14;;;13499:22;13486:36;;-1:-1:-1;12437:1352:1:o;13794:135::-;13833:3;13854:17;;;13851:43;;13874:18;;:::i;:::-;-1:-1:-1;13921:1:1;13910:13;;13794:135::o;13934:184::-;14004:6;14057:2;14045:9;14036:7;14032:23;14028:32;14025:52;;;14073:1;14070;14063:12;14025:52;-1:-1:-1;14096:16:1;;13934:184;-1:-1:-1;13934:184:1:o;14123:251::-;14193:6;14246:2;14234:9;14225:7;14221:23;14217:32;14214:52;;;14262:1;14259;14252:12;14214:52;14294:9;14288:16;14313:31;14338:5;14313:31;:::i;14733:655::-;14977:4;15023:1;15019;15014:3;15010:11;15006:19;15064:2;15056:6;15052:15;15041:9;15034:34;15104:3;15099:2;15088:9;15084:18;15077:31;15131:46;15172:3;15161:9;15157:19;15149:6;15131:46;:::i;:::-;15225:9;15217:6;15213:22;15208:2;15197:9;15193:18;15186:50;15253:33;15279:6;15271;15253:33;:::i;:::-;15322:15;;;;15317:2;15302:18;;15295:43;-1:-1:-1;;15369:3:1;15354:19;15347:35;15245:41;14733:655;-1:-1:-1;;;14733:655:1:o;16753:649::-;16833:6;16886:2;16874:9;16865:7;16861:23;16857:32;16854:52;;;16902:1;16899;16892:12;16854:52;16935:9;16929:16;-1:-1:-1;;;;;16960:6:1;16957:30;16954:50;;;17000:1;16997;16990:12;16954:50;17023:22;;17076:4;17068:13;;17064:27;-1:-1:-1;17054:55:1;;17105:1;17102;17095:12;17054:55;17134:2;17128:9;17159:49;17175:32;17204:2;17175:32;:::i;17159:49::-;17231:2;17224:5;17217:17;17271:7;17266:2;17261;17257;17253:11;17249:20;17246:33;17243:53;;;17292:1;17289;17282:12;17243:53;17305:67;17369:2;17364;17357:5;17353:14;17348:2;17344;17340:11;17305:67;:::i;:::-;17391:5;16753:649;-1:-1:-1;;;;;16753:649:1:o;19080:245::-;19147:6;19200:2;19188:9;19179:7;19175:23;19171:32;19168:52;;;19216:1;19213;19206:12;19168:52;19248:9;19242:16;19267:28;19289:5;19267:28;:::i
Swarm Source
ipfs://32af84f44144191d21bfedf6440b7cf6f688c01398754784981243c95a2c111a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.