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