Latest 9 from a total of 9 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Withdraw Fee | 19791125 | 527 days ago | IN | 0 ETH | 0.00039784 | ||||
Set Withdraw Fee | 18472779 | 712 days ago | IN | 0 ETH | 0.00194764 | ||||
Withdraw | 18472775 | 712 days ago | IN | 0 ETH | 0.00212358 | ||||
Withdraw | 18472770 | 712 days ago | IN | 0 ETH | 0.00279442 | ||||
Set Withdraw Fee | 18472748 | 712 days ago | IN | 0 ETH | 0.00148984 | ||||
Set Bridge Conne... | 18272738 | 740 days ago | IN | 0 ETH | 0.00053843 | ||||
Withdraw | 18251805 | 743 days ago | IN | 0 ETH | 0.00062611 | ||||
Withdraw | 17814113 | 804 days ago | IN | 0 ETH | 0.0026944 | ||||
Set Fee Collecto... | 17481370 | 851 days ago | IN | 0 ETH | 0.00065315 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
0x3d602d80 | 17181929 | 893 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Minimal Proxy Contract for 0x3e88c9b0e3be6817973a6e629211e702d12c577f
Contract Name:
SmartVault
Compiler Version
v0.8.3+commit.8d00100c
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; import '@openzeppelin/contracts/utils/Address.sol'; import '@openzeppelin/contracts/utils/math/Math.sol'; import '@mimic-fi/v2-bridge-connector/contracts/IBridgeConnector.sol'; import '@mimic-fi/v2-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v2-helpers/contracts/math/UncheckedMath.sol'; import '@mimic-fi/v2-helpers/contracts/utils/Denominations.sol'; import '@mimic-fi/v2-helpers/contracts/utils/IWrappedNativeToken.sol'; import '@mimic-fi/v2-price-oracle/contracts/oracle/IPriceOracle.sol'; import '@mimic-fi/v2-price-oracle/contracts/feeds/PriceFeedProvider.sol'; import '@mimic-fi/v2-strategies/contracts/IStrategy.sol'; import '@mimic-fi/v2-swap-connector/contracts/ISwapConnector.sol'; import '@mimic-fi/v2-registry/contracts/implementations/InitializableAuthorizedImplementation.sol'; import './ISmartVault.sol'; import './helpers/StrategyLib.sol'; import './helpers/SwapConnectorLib.sol'; import './helpers/BridgeConnectorLib.sol'; /** * @title Smart Vault * @dev Smart Vault contract where funds are being held offering a bunch of primitives to allow users model any * type of action to manage them, these are: collector, withdraw, swap, bridge, join, exit, bridge, wrap, and unwrap. * * It inherits from InitializableAuthorizedImplementation which means it's implementation can be cloned * from the Mimic Registry and should be initialized depending on each case. */ contract SmartVault is ISmartVault, PriceFeedProvider, InitializableAuthorizedImplementation { using SafeERC20 for IERC20; using FixedPoint for uint256; using UncheckedMath for uint256; using StrategyLib for address; using SwapConnectorLib for address; using BridgeConnectorLib for address; // Namespace under which the Smart Vault is registered in the Mimic Registry bytes32 public constant override NAMESPACE = keccak256('SMART_VAULT'); /** * @dev Fee configuration parameters * @param pct Percentage expressed using 16 decimals (1e18 = 100%) * @param cap Maximum amount of fees to be charged per period * @param token Address of the token to express the cap amount * @param period Period length in seconds * @param totalCharged Total amount of fees charged in the current period * @param nextResetTime Current cap period end date */ struct Fee { uint256 pct; uint256 cap; address token; uint256 period; uint256 totalCharged; uint256 nextResetTime; } // Price oracle reference address public override priceOracle; // Swap connector reference address public override swapConnector; // Bridge connector reference address public override bridgeConnector; // List of allowed strategies indexed by strategy address mapping (address => bool) public override isStrategyAllowed; // List of invested values indexed by strategy address mapping (address => uint256) public override investedValue; // Fee collector address where fees will be deposited address public override feeCollector; // Withdraw fee configuration Fee public override withdrawFee; // Performance fee configuration Fee public override performanceFee; // Swap fee configuration Fee public override swapFee; // Bridge fee configuration Fee public override bridgeFee; // Wrapped native token reference address public immutable override wrappedNativeToken; /** * @dev Creates a new Smart Vault implementation with references that should be shared among all implementations * @param _wrappedNativeToken Address of the wrapped native token to be used * @param _registry Address of the Mimic Registry to be referenced */ constructor(address _wrappedNativeToken, address _registry) InitializableAuthorizedImplementation(_registry) { wrappedNativeToken = _wrappedNativeToken; } /** * @dev Initializes the Smart Vault instance * @param admin Address that will be granted with admin rights */ function initialize(address admin) external initializer { _initialize(admin); } /** * @dev It allows receiving native token transfers */ receive() external payable { // solhint-disable-previous-line no-empty-blocks } /** * @dev Sets a new strategy as allowed or not for a Smart Vault. Sender must be authorized. * @param strategy Address of the strategy to be set * @param allowed Whether the strategy is allowed or not */ function setStrategy(address strategy, bool allowed) external override auth { _setStrategy(strategy, allowed); } /** * @dev Sets a new price oracle to a Smart Vault. Sender must be authorized. * @param newPriceOracle Address of the new price oracle to be set */ function setPriceOracle(address newPriceOracle) external override auth { _setPriceOracle(newPriceOracle); } /** * @dev Sets a new swap connector to a Smart Vault. Sender must be authorized. * @param newSwapConnector Address of the new swap connector to be set */ function setSwapConnector(address newSwapConnector) external override auth { _setSwapConnector(newSwapConnector); } /** * @dev Sets a new bridge connector to a Smart Vault. Sender must be authorized. * @param newBridgeConnector Address of the new bridge connector to be set */ function setBridgeConnector(address newBridgeConnector) external override auth { _setBridgeConnector(newBridgeConnector); } /** * @dev Sets a new fee collector. Sender must be authorized. * @param newFeeCollector Address of the new fee collector to be set */ function setFeeCollector(address newFeeCollector) external override auth { _setFeeCollector(newFeeCollector); } /** * @dev Sets a new withdraw fee. Sender must be authorized. * @param pct Withdraw fee percentage to be set * @param cap New maximum amount of withdraw fees to be charged per period * @param token Address of the token cap to be set * @param period New cap period length in seconds for the withdraw fee */ function setWithdrawFee(uint256 pct, uint256 cap, address token, uint256 period) external override auth { _setFeeConfiguration(withdrawFee, pct, cap, token, period); emit WithdrawFeeSet(pct, cap, token, period); } /** * @dev Sets a new performance fee. Sender must be authorized. * @param pct Performance fee percentage to be set * @param cap New maximum amount of performance fees to be charged per period * @param token Address of the token cap to be set * @param period New cap period length in seconds for the performance fee */ function setPerformanceFee(uint256 pct, uint256 cap, address token, uint256 period) external override auth { _setFeeConfiguration(performanceFee, pct, cap, token, period); emit PerformanceFeeSet(pct, cap, token, period); } /** * @dev Sets a new swap fee. Sender must be authorized. * @param pct New swap fee percentage to be set * @param cap New maximum amount of swap fees to be charged per period * @param token Address of the token cap to be set * @param period New cap period length in seconds for the swap fee */ function setSwapFee(uint256 pct, uint256 cap, address token, uint256 period) external override auth { _setFeeConfiguration(swapFee, pct, cap, token, period); emit SwapFeeSet(pct, cap, token, period); } /** * @dev Sets a new bridge fee. Sender must be authorized. * @param pct New bridge fee percentage to be set * @param cap New maximum amount of bridge fees to be charged per period * @param token Address of the token cap to be set * @param period New cap period length in seconds for the bridge fee */ function setBridgeFee(uint256 pct, uint256 cap, address token, uint256 period) external override auth { _setFeeConfiguration(bridgeFee, pct, cap, token, period); emit BridgeFeeSet(pct, cap, token, period); } /** * @dev Sets a of price feed * @param base Token base to be set * @param quote Token quote to be set * @param feed Price feed to be set */ function setPriceFeed(address base, address quote, address feed) public override(IPriceFeedProvider, PriceFeedProvider) auth { super.setPriceFeed(base, quote, feed); } /** * @dev Tells the price of a token (base) in a given quote * @param base Token to rate * @param quote Token used for the price rate */ function getPrice(address base, address quote) public view override returns (uint256) { return IPriceOracle(priceOracle).getPrice(address(this), base, quote); } /** * @dev Tells the last value accrued for a strategy. Note this value can be outdated. * @param strategy Address of the strategy querying the last value of */ function lastValue(address strategy) public view override returns (uint256) { return IStrategy(strategy).lastValue(address(this)); } /** * @dev Execute an arbitrary call from a Smart Vault. Sender must be authorized. * @param target Address where the call will be sent * @param data Calldata to be used for the call * @param value Value in wei that will be attached to the call * @return result Call response if it was successful, otherwise it reverts */ function call(address target, bytes memory callData, uint256 value, bytes memory data) external override auth returns (bytes memory result) { result = Address.functionCallWithValue(target, callData, value, 'SMART_VAULT_ARBITRARY_CALL_FAIL'); emit Call(target, callData, value, result, data); } /** * @dev Collect tokens from an external account to a Smart Vault. Sender must be authorized. * @param token Address of the token to be collected * @param from Address where the tokens will be transfer from * @param amount Amount of tokens to be transferred * @param data Extra data only logged * @return collected Amount of tokens collected */ function collect(address token, address from, uint256 amount, bytes memory data) external override auth returns (uint256 collected) { require(amount > 0, 'COLLECT_AMOUNT_ZERO'); uint256 previousBalance = IERC20(token).balanceOf(address(this)); IERC20(token).safeTransferFrom(from, address(this), amount); uint256 currentBalance = IERC20(token).balanceOf(address(this)); collected = currentBalance - previousBalance; emit Collect(token, from, collected, data); } /** * @dev Withdraw tokens to an external account. Sender must be authorized. * @param token Address of the token to be withdrawn * @param amount Amount of tokens to withdraw * @param recipient Address where the tokens will be transferred to * @param data Extra data only logged * @return withdrawn Amount of tokens transferred to the recipient address */ function withdraw(address token, uint256 amount, address recipient, bytes memory data) external override auth returns (uint256 withdrawn) { require(amount > 0, 'WITHDRAW_AMOUNT_ZERO'); require(recipient != address(0), 'RECIPIENT_ZERO'); uint256 withdrawFeeAmount = recipient == feeCollector ? 0 : _payFee(token, amount, withdrawFee); withdrawn = amount - withdrawFeeAmount; _safeTransfer(token, recipient, withdrawn); emit Withdraw(token, recipient, withdrawn, withdrawFeeAmount, data); } /** * @dev Wrap an amount of native tokens to the wrapped ERC20 version of it. Sender must be authorized. * @param amount Amount of native tokens to be wrapped * @param data Extra data only logged * @return wrapped Amount of tokens wrapped */ function wrap(uint256 amount, bytes memory data) external override auth returns (uint256 wrapped) { require(amount > 0, 'WRAP_AMOUNT_ZERO'); require(address(this).balance >= amount, 'WRAP_INSUFFICIENT_AMOUNT'); IWrappedNativeToken wrappedToken = IWrappedNativeToken(wrappedNativeToken); uint256 previousBalance = wrappedToken.balanceOf(address(this)); wrappedToken.deposit{ value: amount }(); uint256 currentBalance = wrappedToken.balanceOf(address(this)); wrapped = currentBalance - previousBalance; emit Wrap(amount, wrapped, data); } /** * @dev Unwrap an amount of wrapped native tokens. Sender must be authorized. * @param amount Amount of wrapped native tokens to unwrapped * @param data Extra data only logged * @return unwrapped Amount of tokens unwrapped */ function unwrap(uint256 amount, bytes memory data) external override auth returns (uint256 unwrapped) { require(amount > 0, 'UNWRAP_AMOUNT_ZERO'); uint256 previousBalance = address(this).balance; IWrappedNativeToken(wrappedNativeToken).withdraw(amount); uint256 currentBalance = address(this).balance; unwrapped = currentBalance - previousBalance; emit Unwrap(amount, unwrapped, data); } /** * @dev Claim strategy rewards. Sender must be authorized. * @param strategy Address of the strategy to claim rewards * @param data Extra data passed to the strategy and logged * @return tokens Addresses of the tokens received as rewards * @return amounts Amounts of the tokens received as rewards */ function claim(address strategy, bytes memory data) external override auth returns (address[] memory tokens, uint256[] memory amounts) { require(isStrategyAllowed[strategy], 'STRATEGY_NOT_ALLOWED'); (tokens, amounts) = strategy.claim(data); emit Claim(strategy, tokens, amounts, data); } /** * @dev Join a strategy with an amount of tokens. Sender must be authorized. * @param strategy Address of the strategy to join * @param tokensIn List of token addresses to join with * @param amountsIn List of token amounts to join with * @param slippage Slippage that will be used to compute the join * @param data Extra data passed to the strategy and logged * @return tokensOut List of token addresses received after the join * @return amountsOut List of token amounts received after the join */ function join( address strategy, address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data ) external override auth returns (address[] memory tokensOut, uint256[] memory amountsOut) { require(isStrategyAllowed[strategy], 'STRATEGY_NOT_ALLOWED'); require(slippage <= FixedPoint.ONE, 'JOIN_SLIPPAGE_ABOVE_ONE'); require(tokensIn.length == amountsIn.length, 'JOIN_INPUT_INVALID_LENGTH'); uint256 value; (tokensOut, amountsOut, value) = strategy.join(tokensIn, amountsIn, slippage, data); require(tokensOut.length == amountsOut.length, 'JOIN_OUTPUT_INVALID_LENGTH'); investedValue[strategy] = investedValue[strategy] + value; emit Join(strategy, tokensIn, amountsIn, tokensOut, amountsOut, value, slippage, data); } /** * @dev Exit a strategy. Sender must be authorized. * @param strategy Address of the strategy to exit * @param tokensIn List of token addresses to exit with * @param amountsIn List of token amounts to exit with * @param slippage Slippage that will be used to compute the exit * @param data Extra data passed to the strategy and logged * @return tokensOut List of token addresses received after the exit * @return amountsOut List of token amounts received after the exit */ function exit( address strategy, address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data ) external override auth returns (address[] memory tokensOut, uint256[] memory amountsOut) { require(isStrategyAllowed[strategy], 'STRATEGY_NOT_ALLOWED'); require(investedValue[strategy] > 0, 'EXIT_NO_INVESTED_VALUE'); require(slippage <= FixedPoint.ONE, 'EXIT_SLIPPAGE_ABOVE_ONE'); require(tokensIn.length == amountsIn.length, 'EXIT_INPUT_INVALID_LENGTH'); uint256 value; (tokensOut, amountsOut, value) = strategy.exit(tokensIn, amountsIn, slippage, data); require(tokensOut.length == amountsOut.length, 'EXIT_OUTPUT_INVALID_LENGTH'); uint256[] memory performanceFeeAmounts = new uint256[](amountsOut.length); // It can rely on the last updated value since we have just exited, no need to compute current value uint256 valueBeforeExit = lastValue(strategy) + value; if (valueBeforeExit <= investedValue[strategy]) { // There were losses, invested value is simply reduced using the exited ratio compared to the value // before exit. Invested value is round up to avoid interpreting losses due to rounding errors investedValue[strategy] -= investedValue[strategy].mulUp(value).divUp(valueBeforeExit); } else { // If value gains are greater than the exit value, it means only gains are being withdrawn. In that case // the taxable amount is the entire exited amount, otherwise it should be the equivalent gains ratio of it. uint256 valueGains = valueBeforeExit.uncheckedSub(investedValue[strategy]); bool onlyGains = valueGains >= value; // If the exit value is greater than the value gains, the invested value should be reduced by the portion // of the invested value being exited. Otherwise, it's still the same, only gains are being withdrawn. // No need for checked math as we are checking it manually beforehand uint256 decrement = onlyGains ? 0 : value.uncheckedSub(valueGains); investedValue[strategy] = investedValue[strategy] - decrement; // Compute performance fees per token out for (uint256 i = 0; i < tokensOut.length; i = i.uncheckedAdd(1)) { address token = tokensOut[i]; uint256 amount = amountsOut[i]; uint256 taxableAmount = onlyGains ? amount : ((amount * valueGains) / value); uint256 feeAmount = _payFee(token, taxableAmount, performanceFee); amountsOut[i] = amount - feeAmount; performanceFeeAmounts[i] = feeAmount; } } emit Exit(strategy, tokensIn, amountsIn, tokensOut, amountsOut, value, performanceFeeAmounts, slippage, data); } /** * @dev Swaps two tokens. Sender must be authorized. * @param source Source to request the swap: Uniswap V2, Uniswap V3, Balancer V2, or Paraswap V5. * @param tokenIn Token being sent * @param tokenOut Token being received * @param amountIn Amount of tokenIn being swapped * @param limitType Swap limit to be applied: slippage or min amount out * @param limitAmount Amount of the swap limit to be applied depending on limitType * @param data Encoded data to specify different swap parameters depending on the source picked * @return amountOut Received amount of tokens out */ function swap( uint8 source, address tokenIn, address tokenOut, uint256 amountIn, SwapLimit limitType, uint256 limitAmount, bytes memory data ) external override auth returns (uint256 amountOut) { require(tokenIn != tokenOut, 'SWAP_SAME_TOKEN'); require(swapConnector != address(0), 'SWAP_CONNECTOR_NOT_SET'); uint256 minAmountOut; if (limitType == SwapLimit.MinAmountOut) { minAmountOut = limitAmount; } else if (limitType == SwapLimit.Slippage) { require(limitAmount <= FixedPoint.ONE, 'SWAP_SLIPPAGE_ABOVE_ONE'); uint256 price = getPrice(tokenIn, tokenOut); // No need for checked math as we are checking it manually beforehand // Always round up the expected min amount out. Limit amount is slippage. minAmountOut = amountIn.mulUp(price).mulUp(FixedPoint.ONE.uncheckedSub(limitAmount)); } else { revert('SWAP_INVALID_LIMIT_TYPE'); } uint256 preBalanceIn = IERC20(tokenIn).balanceOf(address(this)); uint256 preBalanceOut = IERC20(tokenOut).balanceOf(address(this)); swapConnector.swap(source, tokenIn, tokenOut, amountIn, minAmountOut, data); uint256 postBalanceIn = IERC20(tokenIn).balanceOf(address(this)); require(postBalanceIn >= preBalanceIn - amountIn, 'SWAP_BAD_TOKEN_IN_BALANCE'); uint256 amountOutBeforeFees = IERC20(tokenOut).balanceOf(address(this)) - preBalanceOut; require(amountOutBeforeFees >= minAmountOut, 'SWAP_MIN_AMOUNT'); uint256 swapFeeAmount = _payFee(tokenOut, amountOutBeforeFees, swapFee); amountOut = amountOutBeforeFees - swapFeeAmount; emit Swap(source, tokenIn, tokenOut, amountIn, amountOut, minAmountOut, swapFeeAmount, data); } /** * @dev Bridge assets to another chain * @param source Source to request the bridge. It depends on the Bridge Connector attached to a Smart Vault. * @param chainId ID of the destination chain * @param token Address of the token to be bridged * @param amount Amount of tokens to be bridged * @param limitType Bridge limit to be applied: slippage or min amount out * @param limitAmount Amount of the swap limit to be applied depending on limitType * @param recipient Address that will receive the tokens on the destination chain * @param data Encoded data to specify different bridge parameters depending on the source picked * @return bridged Amount requested to be bridged after fees */ function bridge( uint8 source, uint256 chainId, address token, uint256 amount, BridgeLimit limitType, uint256 limitAmount, address recipient, bytes memory data ) external override auth returns (uint256 bridged) { require(block.chainid != chainId, 'BRIDGE_SAME_CHAIN'); require(recipient != address(0), 'BRIDGE_RECIPIENT_ZERO'); require(bridgeConnector != address(0), 'BRIDGE_CONNECTOR_NOT_SET'); uint256 bridgeFeeAmount = _payFee(token, amount, bridgeFee); bridged = amount - bridgeFeeAmount; uint256 minAmountOut; if (limitType == BridgeLimit.MinAmountOut) { minAmountOut = limitAmount; } else if (limitType == BridgeLimit.Slippage) { require(limitAmount <= FixedPoint.ONE, 'BRIDGE_SLIPPAGE_ABOVE_ONE'); // No need for checked math as we are checking it manually beforehand // Always round up the expected min amount out. Limit amount is slippage. minAmountOut = bridged.mulUp(FixedPoint.ONE.uncheckedSub(limitAmount)); } else { revert('BRIDGE_INVALID_LIMIT_TYPE'); } uint256 preBalanceIn = IERC20(token).balanceOf(address(this)); bridgeConnector.bridge(source, chainId, token, bridged, minAmountOut, recipient, data); uint256 postBalanceIn = IERC20(token).balanceOf(address(this)); require(postBalanceIn >= preBalanceIn - bridged, 'BRIDGE_BAD_TOKEN_IN_BALANCE'); emit Bridge(source, chainId, token, bridged, minAmountOut, bridgeFeeAmount, recipient, data); } /** * @dev Internal function to pay the amount of fees to be charged based on a fee configuration to the fee collector * @param token Token being charged * @param amount Token amount to be taxed with fees * @param fee Fee configuration to be applied * @return paidAmount Amount of fees paid to the fee collector */ function _payFee(address token, uint256 amount, Fee storage fee) internal returns (uint256 paidAmount) { // Fee amounts are always rounded down uint256 feeAmount = amount.mulDown(fee.pct); // If cap amount or cap period are not set, charge the entire amount if (fee.token == address(0) || fee.cap == 0 || fee.period == 0) { _safeTransfer(token, feeCollector, feeAmount); return feeAmount; } // Reset cap totalizator if necessary if (block.timestamp >= fee.nextResetTime) { fee.totalCharged = 0; fee.nextResetTime = block.timestamp + fee.period; } // Calc fee amount in the fee token used for the cap uint256 feeTokenPrice = getPrice(token, fee.token); uint256 feeAmountInFeeToken = feeAmount.mulDown(feeTokenPrice); // Compute fee amount picking the minimum between the chargeable amount and the remaining part for the cap if (fee.totalCharged + feeAmountInFeeToken <= fee.cap) { paidAmount = feeAmount; fee.totalCharged += feeAmountInFeeToken; } else if (fee.totalCharged < fee.cap) { paidAmount = (fee.cap.uncheckedSub(fee.totalCharged) * feeAmount) / feeAmountInFeeToken; fee.totalCharged = fee.cap; } else { // This case is when the total charged amount is already greater than the cap amount. It could happen if // the cap amounts is decreased or if the cap token is changed. In this case the total charged amount is // not updated, and the amount to paid is zero. paidAmount = 0; } // Pay fee amount to the fee collector _safeTransfer(token, feeCollector, paidAmount); } /** * @dev Internal method to transfer ERC20 or native tokens from a Smart Vault * @param token Address of the ERC20 token to transfer * @param to Address transferring the tokens to * @param amount Amount of tokens to transfer */ function _safeTransfer(address token, address to, uint256 amount) internal { if (amount == 0) return; if (Denominations.isNativeToken(token)) Address.sendValue(payable(to), amount); else IERC20(token).safeTransfer(to, amount); } /** * @dev Sets a new strategy as allowed or not * @param strategy Address of the strategy to be set * @param allowed Whether the strategy is allowed or not */ function _setStrategy(address strategy, bool allowed) internal { if (allowed) _validateStatelessDependency(strategy); isStrategyAllowed[strategy] = allowed; emit StrategySet(strategy, allowed); } /** * @dev Sets a new price oracle * @param newPriceOracle New price oracle to be set */ function _setPriceOracle(address newPriceOracle) internal { _validateStatelessDependency(newPriceOracle); priceOracle = newPriceOracle; emit PriceOracleSet(newPriceOracle); } /** * @dev Sets a new swap connector * @param newSwapConnector New swap connector to be set */ function _setSwapConnector(address newSwapConnector) internal { _validateStatelessDependency(newSwapConnector); swapConnector = newSwapConnector; emit SwapConnectorSet(newSwapConnector); } /** * @dev Sets a new bridge connector * @param newBridgeConnector New bridge connector to be set */ function _setBridgeConnector(address newBridgeConnector) internal { _validateStatelessDependency(newBridgeConnector); bridgeConnector = newBridgeConnector; emit BridgeConnectorSet(newBridgeConnector); } /** * @dev Internal method to set the fee collector * @param newFeeCollector New fee collector to be set */ function _setFeeCollector(address newFeeCollector) internal { require(newFeeCollector != address(0), 'FEE_COLLECTOR_ZERO'); feeCollector = newFeeCollector; emit FeeCollectorSet(newFeeCollector); } /** * @dev Internal method to set a new fee cap configuration * @param fee Fee configuration to be updated * @param pct Fee percentage to be set * @param cap New maximum amount of fees to be charged per period * @param token Address of the token cap to be set * @param period New cap period length in seconds */ function _setFeeConfiguration(Fee storage fee, uint256 pct, uint256 cap, address token, uint256 period) internal { require(pct <= FixedPoint.ONE, 'FEE_PCT_ABOVE_ONE'); // If there is no fee percentage, there must not be a fee cap bool isZeroCap = token == address(0) && cap == 0 && period == 0; require(pct != 0 || isZeroCap, 'INVALID_CAP_WITH_FEE_ZERO'); // If there is a cap, all values must be non-zero bool isNonZeroCap = token != address(0) && cap != 0 && period != 0; require(isZeroCap || isNonZeroCap, 'INCONSISTENT_CAP_VALUES'); // Changing the fee percentage does not affect the totalizator at all, it only affects future fee charges fee.pct = pct; // Changing the fee cap amount does not affect the totalizator, it only applies when changing the for the total // charged amount. Note that it can happen that the cap amount is lower than the total charged amount if the // cap amount is lowered. However, there shouldn't be any accounting issues with that. fee.cap = cap; // Changing the cap period only affects the end time of the next period, but not the end date of the current one fee.period = period; // Therefore, only clean the totalizators if the cap is being removed if (isZeroCap) { fee.totalCharged = 0; fee.nextResetTime = 0; } else { // If cap values are not zero, set the next reset time if it wasn't set already // Otherwise, if the cap token is being changed the total charged amount must be updated accordingly if (fee.nextResetTime == 0) { fee.nextResetTime = block.timestamp + period; } else if (fee.token != token) { uint256 newTokenPrice = getPrice(fee.token, token); fee.totalCharged = fee.totalCharged.mulDown(newTokenPrice); } } // Finally simply set the new requested token fee.token = token; } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; import '@mimic-fi/v2-registry/contracts/implementations/IImplementation.sol'; /** * @title IBridgeConnector * @dev Bridge Connector interface to bridge tokens between different chains. It must follow IImplementation interface. */ interface IBridgeConnector is IImplementation { /** * @dev Enum identifying the sources proposed: Hop only for now. */ enum Source { Hop } /** * @dev Bridge assets to a different chain * @param source Source to execute the requested bridge op * @param chainId ID of the destination chain * @param token Address of the token to be bridged * @param amountIn Amount of tokens to be bridged * @param minAmountOut Minimum amount of tokens willing to receive on the destination chain * @param recipient Address that will receive the tokens on the destination chain * @param data ABI encoded data that will depend on the requested source */ function bridge( uint8 source, uint256 chainId, address token, uint256 amountIn, uint256 minAmountOut, address recipient, bytes memory data ) external; }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import './IAuthorizer.sol'; /** * @title Authorizer * @dev Authorization module to be used by contracts that need to implement permissions for their methods. * It provides a permissions model to list who is allowed to call what function in a contract. And only accounts * authorized to manage those permissions are the ones that are allowed to authorize or unauthorize accounts. */ contract Authorizer is IAuthorizer { // Constant used to denote that a permission is open to anyone address public constant ANY_ADDRESS = address(0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF); // Internal mapping to tell who is allowed to do what indexed by (account, function selector) mapping (address => mapping (bytes4 => bool)) private authorized; /** * @dev Modifier that should be used to tag protected functions */ modifier auth() { _authenticate(msg.sender, msg.sig); _; } /** * @dev Tells whether someone is allowed to call a function or not. It returns true if it's allowed to anyone. * @param who Address asking permission for * @param what Function selector asking permission for */ function isAuthorized(address who, bytes4 what) public view override returns (bool) { return authorized[ANY_ADDRESS][what] || authorized[who][what]; } /** * @dev Authorizes someone to call a function. Sender must be authorize to do so. * @param who Address to be authorized * @param what Function selector to be granted */ function authorize(address who, bytes4 what) external override auth { _authorize(who, what); } /** * @dev Unauthorizes someone to call a function. Sender must be authorize to do so. * @param who Address to be unauthorized * @param what Function selector to be revoked */ function unauthorize(address who, bytes4 what) external override auth { _unauthorize(who, what); } /** * @dev Internal function to authenticate someone over a function. * It reverts if the given account is not authorized to call the requested function. * @param who Address to be authenticated * @param what Function selector to be authenticated */ function _authenticate(address who, bytes4 what) internal view { require(isAuthorized(who, what), 'AUTH_SENDER_NOT_ALLOWED'); } /** * @dev Internal function to authorize someone to call a function * @param who Address to be authorized * @param what Function selector to be granted */ function _authorize(address who, bytes4 what) internal { authorized[who][what] = true; emit Authorized(who, what); } /** * @dev Internal function to unauthorize someone to call a function * @param who Address to be unauthorized * @param what Function selector to be revoked */ function _unauthorize(address who, bytes4 what) internal { authorized[who][what] = false; emit Unauthorized(who, what); } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; /** * @title IAuthorizer */ interface IAuthorizer { /** * @dev Emitted when an account is authorized to call a function */ event Authorized(address indexed who, bytes4 what); /** * @dev Emitted when an account is unauthorized to call a function */ event Unauthorized(address indexed who, bytes4 what); /** * @dev Authorizes someone to call a function. Sender must be authorize to do so. * @param who Address to be authorized * @param what Function selector to be granted */ function authorize(address who, bytes4 what) external; /** * @dev Unauthorizes someone to call a function. Sender must be authorize to do so. * @param who Address to be unauthorized * @param what Function selector to be revoked */ function unauthorize(address who, bytes4 what) external; /** * @dev Tells whether someone is allowed to call a function or not. It returns true if it's allowed to anyone. * @param who Address asking permission for * @param what Function selector asking permission for */ function isAuthorized(address who, bytes4 what) external view returns (bool); }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; /** * @title FixedPoint * @dev Math library to operate with fixed point values with 18 decimals */ library FixedPoint { // 1 in fixed point value: 18 decimal places uint256 internal constant ONE = 1e18; /** * @dev Multiplies two fixed point numbers rounding down */ function mulDown(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { uint256 product = a * b; require(a == 0 || product / a == b, 'MUL_OVERFLOW'); return product / ONE; } } /** * @dev Multiplies two fixed point numbers rounding up */ function mulUp(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { uint256 product = a * b; require(a == 0 || product / a == b, 'MUL_OVERFLOW'); return product == 0 ? 0 : (((product - 1) / ONE) + 1); } } /** * @dev Divides two fixed point numbers rounding down */ function divDown(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { require(b != 0, 'ZERO_DIVISION'); if (a == 0) return 0; uint256 aInflated = a * ONE; require(aInflated / a == ONE, 'DIV_INTERNAL'); return aInflated / b; } } /** * @dev Divides two fixed point numbers rounding up */ function divUp(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { require(b != 0, 'ZERO_DIVISION'); if (a == 0) return 0; uint256 aInflated = a * ONE; require(aInflated / a == ONE, 'DIV_INTERNAL'); return ((aInflated - 1) / b) + 1; } } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; /** * @title UncheckedMath * @dev Math library to perform unchecked operations */ library UncheckedMath { /** * @dev Unsafely adds two unsigned integers */ function uncheckedAdd(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { return a + b; } } /** * @dev Unsafely subtracts two unsigned integers */ function uncheckedSub(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { return a - b; } } /** * @dev Unsafely multiplies two unsigned integers */ function uncheckedMul(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { return a * b; } } /** * @dev Unsafely multiplies two signed integers */ function uncheckedMul(int256 a, int256 b) internal pure returns (int256) { unchecked { return a * b; } } /** * @dev Unsafely divides two unsigned integers */ function uncheckedDiv(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { return a / b; } } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; /** * @title Denominations * @dev Provides a list of ground denominations for those tokens that cannot be represented by an ERC20. * For now, the only needed is the native token that could be ETH, MATIC, or other depending on the layer being operated. */ library Denominations { address internal constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; function isNativeToken(address token) internal pure returns (bool) { return token == NATIVE_TOKEN; } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; /** * @title IWrappedNativeToken */ interface IWrappedNativeToken is IERC20 { /** * @dev Wraps msg.value into the wrapped-native token */ function deposit() external payable; /** * @dev Unwraps requested amount to the native token */ function withdraw(uint256 amount) external; }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; /** * @title IPriceFeedProvider * @dev Contract providing price feed references for (base, quote) token pairs */ interface IPriceFeedProvider { /** * @dev Emitted every time a price feed is set for (base, quote) pair */ event PriceFeedSet(address indexed base, address indexed quote, address feed); /** * @dev Tells the price feed address for (base, quote) pair. It returns the zero address if there is no one set. * @param base Token to be rated * @param quote Token used for the price rate */ function getPriceFeed(address base, address quote) external view returns (address); /** * @dev Sets a of price feed * @param base Token base to be set * @param quote Token quote to be set * @param feed Price feed to be set */ function setPriceFeed(address base, address quote, address feed) external; /** * @dev Sets a list of price feeds * @param bases List of token bases to be set * @param quotes List of token quotes to be set * @param feeds List of price feeds to be set */ function setPriceFeeds(address[] memory bases, address[] memory quotes, address[] memory feeds) external; }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@mimic-fi/v2-helpers/contracts/math/UncheckedMath.sol'; import './IPriceFeedProvider.sol'; /** * @title IPriceFeedProvider * @dev Contract providing price feed references for (base, quote) token pairs */ contract PriceFeedProvider is IPriceFeedProvider { using UncheckedMath for uint256; // Mapping of price feeds from "token A" to "token B" mapping (address => mapping (address => address)) private _priceFeeds; /** * @dev Tells the price feed address for (base, quote) pair. It returns the zero address if there is no one set. * @param base Token to be rated * @param quote Token used for the price rate */ function getPriceFeed(address base, address quote) external view override returns (address) { return _priceFeeds[base][quote]; } /** * @dev Sets a of price feed * @param base Token base to be set * @param quote Token quote to be set * @param feed Price feed to be set */ function setPriceFeed(address base, address quote, address feed) public virtual override { _priceFeeds[base][quote] = feed; emit PriceFeedSet(base, quote, feed); } /** * @dev Sets a list of price feeds. Sender must be authorized. * @param bases List of token bases to be set * @param quotes List of token quotes to be set * @param feeds List of price feeds to be set */ function setPriceFeeds(address[] memory bases, address[] memory quotes, address[] memory feeds) public virtual override { require(bases.length == quotes.length, 'SET_FEEDS_INVALID_QUOTES_LENGTH'); require(bases.length == feeds.length, 'SET_FEEDS_INVALID_FEEDS_LENGTH'); for (uint256 i = 0; i < bases.length; i = i.uncheckedAdd(1)) setPriceFeed(bases[i], quotes[i], feeds[i]); } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; import '@mimic-fi/v2-registry/contracts/implementations/IImplementation.sol'; /** * @title IPriceOracle * @dev Oracle that interfaces with external feeds to provide quotes for tokens based on any other token. * It must support also `IImplementation`. */ interface IPriceOracle is IImplementation { /** * @dev Tells the price of a token (base) in a given quote. The response is expressed using the corresponding * number of decimals so that when performing a fixed point product of it by a `base` amount it results in * a value expressed in `quote` decimals. For example, if `base` is ETH and `quote` is USDC, then the returned * value is expected to be expressed using 6 decimals: * * FixedPoint.mul(X[ETH], price[USDC/ETH]) = FixedPoint.mul(X[18], price[6]) = X * price [6] * * @param provider Contract providing the price feeds to use by the oracle * @param base Token to rate * @param quote Token used for the price rate */ function getPrice(address provider, address base, address quote) external view returns (uint256); }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@openzeppelin/contracts/proxy/utils/Initializable.sol'; import './IImplementation.sol'; import '../registry/IRegistry.sol'; /** * @title BaseImplementation * @dev This implementation contract comes with an immutable reference to an implementations registry where it should * be registered as well (checked during initialization). It allows requesting new instances of other registered * implementations to as another safety check to make sure valid instances are referenced in case it's needed. */ abstract contract BaseImplementation is IImplementation { // Immutable implementations registry reference address public immutable override registry; /** * @dev Creates a new BaseImplementation * @param _registry Address of the Mimic Registry where dependencies will be validated against */ constructor(address _registry) { registry = _registry; } /** * @dev Internal function to validate a new dependency that must be registered as stateless. * It checks the new dependency is registered, not deprecated, and stateless. * @param dependency New stateless dependency to be set */ function _validateStatelessDependency(address dependency) internal view { require(_validateDependency(dependency), 'DEPENDENCY_NOT_STATELESS'); } /** * @dev Internal function to validate a new dependency that cannot be registered as stateless. * It checks the new dependency is registered, not deprecated, and not stateful. * @param dependency New stateful dependency to be set */ function _validateStatefulDependency(address dependency) internal view { require(!_validateDependency(dependency), 'DEPENDENCY_NOT_STATEFUL'); } /** * @dev Internal function to validate a new dependency. It checks the dependency is registered and not deprecated. * @param dependency New dependency to be set * @return Whether the dependency is stateless or not */ function _validateDependency(address dependency) private view returns (bool) { (bool stateless, bool deprecated, bytes32 namespace) = IRegistry(registry).implementationData(dependency); require(namespace != bytes32(0), 'DEPENDENCY_NOT_REGISTERED'); require(!deprecated, 'DEPENDENCY_DEPRECATED'); return stateless; } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; // solhint-disable func-name-mixedcase /** * @title IImplementation * @dev Implementation interface that must be followed for implementations to be registered in the Mimic Registry */ interface IImplementation { /** * @dev Tells the namespace under which the implementation is registered in the Mimic Registry */ function NAMESPACE() external view returns (bytes32); /** * @dev Tells the address of the Mimic Registry */ function registry() external view returns (address); }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@mimic-fi/v2-helpers/contracts/auth/Authorizer.sol'; import './InitializableImplementation.sol'; /** * @title InitializableAuthorizedImplementation * @dev InitializableImplementation using the Authorizer mixin. Initializable implementations that want to use the * Authorizer permissions mechanism should inherit from this contract instead. */ abstract contract InitializableAuthorizedImplementation is InitializableImplementation, Authorizer { /** * @dev Creates a new InitializableAuthorizedImplementation * @param registry Address of the Mimic Registry */ constructor(address registry) InitializableImplementation(registry) { // solhint-disable-previous-line no-empty-blocks } /** * @dev Initialization function that authorizes an admin account to authorize and unauthorize accounts. * Note this function can only be called from a function marked with the `initializer` modifier. * @param admin Address to be granted authorize and unauthorize permissions */ function _initialize(address admin) internal onlyInitializing { _initialize(); _authorize(admin, Authorizer.authorize.selector); _authorize(admin, Authorizer.unauthorize.selector); } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@openzeppelin/contracts/proxy/utils/Initializable.sol'; import './BaseImplementation.sol'; /** * @title InitializableImplementation * @dev Implementation contract to be used through proxies. Inheriting contracts are meant to be initialized through * initialization functions instead of constructor functions. It allows re-using the same logic contract while making * deployments cheaper. */ abstract contract InitializableImplementation is BaseImplementation, Initializable { /** * @dev Creates a new BaseImplementation. Note that initializers are disabled at creation time. */ constructor(address registry) BaseImplementation(registry) { _disableInitializers(); } /** * @dev Initialization function. * Note this function can only be called from a function marked with the `initializer` modifier. */ function _initialize() internal view onlyInitializing { // solhint-disable-previous-line no-empty-blocks } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; import '@mimic-fi/v2-helpers/contracts/auth/IAuthorizer.sol'; /** * @title IRegistry * @dev Registry interface, it must follow the IAuthorizer interface. */ interface IRegistry is IAuthorizer { /** * @dev Emitted every time a new implementation is registered */ event Registered(bytes32 indexed namespace, address indexed implementation, bool stateless); /** * @dev Emitted every time an implementation is deprecated */ event Deprecated(bytes32 indexed namespace, address indexed implementation); /** * @dev Tells the data of an implementation: * @param implementation Address of the implementation to request it's data */ function implementationData(address implementation) external view returns (bool stateless, bool deprecated, bytes32 namespace); /** * @dev Tells if a specific implementation is registered under a certain namespace and it's not deprecated * @param namespace Namespace asking for * @param implementation Address of the implementation to be checked */ function isActive(bytes32 namespace, address implementation) external view returns (bool); /** * @dev Registers a new implementation for a given namespace * @param namespace Namespace to be used for the implementation * @param implementation Address of the implementation to be registered * @param stateless Whether the implementation is stateless or not */ function register(bytes32 namespace, address implementation, bool stateless) external; /** * @dev Deprecates a registered implementation * @param implementation Address of the implementation to be deprecated */ function deprecate(address implementation) external; }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@mimic-fi/v2-registry/contracts/implementations/IImplementation.sol'; /** * @title IStrategy * @dev Strategy interface required by Mimic Smart Vaults. It must follow the IImplementation interface. */ interface IStrategy is IImplementation { /** * @dev Tokens accepted to join the strategy */ function joinTokens() external view returns (address[] memory); /** * @dev Tokens accepted to exit the strategy */ function exitTokens() external view returns (address[] memory); /** * @dev Tells how much a value unit means expressed in the asset token. * For example, if a strategy has a value of 100 in T0, and then it has a value of 120 in T1, * and the value rate is 1.5, it means the strategy has earned 30 strategy tokens between T0 and T1. */ function valueRate() external view returns (uint256); /** * @dev Tells the last value an account has over time. Note this value can be outdated: there could be rewards to * be claimed that will affect the accrued value. For example, if an account has a value of 100 in T0, and then it * has a value of 120 in T1, it means it gained a 20% between T0 and T1. * @param account Address of the account querying the last value of */ function lastValue(address account) external view returns (uint256); /** * @dev Claim any existing rewards * @param data Arbitrary extra data * @return tokens Addresses of the tokens received as rewards * @return amounts Amounts of the tokens received as rewards */ function claim(bytes memory data) external returns (address[] memory tokens, uint256[] memory amounts); /** * @dev Join the interfaced DeFi protocol * @param tokensIn List of token addresses to join with * @param amountsIn List of token amounts to join with * @param slippage Slippage value to join with * @param data Arbitrary extra data * @return tokensOut List of token addresses received after the join * @return amountsOut List of token amounts received after the join * @return value Value represented by the joined amount */ function join(address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data) external returns (address[] memory tokensOut, uint256[] memory amountsOut, uint256 value); /** * @dev Exit the interfaced DeFi protocol * @param tokensIn List of token addresses to exit with * @param amountsIn List of token amounts to exit with * @param slippage Slippage value to exit with * @param data Arbitrary extra data * @return tokensOut List of token addresses received after the exit * @return amountsOut List of token amounts received after the exit * @return value Value represented by the exited amount */ function exit(address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data) external returns (address[] memory tokensOut, uint256[] memory amountsOut, uint256 value); }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; import '@mimic-fi/v2-registry/contracts/implementations/IImplementation.sol'; /** * @title ISwapConnector * @dev Swap Connector interface to perform token swaps. It must follow the IImplementation interface. */ interface ISwapConnector is IImplementation { /** * @dev Enum identifying the sources proposed: Uniswap V2, Uniswap V3, Balancer V2, Paraswap V5, 1inch V5, and Hop. */ enum Source { UniswapV2, UniswapV3, BalancerV2, ParaswapV5, OneInchV5, Hop } /** * @dev Swaps two tokens * @param source Source to execute the requested swap * @param tokenIn Token being sent * @param tokenOut Token being received * @param amountIn Amount of tokenIn being swapped * @param minAmountOut Minimum amount of tokenOut willing to receive * @param data Encoded data to specify different swap parameters depending on the source picked */ function swap( uint8 source, address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, bytes memory data ) external returns (uint256 amountOut); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/Clones.sol) pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for * deploying minimal proxy contracts, also known as "clones". * * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies * > a minimal bytecode implementation that delegates all calls to a known, fixed address. * * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2` * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the * deterministic method. * * _Available since v3.4._ */ library Clones { /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function clone(address implementation) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create(0, ptr, 0x37) } require(instance != address(0), "ERC1167: create failed"); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create2(0, ptr, 0x37, salt) } require(instance != address(0), "ERC1167: create2 failed"); } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt, address deployer ) internal pure returns (address predicted) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000) mstore(add(ptr, 0x38), shl(0x60, deployer)) mstore(add(ptr, 0x4c), salt) mstore(add(ptr, 0x6c), keccak256(ptr, 0x37)) predicted := keccak256(add(ptr, 0x37), 0x55) } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress(address implementation, bytes32 salt) internal view returns (address predicted) { return predictDeterministicAddress(implementation, salt, address(this)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/Address.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/draft-IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`. // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`. // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a // good first aproximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1; uint256 x = a; if (x >> 128 > 0) { x >>= 128; result <<= 64; } if (x >> 64 > 0) { x >>= 64; result <<= 32; } if (x >> 32 > 0) { x >>= 32; result <<= 16; } if (x >> 16 > 0) { x >>= 16; result <<= 8; } if (x >> 8 > 0) { x >>= 8; result <<= 4; } if (x >> 4 > 0) { x >>= 4; result <<= 2; } if (x >> 2 > 0) { result <<= 1; } // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { uint256 result = sqrt(a); if (rounding == Rounding.Up && result * result < a) { result += 1; } return result; } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@openzeppelin/contracts/utils/Address.sol'; import '@mimic-fi/v2-bridge-connector/contracts/IBridgeConnector.sol'; /** * @title BridgeConnectorLib * @dev Library used to delegate-call bridge ops and decode return data correctly */ library BridgeConnectorLib { /** * @dev Delegate-calls a bridge to the bridge connector and decodes de expected data * IMPORTANT! This helper method does not check any of the given params, these should be checked beforehand. */ function bridge( address connector, uint8 source, uint256 chainId, address token, uint256 amountIn, uint256 minAmountOut, address recipient, bytes memory data ) internal { bytes memory bridgeData = abi.encodeWithSelector( IBridgeConnector.bridge.selector, source, chainId, token, amountIn, minAmountOut, recipient, data ); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = connector.delegatecall(bridgeData); Address.verifyCallResult(success, returndata, 'BRIDGE_CALL_REVERTED'); } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@openzeppelin/contracts/utils/Address.sol'; import '@mimic-fi/v2-strategies/contracts/IStrategy.sol'; /** * @title StrategyLib * @dev Library used to delegate-call to strategy and decode return data correctly */ library StrategyLib { /** * @dev Delegate-calls a claim to a strategy and decodes de expected data * IMPORTANT! This helper method does not check any of the given params, these should be checked beforehand. */ function claim(address strategy, bytes memory data) internal returns (address[] memory, uint256[] memory) { bytes memory claimData = abi.encodeWithSelector(IStrategy.claim.selector, data); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = strategy.delegatecall(claimData); Address.verifyCallResult(success, returndata, 'CLAIM_CALL_REVERTED'); return abi.decode(returndata, (address[], uint256[])); } /** * @dev Delegate-calls a join to a strategy and decodes de expected data * IMPORTANT! This helper method does not check any of the given params, these should be checked beforehand. */ function join( address strategy, address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data ) internal returns (address[] memory tokensOut, uint256[] memory amountsOut, uint256 value) { bytes memory joinData = abi.encodeWithSelector(IStrategy.join.selector, tokensIn, amountsIn, slippage, data); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = strategy.delegatecall(joinData); Address.verifyCallResult(success, returndata, 'JOIN_CALL_REVERTED'); return abi.decode(returndata, (address[], uint256[], uint256)); } /** * @dev Delegate-calls a exit to a strategy and decodes de expected data * IMPORTANT! This helper method does not check any of the given params, these should be checked beforehand. */ function exit( address strategy, address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data ) internal returns (address[] memory tokensOut, uint256[] memory amountsOut, uint256 value) { bytes memory exitData = abi.encodeWithSelector(IStrategy.exit.selector, tokensIn, amountsIn, slippage, data); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = strategy.delegatecall(exitData); Address.verifyCallResult(success, returndata, 'EXIT_CALL_REVERTED'); return abi.decode(returndata, (address[], uint256[], uint256)); } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@openzeppelin/contracts/utils/Address.sol'; import '@mimic-fi/v2-swap-connector/contracts/ISwapConnector.sol'; /** * @title SwapConnectorLib * @dev Library used to delegate-call swaps and decode return data correctly */ library SwapConnectorLib { /** * @dev Delegate-calls a swap to the swap connector and decodes de expected data * IMPORTANT! This helper method does not check any of the given params, these should be checked beforehand. */ function swap( address connector, uint8 source, address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, bytes memory data ) internal returns (uint256 amountOut) { bytes memory swapData = abi.encodeWithSelector( ISwapConnector.swap.selector, source, tokenIn, tokenOut, amountIn, minAmountOut, data ); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = connector.delegatecall(swapData); Address.verifyCallResult(success, returndata, 'SWAP_CALL_REVERTED'); return abi.decode(returndata, (uint256)); } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@mimic-fi/v2-helpers/contracts/auth/IAuthorizer.sol'; import '@mimic-fi/v2-price-oracle/contracts/feeds/IPriceFeedProvider.sol'; import '@mimic-fi/v2-registry/contracts/implementations/IImplementation.sol'; /** * @title ISmartVault * @dev Mimic Smart Vault interface to manage assets. It must support also `IImplementation` and `IAuthorizer` */ interface ISmartVault is IPriceFeedProvider, IImplementation, IAuthorizer { enum SwapLimit { Slippage, MinAmountOut } enum BridgeLimit { Slippage, MinAmountOut } /** * @dev Emitted every time a new strategy is set for the Smart Vault */ event StrategySet(address indexed strategy, bool allowed); /** * @dev Emitted every time a new price oracle is set for the Smart Vault */ event PriceOracleSet(address indexed priceOracle); /** * @dev Emitted every time a new swap connector is set for the Smart Vault */ event SwapConnectorSet(address indexed swapConnector); /** * @dev Emitted every time a new bridge connector is set for the Smart Vault */ event BridgeConnectorSet(address indexed bridgeConnector); /** * @dev Emitted every time a new fee collector is set */ event FeeCollectorSet(address indexed feeCollector); /** * @dev Emitted every time the withdraw fee percentage is set */ event WithdrawFeeSet(uint256 pct, uint256 cap, address token, uint256 period); /** * @dev Emitted every time the performance fee percentage is set */ event PerformanceFeeSet(uint256 pct, uint256 cap, address token, uint256 period); /** * @dev Emitted every time the swap fee percentage is set */ event SwapFeeSet(uint256 pct, uint256 cap, address token, uint256 period); /** * @dev Emitted every time the bridge fee percentage is set */ event BridgeFeeSet(uint256 pct, uint256 cap, address token, uint256 period); /** * @dev Emitted every time `call` is called */ event Call(address indexed target, bytes callData, uint256 value, bytes result, bytes data); /** * @dev Emitted every time `collect` is called */ event Collect(address indexed token, address indexed from, uint256 collected, bytes data); /** * @dev Emitted every time `withdraw` is called */ event Withdraw(address indexed token, address indexed recipient, uint256 withdrawn, uint256 fee, bytes data); /** * @dev Emitted every time `wrap` is called */ event Wrap(uint256 amount, uint256 wrapped, bytes data); /** * @dev Emitted every time `unwrap` is called */ event Unwrap(uint256 amount, uint256 unwrapped, bytes data); /** * @dev Emitted every time `claim` is called */ event Claim(address indexed strategy, address[] tokens, uint256[] amounts, bytes data); /** * @dev Emitted every time `join` is called */ event Join( address indexed strategy, address[] tokensIn, uint256[] amountsIn, address[] tokensOut, uint256[] amountsOut, uint256 value, uint256 slippage, bytes data ); /** * @dev Emitted every time `exit` is called */ event Exit( address indexed strategy, address[] tokensIn, uint256[] amountsIn, address[] tokensOut, uint256[] amountsOut, uint256 value, uint256[] fees, uint256 slippage, bytes data ); /** * @dev Emitted every time `swap` is called */ event Swap( uint8 indexed source, address indexed tokenIn, address indexed tokenOut, uint256 amountIn, uint256 amountOut, uint256 minAmountOut, uint256 fee, bytes data ); /** * @dev Emitted every time `bridge` is called */ event Bridge( uint8 indexed source, uint256 indexed chainId, address indexed token, uint256 amountIn, uint256 minAmountOut, uint256 fee, address recipient, bytes data ); /** * @dev Tells a strategy is allowed or not * @param strategy Address of the strategy being queried */ function isStrategyAllowed(address strategy) external view returns (bool); /** * @dev Tells the invested value for a strategy * @param strategy Address of the strategy querying the invested value of */ function investedValue(address strategy) external view returns (uint256); /** * @dev Tells the last value accrued for a strategy. Note this value can be outdated. * @param strategy Address of the strategy querying the last value of */ function lastValue(address strategy) external view returns (uint256); /** * @dev Tells the price oracle associated to a Smart Vault */ function priceOracle() external view returns (address); /** * @dev Tells the swap connector associated to a Smart Vault */ function swapConnector() external view returns (address); /** * @dev Tells the bridge connector associated to a Smart Vault */ function bridgeConnector() external view returns (address); /** * @dev Tells the address where fees will be deposited */ function feeCollector() external view returns (address); /** * @dev Tells the withdraw fee configuration */ function withdrawFee() external view returns (uint256 pct, uint256 cap, address token, uint256 period, uint256 totalCharged, uint256 nextResetTime); /** * @dev Tells the performance fee configuration */ function performanceFee() external view returns (uint256 pct, uint256 cap, address token, uint256 period, uint256 totalCharged, uint256 nextResetTime); /** * @dev Tells the swap fee configuration */ function swapFee() external view returns (uint256 pct, uint256 cap, address token, uint256 period, uint256 totalCharged, uint256 nextResetTime); /** * @dev Tells the bridge fee configuration */ function bridgeFee() external view returns (uint256 pct, uint256 cap, address token, uint256 period, uint256 totalCharged, uint256 nextResetTime); /** * @dev Tells the address of the wrapped native token */ function wrappedNativeToken() external view returns (address); /** * @dev Sets a new strategy as allowed or not for a Smart Vault * @param strategy Address of the strategy to be set * @param allowed Whether the strategy is allowed or not */ function setStrategy(address strategy, bool allowed) external; /** * @dev Sets a new price oracle to a Smart Vault * @param newPriceOracle Address of the new price oracle to be set */ function setPriceOracle(address newPriceOracle) external; /** * @dev Sets a new swap connector to a Smart Vault * @param newSwapConnector Address of the new swap connector to be set */ function setSwapConnector(address newSwapConnector) external; /** * @dev Sets a new bridge connector to a Smart Vault * @param newBridgeConnector Address of the new bridge connector to be set */ function setBridgeConnector(address newBridgeConnector) external; /** * @dev Sets a new fee collector * @param newFeeCollector Address of the new fee collector to be set */ function setFeeCollector(address newFeeCollector) external; /** * @dev Sets a new withdraw fee configuration * @param pct Withdraw fee percentage to be set * @param cap New maximum amount of withdraw fees to be charged per period * @param token Address of the token cap to be set * @param period New cap period length in seconds for the withdraw fee */ function setWithdrawFee(uint256 pct, uint256 cap, address token, uint256 period) external; /** * @dev Sets a new performance fee configuration * @param pct Performance fee percentage to be set * @param cap New maximum amount of performance fees to be charged per period * @param token Address of the token cap to be set * @param period New cap period length in seconds for the performance fee */ function setPerformanceFee(uint256 pct, uint256 cap, address token, uint256 period) external; /** * @dev Sets a new swap fee configuration * @param pct Swap fee percentage to be set * @param cap New maximum amount of swap fees to be charged per period * @param token Address of the token cap to be set * @param period New cap period length in seconds for the swap fee */ function setSwapFee(uint256 pct, uint256 cap, address token, uint256 period) external; /** * @dev Sets a new bridge fee configuration * @param pct Bridge fee percentage to be set * @param cap New maximum amount of bridge fees to be charged per period * @param token Address of the token cap to be set * @param period New cap period length in seconds for the bridge fee */ function setBridgeFee(uint256 pct, uint256 cap, address token, uint256 period) external; /** * @dev Tells the price of a token (base) in a given quote * @param base Token to rate * @param quote Token used for the price rate */ function getPrice(address base, address quote) external view returns (uint256); /** * @dev Execute an arbitrary call from a Smart Vault * @param target Address where the call will be sent * @param callData Calldata to be used for the call * @param value Value in wei that will be attached to the call * @param data Extra data that may enable or not different behaviors depending on the implementation * @return result Call response if it was successful, otherwise it reverts */ function call(address target, bytes memory callData, uint256 value, bytes memory data) external returns (bytes memory result); /** * @dev Collect tokens from a sender to a Smart Vault * @param token Address of the token to be collected * @param from Address where the tokens will be transfer from * @param amount Amount of tokens to be transferred * @param data Extra data that may enable or not different behaviors depending on the implementation * @return collected Amount of tokens assigned to the Smart Vault */ function collect(address token, address from, uint256 amount, bytes memory data) external returns (uint256 collected); /** * @dev Withdraw tokens to an external account * @param token Address of the token to be withdrawn * @param amount Amount of tokens to withdraw * @param recipient Address where the tokens will be transferred to * @param data Extra data that may enable or not different behaviors depending on the implementation * @return withdrawn Amount of tokens transferred to the recipient address */ function withdraw(address token, uint256 amount, address recipient, bytes memory data) external returns (uint256 withdrawn); /** * @dev Wrap an amount of native tokens to the wrapped ERC20 version of it * @param amount Amount of native tokens to be wrapped * @param data Extra data that may enable or not different behaviors depending on the implementation * @return wrapped Amount of tokens wrapped */ function wrap(uint256 amount, bytes memory data) external returns (uint256 wrapped); /** * @dev Unwrap an amount of wrapped native tokens * @param amount Amount of wrapped native tokens to unwrapped * @param data Extra data that may enable or not different behaviors depending on the implementation * @return unwrapped Amount of tokens unwrapped */ function unwrap(uint256 amount, bytes memory data) external returns (uint256 unwrapped); /** * @dev Claim strategy rewards * @param strategy Address of the strategy to claim rewards * @param data Extra data that may enable or not different behaviors depending on the implementation * @return tokens Addresses of the tokens received as rewards * @return amounts Amounts of the tokens received as rewards */ function claim(address strategy, bytes memory data) external returns (address[] memory tokens, uint256[] memory amounts); /** * @dev Join a strategy with an amount of tokens * @param strategy Address of the strategy to join * @param tokensIn List of token addresses to join with * @param amountsIn List of token amounts to join with * @param slippage Slippage that will be used to compute the join * @param data Extra data that may enable or not different behaviors depending on the implementation * @return tokensOut List of token addresses received after the join * @return amountsOut List of token amounts received after the join */ function join( address strategy, address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data ) external returns (address[] memory tokensOut, uint256[] memory amountsOut); /** * @dev Exit a strategy * @param strategy Address of the strategy to exit * @param tokensIn List of token addresses to exit with * @param amountsIn List of token amounts to exit with * @param slippage Slippage that will be used to compute the exit * @param data Extra data that may enable or not different behaviors depending on the implementation * @return tokensOut List of token addresses received after the exit * @return amountsOut List of token amounts received after the exit */ function exit( address strategy, address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data ) external returns (address[] memory tokensOut, uint256[] memory amountsOut); /** * @dev Swaps two tokens * @param source Source to request the swap. It depends on the Swap Connector attached to a Smart Vault. * @param tokenIn Token being sent * @param tokenOut Token being received * @param amountIn Amount of tokenIn being swapped * @param limitType Swap limit to be applied: slippage or min amount out * @param limitAmount Amount of the swap limit to be applied depending on limitType * @param data Extra data that may enable or not different behaviors depending on the implementation * @return amountOut Received amount of tokens out */ function swap( uint8 source, address tokenIn, address tokenOut, uint256 amountIn, SwapLimit limitType, uint256 limitAmount, bytes memory data ) external returns (uint256 amountOut); /** * @dev Bridge assets to another chain * @param source Source to request the bridge. It depends on the Bridge Connector attached to a Smart Vault. * @param chainId ID of the destination chain * @param token Address of the token to be bridged * @param amount Amount of tokens to be bridged * @param limitType Swap limit to be applied: slippage or min amount out * @param limitAmount Amount of the swap limit to be applied depending on limitType * @param recipient Address that will receive the tokens on the destination chain * @param data Extra data that may enable or not different behaviors depending on the implementation * @return bridged Amount requested to be bridged after fees */ function bridge( uint8 source, uint256 chainId, address token, uint256 amount, BridgeLimit limitType, uint256 limitAmount, address recipient, bytes memory data ) external returns (uint256 bridged); }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; import '@mimic-fi/v2-registry/contracts/implementations/IImplementation.sol'; /** * @title ISmartVaultsFactory * @dev Smart Vaults Factory interface, it must follow the IImplementation interface. */ interface ISmartVaultsFactory is IImplementation { /** * @dev Emitted every time a new Smart Vault instance is created */ event Created(address indexed implementation, address indexed instance, bytes initializeResult); /** * @dev Tells the implementation associated to a contract instance * @param instance Address of the instance to request it's implementation */ function implementationOf(address instance) external view returns (address); /** * @dev Creates a new Smart Vault pointing to a registered implementation * @param salt Salt bytes to derivate the address of the new instance * @param implementation Address of the implementation to be instanced * @param initializeData Arbitrary data to be sent after deployment * @return instance Address of the new instance created */ function create(bytes32 salt, address implementation, bytes memory initializeData) external returns (address); }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import '@openzeppelin/contracts/proxy/Clones.sol'; import '@openzeppelin/contracts/utils/Address.sol'; import '@mimic-fi/v2-helpers/contracts/auth/Authorizer.sol'; import '@mimic-fi/v2-registry/contracts/registry/IRegistry.sol'; import '@mimic-fi/v2-registry/contracts/implementations/BaseImplementation.sol'; import './ISmartVaultsFactory.sol'; /** * @title SmartVaultsFactory * @dev */ contract SmartVaultsFactory is ISmartVaultsFactory, BaseImplementation { using Address for address; // Smart Vaults Factory namespace bytes32 public constant override NAMESPACE = keccak256('SMART_VAULTS_FACTORY'); // Namespace to use by this deployer to fetch ISmartVault implementations from the Mimic Registry bytes32 private constant SMART_VAULT_NAMESPACE = keccak256('SMART_VAULT'); // List of instances' implementations indexed by instance address mapping (address => address) public override implementationOf; /** * @dev Creates a new Smart Vaults Factory implementation * @param registry Address of the Mimic Registry to be referenced */ constructor(address registry) BaseImplementation(registry) { // solhint-disable-previous-line no-empty-blocks } /** * @dev Creates a new Smart Vault pointing to a registered implementation using CREATE2 * @param salt Salt bytes to derivate the address of the new instance * @param implementation Address of the implementation to be instanced. It must be registered and not deprecated. * @param initializeData Arbitrary data to be sent after deployment. It can be used to initialize the new instance. * @return instance Address of the new instance created */ function create(bytes32 salt, address implementation, bytes memory initializeData) external override returns (address instance) { require(implementation != address(0), 'IMPLEMENTATION_ADDRESS_ZERO'); require(IImplementation(implementation).NAMESPACE() == SMART_VAULT_NAMESPACE, 'BAD_IMPLEMENTATION_NAMESPACE'); require(IRegistry(registry).isActive(SMART_VAULT_NAMESPACE, implementation), 'BAD_SMART_VAULT_IMPLEMENTATION'); bytes32 senderSalt = keccak256(abi.encodePacked(msg.sender, salt)); instance = Clones.cloneDeterministic(address(implementation), senderSalt); implementationOf[instance] = implementation; bytes memory result = initializeData.length == 0 ? new bytes(0) : instance.functionCall(initializeData, 'SMART_VAULT_INIT_FAILED'); emit Created(implementation, instance, result); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@mimic-fi/v2-bridge-connector/contracts/IBridgeConnector.sol'; import '@mimic-fi/v2-registry/contracts/implementations/BaseImplementation.sol'; import '../samples/BridgeMock.sol'; contract BridgeConnectorMock is IBridgeConnector, BaseImplementation { bytes32 public constant override NAMESPACE = keccak256('BRIDGE_CONNECTOR'); BridgeMock public immutable bridgeMock; constructor(address registry) BaseImplementation(registry) { bridgeMock = new BridgeMock(); } function bridge( uint8, /* source */ uint256, /* chainId */ address token, uint256 amountIn, uint256 minAmountOut, address recipient, bytes memory data ) external override { IERC20(token).approve(address(bridgeMock), amountIn); return bridgeMock.bridge(token, amountIn, minAmountOut, recipient, data); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@mimic-fi/v2-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v2-price-oracle/contracts/oracle/IPriceOracle.sol'; import '@mimic-fi/v2-registry/contracts/implementations/BaseImplementation.sol'; contract PriceOracleMock is IPriceOracle, BaseImplementation { bytes32 public constant override NAMESPACE = keccak256('PRICE_ORACLE'); struct Feed { bool set; uint256 rate; } mapping (address => mapping (address => Feed)) public mockedFeeds; constructor(address registry) BaseImplementation(registry) { // solhint-disable-previous-line no-empty-blocks } function mockRate(address base, address quote, uint256 newMockedRate) external { Feed storage feed = mockedFeeds[base][quote]; feed.set = true; feed.rate = newMockedRate; } function getPrice(address, address base, address quote) external view override returns (uint256) { if (base == quote) return FixedPoint.ONE; Feed storage feed = mockedFeeds[base][quote]; require(feed.set, 'PRICE_ORACLE_FEED_NOT_SET'); return feed.rate; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@mimic-fi/v2-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v2-strategies/contracts/IStrategy.sol'; import '@mimic-fi/v2-registry/contracts/implementations/BaseImplementation.sol'; import '../samples/TokenMock.sol'; contract StrategyMock is IStrategy, BaseImplementation { using FixedPoint for uint256; bytes32 public constant override NAMESPACE = keccak256('STRATEGY'); address public immutable lpt; address public immutable token; address public immutable rewardToken; event Claimed(bytes data); event Joined(address[] tokensIn, uint256[] amountsIn, uint256 slippage, bytes data); event Exited(address[] tokensIn, uint256[] amountsIn, uint256 slippage, bytes data); constructor(address registry) BaseImplementation(registry) { lpt = address(new TokenMock('LPT')); token = address(new TokenMock('TKN')); rewardToken = address(new TokenMock('REW')); } function mockGains(address account, uint256 multiplier) external { uint256 balance = IERC20(lpt).balanceOf(account); TokenMock(lpt).mint(account, balance * (multiplier - 1)); } function mockLosses(address account, uint256 divisor) external { uint256 balance = IERC20(lpt).balanceOf(account); TokenMock(lpt).burn(account, balance / divisor); } function joinTokens() public view override returns (address[] memory tokens) { tokens = new address[](1); tokens[0] = token; } function exitTokens() public view override returns (address[] memory tokens) { tokens = new address[](1); tokens[0] = lpt; } function valueRate() public pure override returns (uint256) { return FixedPoint.ONE; } function lastValue(address account) public view override returns (uint256) { return IERC20(lpt).balanceOf(account); } function claim(bytes memory data) external override returns (address[] memory tokens, uint256[] memory amounts) { uint256 amount = abi.decode(data, (uint256)); TokenMock(rewardToken).mint(address(this), amount); tokens = new address[](1); tokens[0] = rewardToken; amounts = new uint256[](1); amounts[0] = amount; emit Claimed(data); } function join(address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data) external override returns (address[] memory tokensOut, uint256[] memory amountsOut, uint256 value) { require(tokensIn.length == 1, 'STRATEGY_INVALID_TOKENS_IN_LEN'); require(amountsIn.length == 1, 'STRATEGY_INVALID_AMOUNTS_IN_LEN'); require(tokensIn[0] == token, 'STRATEGY_INVALID_JOIN_TOKEN'); tokensOut = exitTokens(); amountsOut = new uint256[](1); amountsOut[0] = amountsIn[0]; TokenMock(token).burn(address(this), amountsIn[0]); TokenMock(lpt).mint(address(this), amountsOut[0]); value = amountsOut[0].mulDown(valueRate()); emit Joined(tokensIn, amountsIn, slippage, data); } function exit(address[] memory tokensIn, uint256[] memory amountsIn, uint256 slippage, bytes memory data) external override returns (address[] memory tokensOut, uint256[] memory amountsOut, uint256 value) { require(tokensIn.length == 1, 'STRATEGY_INVALID_TOKENS_IN_LEN'); require(amountsIn.length == 1, 'STRATEGY_INVALID_AMOUNTS_IN_LEN'); require(tokensIn[0] == lpt, 'STRATEGY_INVALID_EXIT_TOKEN'); tokensOut = joinTokens(); amountsOut = new uint256[](1); amountsOut[0] = amountsIn[0]; TokenMock(lpt).burn(address(this), amountsIn[0]); TokenMock(token).mint(address(this), amountsOut[0]); value = amountsIn[0].divUp(valueRate()); emit Exited(tokensIn, amountsIn, slippage, data); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@mimic-fi/v2-swap-connector/contracts/ISwapConnector.sol'; import '@mimic-fi/v2-registry/contracts/implementations/BaseImplementation.sol'; import '../samples/DexMock.sol'; contract SwapConnectorMock is ISwapConnector, BaseImplementation { bytes32 public constant override NAMESPACE = keccak256('SWAP_CONNECTOR'); DexMock public immutable dex; constructor(address registry) BaseImplementation(registry) { dex = new DexMock(); } function mockRate(uint256 newRate) external { dex.mockRate(newRate); } function swap( uint8, /* source */ address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, bytes memory data ) external override returns (uint256 amountOut) { IERC20(tokenIn).approve(address(dex), amountIn); return dex.swap(tokenIn, tokenOut, amountIn, minAmountOut, data); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; contract BridgeMock { function bridge(address token, uint256 amount, uint256, address, bytes memory) external { IERC20(token).transferFrom(msg.sender, address(this), amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@mimic-fi/v2-helpers/contracts/math/FixedPoint.sol'; contract DexMock { using FixedPoint for uint256; uint256 public mockedRate; constructor() { mockedRate = FixedPoint.ONE; } function mockRate(uint256 newRate) external { mockedRate = newRate; } function swap(address tokenIn, address tokenOut, uint256 amountIn, uint256, bytes memory) external returns (uint256 amountOut) { IERC20(tokenIn).transferFrom(msg.sender, address(this), amountIn); amountOut = amountIn.mulDown(mockedRate); IERC20(tokenOut).transfer(msg.sender, amountOut); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/ERC20.sol'; contract TokenMock is ERC20 { constructor(string memory symbol) ERC20(symbol, symbol) { // solhint-disable-previous-line no-empty-blocks } function mint(address account, uint256 amount) external { _mint(account, amount); } function burn(address account, uint256 amount) external { _burn(account, amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@mimic-fi/v2-helpers/contracts/utils/IWrappedNativeToken.sol'; contract WrappedNativeTokenMock is IWrappedNativeToken { uint8 public decimals = 18; string public name = 'Wrapped Native Token'; string public symbol = 'WNT'; event Deposit(address indexed to, uint256 amount); event Withdrawal(address indexed from, uint256 amount); mapping (address => uint256) public override balanceOf; mapping (address => mapping (address => uint256)) public override allowance; receive() external payable { deposit(); } function deposit() public payable override { balanceOf[msg.sender] += msg.value; emit Deposit(msg.sender, msg.value); } function withdraw(uint256 amount) public override { require(balanceOf[msg.sender] >= amount, 'WNT_NOT_ENOUGH_BALANCE'); balanceOf[msg.sender] -= amount; payable(msg.sender).transfer(amount); emit Withdrawal(msg.sender, amount); } function totalSupply() public view override returns (uint256) { return address(this).balance; } function approve(address spender, uint256 amount) public override returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public override returns (bool) { return transferFrom(msg.sender, to, amount); } function transferFrom(address from, address to, uint256 amount) public override returns (bool) { require(balanceOf[from] >= amount, 'NOT_ENOUGH_BALANCE'); if (from != msg.sender && allowance[from][msg.sender] != type(uint256).max) { require(allowance[from][msg.sender] >= amount, 'NOT_ENOUGH_ALLOWANCE'); allowance[from][msg.sender] -= amount; } balanceOf[from] -= amount; balanceOf[to] += amount; emit Transfer(from, to, amount); return true; } }
{ "optimizer": { "enabled": true, "runs": 10000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_wrappedNativeToken","type":"address"},{"internalType":"address","name":"_registry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"bytes4","name":"what","type":"bytes4"}],"name":"Authorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"source","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Bridge","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bridgeConnector","type":"address"}],"name":"BridgeConnectorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pct","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"}],"name":"BridgeFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bytes","name":"callData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"result","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Call","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"strategy","type":"address"},{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"collected","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Collect","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"strategy","type":"address"},{"indexed":false,"internalType":"address[]","name":"tokensIn","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amountsIn","type":"uint256[]"},{"indexed":false,"internalType":"address[]","name":"tokensOut","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amountsOut","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"fees","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"slippage","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Exit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feeCollector","type":"address"}],"name":"FeeCollectorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"strategy","type":"address"},{"indexed":false,"internalType":"address[]","name":"tokensIn","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amountsIn","type":"uint256[]"},{"indexed":false,"internalType":"address[]","name":"tokensOut","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amountsOut","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"slippage","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Join","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pct","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"}],"name":"PerformanceFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"base","type":"address"},{"indexed":true,"internalType":"address","name":"quote","type":"address"},{"indexed":false,"internalType":"address","name":"feed","type":"address"}],"name":"PriceFeedSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"priceOracle","type":"address"}],"name":"PriceOracleSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"strategy","type":"address"},{"indexed":false,"internalType":"bool","name":"allowed","type":"bool"}],"name":"StrategySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"source","type":"uint8"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"swapConnector","type":"address"}],"name":"SwapConnectorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pct","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"}],"name":"SwapFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"bytes4","name":"what","type":"bytes4"}],"name":"Unauthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unwrapped","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Unwrap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrawn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pct","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"}],"name":"WithdrawFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wrapped","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Wrap","type":"event"},{"inputs":[],"name":"ANY_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAMESPACE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes4","name":"what","type":"bytes4"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"source","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum ISmartVault.BridgeLimit","name":"limitType","type":"uint8"},{"internalType":"uint256","name":"limitAmount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"bridge","outputs":[{"internalType":"uint256","name":"bridged","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bridgeConnector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeFee","outputs":[{"internalType":"uint256","name":"pct","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"totalCharged","type":"uint256"},{"internalType":"uint256","name":"nextResetTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"call","outputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"strategy","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"claim","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"collect","outputs":[{"internalType":"uint256","name":"collected","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"strategy","type":"address"},{"internalType":"address[]","name":"tokensIn","type":"address[]"},{"internalType":"uint256[]","name":"amountsIn","type":"uint256[]"},{"internalType":"uint256","name":"slippage","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"exit","outputs":[{"internalType":"address[]","name":"tokensOut","type":"address[]"},{"internalType":"uint256[]","name":"amountsOut","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"getPriceFeed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"investedValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes4","name":"what","type":"bytes4"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isStrategyAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"strategy","type":"address"},{"internalType":"address[]","name":"tokensIn","type":"address[]"},{"internalType":"uint256[]","name":"amountsIn","type":"uint256[]"},{"internalType":"uint256","name":"slippage","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"join","outputs":[{"internalType":"address[]","name":"tokensOut","type":"address[]"},{"internalType":"uint256[]","name":"amountsOut","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"strategy","type":"address"}],"name":"lastValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceFee","outputs":[{"internalType":"uint256","name":"pct","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"totalCharged","type":"uint256"},{"internalType":"uint256","name":"nextResetTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newBridgeConnector","type":"address"}],"name":"setBridgeConnector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pct","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setBridgeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFeeCollector","type":"address"}],"name":"setFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pct","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setPerformanceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"address","name":"feed","type":"address"}],"name":"setPriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"bases","type":"address[]"},{"internalType":"address[]","name":"quotes","type":"address[]"},{"internalType":"address[]","name":"feeds","type":"address[]"}],"name":"setPriceFeeds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPriceOracle","type":"address"}],"name":"setPriceOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"strategy","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSwapConnector","type":"address"}],"name":"setSwapConnector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pct","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setSwapFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pct","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setWithdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"source","type":"uint8"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"enum ISmartVault.SwapLimit","name":"limitType","type":"uint8"},{"internalType":"uint256","name":"limitAmount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapConnector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapFee","outputs":[{"internalType":"uint256","name":"pct","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"totalCharged","type":"uint256"},{"internalType":"uint256","name":"nextResetTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes4","name":"what","type":"bytes4"}],"name":"unauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"unwrap","outputs":[{"internalType":"uint256","name":"unwrapped","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"withdrawn","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[{"internalType":"uint256","name":"pct","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"totalCharged","type":"uint256"},{"internalType":"uint256","name":"nextResetTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"wrap","outputs":[{"internalType":"uint256","name":"wrapped","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrappedNativeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Loading...
Loading
Loading...
Loading

Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BSC | 99.78% | $0.000106 | 102,623,376,411.2203 | $10,894,497.64 | |
BSC | 0.02% | $0.051854 | 38,734.3024 | $2,008.53 | |
BSC | 0.01% | $0.000324 | 4,591,784.1734 | $1,489.71 | |
BSC | <0.01% | $3.66 | 201.1351 | $736.35 | |
BSC | <0.01% | $0.00 | 93,636.6461 | $0.00 | |
BSC | <0.01% | $0.009988 | 51,395.2521 | $513.35 | |
BSC | <0.01% | $0.03344 | 15,033.5402 | $502.73 | |
BSC | <0.01% | <$0.000001 | 580,468,289,722.743 | $473.41 | |
BSC | <0.01% | $0.444069 | 597.9528 | $265.53 | |
BSC | <0.01% | <$0.000001 | 6,410,035,054.304 | $206.01 | |
BSC | <0.01% | $0.00 | 2,688.0301 | $0.00 | |
BSC | <0.01% | $0.000005 | 27,737,017.5918 | $136.2 | |
BSC | <0.01% | $0.039863 | 2,531.2106 | $100.9 | |
BSC | <0.01% | $0.009897 | 9,932.5159 | $98.31 | |
BSC | <0.01% | $0.910941 | 103.8957 | $94.64 | |
BSC | <0.01% | <$0.000001 | 576,142,696.3485 | $76.86 | |
BSC | <0.01% | $0.009804 | 6,780.9519 | $66.48 | |
BSC | <0.01% | $0.00731 | 9,053.9989 | $66.19 | |
BSC | <0.01% | $0.00115 | 53,937.2155 | $62 | |
BSC | <0.01% | $0.053101 | 1,082.1495 | $57.46 | |
BSC | <0.01% | $0.00387 | 14,025.1281 | $54.27 | |
BSC | <0.01% | $0.025713 | 2,109.1135 | $54.23 | |
BSC | <0.01% | <$0.000001 | 11,313,558,886.0181 | $53.03 | |
BSC | <0.01% | $0.000007 | 6,468,381.7802 | $44.44 | |
BSC | <0.01% | <$0.000001 | 3,619,456,359.9239 | $39.81 | |
BSC | <0.01% | $2.06 | 16.3026 | $33.55 | |
BSC | <0.01% | <$0.000001 | 874,145,561.6795 | $32.05 | |
BSC | <0.01% | $0.000175 | 175,531.6879 | $30.7 | |
BSC | <0.01% | <$0.000001 | 734,693,319.1457 | $30.63 | |
BSC | <0.01% | $0.110415 | 276.4654 | $30.53 | |
BSC | <0.01% | $0.042247 | 690.6717 | $29.18 | |
BSC | <0.01% | $0.000003 | 9,977,392.4757 | $29.03 | |
BSC | <0.01% | $0.002027 | 14,168.2081 | $28.72 | |
BSC | <0.01% | $0.000346 | 82,109.4312 | $28.39 | |
BSC | <0.01% | $0.000001 | 30,910,585.1112 | $27.76 | |
BSC | <0.01% | $2,291.19 | 0.0117 | $26.89 | |
BSC | <0.01% | <$0.000001 | 33,464,218,913.1225 | $21.49 | |
BSC | <0.01% | $1.25 | 16.962 | $21.2 | |
BSC | <0.01% | <$0.000001 | 13,338,725,226.7673 | $18.53 | |
BSC | <0.01% | $0.000002 | 8,703,883.2645 | $17.06 | |
BSC | <0.01% | <$0.000001 | 70,833,174,837.1916 | $15.83 | |
BSC | <0.01% | $0.019117 | 822.864 | $15.73 | |
BSC | <0.01% | $0.03213 | 486.9887 | $15.65 | |
BSC | <0.01% | $0.001403 | 11,059.1899 | $15.52 | |
BSC | <0.01% | <$0.000001 | 5,756,457,998.1144 | $14.68 | |
BSC | <0.01% | $0.291995 | 50.0728 | $14.62 | |
BSC | <0.01% | $0.000981 | 14,286.8779 | $14.02 | |
BSC | <0.01% | <$0.000001 | 4,400,753,567,382.417 | $13.99 | |
BSC | <0.01% | $0.000176 | 79,382.6857 | $13.96 | |
BSC | <0.01% | $0.000043 | 324,316.2453 | $13.79 | |
BSC | <0.01% | $1.41 | 9.6028 | $13.54 | |
BSC | <0.01% | $29.11 | 0.4595 | $13.38 | |
BSC | <0.01% | <$0.000001 | 13,488,996,392,528.666 | $12.8 | |
BSC | <0.01% | $0.014595 | 850.5038 | $12.41 | |
BSC | <0.01% | $0.077315 | 160.5325 | $12.41 | |
BSC | <0.01% | $0.001135 | 10,489.9397 | $11.9 | |
BSC | <0.01% | $251.51 | 0.0467 | $11.76 | |
BSC | <0.01% | <$0.000001 | 3,934,025,345.3753 | $11.64 | |
BSC | <0.01% | <$0.000001 | 7,005,051,043.4729 | $11.58 | |
BSC | <0.01% | $0.005621 | 2,059.2069 | $11.57 | |
BSC | <0.01% | $0.00 | 662,793.6041 | $0.00 | |
BSC | <0.01% | $0.00065 | 17,014.289 | $11.06 | |
BSC | <0.01% | $100.65 | 0.108 | $10.87 | |
BSC | <0.01% | $92.98 | 0.1106 | $10.29 | |
BSC | <0.01% | $0.000013 | 787,591.355 | $10.08 | |
BSC | <0.01% | $0.002329 | 4,170.2049 | $9.71 | |
BSC | <0.01% | $0.528047 | 18.0375 | $9.52 | |
BSC | <0.01% | $0.01549 | 609.0812 | $9.43 | |
BSC | <0.01% | $0.998585 | 9.0574 | $9.04 | |
BSC | <0.01% | $0.042585 | 210.7852 | $8.98 | |
BSC | <0.01% | $0.008713 | 1,023.2538 | $8.92 | |
BSC | <0.01% | <$0.000001 | 1,336,437,033.0365 | $8.78 | |
BSC | <0.01% | $0.000813 | 10,636.9095 | $8.64 | |
BSC | <0.01% | <$0.000001 | 35,836,940.897 | $8.63 | |
BSC | <0.01% | $0.003965 | 2,091.1148 | $8.29 | |
BSC | <0.01% | $0.07884 | 103.267 | $8.14 | |
BSC | <0.01% | <$0.000001 | 2,951,279,280.2879 | $7.99 | |
BSC | <0.01% | $1,406.56 | 0.00559202 | $7.87 | |
BSC | <0.01% | <$0.000001 | 644,246,655.1789 | $7.83 | |
BSC | <0.01% | <$0.000001 | 2,158,799,030.0028 | $7.8 | |
BSC | <0.01% | $0.00 | 216,026.1848 | $0.00 | |
BSC | <0.01% | <$0.000001 | 4,302,693,576.752 | $7.7 | |
BSC | <0.01% | $0.00 | 49.8779 | $0.00 | |
BSC | <0.01% | $0.00046 | 16,568.8891 | $7.63 | |
BSC | <0.01% | $0.00013 | 57,466.5877 | $7.48 | |
BSC | <0.01% | <$0.000001 | 17,554,144.6488 | $7.37 | |
BSC | <0.01% | $0.000033 | 221,745.2822 | $7.31 | |
BSC | <0.01% | $4,135.12 | 0.00175001 | $7.24 | |
BSC | <0.01% | $0.001413 | 5,044.8577 | $7.13 | |
BSC | <0.01% | $0.009 | 777.3102 | $7 | |
BSC | <0.01% | <$0.000001 | 4,626,173,229.6629 | $6.96 | |
BSC | <0.01% | $0.003578 | 1,883.7176 | $6.74 | |
BSC | <0.01% | $0.002696 | 2,483.9304 | $6.7 | |
BSC | <0.01% | $0.03599 | 185.5744 | $6.68 | |
BSC | <0.01% | $0.000369 | 17,460.065 | $6.45 | |
BSC | <0.01% | $0.00293 | 2,097.7257 | $6.15 | |
BSC | <0.01% | <$0.000001 | 4,541,780,576,977.9883 | $6.15 | |
BSC | <0.01% | $36.33 | 0.1667 | $6.06 | |
BSC | <0.01% | $0.000515 | 10,955.8268 | $5.64 | |
BSC | <0.01% | $0.002436 | 2,297.0458 | $5.6 | |
BSC | <0.01% | <$0.000001 | 172,039,780.2545 | $5.47 | |
BSC | <0.01% | $0.000821 | 6,618.7993 | $5.44 | |
BSC | <0.01% | <$0.000001 | 738,834,543.7342 | $5.39 | |
BSC | <0.01% | $0.004763 | 1,109.4274 | $5.28 | |
BSC | <0.01% | <$0.000001 | 4,838,136,911.4654 | $5.2 | |
BSC | <0.01% | <$0.000001 | 40,372,347,145,706.1 | $5.1 | |
BSC | <0.01% | $0.012591 | 399.6084 | $5.03 | |
BSC | <0.01% | $0.004919 | 961.4436 | $4.73 | |
BSC | <0.01% | $0.002312 | 1,963.9418 | $4.54 | |
BSC | <0.01% | $0.410554 | 11.0076 | $4.52 | |
BSC | <0.01% | <$0.000001 | 329,956,422.0237 | $4.51 | |
BSC | <0.01% | $0.699478 | 6.4319 | $4.5 | |
BSC | <0.01% | <$0.000001 | 3,646,498,183.4843 | $4.32 | |
BSC | <0.01% | $0.001773 | 2,432.1983 | $4.31 | |
BSC | <0.01% | $0.00578 | 738.9178 | $4.27 | |
BSC | <0.01% | $0.000255 | 16,549.1443 | $4.22 | |
BSC | <0.01% | $11.34 | 0.3708 | $4.21 | |
BSC | <0.01% | $0.343336 | 12.0532 | $4.14 | |
BSC | <0.01% | $0.433419 | 9.4824 | $4.11 | |
BSC | <0.01% | $1.83 | 2.1828 | $3.99 | |
BSC | <0.01% | $0.00311 | 1,263.0168 | $3.93 | |
BSC | <0.01% | $0.000499 | 7,853.0725 | $3.92 | |
BSC | <0.01% | $0.703368 | 5.5675 | $3.92 | |
BSC | <0.01% | <$0.000001 | 39,058,927,330.1834 | $3.91 | |
BSC | <0.01% | $0.000002 | 2,232,299.77 | $3.86 | |
BSC | <0.01% | $0.003328 | 1,152.0594 | $3.83 | |
BSC | <0.01% | <$0.000001 | 1,291,549,282.3995 | $3.79 | |
BSC | <0.01% | $0.00 | 3,404.2851 | $0.00 | |
BSC | <0.01% | $0.000781 | 4,833.6086 | $3.77 | |
BSC | <0.01% | $0.000396 | 9,492.2963 | $3.76 | |
BSC | <0.01% | $0.000208 | 17,853.3495 | $3.72 | |
BSC | <0.01% | <$0.000001 | 431,931,349.9163 | $3.66 | |
BSC | <0.01% | $0.019509 | 185.2024 | $3.61 | |
BSC | <0.01% | $0.000001 | 6,678,424.72 | $3.59 | |
BSC | <0.01% | <$0.000001 | 250,814,498,362.2521 | $3.57 | |
BSC | <0.01% | $0.00091 | 3,886.0059 | $3.54 | |
BSC | <0.01% | $0.000324 | 10,871.0205 | $3.52 | |
BSC | <0.01% | $0.000844 | 4,139.7996 | $3.49 | |
BSC | <0.01% | $0.005792 | 599.8872 | $3.47 | |
BSC | <0.01% | $0.008703 | 397.1524 | $3.46 | |
BSC | <0.01% | $0.013708 | 247.6571 | $3.39 | |
BSC | <0.01% | $0.010767 | 311.7044 | $3.36 | |
BSC | <0.01% | $0.000125 | 26,769.0691 | $3.34 | |
BSC | <0.01% | $0.394255 | 8.3714 | $3.3 | |
BSC | <0.01% | $0.000643 | 5,047.6805 | $3.25 | |
BSC | <0.01% | $0.309628 | 10.4028 | $3.22 | |
BSC | <0.01% | $0.00006 | 54,040.67 | $3.22 | |
BSC | <0.01% | $0.011075 | 288.6559 | $3.2 | |
BSC | <0.01% | $0.000915 | 3,432.2006 | $3.14 | |
BSC | <0.01% | $0.505826 | 6.1578 | $3.11 | |
BSC | <0.01% | $0.000614 | 5,048.5669 | $3.1 | |
BSC | <0.01% | $0.001927 | 1,600.5856 | $3.08 | |
BSC | <0.01% | $0.00 | 991,646,857.592 | $0.00 | |
BSC | <0.01% | $0.000915 | 3,219.0536 | $2.95 | |
BSC | <0.01% | $0.344024 | 8.5023 | $2.92 | |
BSC | <0.01% | <$0.000001 | 344,981,598,498,487.44 | $2.9 | |
BSC | <0.01% | $0.004511 | 633.5062 | $2.86 | |
BSC | <0.01% | <$0.000001 | 1,119,313,051,757.2522 | $2.8 | |
BSC | <0.01% | $0.054111 | 50.6683 | $2.74 | |
BSC | <0.01% | <$0.000001 | 1,686,712,979,716.2419 | $2.7 | |
BSC | <0.01% | $0.002295 | 1,166.7601 | $2.68 | |
BSC | <0.01% | $0.068106 | 39.3058 | $2.68 | |
BSC | <0.01% | $16,245.44 | 0.00016441 | $2.67 | |
BSC | <0.01% | $0.00 | 1,987.1662 | $0.00 | |
BSC | <0.01% | $0.013977 | 190.5425 | $2.66 | |
BSC | <0.01% | $0.000008 | 335,497.9571 | $2.65 | |
BSC | <0.01% | <$0.000001 | 915,353,982.9575 | $2.64 | |
BSC | <0.01% | <$0.000001 | 1,059,362,139.6575 | $2.63 | |
BSC | <0.01% | $1.97 | 1.3243 | $2.61 | |
BSC | <0.01% | $0.00 | 3,067.5554 | $0.00 | |
BSC | <0.01% | <$0.000001 | 10,506,688,937.0109 | $2.58 | |
BSC | <0.01% | $0.000048 | 52,792.6827 | $2.55 | |
BSC | <0.01% | $0.180295 | 14.1548 | $2.55 | |
BSC | <0.01% | $0.020449 | 121.994 | $2.49 | |
BSC | <0.01% | $0.00 | 1,718.6235 | $0.00 | |
BSC | <0.01% | $0.00 | 87,516,215.8868 | $0.00 | |
BSC | <0.01% | <$0.000001 | 5,504,873,491.6852 | $2.43 | |
BSC | <0.01% | $0.983988 | 2.4715 | $2.43 | |
BSC | <0.01% | $0.000524 | 4,591.8171 | $2.41 | |
BSC | <0.01% | <$0.000001 | 235,191,230.7494 | $2.39 | |
BSC | <0.01% | $0.02581 | 91.9443 | $2.37 | |
BSC | <0.01% | <$0.000001 | 786,378,486,492,869,760 | $2.36 | |
BSC | <0.01% | $0.000004 | 590,357.9903 | $2.31 | |
BSC | <0.01% | $0.000259 | 8,858.1704 | $2.29 | |
BSC | <0.01% | $0.002025 | 1,105.5907 | $2.24 | |
BSC | <0.01% | $0.010649 | 208.4639 | $2.22 | |
BSC | <0.01% | $0.11544 | 19.1994 | $2.22 | |
BSC | <0.01% | $0.000036 | 60,750.391 | $2.2 | |
BSC | <0.01% | $1.38 | 1.5766 | $2.18 | |
BSC | <0.01% | $0.202216 | 10.6114 | $2.15 | |
BSC | <0.01% | <$0.000001 | 97,294,217.2068 | $2.1 | |
BSC | <0.01% | $0.000004 | 492,840.8091 | $2.1 | |
BSC | <0.01% | $0.359408 | 5.758 | $2.07 | |
BSC | <0.01% | $0.000085 | 23,852.8599 | $2.02 | |
BSC | <0.01% | $0.00 | 5,631.2598 | $0.00 | |
BSC | <0.01% | <$0.000001 | 6,525,146.0201 | $1.96 | |
BSC | <0.01% | $0.003236 | 603.484 | $1.95 | |
BSC | <0.01% | $0.002765 | 705.5194 | $1.95 | |
BSC | <0.01% | <$0.000001 | 221,902,868,774.2643 | $1.95 | |
BSC | <0.01% | $1 | 1.9191 | $1.92 | |
BSC | <0.01% | $5,094.92 | 0.00037129 | $1.89 | |
BSC | <0.01% | $0.010716 | 175.8546 | $1.88 | |
BSC | <0.01% | <$0.000001 | 1,207,369,145.0633 | $1.86 | |
BSC | <0.01% | $8.14 | 0.2284 | $1.86 | |
BSC | <0.01% | $0.000027 | 68,131.8103 | $1.85 | |
BSC | <0.01% | $0.001963 | 936.4846 | $1.84 | |
BSC | <0.01% | $0.000406 | 4,507.2749 | $1.83 | |
BSC | <0.01% | <$0.000001 | 569,267,415.2982 | $1.82 | |
BSC | <0.01% | $0.000117 | 15,416.7852 | $1.81 | |
BSC | <0.01% | $0.021946 | 82.2895 | $1.81 | |
BSC | <0.01% | $0.001047 | 1,720.0926 | $1.8 | |
BSC | <0.01% | $0.00112 | 1,594.7361 | $1.79 | |
BSC | <0.01% | $0.004683 | 380.1971 | $1.78 | |
BSC | <0.01% | $0.013541 | 130.6363 | $1.77 | |
BSC | <0.01% | $0.001179 | 1,475.9637 | $1.74 | |
BSC | <0.01% | <$0.000001 | 1,329,210,659.3153 | $1.73 | |
BSC | <0.01% | $0.00324 | 533.2079 | $1.73 | |
BSC | <0.01% | $2.64 | 0.6471 | $1.71 | |
BSC | <0.01% | $0.000146 | 11,722.2297 | $1.71 | |
BSC | <0.01% | $0.015477 | 107.6681 | $1.67 | |
BSC | <0.01% | $0.29046 | 5.6608 | $1.64 | |
BSC | <0.01% | <$0.000001 | 21,214,094,122.3722 | $1.63 | |
BSC | <0.01% | $0.00 | 3,596,527.5029 | $0.00 | |
BSC | <0.01% | $0.004374 | 370.0254 | $1.62 | |
BSC | <0.01% | $0.046649 | 34.4056 | $1.6 | |
BSC | <0.01% | $0.000114 | 14,059.154 | $1.6 | |
BSC | <0.01% | $0.000145 | 10,812.6301 | $1.57 | |
BSC | <0.01% | <$0.000001 | 26,502,063,997,342,352 | $1.56 | |
BSC | <0.01% | <$0.000001 | 7,175,616,054.8718 | $1.56 | |
BSC | <0.01% | $0.008023 | 191.5533 | $1.54 | |
BSC | <0.01% | $0.00 | 23.528 | $0.00 | |
BSC | <0.01% | $0.137367 | 10.977 | $1.51 | |
BSC | <0.01% | $0.000042 | 35,478.4751 | $1.5 | |
BSC | <0.01% | $0.005153 | 287.4848 | $1.48 | |
BSC | <0.01% | $0.000056 | 26,445.7448 | $1.47 | |
BSC | <0.01% | <$0.000001 | 417,206,608.2667 | $1.46 | |
BSC | <0.01% | $0.147657 | 9.6378 | $1.42 | |
BSC | <0.01% | $0.003704 | 381.1224 | $1.41 | |
BSC | <0.01% | $0.06587 | 21.2693 | $1.4 | |
BSC | <0.01% | $0.007582 | 178.9268 | $1.36 | |
BSC | <0.01% | <$0.000001 | 17,296,831.4856 | $1.32 | |
BSC | <0.01% | $0.024394 | 54 | $1.32 | |
BSC | <0.01% | $0.001499 | 873.5733 | $1.31 | |
BSC | <0.01% | $0.113525 | 11.4645 | $1.3 | |
BSC | <0.01% | $0.000316 | 4,089.7003 | $1.29 | |
BSC | <0.01% | $0.000003 | 493,067.549 | $1.28 | |
BSC | <0.01% | $0.00043 | 2,967.1417 | $1.28 | |
BSC | <0.01% | $0.377139 | 3.3314 | $1.26 | |
BSC | <0.01% | $0.00 | 6,599,535.9892 | $0.00 | |
BSC | <0.01% | <$0.000001 | 4,392,811,890.6513 | $1.24 | |
BSC | <0.01% | $0.2302 | 5.3458 | $1.23 | |
BSC | <0.01% | $0.001118 | 1,089.0657 | $1.22 | |
BSC | <0.01% | $116,338 | 0.00001032 | $1.2 | |
BSC | <0.01% | $0.004608 | 259.9905 | $1.2 | |
BSC | <0.01% | $0.000038 | 31,195.7562 | $1.2 | |
BSC | <0.01% | $0.024037 | 49.3142 | $1.19 | |
BSC | <0.01% | $0.000243 | 4,831.6041 | $1.17 | |
BSC | <0.01% | $0.001144 | 1,009.5211 | $1.16 | |
BSC | <0.01% | $0.030608 | 37.5741 | $1.15 | |
BSC | <0.01% | $0.000608 | 1,882.9389 | $1.14 | |
BSC | <0.01% | $1.06 | 1.0789 | $1.14 | |
BSC | <0.01% | $0.002605 | 434.4997 | $1.13 | |
BSC | <0.01% | $0.035389 | 31.6721 | $1.12 | |
BSC | <0.01% | $1.06 | 1.0495 | $1.11 | |
BSC | <0.01% | $0.000003 | 314,459.8852 | $1.09 | |
BSC | <0.01% | $0.00007 | 15,451.2214 | $1.09 | |
BSC | <0.01% | $0.375207 | 2.8567 | $1.07 | |
BSC | <0.01% | $0.030467 | 34.0594 | $1.04 | |
BSC | <0.01% | $0.000128 | 8,067.5355 | $1.03 | |
BSC | <0.01% | <$0.000001 | 16,177,653,300.2307 | $1.01 | |
BSC | <0.01% | $0.156904 | 6.4029 | $1 | |
BSC | <0.01% | $30 | 0.0332 | $0.9972 | |
BSC | <0.01% | $0.00067 | 1,483.7713 | $0.9937 | |
BSC | <0.01% | $0.536639 | 1.8452 | $0.9902 | |
BSC | <0.01% | $0.004447 | 221.0428 | $0.983 | |
BSC | <0.01% | $0.155004 | 6.2678 | $0.9715 | |
BSC | <0.01% | $0.000923 | 1,045.4867 | $0.9649 | |
BSC | <0.01% | $0.00 | 1,777.6681 | $0.00 | |
BSC | <0.01% | $0.145844 | 6.398 | $0.9331 | |
BSC | <0.01% | $0.000372 | 2,474.3159 | $0.9196 | |
BSC | <0.01% | $0.0081 | 113.2827 | $0.9175 | |
BSC | <0.01% | $0.004731 | 193.2854 | $0.9144 | |
BSC | <0.01% | $0.000088 | 10,411.2261 | $0.9119 | |
BSC | <0.01% | <$0.000001 | 8,597,599,200.3188 | $0.9099 | |
BSC | <0.01% | <$0.000001 | 195,954,806.5123 | $0.902 | |
BSC | <0.01% | $0.001138 | 789.0084 | $0.8982 | |
BSC | <0.01% | $0.000001 | 1,426,209.3526 | $0.8854 | |
BSC | <0.01% | $0.00375 | 234.0791 | $0.8779 | |
BSC | <0.01% | $0.00 | 116.2331 | $0.00 | |
BSC | <0.01% | <$0.000001 | 648,730,365.0795 | $0.8433 | |
BSC | <0.01% | $4.23 | 0.1981 | $0.838 | |
BSC | <0.01% | <$0.000001 | 1,887,783.6622 | $0.8314 | |
BSC | <0.01% | <$0.000001 | 2,120,918.9041 | $0.8298 | |
BSC | <0.01% | <$0.000001 | 25,754,483,223.1871 | $0.8258 | |
BSC | <0.01% | $0.000443 | 1,853.1708 | $0.8212 | |
BSC | <0.01% | $0.008275 | 99.2337 | $0.8211 | |
BSC | <0.01% | $0.969527 | 0.8434 | $0.8177 | |
BSC | <0.01% | $0.001892 | 422.2885 | $0.7991 | |
BSC | <0.01% | <$0.000001 | 2,238,825,057.0395 | $0.7987 | |
BSC | <0.01% | $0.080482 | 9.8057 | $0.7891 | |
BSC | <0.01% | $0.000529 | 1,460.1605 | $0.772 | |
BSC | <0.01% | $0.017523 | 43.7278 | $0.7662 | |
BSC | <0.01% | $0.000424 | 1,804.828 | $0.7657 | |
BSC | <0.01% | $0.000223 | 3,439.7617 | $0.7653 | |
BSC | <0.01% | $0.000078 | 9,559.5291 | $0.7453 | |
BSC | <0.01% | $0.001576 | 472.0878 | $0.744 | |
BSC | <0.01% | $0.000449 | 1,618.2814 | $0.7264 | |
BSC | <0.01% | $0.001293 | 561.51 | $0.7259 | |
BSC | <0.01% | $0.000201 | 3,570.2783 | $0.7168 | |
BSC | <0.01% | $0.002548 | 279.7606 | $0.7128 | |
BSC | <0.01% | <$0.000001 | 533,145,292,791.8279 | $0.709 | |
BSC | <0.01% | $0.00083 | 835.3557 | $0.6936 | |
BSC | <0.01% | $0.395446 | 1.7213 | $0.6806 | |
BSC | <0.01% | $0.011406 | 58.8265 | $0.6709 | |
BSC | <0.01% | $0.000093 | 7,089.9333 | $0.6625 | |
BSC | <0.01% | $0.000001 | 791,660.3859 | $0.6594 | |
BSC | <0.01% | $0.000001 | 804,828 | $0.6565 | |
BSC | <0.01% | $0.000558 | 1,175.9603 | $0.656 | |
BSC | <0.01% | $0.000065 | 10,023.5861 | $0.6521 | |
BSC | <0.01% | $0.477311 | 1.347 | $0.6429 | |
BSC | <0.01% | $0.042884 | 14.8113 | $0.6351 | |
BSC | <0.01% | $0.004493 | 141.3284 | $0.6349 | |
BSC | <0.01% | $0.001659 | 380.8933 | $0.632 | |
BSC | <0.01% | $0.004939 | 127.4436 | $0.6295 | |
BSC | <0.01% | $0.004087 | 153.8729 | $0.6288 | |
BSC | <0.01% | $0.000088 | 7,151.5158 | $0.6287 | |
BSC | <0.01% | <$0.000001 | 1,010,352,793.2823 | $0.6188 | |
BSC | <0.01% | <$0.000001 | 368,400,791.1389 | $0.6076 | |
BSC | <0.01% | <$0.000001 | 445,051,502.986 | $0.6034 | |
BSC | <0.01% | $0.03854 | 15.5227 | $0.5982 | |
BSC | <0.01% | <$0.000001 | 5,659,723,621,614.1328 | $0.5969 | |
BSC | <0.01% | $0.055959 | 10.3622 | $0.5798 | |
BSC | <0.01% | $0.000001 | 828,077.1131 | $0.5717 | |
BSC | <0.01% | $0.000018 | 32,415.9207 | $0.5714 | |
BSC | <0.01% | $0.000001 | 615,638.1865 | $0.5673 | |
BSC | <0.01% | $0.000131 | 4,282.5072 | $0.561 | |
BSC | <0.01% | $0.003838 | 146.0982 | $0.5606 | |
BSC | <0.01% | <$0.000001 | 4,814,241,793.5979 | $0.5602 | |
BSC | <0.01% | $0.00131 | 421.8228 | $0.5527 | |
BSC | <0.01% | $0.00 | 8.5803 | $0.00 | |
BSC | <0.01% | <$0.000001 | 1,360,695,754.6972 | $0.5442 | |
BSC | <0.01% | <$0.000001 | 3,943,307.4855 | $0.5412 | |
BSC | <0.01% | $0.000006 | 94,208.759 | $0.5369 | |
BSC | <0.01% | $0.000566 | 942.4443 | $0.5334 | |
BSC | <0.01% | $0.175639 | 3.004 | $0.5276 | |
BSC | <0.01% | $0.002418 | 213.9389 | $0.5173 | |
BSC | <0.01% | $0.074362 | 6.907 | $0.5136 | |
BSC | <0.01% | $0.000254 | 2,014.8834 | $0.5114 | |
BSC | <0.01% | $0.013017 | 39.0511 | $0.5083 | |
BSC | <0.01% | $0.020007 | 25.3967 | $0.5081 | |
BSC | <0.01% | $0.000002 | 240,471.7687 | $0.4999 | |
BSC | <0.01% | $0.014341 | 34.7842 | $0.4988 | |
BSC | <0.01% | <$0.000001 | 1,226,101,536,984.8765 | $0.498 | |
BSC | <0.01% | $1.04 | 0.4657 | $0.4855 | |
BSC | <0.01% | $0.166521 | 2.905 | $0.4837 | |
BSC | <0.01% | $0.000727 | 663.353 | $0.4822 | |
BSC | <0.01% | $0.000239 | 1,974.199 | $0.4725 | |
BSC | <0.01% | <$0.000001 | 4,171,645.9811 | $0.463 | |
BSC | <0.01% | $0.139066 | 3.2561 | $0.4528 | |
BSC | <0.01% | $0.000998 | 451.8094 | $0.451 | |
BSC | <0.01% | <$0.000001 | 361,735,135,655.5291 | $0.4496 | |
BSC | <0.01% | $0.000234 | 1,913.2289 | $0.4477 | |
BSC | <0.01% | $0.000285 | 1,551.1312 | $0.4416 | |
BSC | <0.01% | $0.000345 | 1,243.04 | $0.4282 | |
BSC | <0.01% | $0.00 | 63.4993 | $0.00 | |
BSC | <0.01% | $0.000268 | 1,574.5065 | $0.4221 | |
BSC | <0.01% | $0.000052 | 7,903.6291 | $0.4108 | |
BSC | <0.01% | <$0.000001 | 3,448,749,538.8143 | $0.4018 | |
BSC | <0.01% | $1.16 | 0.3462 | $0.4015 | |
BSC | <0.01% | $0.000225 | 1,747.4356 | $0.3927 | |
BSC | <0.01% | $0.034115 | 11.4705 | $0.3913 | |
BSC | <0.01% | $0.427878 | 0.8944 | $0.3826 | |
BSC | <0.01% | $0.082426 | 4.5198 | $0.3725 | |
BSC | <0.01% | $0.002283 | 162.642 | $0.3713 | |
BSC | <0.01% | $6.86 | 0.0534 | $0.3664 | |
BSC | <0.01% | $0.001442 | 253.643 | $0.3658 | |
BSC | <0.01% | <$0.000001 | 6,823,022,147,543.1035 | $0.3561 | |
BSC | <0.01% | $4,159.41 | 0.00008563 | $0.3561 | |
BSC | <0.01% | $0.000174 | 2,044.8278 | $0.3554 | |
BSC | <0.01% | $0.000633 | 558.09 | $0.3529 | |
BSC | <0.01% | $0.000397 | 880.6119 | $0.3494 | |
BSC | <0.01% | $0.004023 | 85.9225 | $0.3456 | |
BSC | <0.01% | $0.000151 | 2,277.3961 | $0.3436 | |
BSC | <0.01% | <$0.000001 | 2,684,808,984.1588 | $0.338 | |
BSC | <0.01% | $0.000115 | 2,926.0934 | $0.3372 | |
BSC | <0.01% | $0.00064 | 518.4286 | $0.3318 | |
BSC | <0.01% | $0.025702 | 12.7538 | $0.3277 | |
BSC | <0.01% | $0.394255 | 0.8279 | $0.3263 | |
BSC | <0.01% | <$0.000001 | 2,282,922,292.1994 | $0.3179 | |
BSC | <0.01% | $0.006131 | 51.697 | $0.3169 | |
BSC | <0.01% | $0.000004 | 81,960.0975 | $0.3155 | |
BSC | <0.01% | $0.092261 | 3.4203 | $0.3155 | |
BSC | <0.01% | $0.003645 | 83.1888 | $0.3032 | |
BSC | <0.01% | $0.000016 | 19,318.3941 | $0.2998 | |
BSC | <0.01% | $0.000921 | 325.2534 | $0.2994 | |
BSC | <0.01% | $0.00 | 2,688.4091 | $0.00 | |
BSC | <0.01% | <$0.000001 | 11,892,407 | $0.2906 | |
BSC | <0.01% | <$0.000001 | 2,635,666,929.6497 | $0.2773 | |
BSC | <0.01% | $0.000487 | 559.5939 | $0.2724 | |
BSC | <0.01% | $0.000192 | 1,409.733 | $0.2713 | |
BSC | <0.01% | <$0.000001 | 19,554,536.0564 | $0.2665 | |
BSC | <0.01% | $0.320628 | 0.7733 | $0.2479 | |
BSC | <0.01% | <$0.000001 | 1,879,899,917,230.6558 | $0.2478 | |
BSC | <0.01% | <$0.000001 | 1,230,905,876.4193 | $0.2461 | |
BSC | <0.01% | $0.107712 | 2.2638 | $0.2438 | |
BSC | <0.01% | $0.009322 | 25.9965 | $0.2423 | |
BSC | <0.01% | $0.184683 | 1.2851 | $0.2373 | |
BSC | <0.01% | $0.000439 | 532.6528 | $0.234 | |
BSC | <0.01% | $0.00 | 994,715,824.2762 | $0.00 | |
BSC | <0.01% | $0.000009 | 26,119.9237 | $0.2309 | |
BSC | <0.01% | $0.00 | 107.4149 | $0.00 | |
BSC | <0.01% | $0.006148 | 36.9544 | $0.2272 | |
BSC | <0.01% | <$0.000001 | 808,409,516,566.5835 | $0.2231 | |
BSC | <0.01% | <$0.000001 | 79,054,754.7 | $0.2213 | |
BSC | <0.01% | $0.008936 | 24.634 | $0.2201 | |
BSC | <0.01% | $0.00128 | 171.4325 | $0.2194 | |
BSC | <0.01% | $0.000223 | 972.7623 | $0.2166 | |
BSC | <0.01% | $0.011922 | 17.7195 | $0.2112 | |
BSC | <0.01% | <$0.000001 | 2,131,184,517.5429 | $0.2054 | |
BSC | <0.01% | $0.051951 | 3.9417 | $0.2047 | |
BSC | <0.01% | $0.002972 | 68.7685 | $0.2043 | |
BSC | <0.01% | $0.003178 | 61.9777 | $0.1969 | |
BSC | <0.01% | $0.00 | 23.7708 | $0.00 | |
BSC | <0.01% | $1.01 | 0.1931 | $0.1944 | |
BSC | <0.01% | $0.000309 | 623.191 | $0.1922 | |
BSC | <0.01% | $0.009637 | 19.517 | $0.188 | |
BSC | <0.01% | $0.000098 | 1,916.3242 | $0.1873 | |
BSC | <0.01% | $0.006812 | 27.4286 | $0.1868 | |
BSC | <0.01% | $0.00165 | 112.825 | $0.1861 | |
BSC | <0.01% | $0.000032 | 5,689.5082 | $0.1829 | |
BSC | <0.01% | $0.002641 | 68.4409 | $0.1807 | |
BSC | <0.01% | $0.002034 | 87.3081 | $0.1776 | |
BSC | <0.01% | $0.000275 | 639.2414 | $0.1754 | |
BSC | <0.01% | $0.000114 | 1,520.4017 | $0.1731 | |
BSC | <0.01% | $0.004568 | 36.4308 | $0.1664 | |
BSC | <0.01% | $0.000043 | 3,821.677 | $0.1641 | |
BSC | <0.01% | $0.002214 | 73.9421 | $0.1637 | |
BSC | <0.01% | $0.00 | 37.6822 | $0.00 | |
BSC | <0.01% | $0.022563 | 7.205 | $0.1625 | |
BSC | <0.01% | $0.000129 | 1,241.26 | $0.1607 | |
BSC | <0.01% | <$0.000001 | 523,378.9813 | $0.1604 | |
BSC | <0.01% | $0.997154 | 0.16 | $0.1595 | |
BSC | <0.01% | $3.56 | 0.0448 | $0.1593 | |
BSC | <0.01% | $0.03812 | 4.1639 | $0.1587 | |
BSC | <0.01% | <$0.000001 | 396,825,686.3711 | $0.1585 | |
BSC | <0.01% | $0.007431 | 21.3391 | $0.1585 | |
BSC | <0.01% | $0.000001 | 143,861.7565 | $0.1582 | |
BSC | <0.01% | $0.000471 | 334.4766 | $0.1574 | |
BSC | <0.01% | $0.017946 | 8.6295 | $0.1548 | |
BSC | <0.01% | $0.068179 | 2.2562 | $0.1538 | |
BSC | <0.01% | $1.54 | 0.0963 | $0.1482 | |
BSC | <0.01% | $0.000669 | 220.3662 | $0.1473 | |
BSC | <0.01% | $0.855369 | 0.172 | $0.1471 | |
BSC | <0.01% | $0.001681 | 82.3089 | $0.1383 | |
BSC | <0.01% | $0.00253 | 54.5868 | $0.1381 | |
BSC | <0.01% | $0.001307 | 105.207 | $0.1375 | |
BSC | <0.01% | <$0.000001 | 223,039,635.8006 | $0.1338 | |
BSC | <0.01% | $0.003222 | 41.3774 | $0.1333 | |
BSC | <0.01% | <$0.000001 | 14,206,636,621.1226 | $0.1331 | |
BSC | <0.01% | $0.000179 | 743.1169 | $0.1329 | |
BSC | <0.01% | $5.35 | 0.0248 | $0.1326 | |
BSC | <0.01% | $0.000021 | 6,340.8303 | $0.1325 | |
BSC | <0.01% | $0.011246 | 11.7481 | $0.1321 | |
BSC | <0.01% | $1.34 | 0.0966 | $0.1294 | |
BSC | <0.01% | $1 | 0.1253 | $0.1254 | |
BSC | <0.01% | $0.000001 | 151,094.2717 | $0.1231 | |
BSC | <0.01% | $0.000004 | 27,706.6304 | $0.1224 | |
BSC | <0.01% | <$0.000001 | 1,438,811,985.9845 | $0.1215 | |
BSC | <0.01% | $0.000041 | 2,941.1935 | $0.1202 | |
BSC | <0.01% | $0.002604 | 44.9516 | $0.117 | |
BSC | <0.01% | <$0.000001 | 121,829,196,296.6957 | $0.1166 | |
BSC | <0.01% | $0.004219 | 27.166 | $0.1146 | |
BSC | <0.01% | $0.001364 | 83.282 | $0.1135 | |
BSC | <0.01% | $0.000002 | 61,312.92 | $0.1123 | |
BSC | <0.01% | <$0.000001 | 243,098.6545 | $0.1117 | |
BSC | <0.01% | <$0.000001 | 554,166,552.0804 | $0.1108 | |
BSC | <0.01% | <$0.000001 | 217,276.6653 | $0.1081 | |
BSC | <0.01% | <$0.000001 | 1,080,585,864.2667 | $0.108 | |
BSC | <0.01% | <$0.000001 | 1,076,761,504.0988 | $0.1076 | |
BSC | <0.01% | $0.000081 | 1,297.7203 | $0.1053 | |
BSC | <0.01% | $0.000116 | 908.7673 | $0.105 | |
BSC | <0.01% | <$0.000001 | 133,508,790.2134 | $0.1045 | |
BSC | <0.01% | <$0.000001 | 943,708.3073 | $0.1037 | |
BSC | <0.01% | <$0.000001 | 14,918,089,659.0312 | $0.1029 | |
BSC | <0.01% | $0.002033 | 50.2766 | $0.1022 | |
BSC | <0.01% | $0.000053 | 1,906.139 | $0.1015 | |
BSC | <0.01% | $0.244613 | 0.4147 | $0.1014 | |
BSC | <0.01% | $0.00243 | 41.3616 | $0.1004 | |
BSC | <0.01% | $0.003027 | 33.166 | $0.1003 | |
BSC | <0.01% | $1,330.65 | 0.00000874 | $0.011629 | |
ETH | 0.02% | $0.006371 | 354,013.9943 | $2,255.42 | |
ETH | 0.01% | $1.26 | 1,058.3147 | $1,333.48 | |
ETH | <0.01% | $2.58 | 169.8654 | $438.25 | |
ETH | <0.01% | $2.54 | 167.7733 | $425.34 | |
ETH | <0.01% | $251.4 | 0.8542 | $214.76 | |
ETH | <0.01% | $0.008529 | 23,713.7868 | $202.25 | |
ETH | <0.01% | $0.011178 | 14,728.5393 | $164.63 | |
ETH | <0.01% | $0.000412 | 368,581.2788 | $151.74 | |
ETH | <0.01% | $0.027964 | 5,283.2563 | $147.74 | |
ETH | <0.01% | $0.00 | 662.7338 | $0.00 | |
ETH | <0.01% | $7,099.5 | 0.0141 | $99.89 | |
ETH | <0.01% | $1.01 | 94.1867 | $95.22 | |
ETH | <0.01% | $0.032823 | 2,860.3643 | $93.89 | |
ETH | <0.01% | $0.999756 | 91.2808 | $91.26 | |
ETH | <0.01% | $9.23 | 9.6816 | $89.34 | |
ETH | <0.01% | $0.011067 | 7,655.0328 | $84.72 | |
ETH | <0.01% | $0.149792 | 553.8002 | $82.95 | |
ETH | <0.01% | $4,132.71 | 0.0197 | $81.49 | |
ETH | <0.01% | $0.002876 | 27,930.9949 | $80.33 | |
ETH | <0.01% | $90.19 | 0.8829 | $79.63 | |
ETH | <0.01% | $0.005192 | 14,618.3003 | $75.9 | |
ETH | <0.01% | $83.6 | 0.8999 | $75.23 | |
ETH | <0.01% | $1.22 | 60.8887 | $74.28 | |
ETH | <0.01% | $0.000001 | 124,935,311.9433 | $69.55 | |
ETH | <0.01% | <$0.000001 | 254,667,958.0731 | $68.02 | |
ETH | <0.01% | $0.322674 | 201.968 | $65.17 | |
ETH | <0.01% | $0.602906 | 103.4763 | $62.39 | |
ETH | <0.01% | $0.584407 | 105.7837 | $61.82 | |
ETH | <0.01% | $0.162717 | 374.5433 | $60.94 | |
ETH | <0.01% | $0.863553 | 69.5286 | $60.04 | |
ETH | <0.01% | $12.34 | 4.7784 | $58.97 | |
ETH | <0.01% | $0.038797 | 1,450.5582 | $56.28 | |
ETH | <0.01% | $1.01 | 55.0251 | $55.41 | |
ETH | <0.01% | $0.000045 | 1,217,246.7963 | $54.34 | |
ETH | <0.01% | $114,912 | 0.00046739 | $53.71 | |
ETH | <0.01% | $0.000001 | 101,453,350.2577 | $53.36 | |
ETH | <0.01% | $0.007375 | 7,201.0513 | $53.11 | |
ETH | <0.01% | $0.001998 | 25,931.7103 | $51.81 | |
ETH | <0.01% | $0.267892 | 189.5888 | $50.79 | |
ETH | <0.01% | $0.055019 | 890.9015 | $49.02 | |
ETH | <0.01% | $2.24 | 21.6665 | $48.53 | |
ETH | <0.01% | <$0.000001 | 5,862,947,719,731.0635 | $48.29 | |
ETH | <0.01% | $0.000004 | 12,243,887.1519 | $48.24 | |
ETH | <0.01% | <$0.000001 | 1,119,053,250.6975 | $47.01 | |
ETH | <0.01% | $0.02647 | 1,763.8207 | $46.69 | |
ETH | <0.01% | $5,058.23 | 0.00900383 | $45.54 | |
ETH | <0.01% | $4,159.11 | 0.0108 | $45.11 | |
ETH | <0.01% | $417.98 | 0.1063 | $44.43 | |
ETH | <0.01% | $4.69 | 9.4004 | $44.09 | |
ETH | <0.01% | $0.094184 | 466.627 | $43.95 | |
ETH | <0.01% | $0.259384 | 168.0554 | $43.59 | |
ETH | <0.01% | $0.17904 | 241.6797 | $43.27 | |
ETH | <0.01% | $0.587981 | 71.8262 | $42.23 | |
ETH | <0.01% | $0.014167 | 2,948.5706 | $41.77 | |
ETH | <0.01% | $0.031754 | 1,309.1009 | $41.57 | |
ETH | <0.01% | $0.63679 | 65.121 | $41.47 | |
ETH | <0.01% | $1 | 40.8927 | $40.93 | |
ETH | <0.01% | $0.010305 | 3,838.5475 | $39.56 | |
ETH | <0.01% | $0.00803 | 4,925.3324 | $39.55 | |
ETH | <0.01% | <$0.000001 | 1,012,358,373.2539 | $38.15 | |
ETH | <0.01% | $0.012688 | 2,988.2591 | $37.91 | |
ETH | <0.01% | $0.000735 | 50,674.6869 | $37.27 | |
ETH | <0.01% | $0.715411 | 51.0997 | $36.56 | |
ETH | <0.01% | $0.301522 | 118.3979 | $35.7 | |
ETH | <0.01% | <$0.000001 | 18,117,823,176,716.277 | $34.8 | |
ETH | <0.01% | $160.15 | 0.2152 | $34.46 | |
ETH | <0.01% | $0.00014 | 246,222.1877 | $34.42 | |
ETH | <0.01% | $14.66 | 2.3249 | $34.08 | |
ETH | <0.01% | $4,414.54 | 0.00761079 | $33.6 | |
ETH | <0.01% | $0.000035 | 948,012.631 | $33.44 | |
ETH | <0.01% | $1 | 33.3131 | $33.31 | |
ETH | <0.01% | <$0.000001 | 95,204,227,139.7396 | $33.25 | |
ETH | <0.01% | $0.067979 | 488.4039 | $33.2 | |
ETH | <0.01% | $0.000003 | 9,511,462.4055 | $33.2 | |
ETH | <0.01% | $0.444734 | 74.1569 | $32.98 | |
ETH | <0.01% | $0.004278 | 7,683.641 | $32.87 | |
ETH | <0.01% | $0.037246 | 874.1885 | $32.56 | |
ETH | <0.01% | $0.000005 | 6,119,269.1824 | $32.31 | |
ETH | <0.01% | $1.83 | 17.1342 | $31.34 | |
ETH | <0.01% | $0.009902 | 3,156.514 | $31.26 | |
ETH | <0.01% | $0.003348 | 9,225.0236 | $30.88 | |
ETH | <0.01% | $0.020702 | 1,466.2999 | $30.36 | |
ETH | <0.01% | $0.098911 | 304.8698 | $30.15 | |
ETH | <0.01% | <$0.000001 | 355,000,957.7367 | $30.13 | |
ETH | <0.01% | <$0.000001 | 7,536,283,455.0011 | $29.84 | |
ETH | <0.01% | $0.040676 | 719.4983 | $29.27 | |
ETH | <0.01% | $0.209887 | 132.8312 | $27.88 | |
ETH | <0.01% | $98.52 | 0.2813 | $27.72 | |
ETH | <0.01% | <$0.000001 | 241,877,590,171.7127 | $26.57 | |
ETH | <0.01% | $0.200363 | 131.2611 | $26.3 | |
ETH | <0.01% | <$0.000001 | 363,129,299.9193 | $25.99 | |
ETH | <0.01% | $0.068779 | 375.604 | $25.83 | |
ETH | <0.01% | $0.450127 | 57.1095 | $25.71 | |
ETH | <0.01% | $0.00003 | 859,821.3717 | $25.69 | |
ETH | <0.01% | $0.038122 | 671.1346 | $25.59 | |
ETH | <0.01% | $0.29046 | 87.5102 | $25.42 | |
ETH | <0.01% | <$0.000001 | 1,834,141,964.3392 | $24.96 | |
ETH | <0.01% | <$0.000001 | 605,786,195.0625 | $24.77 | |
ETH | <0.01% | $0.368451 | 67.216 | $24.77 | |
ETH | <0.01% | $0.047404 | 522.0194 | $24.75 | |
ETH | <0.01% | $0.04781 | 517.2468 | $24.73 | |
ETH | <0.01% | $0.000302 | 81,819.8147 | $24.68 | |
ETH | <0.01% | $0.006549 | 3,730.3481 | $24.43 | |
ETH | <0.01% | $0.296983 | 77.0634 | $22.89 | |
ETH | <0.01% | $0.030467 | 747.5393 | $22.78 | |
ETH | <0.01% | $1.22 | 18.5676 | $22.68 | |
ETH | <0.01% | $0.073723 | 305.0679 | $22.49 | |
ETH | <0.01% | $0.999951 | 22.2133 | $22.21 | |
ETH | <0.01% | $0.359442 | 61.6117 | $22.15 | |
ETH | <0.01% | $4,028.01 | 0.0054882 | $22.11 | |
ETH | <0.01% | $0.000185 | 119,467.0291 | $22.1 | |
ETH | <0.01% | $0.003258 | 6,777.6694 | $22.08 | |
ETH | <0.01% | $0.014 | 1,571.8571 | $22.01 | |
ETH | <0.01% | $0.113982 | 193.0598 | $22.01 | |
ETH | <0.01% | $0.000024 | 886,609.6144 | $21.67 | |
ETH | <0.01% | $0.057816 | 368.1134 | $21.28 | |
ETH | <0.01% | $0.000005 | 3,892,298.7307 | $21.25 | |
ETH | <0.01% | $0.008028 | 2,599.2847 | $20.87 | |
ETH | <0.01% | $0.000228 | 91,243.2882 | $20.82 | |
ETH | <0.01% | $0.064538 | 318.8784 | $20.58 | |
ETH | <0.01% | $5.78 | 3.5607 | $20.57 | |
ETH | <0.01% | $17.04 | 1.1971 | $20.39 | |
ETH | <0.01% | $0.604431 | 33.3669 | $20.17 | |
ETH | <0.01% | $0.572087 | 35.2511 | $20.17 | |
ETH | <0.01% | $0.527379 | 37.8191 | $19.95 | |
ETH | <0.01% | $0.041546 | 478.4312 | $19.88 | |
ETH | <0.01% | $0.002699 | 7,286.9497 | $19.67 | |
ETH | <0.01% | $167.21 | 0.117 | $19.56 | |
ETH | <0.01% | $0.000444 | 43,976.4732 | $19.54 | |
ETH | <0.01% | <$0.000001 | 46,514,398.2326 | $19.53 | |
ETH | <0.01% | <$0.000001 | 6,789,080,140.102 | $19.31 | |
ETH | <0.01% | $0.00297 | 6,406.0925 | $19.02 | |
ETH | <0.01% | $0.003059 | 6,162.4591 | $18.85 | |
ETH | <0.01% | <$0.000001 | 6,649,603,295.3879 | $18.84 | |
ETH | <0.01% | $0.655643 | 28.709 | $18.82 | |
ETH | <0.01% | $3.87 | 4.8489 | $18.77 | |
ETH | <0.01% | $0.002102 | 8,776.9253 | $18.45 | |
ETH | <0.01% | $0.058243 | 313.7624 | $18.27 | |
ETH | <0.01% | $0.00047 | 38,441.1776 | $18.06 | |
ETH | <0.01% | <$0.000001 | 62,458,729,456.7955 | $18.04 | |
ETH | <0.01% | $0.000318 | 56,235.3636 | $17.91 | |
ETH | <0.01% | $57,671.17 | 0.00031037 | $17.9 | |
ETH | <0.01% | $159.9 | 0.1099 | $17.58 | |
ETH | <0.01% | $0.436054 | 40.1811 | $17.52 | |
ETH | <0.01% | $0.002112 | 8,136.1214 | $17.19 | |
ETH | <0.01% | $0.013977 | 1,228.3085 | $17.17 | |
ETH | <0.01% | <$0.000001 | 117,981,383.58 | $17.07 | |
ETH | <0.01% | $0.000119 | 142,966.2733 | $17.02 | |
ETH | <0.01% | $14.36 | 1.1822 | $16.98 | |
ETH | <0.01% | <$0.000001 | 6,179,851,624.5086 | $16.91 | |
ETH | <0.01% | <$0.000001 | 74,119,364.1755 | $16.77 | |
ETH | <0.01% | $0.005793 | 2,832.5179 | $16.41 | |
ETH | <0.01% | $0.002672 | 6,121.6188 | $16.35 | |
ETH | <0.01% | $1.02 | 15.9895 | $16.28 | |
ETH | <0.01% | $0.009819 | 1,633.8402 | $16.04 | |
ETH | <0.01% | $14.68 | 1.0735 | $15.76 | |
ETH | <0.01% | $0.000004 | 4,055,710.3925 | $15.61 | |
ETH | <0.01% | $1.16 | 13.2 | $15.31 | |
ETH | <0.01% | $0.00591 | 2,576.8057 | $15.23 | |
ETH | <0.01% | $0.229432 | 66.3019 | $15.21 | |
ETH | <0.01% | $0.009264 | 1,627.4504 | $15.08 | |
ETH | <0.01% | $0.001506 | 9,964.536 | $15.01 | |
ETH | <0.01% | $0.997691 | 15.0192 | $14.98 | |
ETH | <0.01% | $0.010223 | 1,464.7322 | $14.97 | |
ETH | <0.01% | $0.929022 | 16.0406 | $14.9 | |
ETH | <0.01% | $0.000269 | 54,346.6843 | $14.64 | |
ETH | <0.01% | $0.239292 | 61.009 | $14.6 | |
ETH | <0.01% | $9.65 | 1.5032 | $14.51 | |
ETH | <0.01% | $0.022273 | 646.8026 | $14.41 | |
ETH | <0.01% | $0.017342 | 825.8807 | $14.32 | |
ETH | <0.01% | $0.29853 | 47.4096 | $14.15 | |
ETH | <0.01% | $0.29661 | 47.6478 | $14.13 | |
ETH | <0.01% | $0.052489 | 262.6973 | $13.79 | |
ETH | <0.01% | $0.255635 | 53.8626 | $13.77 | |
ETH | <0.01% | $0.042725 | 322.0254 | $13.76 | |
ETH | <0.01% | $0.005249 | 2,615.3504 | $13.73 | |
ETH | <0.01% | $0.06906 | 198.1044 | $13.68 | |
ETH | <0.01% | $0.02059 | 655.0062 | $13.49 | |
ETH | <0.01% | $0.145521 | 92.2794 | $13.43 | |
ETH | <0.01% | $0.06587 | 203.683 | $13.42 | |
ETH | <0.01% | $0.000021 | 631,616.4777 | $13.42 | |
ETH | <0.01% | $0.021507 | 609.3446 | $13.11 | |
ETH | <0.01% | $0.78062 | 16.7051 | $13.04 | |
ETH | <0.01% | $2.49 | 5.1883 | $12.92 | |
ETH | <0.01% | $16.82 | 0.7635 | $12.84 | |
ETH | <0.01% | $1.22 | 10.4823 | $12.8 | |
ETH | <0.01% | $0.000352 | 36,310.8145 | $12.79 | |
ETH | <0.01% | $0.022563 | 558.6431 | $12.6 | |
ETH | <0.01% | $0.51362 | 24.5284 | $12.6 | |
ETH | <0.01% | $0.004939 | 2,549.4691 | $12.59 | |
ETH | <0.01% | $0.001113 | 11,273.7366 | $12.55 | |
ETH | <0.01% | $0.001312 | 9,537.3057 | $12.52 | |
ETH | <0.01% | $0.009787 | 1,276.3425 | $12.49 | |
ETH | <0.01% | $0.001041 | 11,835.3182 | $12.33 | |
ETH | <0.01% | $0.072085 | 169.0619 | $12.19 | |
ETH | <0.01% | $1.46 | 8.2405 | $12.05 | |
ETH | <0.01% | $71.23 | 0.1663 | $11.85 | |
ETH | <0.01% | $0.000167 | 71,011 | $11.84 | |
ETH | <0.01% | $0.008781 | 1,347.5917 | $11.83 | |
ETH | <0.01% | $0.020946 | 562.3449 | $11.78 | |
ETH | <0.01% | $0.997154 | 11.7405 | $11.71 | |
ETH | <0.01% | $1.49 | 7.7652 | $11.57 | |
ETH | <0.01% | $7.91 | 1.4454 | $11.43 | |
ETH | <0.01% | $0.00204 | 5,591.644 | $11.4 | |
ETH | <0.01% | $0.000996 | 11,364.8638 | $11.32 | |
ETH | <0.01% | $0.048963 | 230.5487 | $11.29 | |
ETH | <0.01% | $9.52 | 1.1837 | $11.27 | |
ETH | <0.01% | $0.04313 | 260.5685 | $11.24 | |
ETH | <0.01% | $0.010649 | 1,031.8682 | $10.99 | |
ETH | <0.01% | $0.036821 | 297.154 | $10.94 | |
ETH | <0.01% | $0.000458 | 23,705.7258 | $10.86 | |
ETH | <0.01% | $0.021538 | 497.4136 | $10.71 | |
ETH | <0.01% | $0.46278 | 23.0616 | $10.67 | |
ETH | <0.01% | $0.000176 | 60,253.5859 | $10.58 | |
ETH | <0.01% | $0.063198 | 166.9185 | $10.55 | |
ETH | <0.01% | $0.000016 | 646,419.439 | $10.5 | |
ETH | <0.01% | $0.005643 | 1,846.9881 | $10.42 | |
ETH | <0.01% | $0.614719 | 16.8556 | $10.36 | |
ETH | <0.01% | $0.009294 | 1,111.1122 | $10.33 | |
ETH | <0.01% | $0.000049 | 205,289.2447 | $10 | |
ETH | <0.01% | $0.003082 | 3,222.2276 | $9.93 | |
ETH | <0.01% | $0.524276 | 18.843 | $9.88 | |
ETH | <0.01% | $0.002534 | 3,844.8165 | $9.74 | |
ETH | <0.01% | $0.036394 | 267.637 | $9.74 | |
ETH | <0.01% | $1 | 9.5154 | $9.53 | |
ETH | <0.01% | $1.04 | 9.0991 | $9.49 | |
ETH | <0.01% | $0.088327 | 106.3114 | $9.39 | |
ETH | <0.01% | $0.007179 | 1,306.4431 | $9.38 | |
ETH | <0.01% | $0.0452 | 207.439 | $9.38 | |
ETH | <0.01% | $1.61 | 5.7138 | $9.22 | |
ETH | <0.01% | $0.315507 | 28.9279 | $9.13 | |
ETH | <0.01% | <$0.000001 | 31,632,042.0325 | $9.05 | |
ETH | <0.01% | $0.012605 | 716.3488 | $9.03 | |
ETH | <0.01% | $0.313532 | 28.6418 | $8.98 | |
ETH | <0.01% | <$0.000001 | 33,478,970.9985 | $8.93 | |
ETH | <0.01% | $0.031738 | 279.0125 | $8.86 | |
ETH | <0.01% | $0.024966 | 352.673 | $8.8 | |
ETH | <0.01% | $0.527302 | 16.6671 | $8.79 | |
ETH | <0.01% | $0.064403 | 135.0862 | $8.7 | |
ETH | <0.01% | $0.124248 | 69.0163 | $8.58 | |
ETH | <0.01% | $0.062764 | 136.3537 | $8.56 | |
ETH | <0.01% | $0.000001 | 12,158,100.3353 | $8.52 | |
ETH | <0.01% | $0.232102 | 36.4605 | $8.46 | |
ETH | <0.01% | $0.01278 | 656.5208 | $8.39 | |
ETH | <0.01% | $0.000469 | 17,700.9754 | $8.3 | |
ETH | <0.01% | $0.002074 | 3,981.2602 | $8.26 | |
ETH | <0.01% | <$0.000001 | 2,602,728,815.1149 | $8.16 | |
ETH | <0.01% | $0.011026 | 740.1186 | $8.16 | |
ETH | <0.01% | $4,468.09 | 0.00182375 | $8.15 | |
ETH | <0.01% | $0.000433 | 18,796 | $8.14 | |
ETH | <0.01% | $0.001941 | 4,144.7274 | $8.05 | |
ETH | <0.01% | $0.030194 | 266.2773 | $8.04 | |
ETH | <0.01% | $0.00006 | 133,293.7515 | $8 | |
ETH | <0.01% | $0.002872 | 2,784.6892 | $8 | |
ETH | <0.01% | $0.0007 | 11,367.4658 | $7.96 | |
ETH | <0.01% | $1.25 | 6.3419 | $7.93 | |
ETH | <0.01% | $0.000014 | 549,831.4157 | $7.92 | |
ETH | <0.01% | $0.074996 | 105.0638 | $7.88 | |
ETH | <0.01% | $0.00003 | 258,958.2195 | $7.77 | |
ETH | <0.01% | $0.033063 | 234.3329 | $7.75 | |
ETH | <0.01% | $0.089057 | 85.3802 | $7.6 | |
ETH | <0.01% | $0.019121 | 397.6315 | $7.6 | |
ETH | <0.01% | $0.031466 | 241.3462 | $7.59 | |
ETH | <0.01% | $0.118545 | 64.024 | $7.59 | |
ETH | <0.01% | $2.7 | 2.8023 | $7.57 | |
ETH | <0.01% | <$0.000001 | 227,881,755.8267 | $7.55 | |
ETH | <0.01% | $0.003109 | 2,412.3309 | $7.5 | |
ETH | <0.01% | $0.044137 | 169.2059 | $7.47 | |
ETH | <0.01% | $0.041795 | 174.6738 | $7.3 | |
ETH | <0.01% | $0.072051 | 100.9838 | $7.28 | |
ETH | <0.01% | $0.07348 | 98.7227 | $7.25 | |
ETH | <0.01% | $0.017807 | 404.9077 | $7.21 | |
ETH | <0.01% | $0.004683 | 1,533.9952 | $7.18 | |
ETH | <0.01% | $0.000041 | 174,183.7767 | $7.12 | |
ETH | <0.01% | $5.13 | 1.3797 | $7.08 | |
ETH | <0.01% | $0.00311 | 2,253.6493 | $7.01 | |
ETH | <0.01% | $0.001881 | 3,721.5705 | $7 | |
ETH | <0.01% | <$0.000001 | 109,605,817,965.2907 | $6.99 | |
ETH | <0.01% | $0.009889 | 701.8135 | $6.94 | |
ETH | <0.01% | $0.011237 | 610.0719 | $6.86 | |
ETH | <0.01% | $0.051733 | 131.8716 | $6.82 | |
ETH | <0.01% | $0.16269 | 41.8228 | $6.8 | |
ETH | <0.01% | $0.786021 | 8.6446 | $6.79 | |
ETH | <0.01% | $0.065408 | 103.8783 | $6.79 | |
ETH | <0.01% | $0.038962 | 169.4857 | $6.6 | |
ETH | <0.01% | $0.233112 | 28.3236 | $6.6 | |
ETH | <0.01% | $0.005742 | 1,149.0591 | $6.6 | |
ETH | <0.01% | $0.013541 | 486.0707 | $6.58 | |
ETH | <0.01% | $0.03544 | 181.0554 | $6.42 | |
ETH | <0.01% | $0.009 | 710.2133 | $6.39 | |
ETH | <0.01% | $0.000633 | 10,059.5647 | $6.37 | |
ETH | <0.01% | $0.01488 | 426.1 | $6.34 | |
ETH | <0.01% | $1,487.74 | 0.0042592 | $6.34 | |
ETH | <0.01% | $0.010261 | 598.7515 | $6.14 | |
ETH | <0.01% | $0.000022 | 277,486.2649 | $6.1 | |
ETH | <0.01% | $0.006287 | 968.8003 | $6.09 | |
ETH | <0.01% | $0.21819 | 27.6983 | $6.04 | |
ETH | <0.01% | $0.014769 | 408.8006 | $6.04 | |
ETH | <0.01% | <$0.000001 | 796,126,914.8531 | $5.98 | |
ETH | <0.01% | $0.676984 | 8.7979 | $5.96 | |
ETH | <0.01% | $22.64 | 0.2584 | $5.85 | |
ETH | <0.01% | $1 | 5.8389 | $5.84 | |
ETH | <0.01% | <$0.000001 | 700,033,124.4583 | $5.81 | |
ETH | <0.01% | $0.006534 | 872.8196 | $5.7 | |
ETH | <0.01% | $0.005634 | 994.3115 | $5.6 | |
ETH | <0.01% | $0.894626 | 6.2326 | $5.58 | |
ETH | <0.01% | $0.010374 | 535.906 | $5.56 | |
ETH | <0.01% | $0.010909 | 490.3538 | $5.35 | |
ETH | <0.01% | $0.059067 | 89.8951 | $5.31 | |
ETH | <0.01% | $0.000132 | 40,098.6539 | $5.28 | |
ETH | <0.01% | $0.014028 | 375.1949 | $5.26 | |
ETH | <0.01% | $0.165873 | 31.6998 | $5.26 | |
ETH | <0.01% | $0.156929 | 33.0812 | $5.19 | |
ETH | <0.01% | $0.201118 | 25.7025 | $5.17 | |
ETH | <0.01% | $0.358524 | 14.4018 | $5.16 | |
ETH | <0.01% | $0.333495 | 15.346 | $5.12 | |
ETH | <0.01% | $0.001145 | 4,456.0794 | $5.1 | |
ETH | <0.01% | $0.003578 | 1,421.0589 | $5.08 | |
ETH | <0.01% | $0.000067 | 75,146.1862 | $5.04 | |
ETH | <0.01% | $0.000015 | 342,152.4267 | $5.03 | |
ETH | <0.01% | $0.409703 | 12.2671 | $5.03 | |
ETH | <0.01% | $0.04256 | 117.5803 | $5 | |
ETH | <0.01% | $0.046729 | 106.3968 | $4.97 | |
ETH | <0.01% | $0.069185 | 71.7835 | $4.97 | |
ETH | <0.01% | $0.002898 | 1,706.2146 | $4.94 | |
ETH | <0.01% | <$0.000001 | 362,418,597.7422 | $4.94 | |
ETH | <0.01% | $0.073209 | 67.0477 | $4.91 | |
ETH | <0.01% | <$0.000001 | 7,702,292,505,798.5469 | $4.9 | |
ETH | <0.01% | $0.014598 | 330.0339 | $4.82 | |
ETH | <0.01% | $0.000013 | 361,970.829 | $4.77 | |
ETH | <0.01% | $0.051428 | 92.3734 | $4.75 | |
ETH | <0.01% | $0.000174 | 27,068.6062 | $4.72 | |
ETH | <0.01% | $0.000877 | 5,312.5255 | $4.66 | |
ETH | <0.01% | <$0.000001 | 131,779,783.9421 | $4.66 | |
ETH | <0.01% | $0.001381 | 3,358 | $4.64 | |
ETH | <0.01% | $0.00098 | 4,707.8392 | $4.61 | |
ETH | <0.01% | $1.18 | 3.8765 | $4.57 | |
ETH | <0.01% | $0.001322 | 3,458.3077 | $4.57 | |
ETH | <0.01% | $0.001002 | 4,549.3079 | $4.56 | |
ETH | <0.01% | $4,130.62 | 0.00110105 | $4.55 | |
ETH | <0.01% | $0.005475 | 829.0853 | $4.54 | |
ETH | <0.01% | $0.000293 | 15,406.7959 | $4.51 | |
ETH | <0.01% | $0.003504 | 1,278.9995 | $4.48 | |
ETH | <0.01% | $0.17223 | 26.0111 | $4.48 | |
ETH | <0.01% | $97.8 | 0.0457 | $4.47 | |
ETH | <0.01% | $114,492.7 | 0.0000389 | $4.45 | |
ETH | <0.01% | $6.42 | 0.6892 | $4.42 | |
ETH | <0.01% | $12.32 | 0.3537 | $4.36 | |
ETH | <0.01% | <$0.000001 | 7,451,991,585.7836 | $4.32 | |
ETH | <0.01% | $0.004779 | 899.8472 | $4.3 | |
ETH | <0.01% | $0.006206 | 691.9583 | $4.29 | |
ETH | <0.01% | $0.000179 | 23,621.0938 | $4.22 | |
ETH | <0.01% | $0.011903 | 354.1876 | $4.22 | |
ETH | <0.01% | $10.8 | 0.3893 | $4.2 | |
ETH | <0.01% | $34.68 | 0.1207 | $4.19 | |
ETH | <0.01% | $0.367362 | 11.3771 | $4.18 | |
ETH | <0.01% | $0.11817 | 35.1432 | $4.15 | |
ETH | <0.01% | $0.00002 | 203,973.3617 | $4.13 | |
ETH | <0.01% | $0.02941 | 140.2339 | $4.12 | |
ETH | <0.01% | $332.48 | 0.0124 | $4.11 | |
ETH | <0.01% | $0.166521 | 24.1351 | $4.02 | |
ETH | <0.01% | $0.000002 | 2,354,216.2664 | $4 | |
ETH | <0.01% | $0.000219 | 18,185.5 | $3.99 | |
ETH | <0.01% | $0.001486 | 2,643.6084 | $3.93 | |
ETH | <0.01% | $0.020608 | 189.7576 | $3.91 | |
ETH | <0.01% | $0.477311 | 8.1633 | $3.9 | |
ETH | <0.01% | $0.000126 | 30,415.3317 | $3.83 | |
ETH | <0.01% | $0.226667 | 16.803 | $3.81 | |
ETH | <0.01% | $0.02058 | 180.9042 | $3.72 | |
ETH | <0.01% | $0.017417 | 213.536 | $3.72 | |
ETH | <0.01% | $0.042976 | 85.2611 | $3.66 | |
ETH | <0.01% | $0.007262 | 500.5003 | $3.63 | |
ETH | <0.01% | $0.000484 | 7,283.6548 | $3.53 | |
ETH | <0.01% | $0.003422 | 1,027.1608 | $3.51 | |
ETH | <0.01% | $0.005266 | 661.691 | $3.48 | |
ETH | <0.01% | <$0.000001 | 122,029,747.7241 | $3.48 | |
ETH | <0.01% | $0.040024 | 86.1451 | $3.45 | |
ETH | <0.01% | $0.139104 | 24.6796 | $3.43 | |
ETH | <0.01% | <$0.000001 | 644,772,423.3893 | $3.43 | |
ETH | <0.01% | $0.003091 | 1,107.6062 | $3.42 | |
ETH | <0.01% | $0.013115 | 260.9126 | $3.42 | |
ETH | <0.01% | $0.013115 | 260.9126 | $3.42 | |
ETH | <0.01% | $5,778.25 | 0.00059008 | $3.41 | |
ETH | <0.01% | $0.431535 | 7.896 | $3.41 | |
ETH | <0.01% | <$0.000001 | 6,670,459,250.3983 | $3.35 | |
ETH | <0.01% | $0.334163 | 9.9954 | $3.34 | |
ETH | <0.01% | $0.000001 | 5,415,101.5164 | $3.3 | |
ETH | <0.01% | $0.000251 | 13,140.78 | $3.29 | |
ETH | <0.01% | $0.000601 | 5,456.1261 | $3.28 | |
ETH | <0.01% | $21.92 | 0.1495 | $3.28 | |
ETH | <0.01% | $0.006434 | 505.4572 | $3.25 | |
ETH | <0.01% | $21.32 | 0.1518 | $3.24 | |
ETH | <0.01% | $1.25 | 2.5689 | $3.21 | |
ETH | <0.01% | $0.003589 | 892.0367 | $3.2 | |
ETH | <0.01% | $4,484.27 | 0.00071157 | $3.19 | |
ETH | <0.01% | $1.25 | 2.5306 | $3.16 | |
ETH | <0.01% | $0.007211 | 438.2382 | $3.16 | |
ETH | <0.01% | $0.200751 | 15.7072 | $3.15 | |
ETH | <0.01% | $0.0081 | 388.3221 | $3.15 | |
ETH | <0.01% | $0.000106 | 29,405.1891 | $3.13 | |
ETH | <0.01% | $0.001458 | 2,140 | $3.12 | |
ETH | <0.01% | $1 | 3.1157 | $3.12 | |
ETH | <0.01% | $0.104419 | 29.7207 | $3.1 | |
ETH | <0.01% | $0.015477 | 198.5357 | $3.07 | |
ETH | <0.01% | $0.017026 | 180.2128 | $3.07 | |
ETH | <0.01% | $0.001264 | 2,393.3361 | $3.02 | |
ETH | <0.01% | $0.008361 | 353.2398 | $2.95 | |
ETH | <0.01% | $0.001193 | 2,474.8185 | $2.95 | |
ETH | <0.01% | $0.005693 | 517.9824 | $2.95 | |
ETH | <0.01% | $0.000009 | 343,904.5702 | $2.94 | |
ETH | <0.01% | $0.046775 | 62.4518 | $2.92 | |
ETH | <0.01% | $0.000913 | 3,185.1512 | $2.91 | |
ETH | <0.01% | $0.00052 | 5,546.4891 | $2.89 | |
ETH | <0.01% | $0.020297 | 141.8732 | $2.88 | |
ETH | <0.01% | <$0.000001 | 57,247,047.4534 | $2.85 | |
ETH | <0.01% | $0.023945 | 118.9514 | $2.85 | |
ETH | <0.01% | $0.000725 | 3,927.3104 | $2.85 | |
ETH | <0.01% | <$0.000001 | 31,319,607.6978 | $2.82 | |
ETH | <0.01% | $0.000001 | 1,948,078.2642 | $2.82 | |
ETH | <0.01% | $0.092678 | 29.8378 | $2.77 | |
ETH | <0.01% | $0.001028 | 2,645.2751 | $2.72 | |
ETH | <0.01% | $0.000467 | 5,800.3048 | $2.71 | |
ETH | <0.01% | <$0.000001 | 713,378,376.8977 | $2.71 | |
ETH | <0.01% | $0.000252 | 10,752.6099 | $2.71 | |
ETH | <0.01% | $0.081433 | 32.6868 | $2.66 | |
ETH | <0.01% | $0.003881 | 677.2708 | $2.63 | |
ETH | <0.01% | $0.132454 | 19.7299 | $2.61 | |
ETH | <0.01% | $0.003632 | 713.1242 | $2.59 | |
ETH | <0.01% | $0.190489 | 13.5596 | $2.58 | |
ETH | <0.01% | $1.59 | 1.6107 | $2.56 | |
ETH | <0.01% | $0.220592 | 11.5967 | $2.56 | |
ETH | <0.01% | $0.024362 | 104.829 | $2.55 | |
ETH | <0.01% | $0.0043 | 586.8138 | $2.52 | |
ETH | <0.01% | $0.024603 | 101.6393 | $2.5 | |
ETH | <0.01% | $0.00 | 144,794.8903 | $0.00 | |
ETH | <0.01% | $0.001567 | 1,589.5632 | $2.49 | |
ETH | <0.01% | $55.43 | 0.0449 | $2.49 | |
ETH | <0.01% | $0.001422 | 1,730.0793 | $2.46 | |
ETH | <0.01% | $0.003154 | 779.67 | $2.46 | |
ETH | <0.01% | $0.057831 | 42.364 | $2.45 | |
ETH | <0.01% | $0.000486 | 4,971.8871 | $2.42 | |
ETH | <0.01% | $0.02736 | 87.7671 | $2.4 | |
ETH | <0.01% | $0.006282 | 382.0486 | $2.4 | |
ETH | <0.01% | $0.000801 | 2,997.6515 | $2.4 | |
ETH | <0.01% | $0.005947 | 402.9429 | $2.4 | |
ETH | <0.01% | $0.005544 | 431.4546 | $2.39 | |
ETH | <0.01% | $0.000234 | 10,204.2217 | $2.38 | |
ETH | <0.01% | $0.000003 | 897,608.6842 | $2.38 | |
ETH | <0.01% | $0.161008 | 14.6198 | $2.35 | |
ETH | <0.01% | <$0.000001 | 3,936,059,689.1904 | $2.33 | |
ETH | <0.01% | $0.000668 | 3,462.4907 | $2.31 | |
ETH | <0.01% | $0.000002 | 970,290.883 | $2.31 | |
ETH | <0.01% | $0.522314 | 4.4159 | $2.31 | |
ETH | <0.01% | $0.001113 | 2,064.7493 | $2.3 | |
ETH | <0.01% | $0.010089 | 224.067 | $2.26 | |
ETH | <0.01% | $0.013713 | 164.1962 | $2.25 | |
ETH | <0.01% | <$0.000001 | 6,896,275,985.8208 | $2.23 | |
ETH | <0.01% | $0.000389 | 5,695.1999 | $2.22 | |
ETH | <0.01% | $0.009732 | 227.5982 | $2.21 | |
ETH | <0.01% | $0.000046 | 47,887.743 | $2.18 | |
ETH | <0.01% | $0.032572 | 66.3171 | $2.16 | |
ETH | <0.01% | $7.99 | 0.2695 | $2.15 | |
ETH | <0.01% | $0.138989 | 15.4402 | $2.15 | |
ETH | <0.01% | $0.128978 | 16.4745 | $2.12 | |
ETH | <0.01% | $0.000059 | 35,411.8894 | $2.11 | |
ETH | <0.01% | $1,324.81 | 0.00158684 | $2.1 | |
ETH | <0.01% | $2.02 | 1 | $2.02 | |
ETH | <0.01% | $0.057687 | 34.7381 | $2 | |
ETH | <0.01% | $14.11 | 0.1419 | $2 | |
ETH | <0.01% | $0.00015 | 13,168.5973 | $1.97 | |
ETH | <0.01% | $0.004375 | 450.0652 | $1.97 | |
ETH | <0.01% | $0.17312 | 11.1057 | $1.92 | |
ETH | <0.01% | <$0.000001 | 230,705,144.8653 | $1.91 | |
ETH | <0.01% | $0.000944 | 1,982.6495 | $1.87 | |
ETH | <0.01% | $0.253356 | 7.3246 | $1.86 | |
ETH | <0.01% | $0.000441 | 4,118.9304 | $1.82 | |
ETH | <0.01% | $0.0005 | 3,624.5644 | $1.81 | |
ETH | <0.01% | $0.000001 | 2,821,757 | $1.81 | |
ETH | <0.01% | <$0.000001 | 39,772,685.6568 | $1.78 | |
ETH | <0.01% | $0.178858 | 9.907 | $1.77 | |
ETH | <0.01% | $0.000843 | 2,099.2401 | $1.77 | |
ETH | <0.01% | $0.192973 | 9.1202 | $1.76 | |
ETH | <0.01% | $0.001921 | 912.64 | $1.75 | |
ETH | <0.01% | $0.000223 | 7,857.813 | $1.75 | |
ETH | <0.01% | $0.025618 | 68.2109 | $1.75 | |
ETH | <0.01% | $0.47558 | 3.6679 | $1.74 | |
ETH | <0.01% | $0.005812 | 299.5988 | $1.74 | |
ETH | <0.01% | $0.005203 | 331.042 | $1.72 | |
ETH | <0.01% | <$0.000001 | 2,005,186,034.278 | $1.71 | |
ETH | <0.01% | $0.006148 | 275.1186 | $1.69 | |
ETH | <0.01% | $0.000003 | 561,308.6958 | $1.68 | |
ETH | <0.01% | $4,350.25 | 0.00038529 | $1.68 | |
ETH | <0.01% | $0.000199 | 8,390.6838 | $1.67 | |
ETH | <0.01% | $0.003536 | 467.2833 | $1.65 | |
ETH | <0.01% | $0.001109 | 1,485.198 | $1.65 | |
ETH | <0.01% | $0.231136 | 7.1063 | $1.64 | |
ETH | <0.01% | $0.000004 | 432,562.5618 | $1.62 | |
ETH | <0.01% | $0.001352 | 1,194.0841 | $1.61 | |
ETH | <0.01% | $0.001141 | 1,397.9727 | $1.6 | |
ETH | <0.01% | $0.001434 | 1,107 | $1.59 | |
ETH | <0.01% | $0.010979 | 144.0655 | $1.58 | |
ETH | <0.01% | $0.00868 | 182.1968 | $1.58 | |
ETH | <0.01% | $0.016941 | 92.0598 | $1.56 | |
ETH | <0.01% | $0.000324 | 4,806.1413 | $1.56 | |
ETH | <0.01% | $0.093919 | 16.5695 | $1.56 | |
ETH | <0.01% | <$0.000001 | 23,618,655.351 | $1.52 | |
ETH | <0.01% | $2.13 | 0.7103 | $1.51 | |
ETH | <0.01% | $0.008382 | 179.8003 | $1.51 | |
ETH | <0.01% | <$0.000001 | 57,512,452,007,472,288 | $1.5 | |
ETH | <0.01% | $0.001192 | 1,237.5312 | $1.48 | |
ETH | <0.01% | $0.000067 | 22,106.4451 | $1.47 | |
ETH | <0.01% | $0.002179 | 675.3957 | $1.47 | |
ETH | <0.01% | $0.055134 | 26.5332 | $1.46 | |
ETH | <0.01% | $2.99 | 0.4882 | $1.46 | |
ETH | <0.01% | $0.004377 | 332.1855 | $1.45 | |
ETH | <0.01% | $0.001499 | 961.4289 | $1.44 | |
ETH | <0.01% | $0.00104 | 1,380.3878 | $1.43 | |
ETH | <0.01% | $0.000228 | 6,275.999 | $1.43 | |
ETH | <0.01% | $0.000336 | 4,233.1138 | $1.42 | |
ETH | <0.01% | $0.001419 | 997.452 | $1.41 | |
ETH | <0.01% | $0.001488 | 937.2117 | $1.39 | |
ETH | <0.01% | $0.010934 | 125.848 | $1.38 | |
ETH | <0.01% | $0.000199 | 6,837.0264 | $1.36 | |
ETH | <0.01% | $0.000084 | 15,985.3826 | $1.35 | |
ETH | <0.01% | $0.200922 | 6.6786 | $1.34 | |
ETH | <0.01% | $0.004333 | 301.0391 | $1.3 | |
ETH | <0.01% | $0.000499 | 2,604.1194 | $1.3 | |
ETH | <0.01% | $0.000187 | 6,919.3818 | $1.29 | |
ETH | <0.01% | $0.051951 | 24.5911 | $1.28 | |
ETH | <0.01% | $0.047345 | 26.906 | $1.27 | |
ETH | <0.01% | $0.294877 | 4.3053 | $1.27 | |
ETH | <0.01% | $0.205372 | 6.1405 | $1.26 | |
ETH | <0.01% | $0.00975 | 128.2585 | $1.25 | |
ETH | <0.01% | $1.64 | 0.7545 | $1.24 | |
ETH | <0.01% | $0.00446 | 277.0023 | $1.24 | |
ETH | <0.01% | $8.48 | 0.1447 | $1.23 | |
ETH | <0.01% | $0.161136 | 7.5667 | $1.22 | |
ETH | <0.01% | <$0.000001 | 7,131,022.628 | $1.19 | |
ETH | <0.01% | $0.030154 | 39.405 | $1.19 | |
ETH | <0.01% | $17.11 | 0.069 | $1.18 | |
ETH | <0.01% | $0.3488 | 3.3841 | $1.18 | |
ETH | <0.01% | $0.429244 | 2.7304 | $1.17 | |
ETH | <0.01% | $0.000013 | 90,697.1798 | $1.17 | |
ETH | <0.01% | $0.043241 | 26.4869 | $1.15 | |
ETH | <0.01% | $4,157.96 | 0.00027545 | $1.15 | |
ETH | <0.01% | $0.002641 | 431.3689 | $1.14 | |
ETH | <0.01% | <$0.000001 | 9,015,224.7137 | $1.13 | |
ETH | <0.01% | $13.28 | 0.0846 | $1.12 | |
ETH | <0.01% | $0.00046 | 2,441.0016 | $1.12 | |
ETH | <0.01% | $0.152533 | 7.3483 | $1.12 | |
ETH | <0.01% | $0.000994 | 1,127.6813 | $1.12 | |
ETH | <0.01% | $0.00405 | 276.6988 | $1.12 | |
ETH | <0.01% | $0.242824 | 4.6075 | $1.12 | |
ETH | <0.01% | $18.08 | 0.0618 | $1.12 | |
ETH | <0.01% | $0.006353 | 174.2797 | $1.11 | |
ETH | <0.01% | $0.000016 | 67,400.6947 | $1.08 | |
ETH | <0.01% | $0.000329 | 3,209.2724 | $1.06 | |
ETH | <0.01% | $0.000268 | 3,916.8046 | $1.05 | |
ETH | <0.01% | $0.000038 | 27,354.2391 | $1.05 | |
ETH | <0.01% | $0.000516 | 2,007.2587 | $1.04 | |
ETH | <0.01% | $0.000876 | 1,175.9628 | $1.03 | |
ETH | <0.01% | $0.066431 | 15.4329 | $1.03 | |
ETH | <0.01% | $0.08453 | 12.027 | $1.02 | |
ETH | <0.01% | $0.000283 | 3,588.1214 | $1.02 | |
ETH | <0.01% | $0.000542 | 1,851.1342 | $1 | |
ETH | <0.01% | $0.000083 | 12,068.767 | $1 | |
ETH | <0.01% | $0.008275 | 120.3506 | $0.9959 | |
ETH | <0.01% | $0.030608 | 32.2861 | $0.9882 | |
ETH | <0.01% | $0.000744 | 1,325.9848 | $0.9861 | |
ETH | <0.01% | $0.00006 | 16,098.0876 | $0.9684 | |
ETH | <0.01% | $0.003272 | 294.3181 | $0.963 | |
ETH | <0.01% | $0.006462 | 148.4688 | $0.9594 | |
ETH | <0.01% | $0.00376 | 253.1828 | $0.9518 | |
ETH | <0.01% | $0.346905 | 2.741 | $0.9508 | |
ETH | <0.01% | $0.000002 | 398,544.5653 | $0.9365 | |
ETH | <0.01% | $0.000011 | 85,686.2938 | $0.9245 | |
ETH | <0.01% | $0.017946 | 51.1963 | $0.9187 | |
ETH | <0.01% | $0.496902 | 1.8276 | $0.9081 | |
ETH | <0.01% | $76.1 | 0.0119 | $0.9023 | |
ETH | <0.01% | $0.002125 | 423.3728 | $0.8998 | |
ETH | <0.01% | $0.000775 | 1,156.5905 | $0.8964 | |
ETH | <0.01% | $0.000381 | 2,338.2704 | $0.892 | |
ETH | <0.01% | $0.018396 | 47.9703 | $0.8824 | |
ETH | <0.01% | $0.0007 | 1,254.0874 | $0.8783 | |
ETH | <0.01% | $0.003671 | 237.2769 | $0.871 | |
ETH | <0.01% | $0.06492 | 13.3955 | $0.8696 | |
ETH | <0.01% | $0.003886 | 221.2978 | $0.8599 | |
ETH | <0.01% | $0.000944 | 909.9774 | $0.8586 | |
ETH | <0.01% | <$0.000001 | 318,037,696.2098 | $0.8552 | |
ETH | <0.01% | $0.001726 | 490.1207 | $0.8459 | |
ETH | <0.01% | $0.000058 | 14,495.0159 | $0.8365 | |
ETH | <0.01% | $1.17 | 0.6989 | $0.8177 | |
ETH | <0.01% | <$0.000001 | 1,255,815,362.2743 | $0.8078 | |
ETH | <0.01% | $1.16 | 0.6919 | $0.8031 | |
ETH | <0.01% | $1.16 | 0.6919 | $0.8031 | |
ETH | <0.01% | $0.000005 | 152,399.9642 | $0.80 | |
ETH | <0.01% | $0.036213 | 21.9486 | $0.7948 | |
ETH | <0.01% | <$0.000001 | 7,222,288.1516 | $0.7938 | |
ETH | <0.01% | $0.006294 | 123.5025 | $0.7773 | |
ETH | <0.01% | $0.000251 | 3,101.0237 | $0.777 | |
ETH | <0.01% | $0.000252 | 3,038.9492 | $0.7667 | |
ETH | <0.01% | $0.047925 | 15.6924 | $0.752 | |
ETH | <0.01% | $0.003222 | 233.3044 | $0.7517 | |
ETH | <0.01% | $0.259367 | 2.8233 | $0.7322 | |
ETH | <0.01% | $0.000015 | 49,650.8023 | $0.7204 | |
ETH | <0.01% | $0.096684 | 7.3287 | $0.7085 | |
ETH | <0.01% | $0.003796 | 186.0042 | $0.706 | |
ETH | <0.01% | $0.170036 | 4.1429 | $0.7044 | |
ETH | <0.01% | <$0.000001 | 6,322,861.4263 | $0.7017 | |
ETH | <0.01% | $0.003728 | 185 | $0.6896 | |
ETH | <0.01% | $0.000515 | 1,336.5911 | $0.6887 | |
ETH | <0.01% | <$0.000001 | 5,261,208.0828 | $0.6839 | |
ETH | <0.01% | $0.000026 | 26,255.4204 | $0.6779 | |
ETH | <0.01% | $155.24 | 0.0043601 | $0.6768 | |
ETH | <0.01% | $0.000653 | 1,026.9921 | $0.6707 | |
ETH | <0.01% | $0.000048 | 13,978.3925 | $0.6685 | |
ETH | <0.01% | $0.000422 | 1,582.4391 | $0.6679 | |
ETH | <0.01% | $0.004045 | 164.2147 | $0.6642 | |
ETH | <0.01% | $0.152392 | 4.3414 | $0.6615 | |
ETH | <0.01% | $0.000002 | 356,962.9089 | $0.6568 | |
ETH | <0.01% | $0.000133 | 4,906.3456 | $0.6526 | |
ETH | <0.01% | $0.017772 | 36.6272 | $0.6509 | |
ETH | <0.01% | $0.000357 | 1,803.291 | $0.644 | |
ETH | <0.01% | $0.00007 | 9,093.8239 | $0.6354 | |
ETH | <0.01% | $0.00003 | 21,065.9856 | $0.6324 | |
ETH | <0.01% | $0.000137 | 4,507.4502 | $0.6174 | |
ETH | <0.01% | $0.781752 | 0.7883 | $0.6162 | |
ETH | <0.01% | $0.152936 | 3.9603 | $0.6056 | |
ETH | <0.01% | $9 | 0.0669 | $0.602 | |
ETH | <0.01% | $0.065257 | 9.2153 | $0.6013 | |
ETH | <0.01% | $0.000625 | 962.1865 | $0.6011 | |
ETH | <0.01% | $0.026816 | 22.1017 | $0.5926 | |
ETH | <0.01% | $0.01212 | 47.1264 | $0.5711 | |
ETH | <0.01% | $1.12 | 0.5096 | $0.5707 | |
ETH | <0.01% | $0.007811 | 72.1903 | $0.5638 | |
ETH | <0.01% | $0.000039 | 14,313.0241 | $0.5533 | |
ETH | <0.01% | $0.004018 | 137.7077 | $0.5533 | |
ETH | <0.01% | $0.00001 | 56,673.4042 | $0.5481 | |
ETH | <0.01% | $0.085498 | 6.3753 | $0.545 | |
ETH | <0.01% | $0.034279 | 15.8991 | $0.5449 | |
ETH | <0.01% | $0.009543 | 56.862 | $0.5426 | |
ETH | <0.01% | $0.232439 | 2.3166 | $0.5384 | |
ETH | <0.01% | $0.000963 | 557.5858 | $0.5367 | |
ETH | <0.01% | $0.013056 | 41.0582 | $0.536 | |
ETH | <0.01% | $0.032561 | 16.1752 | $0.5266 | |
ETH | <0.01% | $0.000273 | 1,913.1192 | $0.5221 | |
ETH | <0.01% | $0.022959 | 22.5148 | $0.5169 | |
ETH | <0.01% | <$0.000001 | 176,886,833.5706 | $0.515 | |
ETH | <0.01% | $0.017536 | 29.2425 | $0.5127 | |
ETH | <0.01% | $0.002229 | 229.4513 | $0.5114 | |
ETH | <0.01% | $0.015185 | 33.6108 | $0.5103 | |
ETH | <0.01% | $0.000257 | 1,955.3898 | $0.5032 | |
ETH | <0.01% | $0.046552 | 10.6857 | $0.4974 | |
ETH | <0.01% | <$0.000001 | 51,196,146.7754 | $0.4913 | |
ETH | <0.01% | $0.000884 | 554.3723 | $0.4901 | |
ETH | <0.01% | $0.00036 | 1,349.825 | $0.4856 | |
ETH | <0.01% | $0.000001 | 415,386.904 | $0.4818 | |
ETH | <0.01% | $0.021344 | 22.2566 | $0.475 | |
ETH | <0.01% | $0.009614 | 48.0927 | $0.4623 | |
ETH | <0.01% | $0.000458 | 990.5609 | $0.4538 | |
ETH | <0.01% | $0.004853 | 92.6971 | $0.4498 | |
ETH | <0.01% | $0.000471 | 946.5608 | $0.4455 | |
ETH | <0.01% | $0.064526 | 6.8931 | $0.4447 | |
ETH | <0.01% | $0.00014 | 3,151.0578 | $0.4425 | |
ETH | <0.01% | $0.000332 | 1,320.716 | $0.4387 | |
ETH | <0.01% | $2.46 | 0.1781 | $0.438 | |
ETH | <0.01% | <$0.000001 | 21,702,904.0014 | $0.4321 | |
ETH | <0.01% | $0.046366 | 9.2992 | $0.4311 | |
ETH | <0.01% | $4,594.1 | 0.00009296 | $0.427 | |
ETH | <0.01% | $0.020624 | 20.5407 | $0.4236 | |
ETH | <0.01% | $0.005078 | 82.8741 | $0.4208 | |
ETH | <0.01% | <$0.000001 | 360,195,408.1182 | $0.4175 | |
ETH | <0.01% | $0.000255 | 1,634.6814 | $0.4162 | |
ETH | <0.01% | $0.000341 | 1,209.5485 | $0.4126 | |
ETH | <0.01% | $0.199392 | 2.0648 | $0.4117 | |
ETH | <0.01% | <$0.000001 | 5,919,595,485,320.9668 | $0.4089 | |
ETH | <0.01% | $0.000078 | 5,243.7477 | $0.4082 | |
ETH | <0.01% | $0.000027 | 14,755.3314 | $0.4014 | |
ETH | <0.01% | $0.12924 | 3.0469 | $0.3937 | |
ETH | <0.01% | $0.004585 | 85.826 | $0.3935 | |
ETH | <0.01% | $0.006414 | 61.3354 | $0.3934 | |
ETH | <0.01% | $0.005917 | 66.0777 | $0.3909 | |
ETH | <0.01% | $0.000183 | 2,133.0412 | $0.3905 | |
ETH | <0.01% | $0.009165 | 41.8349 | $0.3834 | |
ETH | <0.01% | $0.003521 | 108.7576 | $0.3829 | |
ETH | <0.01% | $0.000016 | 24,038.4918 | $0.3774 | |
ETH | <0.01% | <$0.000001 | 1,879,277,810,155.58 | $0.3703 | |
ETH | <0.01% | $0.009834 | 37.6371 | $0.3701 | |
ETH | <0.01% | $0.000002 | 225,488.9703 | $0.3675 | |
ETH | <0.01% | $0.000472 | 763.4569 | $0.3601 | |
ETH | <0.01% | $0.008069 | 44.3444 | $0.3578 | |
ETH | <0.01% | $0.067327 | 5.2936 | $0.3564 | |
ETH | <0.01% | $0.031762 | 11.1874 | $0.3553 | |
ETH | <0.01% | $0.042481 | 8.1361 | $0.3456 | |
ETH | <0.01% | $0.000006 | 59,802.14 | $0.3301 | |
ETH | <0.01% | $2.01 | 0.1629 | $0.3268 | |
ETH | <0.01% | $0.000485 | 662.4627 | $0.321 | |
ETH | <0.01% | <$0.000001 | 66,526,283,484 | $0.3187 | |
ETH | <0.01% | <$0.000001 | 59,351,591,348.7481 | $0.3123 | |
ETH | <0.01% | $0.012561 | 24.1233 | $0.303 | |
ETH | <0.01% | $0.002747 | 110.3027 | $0.3029 | |
ETH | <0.01% | $0.017394 | 17.3629 | $0.302 | |
ETH | <0.01% | $0.025426 | 11.8556 | $0.3014 | |
ETH | <0.01% | $0.000537 | 555.2505 | $0.2979 | |
ETH | <0.01% | $0.028296 | 10.4381 | $0.2953 | |
ETH | <0.01% | $0.014697 | 20.0049 | $0.294 | |
ETH | <0.01% | $0.001774 | 162.4806 | $0.2883 | |
ETH | <0.01% | $0.00449 | 63.7429 | $0.2862 | |
ETH | <0.01% | <$0.000001 | 728,872.1771 | $0.2833 | |
ETH | <0.01% | $0.001574 | 178.0387 | $0.2802 | |
ETH | <0.01% | $0.000529 | 509.1793 | $0.2694 | |
ETH | <0.01% | $0.002759 | 97.5415 | $0.2691 | |
ETH | <0.01% | $0.00023 | 1,158.9272 | $0.2664 | |
ETH | <0.01% | $0.000035 | 7,505.691 | $0.2654 | |
ETH | <0.01% | $0.300882 | 0.8732 | $0.2627 | |
ETH | <0.01% | <$0.000001 | 176,973,029.3878 | $0.262 | |
ETH | <0.01% | $0.000358 | 725.0918 | $0.2595 | |
ETH | <0.01% | <$0.000001 | 923,378.1298 | $0.2589 | |
ETH | <0.01% | $0.000013 | 19,864.9225 | $0.2558 | |
ETH | <0.01% | $0.0004 | 638.2721 | $0.2551 | |
ETH | <0.01% | $0.001426 | 175.2665 | $0.2499 | |
ETH | <0.01% | $0.001024 | 241.8491 | $0.2476 | |
ETH | <0.01% | $0.001825 | 135.0168 | $0.2464 | |
ETH | <0.01% | $0.000043 | 5,672.2748 | $0.244 | |
ETH | <0.01% | $0.001339 | 180.2128 | $0.2412 | |
ETH | <0.01% | $0.000154 | 1,554.0575 | $0.2398 | |
ETH | <0.01% | $0.000326 | 731.301 | $0.2387 | |
ETH | <0.01% | $0.003042 | 78.4201 | $0.2385 | |
ETH | <0.01% | $0.000227 | 1,047.6854 | $0.2379 | |
ETH | <0.01% | $0.005042 | 46.3498 | $0.2336 | |
ETH | <0.01% | $0.116171 | 1.9453 | $0.2259 | |
ETH | <0.01% | $0.000395 | 572.0548 | $0.2259 | |
ETH | <0.01% | $0.00124 | 181.1054 | $0.2245 | |
ETH | <0.01% | $0.000632 | 348.9801 | $0.2206 | |
ETH | <0.01% | $0.012714 | 17.2323 | $0.219 | |
ETH | <0.01% | $0.00 | 36.8909 | $0.00 | |
ETH | <0.01% | $0.01484 | 14.518 | $0.2154 | |
ETH | <0.01% | $0.000001 | 205,139.7894 | $0.2133 | |
ETH | <0.01% | $0.00291 | 72.0621 | $0.2097 | |
ETH | <0.01% | $0.000487 | 419.6061 | $0.2042 | |
ETH | <0.01% | $0.000169 | 1,209.9715 | $0.2038 | |
ETH | <0.01% | $0.012536 | 16.0244 | $0.2008 | |
ETH | <0.01% | $23.58 | 0.00850802 | $0.2006 | |
ETH | <0.01% | $0.002625 | 75.7502 | $0.1988 | |
ETH | <0.01% | <$0.000001 | 433,105,798.0477 | $0.198 | |
ETH | <0.01% | <$0.000001 | 618,927,654.5155 | $0.1929 | |
ETH | <0.01% | $0.000018 | 10,311.9202 | $0.1891 | |
ETH | <0.01% | $0.018425 | 10.1037 | $0.1861 | |
ETH | <0.01% | $0.000086 | 2,152.1707 | $0.1851 | |
ETH | <0.01% | <$0.000001 | 136,538,510.332 | $0.1811 | |
ETH | <0.01% | $0.000051 | 3,546.9786 | $0.1798 | |
ETH | <0.01% | $0.017858 | 9.8473 | $0.1758 | |
ETH | <0.01% | <$0.000001 | 679,396,197,089.6213 | $0.1743 | |
ETH | <0.01% | $0.00001 | 16,944.3916 | $0.1728 | |
ETH | <0.01% | $0.001161 | 146.587 | $0.1701 | |
ETH | <0.01% | $0.000025 | 6,365.0314 | $0.1622 | |
ETH | <0.01% | $0.000004 | 39,325.2376 | $0.1616 | |
ETH | <0.01% | $0.465928 | 0.3439 | $0.1602 | |
ETH | <0.01% | <$0.000001 | 1,149,413,815.4681 | $0.1593 | |
ETH | <0.01% | $5,094.92 | 0.00003047 | $0.1552 | |
ETH | <0.01% | $2.53 | 0.0603 | $0.1525 | |
ETH | <0.01% | <$0.000001 | 35,423,218.8023 | $0.1508 | |
ETH | <0.01% | $0.001843 | 81.3597 | $0.1499 | |
ETH | <0.01% | $0.000343 | 431.5546 | $0.1482 | |
ETH | <0.01% | $0.00002 | 7,031.0488 | $0.1433 | |
ETH | <0.01% | <$0.000001 | 547,914.8365 | $0.1339 | |
ETH | <0.01% | $0.04603 | 2.8942 | $0.1332 | |
ETH | <0.01% | $0.11152 | 1.1774 | $0.1313 | |
ETH | <0.01% | $0.000085 | 1,530.6953 | $0.1307 | |
ETH | <0.01% | $0.507712 | 0.2513 | $0.1276 | |
ETH | <0.01% | <$0.000001 | 3,956,432.6387 | $0.1271 | |
ETH | <0.01% | $0.002808 | 44.9286 | $0.1261 | |
ETH | <0.01% | $0.000054 | 2,303.6781 | $0.1249 | |
ETH | <0.01% | $0.071602 | 1.7333 | $0.1241 | |
ETH | <0.01% | $0.005348 | 23.0328 | $0.1231 | |
ETH | <0.01% | $0.000117 | 1,047.7012 | $0.123 | |
ETH | <0.01% | $2.52 | 0.0482 | $0.1214 | |
ETH | <0.01% | $0.000093 | 1,296.5021 | $0.1208 | |
ETH | <0.01% | $0.680325 | 0.177 | $0.1204 | |
ETH | <0.01% | $0.02969 | 4.0308 | $0.1196 | |
ETH | <0.01% | $0.004138 | 28.198 | $0.1166 | |
ETH | <0.01% | $0.564064 | 0.2068 | $0.1166 | |
ETH | <0.01% | $1,077.77 | 0.00010733 | $0.1156 | |
ETH | <0.01% | $1.65 | 0.0688 | $0.1134 | |
ETH | <0.01% | $1 | 0.113 | $0.1131 | |
ETH | <0.01% | <$0.000001 | 41,241,548.7315 | $0.1097 | |
ETH | <0.01% | $0.009305 | 11.7866 | $0.1096 | |
ETH | <0.01% | $0.000199 | 544.5952 | $0.1083 | |
ETH | <0.01% | $0.001084 | 96.8211 | $0.1049 | |
ETH | <0.01% | <$0.000001 | 710,363,258.7799 | $0.1004 | |
POL | <0.01% | $0.02358 | 14,537.2554 | $342.79 | |
POL | <0.01% | $0.004571 | 69,998.3309 | $319.97 | |
POL | <0.01% | $0.00 | 25,474,786.5636 | $0.00 | |
POL | <0.01% | $0.00 | 0.6272 | $0.00 | |
POL | <0.01% | <$0.000001 | 2,548,630,246.171 | $15.55 | |
POL | <0.01% | <$0.000001 | 1,556,076,740.7121 | $14.32 | |
POL | <0.01% | $1.01 | 9.1029 | $9.23 | |
POL | <0.01% | $0.217129 | 35.1876 | $7.64 | |
POL | <0.01% | $0.013322 | 543.2158 | $7.24 | |
POL | <0.01% | $0.949313 | 7.21 | $6.84 | |
POL | <0.01% | $0.431767 | 13.7541 | $5.94 | |
POL | <0.01% | <$0.000001 | 429,429,517.051 | $5.84 | |
POL | <0.01% | $0.004694 | 1,141.9183 | $5.36 | |
POL | <0.01% | <$0.000001 | 393,342,804.2872 | $5.15 | |
POL | <0.01% | $0.770314 | 6.0944 | $4.69 | |
POL | <0.01% | $0.001798 | 1,901.9196 | $3.42 | |
POL | <0.01% | $0.01935 | 140.9413 | $2.73 | |
POL | <0.01% | $0.232367 | 10.4934 | $2.44 | |
POL | <0.01% | $0.019074 | 122.6158 | $2.34 | |
POL | <0.01% | $0.29046 | 7.7655 | $2.26 | |
POL | <0.01% | $0.014028 | 159.5212 | $2.24 | |
POL | <0.01% | $0.000057 | 35,920.0381 | $2.03 | |
POL | <0.01% | $0.00267 | 757.9307 | $2.02 | |
POL | <0.01% | $1.01 | 1.9178 | $1.93 | |
POL | <0.01% | $0.000957 | 1,828.8486 | $1.75 | |
POL | <0.01% | $0.000013 | 135,970.6251 | $1.75 | |
POL | <0.01% | $0.01549 | 100.964 | $1.56 | |
POL | <0.01% | $0.000007 | 209,260.8709 | $1.51 | |
POL | <0.01% | $0.698876 | 2.1315 | $1.49 | |
POL | <0.01% | $0.00 | 772.7571 | $0.00 | |
POL | <0.01% | $0.111257 | 10.7992 | $1.2 | |
POL | <0.01% | $0.067979 | 15.9271 | $1.08 | |
POL | <0.01% | $0.001463 | 627.3244 | $0.9179 | |
POL | <0.01% | $0.000614 | 1,396.2036 | $0.8566 | |
POL | <0.01% | <$0.000001 | 1,219,567,213.7366 | $0.7317 | |
POL | <0.01% | $0.228538 | 3.1334 | $0.716 | |
POL | <0.01% | $0.013153 | 53.3122 | $0.7011 | |
POL | <0.01% | $0.190489 | 3.1088 | $0.5921 | |
POL | <0.01% | $1 | 0.5715 | $0.5726 | |
POL | <0.01% | $0.000253 | 2,245.2253 | $0.5685 | |
POL | <0.01% | $0.00004 | 14,112.5815 | $0.5642 | |
POL | <0.01% | $0.003042 | 182.3653 | $0.5548 | |
POL | <0.01% | $0.001419 | 375.1926 | $0.5324 | |
POL | <0.01% | $0.114395 | 4.4734 | $0.5117 | |
POL | <0.01% | $0.000032 | 15,336.5219 | $0.4924 | |
POL | <0.01% | $14.15 | 0.0348 | $0.4918 | |
POL | <0.01% | $0.000812 | 585.1498 | $0.4754 | |
POL | <0.01% | $0.005803 | 77.1664 | $0.4478 | |
POL | <0.01% | $0.000004 | 97,354.6556 | $0.4312 | |
POL | <0.01% | $1.19 | 0.2796 | $0.3326 | |
POL | <0.01% | $0.092782 | 3.5666 | $0.3309 | |
POL | <0.01% | $0.000688 | 461.5479 | $0.3175 | |
POL | <0.01% | $0.137575 | 2.2121 | $0.3043 | |
POL | <0.01% | $0.000191 | 1,581.8357 | $0.302 | |
POL | <0.01% | $0.124056 | 2.1598 | $0.2679 | |
POL | <0.01% | $0.001442 | 185.1166 | $0.2669 | |
POL | <0.01% | $0.00008 | 3,100 | $0.2494 | |
POL | <0.01% | $0.00052 | 460.1548 | $0.2392 | |
POL | <0.01% | $0.001129 | 210.4839 | $0.2376 | |
POL | <0.01% | $0.006546 | 34.1523 | $0.2235 | |
POL | <0.01% | $0.000006 | 35,043.9049 | $0.2123 | |
POL | <0.01% | $0.074242 | 2.8448 | $0.2111 | |
POL | <0.01% | $0.058303 | 3.5515 | $0.207 | |
POL | <0.01% | $0.267892 | 0.7587 | $0.2032 | |
POL | <0.01% | $8.48 | 0.0231 | $0.1957 | |
POL | <0.01% | $0.008328 | 23.0966 | $0.1923 | |
POL | <0.01% | $0.022917 | 7.4852 | $0.1715 | |
POL | <0.01% | $2.39 | 0.0696 | $0.1664 | |
POL | <0.01% | $0.17223 | 0.9529 | $0.1641 | |
POL | <0.01% | $0.999951 | 0.1637 | $0.1636 | |
POL | <0.01% | $0.000025 | 5,869.5349 | $0.1479 | |
POL | <0.01% | $0.019745 | 7.4032 | $0.1461 | |
POL | <0.01% | $0.007061 | 19.8417 | $0.14 | |
POL | <0.01% | $34.95 | 0.00388701 | $0.1358 | |
POL | <0.01% | $0.000007 | 17,100.6078 | $0.1243 | |
POL | <0.01% | $0.00003 | 3,504.1474 | $0.1064 | |
POL | <0.01% | $0.00 | 292.361 | $0.00 | |
POL | <0.01% | $0.012941 | 7.9531 | $0.1029 | |
GNO | <0.01% | $0.08232 | 2,666.0706 | $219.47 | |
GNO | <0.01% | $0.999848 | 29.4125 | $29.41 | |
GNO | <0.01% | $0.00 | 14,021.852 | $0.00 | |
GNO | <0.01% | $1.7 | 1.3725 | $2.33 | |
AVAX | <0.01% | $159.39 | 1.1016 | $175.59 | |
AVAX | <0.01% | $0.998335 | 7.9003 | $7.89 | |
AVAX | <0.01% | <$0.000001 | 113,238,295.4753 | $7.56 | |
AVAX | <0.01% | $0.000011 | 528,983.1278 | $5.68 | |
AVAX | <0.01% | <$0.000001 | 1,024,226,968.1645 | $5.22 | |
AVAX | <0.01% | $6.7 | 0.7594 | $5.09 | |
AVAX | <0.01% | $0.999859 | 4.1813 | $4.18 | |
AVAX | <0.01% | $1.03 | 3.2133 | $3.3 | |
AVAX | <0.01% | $0.002746 | 1,186.0635 | $3.26 | |
AVAX | <0.01% | <$0.000001 | 69,156,186.6748 | $3.24 | |
AVAX | <0.01% | $1.59 | 1.9019 | $3.03 | |
AVAX | <0.01% | $3.83 | 0.7163 | $2.74 | |
AVAX | <0.01% | $0.000315 | 8,251.2655 | $2.6 | |
AVAX | <0.01% | $0.013963 | 169.5419 | $2.37 | |
AVAX | <0.01% | $0.00 | 185.5255 | $0.00 | |
AVAX | <0.01% | $0.172857 | 11.193 | $1.93 | |
AVAX | <0.01% | $0.002185 | 853.6534 | $1.87 | |
AVAX | <0.01% | $0.000009 | 198,047.2875 | $1.84 | |
AVAX | <0.01% | $0.005141 | 347.6851 | $1.79 | |
AVAX | <0.01% | $0.068406 | 24.4414 | $1.67 | |
AVAX | <0.01% | $0.055614 | 29.0327 | $1.61 | |
AVAX | <0.01% | $0.000023 | 56,159.5143 | $1.31 | |
AVAX | <0.01% | $0.00297 | 431.9421 | $1.28 | |
AVAX | <0.01% | $0.227025 | 5.0138 | $1.14 | |
AVAX | <0.01% | $0.000374 | 2,772.165 | $1.04 | |
AVAX | <0.01% | $0.084458 | 10.5931 | $0.8946 | |
AVAX | <0.01% | $0.068987 | 8.5319 | $0.5885 | |
AVAX | <0.01% | $0.00058 | 884.709 | $0.513 | |
AVAX | <0.01% | $0.9999 | 0.4867 | $0.4866 | |
AVAX | <0.01% | $1.16 | 0.3392 | $0.3936 | |
AVAX | <0.01% | $0.01194 | 31.4133 | $0.375 | |
AVAX | <0.01% | $0.034579 | 9.8701 | $0.3412 | |
AVAX | <0.01% | $0.198607 | 1.4716 | $0.2922 | |
AVAX | <0.01% | $0.000877 | 330.7591 | $0.2902 | |
AVAX | <0.01% | $0.001613 | 123.3146 | $0.1989 | |
AVAX | <0.01% | $0.179515 | 1.0295 | $0.1848 | |
AVAX | <0.01% | $0.003599 | 45.0644 | $0.1621 | |
AVAX | <0.01% | $0.000201 | 677.4343 | $0.1363 | |
AVAX | <0.01% | $0.001383 | 79.2065 | $0.1095 | |
AVAX | <0.01% | $0.006045 | 18.03 | $0.1089 | |
ARB | <0.01% | $0.000002 | 58,839,028.8417 | $107.09 | |
ARB | <0.01% | $159.36 | 0.6381 | $101.69 | |
ARB | <0.01% | <$0.000001 | 15,846,400,926.6528 | $6.34 | |
ARB | <0.01% | $1 | 5.8369 | $5.84 | |
ARB | <0.01% | $0.562898 | 6.4505 | $3.63 | |
ARB | <0.01% | $5,076.92 | 0.00070585 | $3.58 | |
ARB | <0.01% | $0.051489 | 66.6419 | $3.43 | |
ARB | <0.01% | $0.006503 | 484.4411 | $3.15 | |
ARB | <0.01% | $0.93098 | 2.1931 | $2.04 | |
ARB | <0.01% | $0.01396 | 123.4047 | $1.72 | |
ARB | <0.01% | $0.007791 | 164.0348 | $1.28 | |
ARB | <0.01% | $0.025512 | 39.072 | $0.9968 | |
ARB | <0.01% | $0.172908 | 4.8346 | $0.8359 | |
ARB | <0.01% | $0.000374 | 2,131.8513 | $0.7971 | |
ARB | <0.01% | $0.006563 | 87.0112 | $0.571 | |
ARB | <0.01% | $4,766.42 | 0.00009583 | $0.4567 | |
ARB | <0.01% | $0.013621 | 20.6099 | $0.2807 | |
ARB | <0.01% | $0.145185 | 1.5272 | $0.2217 | |
ARB | <0.01% | $0.94957 | 0.2263 | $0.2149 | |
ARB | <0.01% | $0.00 | 8.7722 | $0.00 | |
ARB | <0.01% | $137.14 | 0.00129113 | $0.177 | |
ARB | <0.01% | $0.073023 | 2.1339 | $0.1558 | |
ARB | <0.01% | $0.000144 | 834.0675 | $0.1198 | |
ARB | <0.01% | $0.009944 | 11.2745 | $0.1121 | |
OP | <0.01% | $115,297 | 0.00006897 | $7.95 | |
OP | <0.01% | $0.000025 | 105,652.179 | $2.69 | |
OP | <0.01% | $29.3 | 0.0639 | $1.87 | |
OP | <0.01% | $1.87 | 0.8417 | $1.57 | |
OP | <0.01% | $19.41 | 0.0409 | $0.7934 | |
OP | <0.01% | $0.076418 | 9.4459 | $0.7218 | |
OP | <0.01% | $0.036736 | 7.5514 | $0.2774 | |
OP | <0.01% | $0.493322 | 0.4376 | $0.2158 | |
OP | <0.01% | $0.021283 | 8.4481 | $0.1798 | |
OP | <0.01% | $0.036736 | 2.8589 | $0.105 | |
BASE | <0.01% | $0.00 | 1,650 | $0.00 | |
BASE | <0.01% | $0.000088 | 7,151.5158 | $0.6287 | |
BASE | <0.01% | $0.000333 | 1,331.6998 | $0.4434 | |
BASE | <0.01% | $0.000023 | 9,964.536 | $0.2242 | |
MANTLE | <0.01% | $2.15 | 0.00001 | $0.000022 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.