Feature Tip: Add private address tag to any address under My Name Tag !
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
YearnTokenAdapter
Compiler Version
v0.8.11+commit.d7f03943
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity ^0.8.11;
import {IllegalState} from "../../base/Errors.sol";
import "../../interfaces/ITokenAdapter.sol";
import "../../interfaces/external/yearn/IYearnVaultV2.sol";
import "../../libraries/TokenUtils.sol";
/// @title YearnTokenAdapter
/// @author Alchemix Finance
contract YearnTokenAdapter is ITokenAdapter {
uint256 private constant MAXIMUM_SLIPPAGE = 10000;
string public constant override version = "2.1.0";
address public immutable override token;
address public immutable override underlyingToken;
constructor(address _token, address _underlyingToken) {
token = _token;
underlyingToken = _underlyingToken;
}
/// @inheritdoc ITokenAdapter
function price() external view override returns (uint256) {
return IYearnVaultV2(token).pricePerShare();
}
/// @inheritdoc ITokenAdapter
function wrap(uint256 amount, address recipient) external override returns (uint256) {
TokenUtils.safeTransferFrom(underlyingToken, msg.sender, address(this), amount);
TokenUtils.safeApprove(underlyingToken, token, amount);
return IYearnVaultV2(token).deposit(amount, recipient);
}
/// @inheritdoc ITokenAdapter
function unwrap(uint256 amount, address recipient) external override returns (uint256) {
TokenUtils.safeTransferFrom(token, msg.sender, address(this), amount);
uint256 balanceBefore = TokenUtils.safeBalanceOf(token, address(this));
uint256 amountWithdrawn = IYearnVaultV2(token).withdraw(amount, recipient, MAXIMUM_SLIPPAGE);
uint256 balanceAfter = TokenUtils.safeBalanceOf(token, address(this));
// If the Yearn vault did not burn all of the shares then revert. This is critical in mathematical operations
// performed by the system because the system always expects that all of the tokens were unwrapped. In Yearn,
// this sometimes does not happen in cases where strategies cannot withdraw all of the requested tokens (an
// example strategy where this can occur is with Compound and AAVE where funds may not be accessible because
// they were lent out).
if (balanceBefore - balanceAfter != amount) {
revert IllegalState();
}
return amountWithdrawn;
}
}pragma solidity ^0.8.11; /// @notice An error used to indicate that an action could not be completed because either the `msg.sender` or /// `msg.origin` is not authorized. error Unauthorized(); /// @notice An error used to indicate that an action could not be completed because the contract either already existed /// or entered an illegal condition which is not recoverable from. error IllegalState(); /// @notice An error used to indicate that an action could not be completed because of an illegal argument was passed /// to the function. error IllegalArgument();
pragma solidity >=0.5.0;
/// @title ITokenAdapter
/// @author Alchemix Finance
interface ITokenAdapter {
/// @notice Gets the current version.
///
/// @return The version.
function version() external view returns (string memory);
/// @notice Gets the address of the yield token that this adapter supports.
///
/// @return The address of the yield token.
function token() external view returns (address);
/// @notice Gets the address of the underlying token that the yield token wraps.
///
/// @return The address of the underlying token.
function underlyingToken() external view returns (address);
/// @notice Gets the number of underlying tokens that a single whole yield token is redeemable for.
///
/// @return The price.
function price() external view returns (uint256);
/// @notice Wraps `amount` underlying tokens into the yield token.
///
/// @param amount The amount of the underlying token to wrap.
/// @param recipient The address which will receive the yield tokens.
///
/// @return amountYieldTokens The amount of yield tokens minted to `recipient`.
function wrap(uint256 amount, address recipient)
external
returns (uint256 amountYieldTokens);
/// @notice Unwraps `amount` yield tokens into the underlying token.
///
/// @param amount The amount of yield-tokens to redeem.
/// @param recipient The recipient of the resulting underlying-tokens.
///
/// @return amountUnderlyingTokens The amount of underlying tokens unwrapped to `recipient`.
function unwrap(uint256 amount, address recipient)
external
returns (uint256 amountUnderlyingTokens);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
import "../../IERC20Minimal.sol";
import "../../IERC20Metadata.sol";
/// @title IYearnVaultV2
/// @author Yearn Finance
interface IYearnVaultV2 is IERC20Minimal, IERC20Metadata {
struct StrategyParams {
uint256 performanceFee;
uint256 activation;
uint256 debtRatio;
uint256 minDebtPerHarvest;
uint256 maxDebtPerHarvest;
uint256 lastReport;
uint256 totalDebt;
uint256 totalGain;
uint256 totalLoss;
bool enforceChangeLimit;
uint256 profitLimitRatio;
uint256 lossLimitRatio;
address customCheck;
}
function apiVersion() external pure returns (string memory);
function permit(
address owner,
address spender,
uint256 amount,
uint256 expiry,
bytes calldata signature
) external returns (bool);
// NOTE: Vyper produces multiple signatures for a given function with "default" args
function deposit() external returns (uint256);
function deposit(uint256 amount) external returns (uint256);
function deposit(uint256 amount, address recipient) external returns (uint256);
// NOTE: Vyper produces multiple signatures for a given function with "default" args
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 token() external view returns (address);
function strategies(address _strategy) external view returns (StrategyParams memory);
function pricePerShare() external view returns (uint256);
function totalAssets() external view returns (uint256);
function depositLimit() external view returns (uint256);
function maxAvailableShares() external view returns (uint256);
/// @notice View how much the Vault would increase this Strategy's borrow limit, based on its present performance
/// (since its last report). Can be used to determine expectedReturn in your Strategy.
function creditAvailable() external view returns (uint256);
/// @notice View how much the Vault would like to pull back from the Strategy, based on its present performance
/// (since its last report). Can be used to determine expectedReturn in your Strategy.
function debtOutstanding() external view returns (uint256);
/// @notice View how much the Vault expect this Strategy to return at the current block, based on its present
/// performance (since its last report). Can be used to determine expectedReturn in your Strategy.
function expectedReturn() external view returns (uint256);
/// @notice This is the main contact point where the Strategy interacts with the Vault. It is critical that this call
/// is handled as intended by the Strategy. Therefore, this function will be called by BaseStrategy to make
/// sure the integration is correct.
function report(
uint256 _gain,
uint256 _loss,
uint256 _debtPayment
) external returns (uint256);
/// @notice This function should only be used in the scenario where the Strategy is being retired but no migration of
/// the positions are possible, or in the extreme scenario that the Strategy needs to be put into
/// "Emergency Exit" mode in order for it to exit as quickly as possible. The latter scenario could be for any
/// reason that is considered "critical" that the Strategy exits its position as fast as possible, such as a
/// sudden change in market conditions leading to losses, or an imminent failure in an external dependency.
function revokeStrategy() external;
/// @notice View the governance address of the Vault to assert privileged functions can only be called by governance.
/// The Strategy serves the Vault, so it is subject to governance defined by the Vault.
function governance() external view returns (address);
/// @notice View the management address of the Vault to assert privileged functions can only be called by management.
/// The Strategy serves the Vault, so it is subject to management defined by the Vault.
function management() external view returns (address);
/// @notice View the guardian address of the Vault to assert privileged functions can only be called by guardian. The
/// Strategy serves the Vault, so it is subject to guardian defined by the Vault.
function guardian() external view returns (address);
}pragma solidity ^0.8.11;
import "../interfaces/IERC20Burnable.sol";
import "../interfaces/IERC20Metadata.sol";
import "../interfaces/IERC20Minimal.sol";
import "../interfaces/IERC20Mintable.sol";
/// @title TokenUtils
/// @author Alchemix Finance
library TokenUtils {
/// @notice An error used to indicate that a call to an ERC20 contract failed.
///
/// @param target The target address.
/// @param success If the call to the token was a success.
/// @param data The resulting data from the call. This is error data when the call was not a success. Otherwise,
/// this is malformed data when the call was a success.
error ERC20CallFailed(address target, bool success, bytes data);
/// @dev A safe function to get the decimals of an ERC20 token.
///
/// @dev Reverts with a {CallFailed} error if execution of the query fails or returns an unexpected value.
///
/// @param token The target token.
///
/// @return The amount of decimals of the token.
function expectDecimals(address token) internal view returns (uint8) {
(bool success, bytes memory data) = token.staticcall(
abi.encodeWithSelector(IERC20Metadata.decimals.selector)
);
if (!success || data.length < 32) {
revert ERC20CallFailed(token, success, data);
}
return abi.decode(data, (uint8));
}
/// @dev Gets the balance of tokens held by an account.
///
/// @dev Reverts with a {CallFailed} error if execution of the query fails or returns an unexpected value.
///
/// @param token The token to check the balance of.
/// @param account The address of the token holder.
///
/// @return The balance of the tokens held by an account.
function safeBalanceOf(address token, address account) internal view returns (uint256) {
(bool success, bytes memory data) = token.staticcall(
abi.encodeWithSelector(IERC20Minimal.balanceOf.selector, account)
);
if (!success || data.length < 32) {
revert ERC20CallFailed(token, success, data);
}
return abi.decode(data, (uint256));
}
/// @dev Transfers tokens to another address.
///
/// @dev Reverts with a {CallFailed} error if execution of the transfer failed or returns an unexpected value.
///
/// @param token The token to transfer.
/// @param recipient The address of the recipient.
/// @param amount The amount of tokens to transfer.
function safeTransfer(address token, address recipient, uint256 amount) internal {
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(IERC20Minimal.transfer.selector, recipient, amount)
);
if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
revert ERC20CallFailed(token, success, data);
}
}
/// @dev Approves tokens for the smart contract.
///
/// @dev Reverts with a {CallFailed} error if execution of the approval fails or returns an unexpected value.
///
/// @param token The token to approve.
/// @param spender The contract to spend the tokens.
/// @param value The amount of tokens to approve.
function safeApprove(address token, address spender, uint256 value) internal {
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(IERC20Minimal.approve.selector, spender, value)
);
if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
revert ERC20CallFailed(token, success, data);
}
}
/// @dev Transfer tokens from one address to another address.
///
/// @dev Reverts with a {CallFailed} error if execution of the transfer fails or returns an unexpected value.
///
/// @param token The token to transfer.
/// @param owner The address of the owner.
/// @param recipient The address of the recipient.
/// @param amount The amount of tokens to transfer.
function safeTransferFrom(address token, address owner, address recipient, uint256 amount) internal {
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(IERC20Minimal.transferFrom.selector, owner, recipient, amount)
);
if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
revert ERC20CallFailed(token, success, data);
}
}
/// @dev Mints tokens to an address.
///
/// @dev Reverts with a {CallFailed} error if execution of the mint fails or returns an unexpected value.
///
/// @param token The token to mint.
/// @param recipient The address of the recipient.
/// @param amount The amount of tokens to mint.
function safeMint(address token, address recipient, uint256 amount) internal {
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(IERC20Mintable.mint.selector, recipient, amount)
);
if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
revert ERC20CallFailed(token, success, data);
}
}
/// @dev Burns tokens.
///
/// Reverts with a `CallFailed` error if execution of the burn fails or returns an unexpected value.
///
/// @param token The token to burn.
/// @param amount The amount of tokens to burn.
function safeBurn(address token, uint256 amount) internal {
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(IERC20Burnable.burn.selector, amount)
);
if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
revert ERC20CallFailed(token, success, data);
}
}
/// @dev Burns tokens from its total supply.
///
/// @dev Reverts with a {CallFailed} error if execution of the burn fails or returns an unexpected value.
///
/// @param token The token to burn.
/// @param owner The owner of the tokens.
/// @param amount The amount of tokens to burn.
function safeBurnFrom(address token, address owner, uint256 amount) internal {
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(IERC20Burnable.burnFrom.selector, owner, amount)
);
if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
revert ERC20CallFailed(token, success, data);
}
}
}pragma solidity >=0.5.0;
/// @title IERC20Minimal
/// @author Alchemix Finance
interface IERC20Minimal {
/// @notice An event which is emitted when tokens are transferred between two parties.
///
/// @param owner The owner of the tokens from which the tokens were transferred.
/// @param recipient The recipient of the tokens to which the tokens were transferred.
/// @param amount The amount of tokens which were transferred.
event Transfer(address indexed owner, address indexed recipient, uint256 amount);
/// @notice An event which is emitted when an approval is made.
///
/// @param owner The address which made the approval.
/// @param spender The address which is allowed to transfer tokens on behalf of `owner`.
/// @param amount The amount of tokens that `spender` is allowed to transfer.
event Approval(address indexed owner, address indexed spender, uint256 amount);
/// @notice Gets the current total supply of tokens.
///
/// @return The total supply.
function totalSupply() external view returns (uint256);
/// @notice Gets the balance of tokens that an account holds.
///
/// @param account The account address.
///
/// @return The balance of the account.
function balanceOf(address account) external view returns (uint256);
/// @notice Gets the allowance that an owner has allotted for a spender.
///
/// @param owner The owner address.
/// @param spender The spender address.
///
/// @return The number of tokens that `spender` is allowed to transfer on behalf of `owner`.
function allowance(address owner, address spender) external view returns (uint256);
/// @notice Transfers `amount` tokens from `msg.sender` to `recipient`.
///
/// @notice Emits a {Transfer} event.
///
/// @param recipient The address which will receive the tokens.
/// @param amount The amount of tokens to transfer.
///
/// @return If the transfer was successful.
function transfer(address recipient, uint256 amount) external returns (bool);
/// @notice Approves `spender` to transfer `amount` tokens on behalf of `msg.sender`.
///
/// @notice Emits a {Approval} event.
///
/// @param spender The address which is allowed to transfer tokens on behalf of `msg.sender`.
/// @param amount The amount of tokens that `spender` is allowed to transfer.
///
/// @return If the approval was successful.
function approve(address spender, uint256 amount) external returns (bool);
/// @notice Transfers `amount` tokens from `owner` to `recipient` using an approval that `owner` gave to `msg.sender`.
///
/// @notice Emits a {Approval} event.
/// @notice Emits a {Transfer} event.
///
/// @param owner The address to transfer tokens from.
/// @param recipient The address that will receive the tokens.
/// @param amount The amount of tokens to transfer.
///
/// @return If the transfer was successful.
function transferFrom(address owner, address recipient, uint256 amount) external returns (bool);
}pragma solidity >=0.5.0;
/// @title IERC20Metadata
/// @author Alchemix Finance
interface IERC20Metadata {
/// @notice Gets the name of the token.
///
/// @return The name.
function name() external view returns (string memory);
/// @notice Gets the symbol of the token.
///
/// @return The symbol.
function symbol() external view returns (string memory);
/// @notice Gets the number of decimals that the token has.
///
/// @return The number of decimals.
function decimals() external view returns (uint8);
}pragma solidity >=0.5.0;
import "./IERC20Minimal.sol";
/// @title IERC20Burnable
/// @author Alchemix Finance
interface IERC20Burnable is IERC20Minimal {
/// @notice Burns `amount` tokens from the balance of `msg.sender`.
///
/// @param amount The amount of tokens to burn.
///
/// @return If burning the tokens was successful.
function burn(uint256 amount) external returns (bool);
/// @notice Burns `amount` tokens from `owner`'s balance.
///
/// @param owner The address to burn tokens from.
/// @param amount The amount of tokens to burn.
///
/// @return If burning the tokens was successful.
function burnFrom(address owner, uint256 amount) external returns (bool);
}pragma solidity >=0.5.0;
import "./IERC20Minimal.sol";
/// @title IERC20Mintable
/// @author Alchemix Finance
interface IERC20Mintable is IERC20Minimal {
/// @notice Mints `amount` tokens to `recipient`.
///
/// @param recipient The address which will receive the minted tokens.
/// @param amount The amount of tokens to mint.
///
/// @return If minting the tokens was successful.
function mint(address recipient, uint256 amount) external returns (bool);
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_underlyingToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"ERC20CallFailed","type":"error"},{"inputs":[],"name":"IllegalState","type":"error"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"underlyingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"unwrap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"wrap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60c060405234801561001057600080fd5b506040516109a73803806109a783398101604081905261002f91610062565b6001600160a01b039182166080521660a052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516108af6100f860003960008181609201528181610146015261017201526000818161011d01528181610193015281816101de0152818161025901528181610287015281816102e00152818161035601526103b301526108af6000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806313bac820146100675780632495a5991461008d57806354fd4d50146100cc5780637647691d146100fd578063a035b1fe14610110578063fc0c546a14610118575b600080fd5b61007a610075366004610726565b61013f565b6040519081526020015b60405180910390f35b6100b47f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610084565b6100f0604051806040016040528060058152602001640322e312e360dc1b81525081565b60405161008491906107be565b61007a61010b366004610726565b610252565b61007a6103af565b6100b47f000000000000000000000000000000000000000000000000000000000000000081565b600061016d7f0000000000000000000000000000000000000000000000000000000000000000333086610438565b6101b87f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000085610541565b604051636e553f6560e01b8152600481018490526001600160a01b0383811660248301527f00000000000000000000000000000000000000000000000000000000000000001690636e553f65906044016020604051808303816000875af1158015610227573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061024b91906107d1565b9392505050565b60006102807f0000000000000000000000000000000000000000000000000000000000000000333086610438565b60006102ac7f000000000000000000000000000000000000000000000000000000000000000030610638565b604051631cc6d2f960e31b8152600481018690526001600160a01b03858116602483015261271060448301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063e63697c8906064016020604051808303816000875af1158015610329573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061034d91906107d1565b9050600061037b7f000000000000000000000000000000000000000000000000000000000000000030610638565b90508561038882856107ea565b146103a657604051634a613c4160e01b815260040160405180910390fd5b50949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166399530b066040518163ffffffff1660e01b8152600401602060405180830381865afa15801561040f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043391906107d1565b905090565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161049c919061080f565b6000604051808303816000865af19150503d80600081146104d9576040519150601f19603f3d011682016040523d82523d6000602084013e6104de565b606091505b509150915081158061050c575080511580159061050c57508080602001905181019061050a919061082b565b155b156105395785828260405163e7e40b5b60e01b81526004016105309392919061084d565b60405180910390fd5b505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b179052915160009283929087169161059d919061080f565b6000604051808303816000865af19150503d80600081146105da576040519150601f19603f3d011682016040523d82523d6000602084013e6105df565b606091505b509150915081158061060d575080511580159061060d57508080602001905181019061060b919061082b565b155b156106315784828260405163e7e40b5b60e01b81526004016105309392919061084d565b5050505050565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166370a0823160e01b17905291516000928392839291871691610692919061080f565b600060405180830381855afa9150503d80600081146106cd576040519150601f19603f3d011682016040523d82523d6000602084013e6106d2565b606091505b50915091508115806106e5575060208151105b156107095784828260405163e7e40b5b60e01b81526004016105309392919061084d565b8080602001905181019061071d91906107d1565b95945050505050565b6000806040838503121561073957600080fd5b8235915060208301356001600160a01b038116811461075757600080fd5b809150509250929050565b60005b8381101561077d578181015183820152602001610765565b8381111561078c576000848401525b50505050565b600081518084526107aa816020860160208601610762565b601f01601f19169290920160200192915050565b60208152600061024b6020830184610792565b6000602082840312156107e357600080fd5b5051919050565b60008282101561080a57634e487b7160e01b600052601160045260246000fd5b500390565b60008251610821818460208701610762565b9190910192915050565b60006020828403121561083d57600080fd5b8151801515811461024b57600080fd5b6001600160a01b0384168152821515602082015260606040820181905260009061071d9083018461079256fea2646970667358221220506a931c72821e4523a95daa9abe84ebec692231c9b25784e87afd5ad953504864736f6c634300080b0033000000000000000000000000da816459f1ab5631232fe5e97a05bbbb94970c950000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100625760003560e01c806313bac820146100675780632495a5991461008d57806354fd4d50146100cc5780637647691d146100fd578063a035b1fe14610110578063fc0c546a14610118575b600080fd5b61007a610075366004610726565b61013f565b6040519081526020015b60405180910390f35b6100b47f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f81565b6040516001600160a01b039091168152602001610084565b6100f0604051806040016040528060058152602001640322e312e360dc1b81525081565b60405161008491906107be565b61007a61010b366004610726565b610252565b61007a6103af565b6100b47f000000000000000000000000da816459f1ab5631232fe5e97a05bbbb94970c9581565b600061016d7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f333086610438565b6101b87f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f7f000000000000000000000000da816459f1ab5631232fe5e97a05bbbb94970c9585610541565b604051636e553f6560e01b8152600481018490526001600160a01b0383811660248301527f000000000000000000000000da816459f1ab5631232fe5e97a05bbbb94970c951690636e553f65906044016020604051808303816000875af1158015610227573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061024b91906107d1565b9392505050565b60006102807f000000000000000000000000da816459f1ab5631232fe5e97a05bbbb94970c95333086610438565b60006102ac7f000000000000000000000000da816459f1ab5631232fe5e97a05bbbb94970c9530610638565b604051631cc6d2f960e31b8152600481018690526001600160a01b03858116602483015261271060448301529192506000917f000000000000000000000000da816459f1ab5631232fe5e97a05bbbb94970c95169063e63697c8906064016020604051808303816000875af1158015610329573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061034d91906107d1565b9050600061037b7f000000000000000000000000da816459f1ab5631232fe5e97a05bbbb94970c9530610638565b90508561038882856107ea565b146103a657604051634a613c4160e01b815260040160405180910390fd5b50949350505050565b60007f000000000000000000000000da816459f1ab5631232fe5e97a05bbbb94970c956001600160a01b03166399530b066040518163ffffffff1660e01b8152600401602060405180830381865afa15801561040f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043391906107d1565b905090565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161049c919061080f565b6000604051808303816000865af19150503d80600081146104d9576040519150601f19603f3d011682016040523d82523d6000602084013e6104de565b606091505b509150915081158061050c575080511580159061050c57508080602001905181019061050a919061082b565b155b156105395785828260405163e7e40b5b60e01b81526004016105309392919061084d565b60405180910390fd5b505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b179052915160009283929087169161059d919061080f565b6000604051808303816000865af19150503d80600081146105da576040519150601f19603f3d011682016040523d82523d6000602084013e6105df565b606091505b509150915081158061060d575080511580159061060d57508080602001905181019061060b919061082b565b155b156106315784828260405163e7e40b5b60e01b81526004016105309392919061084d565b5050505050565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166370a0823160e01b17905291516000928392839291871691610692919061080f565b600060405180830381855afa9150503d80600081146106cd576040519150601f19603f3d011682016040523d82523d6000602084013e6106d2565b606091505b50915091508115806106e5575060208151105b156107095784828260405163e7e40b5b60e01b81526004016105309392919061084d565b8080602001905181019061071d91906107d1565b95945050505050565b6000806040838503121561073957600080fd5b8235915060208301356001600160a01b038116811461075757600080fd5b809150509250929050565b60005b8381101561077d578181015183820152602001610765565b8381111561078c576000848401525b50505050565b600081518084526107aa816020860160208601610762565b601f01601f19169290920160200192915050565b60208152600061024b6020830184610792565b6000602082840312156107e357600080fd5b5051919050565b60008282101561080a57634e487b7160e01b600052601160045260246000fd5b500390565b60008251610821818460208701610762565b9190910192915050565b60006020828403121561083d57600080fd5b8151801515811461024b57600080fd5b6001600160a01b0384168152821515602082015260606040820181905260009061071d9083018461079256fea2646970667358221220506a931c72821e4523a95daa9abe84ebec692231c9b25784e87afd5ad953504864736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000da816459f1ab5631232fe5e97a05bbbb94970c950000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
-----Decoded View---------------
Arg [0] : _token (address): 0xdA816459F1AB5631232FE5e97a05BBBb94970c95
Arg [1] : _underlyingToken (address): 0x6B175474E89094C44Da98b954EedeAC495271d0F
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000da816459f1ab5631232fe5e97a05bbbb94970c95
Arg [1] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.