Feature Tip: Add private address tag to any address under My Name Tag !
Contract Overview
Balance:
0 Ether
EtherValue:
$0.00
More Info
Txn Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x3744be2d8fdc152c3c6d1a0b2a51960592ed95532eb65f89f3c7bff709aedd9f | 0x61010060 | 15833546 | 93 days 11 hrs ago | Gearbox Protocol: Deployer | IN | Contract Creation | 0 Ether | 0.04706363 |
[ Download CSV Export ]
View more zero value Internal Transactions in Advanced View mode
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xf6B7A9F7f104d469B499CB06F12dC33eBCeE3cd5
Contract Name:
YearnV2Adapter
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-2.0-or-later // Gearbox Protocol. Generalized leverage for DeFi protocols // (c) Gearbox Holdings, 2022 pragma solidity ^0.8.10; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import { AbstractAdapter } from "@gearbox-protocol/core-v2/contracts/adapters/AbstractAdapter.sol"; import { IAdapter, AdapterType } from "@gearbox-protocol/core-v2/contracts/interfaces/adapters/IAdapter.sol"; import { IYearnV2Adapter } from "../../interfaces/yearn/IYearnV2Adapter.sol"; import { IYVault } from "../../integrations/yearn/IYVault.sol"; /// @title Yearn adapter /// @dev Implements logic for interacting with a Yearn vault contract YearnV2Adapter is AbstractAdapter, IYearnV2Adapter, ReentrancyGuard { /// @dev Address of the token that is deposited into the vault address public immutable override token; AdapterType public constant _gearboxAdapterType = AdapterType.YEARN_V2; uint16 public constant _gearboxAdapterVersion = 2; /// @dev Constructor /// @param _creditManager Address Credit manager /// @param _yVault Address of YEARN vault contract constructor(address _creditManager, address _yVault) AbstractAdapter(_creditManager, _yVault) { // Check that we have token connected with this yearn pool token = IYVault(targetContract).token(); // F:[AYV2-1] if (creditManager.tokenMasksMap(token) == 0) revert TokenIsNotInAllowedList(token); // F:[AYV2-2] if (creditManager.tokenMasksMap(_yVault) == 0) revert TokenIsNotInAllowedList(_yVault); // F:[AYV2-2] } /// @dev Sends an order to deposit the entire token balance to the vault /// The input token does need to be disabled, because this spends the entire balance function deposit() external override nonReentrant returns (uint256 shares) { address creditAccount = creditManager.getCreditAccountOrRevert( msg.sender ); // F:[AYV2-3] uint256 balance = IERC20(token).balanceOf(creditAccount); if (balance > 1) { unchecked { shares = _deposit(creditAccount, balance - 1, true); } // F:[AYV2-4]} } } /// @dev Sends an order to deposit tokens into the vault /// @param amount The amount to be deposited /// The input token does not need to be disabled, because this does not spend the entire /// balance, generally function deposit(uint256 amount) external override nonReentrant returns (uint256) { address creditAccount = creditManager.getCreditAccountOrRevert( msg.sender ); // F:[AYV2-3] return _deposit(creditAccount, amount, false); // F:[AYV2-5] } /// @dev Sends an order to deposit tokens into the vault /// @param amount The amount to be deposited /// @notice `recipient` is ignored since a CA cannot send tokens to another account /// The input token does not need to be disabled, because this does not spend the entire /// balance, generally function deposit(uint256 amount, address) external override nonReentrant returns (uint256) { address creditAccount = creditManager.getCreditAccountOrRevert( msg.sender ); // F:[AYV2-3] return _deposit(creditAccount, amount, false); // F:[AYV2-6] } /// @dev Internal implementation for `deposit` functions /// - Makes a safe allowance fast check call to `deposit(uint256)` (since the address is always ignored) /// @param creditAccount The Credit Account from which the operation is performed /// @param amount The amount of token to deposit /// @notice Fast check parameters: /// Input token: Vault underlying token /// Output token: Yearn vault share /// Input token is allowed, since the target does a transferFrom for the deposited asset function _deposit( address creditAccount, uint256 amount, bool disableTokenIn ) internal returns (uint256 shares) { shares = abi.decode( _safeExecuteFastCheck( creditAccount, token, targetContract, abi.encodeWithSignature("deposit(uint256)", amount), true, disableTokenIn ), (uint256) ); // F:[AYV2-4,5,6] } /// @dev Sends an order to withdraw all available shares from the vault /// The input token does need to be disabled, because this spends the entire balance function withdraw() external override nonReentrant returns (uint256 value) { address creditAccount = creditManager.getCreditAccountOrRevert( msg.sender ); // F:[AYV2-3] uint256 balance = IERC20(targetContract).balanceOf(creditAccount); if (balance > 1) { unchecked { value = _withdraw(creditAccount, balance - 1, true); } // F:[AYV2-7] } } /// @dev Sends an order to withdraw shares from the vault /// @param maxShares Number of shares to withdraw /// The input token does not need to be disabled, because this does not spend the entire /// balance, generally function withdraw(uint256 maxShares) external override nonReentrant returns (uint256) { address creditAccount = creditManager.getCreditAccountOrRevert( msg.sender ); // F:[AYV2-3] return _withdraw(creditAccount, maxShares, false); // F:[AYV2-8] } /// @dev Sends an order to withdraw shares from the vault /// @param maxShares Number of shares to withdraw /// @notice `recipient` is ignored since a CA cannot send tokens to another account /// The input token does not need to be disabled, because this does not spend the entire /// balance, generally function withdraw(uint256 maxShares, address) external override nonReentrant returns (uint256) { address creditAccount = creditManager.getCreditAccountOrRevert( msg.sender ); // F:[AYV2-3] return _withdraw(creditAccount, maxShares, false); // F:[AYV2-9] } /// @dev Sends an order to withdraw shares from the vault, with a slippage limit /// @param maxShares Number of shares to withdraw /// @param maxLoss Maximal slippage on withdrawal in basis points /// The input token does not need to be disabled, because this does not spend the entire /// balance, generally function withdraw( uint256 maxShares, address, uint256 maxLoss ) public override nonReentrant returns (uint256 value) { address creditAccount = creditManager.getCreditAccountOrRevert( msg.sender ); // F:[AYV2-3] return _withdrawMaxLoss(creditAccount, maxShares, maxLoss); // F:[AYV2-10,11] } /// @dev Internal implementation for `withdraw` functions /// - Makes a safe allowance fast check call to `withdraw(uint256)` in target /// @param creditAccount The credit account that will withdraw tokens /// @param maxShares Number of shares to withdraw /// @notice Fast check parameters: /// Input token: Yearn vault share /// Output token: Vault underlying token /// Input token does not have to be allowed, since the vault burns the shares directly function _withdraw( address creditAccount, uint256 maxShares, bool disableTokenIn ) internal returns (uint256 value) { value = abi.decode( _safeExecuteFastCheck( creditAccount, targetContract, token, abi.encodeWithSignature("withdraw(uint256)", maxShares), false, disableTokenIn ), (uint256) ); // F:[AYV2-7,8,9] } /// @dev Internal implementation for the `withdraw` function with maxLoss /// - Makes a safe allowance fast check call to `withdraw(uint256,address,uint256)` in target /// @param creditAccount The credit account that will withdraw tokens /// @param maxShares Number of shares to withdraw /// @param maxLoss Maximal slippage on withdrawal, in basis points /// @notice Fast check parameters: /// Input token: Yearn vault share /// Output token: Vault underlying token /// Input token does not have to be allowed, since the vault burns the shares directly function _withdrawMaxLoss( address creditAccount, uint256 maxShares, uint256 maxLoss ) internal returns (uint256 value) { value = abi.decode( _safeExecuteFastCheck( creditAccount, targetContract, token, abi.encodeWithSignature( "withdraw(uint256,address,uint256)", maxShares, creditAccount, maxLoss ), false, false ), (uint256) ); // F:[AYV2-10,11] } /// @dev Returns the exchange rate between shares and underlying function pricePerShare() external view override returns (uint256) { return IYVault(targetContract).pricePerShare(); // F:[AYV2-12] } /// @dev Returns the name of the share token function name() external view override returns (string memory) { return IYVault(targetContract).name(); // F:[AYV2-13] } /// @dev Returns the symbol of the share token function symbol() external view override returns (string memory) { return IYVault(targetContract).symbol(); // F:[AYV2-14] } /// @dev Returns the decimals of the share token function decimals() external view override returns (uint8) { return IYVault(targetContract).decimals(); // F:[AYV2-15] } /// @dev Returns the shares allowance from owner to spender /// @param owner Address that approved tokens for spending /// @param spender Address that spends the tokens function allowance(address owner, address spender) external view override returns (uint256) { return IYVault(targetContract).allowance(owner, spender); // F:[AYV2-16] } /// @dev Function to approve spending of vault shares /// @notice Not implemented, since transfers from a CA are forbidden function approve(address, uint256) external pure override returns (bool) { return false; } /// @dev Returns vault share balance of an account /// @param account The address for which the balance is computed function balanceOf(address account) external view override returns (uint256) { return IYVault(targetContract).balanceOf(account); // F:[AYV2-17] } /// @dev Returns the total supply of vault shares function totalSupply() external view override returns (uint256) { return IYVault(targetContract).totalSupply(); // F:[AYV2-17] } /// @dev Function to transfer vault shares /// @notice Not implemented, since transfers from a CA are forbidden function transfer(address, uint256) external pure override returns (bool) { return false; } /// @dev Function to transfer vault shares from another address /// @notice Not implemented, since transfers from a CA are forbidden function transferFrom( address, address, uint256 ) external pure override returns (bool) { return false; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: GPL-2.0-or-later // Gearbox Protocol. Generalized leverage for DeFi protocols // (c) Gearbox Holdings, 2022 pragma solidity ^0.8.10; import { Address } from "@openzeppelin/contracts/utils/Address.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { ICreditManagerV2 } from "../interfaces/ICreditManagerV2.sol"; import { IAdapter } from "../interfaces/adapters/IAdapter.sol"; import { ZeroAddressException } from "../interfaces/IErrors.sol"; abstract contract AbstractAdapter is IAdapter { using Address for address; ICreditManagerV2 public immutable override creditManager; address public immutable override creditFacade; address public immutable override targetContract; constructor(address _creditManager, address _targetContract) { if (_creditManager == address(0) || _targetContract == address(0)) revert ZeroAddressException(); // F:[AA-2] creditManager = ICreditManagerV2(_creditManager); // F:[AA-1] creditFacade = ICreditManagerV2(_creditManager).creditFacade(); // F:[AA-1] targetContract = _targetContract; // F:[AA-1] } /// @dev Approves a token from the Credit Account to the target contract /// @param token Token to be approved /// @param amount Amount to be approved function _approveToken(address token, uint256 amount) internal { creditManager.approveCreditAccount( msg.sender, targetContract, token, amount ); } /// @dev Sends CallData to call the target contract from the Credit Account /// @param callData Data to be sent to the target contract function _execute(bytes memory callData) internal returns (bytes memory result) { result = creditManager.executeOrder( msg.sender, targetContract, callData ); } /// @dev Calls a target contract with maximal allowance and performs a fast check after /// @param creditAccount A credit account from which a call is made /// @param tokenIn The token that the interaction is expected to spend /// @param tokenOut The token that the interaction is expected to produce /// @param callData Data to call targetContract with /// @param allowTokenIn Whether the input token must be approved beforehand /// @param disableTokenIn Whether the input token should be disable afterwards (for interaction that spend the entire balance) /// @notice Must only be used for highly secure and immutable protocols, such as Uniswap & Curve function _executeMaxAllowanceFastCheck( address creditAccount, address tokenIn, address tokenOut, bytes memory callData, bool allowTokenIn, bool disableTokenIn ) internal returns (bytes memory result) { uint256 balanceInBefore; uint256 balanceOutBefore; if (msg.sender != creditFacade) { balanceInBefore = IERC20(tokenIn).balanceOf(creditAccount); // F:[AA-4A] balanceOutBefore = IERC20(tokenOut).balanceOf(creditAccount); // F:[AA-4A] } if (allowTokenIn) { _approveToken(tokenIn, type(uint256).max); } result = creditManager.executeOrder( msg.sender, targetContract, callData ); if (allowTokenIn) { _approveToken(tokenIn, type(uint256).max); } _fastCheck( creditAccount, tokenIn, tokenOut, balanceInBefore, balanceOutBefore, disableTokenIn ); } /// @dev Wrapper for _executeMaxAllowanceFastCheck that computes the Credit Account on the spot /// See params and other details above function _executeMaxAllowanceFastCheck( address tokenIn, address tokenOut, bytes memory callData, bool allowTokenIn, bool disableTokenIn ) internal returns (bytes memory result) { address creditAccount = creditManager.getCreditAccountOrRevert( msg.sender ); // F:[AA-3] result = _executeMaxAllowanceFastCheck( creditAccount, tokenIn, tokenOut, callData, allowTokenIn, disableTokenIn ); } /// @dev Calls a target contract with maximal allowance, then sets allowance to 1 and performs a fast check /// @param creditAccount A credit account from which a call is made /// @param tokenIn The token that the interaction is expected to spend /// @param tokenOut The token that the interaction is expected to produce /// @param callData Data to call targetContract with /// @param allowTokenIn Whether the input token must be approved beforehand /// @param disableTokenIn Whether the input token should be disable afterwards (for interaction that spend the entire balance) function _safeExecuteFastCheck( address creditAccount, address tokenIn, address tokenOut, bytes memory callData, bool allowTokenIn, bool disableTokenIn ) internal returns (bytes memory result) { uint256 balanceInBefore; uint256 balanceOutBefore; if (msg.sender != creditFacade) { balanceInBefore = IERC20(tokenIn).balanceOf(creditAccount); balanceOutBefore = IERC20(tokenOut).balanceOf(creditAccount); // F:[AA-4A] } if (allowTokenIn) { _approveToken(tokenIn, type(uint256).max); } result = creditManager.executeOrder( msg.sender, targetContract, callData ); if (allowTokenIn) { _approveToken(tokenIn, 1); } _fastCheck( creditAccount, tokenIn, tokenOut, balanceInBefore, balanceOutBefore, disableTokenIn ); } /// @dev Wrapper for _safeExecuteFastCheck that computes the Credit Account on the spot /// See params and other details above function _safeExecuteFastCheck( address tokenIn, address tokenOut, bytes memory callData, bool allowTokenIn, bool disableTokenIn ) internal returns (bytes memory result) { address creditAccount = creditManager.getCreditAccountOrRevert( msg.sender ); result = _safeExecuteFastCheck( creditAccount, tokenIn, tokenOut, callData, allowTokenIn, disableTokenIn ); } // // HEALTH CHECK FUNCTIONS // /// @dev Performs a fast check during ordinary adapter call, or skips /// it for multicalls (since a full collateral check is always performed after a multicall) /// @param creditAccount Credit Account for which the fast check is performed /// @param tokenIn Token that is spent by the operation /// @param tokenOut Token that is received as a result of operation /// @param balanceInBefore Balance of tokenIn before the operation /// @param balanceOutBefore Balance of tokenOut before the operation /// @param disableTokenIn Whether tokenIn needs to be disabled (required for multicalls, where the fast check is skipped) function _fastCheck( address creditAccount, address tokenIn, address tokenOut, uint256 balanceInBefore, uint256 balanceOutBefore, bool disableTokenIn ) private { if (msg.sender != creditFacade) { creditManager.fastCollateralCheck( creditAccount, tokenIn, tokenOut, balanceInBefore, balanceOutBefore ); } else { if (disableTokenIn) creditManager.disableToken(creditAccount, tokenIn); creditManager.checkAndEnableToken(creditAccount, tokenOut); } } /// @dev Performs a full collateral check during ordinary adapter call, or skips /// it for multicalls (since a full collateral check is always performed after a multicall) /// @param creditAccount Credit Account for which the full check is performed function _fullCheck(address creditAccount) internal { if (msg.sender != creditFacade) { creditManager.fullCollateralCheck(creditAccount); } } /// @dev Performs a enabled token optimization on account or skips /// it for multicalls (since a full collateral check is always performed after a multicall, /// and includes enabled token optimization by default) /// @param creditAccount Credit Account for which the full check is performed /// @notice Used when new tokens are added on an account but no tokens are subtracted /// (e.g., claiming rewards) function _checkAndOptimizeEnabledTokens(address creditAccount) internal { if (msg.sender != creditFacade) { creditManager.checkAndOptimizeEnabledTokens(creditAccount); } } }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.8.10; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IYVault is IERC20 { function token() external view returns (address); function deposit() external returns (uint256); function deposit(uint256 _amount) external returns (uint256); function deposit(uint256 _amount, address recipient) external returns (uint256); function withdraw() external returns (uint256); function withdraw(uint256 maxShares) external returns (uint256); function withdraw(uint256 maxShares, address recipient) external returns (uint256); function withdraw( uint256 maxShares, address recipient, uint256 maxLoss ) external returns (uint256); function pricePerShare() external view returns (uint256); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // Gearbox Protocol. Generalized leverage for DeFi protocols // (c) Gearbox Holdings, 2022 pragma solidity ^0.8.10; import { ICreditManagerV2 } from "../ICreditManagerV2.sol"; enum AdapterType { ABSTRACT, UNISWAP_V2_ROUTER, UNISWAP_V3_ROUTER, CURVE_V1_EXCHANGE_ONLY, YEARN_V2, CURVE_V1_2ASSETS, CURVE_V1_3ASSETS, CURVE_V1_4ASSETS, CURVE_V1_STECRV_POOL, CURVE_V1_WRAPPER, CONVEX_V1_BASE_REWARD_POOL, CONVEX_V1_BOOSTER, CONVEX_V1_CLAIM_ZAP, LIDO_V1, UNIVERSAL, LIDO_WSTETH_V1 } interface IAdapterExceptions { /// @dev Thrown when the adapter attempts to use a token /// that is not recognized as collateral in the connected /// Credit Manager error TokenIsNotInAllowedList(address); } interface IAdapter is IAdapterExceptions { /// @dev Returns the Credit Manager connected to the adapter function creditManager() external view returns (ICreditManagerV2); /// @dev Returns the Credit Facade connected to the adapter's Credit Manager function creditFacade() external view returns (address); /// @dev Returns the address of the contract the adapter is interacting with function targetContract() external view returns (address); /// @dev Returns the adapter type function _gearboxAdapterType() external pure returns (AdapterType); /// @dev Returns the adapter version function _gearboxAdapterVersion() external pure returns (uint16); }
// SPDX-License-Identifier: GPL-2.0-or-later // Gearbox Protocol. Generalized leverage for DeFi protocols // (c) Gearbox Holdings, 2022 pragma solidity ^0.8.10; import { IAdapter } from "@gearbox-protocol/core-v2/contracts/interfaces/adapters/IAdapter.sol"; import { IYVault } from "../../integrations/yearn/IYVault.sol"; interface IYearnV2Adapter is IAdapter, IYVault {}
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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://diligence.consensys.net/posts/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.5.11/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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(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) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // Gearbox Protocol. Generalized leverage for DeFi protocols // (c) Gearbox Holdings, 2022 pragma solidity ^0.8.10; /// @dev Common contract exceptions /// @dev Thrown on attempting to set an important address to zero address error ZeroAddressException(); /// @dev Thrown on attempting to call a non-implemented function error NotImplementedException(); /// @dev Thrown on attempting to set an EOA as an important contract in the system error AddressIsNotContractException(address); /// @dev Thrown on attempting to use a non-ERC20 contract or an EOA as a token error IncorrectTokenContractException(); /// @dev Thrown on attempting to set a token price feed to an address that is not a /// correct price feed error IncorrectPriceFeedException(); /// @dev Thrown on attempting to call an access restricted function as a non-Configurator error CallerNotConfiguratorException(); /// @dev Thrown on attempting to pause a contract as a non-Pausable admin error CallerNotPausableAdminException(); /// @dev Thrown on attempting to pause a contract as a non-Unpausable admin error CallerNotUnPausableAdminException(); error TokenIsNotAddedToCreditManagerException(address token);
// SPDX-License-Identifier: MIT // Gearbox Protocol. Generalized leverage for DeFi protocols // (c) Gearbox Holdings, 2022 pragma solidity ^0.8.10; import { IPriceOracleV2 } from "./IPriceOracle.sol"; import { IVersion } from "./IVersion.sol"; enum ClosureAction { CLOSE_ACCOUNT, LIQUIDATE_ACCOUNT, LIQUIDATE_EXPIRED_ACCOUNT, LIQUIDATE_PAUSED } interface ICreditManagerV2Events { /// @dev Emits when a call to an external contract is made through the Credit Manager event ExecuteOrder(address indexed borrower, address indexed target); /// @dev Emits when a configurator is upgraded event NewConfigurator(address indexed newConfigurator); } interface ICreditManagerV2Exceptions { /// @dev Thrown if an access-restricted function is called by an address that is not /// the connected Credit Facade, or an allowed adapter error AdaptersOrCreditFacadeOnlyException(); /// @dev Thrown if an access-restricted function is called by an address that is not /// the connected Credit Facade error CreditFacadeOnlyException(); /// @dev Thrown if an access-restricted function is called by an address that is not /// the connected Credit Configurator error CreditConfiguratorOnlyException(); /// @dev Thrown on attempting to open a Credit Account for or transfer a Credit Account /// to the zero address or an address that already owns a Credit Account error ZeroAddressOrUserAlreadyHasAccountException(); /// @dev Thrown on attempting to execute an order to an address that is not an allowed /// target contract error TargetContractNotAllowedException(); /// @dev Thrown on failing a full collateral check after an operation error NotEnoughCollateralException(); /// @dev Thrown on attempting to receive a token that is not a collateral token /// or was forbidden error TokenNotAllowedException(); /// @dev Thrown if an attempt to approve a collateral token to a target contract failed error AllowanceFailedException(); /// @dev Thrown on attempting to perform an action for an address that owns no Credit Account error HasNoOpenedAccountException(); /// @dev Thrown on attempting to add a token that is already in a collateral list error TokenAlreadyAddedException(); /// @dev Thrown on configurator attempting to add more than 256 collateral tokens error TooManyTokensException(); /// @dev Thrown if more than the maximal number of tokens were enabled on a Credit Account, /// and there are not enough unused token to disable error TooManyEnabledTokensException(); /// @dev Thrown when a reentrancy into the contract is attempted error ReentrancyLockException(); } /// @notice All Credit Manager functions are access-restricted and can only be called /// by the Credit Facade or allowed adapters. Users are not allowed to /// interact with the Credit Manager directly interface ICreditManagerV2 is ICreditManagerV2Events, ICreditManagerV2Exceptions, IVersion { // // CREDIT ACCOUNT MANAGEMENT // /// @dev Opens credit account and borrows funds from the pool. /// - Takes Credit Account from the factory; /// - Requests the pool to lend underlying to the Credit Account /// /// @param borrowedAmount Amount to be borrowed by the Credit Account /// @param onBehalfOf The owner of the newly opened Credit Account function openCreditAccount(uint256 borrowedAmount, address onBehalfOf) external returns (address); /// @dev Closes a Credit Account - covers both normal closure and liquidation /// - Checks whether the contract is paused, and, if so, if the payer is an emergency liquidator. /// Only emergency liquidators are able to liquidate account while the CM is paused. /// Emergency liquidations do not pay a liquidator premium or liquidation fees. /// - Calculates payments to various recipients on closure: /// + Computes amountToPool, which is the amount to be sent back to the pool. /// This includes the principal, interest and fees, but can't be more than /// total position value /// + Computes remainingFunds during liquidations - these are leftover funds /// after paying the pool and the liquidator, and are sent to the borrower /// + Computes protocol profit, which includes interest and liquidation fees /// + Computes loss if the totalValue is less than borrow amount + interest /// - Checks the underlying token balance: /// + if it is larger than amountToPool, then the pool is paid fully from funds on the Credit Account /// + else tries to transfer the shortfall from the payer - either the borrower during closure, or liquidator during liquidation /// - Send assets to the "to" address, as long as they are not included into skipTokenMask /// - If convertWETH is true, the function converts WETH into ETH before sending /// - Returns the Credit Account back to factory /// /// @param borrower Borrower address /// @param closureActionType Whether the account is closed, liquidated or liquidated due to expiry /// @param totalValue Portfolio value for liqution, 0 for ordinary closure /// @param payer Address which would be charged if credit account has not enough funds to cover amountToPool /// @param to Address to which the leftover funds will be sent /// @param skipTokenMask Tokenmask contains 1 for tokens which needed to be skipped for sending /// @param convertWETH If true converts WETH to ETH function closeCreditAccount( address borrower, ClosureAction closureActionType, uint256 totalValue, address payer, address to, uint256 skipTokenMask, bool convertWETH ) external returns (uint256 remainingFunds); /// @dev Manages debt size for borrower: /// /// - Increase debt: /// + Increases debt by transferring funds from the pool to the credit account /// + Updates the cumulative index to keep interest the same. Since interest /// is always computed dynamically as borrowedAmount * (cumulativeIndexNew / cumulativeIndexOpen - 1), /// cumulativeIndexOpen needs to be updated, as the borrow amount has changed /// /// - Decrease debt: /// + Repays debt partially + all interest and fees accrued thus far /// + Updates cunulativeIndex to cumulativeIndex now /// /// @param creditAccount Address of the Credit Account to change debt for /// @param amount Amount to increase / decrease the principal by /// @param increase True to increase principal, false to decrease /// @return newBorrowedAmount The new debt principal function manageDebt( address creditAccount, uint256 amount, bool increase ) external returns (uint256 newBorrowedAmount); /// @dev Adds collateral to borrower's credit account /// @param payer Address of the account which will be charged to provide additional collateral /// @param creditAccount Address of the Credit Account /// @param token Collateral token to add /// @param amount Amount to add function addCollateral( address payer, address creditAccount, address token, uint256 amount ) external; /// @dev Transfers Credit Account ownership to another address /// @param from Address of previous owner /// @param to Address of new owner function transferAccountOwnership(address from, address to) external; /// @dev Requests the Credit Account to approve a collateral token to another contract. /// @param borrower Borrower's address /// @param targetContract Spender to change allowance for /// @param token Collateral token to approve /// @param amount New allowance amount function approveCreditAccount( address borrower, address targetContract, address token, uint256 amount ) external; /// @dev Requests a Credit Account to make a low-level call with provided data /// This is the intended pathway for state-changing interactions with 3rd-party protocols /// @param borrower Borrower's address /// @param targetContract Contract to be called /// @param data Data to pass with the call function executeOrder( address borrower, address targetContract, bytes memory data ) external returns (bytes memory); // // COLLATERAL VALIDITY AND ACCOUNT HEALTH CHECKS // /// @dev Enables a token on a Credit Account, including it /// into account health and total value calculations /// @param creditAccount Address of a Credit Account to enable the token for /// @param token Address of the token to be enabled function checkAndEnableToken(address creditAccount, address token) external; /// @dev Optimized health check for individual swap-like operations. /// @notice Fast health check assumes that only two tokens (input and output) /// participate in the operation and computes a % change in weighted value between /// inbound and outbound collateral. The cumulative negative change across several /// swaps in sequence cannot be larger than feeLiquidation (a fee that the /// protocol is ready to waive if needed). Since this records a % change /// between just two tokens, the corresponding % change in TWV will always be smaller, /// which makes this check safe. /// More details at https://dev.gearbox.fi/docs/documentation/risk/fast-collateral-check#fast-check-protection /// @param creditAccount Address of the Credit Account /// @param tokenIn Address of the token spent by the swap /// @param tokenOut Address of the token received from the swap /// @param balanceInBefore Balance of tokenIn before the operation /// @param balanceOutBefore Balance of tokenOut before the operation function fastCollateralCheck( address creditAccount, address tokenIn, address tokenOut, uint256 balanceInBefore, uint256 balanceOutBefore ) external; /// @dev Performs a full health check on an account, summing up /// value of all enabled collateral tokens /// @param creditAccount Address of the Credit Account to check function fullCollateralCheck(address creditAccount) external; /// @dev Checks that the number of enabled tokens on a Credit Account /// does not violate the maximal enabled token limit and tries /// to disable unused tokens if it does /// @param creditAccount Account to check enabled tokens for function checkAndOptimizeEnabledTokens(address creditAccount) external; /// @dev Disables a token on a credit account /// @notice Usually called by adapters to disable spent tokens during a multicall, /// but can also be called separately from the Credit Facade to remove /// unwanted tokens /// @return True if token mask was change otherwise False function disableToken(address creditAccount, address token) external returns (bool); // // GETTERS // /// @dev Returns the address of a borrower's Credit Account, or reverts if there is none. /// @param borrower Borrower's address function getCreditAccountOrRevert(address borrower) external view returns (address); /// @dev Computes amounts that must be sent to various addresses before closing an account /// @param totalValue Credit Accounts total value in underlying /// @param closureActionType Type of account closure /// * CLOSE_ACCOUNT: The account is healthy and is closed normally /// * LIQUIDATE_ACCOUNT: The account is unhealthy and is being liquidated to avoid bad debt /// * LIQUIDATE_EXPIRED_ACCOUNT: The account has expired and is being liquidated (lowered liquidation premium) /// * LIQUIDATE_PAUSED: The account is liquidated while the system is paused due to emergency (no liquidation premium) /// @param borrowedAmount Credit Account's debt principal /// @param borrowedAmountWithInterest Credit Account's debt principal + interest /// @return amountToPool Amount of underlying to be sent to the pool /// @return remainingFunds Amount of underlying to be sent to the borrower (only applicable to liquidations) /// @return profit Protocol's profit from fees (if any) /// @return loss Protocol's loss from bad debt (if any) function calcClosePayments( uint256 totalValue, ClosureAction closureActionType, uint256 borrowedAmount, uint256 borrowedAmountWithInterest ) external view returns ( uint256 amountToPool, uint256 remainingFunds, uint256 profit, uint256 loss ); /// @dev Calculates the debt accrued by a Credit Account /// @param creditAccount Address of the Credit Account /// @return borrowedAmount The debt principal /// @return borrowedAmountWithInterest The debt principal + accrued interest /// @return borrowedAmountWithInterestAndFees The debt principal + accrued interest and protocol fees function calcCreditAccountAccruedInterest(address creditAccount) external view returns ( uint256 borrowedAmount, uint256 borrowedAmountWithInterest, uint256 borrowedAmountWithInterestAndFees ); /// @dev Maps Credit Accounts to bit masks encoding their enabled token sets /// Only enabled tokens are counted as collateral for the Credit Account /// @notice An enabled token mask encodes an enabled token by setting /// the bit at the position equal to token's index to 1 function enabledTokensMap(address creditAccount) external view returns (uint256); /// @dev Maps the Credit Account to its current percentage drop across all swaps since /// the last full check, in RAY format function cumulativeDropAtFastCheckRAY(address creditAccount) external view returns (uint256); /// @dev Returns the collateral token at requested index and its liquidation threshold /// @param id The index of token to return function collateralTokens(uint256 id) external view returns (address token, uint16 liquidationThreshold); /// @dev Returns the collateral token with requested mask and its liquidationThreshold /// @param tokenMask Token mask corresponding to the token function collateralTokensByMask(uint256 tokenMask) external view returns (address token, uint16 liquidationThreshold); /// @dev Total number of known collateral tokens. function collateralTokensCount() external view returns (uint256); /// @dev Returns the mask for the provided token /// @param token Token to returns the mask for function tokenMasksMap(address token) external view returns (uint256); /// @dev Bit mask encoding a set of forbidden tokens function forbiddenTokenMask() external view returns (uint256); /// @dev Maps allowed adapters to their respective target contracts. function adapterToContract(address adapter) external view returns (address); /// @dev Maps 3rd party contracts to their respective adapters function contractToAdapter(address targetContract) external view returns (address); /// @dev Address of the underlying asset function underlying() external view returns (address); /// @dev Address of the connected pool function pool() external view returns (address); /// @dev Address of the connected pool /// @notice [DEPRECATED]: use pool() instead. function poolService() external view returns (address); /// @dev A map from borrower addresses to Credit Account addresses function creditAccounts(address borrower) external view returns (address); /// @dev Address of the connected Credit Configurator function creditConfigurator() external view returns (address); /// @dev Address of WETH function wethAddress() external view returns (address); /// @dev Returns the liquidation threshold for the provided token /// @param token Token to retrieve the LT for function liquidationThresholds(address token) external view returns (uint16); /// @dev The maximal number of enabled tokens on a single Credit Account function maxAllowedEnabledTokenLength() external view returns (uint8); /// @dev Maps addresses to their status as emergency liquidator. /// @notice Emergency liquidators are trusted addresses /// that are able to liquidate positions while the contracts are paused, /// e.g. when there is a risk of bad debt while an exploit is being patched. /// In the interest of fairness, emergency liquidators do not receive a premium /// And are compensated by the Gearbox DAO separately. function canLiquidateWhilePaused(address) external view returns (bool); /// @dev Returns the fee parameters of the Credit Manager /// @return feeInterest Percentage of interest taken by the protocol as profit /// @return feeLiquidation Percentage of account value taken by the protocol as profit /// during unhealthy account liquidations /// @return liquidationDiscount Multiplier that reduces the effective totalValue during unhealthy account liquidations, /// allowing the liquidator to take the unaccounted for remainder as premium. Equal to (1 - liquidationPremium) /// @return feeLiquidationExpired Percentage of account value taken by the protocol as profit /// during expired account liquidations /// @return liquidationDiscountExpired Multiplier that reduces the effective totalValue during expired account liquidations, /// allowing the liquidator to take the unaccounted for remainder as premium. Equal to (1 - liquidationPremiumExpired) function fees() external view returns ( uint16 feeInterest, uint16 feeLiquidation, uint16 liquidationDiscount, uint16 feeLiquidationExpired, uint16 liquidationDiscountExpired ); /// @dev Address of the connected Credit Facade function creditFacade() external view returns (address); /// @dev Address of the connected Price Oracle function priceOracle() external view returns (IPriceOracleV2); /// @dev Address of the universal adapter function universalAdapter() external view returns (address); /// @dev Contract's version function version() external view returns (uint256); /// @dev Paused() state function checkEmergencyPausable(address caller, bool state) external returns (bool); }
// SPDX-License-Identifier: MIT // Gearbox Protocol. Generalized leverage for DeFi protocols // (c) Gearbox Holdings, 2022 pragma solidity ^0.8.10; import { IVersion } from "./IVersion.sol"; interface IPriceOracleV2Events { /// @dev Emits when a new price feed is added event NewPriceFeed(address indexed token, address indexed priceFeed); } interface IPriceOracleV2Exceptions { /// @dev Thrown if a price feed returns 0 error ZeroPriceException(); /// @dev Thrown if the last recorded result was not updated in the last round error ChainPriceStaleException(); /// @dev Thrown on attempting to get a result for a token that does not have a price feed error PriceOracleNotExistsException(); } /// @title Price oracle interface interface IPriceOracleV2 is IPriceOracleV2Events, IPriceOracleV2Exceptions, IVersion { /// @dev Converts a quantity of an asset to USD (decimals = 8). /// @param amount Amount to convert /// @param token Address of the token to be converted function convertToUSD(uint256 amount, address token) external view returns (uint256); /// @dev Converts a quantity of USD (decimals = 8) to an equivalent amount of an asset /// @param amount Amount to convert /// @param token Address of the token converted to function convertFromUSD(uint256 amount, address token) external view returns (uint256); /// @dev Converts one asset into another /// /// @param amount Amount to convert /// @param tokenFrom Address of the token to convert from /// @param tokenTo Address of the token to convert to function convert( uint256 amount, address tokenFrom, address tokenTo ) external view returns (uint256); /// @dev Returns collateral values for two tokens, required for a fast check /// @param amountFrom Amount of the outbound token /// @param tokenFrom Address of the outbound token /// @param amountTo Amount of the inbound token /// @param tokenTo Address of the inbound token /// @return collateralFrom Value of the outbound token amount in USD /// @return collateralTo Value of the inbound token amount in USD function fastCheck( uint256 amountFrom, address tokenFrom, uint256 amountTo, address tokenTo ) external view returns (uint256 collateralFrom, uint256 collateralTo); /// @dev Returns token's price in USD (8 decimals) /// @param token The token to compute the price for function getPrice(address token) external view returns (uint256); /// @dev Returns the price feed address for the passed token /// @param token Token to get the price feed for function priceFeeds(address token) external view returns (address priceFeed); /// @dev Returns the price feed for the passed token, /// with additional parameters /// @param token Token to get the price feed for function priceFeedsWithFlags(address token) external view returns ( address priceFeed, bool skipCheck, uint256 decimals ); } interface IPriceOracleV2Ext is IPriceOracleV2 { /// @dev Sets a price feed if it doesn't exist, or updates an existing one /// @param token Address of the token to set the price feed for /// @param priceFeed Address of a USD price feed adhering to Chainlink's interface function addPriceFeed(address token, address priceFeed) external; }
// SPDX-License-Identifier: MIT // Gearbox Protocol. Generalized leverage for DeFi protocols // (c) Gearbox Holdings, 2022 pragma solidity ^0.8.10; /// @title IVersion /// @dev Declares a version function which returns the contract's version interface IVersion { /// @dev Returns contract version function version() external view returns (uint256); }
{ "optimizer": { "enabled": true, "runs": 1000000 }, "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":"_creditManager","type":"address"},{"internalType":"address","name":"_yVault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"TokenIsNotInAllowedList","type":"error"},{"inputs":[],"name":"ZeroAddressException","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_gearboxAdapterType","outputs":[{"internalType":"enum AdapterType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_gearboxAdapterVersion","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creditFacade","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creditManager","outputs":[{"internalType":"contract ICreditManagerV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxShares","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxShares","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxShares","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"maxLoss","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101006040523480156200001257600080fd5b506040516200233d3803806200233d8339810160408190526200003591620002cd565b81816001600160a01b03821615806200005557506001600160a01b038116155b156200007457604051635919af9760e11b815260040160405180910390fd5b6001600160a01b038216608081905260408051632f7a188160e01b81529051632f7a1881916004808201926020929091908290030181865afa158015620000bf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000e5919062000305565b6001600160a01b0390811660a0521660c0819052600160005560408051637e062a3560e11b8152905191925063fc0c546a9160048083019260209291908290030181865afa1580156200013c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000162919062000305565b6001600160a01b0390811660e0819052608051604051630f67c5bd60e41b815260048101929092529091169063f67c5bd090602401602060405180830381865afa158015620001b5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001db91906200032a565b6200020d5760e051604051634c607af960e11b81526001600160a01b0390911660048201526024015b60405180910390fd5b608051604051630f67c5bd60e41b81526001600160a01b0383811660048301529091169063f67c5bd090602401602060405180830381865afa15801562000258573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027e91906200032a565b620002a857604051634c607af960e11b81526001600160a01b038216600482015260240162000204565b505062000344565b80516001600160a01b0381168114620002c857600080fd5b919050565b60008060408385031215620002e157600080fd5b620002ec83620002b0565b9150620002fc60208401620002b0565b90509250929050565b6000602082840312156200031857600080fd5b6200032382620002b0565b9392505050565b6000602082840312156200033d57600080fd5b5051919050565b60805160a05160c05160e051611ee6620004576000396000818161038c01528181610f7301528181611224015281816112f701526114220152600081816102fb015281816104f6015281816105ae0152818161077d0152818161097901528181610b8501528181610bfc01528181610c6901528181611048015281816112030152818161131801528181611400015281816116c401526117c3015260008181610229015281816114dc015261187201526000818161032201528181610457015281816106df015281816108ae01528181610aaf01528181610d7601528181610ea80152818161116001528181611695015281816117fa015281816118fa015281816119ae0152611a6a0152611ee66000f3fe608060405234801561001057600080fd5b506004361061018c5760003560e01c806378aa73a4116100e3578063c12c21c01161008c578063dd62ed3e11610066578063dd62ed3e14610361578063e63697c814610374578063fc0c546a1461038757600080fd5b8063c12c21c01461031d578063ce30bbdb14610344578063d0e30db01461035957600080fd5b8063a9059cbb116100bd578063a9059cbb146101cc578063b6b55f25146102e3578063bd90df70146102f657600080fd5b806378aa73a4146102b857806395d89b41146102d357806399530b06146102db57600080fd5b80632e1a7d4d116101455780633ccfd60b1161011f5780633ccfd60b1461028a5780636e553f651461029257806370a08231146102a557600080fd5b80632e1a7d4d146102115780632f7a188114610224578063313ce5671461027057600080fd5b8063095ea7b311610176578063095ea7b3146101cc57806318160ddd146101f257806323b872dd146101fa57600080fd5b8062f714ce1461019157806306fdde03146101b7575b600080fd5b6101a461019f366004611af3565b6103ae565b6040519081526020015b60405180910390f35b6101bf6104f2565b6040516101ae9190611b9d565b6101e26101da366004611bb0565b600092915050565b60405190151581526020016101ae565b6101a46105aa565b6101e2610208366004611bdc565b60009392505050565b6101a461021f366004611c1d565b61063b565b61024b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ae565b610278610779565b60405160ff90911681526020016101ae565b6101a461080a565b6101a46102a0366004611af3565b610a0b565b6101a46102b3366004611c36565b610b3d565b6102c0600281565b60405161ffff90911681526020016101ae565b6101bf610bf8565b6101a4610c65565b6101a46102f1366004611c1d565b610cd2565b61024b7f000000000000000000000000000000000000000000000000000000000000000081565b61024b7f000000000000000000000000000000000000000000000000000000000000000081565b61034c600481565b6040516101ae9190611c53565b6101a4610e04565b6101a461036f366004611c94565b610ff8565b6101a4610382366004611cc2565b6110bc565b61024b7f000000000000000000000000000000000000000000000000000000000000000081565b600060026000541415610422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b600260009081556040517fe958b7040000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e958b70490602401602060405180830381865afa1580156104b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d79190611ce9565b90506104e5818560006111fb565b6001600055949350505050565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa15801561055f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105a59190810190611dc7565b905090565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610617573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a59190611e10565b6000600260005414156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610419565b600260009081556040517fe958b7040000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e958b70490602401602060405180830381865afa15801561073b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075f9190611ce9565b905061076d818460006111fb565b60016000559392505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107e6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a59190611e29565b600060026000541415610879576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610419565b600260009081556040517fe958b7040000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e958b70490602401602060405180830381865afa15801561090a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092e9190611ce9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192506000917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156109c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e49190611e10565b90506001811115610a01576109fe826001830360016111fb565b92505b5050600160005590565b600060026000541415610a7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610419565b600260009081556040517fe958b7040000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e958b70490602401602060405180830381865afa158015610b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2f9190611ce9565b90506104e5818560006112ef565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf29190611e10565b92915050565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801561055f573d6000803e3d6000fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166399530b066040518163ffffffff1660e01b8152600401602060405180830381865afa158015610617573d6000803e3d6000fd5b600060026000541415610d41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610419565b600260009081556040517fe958b7040000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e958b70490602401602060405180830381865afa158015610dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df69190611ce9565b905061076d818460006112ef565b600060026000541415610e73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610419565b600260009081556040517fe958b7040000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e958b70490602401602060405180830381865afa158015610f04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f289190611ce9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192506000917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610fba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fde9190611e10565b90506001811115610a01576109fe826001830360016112ef565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063dd62ed3e90604401602060405180830381865afa158015611091573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b59190611e10565b9392505050565b60006002600054141561112b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610419565b600260009081556040517fe958b7040000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e958b70490602401602060405180830381865afa1580156111bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e09190611ce9565b90506111ed8186856113c8565b600160005595945050505050565b60006112d4847f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008660405160240161125691815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f2e1a7d4d000000000000000000000000000000000000000000000000000000001790526000876114bf565b8060200190518101906112e79190611e10565b949350505050565b60006112d4847f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008660405160240161134a91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb6b55f25000000000000000000000000000000000000000000000000000000001790526001876114bf565b6040516024810183905273ffffffffffffffffffffffffffffffffffffffff84166044820152606481018290526000906112d49085907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090608401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe63697c8000000000000000000000000000000000000000000000000000000001790526000805b60606000803373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611628576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301528916906370a0823190602401602060405180830381865afa15801561156d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115919190611e10565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152919350908816906370a0823190602401602060405180830381865afa158015611601573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116259190611e10565b90505b841561165857611658887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611780565b6040517f6ce4074a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636ce4074a906116ee9033907f0000000000000000000000000000000000000000000000000000000000000000908b90600401611e4c565b6000604051808303816000875af115801561170d573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526117539190810190611dc7565b9250841561176657611766886001611780565b61177489898985858961185a565b50509695505050505050565b6040517f46fb371d00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660248301528381166044830152606482018390527f000000000000000000000000000000000000000000000000000000000000000016906346fb371d90608401600060405180830381600087803b15801561183e57600080fd5b505af1158015611852573d6000803e3d6000fd5b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461195b576040517f654a9eda00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528681166024830152858116604483015260648201859052608482018490527f0000000000000000000000000000000000000000000000000000000000000000169063654a9eda9060a401600060405180830381600087803b15801561193e57600080fd5b505af1158015611952573d6000803e3d6000fd5b50505050611852565b8015611a1d576040517f0d8f9cee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015286811660248301527f00000000000000000000000000000000000000000000000000000000000000001690630d8f9cee906044016020604051808303816000875af11580156119f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1b9190611e8e565b505b6040517f51e3f16000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015285811660248301527f000000000000000000000000000000000000000000000000000000000000000016906351e3f16090604401600060405180830381600087803b158015611aae57600080fd5b505af1158015611ac2573d6000803e3d6000fd5b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611af057600080fd5b50565b60008060408385031215611b0657600080fd5b823591506020830135611b1881611ace565b809150509250929050565b60005b83811015611b3e578181015183820152602001611b26565b83811115611b4d576000848401525b50505050565b60008151808452611b6b816020860160208601611b23565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006110b56020830184611b53565b60008060408385031215611bc357600080fd5b8235611bce81611ace565b946020939093013593505050565b600080600060608486031215611bf157600080fd5b8335611bfc81611ace565b92506020840135611c0c81611ace565b929592945050506040919091013590565b600060208284031215611c2f57600080fd5b5035919050565b600060208284031215611c4857600080fd5b81356110b581611ace565b6020810160108310611c8e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060408385031215611ca757600080fd5b8235611cb281611ace565b91506020830135611b1881611ace565b600080600060608486031215611cd757600080fd5b833592506020840135611c0c81611ace565b600060208284031215611cfb57600080fd5b81516110b581611ace565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611d5057611d50611d06565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611d9657611d96611d06565b81604052809350858152868686011115611daf57600080fd5b611dbd866020830187611b23565b5050509392505050565b600060208284031215611dd957600080fd5b815167ffffffffffffffff811115611df057600080fd5b8201601f81018413611e0157600080fd5b6112e784825160208401611d35565b600060208284031215611e2257600080fd5b5051919050565b600060208284031215611e3b57600080fd5b815160ff811681146110b557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808616835280851660208401525060606040830152611e856060830184611b53565b95945050505050565b600060208284031215611ea057600080fd5b815180151581146110b557600080fdfea2646970667358221220d3e637cce3a174bdbae8060a2fce58e9253d408e8800f72d44f5524b2cfe8a4e64736f6c634300080a0033000000000000000000000000672461bfc20dd783444a830ad4c38b345ab6e2f7000000000000000000000000da816459f1ab5631232fe5e97a05bbbb94970c95
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
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.