Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 2852031 | 172 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Registry
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/**
*Submitted for verification at KatanaScan.com on 2025-10-16
*/
/**
*Submitted for verification at Etherscan.io on 2024-11-13
*/
// 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
Contract ABI
API[{"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
60a06040523480156200001157600080fd5b5060405162002731380380620027318339810160408190526200003491620000d4565b600080546001600160a01b0319166001600160a01b03851690811782556040518592907f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce80908290a35060016200008b83826200025e565b506001600160a01b0316608052506200032a9050565b80516001600160a01b0381168114620000b957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080600060608486031215620000ea57600080fd5b620000f584620000a1565b602085810151919450906001600160401b03808211156200011557600080fd5b818701915087601f8301126200012a57600080fd5b8151818111156200013f576200013f620000be565b604051601f8201601f19908116603f011681019083821181831017156200016a576200016a620000be565b816040528281528a868487010111156200018357600080fd5b600093505b82841015620001a7578484018601518185018701529285019262000188565b6000868483010152809750505050505050620001c660408501620000a1565b90509250925092565b600181811c90821680620001e457607f821691505b6020821081036200020557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200025957600081815260208120601f850160051c81016020861015620002345750805b601f850160051c820191505b81811015620002555782815560010162000240565b5050505b505050565b81516001600160401b038111156200027a576200027a620000be565b62000292816200028b8454620001cf565b846200020b565b602080601f831160018114620002ca5760008415620002b15750858301515b600019600386901b1c1916600185901b17855562000255565b600085815260208120601f198616915b82811015620002fb57888601518255948401946001909101908401620002da565b50858210156200031a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6080516123cf620003626000396000818161026b01528181610b5d01528181610c1501528181610e930152610f4b01526123cf6000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806370df8ba711610104578063a4fc5922116100a2578063ceb68c2311610071578063ceb68c231461045f578063cf35bdd014610472578063d38bfff414610485578063da1281dd1461049857600080fd5b8063a4fc5922146103ed578063ac01762a14610400578063ae8c9d1314610423578063b2c6161c1461043657600080fd5b80639164359a116100de5780639164359a146103a557806398a5e07b146103ca578063a237e94d146103d2578063a46fe83b146103e557600080fd5b806370df8ba71461036a5780637be7b20b1461037f57806389c6acec1461039257600080fd5b80632aa59c921161017c5780635aa6e6751161014b5780635aa6e675146103195780635b25d2c81461032c57806360bd68f81461034f57806367e4ac2c1461036257600080fd5b80632aa59c92146102a05780632c2a72d5146102b35780633515a20b146102c657806353d2e949146102f957600080fd5b806317bdd312116101b857806317bdd3121461022557806318d1dd831461025057806319ee073e146102665780632317ef671461028d57600080fd5b806306fdde03146101df5780630ab322d9146101fd5780630f7872cc14610212575b600080fd5b6101e76104ab565b6040516101f49190611c47565b60405180910390f35b61021061020b366004611c6f565b610539565b005b610210610220366004611c6f565b61054b565b610238610233366004611d4f565b61055a565b6040516001600160a01b0390911681526020016101f4565b610258600181565b6040519081526020016101f4565b6102387f000000000000000000000000000000000000000000000000000000000000000081565b61021061029b366004611ddf565b610575565b6102106102ae366004611e19565b610769565b6102106102c1366004611e19565b6107d1565b6102e96102d4366004611c6f565b60046020526000908152604090205460ff1681565b60405190151581526020016101f4565b61030c610307366004611c6f565b610831565b6040516101f49190611e52565b600054610238906001600160a01b031681565b6102e961033a366004611c6f565b60036020526000908152604090205460ff1681565b61021061035d366004611e9f565b6108a7565b61030c610960565b6103726109c2565b6040516101f49190611eee565b61023861038d366004611f81565b610b4c565b6102106103a036600461201b565b610d6b565b6103b86103b3366004611c6f565b611149565b6040516101f496959493929190612056565b610258600281565b6102e96103e0366004611c6f565b611236565b600854610258565b6102106103fb366004611c6f565b61126a565b6102e961040e366004611c6f565b60066020526000908152604090205460ff1681565b600254610238906001600160a01b031681565b610258610444366004611c6f565b6001600160a01b031660009081526007602052604090205490565b61021061046d366004611c6f565b611294565b6102386104803660046120bb565b61168a565b610210610493366004611c6f565b6116b4565b6102e96104a6366004611c6f565b611751565b600180546104b8906120d4565b80601f01602080910402602001604051908101604052809291908181526020018280546104e4906120d4565b80156105315780601f1061050657610100808354040283529160200191610531565b820191906000526020600020905b81548152906001019060200180831161051457829003601f168201915b505050505081565b61054881600060016000610d6b565b50565b61054881600060026000610d6b565b600061056b86868686866000610b4c565b9695505050505050565b61057d6117df565b6001600160a01b03821660009081526006602052604090205460ff166105d45760405162461bcd60e51b815260206004820152600760248201526621696e2075736560c81b60448201526064015b60405180910390fd5b6001600160a01b038216600090815260076020526040902054156106295760405162461bcd60e51b815260206004820152600c60248201526b7374696c6c20696e2075736560a01b60448201526064016105cb565b816001600160a01b0316600882815481106106465761064661210e565b6000918252602090912001546001600160a01b0316146106965760405162461bcd60e51b815260206004820152600b60248201526a1ddc9bdb99c8185cdcd95d60aa1b60448201526064016105cb565b600880546106a69060019061213a565b815481106106b6576106b661210e565b600091825260209091200154600880546001600160a01b0390921691839081106106e2576106e261210e565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060088054806107215761072161214d565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0393909316815260069092525060409020805460ff19169055565b610771611841565b6001600160a01b038216600081815260036020908152604091829020805460ff191685151590811790915591519182527fcd202ea0907016dd42e40faedc5cf5c3e6368644993f46c95990dfa7f84bfaa991015b60405180910390a25050565b6107d9611841565b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915591519182527fc93ec0e3c82bbe3866d85f7d0915cda166df7c76944b9fae88bcf11608f791bf91016107c5565b6001600160a01b03811660009081526007602090815260409182902080548351818402810184019094528084526060939283018282801561089b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161087d575b50505050509050919050565b6108af611889565b6001600160a01b03828116600090815260056020526040902054166109025760405162461bcd60e51b815260206004820152600960248201526808515b991bdc9cd95960ba1b60448201526064016105cb565b6001600160a01b038216600090815260056020526040902060020161092782826121ae565b506040516001600160a01b038316907f9831985c7ff4c3d7dbd921d753150cc58a3a2a21c93795bbaac5bbf32baab3bb90600090a25050565b606060088054806020026020016040519081016040528092919081815260200182805480156109b857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161099a575b5050505050905090565b606060006008805480602002602001604051908101604052809291908181526020018280548015610a1c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109fe575b505060085493945083925050506001600160401b03811115610a4057610a40611c8c565b604051908082528060200260200182016040528015610a7357816020015b6060815260200190600190039081610a5e5790505b50925060005b81811015610b465760076000848381518110610a9757610a9761210e565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610b1357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610af5575b5050505050848281518110610b2a57610b2a61210e565b602002602001018190525080610b3f9061226d565b9050610a79565b50505090565b6000610b566117df565b60008260017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356e0a94b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdd9190612286565b610be7919061213a565b610bf1919061213a565b6040516319c8e0f160e21b8152600481018290529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063672383c490602401602060405180830381865afa158015610c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c80919061229f565b90506001600160a01b038116610cd85760405162461bcd60e51b815260206004820152601960248201527f52656769737472793a20756e6b6e6f776e2072656c656173650000000000000060448201526064016105cb565b60405163b4aeee7760e01b81526001600160a01b0382169063b4aeee7790610d0c908c908c908c908c908c906004016122bc565b6020604051808303816000875af1158015610d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4f919061229f565b9250610d5f838a846001426118e7565b50509695505050505050565b610d736117df565b6001600160a01b038481166000908152600560205260409020541615610dc65760405162461bcd60e51b8152602060048201526008602482015267195b991bdc9cd95960c21b60448201526064016105cb565b81600003610e025760405162461bcd60e51b81526020600482015260096024820152686e6f2030207479706560b81b60448201526064016105cb565b6001600160801b03821115610e495760405162461bcd60e51b815260206004820152600d60248201526c0e8f2e0ca40e8dede40d0d2ced609b1b60448201526064016105cb565b42811115610e8c5760405162461bcd60e51b815260206004820152601060248201526f216465706c6f796d656e742074696d6560801b60448201526064016105cb565b60008360017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356e0a94b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f139190612286565b610f1d919061213a565b610f27919061213a565b6040516319c8e0f160e21b8152600481018290529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063672383c490602401602060405180830381865afa158015610f92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb6919061229f565b6001600160a01b031663258294106040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ff3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261101b9190810190612306565b90508080519060200120866001600160a01b031663258294106040518163ffffffff1660e01b8152600401600060405180830381865afa158015611063573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261108b9190810190612306565b80519060200120146110d35760405162461bcd60e51b81526020600482015260116024820152702bb937b7339020a824902b32b939b4b7b760791b60448201526064016105cb565b61114186876001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611139919061229f565b8487876118e7565b505050505050565b6005602052600090815260409020805460018201546002830180546001600160a01b03841694600160a01b9094046001600160601b0316936001600160401b0380851694600160401b81046001600160801b031694600160c01b909104909116926111b3906120d4565b80601f01602080910402602001604051908101604052809291908181526020018280546111df906120d4565b801561122c5780601f106112015761010080835404028352916020019161122c565b820191906000526020600020905b81548152906001019060200180831161120f57829003601f168201915b5050505050905086565b6001600160a01b03818116600090815260056020526040812054909116151580611264575061126482611751565b92915050565b611272611841565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61129c6117df565b6001600160a01b038181166000908152600560209081526040808320815160c08101835281549586168152600160a01b9095046001600160601b03169285019290925260018201546001600160401b0380821692860192909252600160401b81046001600160801b03166060860152600160c01b900416608084015260028101805492939260a084019190611330906120d4565b80601f016020809104026020016040519081016040528092919081815260200182805461135c906120d4565b80156113a95780601f1061137e576101008083540402835291602001916113a9565b820191906000526020600020905b81548152906001019060200180831161138c57829003601f168201915b5050509190925250508151919250506001600160a01b03166113f95760405162461bcd60e51b815260206004820152600960248201526808595b991bdc9cd95960ba1b60448201526064016105cb565b80516001600160a01b03908116600090815260076020526040902060808301518154928516926001600160401b039091169081106114395761143961210e565b6000918252602090912001546001600160a01b0316146114895760405162461bcd60e51b815260206004820152600b60248201526a1ddc9bdb99c81d985d5b1d60aa1b60448201526064016105cb565b80516001600160a01b03908116600090815260076020526040808220845190931682528120549091906114be9060019061213a565b815481106114ce576114ce61210e565b6000918252602090912001546001600160a01b0390811691508316811461158d5781516001600160a01b03166000908152600760205260409020608083015181548392916001600160401b031690811061152a5761152a61210e565b6000918252602080832090910180546001600160a01b039485166001600160a01b031990911617905560808501519284168252600590526040902060010180546001600160401b03909216600160c01b026001600160c01b039092169190911790555b81516001600160a01b031660009081526007602052604090208054806115b5576115b561214d565b6001900381819060005260206000200160006101000a8154906001600160a01b030219169055905581600001516001600160a01b0316836001600160a01b03167fb8d23ba050f8f00e22675f82cf3786ade63b12a46d4ea236927baf4d173c30928460200151856040015160405161164b9291906001600160601b039290921682526001600160401b0316602082015260400190565b60405180910390a36001600160a01b038316600090815260056020526040812081815560018101829055906116836002830182611ba9565b5050505050565b6008818154811061169a57600080fd5b6000918252602090912001546001600160a01b0316905081565b6116bc611841565b6001600160a01b0381166117015760405162461bcd60e51b815260206004820152600c60248201526b5a45524f204144445245535360a01b60448201526064016105cb565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce809190a35050565b6002546000906001600160a01b03168061176e5750600092915050565b60405163a237e94d60e01b81526001600160a01b03848116600483015282169063a237e94d90602401602060405180830381865afa1580156117b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d8919061237c565b9392505050565b6000546001600160a01b031633148061180757503360009081526004602052604090205460ff165b61183f5760405162461bcd60e51b815260206004820152600960248201526810b2b73237b939b2b960b91b60448201526064016105cb565b565b6000546001600160a01b0316331461183f5760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b60448201526064016105cb565b6000546001600160a01b03163314806118b157503360009081526003602052604090205460ff165b61183f5760405162461bcd60e51b815260206004820152600760248201526610ba30b3b3b2b960c91b60448201526064016105cb565b6040518060c00160405280856001600160a01b03168152602001846001600160601b03168152602001836001600160401b03168152602001826001600160801b0316815260200160076000876001600160a01b03166001600160a01b03168152602001908152602001600020805490506001600160401b031681526020016040518060200160405280600081525081525060056000876001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a8154816001600160601b0302191690836001600160601b0316021790555060408201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160010160086101000a8154816001600160801b0302191690836001600160801b0316021790555060808201518160010160186101000a8154816001600160401b0302191690836001600160401b0316021790555060a0820151816002019081611a9391906121ae565b5050506001600160a01b03848116600081815260076020908152604080832080546001810182559084528284200180546001600160a01b031916958b16959095179094559181526006909152205460ff16611b4c576008805460018082019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0387169081179091556000908152600660205260409020805460ff191690911790555b836001600160a01b0316856001600160a01b03167fa9a7c68f108b706e545bc75ac8590730afa49f639d2e48f367105c9801c18fd28585604051611b9a929190918252602082015260400190565b60405180910390a35050505050565b508054611bb5906120d4565b6000825580601f10611bc5575050565b601f01602090049060005260206000209081019061054891905b80821115611bf35760008155600101611bdf565b5090565b60005b83811015611c12578181015183820152602001611bfa565b50506000910152565b60008151808452611c33816020860160208601611bf7565b601f01601f19169290920160200192915050565b6020815260006117d86020830184611c1b565b6001600160a01b038116811461054857600080fd5b600060208284031215611c8157600080fd5b81356117d881611c5a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611cca57611cca611c8c565b604052919050565b60006001600160401b03821115611ceb57611ceb611c8c565b50601f01601f191660200190565b600082601f830112611d0a57600080fd5b8135611d1d611d1882611cd2565b611ca2565b818152846020838601011115611d3257600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611d6757600080fd5b8535611d7281611c5a565b945060208601356001600160401b0380821115611d8e57600080fd5b611d9a89838a01611cf9565b95506040880135915080821115611db057600080fd5b50611dbd88828901611cf9565b9350506060860135611dce81611c5a565b949793965091946080013592915050565b60008060408385031215611df257600080fd5b8235611dfd81611c5a565b946020939093013593505050565b801515811461054857600080fd5b60008060408385031215611e2c57600080fd5b8235611e3781611c5a565b91506020830135611e4781611e0b565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015611e935783516001600160a01b031683529284019291840191600101611e6e565b50909695505050505050565b60008060408385031215611eb257600080fd5b8235611ebd81611c5a565b915060208301356001600160401b03811115611ed857600080fd5b611ee485828601611cf9565b9150509250929050565b6000602080830181845280855180835260408601915060408160051b87010192508387016000805b83811015611f7357888603603f19018552825180518088529088019088880190845b81811015611f5d5783516001600160a01b03168352928a0192918a0191600101611f38565b5090975050509386019391860191600101611f16565b509398975050505050505050565b60008060008060008060c08789031215611f9a57600080fd5b8635611fa581611c5a565b955060208701356001600160401b0380821115611fc157600080fd5b611fcd8a838b01611cf9565b96506040890135915080821115611fe357600080fd5b50611ff089828a01611cf9565b945050606087013561200181611c5a565b9598949750929560808101359460a0909101359350915050565b6000806000806080858703121561203157600080fd5b843561203c81611c5a565b966020860135965060408601359560600135945092505050565b6001600160a01b03871681526001600160601b03861660208201526001600160401b0385811660408301526001600160801b03851660608301528316608082015260c060a082018190526000906120af90830184611c1b565b98975050505050505050565b6000602082840312156120cd57600080fd5b5035919050565b600181811c908216806120e857607f821691505b60208210810361210857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561126457611264612124565b634e487b7160e01b600052603160045260246000fd5b601f8211156121a957600081815260208120601f850160051c8101602086101561218a5750805b601f850160051c820191505b8181101561114157828155600101612196565b505050565b81516001600160401b038111156121c7576121c7611c8c565b6121db816121d584546120d4565b84612163565b602080601f83116001811461221057600084156121f85750858301515b600019600386901b1c1916600185901b178555611141565b600085815260208120601f198616915b8281101561223f57888601518255948401946001909101908401612220565b508582101561225d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001820161227f5761227f612124565b5060010190565b60006020828403121561229857600080fd5b5051919050565b6000602082840312156122b157600080fd5b81516117d881611c5a565b600060018060a01b03808816835260a060208401526122de60a0840188611c1b565b83810360408501526122f08188611c1b565b9590911660608401525050608001529392505050565b60006020828403121561231857600080fd5b81516001600160401b0381111561232e57600080fd5b8201601f8101841361233f57600080fd5b805161234d611d1882611cd2565b81815285602083850101111561236257600080fd5b612373826020830160208601611bf7565b95945050505050565b60006020828403121561238e57600080fd5b81516117d881611e0b56fea2646970667358221220f1943a6d34a6ea17bd1eef845ed1f64be8295b3ac68f02fcfe5be92e7216b02a64736f6c634300081200330000000000000000000000006f3cbe2ab3483ec4ba7b672fbdca0e9b33f88db800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f71980000000000000000000000000000000000000000000000000000000000000017596561726e205633205661756c74205265676973747279000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806370df8ba711610104578063a4fc5922116100a2578063ceb68c2311610071578063ceb68c231461045f578063cf35bdd014610472578063d38bfff414610485578063da1281dd1461049857600080fd5b8063a4fc5922146103ed578063ac01762a14610400578063ae8c9d1314610423578063b2c6161c1461043657600080fd5b80639164359a116100de5780639164359a146103a557806398a5e07b146103ca578063a237e94d146103d2578063a46fe83b146103e557600080fd5b806370df8ba71461036a5780637be7b20b1461037f57806389c6acec1461039257600080fd5b80632aa59c921161017c5780635aa6e6751161014b5780635aa6e675146103195780635b25d2c81461032c57806360bd68f81461034f57806367e4ac2c1461036257600080fd5b80632aa59c92146102a05780632c2a72d5146102b35780633515a20b146102c657806353d2e949146102f957600080fd5b806317bdd312116101b857806317bdd3121461022557806318d1dd831461025057806319ee073e146102665780632317ef671461028d57600080fd5b806306fdde03146101df5780630ab322d9146101fd5780630f7872cc14610212575b600080fd5b6101e76104ab565b6040516101f49190611c47565b60405180910390f35b61021061020b366004611c6f565b610539565b005b610210610220366004611c6f565b61054b565b610238610233366004611d4f565b61055a565b6040516001600160a01b0390911681526020016101f4565b610258600181565b6040519081526020016101f4565b6102387f0000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f719881565b61021061029b366004611ddf565b610575565b6102106102ae366004611e19565b610769565b6102106102c1366004611e19565b6107d1565b6102e96102d4366004611c6f565b60046020526000908152604090205460ff1681565b60405190151581526020016101f4565b61030c610307366004611c6f565b610831565b6040516101f49190611e52565b600054610238906001600160a01b031681565b6102e961033a366004611c6f565b60036020526000908152604090205460ff1681565b61021061035d366004611e9f565b6108a7565b61030c610960565b6103726109c2565b6040516101f49190611eee565b61023861038d366004611f81565b610b4c565b6102106103a036600461201b565b610d6b565b6103b86103b3366004611c6f565b611149565b6040516101f496959493929190612056565b610258600281565b6102e96103e0366004611c6f565b611236565b600854610258565b6102106103fb366004611c6f565b61126a565b6102e961040e366004611c6f565b60066020526000908152604090205460ff1681565b600254610238906001600160a01b031681565b610258610444366004611c6f565b6001600160a01b031660009081526007602052604090205490565b61021061046d366004611c6f565b611294565b6102386104803660046120bb565b61168a565b610210610493366004611c6f565b6116b4565b6102e96104a6366004611c6f565b611751565b600180546104b8906120d4565b80601f01602080910402602001604051908101604052809291908181526020018280546104e4906120d4565b80156105315780601f1061050657610100808354040283529160200191610531565b820191906000526020600020905b81548152906001019060200180831161051457829003601f168201915b505050505081565b61054881600060016000610d6b565b50565b61054881600060026000610d6b565b600061056b86868686866000610b4c565b9695505050505050565b61057d6117df565b6001600160a01b03821660009081526006602052604090205460ff166105d45760405162461bcd60e51b815260206004820152600760248201526621696e2075736560c81b60448201526064015b60405180910390fd5b6001600160a01b038216600090815260076020526040902054156106295760405162461bcd60e51b815260206004820152600c60248201526b7374696c6c20696e2075736560a01b60448201526064016105cb565b816001600160a01b0316600882815481106106465761064661210e565b6000918252602090912001546001600160a01b0316146106965760405162461bcd60e51b815260206004820152600b60248201526a1ddc9bdb99c8185cdcd95d60aa1b60448201526064016105cb565b600880546106a69060019061213a565b815481106106b6576106b661210e565b600091825260209091200154600880546001600160a01b0390921691839081106106e2576106e261210e565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060088054806107215761072161214d565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0393909316815260069092525060409020805460ff19169055565b610771611841565b6001600160a01b038216600081815260036020908152604091829020805460ff191685151590811790915591519182527fcd202ea0907016dd42e40faedc5cf5c3e6368644993f46c95990dfa7f84bfaa991015b60405180910390a25050565b6107d9611841565b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915591519182527fc93ec0e3c82bbe3866d85f7d0915cda166df7c76944b9fae88bcf11608f791bf91016107c5565b6001600160a01b03811660009081526007602090815260409182902080548351818402810184019094528084526060939283018282801561089b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161087d575b50505050509050919050565b6108af611889565b6001600160a01b03828116600090815260056020526040902054166109025760405162461bcd60e51b815260206004820152600960248201526808515b991bdc9cd95960ba1b60448201526064016105cb565b6001600160a01b038216600090815260056020526040902060020161092782826121ae565b506040516001600160a01b038316907f9831985c7ff4c3d7dbd921d753150cc58a3a2a21c93795bbaac5bbf32baab3bb90600090a25050565b606060088054806020026020016040519081016040528092919081815260200182805480156109b857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161099a575b5050505050905090565b606060006008805480602002602001604051908101604052809291908181526020018280548015610a1c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109fe575b505060085493945083925050506001600160401b03811115610a4057610a40611c8c565b604051908082528060200260200182016040528015610a7357816020015b6060815260200190600190039081610a5e5790505b50925060005b81811015610b465760076000848381518110610a9757610a9761210e565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610b1357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610af5575b5050505050848281518110610b2a57610b2a61210e565b602002602001018190525080610b3f9061226d565b9050610a79565b50505090565b6000610b566117df565b60008260017f0000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f71986001600160a01b03166356e0a94b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdd9190612286565b610be7919061213a565b610bf1919061213a565b6040516319c8e0f160e21b8152600481018290529091506000906001600160a01b037f0000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f7198169063672383c490602401602060405180830381865afa158015610c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c80919061229f565b90506001600160a01b038116610cd85760405162461bcd60e51b815260206004820152601960248201527f52656769737472793a20756e6b6e6f776e2072656c656173650000000000000060448201526064016105cb565b60405163b4aeee7760e01b81526001600160a01b0382169063b4aeee7790610d0c908c908c908c908c908c906004016122bc565b6020604051808303816000875af1158015610d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4f919061229f565b9250610d5f838a846001426118e7565b50509695505050505050565b610d736117df565b6001600160a01b038481166000908152600560205260409020541615610dc65760405162461bcd60e51b8152602060048201526008602482015267195b991bdc9cd95960c21b60448201526064016105cb565b81600003610e025760405162461bcd60e51b81526020600482015260096024820152686e6f2030207479706560b81b60448201526064016105cb565b6001600160801b03821115610e495760405162461bcd60e51b815260206004820152600d60248201526c0e8f2e0ca40e8dede40d0d2ced609b1b60448201526064016105cb565b42811115610e8c5760405162461bcd60e51b815260206004820152601060248201526f216465706c6f796d656e742074696d6560801b60448201526064016105cb565b60008360017f0000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f71986001600160a01b03166356e0a94b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f139190612286565b610f1d919061213a565b610f27919061213a565b6040516319c8e0f160e21b8152600481018290529091506000906001600160a01b037f0000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f7198169063672383c490602401602060405180830381865afa158015610f92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb6919061229f565b6001600160a01b031663258294106040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ff3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261101b9190810190612306565b90508080519060200120866001600160a01b031663258294106040518163ffffffff1660e01b8152600401600060405180830381865afa158015611063573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261108b9190810190612306565b80519060200120146110d35760405162461bcd60e51b81526020600482015260116024820152702bb937b7339020a824902b32b939b4b7b760791b60448201526064016105cb565b61114186876001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611139919061229f565b8487876118e7565b505050505050565b6005602052600090815260409020805460018201546002830180546001600160a01b03841694600160a01b9094046001600160601b0316936001600160401b0380851694600160401b81046001600160801b031694600160c01b909104909116926111b3906120d4565b80601f01602080910402602001604051908101604052809291908181526020018280546111df906120d4565b801561122c5780601f106112015761010080835404028352916020019161122c565b820191906000526020600020905b81548152906001019060200180831161120f57829003601f168201915b5050505050905086565b6001600160a01b03818116600090815260056020526040812054909116151580611264575061126482611751565b92915050565b611272611841565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61129c6117df565b6001600160a01b038181166000908152600560209081526040808320815160c08101835281549586168152600160a01b9095046001600160601b03169285019290925260018201546001600160401b0380821692860192909252600160401b81046001600160801b03166060860152600160c01b900416608084015260028101805492939260a084019190611330906120d4565b80601f016020809104026020016040519081016040528092919081815260200182805461135c906120d4565b80156113a95780601f1061137e576101008083540402835291602001916113a9565b820191906000526020600020905b81548152906001019060200180831161138c57829003601f168201915b5050509190925250508151919250506001600160a01b03166113f95760405162461bcd60e51b815260206004820152600960248201526808595b991bdc9cd95960ba1b60448201526064016105cb565b80516001600160a01b03908116600090815260076020526040902060808301518154928516926001600160401b039091169081106114395761143961210e565b6000918252602090912001546001600160a01b0316146114895760405162461bcd60e51b815260206004820152600b60248201526a1ddc9bdb99c81d985d5b1d60aa1b60448201526064016105cb565b80516001600160a01b03908116600090815260076020526040808220845190931682528120549091906114be9060019061213a565b815481106114ce576114ce61210e565b6000918252602090912001546001600160a01b0390811691508316811461158d5781516001600160a01b03166000908152600760205260409020608083015181548392916001600160401b031690811061152a5761152a61210e565b6000918252602080832090910180546001600160a01b039485166001600160a01b031990911617905560808501519284168252600590526040902060010180546001600160401b03909216600160c01b026001600160c01b039092169190911790555b81516001600160a01b031660009081526007602052604090208054806115b5576115b561214d565b6001900381819060005260206000200160006101000a8154906001600160a01b030219169055905581600001516001600160a01b0316836001600160a01b03167fb8d23ba050f8f00e22675f82cf3786ade63b12a46d4ea236927baf4d173c30928460200151856040015160405161164b9291906001600160601b039290921682526001600160401b0316602082015260400190565b60405180910390a36001600160a01b038316600090815260056020526040812081815560018101829055906116836002830182611ba9565b5050505050565b6008818154811061169a57600080fd5b6000918252602090912001546001600160a01b0316905081565b6116bc611841565b6001600160a01b0381166117015760405162461bcd60e51b815260206004820152600c60248201526b5a45524f204144445245535360a01b60448201526064016105cb565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce809190a35050565b6002546000906001600160a01b03168061176e5750600092915050565b60405163a237e94d60e01b81526001600160a01b03848116600483015282169063a237e94d90602401602060405180830381865afa1580156117b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d8919061237c565b9392505050565b6000546001600160a01b031633148061180757503360009081526004602052604090205460ff165b61183f5760405162461bcd60e51b815260206004820152600960248201526810b2b73237b939b2b960b91b60448201526064016105cb565b565b6000546001600160a01b0316331461183f5760405162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b60448201526064016105cb565b6000546001600160a01b03163314806118b157503360009081526003602052604090205460ff165b61183f5760405162461bcd60e51b815260206004820152600760248201526610ba30b3b3b2b960c91b60448201526064016105cb565b6040518060c00160405280856001600160a01b03168152602001846001600160601b03168152602001836001600160401b03168152602001826001600160801b0316815260200160076000876001600160a01b03166001600160a01b03168152602001908152602001600020805490506001600160401b031681526020016040518060200160405280600081525081525060056000876001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a8154816001600160601b0302191690836001600160601b0316021790555060408201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160010160086101000a8154816001600160801b0302191690836001600160801b0316021790555060808201518160010160186101000a8154816001600160401b0302191690836001600160401b0316021790555060a0820151816002019081611a9391906121ae565b5050506001600160a01b03848116600081815260076020908152604080832080546001810182559084528284200180546001600160a01b031916958b16959095179094559181526006909152205460ff16611b4c576008805460018082019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0387169081179091556000908152600660205260409020805460ff191690911790555b836001600160a01b0316856001600160a01b03167fa9a7c68f108b706e545bc75ac8590730afa49f639d2e48f367105c9801c18fd28585604051611b9a929190918252602082015260400190565b60405180910390a35050505050565b508054611bb5906120d4565b6000825580601f10611bc5575050565b601f01602090049060005260206000209081019061054891905b80821115611bf35760008155600101611bdf565b5090565b60005b83811015611c12578181015183820152602001611bfa565b50506000910152565b60008151808452611c33816020860160208601611bf7565b601f01601f19169290920160200192915050565b6020815260006117d86020830184611c1b565b6001600160a01b038116811461054857600080fd5b600060208284031215611c8157600080fd5b81356117d881611c5a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611cca57611cca611c8c565b604052919050565b60006001600160401b03821115611ceb57611ceb611c8c565b50601f01601f191660200190565b600082601f830112611d0a57600080fd5b8135611d1d611d1882611cd2565b611ca2565b818152846020838601011115611d3257600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611d6757600080fd5b8535611d7281611c5a565b945060208601356001600160401b0380821115611d8e57600080fd5b611d9a89838a01611cf9565b95506040880135915080821115611db057600080fd5b50611dbd88828901611cf9565b9350506060860135611dce81611c5a565b949793965091946080013592915050565b60008060408385031215611df257600080fd5b8235611dfd81611c5a565b946020939093013593505050565b801515811461054857600080fd5b60008060408385031215611e2c57600080fd5b8235611e3781611c5a565b91506020830135611e4781611e0b565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015611e935783516001600160a01b031683529284019291840191600101611e6e565b50909695505050505050565b60008060408385031215611eb257600080fd5b8235611ebd81611c5a565b915060208301356001600160401b03811115611ed857600080fd5b611ee485828601611cf9565b9150509250929050565b6000602080830181845280855180835260408601915060408160051b87010192508387016000805b83811015611f7357888603603f19018552825180518088529088019088880190845b81811015611f5d5783516001600160a01b03168352928a0192918a0191600101611f38565b5090975050509386019391860191600101611f16565b509398975050505050505050565b60008060008060008060c08789031215611f9a57600080fd5b8635611fa581611c5a565b955060208701356001600160401b0380821115611fc157600080fd5b611fcd8a838b01611cf9565b96506040890135915080821115611fe357600080fd5b50611ff089828a01611cf9565b945050606087013561200181611c5a565b9598949750929560808101359460a0909101359350915050565b6000806000806080858703121561203157600080fd5b843561203c81611c5a565b966020860135965060408601359560600135945092505050565b6001600160a01b03871681526001600160601b03861660208201526001600160401b0385811660408301526001600160801b03851660608301528316608082015260c060a082018190526000906120af90830184611c1b565b98975050505050505050565b6000602082840312156120cd57600080fd5b5035919050565b600181811c908216806120e857607f821691505b60208210810361210857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111561126457611264612124565b634e487b7160e01b600052603160045260246000fd5b601f8211156121a957600081815260208120601f850160051c8101602086101561218a5750805b601f850160051c820191505b8181101561114157828155600101612196565b505050565b81516001600160401b038111156121c7576121c7611c8c565b6121db816121d584546120d4565b84612163565b602080601f83116001811461221057600084156121f85750858301515b600019600386901b1c1916600185901b178555611141565b600085815260208120601f198616915b8281101561223f57888601518255948401946001909101908401612220565b508582101561225d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001820161227f5761227f612124565b5060010190565b60006020828403121561229857600080fd5b5051919050565b6000602082840312156122b157600080fd5b81516117d881611c5a565b600060018060a01b03808816835260a060208401526122de60a0840188611c1b565b83810360408501526122f08188611c1b565b9590911660608401525050608001529392505050565b60006020828403121561231857600080fd5b81516001600160401b0381111561232e57600080fd5b8201601f8101841361233f57600080fd5b805161234d611d1882611cd2565b81815285602083850101111561236257600080fd5b612373826020830160208601611bf7565b95945050505050565b60006020828403121561238e57600080fd5b81516117d881611e0b56fea2646970667358221220f1943a6d34a6ea17bd1eef845ed1f64be8295b3ac68f02fcfe5be92e7216b02a64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006f3cbe2ab3483ec4ba7b672fbdca0e9b33f88db800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f71980000000000000000000000000000000000000000000000000000000000000017596561726e205633205661756c74205265676973747279000000000000000000
-----Decoded View---------------
Arg [0] : _governance (address): 0x6f3cBE2ab3483EC4BA7B672fbdCa0E9B33F88db8
Arg [1] : _name (string): Yearn V3 Vault Registry
Arg [2] : _releaseRegistry (address): 0x0377b4daDDA86C89A0091772B79ba67d0E5F7198
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000006f3cbe2ab3483ec4ba7b672fbdca0e9b33f88db8
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 0000000000000000000000000377b4dadda86c89a0091772b79ba67d0e5f7198
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [4] : 596561726e205633205661756c74205265676973747279000000000000000000
Deployed Bytecode Sourcemap
31121:18347:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33618:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41367:134;;;;;;:::i;:::-;;:::i;:::-;;41771:136;;;;;;:::i;:::-;;:::i;38521:495::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3289:32:1;;;3271:51;;3259:2;3244:18;38521:495:0;3125:203:1;33400:47:0;;33446:1;33400:47;;;;;3479:25:1;;;3467:2;3452:18;33400:47:0;3333:177:1;33286:40:0;;;;;47781:536;;;;;;:::i;:::-;;:::i;48965:203::-;;;;;;:::i;:::-;;:::i;48548:221::-;;;;;;:::i;:::-;;:::i;33928:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4510:14:1;;4503:22;4485:41;;4473:2;4458:18;33928:41:0;4345:187:1;35888:157:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3595:25::-;;;;;-1:-1:-1;;;;;3595:25:0;;;33810:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;45592:262;;;;;;:::i;:::-;;:::i;35300:102::-;;;:::i;36447:415::-;;;:::i;:::-;;;;;;;:::i;39862:1236::-;;;;;;:::i;:::-;;:::i;42583:1373::-;;;;;;:::i;:::-;;:::i;34025:41::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;33522:48::-;;33569:1;33522:48;;37176:161;;;;;;:::i;:::-;;:::i;35052:100::-;35131:6;:13;35052:100;;49314:151;;;;;;:::i;:::-;;:::i;34135:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;33708:29;;;;;-1:-1:-1;;;;;33708:29:0;;;35543:153;;;;;;:::i;:::-;-1:-1:-1;;;;;35658:23:0;35631:7;35658:23;;;:15;:23;;;;;:30;;35543:153;46238:1222;;;;;;:::i;:::-;;:::i;34349:23::-;;;;;;:::i;:::-;;:::i;3984:325::-;;;;;;:::i;:::-;;:::i;37561:233::-;;;;;;:::i;:::-;;:::i;33618:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41367:134::-;41446:47;41459:6;41467:1;33446;41491;41446:12;:47::i;:::-;41367:134;:::o;41771:136::-;41851:48;41864:6;41872:1;33569;41897;41851:12;:48::i;38521:495::-;38735:14;38782:226;38817:6;38842:5;38866:7;38892:12;38923:20;38962:1;38782:16;:226::i;:::-;38762:246;38521:495;-1:-1:-1;;;;;;38521:495:0:o;47781:536::-;32055:13;:11;:13::i;:::-;-1:-1:-1;;;;;47909:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;;::::1;;47901:39;;;::::0;-1:-1:-1;;;47901:39:0;;9910:2:1;47901: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;;47901:39:0::1;;;;;;;;;-1:-1:-1::0;;;;;47959:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;:30;:35;47951:60:::1;;;::::0;-1:-1:-1;;;47951:60:0;;10245:2:1;47951: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;;47951:60:0::1;10043:336:1::0;47951:60:0::1;48048:6;-1:-1:-1::0;;;;;48030:24:0::1;:6;48037;48030:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;48030:14:0::1;:24;48022:48;;;::::0;-1:-1:-1;;;48022:48:0;;10718:2:1;48022: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;;48022:48:0::1;10516:335:1::0;48022:48:0::1;48150:6;48157:13:::0;;:17:::1;::::0;48173:1:::1;::::0;48157:17:::1;:::i;:::-;48150:25;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;48133:6:::1;:14:::0;;-1:-1:-1;;;;;48150:25:0;;::::1;::::0;48140:6;;48133:14;::::1;;;;;:::i;:::-;;;;;;;;;:42;;;;;-1:-1:-1::0;;;;;48133:42:0::1;;;;;-1:-1:-1::0;;;;;48133:42:0::1;;;;;;48229:6;:12;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;48229:12:0;;;;;-1:-1:-1;;;;;;48229:12:0::1;::::0;;;;;;;;-1:-1:-1;;;;;48282:19:0;;;::::1;::::0;;:11:::1;:19:::0;;;-1:-1:-1;48282:19:0;;;:27;;-1:-1:-1;;48282:27:0::1;::::0;;47781:536::o;48965:203::-;3291:18;:16;:18::i;:::-;-1:-1:-1;;;;;49084:17:0;::::1;;::::0;;;:7:::1;:17;::::0;;;;;;;;:27;;-1:-1:-1;;49084:27:0::1;::::0;::::1;;::::0;;::::1;::::0;;;49129:31;;4485:41:1;;;49129:31:0::1;::::0;4458:18:1;49129:31:0::1;;;;;;;;48965:203:::0;;:::o;48548:221::-;3291:18;:16;:18::i;:::-;-1:-1:-1;;;;;48673:19:0;::::1;;::::0;;;:9:::1;:19;::::0;;;;;;;;:33;;-1:-1:-1;;48673:33:0::1;::::0;::::1;;::::0;;::::1;::::0;;;48724:37;;4485:41:1;;;48724:37:0::1;::::0;4458:18:1;48724:37:0::1;4345:187:1::0;35888:157:0;-1:-1:-1;;;;;36014:23:0;;;;;;:15;:23;;;;;;;;;36007:30;;;;;;;;;;;;;;;;;35978:16;;36007:30;;;36014:23;36007:30;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36007:30:0;;;;;;;;;;;;;;;;;;;;;;;35888:157;;;:::o;45592:262::-;32178:11;:9;:11::i;:::-;-1:-1:-1;;;;;45719:17:0;;::::1;45754:1;45719:17:::0;;;:9:::1;:17;::::0;;;;:23;::::1;45711:59;;;::::0;-1:-1:-1;;;45711:59:0;;11455:2:1;45711: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;;45711:59:0::1;11253:332:1::0;45711:59:0::1;-1:-1:-1::0;;;;;45781:17:0;::::1;;::::0;;;:9:::1;:17;::::0;;;;:21:::1;;:28;45805:4:::0;45781:21;:28:::1;:::i;:::-;-1:-1:-1::0;45827:19:0::1;::::0;-1:-1:-1;;;;;45827:19:0;::::1;::::0;::::1;::::0;;;::::1;45592:262:::0;;:::o;35300:102::-;35352:16;35388:6;35381:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35381:13:0;;;;;;;;;;;;;;;;;;;;;;;35300:102;:::o;36447:415::-;36546:36;36600:26;36629:6;36600:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36600:35:0;;;;;;;;;;;;;;;;-1:-1:-1;;36663:6:0;:13;36600:35;;-1:-1:-1;36663:13:0;;-1:-1:-1;;;;;;;;36709:23:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36689:43;;36748:9;36743:112;36763:6;36759:1;:10;36743:112;;;36814:15;:29;36830:9;36840:1;36830:12;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;36814:29:0;-1:-1:-1;;;;;36814:29:0;;;;;;;;;;;;36791:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36791:52:0;;;;;;;;;;;;;;;;;;;;;:17;36809:1;36791:20;;;;;;;;:::i;:::-;;;;;;:52;;;;36771:3;;;;:::i;:::-;;;36743:112;;;;36589:273;;36447:415;:::o;39862:1236::-;40122:14;32055:13;:11;:13::i;:::-;40210:22:::1;40328:13;40311:1;40251:15;-1:-1:-1::0;;;;;40235:58:0::1;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:77;;;;:::i;:::-;:106;;;;:::i;:::-;40439:82;::::0;-1:-1:-1;;;40439:82:0;;::::1;::::0;::::1;3479:25:1::0;;;40210:131:0;;-1:-1:-1;40421:15:0::1;::::0;-1:-1:-1;;;;;40455:15:0::1;40439:42;::::0;::::1;::::0;3452:18:1;;40439:82:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40421:100:::0;-1:-1:-1;;;;;;40589:21:0;::::1;40581:59;;;::::0;-1:-1:-1;;;40581:59:0;;14581:2:1;40581:59:0::1;::::0;::::1;14563:21:1::0;14620:2;14600:18;;;14593:30;14659:27;14639:18;;;14632:55;14704:18;;40581:59:0::1;14379:349:1::0;40581:59:0::1;40692:175;::::0;-1:-1:-1;;;40692:175:0;;-1:-1:-1;;;;;40692:39:0;::::1;::::0;::::1;::::0;:175:::1;::::0;40746:6;;40767:5;;40787:7;;40809:12;;40836:20;;40692:175:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40683:184;;40930:160;40959:6;40980;41001:14;33446:1;41064:15;40930:14;:160::i;:::-;40138:960;;39862:1236:::0;;;;;;;;:::o;42583:1373::-;32055:13;:11;:13::i;:::-;-1:-1:-1;;;;;42819:17:0;;::::1;42854:1;42819:17:::0;;;:9:::1;:17;::::0;;;;:23;::::1;:37:::0;42811:58:::1;;;::::0;-1:-1:-1;;;42811:58:0;;15595:2:1;42811: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;;42811:58:0::1;15393:331:1::0;42811:58:0::1;42888:10;42902:1;42888:15:::0;42880:37:::1;;;::::0;-1:-1:-1;;;42880:37:0;;15931:2:1;42880: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;;42880:37:0::1;15729:332:1::0;42880:37:0::1;-1:-1:-1::0;;;;;42936:31:0;::::1;;42928:57;;;::::0;-1:-1:-1;;;42928:57:0;;16268:2:1;42928: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;;42928:57:0::1;16066:337:1::0;42928:57:0::1;43028:15;43004:20;:39;;42996:68;;;::::0;-1:-1:-1;;;42996:68:0;;16610:2:1;42996: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;;42996:68:0::1;16408:340:1::0;42996:68:0::1;43170:22;43288:13;43271:1;43211:15;-1:-1:-1::0;;;;;43195:58:0::1;;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:77;;;;:::i;:::-;:106;;;;:::i;:::-;43446:58;::::0;-1:-1:-1;;;43446:58:0;;::::1;::::0;::::1;3479:25:1::0;;;43170:131:0;;-1:-1:-1;43391:24:0::1;::::0;-1:-1:-1;;;;;43462:15:0::1;43446:42;::::0;::::1;::::0;3452:18:1;;43446:58:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43418:108:0::1;;:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;43418:110:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;43391:137;;43646:10;43629:30;;;;;;43586:6;-1:-1:-1::0;;;;;43579:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;43579:27:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;43563:45;;;;;;:96;43541:163;;;::::0;-1:-1:-1;;;43541:163:0;;17609:2:1;43541: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;;43541:163:0::1;17407:341:1::0;43541:163:0::1;43776:172;43805:6;43833;-1:-1:-1::0;;;;;43826:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43863:14;43892:10;43917:20;43776:14;:172::i;:::-;42766:1190;;42583:1373:::0;;;;:::o;34025:41::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34025:41:0;;;-1:-1:-1;;;34025:41:0;;;-1:-1:-1;;;;;34025:41:0;;-1:-1:-1;;;;;34025:41:0;;;;-1:-1:-1;;;34025:41:0;;-1:-1:-1;;;;;34025:41:0;;-1:-1:-1;;;34025:41:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37176:161::-;-1:-1:-1;;;;;37267:17:0;;;37243:4;37267:17;;;:9;:17;;;;;:23;37243:4;;37267:23;:37;;;:62;;;37308:21;37322:6;37308:13;:21::i;:::-;37260:69;37176:161;-1:-1:-1;;37176:161:0:o;49314:151::-;3291:18;:16;:18::i;:::-;49425:14:::1;:32:::0;;-1:-1:-1;;;;;;49425:32:0::1;-1:-1:-1::0;;;;;49425:32:0;;;::::1;::::0;;;::::1;::::0;;49314:151::o;46238:1222::-;32055:13;:11;:13::i;:::-;-1:-1:-1;;;;;46389:17:0;;::::1;46370:16;46389:17:::0;;;:9:::1;:17;::::0;;;;;;;46370:36;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;46370:36:0;;::::1;-1:-1:-1::0;;;;;46370:36:0::1;::::0;;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;;;;;46370:36:0;;::::1;::::0;;;;;;;-1:-1:-1;;;46370:36:0;::::1;-1:-1:-1::0;;;;;46370:36:0::1;::::0;;;;-1:-1:-1;;;46370:36:0;::::1;;::::0;;;;::::1;::::0;::::1;::::0;;:16;;:36;;;;;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;46370:36:0;;;;-1:-1:-1;;46425:10:0;;46370:36;;-1:-1:-1;;;;;;;46425:24:0::1;46417:46;;;::::0;-1:-1:-1;;;46417:46:0;;17955:2:1;46417: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;;46417:46:0::1;17753:332:1::0;46417:46:0::1;46512:10:::0;;-1:-1:-1;;;;;46496:27:0;;::::1;;::::0;;;:15:::1;:27;::::0;;;;46524:10:::1;::::0;::::1;::::0;46496:39;;:49;;::::1;::::0;-1:-1:-1;;;;;46496:39:0;;::::1;::::0;;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;46496:39:0::1;:49;46474:110;;;::::0;-1:-1:-1;;;46474:110:0;;18292:2:1;46474: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;;46474:110:0::1;18090:335:1::0;46474:110:0::1;46683:10:::0;;-1:-1:-1;;;;;46667:27:0;;::::1;46647:17;46667:27:::0;;;:15:::1;:27;::::0;;;;;46725:10;;46709:27;;::::1;::::0;;;;:34;46647:17;;46667:27;46709:38:::1;::::0;46746:1:::1;::::0;46709:38:::1;:::i;:::-;46667:91;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;46667:91:0;;::::1;::::0;-1:-1:-1;46834:19:0;::::1;::::0;::::1;46830:286;;46950:10:::0;;-1:-1:-1;;;;;46934:27:0::1;;::::0;;;:15:::1;:27;::::0;;;;46962:10:::1;::::0;::::1;::::0;46934:39;;46976:9;;46934:27;-1:-1:-1;;;;;46934:39:0::1;::::0;;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;:51:::0;;-1:-1:-1;;;;;46934:51:0;;::::1;-1:-1:-1::0;;;;;;46934:51:0;;::::1;;::::0;;47093:10:::1;::::0;::::1;::::0;47057:20;;::::1;::::0;;:9:::1;:20:::0;;;;;46934:51;47057:26:::1;:47:::0;;-1:-1:-1;;;;;47057:47:0;;::::1;-1:-1:-1::0;;;47057:47:0::1;-1:-1:-1::0;;;;;47057:47:0;;::::1;::::0;;;::::1;::::0;;46830:286:::1;47189:10:::0;;-1:-1:-1;;;;;47173:27:0::1;;::::0;;;:15:::1;:27;::::0;;;;:33;;;::::1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;47173:33:0::1;;;;;;;47300:4;:10;;;-1:-1:-1::0;;;;;47252:132:0::1;47279:6;-1:-1:-1::0;;;;;47252:132:0::1;;47325:4;:19;;;47359:4;:14;;;47252: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;47252:132:0::1;;;;;;;;-1:-1:-1::0;;;;;47435:17:0;::::1;;::::0;;;:9:::1;:17;::::0;;;;47428:24;;;;;::::1;::::0;;;47435:17;47428:24:::1;;::::0;::::1;47435:17:::0;47428:24:::1;:::i;:::-;;;46306:1154;;46238:1222:::0;:::o;34349:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34349:23:0;;-1:-1:-1;34349:23:0;:::o;3984:325::-;3291:18;:16;:18::i;:::-;-1:-1:-1;;;;;4103:28:0;::::1;4095:53;;;::::0;-1:-1:-1;;;4095:53:0;;18941:2:1;4095: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;;4095:53:0::1;18739:336:1::0;4095:53:0::1;4159:21;4183:10:::0;;-1:-1:-1;;;;;4204:27:0;;::::1;-1:-1:-1::0;;;;;;4204:27:0;::::1;::::0;::::1;::::0;;4249:52:::1;::::0;4183:10;;;::::1;::::0;;;4249:52:::1;::::0;4159:21;4249:52:::1;4084:225;3984:325:::0;:::o;37561:233::-;37664:14;;37629:4;;-1:-1:-1;;;;;37664:14:0;;37691:39;;-1:-1:-1;37725:5:0;;37561:233;-1:-1:-1;;37561:233:0:o;37691:39::-;37750:36;;-1:-1:-1;;;37750:36:0;;-1:-1:-1;;;;;3289:32:1;;;37750:36:0;;;3271:51:1;37750:28:0;;;;;3244:18:1;;37750:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37743:43;37561:233;-1:-1:-1;;;37561:233:0:o;32265:127::-;32335:10;;-1:-1:-1;;;;;32335:10:0;32321;:24;;:49;;-1:-1:-1;32359:10:0;32349:21;;;;:9;:21;;;;;;;;32321:49;32313:71;;;;-1:-1:-1;;;32313:71:0;;19532:2:1;32313:71:0;;;19514:21:1;19571:1;19551:18;;;19544:29;-1:-1:-1;;;19589:18:1;;;19582:39;19638:18;;32313:71:0;19330:332:1;32313:71:0;32265:127::o;3398:117::-;3467:10;;-1:-1:-1;;;;;3467:10:0;3481;3467:24;3459:48;;;;-1:-1:-1;;;3459:48:0;;19869:2:1;3459:48:0;;;19851:21:1;19908:2;19888:18;;;19881:30;-1:-1:-1;;;19927:18:1;;;19920:41;19978:18;;3459:48:0;19667:335:1;32445:121:0;32513:10;;-1:-1:-1;;;;;32513:10:0;32499;:24;;:47;;-1:-1:-1;32535:10:0;32527:19;;;;:7;:19;;;;;;;;32499:47;32491:67;;;;-1:-1:-1;;;32491:67:0;;20209:2:1;32491:67:0;;;20191:21:1;20248:1;20228:18;;;20221:29;-1:-1:-1;;;20266:18:1;;;20259:37;20313:18;;32491:67:0;20007:330:1;44254:915:0;44531:289;;;;;;;;44558:6;-1:-1:-1;;;;;44531:289:0;;;;;44602:14;-1:-1:-1;;;;;44531:289:0;;;;;44650:10;-1:-1:-1;;;;;44531:289:0;;;;;44705:20;-1:-1:-1;;;;;44531:289:0;;;;;44755:15;:23;44771:6;-1:-1:-1;;;;;44755:23:0;-1:-1:-1;;;;;44755:23:0;;;;;;;;;;;;:30;;;;-1:-1:-1;;;;;44531:289:0;;;;;;;;;;;;;;;;;;;;44511:9;:17;44521:6;-1:-1:-1;;;;;44511:17:0;-1:-1:-1;;;;;44511:17:0;;;;;;;;;;;;:309;;;;;;;;;;;;;-1:-1:-1;;;;;44511:309:0;;;;;-1:-1:-1;;;;;44511:309:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44511:309:0;;;;;-1:-1:-1;;;;;44511:309:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44511:309:0;;;;;-1:-1:-1;;;;;44511:309:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44511:309:0;;;;;-1:-1:-1;;;;;44511:309:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44511:309:0;;;;;-1:-1:-1;;;;;44511:309:0;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;44879:23:0;;;;;;;:15;:23;;;;;;;;:36;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44879:36:0;;;;;;;;;;;44933:19;;;:11;:19;;;;;;;44928:156;;45012:6;:19;;;;;;;;;;;;;-1:-1:-1;;;;;;45012:19:0;-1:-1:-1;;;;;45012:19:0;;;;;;;;-1:-1:-1;45046:19:0;;;:11;45012:19;45046;;;;:26;;-1:-1:-1;;45046:26:0;;;;;;44928:156;45126:6;-1:-1:-1;;;;;45101:60:0;45118:6;-1:-1:-1;;;;;45101:60:0;;45134:14;45150:10;45101:60;;;;;;20516:25:1;;;20572:2;20557:18;;20550:34;20504:2;20489:18;;20342:248;45101:60:0;;;;;;;;44254: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://f1943a6d34a6ea17bd1eef845ed1f64be8295b3ac68f02fcfe5be92e7216b02a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.