Overview
S Balance
0 S
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
StrategyFactory
Compiler Version
v0.8.23+commit.f704f362
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol"; import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; /** * @title StrategyFactory * @dev Factory contract to manage Beefy strategies with upgradeable beacons. */ contract StrategyFactory is Ownable { /// @notice Maps strategy names to their beacon instances mapping(string => UpgradeableBeacon) public instances; /// @notice Tracks if an address is an approved rebalancer mapping(address => bool) public rebalancers; /// @notice Tracks pause state by strategy name mapping(string => bool) public strategyPause; /// @notice List of all deployed strategy types string[] public strategyTypes; /// @notice The address of the native token address public native; /// @notice The address of the keeper address public keeper; /// @notice The Beefy fee recipient address public beefyFeeRecipient; /// @notice The Beefy fee configuration address address public beefyFeeConfig; /// @notice Global pause state for all strategies bool public globalPause; // Events event ProxyCreated(string strategyName, address proxy); event InstanceUpgraded(string strategyName, address newImplementation); event NewStrategyAdded(string strategyName, address implementation); event SetBeefyFeeRecipient(address beefyFeeRecipient); event SetBeefyFeeConfig(address beefyFeeConfig); event SetKeeper(address keeper); event GlobalPause(bool paused); event StratPause(string strategyName, bool paused); event RebalancerChanged(address rebalancer, bool isRebalancer); // Errors error NotManager(); error StratVersionExists(); /// @notice Modifier to restrict access to the owner or keeper modifier onlyManager() { if (msg.sender != owner() && msg.sender != keeper) revert NotManager(); _; } /** * @notice Constructor initializes the StrategyFactory * @param _native Address of the native token * @param _keeper Address of the keeper * @param _beefyFeeRecipient Address of the fee recipient * @param _beefyFeeConfig Address of the fee config */ constructor( address _native, address _keeper, address _beefyFeeRecipient, address _beefyFeeConfig ) { native = _native; keeper = _keeper; beefyFeeRecipient = _beefyFeeRecipient; beefyFeeConfig = _beefyFeeConfig; } /** * @notice Creates a new strategy proxy from the beacon * @param _strategyName Name of the strategy * @return Address of the new proxy */ function createStrategy(string calldata _strategyName) external returns (address) { UpgradeableBeacon instance = instances[_strategyName]; BeaconProxy proxy = new BeaconProxy(address(instance), ""); emit ProxyCreated(_strategyName, address(proxy)); return address(proxy); } /** * @notice Adds a new strategy with a beacon * @param _strategyName Name of the strategy * @param _implementation Address of the strategy implementation */ function addStrategy(string calldata _strategyName, address _implementation) external onlyManager { if (address(instances[_strategyName]) != address(0)) revert StratVersionExists(); instances[_strategyName] = new UpgradeableBeacon(_implementation); // Track the deployed strategy strategyTypes.push(_strategyName); emit NewStrategyAdded(_strategyName, _implementation); } /** * @notice Upgrades the implementation for a strategy * @param _strategyName Name of the strategy * @param _newImplementation Address of the new implementation */ function upgradeTo(string calldata _strategyName, address _newImplementation) external onlyOwner { UpgradeableBeacon instance = instances[_strategyName]; instance.upgradeTo(_newImplementation); emit InstanceUpgraded(_strategyName, _newImplementation); } // --- Global Pause Management --- function pauseAllStrats() external onlyManager { globalPause = true; emit GlobalPause(true); } function unpauseAllStrats() external onlyOwner { globalPause = false; emit GlobalPause(false); } function pauseStrategy(string calldata _strategyName) external onlyManager { strategyPause[_strategyName] = true; emit StratPause(_strategyName, true); } function unpauseStrategy(string calldata _strategyName) external onlyOwner { strategyPause[_strategyName] = false; emit StratPause(_strategyName, false); } // --- Fee and Keeper Management --- function setBeefyFeeRecipient(address _beefyFeeRecipient) external onlyOwner { beefyFeeRecipient = _beefyFeeRecipient; emit SetBeefyFeeRecipient(_beefyFeeRecipient); } function setBeefyFeeConfig(address _beefyFeeConfig) external onlyOwner { beefyFeeConfig = _beefyFeeConfig; emit SetBeefyFeeConfig(_beefyFeeConfig); } function setKeeper(address _keeper) external onlyOwner { keeper = _keeper; emit SetKeeper(_keeper); } // --- Rebalancer Management --- function addRebalancer(address _rebalancer) external onlyOwner { rebalancers[_rebalancer] = true; emit RebalancerChanged(_rebalancer, true); } function removeRebalancer(address _rebalancer) external onlyManager { rebalancers[_rebalancer] = false; emit RebalancerChanged(_rebalancer, false); } // --- View Functions --- function getImplementation(string calldata _strategyName) external view returns (address) { return instances[_strategyName].implementation(); } function getStrategyTypes() external view returns (string[] memory) { return strategyTypes; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822Proxiable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol) pragma solidity ^0.8.0; /** * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC. * * _Available since v4.8.3._ */ interface IERC1967 { /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Emitted when the beacon is changed. */ event BeaconUpgraded(address indexed beacon); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/beacon/BeaconProxy.sol) pragma solidity ^0.8.0; import "./IBeacon.sol"; import "../Proxy.sol"; import "../ERC1967/ERC1967Upgrade.sol"; /** * @dev This contract implements a proxy that gets the implementation address for each call from an {UpgradeableBeacon}. * * The beacon address is stored in storage slot `uint256(keccak256('eip1967.proxy.beacon')) - 1`, so that it doesn't * conflict with the storage layout of the implementation behind the proxy. * * _Available since v3.4._ */ contract BeaconProxy is Proxy, ERC1967Upgrade { /** * @dev Initializes the proxy with `beacon`. * * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon. This * will typically be an encoded function call, and allows initializing the storage of the proxy like a Solidity * constructor. * * Requirements: * * - `beacon` must be a contract with the interface {IBeacon}. */ constructor(address beacon, bytes memory data) payable { _upgradeBeaconToAndCall(beacon, data, false); } /** * @dev Returns the current beacon address. */ function _beacon() internal view virtual returns (address) { return _getBeacon(); } /** * @dev Returns the current implementation address of the associated beacon. */ function _implementation() internal view virtual override returns (address) { return IBeacon(_getBeacon()).implementation(); } /** * @dev Changes the proxy to use a new beacon. Deprecated: see {_upgradeBeaconToAndCall}. * * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon. * * Requirements: * * - `beacon` must be a contract. * - The implementation returned by `beacon` must be a contract. */ function _setBeacon(address beacon, bytes memory data) internal virtual { _upgradeBeaconToAndCall(beacon, data, false); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeacon { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/UpgradeableBeacon.sol) pragma solidity ^0.8.0; import "./IBeacon.sol"; import "../../access/Ownable.sol"; import "../../utils/Address.sol"; /** * @dev This contract is used in conjunction with one or more instances of {BeaconProxy} to determine their * implementation contract, which is where they will delegate all function calls. * * An owner is able to change the implementation the beacon points to, thus upgrading the proxies that use this beacon. */ contract UpgradeableBeacon is IBeacon, Ownable { address private _implementation; /** * @dev Emitted when the implementation returned by the beacon is changed. */ event Upgraded(address indexed implementation); /** * @dev Sets the address of the initial implementation, and the deployer account as the owner who can upgrade the * beacon. */ constructor(address implementation_) { _setImplementation(implementation_); } /** * @dev Returns the current implementation address. */ function implementation() public view virtual override returns (address) { return _implementation; } /** * @dev Upgrades the beacon to a new implementation. * * Emits an {Upgraded} event. * * Requirements: * * - msg.sender must be the owner of the contract. * - `newImplementation` must be a contract. */ function upgradeTo(address newImplementation) public virtual onlyOwner { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Sets the implementation contract address for this beacon * * Requirements: * * - `newImplementation` must be a contract. */ function _setImplementation(address newImplementation) private { require(Address.isContract(newImplementation), "UpgradeableBeacon: implementation is not a contract"); _implementation = newImplementation; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; import "../beacon/IBeacon.sol"; import "../../interfaces/IERC1967.sol"; import "../../interfaces/draft-IERC1822.sol"; import "../../utils/Address.sol"; import "../../utils/StorageSlot.sol"; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ */ abstract contract ERC1967Upgrade is IERC1967 { // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { Address.functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlot.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlot.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(Address.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( Address.isContract(IBeacon(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol) pragma solidity ^0.8.0; /** * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to * be specified by overriding the virtual {_implementation} function. * * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a * different contract through the {_delegate} function. * * The success and return data of the delegated call will be returned back to the caller of the proxy. */ abstract contract Proxy { /** * @dev Delegates the current call to `implementation`. * * This function does not return to its internal call site, it will return directly to the external caller. */ function _delegate(address implementation) internal virtual { assembly { // Copy msg.data. We take full control of memory in this inline assembly // block because it will not return to Solidity code. We overwrite the // Solidity scratch pad at memory position 0. calldatacopy(0, 0, calldatasize()) // Call the implementation. // out and outsize are 0 because we don't know the size yet. let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) // Copy the returned data. returndatacopy(0, 0, returndatasize()) switch result // delegatecall returns 0 on error. case 0 { revert(0, returndatasize()) } default { return(0, returndatasize()) } } } /** * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function * and {_fallback} should delegate. */ function _implementation() internal view virtual returns (address); /** * @dev Delegates the current call to the address returned by `_implementation()`. * * This function does not return to its internal call site, it will return directly to the external caller. */ function _fallback() internal virtual { _beforeFallback(); _delegate(_implementation()); } /** * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other * function in the contract matches the call data. */ fallback() external payable virtual { _fallback(); } /** * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data * is empty. */ receive() external payable virtual { _fallback(); } /** * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback` * call, or as part of the Solidity `fallback` or `receive` functions. * * If overridden should call `super._beforeFallback()`. */ function _beforeFallback() internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ```solidity * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._ * _Available since v4.9 for `string`, `bytes`._ */ library StorageSlot { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct StringSlot { string value; } struct BytesSlot { bytes value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev Returns an `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } }
{ "evmVersion": "paris", "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_native","type":"address"},{"internalType":"address","name":"_keeper","type":"address"},{"internalType":"address","name":"_beefyFeeRecipient","type":"address"},{"internalType":"address","name":"_beefyFeeConfig","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NotManager","type":"error"},{"inputs":[],"name":"StratVersionExists","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"GlobalPause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"strategyName","type":"string"},{"indexed":false,"internalType":"address","name":"newImplementation","type":"address"}],"name":"InstanceUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"strategyName","type":"string"},{"indexed":false,"internalType":"address","name":"implementation","type":"address"}],"name":"NewStrategyAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"strategyName","type":"string"},{"indexed":false,"internalType":"address","name":"proxy","type":"address"}],"name":"ProxyCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rebalancer","type":"address"},{"indexed":false,"internalType":"bool","name":"isRebalancer","type":"bool"}],"name":"RebalancerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"beefyFeeConfig","type":"address"}],"name":"SetBeefyFeeConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"beefyFeeRecipient","type":"address"}],"name":"SetBeefyFeeRecipient","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"keeper","type":"address"}],"name":"SetKeeper","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"strategyName","type":"string"},{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"StratPause","type":"event"},{"inputs":[{"internalType":"address","name":"_rebalancer","type":"address"}],"name":"addRebalancer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_strategyName","type":"string"},{"internalType":"address","name":"_implementation","type":"address"}],"name":"addStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"beefyFeeConfig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beefyFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_strategyName","type":"string"}],"name":"createStrategy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_strategyName","type":"string"}],"name":"getImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStrategyTypes","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalPause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"instances","outputs":[{"internalType":"contract UpgradeableBeacon","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"native","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseAllStrats","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_strategyName","type":"string"}],"name":"pauseStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rebalancers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rebalancer","type":"address"}],"name":"removeRebalancer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beefyFeeConfig","type":"address"}],"name":"setBeefyFeeConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beefyFeeRecipient","type":"address"}],"name":"setBeefyFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"strategyPause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"strategyTypes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseAllStrats","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_strategyName","type":"string"}],"name":"unpauseStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_strategyName","type":"string"},{"internalType":"address","name":"_newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003bc238038062003bc283398181016040528101906200003791906200029b565b620000576200004b6200016560201b60201c565b6200016d60201b60201c565b83600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050506200030d565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002638262000236565b9050919050565b620002758162000256565b81146200028157600080fd5b50565b60008151905062000295816200026a565b92915050565b60008060008060808587031215620002b857620002b762000231565b5b6000620002c88782880162000284565b9450506020620002db8782880162000284565b9350506040620002ee8782880162000284565b9250506060620003018782880162000284565b91505092959194509250565b6138a5806200031d6000396000f3fe60806040523480156200001157600080fd5b5060043610620001b45760003560e01c80638da5cb5b11620000f3578063c93d771511620000a5578063de73a594116200007b578063de73a59414620004b5578063ed8ea60014620004eb578063f12d54d8146200050d578063f2fde38b146200052f57620001b4565b8063c93d77151462000469578063cdd5d9dd1462000475578063ce903bcc146200049557620001b4565b80638da5cb5b14620003a15780638e14545914620003c3578063940a9fa114620003e5578063a44d57a014620003f1578063a68833e51462000427578063aced1661146200044757620001b4565b806343bc4b9a116200016b5780635a8b1a9f11620001415780635a8b1a9f146200031f5780636b683896146200033f578063715018a61462000375578063748747e6146200038157620001b4565b806343bc4b9a14620002a75780634746fb5514620002c7578063517137ee14620002e957620001b4565b80630c97991914620001b9578063106fdbd014620001d9578063116fd50114620001f957806311b0b42d146200022f578063194a4108146200025157806341a1914e1462000271575b600080fd5b620001d76004803603810190620001d19190620016ed565b6200054f565b005b620001f76004803603810190620001f19190620016ed565b620005f0565b005b6200021760048036038101906200021191906200178d565b62000677565b604051620002269190620017f3565b60405180910390f35b6200023962000744565b604051620002489190620017f3565b60405180910390f35b6200026f60048036038101906200026991906200178d565b6200076a565b005b6200028f60048036038101906200028991906200196d565b620008b3565b6040516200029e919062001a29565b60405180910390f35b620002c56004803603810190620002bf9190620016ed565b620008fc565b005b620002d162000a5f565b604051620002e09190620017f3565b60405180910390f35b62000307600480360381019062000301919062001a81565b62000a85565b60405162000316919062001b3c565b60405180910390f35b6200033d600480360381019062000337919062001b60565b62000b3a565b005b6200035d60048036038101906200035791906200178d565b62000c3d565b6040516200036c9190620017f3565b60405180910390f35b6200037f62000cfb565b005b6200039f6004803603810190620003999190620016ed565b62000d13565b005b620003ab62000d9a565b604051620003ba9190620017f3565b60405180910390f35b620003cd62000dc3565b604051620003dc9190620017f3565b60405180910390f35b620003ef62000de9565b005b6200040f6004803603810190620004099190620016ed565b62000e4a565b6040516200041e919062001be7565b60405180910390f35b6200044560048036038101906200043f9190620016ed565b62000e6a565b005b6200045162000ef1565b604051620004609190620017f3565b60405180910390f35b6200047362000f17565b005b6200049360048036038101906200048d919062001b60565b6200103a565b005b620004b36004803603810190620004ad91906200178d565b620012ca565b005b620004d36004803603810190620004cd91906200196d565b62001351565b604051620004e2919062001be7565b60405180910390f35b620004f562001387565b60405162000504919062001d26565b60405180910390f35b620005176200146a565b60405162000526919062001be7565b60405180910390f35b6200054d6004803603810190620005479190620016ed565b6200147d565b005b6200055962001507565b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fad7caca61f64c5976fc697122c9ff26acc30fc936092716798ff3b43cc54f800816001604051620005e592919062001d4a565b60405180910390a150565b620005fa62001507565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f91e28ce4210d103c13c5174847e463b836900f8dc63e9d9b42a4255169d19529816040516200066c9190620017f3565b60405180910390a150565b600080600184846040516200068e92919062001dab565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600081604051620006d09062001658565b620006dc919062001e01565b604051809103906000f080158015620006f9573d6000803e3d6000fd5b5090507f3699b7de9b98bb64c45028ff3593b0d6159da8016d0f85b6af11d765320c87bb858583604051620007319392919062001e66565b60405180910390a1809250505092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6200077462000d9a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015620007fe5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1562000836576040517fc0fc8a8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600383836040516200084c92919062001dab565b908152602001604051809103902060006101000a81548160ff0219169083151502179055507f32b2ef738db0485a8739f39e50322bb2c617e6a3d2539b4ecf26f199021057a682826001604051620008a79392919062001e9c565b60405180910390a15050565b6001818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6200090662000d9a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015620009905750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15620009c8576040517fc0fc8a8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fad7caca61f64c5976fc697122c9ff26acc30fc936092716798ff3b43cc54f80081600060405162000a5492919062001d4a565b60405180910390a150565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6004818154811062000a9657600080fd5b90600052602060002001600091509050805462000ab39062001f01565b80601f016020809104026020016040519081016040528092919081815260200182805462000ae19062001f01565b801562000b325780601f1062000b065761010080835404028352916020019162000b32565b820191906000526020600020905b81548152906001019060200180831162000b1457829003601f168201915b505050505081565b62000b4462001507565b60006001848460405162000b5a92919062001dab565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16633659cfe6836040518263ffffffff1660e01b815260040162000bc69190620017f3565b600060405180830381600087803b15801562000be157600080fd5b505af115801562000bf6573d6000803e3d6000fd5b505050507f52a6e00a16a485598386bd39b6aac98ed50e4fbde10ef9b5c18374faecb5501084848460405162000c2f9392919062001e66565b60405180910390a150505050565b60006001838360405162000c5392919062001dab565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000ccd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000cf3919062001f4d565b905092915050565b62000d0562001507565b62000d1160006200158c565b565b62000d1d62001507565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fefb5cfa1a8690c124332ab93324539c5c9c4be03f28aeb8be86f2d8a0c9fb99b8160405162000d8f9190620017f3565b60405180910390a150565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b62000df362001507565b6000600860146101000a81548160ff0219169083151502179055507fa5fea31b6dbd7aec6098ca4653b1d51af1ef786fcb19031c4c4e55b675535f1e600060405162000e40919062001be7565b60405180910390a1565b60026020528060005260406000206000915054906101000a900460ff1681565b62000e7462001507565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f8041329bf7057543a2c2ff4e4071d1d488a31f82ed44e169b5cd2f04f5e3ac858160405162000ee69190620017f3565b60405180910390a150565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b62000f2162000d9a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801562000fab5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1562000fe3576040517fc0fc8a8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600860146101000a81548160ff0219169083151502179055507fa5fea31b6dbd7aec6098ca4653b1d51af1ef786fcb19031c4c4e55b675535f1e600160405162001030919062001be7565b60405180910390a1565b6200104462000d9a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015620010ce5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1562001106576040517fc0fc8a8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600184846040516200113292919062001dab565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614620011af576040517f1f93a2cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80604051620011be9062001666565b620011ca9190620017f3565b604051809103906000f080158015620011e7573d6000803e3d6000fd5b5060018484604051620011fc92919062001dab565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060048383909180600181540180825580915050600190039060005260206000200160009091929091929091929091925091826200128792919062002152565b507fa065c3b00cde146f5df407afa0661cfa2c0ed2efd62ac00b3241aaae02ff5d2e838383604051620012bd9392919062001e66565b60405180910390a1505050565b620012d462001507565b600060038383604051620012ea92919062001dab565b908152602001604051809103902060006101000a81548160ff0219169083151502179055507f32b2ef738db0485a8739f39e50322bb2c617e6a3d2539b4ecf26f199021057a682826000604051620013459392919062001e9c565b60405180910390a15050565b6003818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b60606004805480602002602001604051908101604052809291908181526020016000905b8282101562001461578382906000526020600020018054620013cd9062001f01565b80601f0160208091040260200160405190810160405280929190818152602001828054620013fb9062001f01565b80156200144c5780601f1062001420576101008083540402835291602001916200144c565b820191906000526020600020905b8154815290600101906020018083116200142e57829003601f168201915b505050505081526020019060010190620013ab565b50505050905090565b600860149054906101000a900460ff1681565b6200148762001507565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620014f9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620014f090620022ad565b60405180910390fd5b62001504816200158c565b50565b6200151162001650565b73ffffffffffffffffffffffffffffffffffffffff166200153162000d9a565b73ffffffffffffffffffffffffffffffffffffffff16146200158a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001581906200231f565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b610b63806200234283390190565b6109cb8062002ea583390190565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620016b58262001688565b9050919050565b620016c781620016a8565b8114620016d357600080fd5b50565b600081359050620016e781620016bc565b92915050565b6000602082840312156200170657620017056200167e565b5b60006200171684828501620016d6565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126200174757620017466200171f565b5b8235905067ffffffffffffffff81111562001767576200176662001724565b5b60208301915083600182028301111562001786576200178562001729565b5b9250929050565b60008060208385031215620017a757620017a66200167e565b5b600083013567ffffffffffffffff811115620017c857620017c762001683565b5b620017d6858286016200172e565b92509250509250929050565b620017ed81620016a8565b82525050565b60006020820190506200180a6000830184620017e2565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620018608262001815565b810181811067ffffffffffffffff8211171562001882576200188162001826565b5b80604052505050565b60006200189762001674565b9050620018a5828262001855565b919050565b600067ffffffffffffffff821115620018c857620018c762001826565b5b620018d38262001815565b9050602081019050919050565b82818337600083830152505050565b6000620019066200190084620018aa565b6200188b565b90508281526020810184848401111562001925576200192462001810565b5b62001932848285620018e0565b509392505050565b600082601f8301126200195257620019516200171f565b5b813562001964848260208601620018ef565b91505092915050565b6000602082840312156200198657620019856200167e565b5b600082013567ffffffffffffffff811115620019a757620019a662001683565b5b620019b5848285016200193a565b91505092915050565b6000819050919050565b6000620019e9620019e3620019dd8462001688565b620019be565b62001688565b9050919050565b6000620019fd82620019c8565b9050919050565b600062001a1182620019f0565b9050919050565b62001a238162001a04565b82525050565b600060208201905062001a40600083018462001a18565b92915050565b6000819050919050565b62001a5b8162001a46565b811462001a6757600080fd5b50565b60008135905062001a7b8162001a50565b92915050565b60006020828403121562001a9a5762001a996200167e565b5b600062001aaa8482850162001a6a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562001aef57808201518184015260208101905062001ad2565b60008484015250505050565b600062001b088262001ab3565b62001b14818562001abe565b935062001b2681856020860162001acf565b62001b318162001815565b840191505092915050565b6000602082019050818103600083015262001b58818462001afb565b905092915050565b60008060006040848603121562001b7c5762001b7b6200167e565b5b600084013567ffffffffffffffff81111562001b9d5762001b9c62001683565b5b62001bab868287016200172e565b9350935050602062001bc086828701620016d6565b9150509250925092565b60008115159050919050565b62001be18162001bca565b82525050565b600060208201905062001bfe600083018462001bd6565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600062001c4e8262001ab3565b62001c5a818562001c30565b935062001c6c81856020860162001acf565b62001c778162001815565b840191505092915050565b600062001c90838362001c41565b905092915050565b6000602082019050919050565b600062001cb28262001c04565b62001cbe818562001c0f565b93508360208202850162001cd28562001c20565b8060005b8581101562001d14578484038952815162001cf2858262001c82565b945062001cff8362001c98565b925060208a0199505060018101905062001cd6565b50829750879550505050505092915050565b6000602082019050818103600083015262001d42818462001ca5565b905092915050565b600060408201905062001d616000830185620017e2565b62001d70602083018462001bd6565b9392505050565b600081905092915050565b600062001d90838562001d77565b935062001d9f838584620018e0565b82840190509392505050565b600062001dba82848662001d82565b91508190509392505050565b600082825260208201905092915050565b50565b600062001de960008362001dc6565b915062001df68262001dd7565b600082019050919050565b600060408201905062001e186000830184620017e2565b818103602083015262001e2b8162001dda565b905092915050565b600062001e41838562001abe565b935062001e50838584620018e0565b62001e5b8362001815565b840190509392505050565b6000604082019050818103600083015262001e8381858762001e33565b905062001e946020830184620017e2565b949350505050565b6000604082019050818103600083015262001eb981858762001e33565b905062001eca602083018462001bd6565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062001f1a57607f821691505b60208210810362001f305762001f2f62001ed2565b5b50919050565b60008151905062001f4781620016bc565b92915050565b60006020828403121562001f665762001f656200167e565b5b600062001f768482850162001f36565b91505092915050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262001fee7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001faf565b62001ffa868362001faf565b95508019841693508086168417925050509392505050565b6000620020336200202d620020278462001a46565b620019be565b62001a46565b9050919050565b6000819050919050565b6200204f8362002012565b620020676200205e826200203a565b84845462001fbc565b825550505050565b600090565b6200207e6200206f565b6200208b81848462002044565b505050565b5b81811015620020b357620020a760008262002074565b60018101905062002091565b5050565b601f8211156200210257620020cc8162001f8a565b620020d78462001f9f565b81016020851015620020e7578190505b620020ff620020f68562001f9f565b83018262002090565b50505b505050565b600082821c905092915050565b6000620021276000198460080262002107565b1980831691505092915050565b600062002142838362002114565b9150826002028217905092915050565b6200215e838362001f7f565b67ffffffffffffffff8111156200217a576200217962001826565b5b62002186825462001f01565b62002193828285620020b7565b6000601f831160018114620021c75760008415620021b2578287013590505b620021be858262002134565b8655506200222e565b601f198416620021d78662001f8a565b60005b828110156200220157848901358255600182019150602085019450602081019050620021da565b868310156200222157848901356200221d601f89168262002114565b8355505b6001600288020188555050505b50505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006200229560268362001abe565b9150620022a28262002237565b604082019050919050565b60006020820190508181036000830152620022c88162002286565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200230760208362001abe565b91506200231482620022cf565b602082019050919050565b600060208201905081810360008301526200233a81620022f8565b905091905056fe608060405260405162000b6338038062000b638339818101604052810190610027919061063b565b6100398282600061004060201b60201c565b5050610929565b61004f8361012960201b60201c565b8273ffffffffffffffffffffffffffffffffffffffff167f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e60405160405180910390a260008251118061009f5750805b15610124576101228373ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101169190610697565b836102aa60201b60201c565b505b505050565b610138816102de60201b60201c565b610177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016e90610747565b60405180910390fd5b6101f48173ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e99190610697565b6102de60201b60201c565b610233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161022a906107d9565b60405180910390fd5b806102667fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b61030160201b60201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606102d6838360405180606001604052806027815260200162000b3c6027913961030b60201b60201c565b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000819050919050565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516103359190610840565b600060405180830381855af49150503d8060008114610370576040519150601f19603f3d011682016040523d82523d6000602084013e610375565b606091505b509150915061038c8683838761039760201b60201c565b925050509392505050565b606083156103ff5760008351036103f7576103b7856102de60201b60201c565b6103f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ed906108a3565b60405180910390fd5b5b829050610410565b61040f838361041860201b60201c565b5b949350505050565b60008251111561042b5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161045f9190610907565b60405180910390fd5b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006104a78261047c565b9050919050565b6104b78161049c565b81146104c257600080fd5b50565b6000815190506104d4816104ae565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61052d826104e4565b810181811067ffffffffffffffff8211171561054c5761054b6104f5565b5b80604052505050565b600061055f610468565b905061056b8282610524565b919050565b600067ffffffffffffffff82111561058b5761058a6104f5565b5b610594826104e4565b9050602081019050919050565b60005b838110156105bf5780820151818401526020810190506105a4565b60008484015250505050565b60006105de6105d984610570565b610555565b9050828152602081018484840111156105fa576105f96104df565b5b6106058482856105a1565b509392505050565b600082601f830112610622576106216104da565b5b81516106328482602086016105cb565b91505092915050565b6000806040838503121561065257610651610472565b5b6000610660858286016104c5565b925050602083015167ffffffffffffffff81111561068157610680610477565b5b61068d8582860161060d565b9150509250929050565b6000602082840312156106ad576106ac610472565b5b60006106bb848285016104c5565b91505092915050565b600082825260208201905092915050565b7f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e60008201527f7472616374000000000000000000000000000000000000000000000000000000602082015250565b60006107316025836106c4565b915061073c826106d5565b604082019050919050565b6000602082019050818103600083015261076081610724565b9050919050565b7f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960008201527f73206e6f74206120636f6e747261637400000000000000000000000000000000602082015250565b60006107c36030836106c4565b91506107ce82610767565b604082019050919050565b600060208201905081810360008301526107f2816107b6565b9050919050565b600081519050919050565b600081905092915050565b600061081a826107f9565b6108248185610804565b93506108348185602086016105a1565b80840191505092915050565b600061084c828461080f565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b600061088d601d836106c4565b915061089882610857565b602082019050919050565b600060208201905081810360008301526108bc81610880565b9050919050565b600081519050919050565b60006108d9826108c3565b6108e381856106c4565b93506108f38185602086016105a1565b6108fc816104e4565b840191505092915050565b6000602082019050818103600083015261092181846108ce565b905092915050565b61020380620009396000396000f3fe6080604052366100135761001161001d565b005b61001b61001d565b005b610025610037565b610035610030610039565b6100b6565b565b565b60006100436100dc565b73ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100b191906101a0565b905090565b3660008037600080366000845af43d6000803e80600081146100d7573d6000f35b3d6000fd5b600061010a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b610133565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000819050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061016d82610142565b9050919050565b61017d81610162565b811461018857600080fd5b50565b60008151905061019a81610174565b92915050565b6000602082840312156101b6576101b561013d565b5b60006101c48482850161018b565b9150509291505056fea264697066735822122096bf59b7bcde7886eabf0a954fdf59f0f3cbd71d8e54b25e59def1e5aed255f964736f6c63430008170033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564608060405234801561001057600080fd5b506040516109cb3803806109cb83398181016040528101906100329190610247565b61004e61004361006360201b60201c565b61006b60201b60201c565b61005d8161012f60201b60201c565b50610317565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61013e816101c160201b60201c565b61017d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610174906102f7565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610214826101e9565b9050919050565b61022481610209565b811461022f57600080fd5b50565b6000815190506102418161021b565b92915050565b60006020828403121561025d5761025c6101e4565b5b600061026b84828501610232565b91505092915050565b600082825260208201905092915050565b7f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f60008201527f6e206973206e6f74206120636f6e747261637400000000000000000000000000602082015250565b60006102e1603383610274565b91506102ec82610285565b604082019050919050565b60006020820190508181036000830152610310816102d4565b9050919050565b6106a5806103266000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80633659cfe61461005c5780635c60da1b14610078578063715018a6146100965780638da5cb5b146100a0578063f2fde38b146100be575b600080fd5b61007660048036038101906100719190610477565b6100da565b005b610080610131565b60405161008d91906104b3565b60405180910390f35b61009e61015b565b005b6100a861016f565b6040516100b591906104b3565b60405180910390f35b6100d860048036038101906100d39190610477565b610198565b005b6100e261021b565b6100eb81610299565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61016361021b565b61016d6000610325565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6101a061021b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361020f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161020690610551565b60405180910390fd5b61021881610325565b50565b6102236103e9565b73ffffffffffffffffffffffffffffffffffffffff1661024161016f565b73ffffffffffffffffffffffffffffffffffffffff1614610297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028e906105bd565b60405180910390fd5b565b6102a2816103f1565b6102e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d89061064f565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061044482610419565b9050919050565b61045481610439565b811461045f57600080fd5b50565b6000813590506104718161044b565b92915050565b60006020828403121561048d5761048c610414565b5b600061049b84828501610462565b91505092915050565b6104ad81610439565b82525050565b60006020820190506104c860008301846104a4565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061053b6026836104ce565b9150610546826104df565b604082019050919050565b6000602082019050818103600083015261056a8161052e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006105a76020836104ce565b91506105b282610571565b602082019050919050565b600060208201905081810360008301526105d68161059a565b9050919050565b7f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f60008201527f6e206973206e6f74206120636f6e747261637400000000000000000000000000602082015250565b60006106396033836104ce565b9150610644826105dd565b604082019050919050565b600060208201905081810360008301526106688161062c565b905091905056fea2646970667358221220f59c35ae3cc9bcb5ae0ab2975fdfaf19f8a7d4c00b9d73949a63d39e91cae90f64736f6c63430008170033a264697066735822122040786b1be2074d5984b4e9cb18803d598c3e4d9d206d3132c0383982c633250f64736f6c63430008170033000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38000000000000000000000000e471f43de327bf352b5e922fea92ef6d026b4af0000000000000000000000000e471f43de327bf352b5e922fea92ef6d026b4af0000000000000000000000000e471f43de327bf352b5e922fea92ef6d026b4af0
Deployed Bytecode
0x60806040523480156200001157600080fd5b5060043610620001b45760003560e01c80638da5cb5b11620000f3578063c93d771511620000a5578063de73a594116200007b578063de73a59414620004b5578063ed8ea60014620004eb578063f12d54d8146200050d578063f2fde38b146200052f57620001b4565b8063c93d77151462000469578063cdd5d9dd1462000475578063ce903bcc146200049557620001b4565b80638da5cb5b14620003a15780638e14545914620003c3578063940a9fa114620003e5578063a44d57a014620003f1578063a68833e51462000427578063aced1661146200044757620001b4565b806343bc4b9a116200016b5780635a8b1a9f11620001415780635a8b1a9f146200031f5780636b683896146200033f578063715018a61462000375578063748747e6146200038157620001b4565b806343bc4b9a14620002a75780634746fb5514620002c7578063517137ee14620002e957620001b4565b80630c97991914620001b9578063106fdbd014620001d9578063116fd50114620001f957806311b0b42d146200022f578063194a4108146200025157806341a1914e1462000271575b600080fd5b620001d76004803603810190620001d19190620016ed565b6200054f565b005b620001f76004803603810190620001f19190620016ed565b620005f0565b005b6200021760048036038101906200021191906200178d565b62000677565b604051620002269190620017f3565b60405180910390f35b6200023962000744565b604051620002489190620017f3565b60405180910390f35b6200026f60048036038101906200026991906200178d565b6200076a565b005b6200028f60048036038101906200028991906200196d565b620008b3565b6040516200029e919062001a29565b60405180910390f35b620002c56004803603810190620002bf9190620016ed565b620008fc565b005b620002d162000a5f565b604051620002e09190620017f3565b60405180910390f35b62000307600480360381019062000301919062001a81565b62000a85565b60405162000316919062001b3c565b60405180910390f35b6200033d600480360381019062000337919062001b60565b62000b3a565b005b6200035d60048036038101906200035791906200178d565b62000c3d565b6040516200036c9190620017f3565b60405180910390f35b6200037f62000cfb565b005b6200039f6004803603810190620003999190620016ed565b62000d13565b005b620003ab62000d9a565b604051620003ba9190620017f3565b60405180910390f35b620003cd62000dc3565b604051620003dc9190620017f3565b60405180910390f35b620003ef62000de9565b005b6200040f6004803603810190620004099190620016ed565b62000e4a565b6040516200041e919062001be7565b60405180910390f35b6200044560048036038101906200043f9190620016ed565b62000e6a565b005b6200045162000ef1565b604051620004609190620017f3565b60405180910390f35b6200047362000f17565b005b6200049360048036038101906200048d919062001b60565b6200103a565b005b620004b36004803603810190620004ad91906200178d565b620012ca565b005b620004d36004803603810190620004cd91906200196d565b62001351565b604051620004e2919062001be7565b60405180910390f35b620004f562001387565b60405162000504919062001d26565b60405180910390f35b620005176200146a565b60405162000526919062001be7565b60405180910390f35b6200054d6004803603810190620005479190620016ed565b6200147d565b005b6200055962001507565b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fad7caca61f64c5976fc697122c9ff26acc30fc936092716798ff3b43cc54f800816001604051620005e592919062001d4a565b60405180910390a150565b620005fa62001507565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f91e28ce4210d103c13c5174847e463b836900f8dc63e9d9b42a4255169d19529816040516200066c9190620017f3565b60405180910390a150565b600080600184846040516200068e92919062001dab565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600081604051620006d09062001658565b620006dc919062001e01565b604051809103906000f080158015620006f9573d6000803e3d6000fd5b5090507f3699b7de9b98bb64c45028ff3593b0d6159da8016d0f85b6af11d765320c87bb858583604051620007319392919062001e66565b60405180910390a1809250505092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6200077462000d9a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015620007fe5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1562000836576040517fc0fc8a8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600383836040516200084c92919062001dab565b908152602001604051809103902060006101000a81548160ff0219169083151502179055507f32b2ef738db0485a8739f39e50322bb2c617e6a3d2539b4ecf26f199021057a682826001604051620008a79392919062001e9c565b60405180910390a15050565b6001818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6200090662000d9a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015620009905750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15620009c8576040517fc0fc8a8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fad7caca61f64c5976fc697122c9ff26acc30fc936092716798ff3b43cc54f80081600060405162000a5492919062001d4a565b60405180910390a150565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6004818154811062000a9657600080fd5b90600052602060002001600091509050805462000ab39062001f01565b80601f016020809104026020016040519081016040528092919081815260200182805462000ae19062001f01565b801562000b325780601f1062000b065761010080835404028352916020019162000b32565b820191906000526020600020905b81548152906001019060200180831162000b1457829003601f168201915b505050505081565b62000b4462001507565b60006001848460405162000b5a92919062001dab565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16633659cfe6836040518263ffffffff1660e01b815260040162000bc69190620017f3565b600060405180830381600087803b15801562000be157600080fd5b505af115801562000bf6573d6000803e3d6000fd5b505050507f52a6e00a16a485598386bd39b6aac98ed50e4fbde10ef9b5c18374faecb5501084848460405162000c2f9392919062001e66565b60405180910390a150505050565b60006001838360405162000c5392919062001dab565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000ccd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000cf3919062001f4d565b905092915050565b62000d0562001507565b62000d1160006200158c565b565b62000d1d62001507565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fefb5cfa1a8690c124332ab93324539c5c9c4be03f28aeb8be86f2d8a0c9fb99b8160405162000d8f9190620017f3565b60405180910390a150565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b62000df362001507565b6000600860146101000a81548160ff0219169083151502179055507fa5fea31b6dbd7aec6098ca4653b1d51af1ef786fcb19031c4c4e55b675535f1e600060405162000e40919062001be7565b60405180910390a1565b60026020528060005260406000206000915054906101000a900460ff1681565b62000e7462001507565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f8041329bf7057543a2c2ff4e4071d1d488a31f82ed44e169b5cd2f04f5e3ac858160405162000ee69190620017f3565b60405180910390a150565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b62000f2162000d9a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801562000fab5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1562000fe3576040517fc0fc8a8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600860146101000a81548160ff0219169083151502179055507fa5fea31b6dbd7aec6098ca4653b1d51af1ef786fcb19031c4c4e55b675535f1e600160405162001030919062001be7565b60405180910390a1565b6200104462000d9a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015620010ce5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1562001106576040517fc0fc8a8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600184846040516200113292919062001dab565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614620011af576040517f1f93a2cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80604051620011be9062001666565b620011ca9190620017f3565b604051809103906000f080158015620011e7573d6000803e3d6000fd5b5060018484604051620011fc92919062001dab565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060048383909180600181540180825580915050600190039060005260206000200160009091929091929091929091925091826200128792919062002152565b507fa065c3b00cde146f5df407afa0661cfa2c0ed2efd62ac00b3241aaae02ff5d2e838383604051620012bd9392919062001e66565b60405180910390a1505050565b620012d462001507565b600060038383604051620012ea92919062001dab565b908152602001604051809103902060006101000a81548160ff0219169083151502179055507f32b2ef738db0485a8739f39e50322bb2c617e6a3d2539b4ecf26f199021057a682826000604051620013459392919062001e9c565b60405180910390a15050565b6003818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b60606004805480602002602001604051908101604052809291908181526020016000905b8282101562001461578382906000526020600020018054620013cd9062001f01565b80601f0160208091040260200160405190810160405280929190818152602001828054620013fb9062001f01565b80156200144c5780601f1062001420576101008083540402835291602001916200144c565b820191906000526020600020905b8154815290600101906020018083116200142e57829003601f168201915b505050505081526020019060010190620013ab565b50505050905090565b600860149054906101000a900460ff1681565b6200148762001507565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620014f9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620014f090620022ad565b60405180910390fd5b62001504816200158c565b50565b6200151162001650565b73ffffffffffffffffffffffffffffffffffffffff166200153162000d9a565b73ffffffffffffffffffffffffffffffffffffffff16146200158a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001581906200231f565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b610b63806200234283390190565b6109cb8062002ea583390190565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620016b58262001688565b9050919050565b620016c781620016a8565b8114620016d357600080fd5b50565b600081359050620016e781620016bc565b92915050565b6000602082840312156200170657620017056200167e565b5b60006200171684828501620016d6565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126200174757620017466200171f565b5b8235905067ffffffffffffffff81111562001767576200176662001724565b5b60208301915083600182028301111562001786576200178562001729565b5b9250929050565b60008060208385031215620017a757620017a66200167e565b5b600083013567ffffffffffffffff811115620017c857620017c762001683565b5b620017d6858286016200172e565b92509250509250929050565b620017ed81620016a8565b82525050565b60006020820190506200180a6000830184620017e2565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620018608262001815565b810181811067ffffffffffffffff8211171562001882576200188162001826565b5b80604052505050565b60006200189762001674565b9050620018a5828262001855565b919050565b600067ffffffffffffffff821115620018c857620018c762001826565b5b620018d38262001815565b9050602081019050919050565b82818337600083830152505050565b6000620019066200190084620018aa565b6200188b565b90508281526020810184848401111562001925576200192462001810565b5b62001932848285620018e0565b509392505050565b600082601f8301126200195257620019516200171f565b5b813562001964848260208601620018ef565b91505092915050565b6000602082840312156200198657620019856200167e565b5b600082013567ffffffffffffffff811115620019a757620019a662001683565b5b620019b5848285016200193a565b91505092915050565b6000819050919050565b6000620019e9620019e3620019dd8462001688565b620019be565b62001688565b9050919050565b6000620019fd82620019c8565b9050919050565b600062001a1182620019f0565b9050919050565b62001a238162001a04565b82525050565b600060208201905062001a40600083018462001a18565b92915050565b6000819050919050565b62001a5b8162001a46565b811462001a6757600080fd5b50565b60008135905062001a7b8162001a50565b92915050565b60006020828403121562001a9a5762001a996200167e565b5b600062001aaa8482850162001a6a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562001aef57808201518184015260208101905062001ad2565b60008484015250505050565b600062001b088262001ab3565b62001b14818562001abe565b935062001b2681856020860162001acf565b62001b318162001815565b840191505092915050565b6000602082019050818103600083015262001b58818462001afb565b905092915050565b60008060006040848603121562001b7c5762001b7b6200167e565b5b600084013567ffffffffffffffff81111562001b9d5762001b9c62001683565b5b62001bab868287016200172e565b9350935050602062001bc086828701620016d6565b9150509250925092565b60008115159050919050565b62001be18162001bca565b82525050565b600060208201905062001bfe600083018462001bd6565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600062001c4e8262001ab3565b62001c5a818562001c30565b935062001c6c81856020860162001acf565b62001c778162001815565b840191505092915050565b600062001c90838362001c41565b905092915050565b6000602082019050919050565b600062001cb28262001c04565b62001cbe818562001c0f565b93508360208202850162001cd28562001c20565b8060005b8581101562001d14578484038952815162001cf2858262001c82565b945062001cff8362001c98565b925060208a0199505060018101905062001cd6565b50829750879550505050505092915050565b6000602082019050818103600083015262001d42818462001ca5565b905092915050565b600060408201905062001d616000830185620017e2565b62001d70602083018462001bd6565b9392505050565b600081905092915050565b600062001d90838562001d77565b935062001d9f838584620018e0565b82840190509392505050565b600062001dba82848662001d82565b91508190509392505050565b600082825260208201905092915050565b50565b600062001de960008362001dc6565b915062001df68262001dd7565b600082019050919050565b600060408201905062001e186000830184620017e2565b818103602083015262001e2b8162001dda565b905092915050565b600062001e41838562001abe565b935062001e50838584620018e0565b62001e5b8362001815565b840190509392505050565b6000604082019050818103600083015262001e8381858762001e33565b905062001e946020830184620017e2565b949350505050565b6000604082019050818103600083015262001eb981858762001e33565b905062001eca602083018462001bd6565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062001f1a57607f821691505b60208210810362001f305762001f2f62001ed2565b5b50919050565b60008151905062001f4781620016bc565b92915050565b60006020828403121562001f665762001f656200167e565b5b600062001f768482850162001f36565b91505092915050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262001fee7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001faf565b62001ffa868362001faf565b95508019841693508086168417925050509392505050565b6000620020336200202d620020278462001a46565b620019be565b62001a46565b9050919050565b6000819050919050565b6200204f8362002012565b620020676200205e826200203a565b84845462001fbc565b825550505050565b600090565b6200207e6200206f565b6200208b81848462002044565b505050565b5b81811015620020b357620020a760008262002074565b60018101905062002091565b5050565b601f8211156200210257620020cc8162001f8a565b620020d78462001f9f565b81016020851015620020e7578190505b620020ff620020f68562001f9f565b83018262002090565b50505b505050565b600082821c905092915050565b6000620021276000198460080262002107565b1980831691505092915050565b600062002142838362002114565b9150826002028217905092915050565b6200215e838362001f7f565b67ffffffffffffffff8111156200217a576200217962001826565b5b62002186825462001f01565b62002193828285620020b7565b6000601f831160018114620021c75760008415620021b2578287013590505b620021be858262002134565b8655506200222e565b601f198416620021d78662001f8a565b60005b828110156200220157848901358255600182019150602085019450602081019050620021da565b868310156200222157848901356200221d601f89168262002114565b8355505b6001600288020188555050505b50505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006200229560268362001abe565b9150620022a28262002237565b604082019050919050565b60006020820190508181036000830152620022c88162002286565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200230760208362001abe565b91506200231482620022cf565b602082019050919050565b600060208201905081810360008301526200233a81620022f8565b905091905056fe608060405260405162000b6338038062000b638339818101604052810190610027919061063b565b6100398282600061004060201b60201c565b5050610929565b61004f8361012960201b60201c565b8273ffffffffffffffffffffffffffffffffffffffff167f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e60405160405180910390a260008251118061009f5750805b15610124576101228373ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101169190610697565b836102aa60201b60201c565b505b505050565b610138816102de60201b60201c565b610177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016e90610747565b60405180910390fd5b6101f48173ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e99190610697565b6102de60201b60201c565b610233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161022a906107d9565b60405180910390fd5b806102667fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b61030160201b60201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606102d6838360405180606001604052806027815260200162000b3c6027913961030b60201b60201c565b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000819050919050565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516103359190610840565b600060405180830381855af49150503d8060008114610370576040519150601f19603f3d011682016040523d82523d6000602084013e610375565b606091505b509150915061038c8683838761039760201b60201c565b925050509392505050565b606083156103ff5760008351036103f7576103b7856102de60201b60201c565b6103f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ed906108a3565b60405180910390fd5b5b829050610410565b61040f838361041860201b60201c565b5b949350505050565b60008251111561042b5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161045f9190610907565b60405180910390fd5b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006104a78261047c565b9050919050565b6104b78161049c565b81146104c257600080fd5b50565b6000815190506104d4816104ae565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61052d826104e4565b810181811067ffffffffffffffff8211171561054c5761054b6104f5565b5b80604052505050565b600061055f610468565b905061056b8282610524565b919050565b600067ffffffffffffffff82111561058b5761058a6104f5565b5b610594826104e4565b9050602081019050919050565b60005b838110156105bf5780820151818401526020810190506105a4565b60008484015250505050565b60006105de6105d984610570565b610555565b9050828152602081018484840111156105fa576105f96104df565b5b6106058482856105a1565b509392505050565b600082601f830112610622576106216104da565b5b81516106328482602086016105cb565b91505092915050565b6000806040838503121561065257610651610472565b5b6000610660858286016104c5565b925050602083015167ffffffffffffffff81111561068157610680610477565b5b61068d8582860161060d565b9150509250929050565b6000602082840312156106ad576106ac610472565b5b60006106bb848285016104c5565b91505092915050565b600082825260208201905092915050565b7f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e60008201527f7472616374000000000000000000000000000000000000000000000000000000602082015250565b60006107316025836106c4565b915061073c826106d5565b604082019050919050565b6000602082019050818103600083015261076081610724565b9050919050565b7f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960008201527f73206e6f74206120636f6e747261637400000000000000000000000000000000602082015250565b60006107c36030836106c4565b91506107ce82610767565b604082019050919050565b600060208201905081810360008301526107f2816107b6565b9050919050565b600081519050919050565b600081905092915050565b600061081a826107f9565b6108248185610804565b93506108348185602086016105a1565b80840191505092915050565b600061084c828461080f565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b600061088d601d836106c4565b915061089882610857565b602082019050919050565b600060208201905081810360008301526108bc81610880565b9050919050565b600081519050919050565b60006108d9826108c3565b6108e381856106c4565b93506108f38185602086016105a1565b6108fc816104e4565b840191505092915050565b6000602082019050818103600083015261092181846108ce565b905092915050565b61020380620009396000396000f3fe6080604052366100135761001161001d565b005b61001b61001d565b005b610025610037565b610035610030610039565b6100b6565b565b565b60006100436100dc565b73ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100b191906101a0565b905090565b3660008037600080366000845af43d6000803e80600081146100d7573d6000f35b3d6000fd5b600061010a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b610133565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000819050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061016d82610142565b9050919050565b61017d81610162565b811461018857600080fd5b50565b60008151905061019a81610174565b92915050565b6000602082840312156101b6576101b561013d565b5b60006101c48482850161018b565b9150509291505056fea264697066735822122096bf59b7bcde7886eabf0a954fdf59f0f3cbd71d8e54b25e59def1e5aed255f964736f6c63430008170033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564608060405234801561001057600080fd5b506040516109cb3803806109cb83398181016040528101906100329190610247565b61004e61004361006360201b60201c565b61006b60201b60201c565b61005d8161012f60201b60201c565b50610317565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61013e816101c160201b60201c565b61017d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610174906102f7565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610214826101e9565b9050919050565b61022481610209565b811461022f57600080fd5b50565b6000815190506102418161021b565b92915050565b60006020828403121561025d5761025c6101e4565b5b600061026b84828501610232565b91505092915050565b600082825260208201905092915050565b7f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f60008201527f6e206973206e6f74206120636f6e747261637400000000000000000000000000602082015250565b60006102e1603383610274565b91506102ec82610285565b604082019050919050565b60006020820190508181036000830152610310816102d4565b9050919050565b6106a5806103266000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80633659cfe61461005c5780635c60da1b14610078578063715018a6146100965780638da5cb5b146100a0578063f2fde38b146100be575b600080fd5b61007660048036038101906100719190610477565b6100da565b005b610080610131565b60405161008d91906104b3565b60405180910390f35b61009e61015b565b005b6100a861016f565b6040516100b591906104b3565b60405180910390f35b6100d860048036038101906100d39190610477565b610198565b005b6100e261021b565b6100eb81610299565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61016361021b565b61016d6000610325565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6101a061021b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361020f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161020690610551565b60405180910390fd5b61021881610325565b50565b6102236103e9565b73ffffffffffffffffffffffffffffffffffffffff1661024161016f565b73ffffffffffffffffffffffffffffffffffffffff1614610297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028e906105bd565b60405180910390fd5b565b6102a2816103f1565b6102e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d89061064f565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061044482610419565b9050919050565b61045481610439565b811461045f57600080fd5b50565b6000813590506104718161044b565b92915050565b60006020828403121561048d5761048c610414565b5b600061049b84828501610462565b91505092915050565b6104ad81610439565b82525050565b60006020820190506104c860008301846104a4565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061053b6026836104ce565b9150610546826104df565b604082019050919050565b6000602082019050818103600083015261056a8161052e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006105a76020836104ce565b91506105b282610571565b602082019050919050565b600060208201905081810360008301526105d68161059a565b9050919050565b7f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f60008201527f6e206973206e6f74206120636f6e747261637400000000000000000000000000602082015250565b60006106396033836104ce565b9150610644826105dd565b604082019050919050565b600060208201905081810360008301526106688161062c565b905091905056fea2646970667358221220f59c35ae3cc9bcb5ae0ab2975fdfaf19f8a7d4c00b9d73949a63d39e91cae90f64736f6c63430008170033a264697066735822122040786b1be2074d5984b4e9cb18803d598c3e4d9d206d3132c0383982c633250f64736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38000000000000000000000000e471f43de327bf352b5e922fea92ef6d026b4af0000000000000000000000000e471f43de327bf352b5e922fea92ef6d026b4af0000000000000000000000000e471f43de327bf352b5e922fea92ef6d026b4af0
-----Decoded View---------------
Arg [0] : _native (address): 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38
Arg [1] : _keeper (address): 0xE471f43De327bF352b5E922FeA92eF6D026B4Af0
Arg [2] : _beefyFeeRecipient (address): 0xE471f43De327bF352b5E922FeA92eF6D026B4Af0
Arg [3] : _beefyFeeConfig (address): 0xE471f43De327bF352b5E922FeA92eF6D026B4Af0
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Arg [1] : 000000000000000000000000e471f43de327bf352b5e922fea92ef6d026b4af0
Arg [2] : 000000000000000000000000e471f43de327bf352b5e922fea92ef6d026b4af0
Arg [3] : 000000000000000000000000e471f43de327bf352b5e922fea92ef6d026b4af0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.