Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Transfer | 22645322 | 11 hrs ago | 0 ETH | ||||
Transfer | 22627109 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22624961 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22624781 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22624580 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22624385 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22624196 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22624016 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22623825 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22623609 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22623418 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22623251 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22623061 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22622869 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22622673 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22622500 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22622315 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22622136 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22621938 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22621734 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22621550 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22621359 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22621160 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22620988 | 3 days ago | 0.00000001 ETH | ||||
Transfer | 22620803 | 3 days ago | 0.00000001 ETH |
Loading...
Loading
Minimal Proxy Contract for 0x167a871142494b86007761d12735017ceb227ed8
Contract Name:
Depositor
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 1000 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/utils/Address.sol'; import '@mimic-fi/v3-helpers/contracts/utils/ERC20Helpers.sol'; import '@mimic-fi/v3-helpers/contracts/utils/Denominations.sol'; import '../Task.sol'; import '../interfaces/primitives/IDepositor.sol'; /** * @title Depositor * @dev Task that can be used as the origin to start any workflow */ contract Depositor is IDepositor, Task { // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('DEPOSITOR'); /** * @dev Deposit config. Only used in the initializer. */ struct DepositConfig { TaskConfig taskConfig; } /** * @dev Initializes the depositor * @param config Deposit config */ function initialize(DepositConfig memory config) external virtual initializer { __Depositor_init(config); } /** * @dev Initializes the depositor. It does call upper contracts initializers. * @param config Deposit config */ function __Depositor_init(DepositConfig memory config) internal onlyInitializing { __Task_init(config.taskConfig); __Depositor_init_unchained(config); } /** * @dev Initializes the depositor. It does not call upper contracts initializers. * @param config Deposit config */ function __Depositor_init_unchained(DepositConfig memory config) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Tells the address from where the token amounts to execute this task are fetched */ function getTokensSource() public view virtual override(IBaseTask, BaseTask) returns (address) { return address(this); } /** * @dev Tells the balance of the depositor for a given token * @param token Address of the token being queried */ function getTaskAmount(address token) public view virtual override(IBaseTask, BaseTask) returns (uint256) { return ERC20Helpers.balanceOf(token, getTokensSource()); } /** * @dev It allows receiving native token transfers */ receive() external payable { if (msg.value == 0) revert TaskValueZero(); } /** * @dev Execute Depositor */ function call(address token, uint256 amount) external override authP(authParams(token, amount)) { if (amount == 0) amount = getTaskAmount(token); _beforeDepositor(token, amount); if (Denominations.isNativeToken(token)) { Address.sendValue(payable(smartVault), amount); } else { ERC20Helpers.approve(token, smartVault, amount); ISmartVault(smartVault).collect(token, getTokensSource(), amount); } _afterDepositor(token, amount); } /** * @dev Before depositor hook */ function _beforeDepositor(address token, uint256 amount) internal virtual { _beforeTask(token, amount); if (token == address(0)) revert TaskTokenZero(); if (amount == 0) revert TaskAmountZero(); } /** * @dev After depositor hook */ function _afterDepositor(address token, uint256 amount) internal virtual { _increaseBalanceConnector(token, amount); _afterTask(token, amount); } /** * @dev Sets the balance connectors. Previous balance connector must be unset. * @param previous Balance connector id of the previous task in the workflow * @param next Balance connector id of the next task in the workflow */ function _setBalanceConnectors(bytes32 previous, bytes32 next) internal virtual override { if (previous != bytes32(0)) revert TaskPreviousConnectorNotZero(previous); super._setBalanceConnectors(previous, next); } }
// 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.17; import '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol'; import './AuthorizedHelpers.sol'; import './interfaces/IAuthorized.sol'; import './interfaces/IAuthorizer.sol'; /** * @title Authorized * @dev Implementation using an authorizer as its access-control mechanism. It offers `auth` and `authP` modifiers to * tag its own functions in order to control who can access them against the authorizer referenced. */ contract Authorized is IAuthorized, Initializable, AuthorizedHelpers { // Authorizer reference address public override authorizer; /** * @dev Modifier that should be used to tag protected functions */ modifier auth() { _authenticate(msg.sender, msg.sig); _; } /** * @dev Modifier that should be used to tag protected functions with params */ modifier authP(uint256[] memory params) { _authenticate(msg.sender, msg.sig, params); _; } /** * @dev Creates a new authorized contract. Note that initializers are disabled at creation time. */ constructor() { _disableInitializers(); } /** * @dev Initializes the authorized contract. It does call upper contracts initializers. * @param _authorizer Address of the authorizer to be set */ function __Authorized_init(address _authorizer) internal onlyInitializing { __Authorized_init_unchained(_authorizer); } /** * @dev Initializes the authorized contract. It does not call upper contracts initializers. * @param _authorizer Address of the authorizer to be set */ function __Authorized_init_unchained(address _authorizer) internal onlyInitializing { authorizer = _authorizer; } /** * @dev Reverts if `who` is not allowed to call `what` * @param who Address to be authenticated * @param what Function selector to be authenticated */ function _authenticate(address who, bytes4 what) internal view { _authenticate(who, what, new uint256[](0)); } /** * @dev Reverts if `who` is not allowed to call `what` with `how` * @param who Address to be authenticated * @param what Function selector to be authenticated * @param how Params to be authenticated */ function _authenticate(address who, bytes4 what, uint256[] memory how) internal view { if (!_isAuthorized(who, what, how)) revert AuthSenderNotAllowed(who, what, how); } /** * @dev Tells whether `who` has any permission on this contract * @param who Address asking permissions for */ function _hasPermissions(address who) internal view returns (bool) { return IAuthorizer(authorizer).hasPermissions(who, address(this)); } /** * @dev Tells whether `who` is allowed to call `what` * @param who Address asking permission for * @param what Function selector asking permission for */ function _isAuthorized(address who, bytes4 what) internal view returns (bool) { return _isAuthorized(who, what, new uint256[](0)); } /** * @dev Tells whether `who` is allowed to call `what` with `how` * @param who Address asking permission for * @param what Function selector asking permission for * @param how Params asking permission for */ function _isAuthorized(address who, bytes4 what, uint256[] memory how) internal view returns (bool) { return IAuthorizer(authorizer).isAuthorized(who, address(this), what, how); } }
// 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.17; /** * @title AuthorizedHelpers * @dev Syntax sugar methods to operate with authorizer params easily */ contract AuthorizedHelpers { function authParams(address p1) internal pure returns (uint256[] memory r) { return authParams(uint256(uint160(p1))); } function authParams(bytes32 p1) internal pure returns (uint256[] memory r) { return authParams(uint256(p1)); } function authParams(uint256 p1) internal pure returns (uint256[] memory r) { r = new uint256[](1); r[0] = p1; } function authParams(address p1, bool p2) internal pure returns (uint256[] memory r) { r = new uint256[](2); r[0] = uint256(uint160(p1)); r[1] = p2 ? 1 : 0; } function authParams(address p1, uint256 p2) internal pure returns (uint256[] memory r) { r = new uint256[](2); r[0] = uint256(uint160(p1)); r[1] = p2; } function authParams(address p1, address p2) internal pure returns (uint256[] memory r) { r = new uint256[](2); r[0] = uint256(uint160(p1)); r[1] = uint256(uint160(p2)); } function authParams(bytes32 p1, bytes32 p2) internal pure returns (uint256[] memory r) { r = new uint256[](2); r[0] = uint256(p1); r[1] = uint256(p2); } function authParams(address p1, address p2, uint256 p3) internal pure returns (uint256[] memory r) { r = new uint256[](3); r[0] = uint256(uint160(p1)); r[1] = uint256(uint160(p2)); r[2] = p3; } function authParams(address p1, address p2, address p3) internal pure returns (uint256[] memory r) { r = new uint256[](3); r[0] = uint256(uint160(p1)); r[1] = uint256(uint160(p2)); r[2] = uint256(uint160(p3)); } function authParams(address p1, address p2, bytes4 p3) internal pure returns (uint256[] memory r) { r = new uint256[](3); r[0] = uint256(uint160(p1)); r[1] = uint256(uint160(p2)); r[2] = uint256(uint32(p3)); } function authParams(address p1, uint256 p2, uint256 p3) internal pure returns (uint256[] memory r) { r = new uint256[](3); r[0] = uint256(uint160(p1)); r[1] = p2; r[2] = p3; } function authParams(uint256 p1, uint256 p2, uint256 p3, uint256 p4) internal pure returns (uint256[] memory r) { r = new uint256[](4); r[0] = p1; r[1] = p2; r[2] = p3; r[3] = p4; } function authParams(address p1, address p2, uint256 p3, uint256 p4) internal pure returns (uint256[] memory r) { r = new uint256[](4); r[0] = uint256(uint160(p1)); r[1] = uint256(uint160(p2)); r[2] = p3; r[3] = p4; } function authParams(address p1, uint256 p2, address p3, uint256 p4) internal pure returns (uint256[] memory r) { r = new uint256[](4); r[0] = uint256(uint160(p1)); r[1] = p2; r[2] = uint256(uint160(p3)); r[3] = p4; } function authParams(address p1, uint256 p2, uint256 p3, uint256 p4) internal pure returns (uint256[] memory r) { r = new uint256[](4); r[0] = uint256(uint160(p1)); r[1] = p2; r[2] = p3; r[3] = p4; } function authParams(bytes32 p1, address p2, uint256 p3, bool p4) internal pure returns (uint256[] memory r) { r = new uint256[](4); r[0] = uint256(p1); r[1] = uint256(uint160(p2)); r[2] = p3; r[3] = p4 ? 1 : 0; } function authParams(address p1, uint256 p2, uint256 p3, uint256 p4, uint256 p5) internal pure returns (uint256[] memory r) { r = new uint256[](5); r[0] = uint256(uint160(p1)); r[1] = p2; r[2] = p3; r[3] = p4; r[4] = p5; } }
// 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; /** * @dev Authorized interface */ interface IAuthorized { /** * @dev Sender `who` is not allowed to call `what` with `how` */ error AuthSenderNotAllowed(address who, bytes4 what, uint256[] how); /** * @dev Tells the address of the authorizer reference */ function authorizer() 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; /** * @dev Authorizer interface */ interface IAuthorizer { /** * @dev Permission change * @param where Address of the contract to change a permission for * @param changes List of permission changes to be executed */ struct PermissionChange { address where; GrantPermission[] grants; RevokePermission[] revokes; } /** * @dev Grant permission data * @param who Address to be authorized * @param what Function selector to be authorized * @param params List of params to restrict the given permission */ struct GrantPermission { address who; bytes4 what; Param[] params; } /** * @dev Revoke permission data * @param who Address to be unauthorized * @param what Function selector to be unauthorized */ struct RevokePermission { address who; bytes4 what; } /** * @dev Params used to validate permissions params against * @param op ID of the operation to compute in order to validate a permission param * @param value Comparison value */ struct Param { uint8 op; uint248 value; } /** * @dev Sender is not authorized to call `what` on `where` with `how` */ error AuthorizerSenderNotAllowed(address who, address where, bytes4 what, uint256[] how); /** * @dev The operation param is invalid */ error AuthorizerInvalidParamOp(uint8 op); /** * @dev Emitted every time `who`'s permission to perform `what` on `where` is granted with `params` */ event Authorized(address indexed who, address indexed where, bytes4 indexed what, Param[] params); /** * @dev Emitted every time `who`'s permission to perform `what` on `where` is revoked */ event Unauthorized(address indexed who, address indexed where, bytes4 indexed what); /** * @dev Tells whether `who` has any permission on `where` * @param who Address asking permission for * @param where Target address asking permission for */ function hasPermissions(address who, address where) external view returns (bool); /** * @dev Tells the number of permissions `who` has on `where` * @param who Address asking permission for * @param where Target address asking permission for */ function getPermissionsLength(address who, address where) external view returns (uint256); /** * @dev Tells whether `who` has permission to call `what` on `where`. Note `how` is not evaluated here, * which means `who` might be authorized on or not depending on the call at the moment of the execution * @param who Address asking permission for * @param where Target address asking permission for * @param what Function selector asking permission for */ function hasPermission(address who, address where, bytes4 what) external view returns (bool); /** * @dev Tells whether `who` is allowed to call `what` on `where` with `how` * @param who Address asking permission for * @param where Target address asking permission for * @param what Function selector asking permission for * @param how Params asking permission for */ function isAuthorized(address who, address where, bytes4 what, uint256[] memory how) external view returns (bool); /** * @dev Tells the params set for a given permission * @param who Address asking permission params of * @param where Target address asking permission params of * @param what Function selector asking permission params of */ function getPermissionParams(address who, address where, bytes4 what) external view returns (Param[] memory); /** * @dev Executes a list of permission changes * @param changes List of permission changes to be executed */ function changePermissions(PermissionChange[] memory changes) external; /** * @dev Authorizes `who` to call `what` on `where` restricted by `params` * @param who Address to be authorized * @param where Target address to be granted for * @param what Function selector to be granted * @param params Optional params to restrict a permission attempt */ function authorize(address who, address where, bytes4 what, Param[] memory params) external; /** * @dev Unauthorizes `who` to call `what` on `where`. Sender must be authorized. * @param who Address to be authorized * @param where Target address to be revoked for * @param what Function selector to be revoked */ function unauthorize(address who, address where, bytes4 what) 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 1inch V5 connector interface */ interface IOneInchV5Connector { /** * @dev The token in is the same as the token out */ error OneInchV5SwapSameToken(address token); /** * @dev The amount out is lower than the minimum amount out */ error OneInchV5BadAmountOut(uint256 amountOut, uint256 minAmountOut); /** * @dev The post token in balance is lower than the previous token in balance minus the amount in */ error OneInchV5BadPostTokenInBalance(uint256 postBalanceIn, uint256 preBalanceIn, uint256 amountIn); /** * @dev Tells the reference to 1inch aggregation router v5 */ function oneInchV5Router() external view returns (address); /** * @dev Executes a token swap in 1Inch V5 * @param tokenIn Token to be sent * @param tokenOut Token to be received * @param amountIn Amount of token in to be swapped * @param minAmountOut Minimum amount of token out willing to receive * @param data Calldata to be sent to the 1inch aggregation router */ function execute(address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, bytes memory data) external returns (uint256 amountOut); }
// 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 Axelar connector interface */ interface IAxelarConnector { /** * @dev The recipient address is zero */ error AxelarBridgeRecipientZero(); /** * @dev The source and destination chains are the same */ error AxelarBridgeSameChain(uint256 chainId); /** * @dev The chain ID is not supported */ error AxelarBridgeUnknownChainId(uint256 chainId); /** * @dev The post token balance is lower than the previous token balance minus the amount bridged */ error AxelarBridgeBadPostTokenBalance(uint256 postBalance, uint256 preBalance, uint256 amount); /** * @dev Tells the reference to the Axelar gateway of the source chain */ function axelarGateway() external view returns (address); /** * @dev Executes a bridge of assets using Axelar * @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 recipient Address that will receive the tokens on the destination chain */ function execute(uint256 chainId, address token, uint256 amount, address recipient) 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 Balancer pool connector interface */ interface IBalancerV2PoolConnector { /** * @dev The given input length is invalid or do not match */ error BalancerV2InvalidInputLength(); /** * @dev The given tokens out length is not the expected one */ error BalancerV2InvalidTokensOutLength(); /** * @dev The given pool ID and bpt in do not match on Balancer vault */ error BalancerV2InvalidPoolId(bytes32 poolId, address bpt); /** * @dev The given token does not belong to the pool */ error BalancerV2InvalidToken(bytes32 poolId, address token); /** * @dev The post balance of the token in unexpected */ error BalancerV2BadTokenInBalance(uint256 postBalance, uint256 preBalance, uint256 amountIn); /** * @dev The post balance of the token out is unexpected */ error BalancerV2BadTokenOutBalance(uint256 postBalance, uint256 preBalance); /** * @dev The resulting amount out is lower than the expected min amount out */ error BalancerV2BadAmountOut(uint256 amountOut, uint256 minAmountOut); /** * @dev Tells the reference to Balancer v2 vault */ function balancerV2Vault() external view returns (address); /** * @dev Adds liquidity to a Balancer pool * @param poolId Balancer pool ID * @param tokenIn Address of the token to join the Balancer pool * @param amountIn Amount of tokens to join the Balancer pool * @param minAmountOut Minimum amount of pool tokens expected to receive after join */ function join(bytes32 poolId, address tokenIn, uint256 amountIn, uint256 minAmountOut) external returns (uint256 amountOut); /** * @dev Removes liquidity from a Balancer pool * @param tokenIn Address of the pool to exit * @param amountIn Amount of pool tokens to exit * @param tokensOut List of addresses of tokens in the pool * @param minAmountsOut List of min amounts out to be expected for each pool token */ function exit(address tokenIn, uint256 amountIn, address[] memory tokensOut, uint256[] memory minAmountsOut) external returns (uint256[] memory amountsOut); }
// 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 Balancer v2 swap connector interface */ interface IBalancerV2SwapConnector { /** * @dev The input length mismatch */ error BalancerV2InputLengthMismatch(); /** * @dev The token in is the same as the token out */ error BalancerV2SwapSameToken(address token); /** * @dev The pool does not exist on the Balancer vault */ error BalancerV2InvalidPool(bytes32 poolId); /** * @dev The requested tokens do not belong to the pool */ error BalancerV2InvalidPoolTokens(bytes32 poolId, address tokenA, address tokenB); /** * @dev The returned amount in is not equal to the requested amount in */ error BalancerV2InvalidAmountIn(int256 amountIn); /** * @dev The returned amount out is greater than or equal to zero */ error BalancerV2InvalidAmountOut(int256 amountOut); /** * @dev The amount out is lower than the minimum amount out */ error BalancerV2BadAmountOut(uint256 amountOut, uint256 minAmountOut); /** * @dev The post token in balance is lower than the previous token in balance minus the amount in */ error BalancerV2BadPostTokenInBalance(uint256 postBalanceIn, uint256 preBalanceIn, uint256 amountIn); /** * @dev Tells the reference to Balancer v2 vault */ function balancerV2Vault() external view returns (address); /** * @dev Executes a token swap in Balancer V2 * @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 poolId Pool ID to be used * @param hopPoolsIds Optional list of hop-pools between tokenIn and tokenOut, only used for multi-hops * @param hopTokens Optional list of hop-tokens between tokenIn and tokenOut, only used for multi-hops */ function execute( address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, bytes32 poolId, bytes32[] memory hopPoolsIds, address[] memory hopTokens ) external returns (uint256 amountOut); }
// 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'; interface IBalancerV2Vault { function getPool(bytes32 poolId) external view returns (address, uint256); function getPoolTokens(bytes32 poolId) external view returns (IERC20[] memory tokens, uint256[] memory balances, uint256 lastChangeBlock); struct JoinPoolRequest { IERC20[] assets; uint256[] maxAmountsIn; bytes userData; bool fromInternalBalance; } function joinPool(bytes32 poolId, address sender, address recipient, JoinPoolRequest memory request) external payable; struct ExitPoolRequest { IERC20[] assets; uint256[] minAmountsOut; bytes userData; bool toInternalBalance; } function exitPool(bytes32 poolId, address sender, address payable recipient, ExitPoolRequest memory request) external; enum SwapKind { GIVEN_IN, GIVEN_OUT } struct SingleSwap { bytes32 poolId; SwapKind kind; address assetIn; address assetOut; uint256 amount; bytes userData; } struct FundManagement { address sender; bool fromInternalBalance; address payable recipient; bool toInternalBalance; } function swap(SingleSwap memory singleSwap, FundManagement memory funds, uint256 limit, uint256 deadline) external payable returns (uint256); struct BatchSwapStep { bytes32 poolId; uint256 assetInIndex; uint256 assetOutIndex; uint256 amount; bytes userData; } function batchSwap( SwapKind kind, BatchSwapStep[] memory swaps, address[] memory assets, FundManagement memory funds, int256[] memory limits, uint256 deadline ) external payable returns (int256[] memory); }
// 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 Connext connector interface * @dev Interfaces with Connext to bridge tokens */ interface IConnextConnector { /** * @dev The recipient address is zero */ error ConnextBridgeRecipientZero(); /** * @dev The source and destination chains are the same */ error ConnextBridgeSameChain(uint256 chainId); /** * @dev The chain ID is not supported */ error ConnextBridgeUnknownChainId(uint256 chainId); /** * @dev The relayer fee is greater than the amount to be bridged */ error ConnextBridgeRelayerFeeGtAmount(uint256 relayerFee, uint256 amount); /** * @dev The minimum amount out is greater than the amount to be bridged minus the relayer fee */ error ConnextBridgeMinAmountOutTooBig(uint256 minAmountOut, uint256 amount, uint256 relayerFee); /** * @dev The post token balance is lower than the previous token balance minus the amount bridged */ error ConnextBridgeBadPostTokenBalance(uint256 postBalance, uint256 preBalance, uint256 amount); /** * @dev Tells the reference to the Connext contract of the source chain */ function connext() external view returns (address); /** * @dev Executes a bridge of assets using Connext * @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 minAmountOut Min amount of tokens to receive on the destination chain after relayer fees and slippage * @param recipient Address that will receive the tokens on the destination chain * @param relayerFee Fee to be paid to the relayer */ function execute( uint256 chainId, address token, uint256 amount, uint256 minAmountOut, address recipient, uint256 relayerFee ) 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 Convex connector interface */ interface IConvexConnector { /** * @dev Missing Convex pool for the requested Curve pool */ error ConvexCvxPoolNotFound(address curvePool); /** * @dev Failed to deposit tokens into the Convex booster */ error ConvexBoosterDepositFailed(uint256 poolId, uint256 amount); /** * @dev Failed to withdraw tokens from Convex pool */ error ConvexCvxPoolWithdrawFailed(address cvxPool, uint256 amount); /** * @dev Tells the reference to the Convex booster */ function booster() external view returns (address); /** * @dev Finds the Curve pool address associated to a Convex pool */ function getCurvePool(address cvxPool) external view returns (address); /** * @dev Finds the Curve pool address associated to a Convex pool */ function getCvxPool(address curvePool) external view returns (address); /** * @dev Claims Convex pool rewards for a Curve pool */ function claim(address cvxPool) external returns (address[] memory tokens, uint256[] memory amounts); /** * @dev Deposits Curve pool tokens into Convex * @param curvePool Address of the Curve pool to join Convex * @param amount Amount of Curve pool tokens to be deposited into Convex */ function join(address curvePool, uint256 amount) external returns (uint256); /** * @dev Withdraws Curve pool tokens from Convex * @param cvxPool Address of the Convex pool to exit from Convex * @param amount Amount of Convex tokens to be withdrawn */ function exit(address cvxPool, uint256 amount) external 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; /** * @title Curve 2CRV connector interface */ interface ICurve2CrvConnector { /** * @dev Failed to find the token in the 2CRV pool */ error Curve2CrvTokenNotFound(address pool, address token); /** * @dev Token decimals exceed 18 */ error Curve2CrvTokenDecimalsAbove18(address token, uint256 decimals); /** * @dev The slippage is above one */ error Curve2CrvSlippageAboveOne(uint256 slippage); /** * @dev Adds liquidity to the 2CRV pool * @param pool Address of the 2CRV pool to join * @param tokenIn Address of the token to join the 2CRV pool * @param amountIn Amount of tokens to join the 2CRV pool * @param slippage Slippage value to be used to compute the desired min amount out of pool tokens */ function join(address pool, address tokenIn, uint256 amountIn, uint256 slippage) external returns (uint256); /** * @dev Removes liquidity from 2CRV pool * @param pool Address of the 2CRV pool to exit * @param amountIn Amount of pool tokens to exit from the 2CRV pool * @param tokenOut Address of the token to exit the pool * @param slippage Slippage value to be used to compute the desired min amount out of tokens */ function exit(address pool, uint256 amountIn, address tokenOut, uint256 slippage) external returns (uint256 amountOut); }
// 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 ERC4626 connector interface */ interface IERC4626Connector { /** * @dev The token is not the underlying token of the ERC4626 */ error ERC4626InvalidToken(address token, address underlying); /** * @dev The amount deposited is lower than the expected amount */ error ERC4626BadSharesOut(uint256 shares, uint256 minSharesOut); /** * @dev The amount redeemed is lower than the expected amount */ error ERC4626BadAssetsOut(uint256 assets, uint256 minAssetsOut); /** * @dev The post token in balance is lower than the previous token in balance minus the amount in */ error ERC4626BadPostTokenInBalance(uint256 postBalanceIn, uint256 preBalanceIn, uint256 amountIn); /** * @dev Tells the underlying token of an ERC4626 */ function getToken(address erc4626) external view returns (address); /** * @dev Deposits assets to the underlying ERC4626 * @param erc4626 Address of the ERC4626 to join * @param tokenIn Address of the token to join the ERC4626 * @param assets Amount of assets to be deposited * @param minSharesOut Minimum amount of shares willing to receive */ function join(address erc4626, address tokenIn, uint256 assets, uint256 minSharesOut) external returns (address tokenOut, uint256 shares); /** * @dev Withdraws assets from the underlying ERC4626 * @param erc4626 Address of the ERC4626 to exit * @param shares Amount of shares to be redeemed * @param minAssetsOut Minimum amount of assets willing to receive */ function exit(address erc4626, uint256 shares, uint256 minAssetsOut) external returns (address token, uint256 assets); }
// 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 Hop connector interface */ interface IHopBridgeConnector { /** * @dev The source and destination chains are the same */ error HopBridgeSameChain(uint256 chainId); /** * @dev The bridge operation is not supported */ error HopBridgeOpNotSupported(); /** * @dev The recipient address is zero */ error HopBridgeRecipientZero(); /** * @dev The relayer was sent when not needed */ error HopBridgeRelayerNotNeeded(); /** * @dev The deadline was sent when not needed */ error HopBridgeDeadlineNotNeeded(); /** * @dev The deadline is in the past */ error HopBridgePastDeadline(uint256 deadline, uint256 currentTimestamp); /** * @dev The post token balance is lower than the previous token balance minus the amount bridged */ error HopBridgeBadPostTokenBalance(uint256 postBalance, uint256 preBalance, uint256 amount); /** * @dev Tells the reference to the wrapped native token address */ function wrappedNativeToken() external view returns (address); /** * @dev Executes a bridge of assets using Hop Exchange * @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 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 bridge Address of the bridge component (i.e. hopBridge or hopAMM) * @param deadline Deadline to be used when bridging to L2 in order to swap the corresponding hToken * @param relayer Only used when transferring from L1 to L2 if a 3rd party is relaying the transfer on the user's behalf * @param fee Fee to be sent to the bridge based on the source and destination chain (i.e. relayerFee or bonderFee) */ function execute( uint256 chainId, address token, uint256 amount, uint256 minAmountOut, address recipient, address bridge, uint256 deadline, address relayer, uint256 fee ) 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; interface IHopL2Amm { function hToken() external view returns (address); function exchangeAddress() external view returns (address); /** * @notice To send funds L2->L1 or L2->L2, call the swapAndSend method on the L2 AMM Wrapper contract * @dev Do not set destinationAmountOutMin and destinationDeadline when sending to L1 because there is no AMM on L1, * otherwise the calculated transferId will be invalid and the transfer will be unbondable. These parameters should * be set to 0 when sending to L1. * @param amount is the amount the user wants to send plus the Bonder fee */ function swapAndSend( uint256 chainId, address recipient, uint256 amount, uint256 bonderFee, uint256 amountOutMin, uint256 deadline, uint256 destinationAmountOutMin, uint256 destinationDeadline ) external payable; }
// 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 Hop swap connector interface */ interface IHopSwapConnector { /** * @dev The dex address is zero */ error HopDexAddressZero(); /** * @dev The token in is the same as the token out */ error HopSwapSameToken(address token); /** * @dev The amount out is lower than the minimum amount out */ error HopBadAmountOut(uint256 amountOut, uint256 minAmountOut); /** * @dev The post token in balance is lower than the pre token in balance minus the amount in */ error HopBadPostTokenInBalance(uint256 postBalanceIn, uint256 preBalanceIn, uint256 amountIn); /** * @dev Executes a token swap in Hop * @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 hopDexAddress Address of the Hop dex to be used */ function execute(address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, address hopDexAddress) external returns (uint256 amountOut); }
// 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 Paraswap V5 connector interface */ interface IParaswapV5Connector { /** * @dev The token in is the same as the token out */ error ParaswapV5SwapSameToken(address token); /** * @dev The amount out is lower than the minimum amount out */ error ParaswapV5BadAmountOut(uint256 amountOut, uint256 minAmountOut); /** * @dev The post token in balance is lower than the previous token in balance minus the amount in */ error ParaswapV5BadPostTokenInBalance(uint256 postBalanceIn, uint256 preBalanceIn, uint256 amountIn); /** * @dev Tells the reference to Paraswap V5 Augustus swapper */ function paraswapV5Augustus() external view returns (address); /** * @dev Executes a token swap in Paraswap V5 * @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 Calldata to be sent to the Augusuts swapper */ function execute(address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, bytes memory data) external returns (uint256 amountOut); }
// 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 Uniswap V2 connector interface */ interface IUniswapV2Connector { /** * @dev The token in is the same as the token out */ error UniswapV2SwapSameToken(address token); /** * @dev The pool does not exist */ error UniswapV2InvalidPool(address tokenA, address tokenB); /** * @dev The amount out is lower than the minimum amount out */ error UniswapV2BadAmountOut(uint256 amountOut, uint256 minAmountOut); /** * @dev The post token in balance is lower than the previous token in balance minus the amount in */ error UniswapV2BadPostTokenInBalance(uint256 postBalanceIn, uint256 preBalanceIn, uint256 amountIn); /** * @dev Tells the reference to UniswapV2 router */ function uniswapV2Router() external view returns (address); /** * @dev Executes a token swap in Uniswap V2 * @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 hopTokens Optional list of hop-tokens between tokenIn and tokenOut, only used for multi-hops */ function execute( address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, address[] memory hopTokens ) external returns (uint256 amountOut); }
// 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 Uniswap V3 connector interface */ interface IUniswapV3Connector { /** * @dev The input length mismatch */ error UniswapV3InputLengthMismatch(); /** * @dev The token in is the same as the token out */ error UniswapV3SwapSameToken(address token); /** * @dev A pool with the given tokens and fee does not exist */ error UniswapV3InvalidPoolFee(address token0, address token1, uint24 fee); /** * @dev The amount out is lower than the minimum amount out */ error UniswapV3BadAmountOut(uint256 amountOut, uint256 minAmountOut); /** * @dev The post token in balance is lower than the previous token in balance minus the amount in */ error UniswapV3BadPostTokenInBalance(uint256 postBalanceIn, uint256 preBalanceIn, uint256 amountIn); /** * @dev Tells the reference to UniswapV3 router */ function uniswapV3Router() external view returns (address); /** * @dev Executes a token swap in Uniswap V3 * @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 fee Fee to be used * @param hopTokens Optional list of hop-tokens between tokenIn and tokenOut, only used for multi-hops * @param hopFees Optional list of hop-fees between tokenIn and tokenOut, only used for multi-hops */ function execute( address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, uint24 fee, address[] memory hopTokens, uint24[] memory hopFees ) external returns (uint256 amountOut); }
// 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 Wormhole connector interface */ interface IWormholeConnector { /** * @dev The recipient address is zero */ error WormholeBridgeRecipientZero(); /** * @dev The source and destination chains are the same */ error WormholeBridgeSameChain(uint256 chainId); /** * @dev The chain ID is not supported */ error WormholeBridgeUnknownChainId(uint256 chainId); /** * @dev The relayer fee is greater than the amount to be bridged */ error WormholeBridgeRelayerFeeGtAmount(uint256 relayerFee, uint256 amount); /** * @dev The minimum amount out is greater than the amount to be bridged minus the relayer fee */ error WormholeBridgeMinAmountOutTooBig(uint256 minAmountOut, uint256 amount, uint256 relayerFee); /** * @dev The post token balance is lower than the previous token balance minus the amount bridged */ error WormholeBridgeBadPostTokenBalance(uint256 postBalance, uint256 preBalance, uint256 amount); /** * @dev Tells the reference to the Wormhole's CircleRelayer contract of the source chain */ function wormholeCircleRelayer() external view returns (address); /** * @dev Executes a bridge of assets using Wormhole's CircleRelayer integration * @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 minAmountOut Minimum amount of tokens willing to receive on the destination chain after relayer fees * @param recipient Address that will receive the tokens on the destination chain */ function execute(uint256 chainId, address token, uint256 amount, uint256 minAmountOut, address recipient) 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 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 Multiplication overflow */ error FixedPointMulOverflow(uint256 a, uint256 b); /** * @dev Division by zero */ error FixedPointZeroDivision(); /** * @dev Division internal error */ error FixedPointDivInternal(uint256 a, uint256 aInflated); /** * @dev Multiplies two fixed point numbers rounding down */ function mulDown(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { uint256 product = a * b; if (a != 0 && product / a != b) revert FixedPointMulOverflow(a, b); 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; if (a != 0 && product / a != b) revert FixedPointMulOverflow(a, b); 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 { if (b == 0) revert FixedPointZeroDivision(); if (a == 0) return 0; uint256 aInflated = a * ONE; if (aInflated / a != ONE) revert FixedPointDivInternal(a, aInflated); return aInflated / b; } } /** * @dev Divides two fixed point numbers rounding up */ function divUp(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { if (b == 0) revert FixedPointZeroDivision(); if (a == 0) return 0; uint256 aInflated = a * ONE; if (aInflated / a != ONE) revert FixedPointDivInternal(a, aInflated); return ((aInflated - 1) / b) + 1; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/token/ERC20/ERC20.sol'; contract TokenMock is ERC20 { uint8 internal _decimals; constructor(string memory symbol, uint8 dec) ERC20(symbol, symbol) { _decimals = dec; } function mint(address account, uint256 amount) external { _mint(account, amount); } function decimals() public view override returns (uint8) { return _decimals; } }
// 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 BytesHelpers * @dev Provides a list of Bytes helper methods */ library BytesHelpers { /** * @dev The length is shorter than start plus 32 */ error BytesOutOfBounds(uint256 start, uint256 length); /** * @dev Concatenates an address to a bytes array */ function concat(bytes memory self, address value) internal pure returns (bytes memory) { return abi.encodePacked(self, value); } /** * @dev Concatenates an uint24 to a bytes array */ function concat(bytes memory self, uint24 value) internal pure returns (bytes memory) { return abi.encodePacked(self, value); } /** * @dev Decodes a bytes array into an uint256 */ function toUint256(bytes memory self) internal pure returns (uint256) { return toUint256(self, 0); } /** * @dev Reads an uint256 from a bytes array starting at a given position */ function toUint256(bytes memory self, uint256 start) internal pure returns (uint256 result) { if (self.length < start + 32) revert BytesOutOfBounds(start, self.length); assembly { result := mload(add(add(self, 0x20), start)) } } }
// 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; // Fiat currencies follow https://en.wikipedia.org/wiki/ISO_4217 address internal constant USD = address(840); 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'; import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; import './Denominations.sol'; /** * @title ERC20Helpers * @dev Provides a list of ERC20 helper methods */ library ERC20Helpers { function approve(address token, address to, uint256 amount) internal { SafeERC20.forceApprove(IERC20(token), to, amount); } function transfer(address token, address to, uint256 amount) internal { if (Denominations.isNativeToken(token)) Address.sendValue(payable(to), amount); else SafeERC20.safeTransfer(IERC20(token), to, amount); } function balanceOf(address token, address account) internal view returns (uint256) { if (Denominations.isNativeToken(token)) return address(account).balance; else return IERC20(token).balanceOf(address(account)); } }
// 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/v3-authorizer/contracts/interfaces/IAuthorized.sol'; /** * @title IPriceOracle * @dev Price oracle interface * * Tells the price of a token (base) in a given quote based the following rule: 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] */ interface IPriceOracle is IAuthorized { /** * @dev Price data * @param base Token to rate * @param quote Token used for the price rate * @param rate Price of a token (base) expressed in `quote` * @param deadline Expiration timestamp until when the given quote is considered valid */ struct PriceData { address base; address quote; uint256 rate; uint256 deadline; } /** * @dev The signer is not allowed */ error PriceOracleInvalidSigner(address signer); /** * @dev The feed for the given (base, quote) pair doesn't exist */ error PriceOracleMissingFeed(address base, address quote); /** * @dev The price deadline is in the past */ error PriceOracleOutdatedPrice(address base, address quote, uint256 deadline, uint256 currentTimestamp); /** * @dev The base decimals are bigger than the quote decimals plus the fixed point decimals */ error PriceOracleBaseDecimalsTooBig(address base, uint256 baseDecimals, address quote, uint256 quoteDecimals); /** * @dev The inverse feed decimals are bigger than the maximum inverse feed decimals */ error PriceOracleInverseFeedDecimalsTooBig(address inverseFeed, uint256 inverseFeedDecimals); /** * @dev The quote feed decimals are bigger than the base feed decimals plus the fixed point decimals */ error PriceOracleQuoteFeedDecimalsTooBig(uint256 quoteFeedDecimals, uint256 baseFeedDecimals); /** * @dev Emitted every time a signer is changed */ event SignerSet(address indexed signer, bool allowed); /** * @dev Emitted every time a feed is set for (base, quote) pair */ event FeedSet(address indexed base, address indexed quote, address feed); /** * @dev Tells whether an address is as an allowed signer or not * @param signer Address of the signer being queried */ function isSignerAllowed(address signer) external view returns (bool); /** * @dev Tells the list of allowed signers */ function getAllowedSigners() external view returns (address[] memory); /** * @dev Tells the digest expected to be signed by the off-chain oracle signers for a list of prices * @param prices List of prices to be signed */ function getPricesDigest(PriceData[] memory prices) external view returns (bytes32); /** * @dev Tells the price of a token `base` expressed in a token `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 Tells the price of a token `base` expressed in a token `quote` * @param base Token to rate * @param quote Token used for the price rate * @param data Encoded data to validate in order to compute the requested rate */ function getPrice(address base, address quote, bytes memory data) external view returns (uint256); /** * @dev Tells the 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 getFeed(address base, address quote) external view returns (address); /** * @dev Sets a signer condition * @param signer Address of the signer to be set * @param allowed Whether the requested signer is allowed */ function setSigner(address signer, bool allowed) external; /** * @dev Sets a feed for a (base, quote) pair * @param base Token base to be set * @param quote Token quote to be set * @param feed Feed to be set */ function setFeed(address base, address quote, address feed) 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; /** * @dev Relayer interface */ interface IRelayer { /** * @dev The token is zero */ error RelayerTokenZero(); /** * @dev The amount is zero */ error RelayerAmountZero(); /** * @dev The collector is zero */ error RelayerCollectorZero(); /** * @dev The recipient is zero */ error RelayerRecipientZero(); /** * @dev The executor is zero */ error RelayerExecutorZero(); /** * @dev Relayer no task given to execute */ error RelayerNoTaskGiven(); /** * @dev Relayer input length mismatch */ error RelayerInputLengthMismatch(); /** * @dev The sender is not allowed */ error RelayerExecutorNotAllowed(address sender); /** * @dev Trying to execute tasks from different smart vaults */ error RelayerMultipleTaskSmartVaults(address task, address taskSmartVault, address expectedSmartVault); /** * @dev The task to execute does not have permissions on the associated smart vault */ error RelayerTaskDoesNotHavePermissions(address task, address smartVault); /** * @dev The smart vault balance plus the available quota are lower than the amount to pay the relayer */ error RelayerPaymentInsufficientBalance(address smartVault, uint256 balance, uint256 quota, uint256 amount); /** * @dev It failed to send amount minus quota to the smart vault's collector */ error RelayerPaymentFailed(address smartVault, uint256 amount, uint256 quota); /** * @dev The smart vault balance is lower than the amount to withdraw */ error RelayerWithdrawInsufficientBalance(address sender, uint256 balance, uint256 amount); /** * @dev It failed to send the amount to the sender */ error RelayerWithdrawFailed(address sender, uint256 amount); /** * @dev The value sent and the amount differ */ error RelayerValueDoesNotMatchAmount(uint256 value, uint256 amount); /** * @dev The simulation executed properly */ error RelayerSimulationResult(TaskResult[] taskResults); /** * @dev Emitted every time an executor is configured */ event ExecutorSet(address indexed executor, bool allowed); /** * @dev Emitted every time the default collector is set */ event DefaultCollectorSet(address indexed collector); /** * @dev Emitted every time a collector is set for a smart vault */ event SmartVaultCollectorSet(address indexed smartVault, address indexed collector); /** * @dev Emitted every time a smart vault's maximum quota is set */ event SmartVaultMaxQuotaSet(address indexed smartVault, uint256 maxQuota); /** * @dev Emitted every time a smart vault's task is executed */ event TaskExecuted( address indexed smartVault, address indexed task, bytes data, bool success, bytes result, uint256 gas, uint256 index ); /** * @dev Emitted every time some native tokens are deposited for the smart vault's balance */ event Deposited(address indexed smartVault, uint256 amount); /** * @dev Emitted every time some native tokens are withdrawn from the smart vault's balance */ event Withdrawn(address indexed smartVault, uint256 amount); /** * @dev Emitted every time some ERC20 tokens are withdrawn from the relayer to an external account */ event FundsRescued(address indexed token, address indexed recipient, uint256 amount); /** * @dev Emitted every time a smart vault's quota is paid */ event QuotaPaid(address indexed smartVault, uint256 amount); /** * @dev Emitted every time a smart vault pays for transaction gas to the relayer */ event GasPaid(address indexed smartVault, uint256 amount, uint256 quota); /** * @dev Task result * @param success Whether the task execution succeeds or not * @param result Result of the task execution */ struct TaskResult { bool success; bytes result; } /** * @dev Tells the default collector address */ function defaultCollector() external view returns (address); /** * @dev Tells whether an executor is allowed * @param executor Address of the executor being queried */ function isExecutorAllowed(address executor) external view returns (bool); /** * @dev Tells the smart vault available balance to relay transactions * @param smartVault Address of the smart vault being queried */ function getSmartVaultBalance(address smartVault) external view returns (uint256); /** * @dev Tells the custom collector address set for a smart vault * @param smartVault Address of the smart vault being queried */ function getSmartVaultCollector(address smartVault) external view returns (address); /** * @dev Tells the smart vault maximum quota to be used * @param smartVault Address of the smart vault being queried */ function getSmartVaultMaxQuota(address smartVault) external view returns (uint256); /** * @dev Tells the smart vault used quota * @param smartVault Address of the smart vault being queried */ function getSmartVaultUsedQuota(address smartVault) external view returns (uint256); /** * @dev Tells the collector address applicable for a smart vault * @param smartVault Address of the smart vault being queried */ function getApplicableCollector(address smartVault) external view returns (address); /** * @dev Configures an external executor * @param executor Address of the executor to be set * @param allowed Whether the given executor should be allowed or not */ function setExecutor(address executor, bool allowed) external; /** * @dev Sets the default collector * @param collector Address of the new default collector to be set */ function setDefaultCollector(address collector) external; /** * @dev Sets a custom collector for a smart vault * @param smartVault Address of smart vault to set a collector for * @param collector Address of the collector to be set for the given smart vault */ function setSmartVaultCollector(address smartVault, address collector) external; /** * @dev Sets a maximum quota for a smart vault * @param smartVault Address of smart vault to set a maximum quota for * @param maxQuota Maximum quota to be set for the given smart vault */ function setSmartVaultMaxQuota(address smartVault, uint256 maxQuota) external; /** * @dev Deposits native tokens for a given smart vault * @param smartVault Address of smart vault to deposit balance for * @param amount Amount of native tokens to be deposited, must match msg.value */ function deposit(address smartVault, uint256 amount) external payable; /** * @dev Withdraws native tokens from a given smart vault * @param amount Amount of native tokens to be withdrawn */ function withdraw(uint256 amount) external; /** * @dev Executes a list of tasks * @param tasks Addresses of the tasks to execute * @param data List of calldata to execute each of the given tasks * @param continueIfFailed Whether the execution should fail in case one of the tasks fail */ function execute(address[] memory tasks, bytes[] memory data, bool continueIfFailed) external; /** * @dev Simulates an execution. * WARNING: THIS METHOD IS MEANT TO BE USED AS A VIEW FUNCTION * This method will always revert. Successful results or task execution errors are returned as * `RelayerSimulationResult` errors. Any other error should be treated as failure. * @param tasks Addresses of the tasks to simulate the execution of * @param data List of calldata to simulate each of the given tasks execution * @param continueIfFailed Whether the simulation should fail in case one of the tasks execution fails */ function simulate(address[] memory tasks, bytes[] memory data, bool continueIfFailed) external; /** * @dev Withdraw ERC20 tokens to an external account. To be used in case of accidental token transfers. * @param token Address of the token to be withdrawn * @param recipient Address where the tokens will be transferred to * @param amount Amount of tokens to withdraw */ function rescueFunds(address token, address recipient, 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; import '@mimic-fi/v3-authorizer/contracts/interfaces/IAuthorized.sol'; /** * @dev Smart Vault interface */ interface ISmartVault is IAuthorized { /** * @dev The smart vault is paused */ error SmartVaultPaused(); /** * @dev The smart vault is unpaused */ error SmartVaultUnpaused(); /** * @dev The token is zero */ error SmartVaultTokenZero(); /** * @dev The amount is zero */ error SmartVaultAmountZero(); /** * @dev The recipient is zero */ error SmartVaultRecipientZero(); /** * @dev The connector is deprecated */ error SmartVaultConnectorDeprecated(address connector); /** * @dev The connector is not registered */ error SmartVaultConnectorNotRegistered(address connector); /** * @dev The connector is not stateless */ error SmartVaultConnectorNotStateless(address connector); /** * @dev The connector ID is zero */ error SmartVaultBalanceConnectorIdZero(); /** * @dev The balance connector's balance is lower than the requested amount to be deducted */ error SmartVaultBalanceConnectorInsufficientBalance(bytes32 id, address token, uint256 balance, uint256 amount); /** * @dev The smart vault's native token balance is lower than the requested amount to be deducted */ error SmartVaultInsufficientNativeTokenBalance(uint256 balance, uint256 amount); /** * @dev Emitted every time a smart vault is paused */ event Paused(); /** * @dev Emitted every time a smart vault is unpaused */ event Unpaused(); /** * @dev Emitted every time the price oracle is set */ event PriceOracleSet(address indexed priceOracle); /** * @dev Emitted every time a connector check is overridden */ event ConnectorCheckOverridden(address indexed connector, bool ignored); /** * @dev Emitted every time a balance connector is updated */ event BalanceConnectorUpdated(bytes32 indexed id, address indexed token, uint256 amount, bool added); /** * @dev Emitted every time `execute` is called */ event Executed(address indexed connector, bytes data, bytes result); /** * @dev Emitted every time `call` is called */ event Called(address indexed target, bytes data, uint256 value, bytes result); /** * @dev Emitted every time `wrap` is called */ event Wrapped(uint256 amount); /** * @dev Emitted every time `unwrap` is called */ event Unwrapped(uint256 amount); /** * @dev Emitted every time `collect` is called */ event Collected(address indexed token, address indexed from, uint256 amount); /** * @dev Emitted every time `withdraw` is called */ event Withdrawn(address indexed token, address indexed recipient, uint256 amount, uint256 fee); /** * @dev Tells if the smart vault is paused or not */ function isPaused() external view returns (bool); /** * @dev Tells the address of the price oracle */ function priceOracle() external view returns (address); /** * @dev Tells the address of the Mimic's registry */ function registry() external view returns (address); /** * @dev Tells the address of the Mimic's fee controller */ function feeController() external view returns (address); /** * @dev Tells the address of the wrapped native token */ function wrappedNativeToken() external view returns (address); /** * @dev Tells if a connector check is ignored * @param connector Address of the connector being queried */ function isConnectorCheckIgnored(address connector) external view returns (bool); /** * @dev Tells the balance to a balance connector for a token * @param id Balance connector identifier * @param token Address of the token querying the balance connector for */ function getBalanceConnector(bytes32 id, address token) external view returns (uint256); /** * @dev Tells whether someone has any permission over the smart vault */ function hasPermissions(address who) external view returns (bool); /** * @dev Pauses a smart vault */ function pause() external; /** * @dev Unpauses a smart vault */ function unpause() external; /** * @dev Sets the price oracle * @param newPriceOracle Address of the new price oracle to be set */ function setPriceOracle(address newPriceOracle) external; /** * @dev Overrides connector checks * @param connector Address of the connector to override its check * @param ignored Whether the connector check should be ignored */ function overrideConnectorCheck(address connector, bool ignored) external; /** * @dev Updates a balance connector * @param id Balance connector identifier to be updated * @param token Address of the token to update the balance connector for * @param amount Amount to be updated to the balance connector * @param add Whether the balance connector should be increased or decreased */ function updateBalanceConnector(bytes32 id, address token, uint256 amount, bool add) external; /** * @dev Executes a connector inside of the Smart Vault context * @param connector Address of the connector that will be executed * @param data Call data to be used for the delegate-call * @return result Call response if it was successful, otherwise it reverts */ function execute(address connector, bytes memory data) external returns (bytes memory result); /** * @dev Executes an arbitrary call from the Smart Vault * @param target Address where the call will be sent * @param data Call data 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 data, uint256 value) external returns (bytes memory result); /** * @dev Wrap an amount of native tokens to the wrapped ERC20 version of it * @param amount Amount of native tokens to be wrapped */ function wrap(uint256 amount) external; /** * @dev Unwrap an amount of wrapped native tokens * @param amount Amount of wrapped native tokens to unwrapped */ function unwrap(uint256 amount) external; /** * @dev Collect tokens from an external account to the Smart Vault * @param token Address of the token to be collected * @param from Address where the tokens will be transferred from * @param amount Amount of tokens to be transferred */ function collect(address token, address from, uint256 amount) external; /** * @dev Withdraw tokens to an external account * @param token Address of the token to be withdrawn * @param recipient Address where the tokens will be transferred to * @param amount Amount of tokens to withdraw */ function withdraw(address token, address recipient, uint256 amount) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.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] * ```solidity * 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. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.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. * * 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. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * 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. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ 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. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.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.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * 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}. * * 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 default value returned by this function, unless * it's 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; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _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; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _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; // Overflow not possible: amount <= accountBalance <= totalSupply. _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/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.9.0) (token/ERC20/extensions/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 (last updated v4.9.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.9.3) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/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; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ 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)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ 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"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ 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"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation 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). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts 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.9.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.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) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 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. If 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)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 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) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; import "./math/SignedMath.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // ---------------------------------------------------------------------------- // DateTime Library v2.0 // // A gas-efficient Solidity date and time library // // https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary // // Tested date range 1970/01/01 to 2345/12/31 // // Conventions: // Unit | Range | Notes // :-------- |:-------------:|:----- // timestamp | >= 0 | Unix timestamp, number of seconds since 1970/01/01 00:00:00 UTC // year | 1970 ... 2345 | // month | 1 ... 12 | // day | 1 ... 31 | // hour | 0 ... 23 | // minute | 0 ... 59 | // second | 0 ... 59 | // dayOfWeek | 1 ... 7 | 1 = Monday, ..., 7 = Sunday // // // Enjoy. (c) BokkyPooBah / Bok Consulting Pty Ltd 2018-2019. The MIT Licence. // ---------------------------------------------------------------------------- library DateTime { uint256 constant SECONDS_PER_DAY = 24 * 60 * 60; uint256 constant SECONDS_PER_HOUR = 60 * 60; uint256 constant SECONDS_PER_MINUTE = 60; int256 constant OFFSET19700101 = 2440588; uint256 constant DOW_MON = 1; uint256 constant DOW_TUE = 2; uint256 constant DOW_WED = 3; uint256 constant DOW_THU = 4; uint256 constant DOW_FRI = 5; uint256 constant DOW_SAT = 6; uint256 constant DOW_SUN = 7; // ------------------------------------------------------------------------ // Calculate the number of days from 1970/01/01 to year/month/day using // the date conversion algorithm from // http://aa.usno.navy.mil/faq/docs/JD_Formula.php // and subtracting the offset 2440588 so that 1970/01/01 is day 0 // // days = day // - 32075 // + 1461 * (year + 4800 + (month - 14) / 12) / 4 // + 367 * (month - 2 - (month - 14) / 12 * 12) / 12 // - 3 * ((year + 4900 + (month - 14) / 12) / 100) / 4 // - offset // ------------------------------------------------------------------------ function _daysFromDate(uint256 year, uint256 month, uint256 day) internal pure returns (uint256 _days) { require(year >= 1970); int256 _year = int256(year); int256 _month = int256(month); int256 _day = int256(day); int256 __days = _day - 32075 + (1461 * (_year + 4800 + (_month - 14) / 12)) / 4 + (367 * (_month - 2 - ((_month - 14) / 12) * 12)) / 12 - (3 * ((_year + 4900 + (_month - 14) / 12) / 100)) / 4 - OFFSET19700101; _days = uint256(__days); } // ------------------------------------------------------------------------ // Calculate year/month/day from the number of days since 1970/01/01 using // the date conversion algorithm from // http://aa.usno.navy.mil/faq/docs/JD_Formula.php // and adding the offset 2440588 so that 1970/01/01 is day 0 // // int L = days + 68569 + offset // int N = 4 * L / 146097 // L = L - (146097 * N + 3) / 4 // year = 4000 * (L + 1) / 1461001 // L = L - 1461 * year / 4 + 31 // month = 80 * L / 2447 // dd = L - 2447 * month / 80 // L = month / 11 // month = month + 2 - 12 * L // year = 100 * (N - 49) + year + L // ------------------------------------------------------------------------ function _daysToDate(uint256 _days) internal pure returns (uint256 year, uint256 month, uint256 day) { unchecked { int256 __days = int256(_days); int256 L = __days + 68569 + OFFSET19700101; int256 N = (4 * L) / 146097; L = L - (146097 * N + 3) / 4; int256 _year = (4000 * (L + 1)) / 1461001; L = L - (1461 * _year) / 4 + 31; int256 _month = (80 * L) / 2447; int256 _day = L - (2447 * _month) / 80; L = _month / 11; _month = _month + 2 - 12 * L; _year = 100 * (N - 49) + _year + L; year = uint256(_year); month = uint256(_month); day = uint256(_day); } } function timestampFromDate(uint256 year, uint256 month, uint256 day) internal pure returns (uint256 timestamp) { timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY; } function timestampFromDateTime( uint256 year, uint256 month, uint256 day, uint256 hour, uint256 minute, uint256 second ) internal pure returns (uint256 timestamp) { timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + hour * SECONDS_PER_HOUR + minute * SECONDS_PER_MINUTE + second; } function timestampToDate(uint256 timestamp) internal pure returns (uint256 year, uint256 month, uint256 day) { unchecked { (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY); } } function timestampToDateTime(uint256 timestamp) internal pure returns (uint256 year, uint256 month, uint256 day, uint256 hour, uint256 minute, uint256 second) { unchecked { (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY); uint256 secs = timestamp % SECONDS_PER_DAY; hour = secs / SECONDS_PER_HOUR; secs = secs % SECONDS_PER_HOUR; minute = secs / SECONDS_PER_MINUTE; second = secs % SECONDS_PER_MINUTE; } } function isValidDate(uint256 year, uint256 month, uint256 day) internal pure returns (bool valid) { if (year >= 1970 && month > 0 && month <= 12) { uint256 daysInMonth = _getDaysInMonth(year, month); if (day > 0 && day <= daysInMonth) { valid = true; } } } function isValidDateTime(uint256 year, uint256 month, uint256 day, uint256 hour, uint256 minute, uint256 second) internal pure returns (bool valid) { if (isValidDate(year, month, day)) { if (hour < 24 && minute < 60 && second < 60) { valid = true; } } } function isLeapYear(uint256 timestamp) internal pure returns (bool leapYear) { (uint256 year,,) = _daysToDate(timestamp / SECONDS_PER_DAY); leapYear = _isLeapYear(year); } function _isLeapYear(uint256 year) internal pure returns (bool leapYear) { leapYear = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0); } function isWeekDay(uint256 timestamp) internal pure returns (bool weekDay) { weekDay = getDayOfWeek(timestamp) <= DOW_FRI; } function isWeekEnd(uint256 timestamp) internal pure returns (bool weekEnd) { weekEnd = getDayOfWeek(timestamp) >= DOW_SAT; } function getDaysInMonth(uint256 timestamp) internal pure returns (uint256 daysInMonth) { (uint256 year, uint256 month,) = _daysToDate(timestamp / SECONDS_PER_DAY); daysInMonth = _getDaysInMonth(year, month); } function _getDaysInMonth(uint256 year, uint256 month) internal pure returns (uint256 daysInMonth) { if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) { daysInMonth = 31; } else if (month != 2) { daysInMonth = 30; } else { daysInMonth = _isLeapYear(year) ? 29 : 28; } } // 1 = Monday, 7 = Sunday function getDayOfWeek(uint256 timestamp) internal pure returns (uint256 dayOfWeek) { uint256 _days = timestamp / SECONDS_PER_DAY; dayOfWeek = ((_days + 3) % 7) + 1; } function getYear(uint256 timestamp) internal pure returns (uint256 year) { (year,,) = _daysToDate(timestamp / SECONDS_PER_DAY); } function getMonth(uint256 timestamp) internal pure returns (uint256 month) { (, month,) = _daysToDate(timestamp / SECONDS_PER_DAY); } function getDay(uint256 timestamp) internal pure returns (uint256 day) { (,, day) = _daysToDate(timestamp / SECONDS_PER_DAY); } function getHour(uint256 timestamp) internal pure returns (uint256 hour) { uint256 secs = timestamp % SECONDS_PER_DAY; hour = secs / SECONDS_PER_HOUR; } function getMinute(uint256 timestamp) internal pure returns (uint256 minute) { uint256 secs = timestamp % SECONDS_PER_HOUR; minute = secs / SECONDS_PER_MINUTE; } function getSecond(uint256 timestamp) internal pure returns (uint256 second) { second = timestamp % SECONDS_PER_MINUTE; } function addYears(uint256 timestamp, uint256 _years) internal pure returns (uint256 newTimestamp) { (uint256 year, uint256 month, uint256 day) = _daysToDate(timestamp / SECONDS_PER_DAY); year += _years; uint256 daysInMonth = _getDaysInMonth(year, month); if (day > daysInMonth) { day = daysInMonth; } newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + (timestamp % SECONDS_PER_DAY); require(newTimestamp >= timestamp); } function addMonths(uint256 timestamp, uint256 _months) internal pure returns (uint256 newTimestamp) { (uint256 year, uint256 month, uint256 day) = _daysToDate(timestamp / SECONDS_PER_DAY); month += _months; year += (month - 1) / 12; month = ((month - 1) % 12) + 1; uint256 daysInMonth = _getDaysInMonth(year, month); if (day > daysInMonth) { day = daysInMonth; } newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + (timestamp % SECONDS_PER_DAY); require(newTimestamp >= timestamp); } function addDays(uint256 timestamp, uint256 _days) internal pure returns (uint256 newTimestamp) { newTimestamp = timestamp + _days * SECONDS_PER_DAY; require(newTimestamp >= timestamp); } function addHours(uint256 timestamp, uint256 _hours) internal pure returns (uint256 newTimestamp) { newTimestamp = timestamp + _hours * SECONDS_PER_HOUR; require(newTimestamp >= timestamp); } function addMinutes(uint256 timestamp, uint256 _minutes) internal pure returns (uint256 newTimestamp) { newTimestamp = timestamp + _minutes * SECONDS_PER_MINUTE; require(newTimestamp >= timestamp); } function addSeconds(uint256 timestamp, uint256 _seconds) internal pure returns (uint256 newTimestamp) { newTimestamp = timestamp + _seconds; require(newTimestamp >= timestamp); } function subYears(uint256 timestamp, uint256 _years) internal pure returns (uint256 newTimestamp) { (uint256 year, uint256 month, uint256 day) = _daysToDate(timestamp / SECONDS_PER_DAY); year -= _years; uint256 daysInMonth = _getDaysInMonth(year, month); if (day > daysInMonth) { day = daysInMonth; } newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + (timestamp % SECONDS_PER_DAY); require(newTimestamp <= timestamp); } function subMonths(uint256 timestamp, uint256 _months) internal pure returns (uint256 newTimestamp) { (uint256 year, uint256 month, uint256 day) = _daysToDate(timestamp / SECONDS_PER_DAY); uint256 yearMonth = year * 12 + (month - 1) - _months; year = yearMonth / 12; month = (yearMonth % 12) + 1; uint256 daysInMonth = _getDaysInMonth(year, month); if (day > daysInMonth) { day = daysInMonth; } newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + (timestamp % SECONDS_PER_DAY); require(newTimestamp <= timestamp); } function subDays(uint256 timestamp, uint256 _days) internal pure returns (uint256 newTimestamp) { newTimestamp = timestamp - _days * SECONDS_PER_DAY; require(newTimestamp <= timestamp); } function subHours(uint256 timestamp, uint256 _hours) internal pure returns (uint256 newTimestamp) { newTimestamp = timestamp - _hours * SECONDS_PER_HOUR; require(newTimestamp <= timestamp); } function subMinutes(uint256 timestamp, uint256 _minutes) internal pure returns (uint256 newTimestamp) { newTimestamp = timestamp - _minutes * SECONDS_PER_MINUTE; require(newTimestamp <= timestamp); } function subSeconds(uint256 timestamp, uint256 _seconds) internal pure returns (uint256 newTimestamp) { newTimestamp = timestamp - _seconds; require(newTimestamp <= timestamp); } function diffYears(uint256 fromTimestamp, uint256 toTimestamp) internal pure returns (uint256 _years) { require(fromTimestamp <= toTimestamp); (uint256 fromYear,,) = _daysToDate(fromTimestamp / SECONDS_PER_DAY); (uint256 toYear,,) = _daysToDate(toTimestamp / SECONDS_PER_DAY); _years = toYear - fromYear; } function diffMonths(uint256 fromTimestamp, uint256 toTimestamp) internal pure returns (uint256 _months) { require(fromTimestamp <= toTimestamp); (uint256 fromYear, uint256 fromMonth,) = _daysToDate(fromTimestamp / SECONDS_PER_DAY); (uint256 toYear, uint256 toMonth,) = _daysToDate(toTimestamp / SECONDS_PER_DAY); _months = toYear * 12 + toMonth - fromYear * 12 - fromMonth; } function diffDays(uint256 fromTimestamp, uint256 toTimestamp) internal pure returns (uint256 _days) { require(fromTimestamp <= toTimestamp); _days = (toTimestamp - fromTimestamp) / SECONDS_PER_DAY; } function diffHours(uint256 fromTimestamp, uint256 toTimestamp) internal pure returns (uint256 _hours) { require(fromTimestamp <= toTimestamp); _hours = (toTimestamp - fromTimestamp) / SECONDS_PER_HOUR; } function diffMinutes(uint256 fromTimestamp, uint256 toTimestamp) internal pure returns (uint256 _minutes) { require(fromTimestamp <= toTimestamp); _minutes = (toTimestamp - fromTimestamp) / SECONDS_PER_MINUTE; } function diffSeconds(uint256 fromTimestamp, uint256 toTimestamp) internal pure returns (uint256 _seconds) { require(fromTimestamp <= toTimestamp); _seconds = toTimestamp - fromTimestamp; } }
// 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/v3-authorizer/contracts/Authorized.sol'; import '@mimic-fi/v3-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v3-helpers/contracts/utils/Denominations.sol'; import '@mimic-fi/v3-price-oracle/contracts/interfaces/IPriceOracle.sol'; import '@mimic-fi/v3-smart-vault/contracts/interfaces/ISmartVault.sol'; import '../interfaces/base/IBaseTask.sol'; /** * @title BaseTask * @dev Base task implementation with a Smart Vault reference and using the Authorizer */ abstract contract BaseTask is IBaseTask, Authorized { // Smart Vault reference address public override smartVault; // Optional balance connector id for the previous task in the workflow bytes32 internal previousBalanceConnectorId; // Optional balance connector id for the next task in the workflow bytes32 internal nextBalanceConnectorId; /** * @dev Base task config. Only used in the initializer. * @param smartVault Address of the smart vault this task will reference, it cannot be changed once set * @param previousBalanceConnectorId Balance connector id for the previous task in the workflow * @param nextBalanceConnectorId Balance connector id for the next task in the workflow */ struct BaseConfig { address smartVault; bytes32 previousBalanceConnectorId; bytes32 nextBalanceConnectorId; } /** * @dev Initializes the base task. It does call upper contracts initializers. * @param config Base task config */ function __BaseTask_init(BaseConfig memory config) internal onlyInitializing { __Authorized_init(ISmartVault(config.smartVault).authorizer()); __BaseTask_init_unchained(config); } /** * @dev Initializes the base task. It does not call upper contracts initializers. * @param config Base task config */ function __BaseTask_init_unchained(BaseConfig memory config) internal onlyInitializing { smartVault = config.smartVault; _setBalanceConnectors(config.previousBalanceConnectorId, config.nextBalanceConnectorId); } /** * @dev Tells the address from where the token amounts to execute this task are fetched. * Since by default tasks are supposed to use balance connectors, the tokens source has to be the smart vault. * In case a task does not need to rely on a previous balance connector, it must override this function to specify * where it is getting its tokens from. */ function getTokensSource() external view virtual override returns (address) { return smartVault; } /** * @dev Tells the amount a task should use for a token. By default tasks are expected to use balance connectors. * In case a task relies on an external tokens source, it must override how the task amount is calculated. * @param token Address of the token being queried */ function getTaskAmount(address token) public view virtual override returns (uint256) { return ISmartVault(smartVault).getBalanceConnector(previousBalanceConnectorId, token); } /** * @dev Tells the previous and next balance connectors id of the previous task in the workflow */ function getBalanceConnectors() external view returns (bytes32 previous, bytes32 next) { previous = previousBalanceConnectorId; next = nextBalanceConnectorId; } /** * @dev Sets the balance connectors * @param previous Balance connector id of the previous task in the workflow * @param next Balance connector id of the next task in the workflow */ function setBalanceConnectors(bytes32 previous, bytes32 next) external override authP(authParams(previous, next)) { _setBalanceConnectors(previous, next); } /** * @dev Tells the wrapped native token address if the given address is the native token * @param token Address of the token to be checked */ function _wrappedIfNative(address token) internal view returns (address) { return Denominations.isNativeToken(token) ? _wrappedNativeToken() : token; } /** * @dev Tells whether a token is the native or the wrapped native token * @param token Address of the token to be checked */ function _isWrappedOrNative(address token) internal view returns (bool) { return Denominations.isNativeToken(token) || token == _wrappedNativeToken(); } /** * @dev Tells the wrapped native token address */ function _wrappedNativeToken() internal view returns (address) { return ISmartVault(smartVault).wrappedNativeToken(); } /** * @dev Fetches a base/quote price from the smart vault's price oracle * @param base Token to rate * @param quote Token used for the price rate */ function _getPrice(address base, address quote) internal view virtual returns (uint256) { address priceOracle = ISmartVault(smartVault).priceOracle(); if (priceOracle == address(0)) revert TaskSmartVaultPriceOracleNotSet(smartVault); bytes memory extraCallData = _decodeExtraCallData(); return extraCallData.length == 0 ? IPriceOracle(priceOracle).getPrice(_wrappedIfNative(base), _wrappedIfNative(quote)) : IPriceOracle(priceOracle).getPrice(_wrappedIfNative(base), _wrappedIfNative(quote), extraCallData); } /** * @dev Before base task hook */ function _beforeBaseTask(address token, uint256 amount) internal virtual { _decreaseBalanceConnector(token, amount); } /** * @dev After base task hook */ function _afterBaseTask(address, uint256) internal virtual { emit Executed(); } /** * @dev Decreases the previous balance connector in the smart vault if defined * @param token Address of the token to update the previous balance connector of * @param amount Amount to be updated */ function _decreaseBalanceConnector(address token, uint256 amount) internal { if (previousBalanceConnectorId != bytes32(0)) { ISmartVault(smartVault).updateBalanceConnector(previousBalanceConnectorId, token, amount, false); } } /** * @dev Increases the next balance connector in the smart vault if defined * @param token Address of the token to update the next balance connector of * @param amount Amount to be updated */ function _increaseBalanceConnector(address token, uint256 amount) internal { if (nextBalanceConnectorId != bytes32(0)) { ISmartVault(smartVault).updateBalanceConnector(nextBalanceConnectorId, token, amount, true); } } /** * @dev Sets the balance connectors * @param previous Balance connector id of the previous task in the workflow * @param next Balance connector id of the next task in the workflow */ function _setBalanceConnectors(bytes32 previous, bytes32 next) internal virtual { if (previous == next && previous != bytes32(0)) revert TaskSameBalanceConnectors(previous); previousBalanceConnectorId = previous; nextBalanceConnectorId = next; emit BalanceConnectorsSet(previous, next); } /** * @dev Decodes any potential extra calldata stored in the calldata space. Tasks relying on the extra calldata * pattern, assume that the last word of the calldata stores the extra calldata length so it can be decoded. Note * that tasks relying on this pattern must contemplate this function may return bogus data if no extra calldata * was given. */ function _decodeExtraCallData() private pure returns (bytes memory data) { uint256 length = uint256(_decodeLastCallDataWord()); if (msg.data.length < length) return new bytes(0); data = new bytes(length); assembly { calldatacopy(add(data, 0x20), sub(sub(calldatasize(), length), 0x20), length) } } /** * @dev Returns the last calldata word. This function returns zero if the calldata is not long enough. */ function _decodeLastCallDataWord() private pure returns (bytes32 result) { if (msg.data.length < 36) return bytes32(0); assembly { result := calldataload(sub(calldatasize(), 0x20)) } } }
// 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.17; import '@mimic-fi/v3-authorizer/contracts/Authorized.sol'; import '@mimic-fi/v3-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v3-smart-vault/contracts/interfaces/ISmartVault.sol'; import '../interfaces/base/IGasLimitedTask.sol'; /** * @dev Gas config for tasks. It allows setting different gas-related configs, specially useful to control relayed txs. */ abstract contract GasLimitedTask is IGasLimitedTask, Authorized { using FixedPoint for uint256; // Variable used to allow a better developer experience to reimburse tx gas cost // solhint-disable-next-line var-name-mixedcase uint256 private __initialGas__; // Gas limits config GasLimitConfig internal gasLimits; /** * @dev Gas limits config * @param gasPriceLimit Gas price limit expressed in the native token * @param priorityFeeLimit Priority fee limit expressed in the native token * @param txCostLimit Transaction cost limit to be set * @param txCostLimitPct Transaction cost limit percentage to be set */ struct GasLimitConfig { uint256 gasPriceLimit; uint256 priorityFeeLimit; uint256 txCostLimit; uint256 txCostLimitPct; } /** * @dev Initializes the gas limited task. It does call upper contracts initializers. * @param config Gas limited task config */ function __GasLimitedTask_init(GasLimitConfig memory config) internal onlyInitializing { __GasLimitedTask_init_unchained(config); } /** * @dev Initializes the gas limited task. It does not call upper contracts initializers. * @param config Gas limited task config */ function __GasLimitedTask_init_unchained(GasLimitConfig memory config) internal onlyInitializing { _setGasLimits(config.gasPriceLimit, config.priorityFeeLimit, config.txCostLimit, config.txCostLimitPct); } /** * @dev Tells the gas limits config */ function getGasLimits() external view returns (uint256 gasPriceLimit, uint256 priorityFeeLimit, uint256 txCostLimit, uint256 txCostLimitPct) { return (gasLimits.gasPriceLimit, gasLimits.priorityFeeLimit, gasLimits.txCostLimit, gasLimits.txCostLimitPct); } /** * @dev Sets the gas limits config * @param newGasPriceLimit New gas price limit to be set * @param newPriorityFeeLimit New priority fee limit to be set * @param newTxCostLimit New tx cost limit to be set * @param newTxCostLimitPct New tx cost percentage limit to be set */ function setGasLimits( uint256 newGasPriceLimit, uint256 newPriorityFeeLimit, uint256 newTxCostLimit, uint256 newTxCostLimitPct ) external override authP(authParams(newGasPriceLimit, newPriorityFeeLimit, newTxCostLimit, newTxCostLimitPct)) { _setGasLimits(newGasPriceLimit, newPriorityFeeLimit, newTxCostLimit, newTxCostLimitPct); } /** * @dev Fetches a base/quote price */ function _getPrice(address base, address quote) internal view virtual returns (uint256); /** * @dev Initializes gas limited tasks and validates gas price limit */ function _beforeGasLimitedTask(address, uint256) internal virtual { __initialGas__ = gasleft(); GasLimitConfig memory config = gasLimits; bool isGasPriceAllowed = config.gasPriceLimit == 0 || tx.gasprice <= config.gasPriceLimit; if (!isGasPriceAllowed) revert TaskGasPriceLimitExceeded(tx.gasprice, config.gasPriceLimit); uint256 priorityFee = tx.gasprice - block.basefee; bool isPriorityFeeAllowed = config.priorityFeeLimit == 0 || priorityFee <= config.priorityFeeLimit; if (!isPriorityFeeAllowed) revert TaskPriorityFeeLimitExceeded(priorityFee, config.priorityFeeLimit); } /** * @dev Validates transaction cost limit */ function _afterGasLimitedTask(address token, uint256 amount) internal virtual { if (__initialGas__ == 0) revert TaskGasNotInitialized(); GasLimitConfig memory config = gasLimits; uint256 totalGas = __initialGas__ - gasleft(); uint256 totalCost = totalGas * tx.gasprice; bool isTxCostAllowed = config.txCostLimit == 0 || totalCost <= config.txCostLimit; if (!isTxCostAllowed) revert TaskTxCostLimitExceeded(totalCost, config.txCostLimit); delete __initialGas__; if (config.txCostLimitPct > 0 && amount > 0) { uint256 price = _getPrice(ISmartVault(this.smartVault()).wrappedNativeToken(), token); uint256 totalCostInToken = totalCost.mulUp(price); uint256 txCostPct = totalCostInToken.divUp(amount); if (txCostPct > config.txCostLimitPct) revert TaskTxCostLimitPctExceeded(txCostPct, config.txCostLimitPct); } } /** * @dev Sets the gas limits config * @param newGasPriceLimit New gas price limit to be set * @param newPriorityFeeLimit New priority fee limit to be set * @param newTxCostLimit New tx cost limit to be set * @param newTxCostLimitPct New tx cost percentage limit to be set */ function _setGasLimits( uint256 newGasPriceLimit, uint256 newPriorityFeeLimit, uint256 newTxCostLimit, uint256 newTxCostLimitPct ) internal { if (newTxCostLimitPct > FixedPoint.ONE) revert TaskTxCostLimitPctAboveOne(); gasLimits.gasPriceLimit = newGasPriceLimit; gasLimits.priorityFeeLimit = newPriorityFeeLimit; gasLimits.txCostLimit = newTxCostLimit; gasLimits.txCostLimitPct = newTxCostLimitPct; emit GasLimitsSet(newGasPriceLimit, newPriorityFeeLimit, newTxCostLimit, newTxCostLimitPct); } }
// 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.17; import '@mimic-fi/v3-authorizer/contracts/Authorized.sol'; import '@mimic-fi/v3-helpers/contracts/math/FixedPoint.sol'; import '../interfaces/base/IPausableTask.sol'; /** * @dev Pausable config for tasks */ abstract contract PausableTask is IPausableTask, Authorized { using FixedPoint for uint256; // Whether the task is paused or not bool public override isPaused; /** * @dev Initializes the pausable task. It does call upper contracts initializers. */ function __PausableTask_init() internal onlyInitializing { __PausableTask_init_unchained(); } /** * @dev Initializes the pausable task. It does not call upper contracts initializers. */ function __PausableTask_init_unchained() internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Pauses a task */ function pause() external override auth { if (isPaused) revert TaskPaused(); isPaused = true; emit Paused(); } /** * @dev Unpauses a task */ function unpause() external override auth { if (!isPaused) revert TaskUnpaused(); isPaused = false; emit Unpaused(); } /** * @dev Before pausable task hook */ function _beforePausableTask(address, uint256) internal virtual { if (isPaused) revert TaskPaused(); } /** * @dev After pausable task hook */ function _afterPausableTask(address, uint256) internal virtual { // 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.3; import '@quant-finance/solidity-datetime/contracts/DateTime.sol'; import '@mimic-fi/v3-authorizer/contracts/Authorized.sol'; import '../interfaces/base/ITimeLockedTask.sol'; /** * @dev Time lock config for tasks. It allows limiting the frequency of a task. */ abstract contract TimeLockedTask is ITimeLockedTask, Authorized { using DateTime for uint256; uint256 private constant DAYS_28 = 60 * 60 * 24 * 28; /** * @dev Time-locks supports different frequency modes * @param Seconds To indicate the execution must occur every certain number of seconds * @param OnDay To indicate the execution must occur on day number from 1 to 28 every certain months * @param OnLastMonthDay To indicate the execution must occur on the last day of the month every certain months */ enum Mode { Seconds, OnDay, OnLastMonthDay } // Time lock mode Mode internal _mode; // Time lock frequency uint256 internal _frequency; // Future timestamp since when the task can be executed uint256 internal _allowedAt; // Next future timestamp since when the task can be executed to be set, only used internally uint256 internal _nextAllowedAt; // Period in seconds during when a time-locked task can be executed since the allowed timestamp uint256 internal _window; /** * @dev Time lock config params. Only used in the initializer. * @param mode Time lock mode * @param frequency Time lock frequency value * @param allowedAt Time lock allowed date * @param window Time lock execution window */ struct TimeLockConfig { uint8 mode; uint256 frequency; uint256 allowedAt; uint256 window; } /** * @dev Initializes the time locked task. It does not call upper contracts initializers. * @param config Time locked task config */ function __TimeLockedTask_init(TimeLockConfig memory config) internal onlyInitializing { __TimeLockedTask_init_unchained(config); } /** * @dev Initializes the time locked task. It does call upper contracts initializers. * @param config Time locked task config */ function __TimeLockedTask_init_unchained(TimeLockConfig memory config) internal onlyInitializing { _setTimeLock(config.mode, config.frequency, config.allowedAt, config.window); } /** * @dev Tells the time-lock related information */ function getTimeLock() external view returns (uint8 mode, uint256 frequency, uint256 allowedAt, uint256 window) { return (uint8(_mode), _frequency, _allowedAt, _window); } /** * @dev Sets a new time lock */ function setTimeLock(uint8 mode, uint256 frequency, uint256 allowedAt, uint256 window) external override authP(authParams(mode, frequency, allowedAt, window)) { _setTimeLock(mode, frequency, allowedAt, window); } /** * @dev Before time locked task hook */ function _beforeTimeLockedTask(address, uint256) internal virtual { // Load storage variables Mode mode = _mode; uint256 frequency = _frequency; uint256 allowedAt = _allowedAt; uint256 window = _window; // First we check the current timestamp is not in the past if (block.timestamp < allowedAt) revert TaskTimeLockActive(block.timestamp, allowedAt); if (mode == Mode.Seconds) { if (frequency == 0) return; // If no window is set, the next allowed date is simply moved the number of seconds set as frequency. // Otherwise, the offset must be validated and the next allowed date is set to the next period. if (window == 0) _nextAllowedAt = block.timestamp + frequency; else { uint256 diff = block.timestamp - allowedAt; uint256 periods = diff / frequency; uint256 offset = diff - (periods * frequency); if (offset > window) revert TaskTimeLockActive(block.timestamp, allowedAt); _nextAllowedAt = allowedAt + ((periods + 1) * frequency); } } else { if (block.timestamp >= allowedAt && block.timestamp <= allowedAt + window) { // Check the current timestamp has not passed the allowed date set _nextAllowedAt = _getNextAllowedDate(allowedAt, frequency); } else { // Check the current timestamp is not before the current allowed date uint256 currentAllowedDay = mode == Mode.OnDay ? allowedAt.getDay() : block.timestamp.getDaysInMonth(); uint256 currentAllowedAt = _getCurrentAllowedDate(allowedAt, currentAllowedDay); if (block.timestamp < currentAllowedAt) revert TaskTimeLockActive(block.timestamp, currentAllowedAt); // Check the current timestamp has not passed the allowed execution window uint256 extendedCurrentAllowedAt = currentAllowedAt + window; bool exceedsExecutionWindow = block.timestamp > extendedCurrentAllowedAt; if (exceedsExecutionWindow) revert TaskTimeLockActive(block.timestamp, extendedCurrentAllowedAt); // Finally set the next allowed date to the corresponding number of months from the current date _nextAllowedAt = _getNextAllowedDate(currentAllowedAt, frequency); } } } /** * @dev After time locked task hook */ function _afterTimeLockedTask(address, uint256) internal virtual { if (_nextAllowedAt == 0) return; _setTimeLockAllowedAt(_nextAllowedAt); _nextAllowedAt = 0; } /** * @dev Sets a new time lock */ function _setTimeLock(uint8 mode, uint256 frequency, uint256 allowedAt, uint256 window) internal { if (mode == uint8(Mode.Seconds)) { // The execution window and timestamp are optional, but both must be given or none // If given the execution window cannot be larger than the number of seconds // Also, if these are given the frequency must be checked as well, otherwise it could be unsetting the lock if (window > 0 || allowedAt > 0) { if (frequency == 0) revert TaskInvalidFrequency(mode, frequency); if (window == 0 || window > frequency) revert TaskInvalidAllowedWindow(mode, window); if (allowedAt == 0) revert TaskInvalidAllowedDate(mode, allowedAt); } } else { // The other modes can be "on-day" or "on-last-day" where the frequency represents a number of months // There is no limit for the frequency, it simply cannot be zero if (frequency == 0) revert TaskInvalidFrequency(mode, frequency); // The execution window cannot be larger than the number of months considering months of 28 days if (window == 0 || window > frequency * DAYS_28) revert TaskInvalidAllowedWindow(mode, window); // The allowed date cannot be zero if (allowedAt == 0) revert TaskInvalidAllowedDate(mode, allowedAt); // If the mode is "on-day", the allowed date must be valid for every month, then the allowed day cannot be // larger than 28. But if the mode is "on-last-day", the allowed date day must be the last day of the month if (mode == uint8(Mode.OnDay)) { if (allowedAt.getDay() > 28) revert TaskInvalidAllowedDate(mode, allowedAt); } else if (mode == uint8(Mode.OnLastMonthDay)) { if (allowedAt.getDay() != allowedAt.getDaysInMonth()) revert TaskInvalidAllowedDate(mode, allowedAt); } else { revert TaskInvalidFrequencyMode(mode); } } _mode = Mode(mode); _frequency = frequency; _allowedAt = allowedAt; _window = window; emit TimeLockSet(mode, frequency, allowedAt, window); } /** * @dev Sets the time-lock execution allowed timestamp * @param allowedAt New execution allowed timestamp to be set */ function _setTimeLockAllowedAt(uint256 allowedAt) internal { _allowedAt = allowedAt; emit TimeLockAllowedAtSet(allowedAt); } /** * @dev Tells the corresponding allowed date based on a current timestamp */ function _getCurrentAllowedDate(uint256 allowedAt, uint256 day) private view returns (uint256) { (uint256 year, uint256 month, ) = block.timestamp.timestampToDate(); return _getAllowedDateFor(allowedAt, year, month, day); } /** * @dev Tells the next allowed date based on a current allowed date considering a number of months to increase */ function _getNextAllowedDate(uint256 allowedAt, uint256 monthsToIncrease) private view returns (uint256) { (uint256 year, uint256 month, uint256 day) = allowedAt.timestampToDate(); uint256 increasedMonth = month + monthsToIncrease; uint256 nextMonth = increasedMonth % 12; uint256 nextYear = year + (increasedMonth / 12); uint256 nextDay = _mode == Mode.OnLastMonthDay ? DateTime._getDaysInMonth(nextYear, nextMonth) : day; return _getAllowedDateFor(allowedAt, nextYear, nextMonth, nextDay); } /** * @dev Builds an allowed date using a specific year, month, and day */ function _getAllowedDateFor(uint256 allowedAt, uint256 year, uint256 month, uint256 day) private pure returns (uint256) { return DateTime.timestampFromDateTime( year, month, day, allowedAt.getHour(), allowedAt.getMinute(), allowedAt.getSecond() ); } }
// 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.3; import '@openzeppelin/contracts/utils/structs/EnumerableSet.sol'; import '@mimic-fi/v3-authorizer/contracts/Authorized.sol'; import '../interfaces/base/ITokenIndexedTask.sol'; /** * @dev Token indexed task. It defines a token acceptance list to tell which are the tokens supported by the * task. Tokens acceptance can be configured either as an allow list or as a deny list. */ abstract contract TokenIndexedTask is ITokenIndexedTask, Authorized { using EnumerableSet for EnumerableSet.AddressSet; // Acceptance list type TokensAcceptanceType public override tokensAcceptanceType; // Enumerable set of tokens included in the acceptance list EnumerableSet.AddressSet internal _tokens; /** * @dev Token index config. Only used in the initializer. * @param acceptanceType Token acceptance type to be set * @param tokens List of token addresses to be set for the acceptance list */ struct TokenIndexConfig { TokensAcceptanceType acceptanceType; address[] tokens; } /** * @dev Initializes the token indexed task. It does not call upper contracts initializers. * @param config Token indexed task config */ function __TokenIndexedTask_init(TokenIndexConfig memory config) internal onlyInitializing { __TokenIndexedTask_init_unchained(config); } /** * @dev Initializes the token indexed task. It does call upper contracts initializers. * @param config Token indexed task config */ function __TokenIndexedTask_init_unchained(TokenIndexConfig memory config) internal onlyInitializing { _setTokensAcceptanceType(config.acceptanceType); for (uint256 i = 0; i < config.tokens.length; i++) { _setTokenAcceptanceList(config.tokens[i], true); } } /** * @dev Tells whether a token is allowed or not * @param token Address of the token being queried */ function isTokenAllowed(address token) public view override returns (bool) { bool containsToken = _tokens.contains(token); return tokensAcceptanceType == TokensAcceptanceType.AllowList ? containsToken : !containsToken; } /** * @dev Sets the tokens acceptance type of the task * @param newTokensAcceptanceType New token acceptance type to be set */ function setTokensAcceptanceType(TokensAcceptanceType newTokensAcceptanceType) external override authP(authParams(uint8(newTokensAcceptanceType))) { _setTokensAcceptanceType(newTokensAcceptanceType); } /** * @dev Updates the list of tokens of the tokens acceptance list * @param tokens List of tokens to be updated from the acceptance list * @param added Whether each of the given tokens should be added or removed from the list */ function setTokensAcceptanceList(address[] memory tokens, bool[] memory added) external override auth { if (tokens.length != added.length) revert TaskAcceptanceInputLengthMismatch(); for (uint256 i = 0; i < tokens.length; i++) { _setTokenAcceptanceList(tokens[i], added[i]); } } /** * @dev Before token indexed task hook */ function _beforeTokenIndexedTask(address token, uint256) internal virtual { if (!isTokenAllowed(token)) revert TaskTokenNotAllowed(token); } /** * @dev After token indexed task hook */ function _afterTokenIndexedTask(address token, uint256) internal virtual { // solhint-disable-previous-line no-empty-blocks } /** * @dev Sets the tokens acceptance type of the task * @param newTokensAcceptanceType New token acceptance type to be set */ function _setTokensAcceptanceType(TokensAcceptanceType newTokensAcceptanceType) internal { tokensAcceptanceType = newTokensAcceptanceType; emit TokensAcceptanceTypeSet(newTokensAcceptanceType); } /** * @dev Updates a token from the tokens acceptance list * @param token Token to be updated from the acceptance list * @param added Whether the token should be added or removed from the list */ function _setTokenAcceptanceList(address token, bool added) internal { if (token == address(0)) revert TaskAcceptanceTokenZero(); added ? _tokens.add(token) : _tokens.remove(token); emit TokensAcceptanceListSet(token, added); } }
// 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.3; import '@mimic-fi/v3-authorizer/contracts/Authorized.sol'; import '@mimic-fi/v3-helpers/contracts/math/FixedPoint.sol'; import '../interfaces/base/ITokenThresholdTask.sol'; /** * @dev Token threshold task. It mainly works with token threshold configs that can be used to tell if * a specific token amount is compliant with certain minimum or maximum values. Token threshold tasks * make use of a default threshold config as a fallback in case there is no custom threshold defined for the token * being evaluated. */ abstract contract TokenThresholdTask is ITokenThresholdTask, Authorized { using FixedPoint for uint256; // Default threshold Threshold internal _defaultThreshold; // Custom thresholds per token mapping (address => Threshold) internal _customThresholds; /** * @dev Threshold defined by a token address and min/max values */ struct Threshold { address token; uint256 min; uint256 max; } /** * @dev Custom token threshold config. Only used in the initializer. */ struct CustomThresholdConfig { address token; Threshold threshold; } /** * @dev Token threshold config. Only used in the initializer. * @param defaultThreshold Default threshold to be set * @param customThresholdConfigs List of custom threshold configs to be set */ struct TokenThresholdConfig { Threshold defaultThreshold; CustomThresholdConfig[] customThresholdConfigs; } /** * @dev Initializes the token threshold task. It does not call upper contracts initializers. * @param config Token threshold task config */ function __TokenThresholdTask_init(TokenThresholdConfig memory config) internal onlyInitializing { __TokenThresholdTask_init_unchained(config); } /** * @dev Initializes the token threshold task. It does call upper contracts initializers. * @param config Token threshold task config */ function __TokenThresholdTask_init_unchained(TokenThresholdConfig memory config) internal onlyInitializing { Threshold memory defaultThreshold = config.defaultThreshold; _setDefaultTokenThreshold(defaultThreshold.token, defaultThreshold.min, defaultThreshold.max); for (uint256 i = 0; i < config.customThresholdConfigs.length; i++) { CustomThresholdConfig memory customThresholdConfig = config.customThresholdConfigs[i]; Threshold memory custom = customThresholdConfig.threshold; _setCustomTokenThreshold(customThresholdConfig.token, custom.token, custom.min, custom.max); } } /** * @dev Tells the default token threshold */ function defaultTokenThreshold() external view override returns (address thresholdToken, uint256 min, uint256 max) { Threshold memory threshold = _defaultThreshold; return (threshold.token, threshold.min, threshold.max); } /** * @dev Tells the token threshold defined for a specific token * @param token Address of the token being queried */ function customTokenThreshold(address token) external view override returns (address thresholdToken, uint256 min, uint256 max) { Threshold memory threshold = _customThresholds[token]; return (threshold.token, threshold.min, threshold.max); } /** * @dev Tells the threshold that should be used for a token, it prioritizes custom thresholds over the default one * @param token Address of the token being queried */ function getTokenThreshold(address token) external view virtual override returns (address thresholdToken, uint256 min, uint256 max) { Threshold memory threshold = _getTokenThreshold(token); return (threshold.token, threshold.min, threshold.max); } /** * @dev Sets a new default threshold config * @param thresholdToken New threshold token to be set * @param min New threshold minimum to be set * @param max New threshold maximum to be set */ function setDefaultTokenThreshold(address thresholdToken, uint256 min, uint256 max) external override authP(authParams(thresholdToken, min, max)) { _setDefaultTokenThreshold(thresholdToken, min, max); } /** * @dev Sets a custom token threshold * @param token Address of the token to set a custom threshold for * @param thresholdToken New custom threshold token to be set * @param min New custom threshold minimum to be set * @param max New custom threshold maximum to be set */ function setCustomTokenThreshold(address token, address thresholdToken, uint256 min, uint256 max) external override authP(authParams(token, thresholdToken, min, max)) { _setCustomTokenThreshold(token, thresholdToken, min, max); } /** * @dev Fetches a base/quote price */ function _getPrice(address base, address quote) internal view virtual returns (uint256); /** * @dev Tells the threshold that should be used for a token, it prioritizes custom thresholds over the default one * @param token Address of the token being queried */ function _getTokenThreshold(address token) internal view returns (Threshold memory) { Threshold storage customThreshold = _customThresholds[token]; return customThreshold.token == address(0) ? _defaultThreshold : customThreshold; } /** * @dev Before token threshold task hook */ function _beforeTokenThresholdTask(address token, uint256 amount) internal virtual { Threshold memory threshold = _getTokenThreshold(token); if (threshold.token == address(0)) return; uint256 convertedAmount = threshold.token == token ? amount : amount.mulDown(_getPrice(token, threshold.token)); bool isValid = convertedAmount >= threshold.min && (threshold.max == 0 || convertedAmount <= threshold.max); if (!isValid) revert TaskTokenThresholdNotMet(threshold.token, convertedAmount, threshold.min, threshold.max); } /** * @dev After token threshold task hook */ function _afterTokenThresholdTask(address, uint256) internal virtual { // solhint-disable-previous-line no-empty-blocks } /** * @dev Sets a new default threshold config * @param thresholdToken New threshold token to be set * @param min New threshold minimum to be set * @param max New threshold maximum to be set */ function _setDefaultTokenThreshold(address thresholdToken, uint256 min, uint256 max) internal { _setTokenThreshold(_defaultThreshold, thresholdToken, min, max); emit DefaultTokenThresholdSet(thresholdToken, min, max); } /** * @dev Sets a custom of tokens thresholds * @param token Address of the token to set a custom threshold for * @param thresholdToken New custom threshold token to be set * @param min New custom threshold minimum to be set * @param max New custom threshold maximum to be set */ function _setCustomTokenThreshold(address token, address thresholdToken, uint256 min, uint256 max) internal { if (token == address(0)) revert TaskThresholdTokenZero(); _setTokenThreshold(_customThresholds[token], thresholdToken, min, max); emit CustomTokenThresholdSet(token, thresholdToken, min, max); } /** * @dev Sets a threshold * @param threshold Threshold to be updated * @param token New threshold token to be set * @param min New threshold minimum to be set * @param max New threshold maximum to be set */ function _setTokenThreshold(Threshold storage threshold, address token, uint256 min, uint256 max) private { // If there is no threshold, all values must be zero bool isZeroThreshold = token == address(0) && min == 0 && max == 0; bool isNonZeroThreshold = token != address(0) && (max == 0 || max >= min); if (!isZeroThreshold && !isNonZeroThreshold) revert TaskInvalidThresholdInput(token, min, max); threshold.token = token; threshold.min = min; threshold.max = max; } }
// 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.17; import '@mimic-fi/v3-authorizer/contracts/Authorized.sol'; import '@mimic-fi/v3-helpers/contracts/math/FixedPoint.sol'; import '../interfaces/base/IVolumeLimitedTask.sol'; /** * @dev Volume limit config for tasks. It allows setting volume limit per period of time. */ abstract contract VolumeLimitedTask is IVolumeLimitedTask, Authorized { using FixedPoint for uint256; // Default volume limit VolumeLimit internal _defaultVolumeLimit; // Custom volume limits per token mapping (address => VolumeLimit) internal _customVolumeLimits; /** * @dev Volume limit config * @param token Address to measure the volume limit */ struct VolumeLimit { address token; uint256 amount; uint256 accrued; uint256 period; uint256 nextResetTime; } /** * @dev Volume limit params. Only used in the initializer. */ struct VolumeLimitParams { address token; uint256 amount; uint256 period; } /** * @dev Custom token volume limit config. Only used in the initializer. */ struct CustomVolumeLimitConfig { address token; VolumeLimitParams volumeLimit; } /** * @dev Volume limit config. Only used in the initializer. */ struct VolumeLimitConfig { VolumeLimitParams defaultVolumeLimit; CustomVolumeLimitConfig[] customVolumeLimitConfigs; } /** * @dev Initializes the volume limited task. It does call upper contracts initializers. * @param config Volume limited task config */ function __VolumeLimitedTask_init(VolumeLimitConfig memory config) internal onlyInitializing { __VolumeLimitedTask_init_unchained(config); } /** * @dev Initializes the volume limited task. It does not call upper contracts initializers. * @param config Volume limited task config */ function __VolumeLimitedTask_init_unchained(VolumeLimitConfig memory config) internal onlyInitializing { VolumeLimitParams memory defaultLimit = config.defaultVolumeLimit; _setDefaultVolumeLimit(defaultLimit.token, defaultLimit.amount, defaultLimit.period); for (uint256 i = 0; i < config.customVolumeLimitConfigs.length; i++) { CustomVolumeLimitConfig memory customVolumeLimitConfig = config.customVolumeLimitConfigs[i]; VolumeLimitParams memory custom = customVolumeLimitConfig.volumeLimit; _setCustomVolumeLimit(customVolumeLimitConfig.token, custom.token, custom.amount, custom.period); } } /** * @dev Tells the default volume limit set */ function defaultVolumeLimit() external view override returns (address limitToken, uint256 amount, uint256 accrued, uint256 period, uint256 nextResetTime) { VolumeLimit memory limit = _defaultVolumeLimit; return (limit.token, limit.amount, limit.accrued, limit.period, limit.nextResetTime); } /** * @dev Tells the custom volume limit set for a specific token * @param token Address of the token being queried */ function customVolumeLimit(address token) external view override returns (address limitToken, uint256 amount, uint256 accrued, uint256 period, uint256 nextResetTime) { VolumeLimit memory limit = _customVolumeLimits[token]; return (limit.token, limit.amount, limit.accrued, limit.period, limit.nextResetTime); } /** * @dev Tells the volume limit that should be used for a token, it prioritizes custom limits over the default one * @param token Address of the token being queried */ function getVolumeLimit(address token) external view override returns (address limitToken, uint256 amount, uint256 accrued, uint256 period, uint256 nextResetTime) { VolumeLimit memory limit = _getVolumeLimit(token); return (limit.token, limit.amount, limit.accrued, limit.period, limit.nextResetTime); } /** * @dev Sets a the default volume limit config * @param limitToken Address of the token to measure the volume limit * @param limitAmount Amount of tokens to be applied for the volume limit * @param limitPeriod Frequency to Amount of tokens to be applied for the volume limit */ function setDefaultVolumeLimit(address limitToken, uint256 limitAmount, uint256 limitPeriod) external override authP(authParams(limitToken, limitAmount, limitPeriod)) { _setDefaultVolumeLimit(limitToken, limitAmount, limitPeriod); } /** * @dev Sets a custom volume limit * @param token Address of the token to set a custom volume limit for * @param limitToken Address of the token to measure the volume limit * @param limitAmount Amount of tokens to be applied for the volume limit * @param limitPeriod Frequency to Amount of tokens to be applied for the volume limit */ function setCustomVolumeLimit(address token, address limitToken, uint256 limitAmount, uint256 limitPeriod) external override authP(authParams(token, limitToken, limitAmount, limitPeriod)) { _setCustomVolumeLimit(token, limitToken, limitAmount, limitPeriod); } /** * @dev Fetches a base/quote price */ function _getPrice(address base, address quote) internal view virtual returns (uint256); /** * @dev Tells the volume limit that should be used for a token, it prioritizes custom limits over the default one * @param token Address of the token being queried */ function _getVolumeLimit(address token) internal view returns (VolumeLimit storage) { VolumeLimit storage customLimit = _customVolumeLimits[token]; return customLimit.token == address(0) ? _defaultVolumeLimit : customLimit; } /** * @dev Before volume limited task hook */ function _beforeVolumeLimitedTask(address token, uint256 amount) internal virtual { VolumeLimit memory limit = _getVolumeLimit(token); if (limit.token == address(0)) return; uint256 amountInLimitToken = limit.token == token ? amount : amount.mulDown(_getPrice(token, limit.token)); uint256 processedVolume = amountInLimitToken + (block.timestamp < limit.nextResetTime ? limit.accrued : 0); if (processedVolume > limit.amount) revert TaskVolumeLimitExceeded(limit.token, limit.amount, processedVolume); } /** * @dev After volume limited task hook */ function _afterVolumeLimitedTask(address token, uint256 amount) internal virtual { VolumeLimit storage limit = _getVolumeLimit(token); if (limit.token == address(0)) return; uint256 amountInLimitToken = limit.token == token ? amount : amount.mulDown(_getPrice(token, limit.token)); if (block.timestamp >= limit.nextResetTime) { limit.accrued = 0; limit.nextResetTime = block.timestamp + limit.period; } limit.accrued += amountInLimitToken; } /** * @dev Sets the default volume limit * @param limitToken Address of the token to measure the volume limit * @param limitAmount Amount of tokens to be applied for the volume limit * @param limitPeriod Frequency to Amount of tokens to be applied for the volume limit */ function _setDefaultVolumeLimit(address limitToken, uint256 limitAmount, uint256 limitPeriod) internal { _setVolumeLimit(_defaultVolumeLimit, limitToken, limitAmount, limitPeriod); emit DefaultVolumeLimitSet(limitToken, limitAmount, limitPeriod); } /** * @dev Sets a custom volume limit * @param token Address of the token to set a custom volume limit for * @param limitToken Address of the token to measure the volume limit * @param limitAmount Amount of tokens to be applied for the volume limit * @param limitPeriod Frequency to Amount of tokens to be applied for the volume limit */ function _setCustomVolumeLimit(address token, address limitToken, uint256 limitAmount, uint256 limitPeriod) internal { if (token == address(0)) revert TaskVolumeLimitTokenZero(); _setVolumeLimit(_customVolumeLimits[token], limitToken, limitAmount, limitPeriod); emit CustomVolumeLimitSet(token, limitToken, limitAmount, limitPeriod); } /** * @dev Sets a volume limit * @param limit Volume limit to be updated * @param token Address of the token to measure the volume limit * @param amount Amount of tokens to be applied for the volume limit * @param period Frequency to Amount of tokens to be applied for the volume limit */ function _setVolumeLimit(VolumeLimit storage limit, address token, uint256 amount, uint256 period) private { // If there is no limit, all values must be zero bool isZeroLimit = token == address(0) && amount == 0 && period == 0; bool isNonZeroLimit = token != address(0) && amount > 0 && period > 0; if (!isZeroLimit && !isNonZeroLimit) revert TaskInvalidVolumeLimitInput(token, amount, period); // Changing the period only affects the end time of the next period, but not the end date of the current one limit.period = period; // Changing the amount does not affect the totalizator, it only applies when updating the accrued amount. // Note that it can happen that the new amount is lower than the accrued amount if the amount is lowered. // However, there shouldn't be any accounting issues with that. limit.amount = amount; // Therefore, only clean the totalizators if the limit is being removed if (isZeroLimit) { limit.accrued = 0; limit.nextResetTime = 0; } else { // If limit is not zero, set the next reset time if it wasn't set already // Otherwise, if the token is being changed the accrued amount must be updated accordingly if (limit.nextResetTime == 0) { limit.accrued = 0; limit.nextResetTime = block.timestamp + period; } else if (limit.token != token) { uint256 price = _getPrice(limit.token, token); limit.accrued = limit.accrued.mulDown(price); } } // Finally simply set the new requested token limit.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/v3-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/axelar/IAxelarConnector.sol'; import './BaseBridgeTask.sol'; import '../interfaces/bridge/IAxelarBridger.sol'; /** * @title Axelar bridger * @dev Task that extends the base bridge task to use Axelar */ contract AxelarBridger is IAxelarBridger, BaseBridgeTask { using FixedPoint for uint256; // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('AXELAR_BRIDGER'); /** * @dev Axelar bridge config. Only used in the initializer. */ struct AxelarBridgeConfig { BaseBridgeConfig baseBridgeConfig; } /** * @dev Initializes the Axelar bridger * @param config Axelar bridge config */ function initialize(AxelarBridgeConfig memory config) external virtual initializer { __AxelarBridger_init(config); } /** * @dev Initializes the Axelar bridger. It does call upper contracts initializers. * @param config Axelar bridge config */ function __AxelarBridger_init(AxelarBridgeConfig memory config) internal onlyInitializing { __BaseBridgeTask_init(config.baseBridgeConfig); __AxelarBridger_init_unchained(config); } /** * @dev Initializes the Axelar bridger. It does not call upper contracts initializers. * @param config Axelar bridge config */ function __AxelarBridger_init_unchained(AxelarBridgeConfig memory config) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Execute Axelar bridger */ function call(address token, uint256 amount) external override authP(authParams(token, amount)) { if (amount == 0) amount = getTaskAmount(token); _beforeAxelarBridger(token, amount); bytes memory connectorData = abi.encodeWithSelector( IAxelarConnector.execute.selector, getDestinationChain(token), token, amount, recipient ); ISmartVault(smartVault).execute(connector, connectorData); _afterAxelarBridger(token, amount); } /** * @dev Before Axelar bridger hook */ function _beforeAxelarBridger(address token, uint256 amount) internal virtual { // Axelar does not support specifying slippage nor fee _beforeBaseBridgeTask(token, amount, 0, 0); } /** * @dev After Axelar bridger task hook */ function _afterAxelarBridger(address token, uint256 amount) internal virtual { // Axelar does not support specifying slippage nor fee _afterBaseBridgeTask(token, amount, 0, 0); } }
// 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/v3-helpers/contracts/math/FixedPoint.sol'; import '../Task.sol'; import '../interfaces/bridge/IBaseBridgeTask.sol'; /** * @title Base bridge task * @dev Task that offers the basic components for more detailed bridge tasks */ abstract contract BaseBridgeTask is IBaseBridgeTask, Task { using FixedPoint for uint256; // Connector address address public override connector; // Connector address address public override recipient; // Default destination chain uint256 public override defaultDestinationChain; // Default maximum slippage in fixed point uint256 public override defaultMaxSlippage; // Default maximum fee MaxFee internal _defaultMaxFee; // Destination chain per token address mapping (address => uint256) public override customDestinationChain; // Maximum slippage per token address mapping (address => uint256) public override customMaxSlippage; // Maximum fee per token address mapping (address => MaxFee) internal _customMaxFee; /** * @dev Maximum fee defined by a token address and a max fee value */ struct MaxFee { address token; uint256 amount; } /** * @dev Custom destination chain config. Only used in the initializer. */ struct CustomDestinationChain { address token; uint256 destinationChain; } /** * @dev Custom max slippage config. Only used in the initializer. */ struct CustomMaxSlippage { address token; uint256 maxSlippage; } /** * @dev Custom max fee config. Only used in the initializer. */ struct CustomMaxFee { address token; MaxFee maxFee; } /** * @dev Base bridge config. Only used in the initializer. */ struct BaseBridgeConfig { address connector; address recipient; uint256 destinationChain; uint256 maxSlippage; MaxFee maxFee; CustomDestinationChain[] customDestinationChains; CustomMaxSlippage[] customMaxSlippages; CustomMaxFee[] customMaxFees; TaskConfig taskConfig; } /** * @dev Initializes the base bridge task. It does call upper contracts initializers. * @param config Base bridge config */ function __BaseBridgeTask_init(BaseBridgeConfig memory config) internal onlyInitializing { __Task_init(config.taskConfig); __BaseBridgeTask_init_unchained(config); } /** * @dev Initializes the base bridge task. It does not call upper contracts initializers. * @param config Base bridge config */ function __BaseBridgeTask_init_unchained(BaseBridgeConfig memory config) internal onlyInitializing { _setConnector(config.connector); _setRecipient(config.recipient); _setDefaultDestinationChain(config.destinationChain); _setDefaultMaxSlippage(config.maxSlippage); MaxFee memory defaultFee = config.maxFee; _setDefaultMaxFee(defaultFee.token, defaultFee.amount); for (uint256 i = 0; i < config.customDestinationChains.length; i++) { CustomDestinationChain memory customConfig = config.customDestinationChains[i]; _setCustomDestinationChain(customConfig.token, customConfig.destinationChain); } for (uint256 i = 0; i < config.customMaxSlippages.length; i++) { _setCustomMaxSlippage(config.customMaxSlippages[i].token, config.customMaxSlippages[i].maxSlippage); } for (uint256 i = 0; i < config.customMaxFees.length; i++) { CustomMaxFee memory customConfig = config.customMaxFees[i]; MaxFee memory maxFee = customConfig.maxFee; _setCustomMaxFee(customConfig.token, maxFee.token, maxFee.amount); } } /** * @dev Tells the default max fee */ function defaultMaxFee() external view override returns (address maxFeeToken, uint256 amount) { MaxFee memory maxFee = _defaultMaxFee; return (maxFee.token, maxFee.amount); } /** * @dev Tells the max fee defined for a specific token * @param token Address of the token being queried */ function customMaxFee(address token) external view override returns (address maxFeeToken, uint256 amount) { MaxFee memory maxFee = _customMaxFee[token]; return (maxFee.token, maxFee.amount); } /** * @dev Tells the destination chain that should be used for a token * @param token Address of the token to get the destination chain for */ function getDestinationChain(address token) public view virtual override returns (uint256) { uint256 chain = customDestinationChain[token]; return chain == 0 ? defaultDestinationChain : chain; } /** * @dev Tells the max slippage that should be used for a token * @param token Address of the token to get the max slippage for */ function getMaxSlippage(address token) public view virtual override returns (uint256) { uint256 maxSlippage = customMaxSlippage[token]; return maxSlippage == 0 ? defaultMaxSlippage : maxSlippage; } /** * @dev Tells the max fee that should be used for a token * @param token Address of the token to get the max fee for */ function getMaxFee(address token) external view virtual override returns (address maxFeeToken, uint256 amount) { MaxFee memory maxFee = _getMaxFee(token); return (maxFee.token, maxFee.amount); } /** * @dev Sets a new connector * @param newConnector Address of the connector to be set */ function setConnector(address newConnector) external override authP(authParams(newConnector)) { _setConnector(newConnector); } /** * @dev Sets the recipient address. Sender must be authorized. * @param newRecipient Address of the new recipient to be set */ function setRecipient(address newRecipient) external override authP(authParams(newRecipient)) { _setRecipient(newRecipient); } /** * @dev Sets the default destination chain * @param destinationChain Default destination chain to be set */ function setDefaultDestinationChain(uint256 destinationChain) external override authP(authParams(destinationChain)) { _setDefaultDestinationChain(destinationChain); } /** * @dev Sets the default max slippage * @param maxSlippage Default max slippage to be set */ function setDefaultMaxSlippage(uint256 maxSlippage) external override authP(authParams(maxSlippage)) { _setDefaultMaxSlippage(maxSlippage); } /** * @dev Sets the default max fee * @param maxFeeToken Default max fee token to be set * @param amount Default max fee amount to be set */ function setDefaultMaxFee(address maxFeeToken, uint256 amount) external override authP(authParams(maxFeeToken, amount)) { _setDefaultMaxFee(maxFeeToken, amount); } /** * @dev Sets a custom destination chain * @param token Address of the token to set a custom destination chain for * @param destinationChain Destination chain to be set */ function setCustomDestinationChain(address token, uint256 destinationChain) external override authP(authParams(token, destinationChain)) { _setCustomDestinationChain(token, destinationChain); } /** * @dev Sets a custom max slippage * @param token Address of the token to set a custom max slippage for * @param maxSlippage Max slippage to be set */ function setCustomMaxSlippage(address token, uint256 maxSlippage) external override authP(authParams(token, maxSlippage)) { _setCustomMaxSlippage(token, maxSlippage); } /** * @dev Sets a custom max fee * @param token Address of the token to set a custom max fee for * @param maxFeeToken Max fee token to be set for the given token * @param amount Max fee amount to be set for the given token */ function setCustomMaxFee(address token, address maxFeeToken, uint256 amount) external override authP(authParams(token, maxFeeToken, amount)) { _setCustomMaxFee(token, maxFeeToken, amount); } /** * @dev Tells the max fee that should be used for a token * @param token Address of the token to get the max fee for */ function _getMaxFee(address token) internal view virtual returns (MaxFee memory) { MaxFee memory maxFee = _customMaxFee[token]; return maxFee.token == address(0) ? _defaultMaxFee : maxFee; } /** * @dev Before base bridge task hook */ function _beforeBaseBridgeTask(address token, uint256 amount, uint256 slippage, uint256 fee) internal virtual { _beforeTask(token, amount); if (token == address(0)) revert TaskTokenZero(); if (amount == 0) revert TaskAmountZero(); if (getDestinationChain(token) == 0) revert TaskDestinationChainNotSet(); uint256 maxSlippage = getMaxSlippage(token); if (slippage > maxSlippage) revert TaskSlippageAboveMax(slippage, maxSlippage); // If no fee is given we simply ignore the max fee config if (fee == 0) return; // Otherwise, we revert in case there is no max fee set MaxFee memory maxFee = _getMaxFee(token); if (maxFee.token == address(0)) revert TaskFeeAboveMax(fee, maxFee.amount); uint256 convertedFee = maxFee.token == token ? fee : fee.mulDown(_getPrice(token, maxFee.token)); if (convertedFee > maxFee.amount) revert TaskFeeAboveMax(convertedFee, maxFee.amount); } /** * @dev After base bridge task hook */ function _afterBaseBridgeTask(address token, uint256 amount, uint256, uint256) internal virtual { _afterTask(token, amount); } /** * @dev Sets the balance connectors. Next balance connector must be unset. * @param previous Balance connector id of the previous task in the workflow * @param next Balance connector id of the next task in the workflow */ function _setBalanceConnectors(bytes32 previous, bytes32 next) internal virtual override { if (next != bytes32(0)) revert TaskNextConnectorNotZero(next); super._setBalanceConnectors(previous, next); } /** * @dev Sets a new connector * @param newConnector Address of the connector to be set */ function _setConnector(address newConnector) internal { if (newConnector == address(0)) revert TaskConnectorZero(); connector = newConnector; emit ConnectorSet(newConnector); } /** * @dev Sets the recipient address * @param newRecipient Address of the new recipient to be set */ function _setRecipient(address newRecipient) internal { if (newRecipient == address(0)) revert TaskRecipientZero(); recipient = newRecipient; emit RecipientSet(newRecipient); } /** * @dev Sets the default destination chain * @param destinationChain Default destination chain to be set */ function _setDefaultDestinationChain(uint256 destinationChain) internal { if (destinationChain == block.chainid) revert TaskBridgeCurrentChainId(destinationChain); defaultDestinationChain = destinationChain; emit DefaultDestinationChainSet(destinationChain); } /** * @dev Sets the default max slippage * @param maxSlippage Default max slippage to be set */ function _setDefaultMaxSlippage(uint256 maxSlippage) internal { if (maxSlippage > FixedPoint.ONE) revert TaskSlippageAboveOne(); defaultMaxSlippage = maxSlippage; emit DefaultMaxSlippageSet(maxSlippage); } /** * @dev Sets the default max fee * @param maxFeeToken Default max fee token to be set * @param amount Default max fee amount to be set */ function _setDefaultMaxFee(address maxFeeToken, uint256 amount) internal { _setMaxFee(_defaultMaxFee, maxFeeToken, amount); emit DefaultMaxFeeSet(maxFeeToken, amount); } /** * @dev Sets a custom destination chain for a token * @param token Address of the token to set the custom destination chain for * @param destinationChain Destination chain to be set */ function _setCustomDestinationChain(address token, uint256 destinationChain) internal { if (token == address(0)) revert TaskTokenZero(); if (destinationChain == block.chainid) revert TaskBridgeCurrentChainId(destinationChain); customDestinationChain[token] = destinationChain; emit CustomDestinationChainSet(token, destinationChain); } /** * @dev Sets a custom max slippage for a token * @param token Address of the token to set the custom max slippage for * @param maxSlippage Max slippage to be set */ function _setCustomMaxSlippage(address token, uint256 maxSlippage) internal { if (token == address(0)) revert TaskTokenZero(); if (maxSlippage > FixedPoint.ONE) revert TaskSlippageAboveOne(); customMaxSlippage[token] = maxSlippage; emit CustomMaxSlippageSet(token, maxSlippage); } /** * @dev Sets a custom max fee for a token * @param token Address of the token to set the custom max fee for * @param maxFeeToken Max fee token to be set for the given token * @param amount Max fee amount to be set for the given token */ function _setCustomMaxFee(address token, address maxFeeToken, uint256 amount) internal { if (token == address(0)) revert TaskTokenZero(); _setMaxFee(_customMaxFee[token], maxFeeToken, amount); emit CustomMaxFeeSet(token, maxFeeToken, amount); } /** * @dev Sets a max fee * @param maxFee Max fee to be updated * @param token Max fee token to be set * @param amount Max fee amount to be set */ function _setMaxFee(MaxFee storage maxFee, address token, uint256 amount) private { if (token == address(0) && amount != 0) revert TaskInvalidMaxFee(); maxFee.token = token; maxFee.amount = amount; } }
// 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/v3-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/connext/IConnextConnector.sol'; import './BaseBridgeTask.sol'; import '../interfaces/bridge/IConnextBridger.sol'; /** * @title Connext bridger * @dev Task that extends the base bridge task to use Connext */ contract ConnextBridger is IConnextBridger, BaseBridgeTask { using FixedPoint for uint256; // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('CONNEXT_BRIDGER'); /** * @dev Connext bridge config. Only used in the initializer. */ struct ConnextBridgeConfig { BaseBridgeConfig baseBridgeConfig; } /** * @dev Initializes the Connext bridger * @param config Connext bridge config */ function initialize(ConnextBridgeConfig memory config) external virtual initializer { __ConnextBridger_init(config); } /** * @dev Initializes the Connext bridger. It does call upper contracts initializers. * @param config Connext bridge config */ function __ConnextBridger_init(ConnextBridgeConfig memory config) internal onlyInitializing { __BaseBridgeTask_init(config.baseBridgeConfig); __ConnextBridger_init_unchained(config); } /** * @dev Initializes the Connext bridger. It does not call upper contracts initializers. * @param config Connext bridge config */ function __ConnextBridger_init_unchained(ConnextBridgeConfig memory config) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Execute Connext bridger */ function call(address token, uint256 amount, uint256 slippage, uint256 fee) external override authP(authParams(token, amount, slippage, fee)) { if (amount == 0) amount = getTaskAmount(token); _beforeConnextBridger(token, amount, slippage, fee); uint256 amountAfterFees = amount - fee; uint256 minAmountOut = amountAfterFees.mulUp(FixedPoint.ONE - slippage); bytes memory connectorData = abi.encodeWithSelector( IConnextConnector.execute.selector, getDestinationChain(token), token, amount, minAmountOut, recipient, fee ); ISmartVault(smartVault).execute(connector, connectorData); _afterConnextBridger(token, amount, slippage, fee); } /** * @dev Before connext bridger hook */ function _beforeConnextBridger(address token, uint256 amount, uint256 slippage, uint256 fee) internal virtual { _beforeBaseBridgeTask(token, amount, slippage, fee); } /** * @dev After connext bridger hook */ function _afterConnextBridger(address token, uint256 amount, uint256 slippage, uint256 fee) internal virtual { _afterBaseBridgeTask(token, amount, slippage, fee); } }
// 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/v3-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/hop/IHopBridgeConnector.sol'; import './BaseBridgeTask.sol'; import '../interfaces/bridge/IHopBridger.sol'; /** * @title Hop bridger * @dev Task that extends the base bridge task to use Hop */ contract HopBridger is IHopBridger, BaseBridgeTask { using FixedPoint for uint256; // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('HOP_BRIDGER'); // Relayer address address public override relayer; // Maximum deadline in seconds uint256 public override maxDeadline; // List of Hop entrypoints per token mapping (address => address) public override tokenHopEntrypoint; /** * @dev Token Hop entrypoint config. Only used in the initializer. */ struct TokenHopEntrypoint { address token; address entrypoint; } /** * @dev Hop bridge config. Only used in the initializer. */ struct HopBridgeConfig { address relayer; uint256 maxDeadline; TokenHopEntrypoint[] tokenHopEntrypoints; BaseBridgeConfig baseBridgeConfig; } /** * @dev Initializes the Hop bridger * @param config Hop bridge config */ function initialize(HopBridgeConfig memory config) external virtual initializer { __HopBridger_init(config); } /** * @dev Initializes the Hop bridger. It does call upper contracts initializers. * @param config Hop bridge config */ function __HopBridger_init(HopBridgeConfig memory config) internal onlyInitializing { __BaseBridgeTask_init(config.baseBridgeConfig); __HopBridger_init_unchained(config); } /** * @dev Initializes the Hop bridger. It does not call upper contracts initializers. * @param config Hop bridge config */ function __HopBridger_init_unchained(HopBridgeConfig memory config) internal onlyInitializing { _setRelayer(config.relayer); _setMaxDeadline(config.maxDeadline); for (uint256 i = 0; i < config.tokenHopEntrypoints.length; i++) { TokenHopEntrypoint memory customConfig = config.tokenHopEntrypoints[i]; _setTokenHopEntrypoint(customConfig.token, customConfig.entrypoint); } } /** * @dev Sets the relayer, only used when bridging from L1 to L2 * @param newRelayer New relayer address to be set */ function setRelayer(address newRelayer) external override authP(authParams(newRelayer)) { _setRelayer(newRelayer); } /** * @dev Sets the max deadline * @param newMaxDeadline New max deadline to be set */ function setMaxDeadline(uint256 newMaxDeadline) external override authP(authParams(newMaxDeadline)) { _setMaxDeadline(newMaxDeadline); } /** * @dev Sets an entrypoint for a tokens * @param token Token address to set a Hop entrypoint for * @param entrypoint Hop entrypoint address to be set for a token */ function setTokenHopEntrypoint(address token, address entrypoint) external override authP(authParams(token, entrypoint)) { _setTokenHopEntrypoint(token, entrypoint); } /** * @dev Execute Hop bridger */ function call(address token, uint256 amount, uint256 slippage, uint256 fee) external override authP(authParams(token, amount, slippage, fee)) { if (amount == 0) amount = getTaskAmount(token); _beforeHopBridger(token, amount, slippage, fee); uint256 amountAfterFees = amount - fee; uint256 minAmountOut = amountAfterFees.mulUp(FixedPoint.ONE - slippage); bytes memory connectorData = abi.encodeWithSelector( IHopBridgeConnector.execute.selector, getDestinationChain(token), token, amount, minAmountOut, recipient, tokenHopEntrypoint[token], block.timestamp + maxDeadline, relayer, fee ); ISmartVault(smartVault).execute(connector, connectorData); _afterHopBridger(token, amount, slippage, fee); } /** * @dev Before Hop bridger hook */ function _beforeHopBridger(address token, uint256 amount, uint256 slippage, uint256 fee) internal virtual { _beforeBaseBridgeTask(token, amount, slippage, fee); if (tokenHopEntrypoint[token] == address(0)) revert TaskMissingHopEntrypoint(); } /** * @dev After Hop bridger hook */ function _afterHopBridger(address token, uint256 amount, uint256 slippage, uint256 fee) internal virtual { _afterBaseBridgeTask(token, amount, slippage, fee); } /** * @dev Sets the relayer address, only used when bridging from L1 to L2 */ function _setRelayer(address _relayer) internal { relayer = _relayer; emit RelayerSet(_relayer); } /** * @dev Sets the max deadline */ function _setMaxDeadline(uint256 _maxDeadline) internal { if (_maxDeadline == 0) revert TaskMaxDeadlineZero(); maxDeadline = _maxDeadline; emit MaxDeadlineSet(_maxDeadline); } /** * @dev Set a Hop entrypoint for a token * @param token Address of the token to set a Hop entrypoint for * @param entrypoint Hop entrypoint to be set */ function _setTokenHopEntrypoint(address token, address entrypoint) internal { if (token == address(0)) revert TaskTokenZero(); tokenHopEntrypoint[token] = entrypoint; emit TokenHopEntrypointSet(token, entrypoint); } }
// 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/v3-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/wormhole/IWormholeConnector.sol'; import './BaseBridgeTask.sol'; import '../interfaces/bridge/IWormholeBridger.sol'; /** * @title Wormhole bridger * @dev Task that extends the bridger task to use Wormhole */ contract WormholeBridger is IWormholeBridger, BaseBridgeTask { using FixedPoint for uint256; // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('WORMHOLE_BRIDGER'); /** * @dev Wormhole bridge config. Only used in the initializer. */ struct WormholeBridgeConfig { BaseBridgeConfig baseBridgeConfig; } /** * @dev Initializes the Wormhole bridger * @param config Wormhole bridge config */ function initialize(WormholeBridgeConfig memory config) external virtual initializer { __WormholeBridger_init(config); } /** * @dev Initializes the Wormhole bridger. It does call upper contracts initializers. * @param config Wormhole bridge config */ function __WormholeBridger_init(WormholeBridgeConfig memory config) internal onlyInitializing { __BaseBridgeTask_init(config.baseBridgeConfig); __WormholeBridger_init_unchained(config); } /** * @dev Initializes the Wormhole bridger. It does not call upper contracts initializers. * @param config Wormhole bridge config */ function __WormholeBridger_init_unchained(WormholeBridgeConfig memory config) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Execute Wormhole bridger */ function call(address token, uint256 amount, uint256 fee) external override authP(authParams(token, amount, fee)) { if (amount == 0) amount = getTaskAmount(token); _beforeWormholeBridger(token, amount, fee); uint256 minAmountOut = amount - fee; bytes memory connectorData = abi.encodeWithSelector( IWormholeConnector.execute.selector, getDestinationChain(token), token, amount, minAmountOut, recipient ); ISmartVault(smartVault).execute(connector, connectorData); _afterWormholeBridger(token, amount, fee); } /** * @dev Before Wormhole bridger hook */ function _beforeWormholeBridger(address token, uint256 amount, uint256 fee) internal virtual { // Wormhole does not support specifying slippage _beforeBaseBridgeTask(token, amount, 0, fee); } /** * @dev After Wormhole bridger hook */ function _afterWormholeBridger(address token, uint256 amount, uint256 fee) internal virtual { // Wormhole does not support specifying slippage _afterBaseBridgeTask(token, amount, 0, fee); } }
// 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/v3-authorizer/contracts/interfaces/IAuthorized.sol'; /** * @dev Base task interface */ interface IBaseTask is IAuthorized { // Execution type serves for relayers in order to distinguish how each task must be executed // solhint-disable-next-line func-name-mixedcase function EXECUTION_TYPE() external view returns (bytes32); /** * @dev The balance connectors are the same */ error TaskSameBalanceConnectors(bytes32 connectorId); /** * @dev The smart vault's price oracle is not set */ error TaskSmartVaultPriceOracleNotSet(address smartVault); /** * @dev Emitted every time a task is executed */ event Executed(); /** * @dev Emitted every time the balance connectors are set */ event BalanceConnectorsSet(bytes32 indexed previous, bytes32 indexed next); /** * @dev Tells the address of the Smart Vault tied to it, it cannot be changed */ function smartVault() external view returns (address); /** * @dev Tells the address from where the token amounts to execute this task are fetched. * This address must be the Smart Vault in case the previous balance connector is set. */ function getTokensSource() external view returns (address); /** * @dev Tells the amount a task should use for a token * @param token Address of the token being queried */ function getTaskAmount(address token) external view returns (uint256); /** * @dev Tells the previous and next balance connectors id of the previous task in the workflow */ function getBalanceConnectors() external view returns (bytes32 previous, bytes32 next); /** * @dev Sets the balance connector IDs * @param previous Balance connector id of the previous task in the workflow * @param next Balance connector id of the next task in the workflow */ function setBalanceConnectors(bytes32 previous, bytes32 next) 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 './IBaseTask.sol'; /** * @dev Gas limited task interface */ interface IGasLimitedTask is IBaseTask { /** * @dev The tx initial gas cache has not been initialized */ error TaskGasNotInitialized(); /** * @dev The gas price used is greater than the limit */ error TaskGasPriceLimitExceeded(uint256 gasPrice, uint256 gasPriceLimit); /** * @dev The priority fee used is greater than the priority fee limit */ error TaskPriorityFeeLimitExceeded(uint256 priorityFee, uint256 priorityFeeLimit); /** * @dev The transaction cost is greater than the transaction cost limit */ error TaskTxCostLimitExceeded(uint256 txCost, uint256 txCostLimit); /** * @dev The transaction cost percentage is greater than the transaction cost limit percentage */ error TaskTxCostLimitPctExceeded(uint256 txCostPct, uint256 txCostLimitPct); /** * @dev The new transaction cost limit percentage is greater than one */ error TaskTxCostLimitPctAboveOne(); /** * @dev Emitted every time the gas limits are set */ event GasLimitsSet(uint256 gasPriceLimit, uint256 priorityFeeLimit, uint256 txCostLimit, uint256 txCostLimitPct); /** * @dev Tells the gas limits config */ function getGasLimits() external view returns (uint256 gasPriceLimit, uint256 priorityFeeLimit, uint256 txCostLimit, uint256 txCostLimitPct); /** * @dev Sets the gas limits config * @param newGasPriceLimit New gas price limit to be set * @param newPriorityFeeLimit New priority fee limit to be set * @param newTxCostLimit New tx cost limit to be set * @param newTxCostLimitPct New tx cost percentage limit to be set */ function setGasLimits( uint256 newGasPriceLimit, uint256 newPriorityFeeLimit, uint256 newTxCostLimit, uint256 newTxCostLimitPct ) 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 './IBaseTask.sol'; /** * @dev Pausable task interface */ interface IPausableTask is IBaseTask { /** * @dev The task is paused */ error TaskPaused(); /** * @dev The task is unpaused */ error TaskUnpaused(); /** * @dev Emitted every time a task is paused */ event Paused(); /** * @dev Emitted every time a task is unpaused */ event Unpaused(); /** * @dev Tells the task is paused or not */ function isPaused() external view returns (bool); /** * @dev Pauses a task */ function pause() external; /** * @dev Unpauses a task */ function unpause() 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 './IBaseTask.sol'; /** * @dev Time-locked task interface */ interface ITimeLockedTask is IBaseTask { /** * @dev The time lock frequency mode requested is invalid */ error TaskInvalidFrequencyMode(uint8 mode); /** * @dev The time lock frequency is not valid */ error TaskInvalidFrequency(uint8 mode, uint256 frequency); /** * @dev The time lock allowed date is not valid */ error TaskInvalidAllowedDate(uint8 mode, uint256 date); /** * @dev The time lock allowed window is not valid */ error TaskInvalidAllowedWindow(uint8 mode, uint256 window); /** * @dev The time lock is still active */ error TaskTimeLockActive(uint256 currentTimestamp, uint256 expiration); /** * @dev Emitted every time a new time lock is set */ event TimeLockSet(uint8 mode, uint256 frequency, uint256 allowedAt, uint256 window); /** * @dev Emitted every time a new expiration timestamp is set */ event TimeLockAllowedAtSet(uint256 allowedAt); /** * @dev Tells all the time-lock related information */ function getTimeLock() external view returns (uint8 mode, uint256 frequency, uint256 allowedAt, uint256 window); /** * @dev Sets the time-lock * @param mode Time lock mode * @param frequency Time lock frequency * @param allowedAt Future timestamp since when the task can be executed * @param window Period in seconds during when a time-locked task can be executed since the allowed timestamp */ function setTimeLock(uint8 mode, uint256 frequency, uint256 allowedAt, uint256 window) 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 './IBaseTask.sol'; /** * @dev Token indexed task interface */ interface ITokenIndexedTask is IBaseTask { /** * @dev Acceptance list types: either deny-list to express "all except" or allow-list to express "only" */ enum TokensAcceptanceType { DenyList, AllowList } /** * @dev The acceptance token is zero */ error TaskAcceptanceTokenZero(); /** * @dev The tokens acceptance input length mismatch */ error TaskAcceptanceInputLengthMismatch(); /** * @dev The token is not allowed */ error TaskTokenNotAllowed(address token); /** * @dev Emitted every time a tokens acceptance type is set */ event TokensAcceptanceTypeSet(TokensAcceptanceType acceptanceType); /** * @dev Emitted every time a token is added or removed from the acceptance list */ event TokensAcceptanceListSet(address indexed token, bool added); /** * @dev Tells the acceptance type of the config */ function tokensAcceptanceType() external view returns (TokensAcceptanceType); /** * @dev Tells whether a token is allowed or not * @param token Address of the token being queried */ function isTokenAllowed(address token) external view returns (bool); /** * @dev Sets the tokens acceptance type of the task * @param newTokensAcceptanceType New token acceptance type to be set */ function setTokensAcceptanceType(TokensAcceptanceType newTokensAcceptanceType) external; /** * @dev Updates the list of tokens of the tokens acceptance list * @param tokens List of tokens to be updated from the acceptance list * @param added Whether each of the given tokens should be added or removed from the list */ function setTokensAcceptanceList(address[] memory tokens, bool[] memory added) 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 External 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 External License for more details. // You should have received a copy of the GNU General External License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.0; import './IBaseTask.sol'; /** * @dev Token threshold task interface */ interface ITokenThresholdTask is IBaseTask { /** * @dev The token threshold token is zero */ error TaskThresholdTokenZero(); /** * @dev The token threshold to be set is invalid */ error TaskInvalidThresholdInput(address token, uint256 min, uint256 max); /** * @dev The token threshold has not been met */ error TaskTokenThresholdNotMet(address token, uint256 amount, uint256 min, uint256 max); /** * @dev Emitted every time a default threshold is set */ event DefaultTokenThresholdSet(address token, uint256 min, uint256 max); /** * @dev Emitted every time a token threshold is set */ event CustomTokenThresholdSet(address indexed token, address thresholdToken, uint256 min, uint256 max); /** * @dev Tells the default token threshold */ function defaultTokenThreshold() external view returns (address thresholdToken, uint256 min, uint256 max); /** * @dev Tells the custom threshold defined for a specific token * @param token Address of the token being queried */ function customTokenThreshold(address token) external view returns (address thresholdToken, uint256 min, uint256 max); /** * @dev Tells the threshold that should be used for a token * @param token Address of the token being queried */ function getTokenThreshold(address token) external view returns (address thresholdToken, uint256 min, uint256 max); /** * @dev Sets a new default threshold config * @param thresholdToken New threshold token to be set * @param min New threshold minimum to be set * @param max New threshold maximum to be set */ function setDefaultTokenThreshold(address thresholdToken, uint256 min, uint256 max) external; /** * @dev Sets a custom token threshold * @param token Address of the token to set a custom threshold * @param thresholdToken New custom threshold token to be set * @param min New custom threshold minimum to be set * @param max New custom threshold maximum to be set */ function setCustomTokenThreshold(address token, address thresholdToken, uint256 min, uint256 max) 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 './IBaseTask.sol'; /** * @dev Volume limited task interface */ interface IVolumeLimitedTask is IBaseTask { /** * @dev The volume limit token is zero */ error TaskVolumeLimitTokenZero(); /** * @dev The volume limit to be set is invalid */ error TaskInvalidVolumeLimitInput(address token, uint256 amount, uint256 period); /** * @dev The volume limit has been exceeded */ error TaskVolumeLimitExceeded(address token, uint256 limit, uint256 volume); /** * @dev Emitted every time a default volume limit is set */ event DefaultVolumeLimitSet(address indexed limitToken, uint256 amount, uint256 period); /** * @dev Emitted every time a custom volume limit is set */ event CustomVolumeLimitSet(address indexed token, address indexed limitToken, uint256 amount, uint256 period); /** * @dev Tells the default volume limit set */ function defaultVolumeLimit() external view returns (address limitToken, uint256 amount, uint256 accrued, uint256 period, uint256 nextResetTime); /** * @dev Tells the custom volume limit set for a specific token * @param token Address of the token being queried */ function customVolumeLimit(address token) external view returns (address limitToken, uint256 amount, uint256 accrued, uint256 period, uint256 nextResetTime); /** * @dev Tells the volume limit that should be used for a token * @param token Address of the token being queried */ function getVolumeLimit(address token) external view returns (address limitToken, uint256 amount, uint256 accrued, uint256 period, uint256 nextResetTime); /** * @dev Sets a the default volume limit config * @param limitToken Address of the token to measure the volume limit * @param limitAmount Amount of tokens to be applied for the volume limit * @param limitPeriod Frequency to Amount of tokens to be applied for the volume limit */ function setDefaultVolumeLimit(address limitToken, uint256 limitAmount, uint256 limitPeriod) external; /** * @dev Sets a custom volume limit * @param token Address of the token to set a custom volume limit for * @param limitToken Address of the token to measure the volume limit * @param limitAmount Amount of tokens to be applied for the volume limit * @param limitPeriod Frequency to Amount of tokens to be applied for the volume limit */ function setCustomVolumeLimit(address token, address limitToken, uint256 limitAmount, uint256 limitPeriod) 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 './IBaseBridgeTask.sol'; /** * @dev Axelar bridger task interface */ interface IAxelarBridger is IBaseBridgeTask { /** * @dev Execute Axelar bridger task */ function call(address token, uint256 amountIn) 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 '../ITask.sol'; /** * @dev Base bridge task interface */ interface IBaseBridgeTask is ITask { /** * @dev The token is zero */ error TaskTokenZero(); /** * @dev The amount is zero */ error TaskAmountZero(); /** * @dev The recipient is zero */ error TaskRecipientZero(); /** * @dev The connector is zero */ error TaskConnectorZero(); /** * @dev The next balance connector is not zero */ error TaskNextConnectorNotZero(bytes32 id); /** * @dev The destination chain is not set */ error TaskDestinationChainNotSet(); /** * @dev The destination chain id is the same as the current chain id */ error TaskBridgeCurrentChainId(uint256 destinationChain); /** * @dev The slippage to be set is greater than one */ error TaskSlippageAboveOne(); /** * @dev The requested slippage is greater than the maximum slippage */ error TaskSlippageAboveMax(uint256 slippage, uint256 maxSlippage); /** * @dev The requested fee is greater than the maximum fee */ error TaskFeeAboveMax(uint256 fee, uint256 maxFee); /** * @dev The max fee token is zero but the max fee value is not zero */ error TaskInvalidMaxFee(); /** * @dev Emitted every time the connector is set */ event ConnectorSet(address indexed connector); /** * @dev Emitted every time the recipient is set */ event RecipientSet(address indexed recipient); /** * @dev Emitted every time the default destination chain is set */ event DefaultDestinationChainSet(uint256 indexed defaultDestinationChain); /** * @dev Emitted every time the default max slippage is set */ event DefaultMaxSlippageSet(uint256 maxSlippage); /** * @dev Emitted every time the default max fee is set */ event DefaultMaxFeeSet(address indexed maxFeeToken, uint256 amount); /** * @dev Emitted every time a custom destination chain is set for a token */ event CustomDestinationChainSet(address indexed token, uint256 indexed destinationChain); /** * @dev Emitted every time a custom max slippage is set */ event CustomMaxSlippageSet(address indexed token, uint256 maxSlippage); /** * @dev Emitted every time a custom max fee is set */ event CustomMaxFeeSet(address indexed token, address indexed maxFeeToken, uint256 amount); /** * @dev Tells the connector tied to the task */ function connector() external view returns (address); /** * @dev Tells the address of the allowed recipient */ function recipient() external view returns (address); /** * @dev Tells the default destination chain */ function defaultDestinationChain() external view returns (uint256); /** * @dev Tells the default max slippage */ function defaultMaxSlippage() external view returns (uint256); /** * @dev Tells the default max fee */ function defaultMaxFee() external view returns (address maxFeeToken, uint256 amount); /** * @dev Tells the destination chain defined for a specific token * @param token Address of the token being queried */ function customDestinationChain(address token) external view returns (uint256); /** * @dev Tells the max slippage defined for a specific token * @param token Address of the token being queried */ function customMaxSlippage(address token) external view returns (uint256); /** * @dev Tells the max fee defined for a specific token * @param token Address of the token being queried */ function customMaxFee(address token) external view returns (address maxFeeToken, uint256 amount); /** * @dev Tells the destination chain that should be used for a token * @param token Address of the token to get the destination chain for */ function getDestinationChain(address token) external view returns (uint256); /** * @dev Tells the max slippage that should be used for a token * @param token Address of the token to get the max slippage for */ function getMaxSlippage(address token) external view returns (uint256); /** * @dev Tells the max fee that should be used for a token * @param token Address of the token to get the max fee for */ function getMaxFee(address token) external view returns (address maxFeeToken, uint256 amount); /** * @dev Sets a new connector * @param newConnector Address of the connector to be set */ function setConnector(address newConnector) external; /** * @dev Sets the recipient address * @param recipient Address of the new recipient to be set */ function setRecipient(address recipient) external; /** * @dev Sets the default destination chain * @param destinationChain Default destination chain to be set */ function setDefaultDestinationChain(uint256 destinationChain) external; /** * @dev Sets the default max slippage * @param maxSlippage Default max slippage to be set */ function setDefaultMaxSlippage(uint256 maxSlippage) external; /** * @dev Sets the default max fee * @param maxFeeToken Default max fee token to be set * @param amount Default max fee amount to be set */ function setDefaultMaxFee(address maxFeeToken, uint256 amount) external; /** * @dev Sets a custom destination chain for a token * @param token Address of the token to set a custom destination chain for * @param destinationChain Destination chain to be set */ function setCustomDestinationChain(address token, uint256 destinationChain) external; /** * @dev Sets a custom max slippage * @param token Address of the token to set a custom max slippage for * @param maxSlippage Max slippage to be set */ function setCustomMaxSlippage(address token, uint256 maxSlippage) external; /** * @dev Sets a custom max fee * @param token Address of the token to set a custom max fee for * @param maxFeeToken Max fee token to be set for the given token * @param amount Max fee amount to be set for the given token */ function setCustomMaxFee(address token, address maxFeeToken, 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; import './IBaseBridgeTask.sol'; /** * @dev Connext bridger task interface */ interface IConnextBridger is IBaseBridgeTask { /** * @dev Execute Connext bridger task */ function call(address token, uint256 amountIn, uint256 slippage, uint256 relayerFee) 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 './IBaseBridgeTask.sol'; /** * @dev Hop bridger task interface */ interface IHopBridger is IBaseBridgeTask { /** * @dev The max deadline is zero */ error TaskMaxDeadlineZero(); /** * @dev The Hop entrypoint is zero */ error TaskMissingHopEntrypoint(); /** * @dev Emitted every time the relayer is set */ event RelayerSet(address indexed relayer); /** * @dev Emitted every time the max deadline is set */ event MaxDeadlineSet(uint256 maxDeadline); /** * @dev Emitted every time a Hop entrypoint is set for a token */ event TokenHopEntrypointSet(address indexed token, address indexed entrypoint); /** * @dev Tells the relayer address, only used when bridging from L1 to L2 */ function relayer() external view returns (address); /** * @dev Tells the max deadline */ function maxDeadline() external view returns (uint256); /** * @dev Tells Hop entrypoint set for a token */ function tokenHopEntrypoint(address token) external view returns (address entrypoint); /** * @dev Sets the relayer, only used when bridging from L1 to L2 * @param relayer New relayer address to be set */ function setRelayer(address relayer) external; /** * @dev Sets the max deadline * @param maxDeadline New max deadline to be set */ function setMaxDeadline(uint256 maxDeadline) external; /** * @dev Sets an entrypoint for a tokens * @param token Token address to set a Hop entrypoint for * @param entrypoint Hop entrypoint address to be set for a token */ function setTokenHopEntrypoint(address token, address entrypoint) external; /** * @dev Execution function */ function call(address token, uint256 amountIn, uint256 slippage, uint256 fee) 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 './IBaseBridgeTask.sol'; /** * @dev Wormhole bridger task interface */ interface IWormholeBridger is IBaseBridgeTask { /** * @dev Execute Wormhole bridger task */ function call(address token, uint256 amountIn, uint256 fee) 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 './base/IBaseTask.sol'; import './base/IGasLimitedTask.sol'; import './base/ITimeLockedTask.sol'; import './base/ITokenIndexedTask.sol'; import './base/ITokenThresholdTask.sol'; import './base/IVolumeLimitedTask.sol'; // solhint-disable no-empty-blocks /** * @dev Task interface */ interface ITask is IBaseTask, IGasLimitedTask, ITimeLockedTask, ITokenIndexedTask, ITokenThresholdTask, IVolumeLimitedTask { }
// 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 './IBalancerPool.sol'; interface IBalancerBoostedPool is IBalancerPool { function getRate() external view returns (uint256); function getBptIndex() 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 './IBalancerPool.sol'; interface IBalancerLinearPool is IBalancerPool { function getRate() external view returns (uint256); function getMainToken() 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 '@openzeppelin/contracts/token/ERC20/IERC20.sol'; interface IBalancerPool is IERC20 { function getPoolId() external view returns (bytes32); }
// 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 '../../ITask.sol'; /** * @dev Balancer V2 pool exit task interface */ interface IBalancerV2PoolExiter is ITask { /** * @dev The token is zero */ error TaskTokenZero(); /** * @dev The amount is zero */ error TaskAmountZero(); /** * @dev The connector is zero */ error TaskConnectorZero(); /** * @dev The slippage to be set is greater than one */ error TaskSlippageAboveOne(); /** * @dev The requested slippage is greater than the maximum slippage */ error TaskSlippageAboveMax(uint256 slippage, uint256 maxSlippage); /** * @dev Emitted every time the connector is set */ event ConnectorSet(address indexed connector); /** * @dev Emitted every time the default max slippage is set */ event DefaultMaxSlippageSet(uint256 maxSlippage); /** * @dev Emitted every time a custom max slippage is set */ event CustomMaxSlippageSet(address indexed token, uint256 maxSlippage); /** * @dev Tells the connector tied to the task */ function connector() external view returns (address); /** * @dev Tells the default token threshold */ function defaultMaxSlippage() external view returns (uint256); /** * @dev Tells the max slippage defined for a specific token * @param token Address of the token being queried */ function customMaxSlippage(address token) external view returns (uint256); /** * @dev Tells the max slippage that should be used for a token */ function getMaxSlippage(address token) external view returns (uint256); /** * @dev Sets a new connector * @param newConnector Address of the connector to be set */ function setConnector(address newConnector) external; /** * @dev Sets the default max slippage * @param maxSlippage Default max slippage to be set */ function setDefaultMaxSlippage(uint256 maxSlippage) external; /** * @dev Sets a custom max slippage * @param token Address of the token to set a custom max slippage for * @param maxSlippage Max slippage to be set */ function setCustomMaxSlippage(address token, uint256 maxSlippage) external; /** * @dev Execute Balancer v2 pool exiter * @param tokenIn Address of the Balancer pool token to exit * @param amountIn Amount of Balancer pool tokens to exit * @param slippage Slippage to be applied */ function call(address tokenIn, uint256 amountIn, uint256 slippage) 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 '@openzeppelin/contracts/token/ERC20/IERC20.sol'; interface IBalancerVault { function getPool(bytes32 poolId) external view returns (address, uint256); function getPoolTokens(bytes32 poolId) external view returns (IERC20[] memory tokens, uint256[] memory balances, uint256 lastChangeBlock); struct JoinPoolRequest { IERC20[] assets; uint256[] maxAmountsIn; bytes userData; bool fromInternalBalance; } function joinPool(bytes32 poolId, address sender, address recipient, JoinPoolRequest memory request) external payable; struct ExitPoolRequest { IERC20[] assets; uint256[] minAmountsOut; bytes userData; bool toInternalBalance; } function exitPool(bytes32 poolId, address sender, address payable recipient, ExitPoolRequest memory request) external; enum SwapKind { GIVEN_IN, GIVEN_OUT } struct SingleSwap { bytes32 poolId; SwapKind kind; address assetIn; address assetOut; uint256 amount; bytes userData; } struct FundManagement { address sender; bool fromInternalBalance; address payable recipient; bool toInternalBalance; } function swap(SingleSwap memory singleSwap, FundManagement memory funds, uint256 limit, uint256 deadline) external payable returns (uint256); struct BatchSwapStep { bytes32 poolId; uint256 assetInIndex; uint256 assetOutIndex; uint256 amount; bytes userData; } function batchSwap( SwapKind kind, BatchSwapStep[] memory swaps, address[] memory assets, FundManagement memory funds, int256[] memory limits, uint256 deadline ) external payable returns (int256[] memory); }
// 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 '../../ITask.sol'; /** * @dev Base Convex task interface */ interface IBaseConvexTask is ITask { /** * @dev The token is zero */ error TaskTokenZero(); /** * @dev The connector is zero */ error TaskConnectorZero(); /** * @dev Emitted every time the connector is set */ event ConnectorSet(address indexed connector); /** * @dev Tells the connector tied to the task */ function connector() external view returns (address); /** * @dev Sets a new connector * @param newConnector Address of the connector to be set */ function setConnector(address newConnector) 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 './IBaseConvexTask.sol'; /** * @dev Convex claimer task interface */ interface IConvexClaimer is IBaseConvexTask { /** * @dev The amount is not zero */ error TaskAmountNotZero(); /** * @dev The previous balance connector is not zero */ error TaskPreviousConnectorNotZero(bytes32 id); /** * @dev The length of the claim result mismatch */ error TaskClaimResultLengthMismatch(); /** * @dev Executes the Convex claimer task */ function call(address token, 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; import './IBaseConvexTask.sol'; /** * @dev Convex exiter task interface */ interface IConvexExiter is IBaseConvexTask { /** * @dev The amount is zero */ error TaskAmountZero(); /** * @dev Executes the Convex exiter task */ function call(address token, 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; import './IBaseConvexTask.sol'; /** * @dev Convex joiner task interface */ interface IConvexJoiner is IBaseConvexTask { /** * @dev The amount is zero */ error TaskAmountZero(); /** * @dev Executes the Convex joiner task */ function call(address token, 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; import '../../ITask.sol'; /** * @dev Base Curve task interface */ interface IBaseCurveTask is ITask { /** * @dev The token is zero */ error TaskTokenZero(); /** * @dev The amount is zero */ error TaskAmountZero(); /** * @dev The connector is zero */ error TaskConnectorZero(); /** * @dev The token out is not set */ error TaskTokenOutNotSet(); /** * @dev The slippage to be set is greater than one */ error TaskSlippageAboveOne(); /** * @dev The requested slippage is greater than the maximum slippage */ error TaskSlippageAboveMax(uint256 slippage, uint256 maxSlippage); /** * @dev Emitted every time the connector is set */ event ConnectorSet(address indexed connector); /** * @dev Emitted every time the default token out is set */ event DefaultTokenOutSet(address indexed tokenOut); /** * @dev Emitted every time the default max slippage is set */ event DefaultMaxSlippageSet(uint256 maxSlippage); /** * @dev Emitted every time a custom token out is set */ event CustomTokenOutSet(address indexed token, address tokenOut); /** * @dev Emitted every time a custom max slippage is set */ event CustomMaxSlippageSet(address indexed token, uint256 maxSlippage); /** * @dev Tells the connector tied to the task */ function connector() external view returns (address); /** * @dev Tells the default token out */ function defaultTokenOut() external view returns (address); /** * @dev Tells the default token threshold */ function defaultMaxSlippage() external view returns (uint256); /** * @dev Tells the token out defined for a specific token * @param token Address of the token being queried */ function customTokenOut(address token) external view returns (address); /** * @dev Tells the max slippage defined for a specific token * @param token Address of the token being queried */ function customMaxSlippage(address token) external view returns (uint256); /** * @dev Tells the token out that should be used for a token */ function getTokenOut(address token) external view returns (address); /** * @dev Tells the max slippage that should be used for a token */ function getMaxSlippage(address token) external view returns (uint256); /** * @dev Sets a new connector * @param newConnector Address of the connector to be set */ function setConnector(address newConnector) external; /** * @dev Sets the default token out * @param tokenOut Address of the default token out to be set */ function setDefaultTokenOut(address tokenOut) external; /** * @dev Sets the default max slippage * @param maxSlippage Default max slippage to be set */ function setDefaultMaxSlippage(uint256 maxSlippage) external; /** * @dev Sets a custom token out * @param token Address of the token to set a custom token out for * @param tokenOut Address of the token out to be set */ function setCustomTokenOut(address token, address tokenOut) external; /** * @dev Sets a custom max slippage * @param token Address of the token to set a custom max slippage for * @param maxSlippage Max slippage to be set */ function setCustomMaxSlippage(address token, uint256 maxSlippage) 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 './IBaseCurveTask.sol'; /** * @dev Curve 2CRV exiter task interface */ interface ICurve2CrvExiter is IBaseCurveTask { /** * @dev Executes the Curve 2CRV exiter task */ function call(address token, uint256 amount, uint256 slippage) 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 './IBaseCurveTask.sol'; /** * @dev Curve 2CRV joiner task interface */ interface ICurve2CrvJoiner is IBaseCurveTask { /** * @dev Executes the Curve 2CRV joiner task */ function call(address token, uint256 amount, uint256 slippage) 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 '../../ITask.sol'; /** * @dev Base ERC4626 task interface */ interface IBaseERC4626Task is ITask { /** * @dev The token is zero */ error TaskTokenZero(); /** * @dev The amount is zero */ error TaskAmountZero(); /** * @dev The connector is zero */ error TaskConnectorZero(); /** * @dev Emitted every time the connector is set */ event ConnectorSet(address indexed connector); /** * @dev Tells the connector tied to the task */ function connector() external view returns (address); /** * @dev Sets a new connector * @param newConnector Address of the connector to be set */ function setConnector(address newConnector) 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 './IBaseERC4626Task.sol'; /** * @dev ERC4626 exiter task interface */ interface IERC4626Exiter is IBaseERC4626Task { /** * @dev Executes the ERC4626 exiter task */ function call(address erc4626, uint256 amount, uint256 minAmountOut) 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 './IBaseERC4626Task.sol'; /** * @dev ERC4626 joiner task interface */ interface IERC4626Joiner is IBaseERC4626Task { /** * The ERC4626 reference is zero */ error TaskERC4626Zero(); /** * @dev Executes the ERC4626 joiner task */ function call(address token, uint256 amount, address erc4626, uint256 minAmountOut) 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 '../ITask.sol'; /** * @dev Collector task interface */ interface ICollector is ITask { /** * @dev The token is zero */ error TaskTokenZero(); /** * @dev The amount is zero */ error TaskAmountZero(); /** * @dev The tokens source is zero */ error TaskTokensSourceZero(); /** * @dev The previous balance connector is not zero */ error TaskPreviousConnectorNotZero(bytes32 id); /** * @dev Emitted every time the tokens source is set */ event TokensSourceSet(address indexed tokensSource); /** * @dev Sets the tokens source address * @param tokensSource Address of the tokens source to be set */ function setTokensSource(address tokensSource) external; /** * @dev Executes the collector task */ function call(address token, 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; import '../ITask.sol'; /** * @dev Depositor task interface */ interface IDepositor is ITask { /** * @dev The token is zero */ error TaskTokenZero(); /** * @dev The amount is zero */ error TaskAmountZero(); /** * @dev The msg value is zero */ error TaskValueZero(); /** * @dev The previous balance connector is not zero */ error TaskPreviousConnectorNotZero(bytes32 id); /** * @dev Executes the withdrawer task */ function call(address token, 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; import '../ITask.sol'; /** * @dev Hand over task interface */ interface IHandleOver is ITask { /** * @dev The token is zero */ error TaskTokenZero(); /** * @dev The amount is zero */ error TaskAmountZero(); /** * @dev The tokens source is zero */ error TaskConnectorZero(bytes32 id); /** * @dev Executes the hand over task */ function call(address token, 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; import '../ITask.sol'; /** * @dev Unwrapper task interface */ interface IUnwrapper is ITask { /** * @dev The amount is zero */ error TaskAmountZero(); /** * @dev The token is not the wrapped native token */ error TaskTokenNotWrapped(); /** * @dev Executes the unwrapper task */ function call(address token, 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; import '../ITask.sol'; /** * @dev Withdrawer task interface */ interface IWithdrawer is ITask { /** * @dev The token is zero */ error TaskTokenZero(); /** * @dev The amount is zero */ error TaskAmountZero(); /** * @dev The recipient is zero */ error TaskRecipientZero(); /** * @dev The recipient to be set is the smart vault */ error TaskRecipientEqualsSmartVault(address recipient); /** * @dev The next balance connector is not zero */ error TaskNextConnectorNotZero(bytes32 id); /** * @dev Emitted every time the recipient is set */ event RecipientSet(address indexed recipient); /** * @dev Tells the address of the allowed recipient */ function recipient() external view returns (address); /** * @dev Sets the recipient address * @param recipient Address of the new recipient to be set */ function setRecipient(address recipient) external; /** * @dev Executes the withdrawer task */ function call(address token, 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; import '../ITask.sol'; /** * @dev Wrapper task interface */ interface IWrapper is ITask { /** * @dev The amount is zero */ error TaskAmountZero(); /** * @dev The token is not the native token */ error TaskTokenNotNative(); /** * @dev Executes the wrapper task */ function call(address token, 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; import '../ITask.sol'; /** * @dev Base relayer fund task interface */ interface IBaseRelayerFundTask is ITask { /** * @dev The relayer is zero */ error TaskRelayerZero(); /** * @dev The task initializer is disabled */ error TaskInitializerDisabled(); /** * @dev There is no threshold set for the given token */ error TaskTokenThresholdNotSet(address token); /** * @dev The deposited amount is above the minimum threshold */ error TaskDepositAboveMinThreshold(uint256 balance, uint256 min); /** * @dev The new amount to be deposited does not cover the used quota */ error TaskDepositBelowUsedQuota(uint256 amount, uint256 quota); /** * @dev The requested amount would result in a new balance below the minimum threshold */ error TaskNewDepositBelowMinThreshold(uint256 balance, uint256 min); /** * @dev The requested amount would result in a new balance above the maximum threshold */ error TaskNewDepositAboveMaxThreshold(uint256 balance, uint256 max); /** * @dev Emitted every time the relayer is set */ event RelayerSet(address indexed relayer); /** * @dev Tells the relayer */ function relayer() external view returns (address); /** * @dev Sets the relayer * @param newRelayer Address of the relayer to be set */ function setRelayer(address newRelayer) 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 '../ITask.sol'; /** * @dev Relayer depositor task interface */ interface IRelayerDepositor is ITask { /** * @dev The amount is zero */ error TaskAmountZero(); /** * @dev The relayer is zero */ error TaskRelayerZero(); /** * @dev Emitted every time the relayer is set */ event RelayerSet(address indexed relayer); /** * @dev Tells the relayer */ function relayer() external view returns (address); /** * @dev Sets the relayer * @param newRelayer Address of the relayer to be set */ function setRelayer(address newRelayer) external; /** * @dev Executes the relayer depositor task */ function call(address token, 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; import './IBaseSwapTask.sol'; /** * @dev Balancer v2 BPT swapper task interface */ interface IBalancerV2BptSwapper is IBaseSwapTask { /** * @dev Execution function */ function call(address tokenIn, uint256 amountIn, uint256 slippage) 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 '../ITask.sol'; /** * @dev Base swap task interface */ interface IBaseSwapTask is ITask { /** * @dev The token is zero */ error TaskTokenZero(); /** * @dev The amount is zero */ error TaskAmountZero(); /** * @dev The connector is zero */ error TaskConnectorZero(); /** * @dev The token out is not set */ error TaskTokenOutNotSet(); /** * @dev The slippage to be set is greater than one */ error TaskSlippageAboveOne(); /** * @dev The slippage is greater than the maximum slippage */ error TaskSlippageAboveMax(uint256 slippage, uint256 maxSlippage); /** * @dev Emitted every time the connector is set */ event ConnectorSet(address indexed connector); /** * @dev Emitted every time the default token out is set */ event DefaultTokenOutSet(address indexed tokenOut); /** * @dev Emitted every time the default max slippage is set */ event DefaultMaxSlippageSet(uint256 maxSlippage); /** * @dev Emitted every time a custom token out is set */ event CustomTokenOutSet(address indexed token, address tokenOut); /** * @dev Emitted every time a custom max slippage is set */ event CustomMaxSlippageSet(address indexed token, uint256 maxSlippage); /** * @dev Tells the connector tied to the task */ function connector() external view returns (address); /** * @dev Tells the default token out */ function defaultTokenOut() external view returns (address); /** * @dev Tells the default max slippage */ function defaultMaxSlippage() external view returns (uint256); /** * @dev Tells the token out defined for a specific token * @param token Address of the token being queried */ function customTokenOut(address token) external view returns (address); /** * @dev Tells the max slippage defined for a specific token * @param token Address of the token being queried */ function customMaxSlippage(address token) external view returns (uint256); /** * @dev Tells the token out that should be used for a token */ function getTokenOut(address token) external view returns (address); /** * @dev Tells the max slippage that should be used for a token */ function getMaxSlippage(address token) external view returns (uint256); /** * @dev Sets a new connector * @param newConnector Address of the connector to be set */ function setConnector(address newConnector) external; /** * @dev Sets the default token out * @param tokenOut Address of the default token out to be set */ function setDefaultTokenOut(address tokenOut) external; /** * @dev Sets the default max slippage * @param maxSlippage Default max slippage to be set */ function setDefaultMaxSlippage(uint256 maxSlippage) external; /** * @dev Sets a custom token out * @param token Address of the token to set a custom token out for * @param tokenOut Address of the token out to be set */ function setCustomTokenOut(address token, address tokenOut) external; /** * @dev Sets a custom max slippage * @param token Address of the token to set a custom max slippage for * @param maxSlippage Max slippage to be set */ function setCustomMaxSlippage(address token, uint256 maxSlippage) 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 './IBaseSwapTask.sol'; /** * @dev L2 Hop swapper task interface */ interface IHopL2Swapper is IBaseSwapTask { /** * @dev The amm for the token is not set */ error TaskMissingHopTokenAmm(); /** * @dev The hToken to be set is not the hToken of the Hop L2 amm to be used */ error TaskHopTokenAmmMismatch(address hToken, address amm); /** * @dev Emitted every time an AMM is set for a token */ event TokenAmmSet(address indexed token, address amm); /** * @dev Tells AMM set for a token */ function tokenAmm(address token) external view returns (address); /** * @dev Sets an AMM for a hToken * @param hToken Address of the hToken to be set * @param amm AMM address to be set for the hToken */ function setTokenAmm(address hToken, address amm) external; /** * @dev Executes the L2 hop swapper task */ function call(address tokenIn, uint256 amountIn, uint256 slippage) 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 './IBaseSwapTask.sol'; /** * @dev 1inch v5 swapper task interface */ interface IOneInchV5Swapper is IBaseSwapTask { /** * @dev Execution function */ function call(address tokenIn, uint256 amountIn, uint256 slippage, 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 './IBaseSwapTask.sol'; /** * @dev Paraswap v5 swapper task interface */ interface IParaswapV5Swapper is IBaseSwapTask { /** * @dev The quote signer is zero */ error TaskQuoteSignerZero(); /** * @dev The signer to be set is not the quote signer */ error TaskInvalidQuoteSigner(address signer, address quoteSigner); /** * @dev The deadline is in the past */ error TaskQuoteSignerPastDeadline(uint256 deadline, uint256 currentTimestamp); /** * @dev Emitted every time a quote signer is set */ event QuoteSignerSet(address indexed quoteSigner); /** * @dev Tells the address of the allowed quote signer */ function quoteSigner() external view returns (address); /** * @dev Sets the quote signer address. Sender must be authorized. * @param newQuoteSigner Address of the new quote signer to be set */ function setQuoteSigner(address newQuoteSigner) external; /** * @dev Executes Paraswap V5 swapper task */ function call( address tokenIn, uint256 amountIn, uint256 minAmountOut, uint256 expectedAmountOut, uint256 deadline, bytes memory data, bytes memory sig ) 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 './IBaseSwapTask.sol'; /** * @dev Uniswap v2 swapper task interface */ interface IUniswapV2Swapper is IBaseSwapTask { /** * @dev Execution function */ function call(address tokenIn, uint256 amountIn, uint256 slippage, address[] memory hopTokens) 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 './IBaseSwapTask.sol'; /** * @dev Uniswap v3 swapper task interface */ interface IUniswapV3Swapper is IBaseSwapTask { /** * @dev Execution function */ function call( address tokenIn, uint256 amountIn, uint256 slippage, uint24 fee, address[] memory hopTokens, uint24[] memory hopFees ) 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 '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@mimic-fi/v3-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/balancer/IBalancerV2Vault.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/balancer/IBalancerV2PoolConnector.sol'; import '../../Task.sol'; import '../../interfaces/liquidity/balancer/IBalancerPool.sol'; import '../../interfaces/liquidity/balancer/IBalancerV2PoolExiter.sol'; /** * @title Balancer v2 pool exiter * @dev Task that offers the components to exit Balancer pools */ contract BalancerV2PoolExiter is IBalancerV2PoolExiter, Task { using FixedPoint for uint256; // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('BALANCER_V2_POOL_EXITER'); // Task connector address address public override connector; // Default maximum slippage in fixed point uint256 public override defaultMaxSlippage; // Maximum slippage per token address mapping (address => uint256) public override customMaxSlippage; /** * @dev Custom max slippage config. Only used in the initializer. */ struct CustomMaxSlippage { address token; uint256 maxSlippage; } /** * @dev Balancer pool exit config. Only used in the initializer. */ struct BalancerPoolExitConfig { address connector; uint256 maxSlippage; CustomMaxSlippage[] customMaxSlippages; TaskConfig taskConfig; } /** * @dev Initializes a Balancer v2 pool exiter * @param config Balancer pool exit config */ function initialize(BalancerPoolExitConfig memory config) external virtual initializer { __BalancerV2PoolExiter_init(config); } /** * @dev Initializes the Balancer v2 pool exiter. It does call upper contracts initializers. * @param config Balancer pool exit config */ function __BalancerV2PoolExiter_init(BalancerPoolExitConfig memory config) internal onlyInitializing { __Task_init(config.taskConfig); __BalancerV2PoolExiter_init_unchained(config); } /** * @dev Initializes the Balancer v2 pool exiter. It does not call upper contracts initializers. * @param config Balancer pool exit config */ function __BalancerV2PoolExiter_init_unchained(BalancerPoolExitConfig memory config) internal onlyInitializing { _setConnector(config.connector); _setDefaultMaxSlippage(config.maxSlippage); for (uint256 i = 0; i < config.customMaxSlippages.length; i++) { _setCustomMaxSlippage(config.customMaxSlippages[i].token, config.customMaxSlippages[i].maxSlippage); } } /** * @dev Tells the max slippage that should be used for a token */ function getMaxSlippage(address token) public view virtual override returns (uint256) { uint256 maxSlippage = customMaxSlippage[token]; return maxSlippage == 0 ? defaultMaxSlippage : maxSlippage; } /** * @dev Sets a new connector * @param newConnector Address of the connector to be set */ function setConnector(address newConnector) external override authP(authParams(newConnector)) { _setConnector(newConnector); } /** * @dev Sets the default max slippage * @param maxSlippage Default max slippage to be set */ function setDefaultMaxSlippage(uint256 maxSlippage) external override authP(authParams(maxSlippage)) { _setDefaultMaxSlippage(maxSlippage); } /** * @dev Sets a custom max slippage * @param token Address of the token to set a custom max slippage for * @param maxSlippage Max slippage to be set */ function setCustomMaxSlippage(address token, uint256 maxSlippage) external override authP(authParams(token, maxSlippage)) { _setCustomMaxSlippage(token, maxSlippage); } /** * @dev Execute Balancer v2 pool exiter * @param tokenIn Address of the Balancer pool token to exit * @param amountIn Amount of Balancer pool tokens to exit * @param slippage Slippage to be applied */ function call(address tokenIn, uint256 amountIn, uint256 slippage) external override authP(authParams(tokenIn, amountIn, slippage)) { if (amountIn == 0) amountIn = getTaskAmount(tokenIn); _beforeBalancerV2PoolExiter(tokenIn, amountIn, slippage); (address[] memory tokensOut, uint256[] memory minAmountsOut) = _getTokensOut(tokenIn, amountIn, slippage); bytes memory connectorData = abi.encodeWithSelector( IBalancerV2PoolConnector.exit.selector, tokenIn, amountIn, tokensOut, minAmountsOut ); bytes memory result = ISmartVault(smartVault).execute(connector, connectorData); uint256[] memory amountsOut = abi.decode(result, (uint256[])); _afterBalancerV2PoolExiter(tokenIn, amountIn, tokensOut, amountsOut); } /** * @dev Tells the list of tokens and min amounts out based on a number of BPTs to exit * @param tokenIn Address of the pool being exited * @param amountIn Amount of tokens to exit the pool with * @param slippage Slippage to be used */ function _getTokensOut(address tokenIn, uint256 amountIn, uint256 slippage) internal view returns (address[] memory tokensOut, uint256[] memory minAmountsOut) { uint256 bptTotalSupply = IERC20(tokenIn).totalSupply(); uint256 bptRatio = amountIn.divDown(bptTotalSupply); bytes32 poolId = IBalancerPool(tokenIn).getPoolId(); address balancerV2Vault = IBalancerV2PoolConnector(connector).balancerV2Vault(); (IERC20[] memory tokens, uint256[] memory balances, ) = IBalancerV2Vault(balancerV2Vault).getPoolTokens(poolId); tokensOut = new address[](tokens.length); minAmountsOut = new uint256[](tokens.length); for (uint256 i = 0; i < tokens.length; i++) { tokensOut[i] = address(tokens[i]); uint256 expectedAmountsOut = balances[i].mulDown(bptRatio); minAmountsOut[i] = expectedAmountsOut.mulDown(FixedPoint.ONE - slippage); } } /** * @dev Before Balancer v2 pool exiter hook */ function _beforeBalancerV2PoolExiter(address tokenIn, uint256 amountIn, uint256 slippage) internal virtual { _beforeTask(tokenIn, amountIn); if (tokenIn == address(0)) revert TaskTokenZero(); if (amountIn == 0) revert TaskAmountZero(); uint256 maxSlippage = getMaxSlippage(tokenIn); if (slippage > maxSlippage) revert TaskSlippageAboveMax(slippage, maxSlippage); } /** * @dev After Balancer v2 pool exiter hook */ function _afterBalancerV2PoolExiter( address tokenIn, uint256 amountIn, address[] memory tokensOut, uint256[] memory amountsOut ) internal virtual { for (uint256 i = 0; i < tokensOut.length; i++) _increaseBalanceConnector(tokensOut[i], amountsOut[i]); _afterTask(tokenIn, amountIn); } /** * @dev Sets the task connector * @param newConnector New connector to be set */ function _setConnector(address newConnector) internal { if (newConnector == address(0)) revert TaskConnectorZero(); connector = newConnector; emit ConnectorSet(newConnector); } /** * @dev Sets the default max slippage * @param maxSlippage Default max slippage to be set */ function _setDefaultMaxSlippage(uint256 maxSlippage) internal { if (maxSlippage > FixedPoint.ONE) revert TaskSlippageAboveOne(); defaultMaxSlippage = maxSlippage; emit DefaultMaxSlippageSet(maxSlippage); } /** * @dev Sets a custom max slippage for a token * @param token Address of the token to set the custom max slippage for * @param maxSlippage Max slippage to be set */ function _setCustomMaxSlippage(address token, uint256 maxSlippage) internal { if (token == address(0)) revert TaskTokenZero(); if (maxSlippage > FixedPoint.ONE) revert TaskSlippageAboveOne(); customMaxSlippage[token] = maxSlippage; emit CustomMaxSlippageSet(token, maxSlippage); } }
// 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 '../../Task.sol'; import '../../interfaces/liquidity/convex/IBaseConvexTask.sol'; /** * @title Base Convex task * @dev Task that offers the basic components for more detailed Convex related tasks */ abstract contract BaseConvexTask is IBaseConvexTask, Task { // Task connector address address public override connector; /** * @dev Base Convex config. Only used in the initializer. */ struct BaseConvexConfig { address connector; TaskConfig taskConfig; } /** * @dev Initializes the base Convex task. It does call upper contracts initializers. * @param config Base Convex config */ function __BaseConvexTask_init(BaseConvexConfig memory config) internal onlyInitializing { __Task_init(config.taskConfig); __BaseConvexTask_init_unchained(config); } /** * @dev Initializes the base Convex task. It does not call upper contracts initializers. * @param config Base Convex config */ function __BaseConvexTask_init_unchained(BaseConvexConfig memory config) internal onlyInitializing { _setConnector(config.connector); } /** * @dev Sets the task connector * @param newConnector Address of the new connector to be set */ function setConnector(address newConnector) external override authP(authParams(newConnector)) { _setConnector(newConnector); } /** * @dev Before base Convex task hook */ function _beforeBaseConvexTask(address token, uint256 amount) internal virtual { _beforeTask(token, amount); if (token == address(0)) revert TaskTokenZero(); } /** * @dev After base Convex task hook */ function _afterBaseConvexTask(address token, uint256 amount) internal virtual { _afterTask(token, amount); } /** * @dev Sets the task connector * @param newConnector New connector to be set */ function _setConnector(address newConnector) internal { if (newConnector == address(0)) revert TaskConnectorZero(); connector = newConnector; emit ConnectorSet(newConnector); } }
// 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/v3-connectors/contracts/interfaces/convex/IConvexConnector.sol'; import './BaseConvexTask.sol'; import '../../interfaces/liquidity/convex/IConvexClaimer.sol'; /** * @title Convex claimer */ contract ConvexClaimer is IConvexClaimer, BaseConvexTask { // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('CONVEX_CLAIMER'); /** * @dev Convex claim config. Only used in the initializer. */ struct ConvexClaimConfig { BaseConvexConfig baseConvexConfig; } /** * @dev Initializes a Convex claimer * @param config Convex claim config */ function initialize(ConvexClaimConfig memory config) external virtual initializer { __ConvexClaimer_init(config); } /** * @dev Initializes the Convex claimer. It does call upper contracts initializers. * @param config Convex claim config */ function __ConvexClaimer_init(ConvexClaimConfig memory config) internal onlyInitializing { __BaseConvexTask_init(config.baseConvexConfig); __ConvexClaimer_init_unchained(config); } /** * @dev Initializes the Convex claimer. It does not call upper contracts initializers. * @param config Convex claim config */ function __ConvexClaimer_init_unchained(ConvexClaimConfig memory config) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Tells the address from where the token amounts to execute this task are fetched */ function getTokensSource() external view virtual override(IBaseTask, BaseTask) returns (address) { return IConvexConnector(connector).booster(); } /** * @dev Tells the amount a task should use for a token, in this case always zero since it is not possible to * compute on-chain how many tokens are available to be claimed. */ function getTaskAmount(address) public pure virtual override(IBaseTask, BaseTask) returns (uint256) { return 0; } /** * @dev Execute Convex claimer * @param token Address of the Convex pool token to claim rewards for * @param amount Must be zero, it is not possible to claim a specific number of tokens */ function call(address token, uint256 amount) external override authP(authParams(token, amount)) { if (amount == 0) amount = getTaskAmount(token); _beforeConvexClaimer(token, amount); bytes memory connectorData = abi.encodeWithSelector(IConvexConnector.claim.selector, token); bytes memory result = ISmartVault(smartVault).execute(connector, connectorData); (address[] memory tokens, uint256[] memory amounts) = abi.decode(result, (address[], uint256[])); _afterConvexClaimer(token, amount, tokens, amounts); } /** * @dev Before Convex claimer hook */ function _beforeConvexClaimer(address token, uint256 amount) internal virtual { _beforeBaseConvexTask(token, amount); if (amount != 0) revert TaskAmountNotZero(); } /** * @dev After Convex claimer hook */ function _afterConvexClaimer( address tokenIn, uint256 amountIn, address[] memory tokensOut, uint256[] memory amountsOut ) internal virtual { if (tokensOut.length != amountsOut.length) revert TaskClaimResultLengthMismatch(); for (uint256 i = 0; i < tokensOut.length; i++) _increaseBalanceConnector(tokensOut[i], amountsOut[i]); _afterBaseConvexTask(tokenIn, amountIn); } /** * @dev Sets the balance connectors. Previous balance connector must be unset. * @param previous Balance connector id of the previous task in the workflow * @param next Balance connector id of the next task in the workflow */ function _setBalanceConnectors(bytes32 previous, bytes32 next) internal virtual override { if (previous != bytes32(0)) revert TaskPreviousConnectorNotZero(previous); super._setBalanceConnectors(previous, next); } }
// 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/v3-helpers/contracts/utils/BytesHelpers.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/convex/IConvexConnector.sol'; import './BaseConvexTask.sol'; import '../../interfaces/liquidity/convex/IConvexExiter.sol'; /** * @title Convex exiter * @dev Task that extends the base Convex task to exit Convex pools */ contract ConvexExiter is IConvexExiter, BaseConvexTask { using BytesHelpers for bytes; // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('CONVEX_EXITER'); /** * @dev Convex exit config. Only used in the initializer. */ struct ConvexExitConfig { BaseConvexConfig baseConvexConfig; } /** * @dev Initializes a Convex exiter * @param config Convex exit config */ function initialize(ConvexExitConfig memory config) external virtual initializer { __ConvexExiter_init(config); } /** * @dev Initializes the Convex exiter. It does call upper contracts initializers. * @param config Convex exit config */ function __ConvexExiter_init(ConvexExitConfig memory config) internal onlyInitializing { __BaseConvexTask_init(config.baseConvexConfig); __ConvexExiter_init_unchained(config); } /** * @dev Initializes the Convex exiter. It does not call upper contracts initializers. * @param config Convex exit config */ function __ConvexExiter_init_unchained(ConvexExitConfig memory config) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Executes the Convex exiter task * @param token Address of the Convex pool token to be exited with * @param amount Amount of Convex pool tokens to be exited with */ function call(address token, uint256 amount) external override authP(authParams(token, amount)) { if (amount == 0) amount = getTaskAmount(token); _beforeConvexExiter(token, amount); bytes memory connectorData = abi.encodeWithSelector(IConvexConnector.exit.selector, token, amount); bytes memory result = ISmartVault(smartVault).execute(connector, connectorData); _afterConvexExiter(token, amount, IConvexConnector(connector).getCurvePool(token), result.toUint256()); } /** * @dev Before Convex exiter hook */ function _beforeConvexExiter(address token, uint256 amount) internal virtual { _beforeBaseConvexTask(token, amount); if (amount == 0) revert TaskAmountZero(); } /** * @dev After Convex exiter hook */ function _afterConvexExiter(address tokenIn, uint256 amountIn, address tokenOut, uint256 amountOut) internal virtual { _increaseBalanceConnector(tokenOut, amountOut); _afterBaseConvexTask(tokenIn, amountIn); } }
// 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/v3-helpers/contracts/utils/BytesHelpers.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/convex/IConvexConnector.sol'; import './BaseConvexTask.sol'; import '../../interfaces/liquidity/convex/IConvexJoiner.sol'; /** * @title Convex joiner * @dev Task that extends the base Convex task to join Convex pools */ contract ConvexJoiner is IConvexJoiner, BaseConvexTask { using BytesHelpers for bytes; // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('CONVEX_JOINER'); /** * @dev Convex join config. Only used in the initializer. */ struct ConvexJoinConfig { BaseConvexConfig baseConvexConfig; } /** * @dev Initializes a Convex joiner * @param config Convex join config */ function initialize(ConvexJoinConfig memory config) external virtual initializer { __ConvexJoiner_init(config); } /** * @dev Initializes the Convex joiner. It does call upper contracts initializers. * @param config Convex join config */ function __ConvexJoiner_init(ConvexJoinConfig memory config) internal onlyInitializing { __BaseConvexTask_init(config.baseConvexConfig); __ConvexJoiner_init_unchained(config); } /** * @dev Initializes the Convex joiner. It does not call upper contracts initializers. * @param config Convex join config */ function __ConvexJoiner_init_unchained(ConvexJoinConfig memory config) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Executes the Convex joiner task * @param token Address of the Curve pool token to be joined with * @param amount Amount of Curve pool tokens to be joined with */ function call(address token, uint256 amount) external override authP(authParams(token, amount)) { if (amount == 0) amount = getTaskAmount(token); _beforeConvexJoiner(token, amount); bytes memory connectorData = abi.encodeWithSelector(IConvexConnector.join.selector, token, amount); bytes memory result = ISmartVault(smartVault).execute(connector, connectorData); _afterConvexJoiner(token, amount, IConvexConnector(connector).getCvxPool(token), result.toUint256()); } /** * @dev Before Convex joiner hook */ function _beforeConvexJoiner(address token, uint256 amount) internal virtual { _beforeBaseConvexTask(token, amount); if (amount == 0) revert TaskAmountZero(); } /** * @dev After Convex joiner hook */ function _afterConvexJoiner(address tokenIn, uint256 amountIn, address tokenOut, uint256 amountOut) internal virtual { _increaseBalanceConnector(tokenOut, amountOut); _afterBaseConvexTask(tokenIn, amountIn); } }
// 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/v3-helpers/contracts/math/FixedPoint.sol'; import '../../Task.sol'; import '../../interfaces/liquidity/curve/IBaseCurveTask.sol'; /** * @title Base Curve task * @dev Task that offers the basic components for more detailed Curve related tasks */ abstract contract BaseCurveTask is IBaseCurveTask, Task { using FixedPoint for uint256; // Task connector address address public override connector; // Default token out address public override defaultTokenOut; // Default maximum slippage in fixed point uint256 public override defaultMaxSlippage; // Token out per token mapping (address => address) public override customTokenOut; // Maximum slippage per token address mapping (address => uint256) public override customMaxSlippage; /** * @dev Custom token out config. Only used in the initializer. */ struct CustomTokenOut { address token; address tokenOut; } /** * @dev Custom max slippage config. Only used in the initializer. */ struct CustomMaxSlippage { address token; uint256 maxSlippage; } /** * @dev Base Curve config. Only used in the initializer. */ struct BaseCurveConfig { address connector; address tokenOut; uint256 maxSlippage; CustomTokenOut[] customTokensOut; CustomMaxSlippage[] customMaxSlippages; TaskConfig taskConfig; } /** * @dev Initializes the base Curve task. It does call upper contracts initializers. * @param config Base Curve config */ function __BaseCurveTask_init(BaseCurveConfig memory config) internal onlyInitializing { __Task_init(config.taskConfig); __BaseCurveTask_init_unchained(config); } /** * @dev Initializes the base Curve task. It does not call upper contracts initializers. * @param config Base Curve config */ function __BaseCurveTask_init_unchained(BaseCurveConfig memory config) internal onlyInitializing { _setConnector(config.connector); _setDefaultTokenOut(config.tokenOut); _setDefaultMaxSlippage(config.maxSlippage); for (uint256 i = 0; i < config.customTokensOut.length; i++) { _setCustomTokenOut(config.customTokensOut[i].token, config.customTokensOut[i].tokenOut); } for (uint256 i = 0; i < config.customMaxSlippages.length; i++) { _setCustomMaxSlippage(config.customMaxSlippages[i].token, config.customMaxSlippages[i].maxSlippage); } } /** * @dev Tells the token out that should be used for a token */ function getTokenOut(address token) public view virtual override returns (address) { address tokenOut = customTokenOut[token]; return tokenOut == address(0) ? defaultTokenOut : tokenOut; } /** * @dev Tells the max slippage that should be used for a token */ function getMaxSlippage(address token) public view virtual override returns (uint256) { uint256 maxSlippage = customMaxSlippage[token]; return maxSlippage == 0 ? defaultMaxSlippage : maxSlippage; } /** * @dev Sets the task connector * @param newConnector Address of the new connector to be set */ function setConnector(address newConnector) external override authP(authParams(newConnector)) { _setConnector(newConnector); } /** * @dev Sets the default token out * @param tokenOut Address of the default token out to be set */ function setDefaultTokenOut(address tokenOut) external override authP(authParams(tokenOut)) { _setDefaultTokenOut(tokenOut); } /** * @dev Sets the default max slippage */ function setDefaultMaxSlippage(uint256 maxSlippage) external override authP(authParams(maxSlippage)) { _setDefaultMaxSlippage(maxSlippage); } /** * @dev Sets a custom token out * @param token Address of the token to set a custom token out for * @param tokenOut Address of the token out to be set */ function setCustomTokenOut(address token, address tokenOut) external override authP(authParams(token, tokenOut)) { _setCustomTokenOut(token, tokenOut); } /** * @dev Sets a a custom max slippage * @param token Address of the token to set a max slippage for * @param maxSlippage Max slippage to be set for the given token */ function setCustomMaxSlippage(address token, uint256 maxSlippage) external override authP(authParams(token, maxSlippage)) { _setCustomMaxSlippage(token, maxSlippage); } /** * @dev Before base Curve task hook */ function _beforeBaseCurveTask(address token, uint256 amount, uint256 slippage) internal virtual { _beforeTask(token, amount); if (token == address(0)) revert TaskTokenZero(); if (amount == 0) revert TaskAmountZero(); if (getTokenOut(token) == address(0)) revert TaskTokenOutNotSet(); uint256 maxSlippage = getMaxSlippage(token); if (slippage > maxSlippage) revert TaskSlippageAboveMax(slippage, maxSlippage); } /** * @dev After base Curve task hook */ function _afterBaseCurveTask(address tokenIn, uint256 amountIn, uint256, address tokenOut, uint256 amountOut) internal virtual { _increaseBalanceConnector(tokenOut, amountOut); _afterTask(tokenIn, amountIn); } /** * @dev Sets the task connector * @param newConnector New connector to be set */ function _setConnector(address newConnector) internal { if (newConnector == address(0)) revert TaskConnectorZero(); connector = newConnector; emit ConnectorSet(newConnector); } /** * @dev Sets the default token out * @param tokenOut Default token out to be set */ function _setDefaultTokenOut(address tokenOut) internal { defaultTokenOut = tokenOut; emit DefaultTokenOutSet(tokenOut); } /** * @dev Sets the default max slippage * @param maxSlippage Default max slippage to be set */ function _setDefaultMaxSlippage(uint256 maxSlippage) internal { if (maxSlippage > FixedPoint.ONE) revert TaskSlippageAboveOne(); defaultMaxSlippage = maxSlippage; emit DefaultMaxSlippageSet(maxSlippage); } /** * @dev Sets a custom token out for a token * @param token Address of the token to set the custom token out for * @param tokenOut Address of the token out to be set */ function _setCustomTokenOut(address token, address tokenOut) internal { if (token == address(0)) revert TaskTokenZero(); customTokenOut[token] = tokenOut; emit CustomTokenOutSet(token, tokenOut); } /** * @dev Sets a custom max slippage for a token * @param token Address of the token to set the custom max slippage for * @param maxSlippage Max slippage to be set */ function _setCustomMaxSlippage(address token, uint256 maxSlippage) internal { if (token == address(0)) revert TaskTokenZero(); if (maxSlippage > FixedPoint.ONE) revert TaskSlippageAboveOne(); customMaxSlippage[token] = maxSlippage; emit CustomMaxSlippageSet(token, maxSlippage); } }
// 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/v3-helpers/contracts/utils/BytesHelpers.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/curve/ICurve2CrvConnector.sol'; import './BaseCurveTask.sol'; import '../../interfaces/liquidity/curve/ICurve2CrvExiter.sol'; /** * @title Curve 2CRV exiter * @dev Task that extends the base Curve task to exit 2CRV pools */ contract Curve2CrvExiter is ICurve2CrvExiter, BaseCurveTask { using BytesHelpers for bytes; // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('CURVE_2CRV_EXITER'); /** * @dev Curve 2CRV exit config. Only used in the initializer. */ struct Curve2CrvExitConfig { BaseCurveConfig baseCurveConfig; } /** * @dev Initializes a Curve 2CRV exiter * @param config Curve 2CRV exit config */ function initialize(Curve2CrvExitConfig memory config) external virtual initializer { __Curve2CrvExiter_init(config); } /** * @dev Initializes the Curve 2CRV exiter. It does call upper contracts initializers. * @param config Curve 2CRV exit config */ function __Curve2CrvExiter_init(Curve2CrvExitConfig memory config) internal onlyInitializing { __BaseCurveTask_init(config.baseCurveConfig); __Curve2CrvExiter_init_unchained(config); } /** * @dev Initializes the Curve 2CRV exiter. It does not call upper contracts initializers. * @param config Curve 2CRV exit config */ function __Curve2CrvExiter_init_unchained(Curve2CrvExitConfig memory config) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Execute Curve 2CRV exiter * @param token Address of the Curve pool token to exit * @param amount Amount of Curve pool tokens to exit */ function call(address token, uint256 amount, uint256 slippage) external override authP(authParams(token, amount, slippage)) { if (amount == 0) amount = getTaskAmount(token); _beforeCurve2CrvExiter(token, amount, slippage); address tokenOut = getTokenOut(token); bytes memory connectorData = abi.encodeWithSelector( ICurve2CrvConnector.exit.selector, token, amount, tokenOut, slippage ); bytes memory result = ISmartVault(smartVault).execute(connector, connectorData); _afterCurve2CrvExiter(token, amount, slippage, tokenOut, result.toUint256()); } /** * @dev Before Curve 2CRV exiter hook */ function _beforeCurve2CrvExiter(address token, uint256 amount, uint256 slippage) internal virtual { _beforeBaseCurveTask(token, amount, slippage); } /** * @dev After Curve 2CRV exiter hook */ function _afterCurve2CrvExiter( address tokenIn, uint256 amountIn, uint256 slippage, address tokenOut, uint256 amountOut ) internal virtual { _afterBaseCurveTask(tokenIn, amountIn, slippage, tokenOut, amountOut); } }
// 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/v3-helpers/contracts/utils/BytesHelpers.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/curve/ICurve2CrvConnector.sol'; import './BaseCurveTask.sol'; import '../../interfaces/liquidity/curve/ICurve2CrvJoiner.sol'; /** * @title Curve 2CRV joiner * @dev Task that extends the base Curve task to join 2CRV pools */ contract Curve2CrvJoiner is ICurve2CrvJoiner, BaseCurveTask { using BytesHelpers for bytes; // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('CURVE_2CRV_JOINER'); /** * @dev Curve 2CRV join config. Only used in the initializer. */ struct Curve2CrvJoinConfig { BaseCurveConfig baseCurveConfig; } /** * @dev Initializes a Curve 2CRV joiner * @param config Curve 2CRV join config */ function initialize(Curve2CrvJoinConfig memory config) external virtual initializer { __Curve2CrvJoiner_init(config); } /** * @dev Initializes the Curve 2CRV joiner. It does call upper contracts initializers. * @param config Curve 2CRV join config */ function __Curve2CrvJoiner_init(Curve2CrvJoinConfig memory config) internal onlyInitializing { __BaseCurveTask_init(config.baseCurveConfig); __Curve2CrvJoiner_init_unchained(config); } /** * @dev Initializes the Curve 2CRV joiner. It does not call upper contracts initializers. * @param config Curve 2CRV join config */ function __Curve2CrvJoiner_init_unchained(Curve2CrvJoinConfig memory config) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Execute Curve 2CRV joiner * @param token Address of the token to join the Curve pool with * @param amount Amount of tokens to join the Curve pool with */ function call(address token, uint256 amount, uint256 slippage) external override authP(authParams(token, amount, slippage)) { if (amount == 0) amount = getTaskAmount(token); _beforeCurve2CrvJoiner(token, amount, slippage); address tokenOut = getTokenOut(token); bytes memory connectorData = abi.encodeWithSelector( ICurve2CrvConnector.join.selector, tokenOut, token, amount, slippage ); bytes memory result = ISmartVault(smartVault).execute(connector, connectorData); _afterCurve2CrvJoiner(token, amount, slippage, tokenOut, result.toUint256()); } /** * @dev Before Curve 2CRV joiner hook */ function _beforeCurve2CrvJoiner(address token, uint256 amount, uint256 slippage) internal virtual { _beforeBaseCurveTask(token, amount, slippage); } /** * @dev After Curve 2CRV joiner hook */ function _afterCurve2CrvJoiner( address tokenIn, uint256 amountIn, uint256 slippage, address tokenOut, uint256 amountOut ) internal virtual { _afterBaseCurveTask(tokenIn, amountIn, slippage, tokenOut, amountOut); } }
// 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 '../../Task.sol'; import '../../interfaces/liquidity/erc4626/IBaseERC4626Task.sol'; /** * @title Base ERC4626 task * @dev Task that offers the basic components for more detailed ERC4626 related tasks */ abstract contract BaseERC4626Task is IBaseERC4626Task, Task { // Task connector address address public override connector; /** * @dev Base ERC4626 config. Only used in the initializer. */ struct BaseERC4626Config { address connector; TaskConfig taskConfig; } /** * @dev Initializes the base ERC4626 task. It does call upper contracts initializers. * @param config Base ERC4626 config */ function __BaseERC4626Task_init(BaseERC4626Config memory config) internal onlyInitializing { __Task_init(config.taskConfig); __BaseERC4626Task_init_unchained(config); } /** * @dev Initializes the base ERC4626 task. It does not call upper contracts initializers. * @param config Base ERC4626 config */ function __BaseERC4626Task_init_unchained(BaseERC4626Config memory config) internal onlyInitializing { _setConnector(config.connector); } /** * @dev Sets the task connector * @param newConnector Address of the new connector to be set */ function setConnector(address newConnector) external override authP(authParams(newConnector)) { _setConnector(newConnector); } /** * @dev Before base ERC4626 task hook */ function _beforeBaseERC4626Task(address token, uint256 amount) internal virtual { _beforeTask(token, amount); if (token == address(0)) revert TaskTokenZero(); if (amount == 0) revert TaskAmountZero(); } /** * @dev After base ERC4626 task hook */ function _afterBaseERC4626Task(address tokenIn, uint256 amountIn, address tokenOut, uint256 amountOut) internal virtual { _increaseBalanceConnector(tokenOut, amountOut); _afterTask(tokenIn, amountIn); } /** * @dev Sets the task connector * @param newConnector New connector to be set */ function _setConnector(address newConnector) internal { if (newConnector == address(0)) revert TaskConnectorZero(); connector = newConnector; emit ConnectorSet(newConnector); } }
// 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/v3-connectors/contracts/interfaces/erc4626/IERC4626Connector.sol'; import './BaseERC4626Task.sol'; import '../../interfaces/liquidity/erc4626/IERC4626Exiter.sol'; /** * @title ERC4626 exiter * @dev Task that extends the base ERC4626 task to exit an ERC4626 vault */ contract ERC4626Exiter is IERC4626Exiter, BaseERC4626Task { // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('ERC4626_EXITER'); /** * @dev ERC4626 exit config. Only used in the initializer. */ struct ERC4626ExitConfig { BaseERC4626Config baseERC4626Config; } /** * @dev Initializes a ERC4626 exiter * @param config ERC4626 exit config */ function initialize(ERC4626ExitConfig memory config) external virtual initializer { __ERC4626Exiter_init(config); } /** * @dev Initializes the ERC4626 exiter. It does call upper contracts initializers. * @param config ERC4626 exit config */ function __ERC4626Exiter_init(ERC4626ExitConfig memory config) internal onlyInitializing { __BaseERC4626Task_init(config.baseERC4626Config); __ERC4626Exiter_init_unchained(config); } /** * @dev Initializes the ERC4626 exiter. It does not call upper contracts initializers. * @param config ERC4626 exit config */ function __ERC4626Exiter_init_unchained(ERC4626ExitConfig memory config) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Executes the ERC4626 exiter task. Note that the ERC4626 is also the token. * @param erc4626 Address of the ERC4626 to be exited * @param amount Amount of shares to be exited with * @param minAmountOut Minimum amount of assets willing to receive */ function call(address erc4626, uint256 amount, uint256 minAmountOut) external override authP(authParams(erc4626, amount, minAmountOut)) { if (amount == 0) amount = getTaskAmount(erc4626); _beforeERC4626Exiter(erc4626, amount); bytes memory connectorData = abi.encodeWithSelector( IERC4626Connector.exit.selector, erc4626, amount, minAmountOut ); bytes memory result = ISmartVault(smartVault).execute(connector, connectorData); (address tokenOut, uint256 amountOut) = abi.decode(result, (address, uint256)); _afterERC4626Exiter(erc4626, amount, tokenOut, amountOut); } /** * @dev Before ERC4626 exiter hook */ function _beforeERC4626Exiter(address token, uint256 amount) internal virtual { _beforeBaseERC4626Task(token, amount); } /** * @dev After ERC4626 exiter hook */ function _afterERC4626Exiter(address tokenIn, uint256 amountIn, address tokenOut, uint256 amountOut) internal virtual { _afterBaseERC4626Task(tokenIn, amountIn, tokenOut, amountOut); } }
// 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/v3-connectors/contracts/interfaces/erc4626/IERC4626Connector.sol'; import './BaseERC4626Task.sol'; import '../../interfaces/liquidity/erc4626/IERC4626Joiner.sol'; /** * @title ERC4626 joiner * @dev Task that extends the base ERC4626 task to join an ERC4626 vault */ contract ERC4626Joiner is IERC4626Joiner, BaseERC4626Task { // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('ERC4626_JOINER'); /** * @dev ERC4626 join config. Only used in the initializer. */ struct ERC4626JoinConfig { BaseERC4626Config baseERC4626Config; } /** * @dev Initializes a ERC4626 joiner * @param config ERC4626 join config */ function initialize(ERC4626JoinConfig memory config) external virtual initializer { __ERC4626Joiner_init(config); } /** * @dev Initializes the ERC4626 joiner. It does call upper contracts initializers. * @param config ERC4626 join config */ function __ERC4626Joiner_init(ERC4626JoinConfig memory config) internal onlyInitializing { __BaseERC4626Task_init(config.baseERC4626Config); __ERC4626Joiner_init_unchained(config); } /** * @dev Initializes the ERC4626 joiner. It does not call upper contracts initializers. * @param config ERC4626 join config */ function __ERC4626Joiner_init_unchained(ERC4626JoinConfig memory config) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Executes the ERC4626 joiner task * @param token Address of the token to be joined with * @param amount Amount of assets to be joined with * @param erc4626 Address of the ERC4626 to be joined * @param minAmountOut Minimum amount of shares willing to receive */ function call(address token, uint256 amount, address erc4626, uint256 minAmountOut) external override authP(authParams(token, amount, erc4626, minAmountOut)) { if (amount == 0) amount = getTaskAmount(token); _beforeERC4626Joiner(token, amount, erc4626); bytes memory connectorData = abi.encodeWithSelector( IERC4626Connector.join.selector, erc4626, token, amount, minAmountOut ); bytes memory result = ISmartVault(smartVault).execute(connector, connectorData); (address tokenOut, uint256 amountOut) = abi.decode(result, (address, uint256)); _afterERC4626Joiner(token, amount, tokenOut, amountOut); } /** * @dev Before ERC4626 joiner hook */ function _beforeERC4626Joiner(address token, uint256 amount, address erc4626) internal virtual { _beforeBaseERC4626Task(token, amount); if (erc4626 == address(0)) revert TaskERC4626Zero(); } /** * @dev After ERC4626 joiner hook */ function _afterERC4626Joiner(address tokenIn, uint256 amountIn, address tokenOut, uint256 amountOut) internal virtual { _afterBaseERC4626Task(tokenIn, amountIn, tokenOut, amountOut); } }
// 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/v3-helpers/contracts/utils/ERC20Helpers.sol'; import '../Task.sol'; import '../interfaces/primitives/ICollector.sol'; /** * @title Collector * @dev Task that offers a source address where funds can be pulled from */ contract Collector is ICollector, Task { // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('COLLECTOR'); // Address from where the tokens will be pulled address internal _tokensSource; /** * @dev Collect config. Only used in the initializer. */ struct CollectConfig { address tokensSource; TaskConfig taskConfig; } /** * @dev Initializes the collector * @param config Collect config */ function initialize(CollectConfig memory config) external virtual initializer { __Collector_init(config); } /** * @dev Initializes the collector. It does call upper contracts initializers. * @param config Collect config */ function __Collector_init(CollectConfig memory config) internal onlyInitializing { __Task_init(config.taskConfig); __Collector_init_unchained(config); } /** * @dev Initializes the collector. It does not call upper contracts initializers. * @param config Collect config */ function __Collector_init_unchained(CollectConfig memory config) internal onlyInitializing { _setTokensSource(config.tokensSource); } /** * @dev Tells the address from where the token amounts to execute this task are fetched */ function getTokensSource() public view virtual override(IBaseTask, BaseTask) returns (address) { return _tokensSource; } /** * @dev Tells the balance of the depositor for a given token * @param token Address of the token being queried */ function getTaskAmount(address token) public view virtual override(IBaseTask, BaseTask) returns (uint256) { return ERC20Helpers.balanceOf(token, getTokensSource()); } /** * @dev Sets the tokens source address. Sender must be authorized. * @param tokensSource Address of the tokens source to be set */ function setTokensSource(address tokensSource) external override authP(authParams(tokensSource)) { _setTokensSource(tokensSource); } /** * @dev Execute Collector */ function call(address token, uint256 amount) external override authP(authParams(token, amount)) { if (amount == 0) amount = getTaskAmount(token); _beforeCollector(token, amount); ISmartVault(smartVault).collect(token, _tokensSource, amount); _afterCollector(token, amount); } /** * @dev Before collector hook */ function _beforeCollector(address token, uint256 amount) internal virtual { _beforeTask(token, amount); if (token == address(0)) revert TaskTokenZero(); if (amount == 0) revert TaskAmountZero(); } /** * @dev After collector hook */ function _afterCollector(address token, uint256 amount) internal virtual { _increaseBalanceConnector(token, amount); _afterTask(token, amount); } /** * @dev Sets the balance connectors. Previous balance connector must be unset. * @param previous Balance connector id of the previous task in the workflow * @param next Balance connector id of the next task in the workflow */ function _setBalanceConnectors(bytes32 previous, bytes32 next) internal virtual override { if (previous != bytes32(0)) revert TaskPreviousConnectorNotZero(previous); super._setBalanceConnectors(previous, next); } /** * @dev Sets the source address * @param tokensSource Address of the tokens source to be set */ function _setTokensSource(address tokensSource) internal virtual { if (tokensSource == address(0)) revert TaskTokensSourceZero(); _tokensSource = tokensSource; emit TokensSourceSet(tokensSource); } }
// 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/v3-helpers/contracts/utils/ERC20Helpers.sol'; import '../Task.sol'; import '../interfaces/primitives/IHandleOver.sol'; /** * @title Hand over task * @dev Task that simply moves tokens from one balance connector to the other */ contract HandleOver is IHandleOver, Task { // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('HANDLE_OVER'); /** * @dev Hand over config. Only used in the initializer. */ struct HandleOverConfig { TaskConfig taskConfig; } /** * @dev Initializes the hand over task * @param config Hand over config */ function initialize(HandleOverConfig memory config) external virtual initializer { __HandleOver_init(config); } /** * @dev Initializes the hand over task. It does call upper contracts initializers. * @param config Hand over config */ function __HandleOver_init(HandleOverConfig memory config) internal onlyInitializing { __Task_init(config.taskConfig); __HandleOver_init_unchained(config); } /** * @dev Initializes the hand over task. It does not call upper contracts initializers. * @param config Hand over config */ function __HandleOver_init_unchained(HandleOverConfig memory config) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Execute the hand over taks */ function call(address token, uint256 amount) external override authP(authParams(token, amount)) { if (amount == 0) amount = getTaskAmount(token); _beforeHandleOver(token, amount); _afterHandleOver(token, amount); } /** * @dev Before hand over task hook */ function _beforeHandleOver(address token, uint256 amount) internal virtual { _beforeTask(token, amount); if (token == address(0)) revert TaskTokenZero(); if (amount == 0) revert TaskAmountZero(); } /** * @dev After hand over task hook */ function _afterHandleOver(address token, uint256 amount) internal virtual { _increaseBalanceConnector(token, amount); _afterTask(token, amount); } /** * @dev Sets the balance connectors. Both balance connector must be set. * @param previous Balance connector id of the previous task in the workflow * @param next Balance connector id of the next task in the workflow */ function _setBalanceConnectors(bytes32 previous, bytes32 next) internal virtual override { if (previous == bytes32(0)) revert TaskConnectorZero(previous); if (next == bytes32(0)) revert TaskConnectorZero(next); super._setBalanceConnectors(previous, next); } }
// 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 '../Task.sol'; import '../interfaces/primitives/IUnwrapper.sol'; /** * @title Unwrapper * @dev Task that offers facilities to unwrap wrapped native tokens */ contract Unwrapper is IUnwrapper, Task { // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('UNWRAPPER'); /** * @dev Unwrap config. Only used in the initializer. * @param taskConfig Task config params */ struct UnwrapConfig { TaskConfig taskConfig; } /** * @dev Initializes the unwrapper * @param config Unwrap config */ function initialize(UnwrapConfig memory config) external virtual initializer { __Unwrapper_init(config); } /** * @dev Initializes the unwrapper. It does call upper contracts initializers. * @param config Unwrap config */ function __Unwrapper_init(UnwrapConfig memory config) internal onlyInitializing { __Task_init(config.taskConfig); __Unwrapper_init_unchained(config); } /** * @dev Initializes the unwrapper. It does not call upper contracts initializers. * @param config Unwrap config */ function __Unwrapper_init_unchained(UnwrapConfig memory config) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Execute Unwrapper */ function call(address token, uint256 amount) external override authP(authParams(token, amount)) { if (amount == 0) amount = getTaskAmount(token); _beforeUnwrapper(token, amount); ISmartVault(smartVault).unwrap(amount); _afterUnwrapper(token, amount); } /** * @dev Before unwrapper hook */ function _beforeUnwrapper(address token, uint256 amount) internal virtual { _beforeTask(token, amount); if (token != _wrappedNativeToken()) revert TaskTokenNotWrapped(); if (amount == 0) revert TaskAmountZero(); } /** * @dev After unwrapper hook */ function _afterUnwrapper(address token, uint256 amount) internal virtual { _increaseBalanceConnector(Denominations.NATIVE_TOKEN, amount); _afterTask(token, amount); } }
// 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 '../Task.sol'; import '../interfaces/primitives/IWithdrawer.sol'; /** * @title Withdrawer * @dev Task that offers a recipient address where funds can be withdrawn */ contract Withdrawer is IWithdrawer, Task { // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('WITHDRAWER'); // Address where tokens will be transferred to address public override recipient; /** * @dev Withdraw config. Only used in the initializer. */ struct WithdrawConfig { address recipient; TaskConfig taskConfig; } /** * @dev Initializes the withdrawer * @param config Withdraw config */ function initialize(WithdrawConfig memory config) external virtual initializer { __Withdrawer_init(config); } /** * @dev Initializes the withdrawer. It does call upper contracts initializers. * @param config Withdraw config */ function __Withdrawer_init(WithdrawConfig memory config) internal onlyInitializing { __Task_init(config.taskConfig); __Withdrawer_init_unchained(config); } /** * @dev Initializes the withdrawer. It does not call upper contracts initializers. * @param config Withdraw config */ function __Withdrawer_init_unchained(WithdrawConfig memory config) internal onlyInitializing { _setRecipient(config.recipient); } /** * @dev Sets the recipient address. Sender must be authorized. * @param newRecipient Address of the new recipient to be set */ function setRecipient(address newRecipient) external override authP(authParams(newRecipient)) { _setRecipient(newRecipient); } /** * @dev Executes the Withdrawer */ function call(address token, uint256 amount) external override authP(authParams(token, amount)) { if (amount == 0) amount = getTaskAmount(token); _beforeWithdrawer(token, amount); ISmartVault(smartVault).withdraw(token, recipient, amount); _afterWithdrawer(token, amount); } /** * @dev Before withdrawer hook */ function _beforeWithdrawer(address token, uint256 amount) internal virtual { _beforeTask(token, amount); if (token == address(0)) revert TaskTokenZero(); if (amount == 0) revert TaskAmountZero(); } /** * @dev After withdrawer hook */ function _afterWithdrawer(address token, uint256 amount) internal virtual { _afterTask(token, amount); } /** * @dev Sets the recipient address * @param newRecipient Address of the new recipient to be set */ function _setRecipient(address newRecipient) internal { if (newRecipient == address(0)) revert TaskRecipientZero(); if (newRecipient == smartVault) revert TaskRecipientEqualsSmartVault(newRecipient); recipient = newRecipient; emit RecipientSet(newRecipient); } /** * @dev Sets the balance connectors. Next balance connector must be unset. * @param previous Balance connector id of the previous task in the workflow * @param next Balance connector id of the next task in the workflow */ function _setBalanceConnectors(bytes32 previous, bytes32 next) internal virtual override { if (next != bytes32(0)) revert TaskNextConnectorNotZero(next); super._setBalanceConnectors(previous, next); } }
// 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/v3-helpers/contracts/utils/Denominations.sol'; import '../Task.sol'; import '../interfaces/primitives/IWrapper.sol'; /** * @title Wrapper * @dev Task that offers facilities to wrap native tokens */ contract Wrapper is IWrapper, Task { // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('WRAPPER'); /** * @dev Wrap config. Only used in the initializer. */ struct WrapConfig { TaskConfig taskConfig; } /** * @dev Initializes the wrapper * @param config Wrap config */ function initialize(WrapConfig memory config) external virtual initializer { __Wrapper_init(config); } /** * @dev Initializes the wrapper. It does call upper contracts initializers. * @param config Wrap config */ function __Wrapper_init(WrapConfig memory config) internal onlyInitializing { __Task_init(config.taskConfig); __Wrapper_init_unchained(config); } /** * @dev Initializes the wrapper. It does not call upper contracts initializers. * @param config Wrap config */ function __Wrapper_init_unchained(WrapConfig memory config) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Execute Wrapper */ function call(address token, uint256 amount) external override authP(authParams(token, amount)) { if (amount == 0) amount = getTaskAmount(token); _beforeWrapper(token, amount); ISmartVault(smartVault).wrap(amount); _afterWrapper(token, amount); } /** * @dev Before wrapper hook */ function _beforeWrapper(address token, uint256 amount) internal virtual { _beforeTask(token, amount); if (token != Denominations.NATIVE_TOKEN) revert TaskTokenNotNative(); if (amount == 0) revert TaskAmountZero(); } /** * @dev After wrapper hook */ function _afterWrapper(address token, uint256 amount) internal virtual { _increaseBalanceConnector(_wrappedNativeToken(), amount); _afterTask(token, amount); } }
// 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/v3-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v3-relayer/contracts/interfaces/IRelayer.sol'; import '../Task.sol'; import '../interfaces/relayer/IBaseRelayerFundTask.sol'; /** * @title Base relayer fund task * @dev Task that offers the basic components for more detailed relayer fund tasks */ abstract contract BaseRelayerFundTask is IBaseRelayerFundTask, Task { using FixedPoint for uint256; // Reference to the contract to be funded address public override relayer; /** * @dev Base relayer fund config. Only used in the initializer. */ struct BaseRelayerFundConfig { address relayer; TaskConfig taskConfig; } /** * @dev Initializes the base relayer fund task. It does call upper contracts initializers. * @param config Base relayer fund config */ function __BaseRelayerFundTask_init(BaseRelayerFundConfig memory config) internal onlyInitializing { __Task_init(config.taskConfig); __BaseRelayerFundTask_init_unchained(config); } /** * @dev Initializes the base relayer fund task. It does not call upper contracts initializers. * @param config Base relayer fund config */ function __BaseRelayerFundTask_init_unchained(BaseRelayerFundConfig memory config) internal onlyInitializing { _setRelayer(config.relayer); } /** * @dev Tells the amount in `token` to be paid to the relayer * @param token Address of the token to be used to pay the relayer */ function getTaskAmount(address token) public view virtual override(IBaseTask, BaseTask) returns (uint256) { Threshold memory threshold = _getTokenThreshold(token); if (threshold.token == address(0)) return 0; uint256 depositedThresholdToken = _getDepositedInThresholdToken(threshold.token); if (depositedThresholdToken >= threshold.min) return 0; uint256 usedQuotaThresholdToken = _getUsedQuotaInThresholdToken(threshold.token); uint256 diff = threshold.max - depositedThresholdToken + usedQuotaThresholdToken; return (token == threshold.token) ? diff : diff.mulUp(_getPrice(threshold.token, token)); } /** * @dev Sets the relayer * @param newRelayer Address of the relayer to be set */ function setRelayer(address newRelayer) external override authP(authParams(newRelayer)) { _setRelayer(newRelayer); } /** * @dev Before token threshold task hook */ function _beforeTokenThresholdTask(address token, uint256 amount) internal virtual override { Threshold memory threshold = _getTokenThreshold(token); if (threshold.token == address(0)) revert TaskTokenThresholdNotSet(token); uint256 amountInThresholdToken = amount.mulUp(_getPrice(token, threshold.token)); uint256 depositedInThresholdToken = _getDepositedInThresholdToken(threshold.token); bool isCurrentBalanceAboveMin = depositedInThresholdToken >= threshold.min; if (isCurrentBalanceAboveMin) revert TaskDepositAboveMinThreshold(depositedInThresholdToken, threshold.min); uint256 usedQuotaInThresholdToken = _getUsedQuotaInThresholdToken(threshold.token); bool coversUsedQuota = amountInThresholdToken > usedQuotaInThresholdToken; if (!coversUsedQuota) revert TaskDepositBelowUsedQuota(amountInThresholdToken, usedQuotaInThresholdToken); uint256 balanceAfterDeposit = amountInThresholdToken + depositedInThresholdToken - usedQuotaInThresholdToken; bool isNewBalanceBelowMin = balanceAfterDeposit < threshold.min; if (isNewBalanceBelowMin) revert TaskNewDepositBelowMinThreshold(balanceAfterDeposit, threshold.min); bool isNewBalanceAboveMax = balanceAfterDeposit > threshold.max; if (isNewBalanceAboveMax) revert TaskNewDepositAboveMaxThreshold(balanceAfterDeposit, threshold.max); } /** * @dev Tells the deposited balance in the relayer expressed in another token */ function _getDepositedInThresholdToken(address token) internal view returns (uint256) { // Relayer balance is expressed in ETH uint256 depositedNativeToken = IRelayer(relayer).getSmartVaultBalance(smartVault); return depositedNativeToken.mulUp(_getPrice(_wrappedNativeToken(), token)); } /** * @dev Tells the used quota in the relayer expressed in another token */ function _getUsedQuotaInThresholdToken(address token) internal view returns (uint256) { // Relayer used quota is expressed in ETH uint256 usedQuotaNativeToken = IRelayer(relayer).getSmartVaultUsedQuota(smartVault); return usedQuotaNativeToken.mulUp(_getPrice(_wrappedNativeToken(), token)); } /** * @dev Sets the relayer * @param newRelayer Address of the relayer to be set */ function _setRelayer(address newRelayer) internal { if (newRelayer == address(0)) revert TaskRelayerZero(); relayer = newRelayer; emit RelayerSet(newRelayer); } }
// 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 '../primitives/Collector.sol'; import './BaseRelayerFundTask.sol'; /** * @title Collector relayer funder * @dev Task used to convert funds in order to pay relayers using an collector */ contract CollectorRelayerFunder is BaseRelayerFundTask, Collector { /** * @dev Disables the default collector initializer */ function initialize(CollectConfig memory) external pure override { revert TaskInitializerDisabled(); } /** * @dev Initializes the collector relayer funder * @param config Collect config * @param relayer Relayer address */ function initializeCollectorRelayerFunder(CollectConfig memory config, address relayer) external virtual initializer { __CollectorRelayerFunder_init(config, relayer); } /** * @dev Initializes the collector relayer funder. It does call upper contracts initializers. * @param config Collect config * @param relayer Relayer address */ function __CollectorRelayerFunder_init(CollectConfig memory config, address relayer) internal onlyInitializing { __Collector_init(config); __BaseRelayerFundTask_init_unchained(BaseRelayerFundConfig(relayer, config.taskConfig)); __CollectorRelayerFunder_init_unchained(config, relayer); } /** * @dev Initializes the collector relayer funder. It does not call upper contracts initializers. * @param config Collect config * @param relayer Relayer address */ function __CollectorRelayerFunder_init_unchained(CollectConfig memory config, address relayer) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Tells the address from where the token amounts to execute this task are fetched */ function getTokensSource() public view override(Collector, IBaseTask, BaseTask) returns (address) { return Collector.getTokensSource(); } /** * @dev Tells the `token` amount to be funded * @param token Address of the token to be used to fund the relayer */ function getTaskAmount(address token) public view override(BaseRelayerFundTask, Collector) returns (uint256) { return BaseRelayerFundTask.getTaskAmount(token); } /** * @dev Before token threshold task hook */ function _beforeTokenThresholdTask(address token, uint256 amount) internal override(BaseRelayerFundTask, TokenThresholdTask) { BaseRelayerFundTask._beforeTokenThresholdTask(token, amount); } /** * @dev Sets the balance connectors. Previous balance connector must be unset. * @param previous Balance connector id of the previous task in the workflow * @param next Balance connector id of the next task in the workflow */ function _setBalanceConnectors(bytes32 previous, bytes32 next) internal override(Collector, BaseTask) { Collector._setBalanceConnectors(previous, next); } }
// 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 './BaseRelayerFundTask.sol'; import '../swap/OneInchV5Swapper.sol'; /** * @title 1inch v5 relayer funder * @dev Task used to convert funds in order to pay relayers using a 1inch v5 swapper */ contract OneInchV5RelayerFunder is BaseRelayerFundTask, OneInchV5Swapper { /** * @dev Disables the default 1inch v5 swapper initializer */ function initialize(OneInchV5SwapConfig memory) external pure override { revert TaskInitializerDisabled(); } /** * @dev Initializes the 1inch v5 relayer funder * @param config 1inch v5 swap config * @param relayer Relayer address */ function initializeOneInchV5RelayerFunder(OneInchV5SwapConfig memory config, address relayer) external virtual initializer { __OneInchV5RelayerFunder_init(config, relayer); } /** * @dev Initializes the 1inch v5 relayer funder. It does call upper contracts initializers. * @param config 1inch v5 swap config * @param relayer Relayer address */ function __OneInchV5RelayerFunder_init(OneInchV5SwapConfig memory config, address relayer) internal onlyInitializing { __OneInchV5Swapper_init(config); __BaseRelayerFundTask_init_unchained(BaseRelayerFundConfig(relayer, config.baseSwapConfig.taskConfig)); __OneInchV5RelayerFunder_init_unchained(config, relayer); } /** * @dev Initializes the 1inch v5 relayer funder. It does not call upper contracts initializers. * @param config Unwrap config * @param relayer Relayer address */ function __OneInchV5RelayerFunder_init_unchained(OneInchV5SwapConfig memory config, address relayer) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Tells the amount in `token` to be funded * @param token Address of the token to be used for funding */ function getTaskAmount(address token) public view override(BaseRelayerFundTask, IBaseTask, BaseTask) returns (uint256) { return BaseRelayerFundTask.getTaskAmount(token); } /** * @dev Before token threshold task hook */ function _beforeTokenThresholdTask(address token, uint256 amount) internal override(BaseRelayerFundTask, TokenThresholdTask) { BaseRelayerFundTask._beforeTokenThresholdTask(token, amount); } }
// 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/v3-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v3-relayer/contracts/interfaces/IRelayer.sol'; import '../Task.sol'; import '../interfaces/relayer/IRelayerDepositor.sol'; /** * @title Relayer depositor * @dev Task that offers facilities to deposit balance for Mimic relayers */ contract RelayerDepositor is IRelayerDepositor, Task { using FixedPoint for uint256; // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('RELAYER_DEPOSITOR'); // Reference to the contract to be funded address public override relayer; /** * @dev Initializes the relayer depositor * @param config Task config * @param _relayer Relayer address */ function initialize(TaskConfig memory config, address _relayer) external virtual initializer { __RelayerDepositor_init(config, _relayer); } /** * @dev Initializes the relayer depositor. It does call upper contracts initializers. * @param config Task config * @param _relayer Relayer address */ function __RelayerDepositor_init(TaskConfig memory config, address _relayer) internal onlyInitializing { __Task_init(config); __RelayerDepositor_init_unchained(config, _relayer); } /** * @dev Initializes the relayer depositor. It does not call upper contracts initializers. * @param _relayer Relayer address */ function __RelayerDepositor_init_unchained(TaskConfig memory, address _relayer) internal onlyInitializing { _setRelayer(_relayer); } /** * @dev Sets the relayer * @param newRelayer Address of the relayer to be set */ function setRelayer(address newRelayer) external override authP(authParams(newRelayer)) { _setRelayer(newRelayer); } /** * @dev Executes the relayer depositor task */ function call(address token, uint256 amount) external override authP(authParams(token, amount)) { if (amount == 0) amount = getTaskAmount(token); _beforeRelayerDepositor(token, amount); bytes memory relayerData = abi.encodeWithSelector(IRelayer.deposit.selector, smartVault, amount); // solhint-disable-next-line avoid-low-level-calls ISmartVault(smartVault).call(relayer, relayerData, amount); _afterRelayerDepositor(token, amount); } /** * @dev Before relayer depositor hook */ function _beforeRelayerDepositor(address token, uint256 amount) internal virtual { _beforeTask(token, amount); if (amount == 0) revert TaskAmountZero(); } /** * @dev After relayer depositor hook */ function _afterRelayerDepositor(address token, uint256 amount) internal virtual { _afterTask(token, amount); } /** * @dev Sets the relayer * @param newRelayer Address of the relayer to be set */ function _setRelayer(address newRelayer) internal { if (newRelayer == address(0)) revert TaskRelayerZero(); relayer = newRelayer; emit RelayerSet(newRelayer); } }
// 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 './BaseRelayerFundTask.sol'; import '../primitives/Unwrapper.sol'; /** * @title Unwrapper relayer funder * @dev Task used to convert funds in order to pay relayers using an unwrapper */ contract UnwrapperRelayerFunder is BaseRelayerFundTask, Unwrapper { /** * @dev Disables the default unwrapper initializer */ function initialize(UnwrapConfig memory) external pure override { revert TaskInitializerDisabled(); } /** * @dev Initializes the unwrapper relayer funder * @param config Unwrap config * @param relayer Relayer address */ function initializeUnwrapperRelayerFunder(UnwrapConfig memory config, address relayer) external virtual initializer { __UnwrapperRelayerFunder_init(config, relayer); } /** * @dev Initializes the unwrapper relayer funder. It does call upper contracts initializers. * @param config Unwrap config * @param relayer Relayer address */ function __UnwrapperRelayerFunder_init(UnwrapConfig memory config, address relayer) internal onlyInitializing { __Unwrapper_init(config); __BaseRelayerFundTask_init_unchained(BaseRelayerFundConfig(relayer, config.taskConfig)); __UnwrapperRelayerFunder_init_unchained(config, relayer); } /** * @dev Initializes the unwrapper relayer funder. It does not call upper contracts initializers. * @param config Unwrap config * @param relayer Relayer address */ function __UnwrapperRelayerFunder_init_unchained(UnwrapConfig memory config, address relayer) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Tells the `token` amount to be funded * @param token Address of the token to be used to fund the relayer */ function getTaskAmount(address token) public view override(BaseRelayerFundTask, IBaseTask, BaseTask) returns (uint256) { return BaseRelayerFundTask.getTaskAmount(token); } /** * @dev Before token threshold task hook */ function _beforeTokenThresholdTask(address token, uint256 amount) internal override(BaseRelayerFundTask, TokenThresholdTask) { BaseRelayerFundTask._beforeTokenThresholdTask(token, amount); } }
// 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/v3-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v3-helpers/contracts/utils/BytesHelpers.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/balancer/IBalancerV2Vault.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/balancer/IBalancerV2SwapConnector.sol'; import './BalancerV2BptSwapper.sol'; import '../interfaces/liquidity/balancer/IBalancerBoostedPool.sol'; /** * @title Balancer v2 boosted swapper task * @dev Task that extends the Balancer v2 BPT swapper task specially for boosted pools */ contract BalancerV2BoostedSwapper is BalancerV2BptSwapper { /** * @dev Tells the token out that should be used for a token. In case there is no token out defined for the * requested token, it will use one of the underlying pool tokens. */ function getTokenOut(address token) public view virtual override(IBaseSwapTask, BaseSwapTask) returns (address) { address tokenOut = BaseSwapTask.getTokenOut(token); if (tokenOut != address(0)) return tokenOut; bytes32 poolId = IBalancerBoostedPool(token).getPoolId(); uint256 bptIndex = IBalancerBoostedPool(token).getBptIndex(); address balancerV2Vault = IBalancerV2SwapConnector(connector).balancerV2Vault(); (IERC20[] memory tokens, , ) = IBalancerV2Vault(balancerV2Vault).getPoolTokens(poolId); return address(bptIndex == 0 ? tokens[1] : tokens[0]); } }
// 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/v3-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v3-helpers/contracts/utils/BytesHelpers.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/balancer/IBalancerV2SwapConnector.sol'; import './BaseSwapTask.sol'; import '../interfaces/swap/IBalancerV2BptSwapper.sol'; import '../interfaces/liquidity/balancer/IBalancerPool.sol'; /** * @title Balancer v2 BPT swapper task * @dev Task that extends the swapper task to use Balancer v2 */ contract BalancerV2BptSwapper is IBalancerV2BptSwapper, BaseSwapTask { using FixedPoint for uint256; using BytesHelpers for bytes; // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('BALANCER_V2_BPT_SWAPPER'); /** * @dev Balancer v2 BPT swap config. Only used in the initializer. */ struct BalancerV2BptSwapConfig { BaseSwapConfig baseSwapConfig; } /** * @dev Initializes the Balancer v2 BPT swapper * @param config Balancer v2 BPT swap config */ function initialize(BalancerV2BptSwapConfig memory config) external initializer { __BalancerV2BptSwapper_init(config); } /** * @dev Initializes the Balancer v2 BPT swapper. It does call upper contracts. * @param config Balancer v2 BPT swap config */ function __BalancerV2BptSwapper_init(BalancerV2BptSwapConfig memory config) internal onlyInitializing { __BaseSwapTask_init(config.baseSwapConfig); __BalancerV2BptSwapper_init_unchained(config); } /** * @dev Initializes the Balancer v2 BPT swapper. It does not call upper contracts. * @param config Balancer v2 BPT swap config */ function __BalancerV2BptSwapper_init_unchained(BalancerV2BptSwapConfig memory config) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Executes the Balancer v2 BPT swapper task */ function call(address tokenIn, uint256 amountIn, uint256 slippage) external override authP(authParams(tokenIn, amountIn, slippage)) { if (amountIn == 0) amountIn = getTaskAmount(tokenIn); _beforeBalancerV2BptSwapper(tokenIn, amountIn, slippage); address tokenOut = getTokenOut(tokenIn); uint256 price = _getPrice(tokenIn, tokenOut); uint256 minAmountOut = amountIn.mulUp(price).mulUp(FixedPoint.ONE - slippage); bytes memory connectorData = abi.encodeWithSelector( IBalancerV2SwapConnector.execute.selector, tokenIn, tokenOut, amountIn, minAmountOut, IBalancerPool(tokenIn).getPoolId(), new bytes32[](0), new address[](0) ); bytes memory result = ISmartVault(smartVault).execute(connector, connectorData); _afterBalancerV2BptSwapper(tokenIn, amountIn, slippage, tokenOut, result.toUint256()); } /** * @dev Before Balancer v2 BPT swapper task */ function _beforeBalancerV2BptSwapper(address token, uint256 amount, uint256 slippage) internal virtual { _beforeBaseSwapTask(token, amount, slippage); } /** * @dev After Balancer v2 BPT swapper hook */ function _afterBalancerV2BptSwapper( address tokenIn, uint256 amountIn, uint256 slippage, address tokenOut, uint256 amountOut ) internal virtual { _afterBaseSwapTask(tokenIn, amountIn, slippage, tokenOut, amountOut); } }
// 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/v3-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v3-helpers/contracts/utils/BytesHelpers.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/balancer/IBalancerV2SwapConnector.sol'; import './BalancerV2BptSwapper.sol'; import '../interfaces/liquidity/balancer/IBalancerLinearPool.sol'; /** * @title Balancer v2 linear swapper task * @dev Task that extends the Balancer v2 BPT swapper task specially for linear pools */ contract BalancerV2LinearSwapper is BalancerV2BptSwapper { /** * @dev Tells the token out that should be used for a token. In case there is no token out defined for the * requested token, it will use the linear pool main token. */ function getTokenOut(address token) public view virtual override(IBaseSwapTask, BaseSwapTask) returns (address) { address tokenOut = BaseSwapTask.getTokenOut(token); if (tokenOut != address(0)) return tokenOut; return IBalancerLinearPool(token).getMainToken(); } }
// 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/v3-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v3-helpers/contracts/utils/Denominations.sol'; import '../Task.sol'; import '../interfaces/swap/IBaseSwapTask.sol'; /** * @title Base swap task * @dev Task that offers the basic components for more detailed swap tasks */ abstract contract BaseSwapTask is IBaseSwapTask, Task { using FixedPoint for uint256; // Connector address address public override connector; // Default token out address public override defaultTokenOut; // Default maximum slippage in fixed point uint256 public override defaultMaxSlippage; // Token out per token mapping (address => address) public override customTokenOut; // Maximum slippage per token address mapping (address => uint256) public override customMaxSlippage; /** * @dev Custom token out config. Only used in the initializer. */ struct CustomTokenOut { address token; address tokenOut; } /** * @dev Custom max slippage config. Only used in the initializer. */ struct CustomMaxSlippage { address token; uint256 maxSlippage; } /** * @dev Base swap config. Only used in the initializer. */ struct BaseSwapConfig { address connector; address tokenOut; uint256 maxSlippage; CustomTokenOut[] customTokensOut; CustomMaxSlippage[] customMaxSlippages; TaskConfig taskConfig; } /** * @dev Initializes the base swap task. It does call upper contracts initializers. * @param config Base swap config */ function __BaseSwapTask_init(BaseSwapConfig memory config) internal onlyInitializing { __Task_init(config.taskConfig); __BaseSwapTask_init_unchained(config); } /** * @dev Initializes the base swap task. It does not call upper contracts initializers. * @param config Base swap config */ function __BaseSwapTask_init_unchained(BaseSwapConfig memory config) internal onlyInitializing { _setConnector(config.connector); _setDefaultTokenOut(config.tokenOut); _setDefaultMaxSlippage(config.maxSlippage); for (uint256 i = 0; i < config.customTokensOut.length; i++) { _setCustomTokenOut(config.customTokensOut[i].token, config.customTokensOut[i].tokenOut); } for (uint256 i = 0; i < config.customMaxSlippages.length; i++) { _setCustomMaxSlippage(config.customMaxSlippages[i].token, config.customMaxSlippages[i].maxSlippage); } } /** * @dev Tells the token out that should be used for a token */ function getTokenOut(address token) public view virtual override returns (address) { address tokenOut = customTokenOut[token]; return tokenOut == address(0) ? defaultTokenOut : tokenOut; } /** * @dev Tells the max slippage that should be used for a token */ function getMaxSlippage(address token) public view virtual override returns (uint256) { uint256 maxSlippage = customMaxSlippage[token]; return maxSlippage == 0 ? defaultMaxSlippage : maxSlippage; } /** * @dev Sets a new connector * @param newConnector Address of the connector to be set */ function setConnector(address newConnector) external override authP(authParams(newConnector)) { _setConnector(newConnector); } /** * @dev Sets the default token out * @param tokenOut Address of the default token out to be set */ function setDefaultTokenOut(address tokenOut) external override authP(authParams(tokenOut)) { _setDefaultTokenOut(tokenOut); } /** * @dev Sets the default max slippage * @param maxSlippage Default max slippage to be set */ function setDefaultMaxSlippage(uint256 maxSlippage) external override authP(authParams(maxSlippage)) { _setDefaultMaxSlippage(maxSlippage); } /** * @dev Sets a custom token out * @param token Address of the token to set a custom token out for * @param tokenOut Address of the token out to be set */ function setCustomTokenOut(address token, address tokenOut) external override authP(authParams(token, tokenOut)) { _setCustomTokenOut(token, tokenOut); } /** * @dev Sets a custom max slippage * @param token Address of the token to set a custom max slippage for * @param maxSlippage Max slippage to be set */ function setCustomMaxSlippage(address token, uint256 maxSlippage) external override authP(authParams(token, maxSlippage)) { _setCustomMaxSlippage(token, maxSlippage); } /** * @dev Before base swap task hook */ function _beforeBaseSwapTask(address token, uint256 amount, uint256 slippage) internal virtual { _beforeTask(token, amount); if (token == address(0)) revert TaskTokenZero(); if (amount == 0) revert TaskAmountZero(); if (getTokenOut(token) == address(0)) revert TaskTokenOutNotSet(); uint256 maxSlippage = getMaxSlippage(token); if (slippage > maxSlippage) revert TaskSlippageAboveMax(slippage, maxSlippage); } /** * @dev After base swap task hook */ function _afterBaseSwapTask(address tokenIn, uint256 amountIn, uint256, address tokenOut, uint256 amountOut) internal virtual { _increaseBalanceConnector(tokenOut, amountOut); _afterTask(tokenIn, amountIn); } /** * @dev Sets a new connector * @param newConnector Address of the connector to be set */ function _setConnector(address newConnector) internal { if (newConnector == address(0)) revert TaskConnectorZero(); connector = newConnector; emit ConnectorSet(newConnector); } /** * @dev Sets the default token out * @param tokenOut Default token out to be set */ function _setDefaultTokenOut(address tokenOut) internal { defaultTokenOut = tokenOut; emit DefaultTokenOutSet(tokenOut); } /** * @dev Sets the default max slippage * @param maxSlippage Default max slippage to be set */ function _setDefaultMaxSlippage(uint256 maxSlippage) internal { if (maxSlippage > FixedPoint.ONE) revert TaskSlippageAboveOne(); defaultMaxSlippage = maxSlippage; emit DefaultMaxSlippageSet(maxSlippage); } /** * @dev Sets a custom token out for a token * @param token Address of the token to set the custom token out for * @param tokenOut Address of the token out to be set */ function _setCustomTokenOut(address token, address tokenOut) internal { if (token == address(0)) revert TaskTokenZero(); customTokenOut[token] = tokenOut; emit CustomTokenOutSet(token, tokenOut); } /** * @dev Sets a custom max slippage for a token * @param token Address of the token to set the custom max slippage for * @param maxSlippage Max slippage to be set */ function _setCustomMaxSlippage(address token, uint256 maxSlippage) internal { if (token == address(0)) revert TaskTokenZero(); if (maxSlippage > FixedPoint.ONE) revert TaskSlippageAboveOne(); customMaxSlippage[token] = maxSlippage; emit CustomMaxSlippageSet(token, maxSlippage); } }
// 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/v3-helpers/contracts/utils/BytesHelpers.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/hop/IHopL2Amm.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/hop/IHopSwapConnector.sol'; import './BaseSwapTask.sol'; import '../interfaces/swap/IHopL2Swapper.sol'; /** * @title Hop L2 swapper * @dev Task that extends the base swap task to use Hop */ contract HopL2Swapper is IHopL2Swapper, BaseSwapTask { using FixedPoint for uint256; using BytesHelpers for bytes; // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('HOP_L2_SWAPPER'); // List of AMMs per token mapping (address => address) public override tokenAmm; /** * @dev Token amm config. Only used in the initializer. */ struct TokenAmm { address token; address amm; } /** * @dev Hop L2 swap config. Only used in the initializer. */ struct HopL2SwapConfig { TokenAmm[] tokenAmms; BaseSwapConfig baseSwapConfig; } /** * @dev Initializes the Hop L2 swapper * @param config Hop L2 swap config */ function initialize(HopL2SwapConfig memory config) external virtual initializer { __HopL2Swapper_init(config); } /** * @dev Initializes the Hop L2 swapper. It does call upper contracts initializers. * @param config Hop L2 swap config */ function __HopL2Swapper_init(HopL2SwapConfig memory config) internal onlyInitializing { __BaseSwapTask_init(config.baseSwapConfig); __HopL2Swapper_init_unchained(config); } /** * @dev Initializes the Hop L2 swapper. It does not call upper contracts initializers. * @param config Hop L2 swap config */ function __HopL2Swapper_init_unchained(HopL2SwapConfig memory config) internal onlyInitializing { for (uint256 i = 0; i < config.tokenAmms.length; i++) { _setTokenAmm(config.tokenAmms[i].token, config.tokenAmms[i].amm); } } /** * @dev Sets an AMM for a hToken * @param hToken Address of the hToken to be set * @param amm AMM address to be set for the hToken */ function setTokenAmm(address hToken, address amm) external authP(authParams(hToken, amm)) { _setTokenAmm(hToken, amm); } /** * @dev Execution function */ function call(address hToken, uint256 amount, uint256 slippage) external override authP(authParams(hToken, amount, slippage)) { if (amount == 0) amount = getTaskAmount(hToken); _beforeHopL2Swapper(hToken, amount, slippage); address tokenOut = getTokenOut(hToken); address dexAddress = IHopL2Amm(tokenAmm[hToken]).exchangeAddress(); uint256 minAmountOut = amount.mulUp(FixedPoint.ONE - slippage); bytes memory connectorData = abi.encodeWithSelector( IHopSwapConnector.execute.selector, hToken, tokenOut, amount, minAmountOut, dexAddress ); bytes memory result = ISmartVault(smartVault).execute(connector, connectorData); _afterHopL2Swapper(hToken, amount, slippage, tokenOut, result.toUint256()); } /** * @dev Before Hop L2 swapper hook */ function _beforeHopL2Swapper(address token, uint256 amount, uint256 slippage) internal virtual { _beforeBaseSwapTask(token, amount, slippage); if (tokenAmm[token] == address(0)) revert TaskMissingHopTokenAmm(); } /** * @dev After Hop L2 swapper hook */ function _afterHopL2Swapper( address tokenIn, uint256 amountIn, uint256 slippage, address tokenOut, uint256 amountOut ) internal virtual { _afterBaseSwapTask(tokenIn, amountIn, slippage, tokenOut, amountOut); } /** * @dev Set an AMM for a Hop token * @param hToken Address of the hToken to set an AMM for * @param amm AMM to be set */ function _setTokenAmm(address hToken, address amm) internal { if (hToken == address(0)) revert TaskTokenZero(); if (amm != address(0) && hToken != IHopL2Amm(amm).hToken()) revert TaskHopTokenAmmMismatch(hToken, amm); tokenAmm[hToken] = amm; emit TokenAmmSet(hToken, amm); } }
// 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/v3-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v3-helpers/contracts/utils/BytesHelpers.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/1inch/IOneInchV5Connector.sol'; import './BaseSwapTask.sol'; import '../interfaces/swap/IOneInchV5Swapper.sol'; /** * @title 1inch v5 swapper * @dev Task that extends the base swap task to use 1inch v5 */ contract OneInchV5Swapper is IOneInchV5Swapper, BaseSwapTask { using FixedPoint for uint256; using BytesHelpers for bytes; // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('1INCH_V5_SWAPPER'); /** * @dev 1inch v5 swap config. Only used in the initializer. */ struct OneInchV5SwapConfig { BaseSwapConfig baseSwapConfig; } /** * @dev Initializes the 1inch v5 swapper * @param config 1inch v5 swap config */ function initialize(OneInchV5SwapConfig memory config) external virtual initializer { __OneInchV5Swapper_init(config); } /** * @dev Initializes the 1inch v5 swapper. It does call upper contracts initializers. * @param config 1inch v5 swap config */ function __OneInchV5Swapper_init(OneInchV5SwapConfig memory config) internal onlyInitializing { __BaseSwapTask_init(config.baseSwapConfig); __OneInchV5Swapper_init_unchained(config); } /** * @dev Initializes the 1inch v5 swapper. It does not call upper contracts initializers. * @param config 1inch v5 swap config */ function __OneInchV5Swapper_init_unchained(OneInchV5SwapConfig memory config) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Executes the 1inch V5 swapper task */ function call(address tokenIn, uint256 amountIn, uint256 slippage, bytes memory data) external override authP(authParams(tokenIn, amountIn, slippage)) { if (amountIn == 0) amountIn = getTaskAmount(tokenIn); _beforeOneInchV5Swapper(tokenIn, amountIn, slippage); address tokenOut = getTokenOut(tokenIn); uint256 price = _getPrice(tokenIn, tokenOut); uint256 minAmountOut = amountIn.mulUp(price).mulUp(FixedPoint.ONE - slippage); bytes memory connectorData = abi.encodeWithSelector( IOneInchV5Connector.execute.selector, tokenIn, tokenOut, amountIn, minAmountOut, data ); bytes memory result = ISmartVault(smartVault).execute(connector, connectorData); _afterOneInchV5Swapper(tokenIn, amountIn, slippage, tokenOut, result.toUint256()); } /** * @dev Before 1inch v5 swapper hook */ function _beforeOneInchV5Swapper(address token, uint256 amount, uint256 slippage) internal virtual { _beforeBaseSwapTask(token, amount, slippage); } /** * @dev After 1inch v5 swapper hook */ function _afterOneInchV5Swapper( address tokenIn, uint256 amountIn, uint256 slippage, address tokenOut, uint256 amountOut ) internal virtual { _afterBaseSwapTask(tokenIn, amountIn, slippage, tokenOut, amountOut); } }
// 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/cryptography/ECDSA.sol'; import '@mimic-fi/v3-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v3-helpers/contracts/utils/BytesHelpers.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/paraswap/IParaswapV5Connector.sol'; import './BaseSwapTask.sol'; import '../interfaces/swap/IParaswapV5Swapper.sol'; /** * @title Paraswap V5 swapper task * @dev Task that extends the swapper task to use Paraswap v5 */ contract ParaswapV5Swapper is IParaswapV5Swapper, BaseSwapTask { using FixedPoint for uint256; using BytesHelpers for bytes; // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('PARASWAP_V5_SWAPPER'); // Address of the Paraswap quote signer address public override quoteSigner; /** * @dev Paraswap v5 swap config. Only used in the initializer. */ struct ParaswapV5SwapConfig { address quoteSigner; BaseSwapConfig baseSwapConfig; } /** * @dev Initializes the Paraswap v5 swapper * @param config Paraswap v5 swap config */ function initialize(ParaswapV5SwapConfig memory config) external virtual initializer { __ParaswapV5Swapper_init(config); } /** * @dev Initializes the Paraswap v5 swapper. It does call upper contracts initializers. * @param config Paraswap v5 swap config */ function __ParaswapV5Swapper_init(ParaswapV5SwapConfig memory config) internal onlyInitializing { __BaseSwapTask_init(config.baseSwapConfig); __ParaswapV5Swapper_init_unchained(config); } /** * @dev Initializes the Paraswap v5 swapper. It does not call upper contracts initializers. * @param config Paraswap v5 swap config */ function __ParaswapV5Swapper_init_unchained(ParaswapV5SwapConfig memory config) internal onlyInitializing { _setQuoteSigner(config.quoteSigner); } /** * @dev Sets the quote signer address * @param newQuoteSigner Address of the new quote signer to be set */ function setQuoteSigner(address newQuoteSigner) external override authP(authParams(newQuoteSigner)) { _setQuoteSigner(newQuoteSigner); } /** * @dev Execute Paraswap v5 swapper task */ function call( address tokenIn, uint256 amountIn, uint256 minAmountOut, uint256 expectedAmountOut, uint256 deadline, bytes memory data, bytes memory sig ) external override authP(authParams(tokenIn, amountIn, minAmountOut, expectedAmountOut, deadline)) { if (amountIn == 0) amountIn = getTaskAmount(tokenIn); address tokenOut = getTokenOut(tokenIn); uint256 slippage = FixedPoint.ONE - minAmountOut.divUp(expectedAmountOut); _beforeParaswapV5Swapper( tokenIn, tokenOut, amountIn, slippage, minAmountOut, expectedAmountOut, deadline, data, sig ); bytes memory connectorData = abi.encodeWithSelector( IParaswapV5Connector.execute.selector, tokenIn, tokenOut, amountIn, minAmountOut, data ); bytes memory result = ISmartVault(smartVault).execute(connector, connectorData); _afterParaswapV5Swapper(tokenIn, amountIn, slippage, tokenOut, result.toUint256()); } /** * @dev Before Paraswap v5 swapper hook */ function _beforeParaswapV5Swapper( address tokenIn, address tokenOut, uint256 amountIn, uint256 slippage, uint256 minAmountOut, uint256 expectedAmountOut, uint256 deadline, bytes memory data, bytes memory sig ) internal virtual { _beforeBaseSwapTask(tokenIn, amountIn, slippage); bool isBuy = false; bytes32 message = keccak256( abi.encodePacked(tokenIn, tokenOut, isBuy, amountIn, minAmountOut, expectedAmountOut, deadline, data) ); address signer = ECDSA.recover(ECDSA.toEthSignedMessageHash(message), sig); if (signer != quoteSigner) revert TaskInvalidQuoteSigner(signer, quoteSigner); if (block.timestamp > deadline) revert TaskQuoteSignerPastDeadline(deadline, block.timestamp); } /** * @dev After Paraswap v5 swapper hook */ function _afterParaswapV5Swapper( address tokenIn, uint256 amountIn, uint256 slippage, address tokenOut, uint256 amountOut ) internal virtual { _afterBaseSwapTask(tokenIn, amountIn, slippage, tokenOut, amountOut); } /** * @dev Sets the quote signer address * @param newQuoteSigner Address of the new quote signer to be set */ function _setQuoteSigner(address newQuoteSigner) internal { if (newQuoteSigner == address(0)) revert TaskQuoteSignerZero(); quoteSigner = newQuoteSigner; emit QuoteSignerSet(newQuoteSigner); } }
// 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/v3-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v3-helpers/contracts/utils/BytesHelpers.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/uniswap/IUniswapV2Connector.sol'; import './BaseSwapTask.sol'; import '../interfaces/swap/IUniswapV2Swapper.sol'; /** * @title Uniswap v2 swapper * @dev Task that extends the base swap task to use Uniswap v2 */ contract UniswapV2Swapper is IUniswapV2Swapper, BaseSwapTask { using FixedPoint for uint256; using BytesHelpers for bytes; // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('UNISWAP_V2_SWAPPER'); /** * @dev Uniswap v2 swap config. Only used in the initializer. */ struct UniswapV2SwapConfig { BaseSwapConfig baseSwapConfig; } /** * @dev Initializes the Uniswap v2 swapper * @param config Uniswap v2 swap config */ function initialize(UniswapV2SwapConfig memory config) external initializer { __UniswapV2Swapper_init(config); } /** * @dev Initializes the Uniswap v2 swapper. It does call upper contracts. * @param config Uniswap v2 swap config */ function __UniswapV2Swapper_init(UniswapV2SwapConfig memory config) internal onlyInitializing { __BaseSwapTask_init(config.baseSwapConfig); __UniswapV2Swapper_init_unchained(config); } /** * @dev Initializes the Uniswap v2 swapper. It does not call upper contracts. * @param config Uniswap v2 swap config */ function __UniswapV2Swapper_init_unchained(UniswapV2SwapConfig memory config) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Executes the Uniswap v2 swapper task */ function call(address tokenIn, uint256 amountIn, uint256 slippage, address[] memory hopTokens) external override authP(authParams(tokenIn, amountIn, slippage)) { if (amountIn == 0) amountIn = getTaskAmount(tokenIn); _beforeUniswapV2Swapper(tokenIn, amountIn, slippage); address tokenOut = getTokenOut(tokenIn); uint256 price = _getPrice(tokenIn, tokenOut); uint256 minAmountOut = amountIn.mulUp(price).mulUp(FixedPoint.ONE - slippage); bytes memory connectorData = abi.encodeWithSelector( IUniswapV2Connector.execute.selector, tokenIn, tokenOut, amountIn, minAmountOut, hopTokens ); bytes memory result = ISmartVault(smartVault).execute(connector, connectorData); _afterUniswapV2Swapper(tokenIn, amountIn, slippage, tokenOut, result.toUint256()); } /** * @dev Before Uniswap v2 swapper hook */ function _beforeUniswapV2Swapper(address token, uint256 amount, uint256 slippage) internal virtual { _beforeBaseSwapTask(token, amount, slippage); } /** * @dev After Uniswap v2 swapper hook */ function _afterUniswapV2Swapper( address tokenIn, uint256 amountIn, uint256 slippage, address tokenOut, uint256 amountOut ) internal virtual { _afterBaseSwapTask(tokenIn, amountIn, slippage, tokenOut, amountOut); } }
// 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/v3-helpers/contracts/math/FixedPoint.sol'; import '@mimic-fi/v3-helpers/contracts/utils/BytesHelpers.sol'; import '@mimic-fi/v3-connectors/contracts/interfaces/uniswap/IUniswapV3Connector.sol'; import './BaseSwapTask.sol'; import '../interfaces/swap/IUniswapV3Swapper.sol'; /** * @title Uniswap v3 swapper task * @dev Task that extends the swapper task to use Uniswap v3 */ contract UniswapV3Swapper is IUniswapV3Swapper, BaseSwapTask { using FixedPoint for uint256; using BytesHelpers for bytes; // Execution type for relayers bytes32 public constant override EXECUTION_TYPE = keccak256('UNISWAP_V3_SWAPPER'); /** * @dev Uniswap v3 swap config. Only used in the initializer. */ struct UniswapV3SwapConfig { BaseSwapConfig baseSwapConfig; } /** * @dev Initializes the Uniswap v3 swapper * @param config Uniswap v3 swap config */ function initialize(UniswapV3SwapConfig memory config) external initializer { __UniswapV3Swapper_init(config); } /** * @dev Initializes the Uniswap V3 swapper. It does call upper contracts. * @param config Uniswap v3 swap config */ function __UniswapV3Swapper_init(UniswapV3SwapConfig memory config) internal onlyInitializing { __BaseSwapTask_init(config.baseSwapConfig); __UniswapV3Swapper_init_unchained(config); } /** * @dev Initializes the Uniswap V3 swapper. It does not call upper contracts. * @param config Uniswap v3 swap config */ function __UniswapV3Swapper_init_unchained(UniswapV3SwapConfig memory config) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Executes the Uniswap v3 swapper task */ function call( address tokenIn, uint256 amountIn, uint256 slippage, uint24 fee, address[] memory hopTokens, uint24[] memory hopFees ) external override authP(authParams(tokenIn, amountIn, slippage, fee)) { if (amountIn == 0) amountIn = getTaskAmount(tokenIn); _beforeUniswapV3Swapper(tokenIn, amountIn, slippage); address tokenOut = getTokenOut(tokenIn); uint256 price = _getPrice(tokenIn, tokenOut); uint256 minAmountOut = amountIn.mulUp(price).mulUp(FixedPoint.ONE - slippage); bytes memory connectorData = abi.encodeWithSelector( IUniswapV3Connector.execute.selector, tokenIn, tokenOut, amountIn, minAmountOut, fee, hopTokens, hopFees ); bytes memory result = ISmartVault(smartVault).execute(connector, connectorData); _afterUniswapV3Swapper(tokenIn, amountIn, slippage, tokenOut, result.toUint256()); } /** * @dev Before Uniswap v3 swapper task */ function _beforeUniswapV3Swapper(address token, uint256 amount, uint256 slippage) internal virtual { _beforeBaseSwapTask(token, amount, slippage); } /** * @dev After Uniswap v3 swapper hook */ function _afterUniswapV3Swapper( address tokenIn, uint256 amountIn, uint256 slippage, address tokenOut, uint256 amountOut ) internal virtual { _afterBaseSwapTask(tokenIn, amountIn, slippage, tokenOut, amountOut); } }
// 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 './interfaces/ITask.sol'; import './base/BaseTask.sol'; import './base/PausableTask.sol'; import './base/GasLimitedTask.sol'; import './base/TimeLockedTask.sol'; import './base/TokenIndexedTask.sol'; import './base/TokenThresholdTask.sol'; import './base/VolumeLimitedTask.sol'; /** * @title Task * @dev Shared components across all tasks */ abstract contract Task is ITask, BaseTask, PausableTask, GasLimitedTask, TimeLockedTask, TokenIndexedTask, TokenThresholdTask, VolumeLimitedTask { /** * @dev Task config. Only used in the initializer. */ struct TaskConfig { BaseConfig baseConfig; GasLimitConfig gasLimitConfig; TimeLockConfig timeLockConfig; TokenIndexConfig tokenIndexConfig; TokenThresholdConfig tokenThresholdConfig; VolumeLimitConfig volumeLimitConfig; } /** * @dev Initializes the task. It does call upper contracts initializers. * @param config Task config */ function __Task_init(TaskConfig memory config) internal onlyInitializing { __BaseTask_init(config.baseConfig); __PausableTask_init(); __GasLimitedTask_init(config.gasLimitConfig); __TimeLockedTask_init(config.timeLockConfig); __TokenIndexedTask_init(config.tokenIndexConfig); __TokenThresholdTask_init(config.tokenThresholdConfig); __VolumeLimitedTask_init(config.volumeLimitConfig); __Task_init_unchained(config); } /** * @dev Initializes the task. It does not call upper contracts initializers. * @param config Task config */ function __Task_init_unchained(TaskConfig memory config) internal onlyInitializing { // solhint-disable-previous-line no-empty-blocks } /** * @dev Fetches a base/quote price */ function _getPrice(address base, address quote) internal view override(BaseTask, GasLimitedTask, TokenThresholdTask, VolumeLimitedTask) returns (uint256) { return BaseTask._getPrice(base, quote); } /** * @dev Before task hook */ function _beforeTask(address token, uint256 amount) internal virtual { _beforeBaseTask(token, amount); _beforePausableTask(token, amount); _beforeGasLimitedTask(token, amount); _beforeTimeLockedTask(token, amount); _beforeTokenIndexedTask(token, amount); _beforeTokenThresholdTask(token, amount); _beforeVolumeLimitedTask(token, amount); } /** * @dev After task hook */ function _afterTask(address token, uint256 amount) internal virtual { _afterVolumeLimitedTask(token, amount); _afterTokenThresholdTask(token, amount); _afterTokenIndexedTask(token, amount); _afterTimeLockedTask(token, amount); _afterGasLimitedTask(token, amount); _afterPausableTask(token, amount); _afterBaseTask(token, amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '../../base/BaseTask.sol'; contract BaseTaskMock is BaseTask { bytes32 public constant override EXECUTION_TYPE = keccak256('BASE_TASK'); function initialize(BaseConfig memory config) external virtual initializer { __BaseTask_init(config); } function call(address token, uint256 amount) external { _beforeBaseTask(token, amount); _afterBaseTask(token, amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '../../base/BaseTask.sol'; import '../../base/GasLimitedTask.sol'; contract GasLimitedTaskMock is BaseTask, GasLimitedTask { bytes32 public constant override EXECUTION_TYPE = keccak256('GAS_LIMITED_TASK'); struct GasLimitMockConfig { BaseConfig baseConfig; GasLimitConfig gasLimitConfig; } function initialize(GasLimitMockConfig memory config) external virtual initializer { __BaseTask_init(config.baseConfig); __GasLimitedTask_init(config.gasLimitConfig); } function call(address token, uint256 amount) external { _beforeGasLimitedTaskMock(token, amount); _afterGasLimitedTaskMock(token, amount); } /** * @dev Fetches a base/quote price */ function _getPrice(address base, address quote) internal view override(BaseTask, GasLimitedTask) returns (uint256) { return BaseTask._getPrice(base, quote); } /** * @dev Before gas limited task mock hook */ function _beforeGasLimitedTaskMock(address token, uint256 amount) internal virtual { _beforeBaseTask(token, amount); _beforeGasLimitedTask(token, amount); } /** * @dev After gas limited task mock hook */ function _afterGasLimitedTaskMock(address token, uint256 amount) internal virtual { _afterGasLimitedTask(token, amount); _afterBaseTask(token, amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '../../base/BaseTask.sol'; import '../../base/PausableTask.sol'; contract PausableTaskMock is BaseTask, PausableTask { bytes32 public constant override EXECUTION_TYPE = keccak256('PAUSABLE_TASK'); struct PauseMockConfig { BaseConfig baseConfig; } function initialize(PauseMockConfig memory config) external virtual initializer { __BaseTask_init(config.baseConfig); __PausableTask_init(); } function call(address token, uint256 amount) external { if (amount == 0) amount = getTaskAmount(token); _beforePausableTaskMock(token, amount); _afterPausableTaskMock(token, amount); } /** * @dev Before pausable task mock hook */ function _beforePausableTaskMock(address token, uint256 amount) internal virtual { _beforeBaseTask(token, amount); _beforePausableTask(token, amount); } /** * @dev After pausable task mock hook */ function _afterPausableTaskMock(address token, uint256 amount) internal virtual { _afterPausableTask(token, amount); _afterBaseTask(token, amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '../../base/BaseTask.sol'; import '../../base/TimeLockedTask.sol'; contract TimeLockedTaskMock is BaseTask, TimeLockedTask { bytes32 public constant override EXECUTION_TYPE = keccak256('TIME_LOCKED_TASK'); struct TimeLockMockConfig { BaseConfig baseConfig; TimeLockConfig timeLockConfig; } function initialize(TimeLockMockConfig memory config) external virtual initializer { __BaseTask_init(config.baseConfig); __TimeLockedTask_init(config.timeLockConfig); } function call() external { _beforeTimeLockedTaskMock(); _afterTimeLockedTaskMock(); } /** * @dev Before time locked task mock hook */ function _beforeTimeLockedTaskMock() internal virtual { _beforeBaseTask(address(0), 0); _beforeTimeLockedTask(address(0), 0); } /** * @dev After time locked task mock hook */ function _afterTimeLockedTaskMock() internal virtual { _afterTimeLockedTask(address(0), 0); _afterBaseTask(address(0), 0); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '../../base/BaseTask.sol'; import '../../base/TokenIndexedTask.sol'; contract TokenIndexedTaskMock is BaseTask, TokenIndexedTask { using EnumerableSet for EnumerableSet.AddressSet; bytes32 public constant override EXECUTION_TYPE = keccak256('TOKEN_INDEXED_TASK'); struct TokenIndexMockConfig { BaseConfig baseConfig; TokenIndexConfig tokenIndexConfig; } function initialize(TokenIndexMockConfig memory config) external virtual initializer { __BaseTask_init(config.baseConfig); __TokenIndexedTask_init(config.tokenIndexConfig); } function call(address token) external { _beforeTokenIndexedTaskMock(token); _afterTokenIndexedTaskMock(token); } /** * @dev Before token indexed task mock hook */ function _beforeTokenIndexedTaskMock(address token) internal virtual { _beforeBaseTask(token, 0); _beforeTokenIndexedTask(token, 0); } /** * @dev After token indexed task mock hook */ function _afterTokenIndexedTaskMock(address token) internal virtual { _afterTokenIndexedTask(token, 0); _afterBaseTask(token, 0); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '../../base/BaseTask.sol'; import '../../base/TokenThresholdTask.sol'; contract TokenThresholdTaskMock is BaseTask, TokenThresholdTask { bytes32 public constant override EXECUTION_TYPE = keccak256('TOKEN_THRESHOLD_TASK'); struct TokenThresholdMockConfig { BaseConfig baseConfig; TokenThresholdConfig tokenThresholdConfig; } function initialize(TokenThresholdMockConfig memory config) external virtual initializer { __BaseTask_init(config.baseConfig); __TokenThresholdTask_init(config.tokenThresholdConfig); } function call(address token, uint256 amount) external { _beforeTokenThresholdTask(token, amount); _afterTokenThresholdTask(token, amount); } /** * @dev Fetches a base/quote price */ function _getPrice(address base, address quote) internal view override(BaseTask, TokenThresholdTask) returns (uint256) { return BaseTask._getPrice(base, quote); } /** * @dev Before token threshold task mock hook */ function _beforeTokenThresholdTaskMock(address token, uint256 amount) internal virtual { _beforeBaseTask(token, amount); _beforeTokenThresholdTask(token, amount); } /** * @dev After token threshold task mock hook */ function _afterTokenThresholdTaskMock(address token, uint256 amount) internal virtual { _afterTokenThresholdTask(token, amount); _afterBaseTask(token, amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '../../base/BaseTask.sol'; import '../../base/VolumeLimitedTask.sol'; contract VolumeLimitedTaskMock is BaseTask, VolumeLimitedTask { bytes32 public constant override EXECUTION_TYPE = keccak256('VOLUME_LIMITED_TASK'); struct VolumeLimitMockConfig { BaseConfig baseConfig; VolumeLimitConfig volumeLimitConfig; } function initialize(VolumeLimitMockConfig memory config) external virtual initializer { __BaseTask_init(config.baseConfig); __VolumeLimitedTask_init(config.volumeLimitConfig); } function call(address token, uint256 amount) external { _beforeVolumeLimitedTaskMock(token, amount); _afterVolumeLimitedTaskMock(token, amount); } /** * @dev Fetches a base/quote price */ function _getPrice(address base, address quote) internal view override(BaseTask, VolumeLimitedTask) returns (uint256) { return BaseTask._getPrice(base, quote); } /** * @dev Before volume limited task mock hook */ function _beforeVolumeLimitedTaskMock(address token, uint256 amount) internal virtual { _beforeBaseTask(token, amount); _beforeVolumeLimitedTask(token, amount); } /** * @dev After volume limited task mock hook */ function _afterVolumeLimitedTaskMock(address token, uint256 amount) internal virtual { _afterVolumeLimitedTask(token, amount); _afterBaseTask(token, amount); } }
// 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; contract AxelarConnectorMock { event LogExecute(uint256 chainId, address token, uint256 amount, address recipient); function execute(uint256 chainId, address token, uint256 amount, address recipient) external { emit LogExecute(chainId, token, amount, recipient); } }
// 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; contract ConnextConnectorMock { event LogExecute( uint256 chainId, address token, uint256 amount, uint256 minAmountOut, address recipient, uint256 relayerFee ); function execute( uint256 chainId, address token, uint256 amount, uint256 minAmountOut, address recipient, uint256 relayerFee ) external { emit LogExecute(chainId, token, amount, minAmountOut, recipient, relayerFee); } }
// 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; contract HopBridgeConnectorMock { event LogExecute( uint256 chainId, address token, uint256 amount, uint256 minAmountOut, address recipient, address bridge, uint256 deadline, address relayer, uint256 fee ); function execute( uint256 chainId, address token, uint256 amount, uint256 minAmountOut, address recipient, address bridge, uint256 deadline, address relayer, uint256 fee ) external { emit LogExecute(chainId, token, amount, minAmountOut, recipient, bridge, deadline, relayer, fee); } }
// 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; contract WormholeConnectorMock { event LogExecute(uint256 chainId, address token, uint256 amount, uint256 minAmountOut, address recipient); function execute(uint256 chainId, address token, uint256 amount, uint256 minAmountOut, address recipient) external { emit LogExecute(chainId, token, amount, minAmountOut, recipient); } }
// 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. pragma solidity ^0.8.0; contract BalancerV2PoolConnectorMock { address public immutable balancerV2Vault; constructor(address _balancerV2Vault) { balancerV2Vault = _balancerV2Vault; } event LogExecute(address tokenIn, uint256 amountIn, address[] tokensOut, uint256[] minAmountsOut); function exit(address tokenIn, uint256 amountIn, address[] memory tokensOut, uint256[] memory minAmountsOut) external returns (uint256[] memory amountsOut) { emit LogExecute(tokenIn, amountIn, tokensOut, minAmountsOut); return minAmountsOut; } }
// 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/v3-helpers/contracts/mocks/TokenMock.sol'; contract ConvexConnectorMock { IERC20 public immutable rewardToken; uint256 public immutable rewardAmount; constructor() { rewardAmount = 5e18; rewardToken = new TokenMock('Convex Claimer Reward', 18); } mapping (address => address) public getCvxPool; mapping (address => address) public getCurvePool; event LogClaim(address cvxPool); event LogJoin(address curvePool, uint256 amount); event LogExit(address cvxPool, uint256 amount); function setCvxPool(address curvePool, address cvxPool) external { getCvxPool[curvePool] = cvxPool; } function setCurvePool(address cvxPool, address curvePool) external { getCurvePool[cvxPool] = curvePool; } function claim(address cvxPool) external returns (address[] memory tokens, uint256[] memory amounts) { tokens = new address[](1); tokens[0] = address(rewardToken); amounts = new uint256[](1); amounts[0] = rewardAmount; emit LogClaim(cvxPool); } function join(address curvePool, uint256 amount) external returns (uint256) { emit LogJoin(curvePool, amount); return amount; } function exit(address cvxPool, uint256 amount) external returns (uint256) { emit LogExit(cvxPool, amount); return amount; } }
// 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; contract Curve2CrvConnectorMock { event LogJoin(address pool, address tokenIn, uint256 amountIn, uint256 slippage); event LogExit(address pool, uint256 amountIn, address tokenOut, uint256 slippage); function join(address pool, address tokenIn, uint256 amountIn, uint256 slippage) external returns (uint256) { emit LogJoin(pool, tokenIn, amountIn, slippage); return amountIn; } function exit(address pool, uint256 amountIn, address tokenOut, uint256 slippage) external returns (uint256) { emit LogExit(pool, amountIn, tokenOut, slippage); return amountIn; } }
// 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; contract ERC4626ConnectorMock { address public immutable tokenOut; event LogJoin(address erc4626, address token, uint256 amount, uint256 minAmountOut); event LogExit(address erc4626, uint256 amount, uint256 minAmountOut); constructor(address _tokenOut) { tokenOut = _tokenOut; } function join(address erc4626, address token, uint256 assets, uint256 minSharesOut) external returns (address, uint256) { emit LogJoin(erc4626, token, assets, minSharesOut); return (erc4626, minSharesOut); } function exit(address erc4626, uint256 shares, uint256 minAssetsOut) external returns (address, uint256) { emit LogExit(erc4626, shares, minAssetsOut); return (tokenOut, minAssetsOut); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract HopL2AmmMock { address public immutable hToken; address public immutable l2CanonicalToken; constructor(address _token, address _hToken) { l2CanonicalToken = _token; hToken = _hToken; } function exchangeAddress() external view returns (address) { return address(this); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract RelayerMock { event Deposited(address smartVault, uint256 amount); mapping (address => uint256) public getSmartVaultBalance; mapping (address => uint256) public getSmartVaultUsedQuota; function deposit(address smartVault, uint256 amount) external payable { getSmartVaultBalance[smartVault] += amount; emit Deposited(smartVault, amount); } function setSmartVaultUsedQuota(address smartVault, uint256 quota) external { getSmartVaultUsedQuota[smartVault] = quota; } }
// 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. pragma solidity ^0.8.0; contract BalancerV2SwapConnectorMock { address public immutable balancerV2Vault; constructor(address _balancerV2Vault) { balancerV2Vault = _balancerV2Vault; } event LogExecute( address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, bytes32 poolId, bytes32[] hopPoolsIds, address[] hopTokens ); function execute( address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, bytes32 poolId, bytes32[] memory hopPoolsIds, address[] memory hopTokens ) external returns (uint256) { emit LogExecute(tokenIn, tokenOut, amountIn, minAmountOut, poolId, hopPoolsIds, hopTokens); return minAmountOut; } }
// 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; contract HopSwapConnectorMock { event LogExecute(address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, address hopDexAddress); function execute(address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, address hopDexAddress) external returns (uint256) { emit LogExecute(tokenIn, tokenOut, amountIn, minAmountOut, hopDexAddress); return minAmountOut; } }
// 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; contract OneInchV5ConnectorMock { event LogExecute(address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, bytes data); function execute(address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, bytes memory data) external returns (uint256) { emit LogExecute(tokenIn, tokenOut, amountIn, minAmountOut, data); return minAmountOut; } }
// 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; contract ParaswapV5ConnectorMock { event LogExecute(address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, bytes data); function execute(address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, bytes memory data) external returns (uint256) { emit LogExecute(tokenIn, tokenOut, amountIn, minAmountOut, data); return minAmountOut; } }
// 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; contract UniswapV2ConnectorMock { event LogExecute(address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, address[] hopTokens); function execute( address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, address[] memory hopTokens ) external returns (uint256) { emit LogExecute(tokenIn, tokenOut, amountIn, minAmountOut, hopTokens); return minAmountOut; } }
// 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. pragma solidity ^0.8.0; contract UniswapV3ConnectorMock { event LogExecute( address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, uint24 fee, address[] hopTokens, uint24[] hopFees ); function execute( address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, uint24 fee, address[] memory hopTokens, uint24[] memory hopFees ) external returns (uint256) { emit LogExecute(tokenIn, tokenOut, amountIn, minAmountOut, fee, hopTokens, hopFees); return minAmountOut; } }
{ "optimizer": { "enabled": true, "runs": 1000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract ABI
API[{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bytes4","name":"what","type":"bytes4"},{"internalType":"uint256[]","name":"how","type":"uint256[]"}],"name":"AuthSenderNotAllowed","type":"error"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"aInflated","type":"uint256"}],"name":"FixedPointDivInternal","type":"error"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"}],"name":"FixedPointMulOverflow","type":"error"},{"inputs":[],"name":"FixedPointZeroDivision","type":"error"},{"inputs":[],"name":"TaskAcceptanceInputLengthMismatch","type":"error"},{"inputs":[],"name":"TaskAcceptanceTokenZero","type":"error"},{"inputs":[],"name":"TaskAmountZero","type":"error"},{"inputs":[],"name":"TaskGasNotInitialized","type":"error"},{"inputs":[{"internalType":"uint256","name":"gasPrice","type":"uint256"},{"internalType":"uint256","name":"gasPriceLimit","type":"uint256"}],"name":"TaskGasPriceLimitExceeded","type":"error"},{"inputs":[{"internalType":"uint8","name":"mode","type":"uint8"},{"internalType":"uint256","name":"date","type":"uint256"}],"name":"TaskInvalidAllowedDate","type":"error"},{"inputs":[{"internalType":"uint8","name":"mode","type":"uint8"},{"internalType":"uint256","name":"window","type":"uint256"}],"name":"TaskInvalidAllowedWindow","type":"error"},{"inputs":[{"internalType":"uint8","name":"mode","type":"uint8"},{"internalType":"uint256","name":"frequency","type":"uint256"}],"name":"TaskInvalidFrequency","type":"error"},{"inputs":[{"internalType":"uint8","name":"mode","type":"uint8"}],"name":"TaskInvalidFrequencyMode","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"TaskInvalidThresholdInput","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"}],"name":"TaskInvalidVolumeLimitInput","type":"error"},{"inputs":[],"name":"TaskPaused","type":"error"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"TaskPreviousConnectorNotZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"priorityFee","type":"uint256"},{"internalType":"uint256","name":"priorityFeeLimit","type":"uint256"}],"name":"TaskPriorityFeeLimitExceeded","type":"error"},{"inputs":[{"internalType":"bytes32","name":"connectorId","type":"bytes32"}],"name":"TaskSameBalanceConnectors","type":"error"},{"inputs":[{"internalType":"address","name":"smartVault","type":"address"}],"name":"TaskSmartVaultPriceOracleNotSet","type":"error"},{"inputs":[],"name":"TaskThresholdTokenZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"}],"name":"TaskTimeLockActive","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"TaskTokenNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"TaskTokenThresholdNotMet","type":"error"},{"inputs":[],"name":"TaskTokenZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"txCost","type":"uint256"},{"internalType":"uint256","name":"txCostLimit","type":"uint256"}],"name":"TaskTxCostLimitExceeded","type":"error"},{"inputs":[],"name":"TaskTxCostLimitPctAboveOne","type":"error"},{"inputs":[{"internalType":"uint256","name":"txCostPct","type":"uint256"},{"internalType":"uint256","name":"txCostLimitPct","type":"uint256"}],"name":"TaskTxCostLimitPctExceeded","type":"error"},{"inputs":[],"name":"TaskUnpaused","type":"error"},{"inputs":[],"name":"TaskValueZero","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"volume","type":"uint256"}],"name":"TaskVolumeLimitExceeded","type":"error"},{"inputs":[],"name":"TaskVolumeLimitTokenZero","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"previous","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"next","type":"bytes32"}],"name":"BalanceConnectorsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"thresholdToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"min","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"max","type":"uint256"}],"name":"CustomTokenThresholdSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"limitToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"}],"name":"CustomVolumeLimitSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"min","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"max","type":"uint256"}],"name":"DefaultTokenThresholdSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"limitToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"}],"name":"DefaultVolumeLimitSet","type":"event"},{"anonymous":false,"inputs":[],"name":"Executed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gasPriceLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"priorityFeeLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"txCostLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"txCostLimitPct","type":"uint256"}],"name":"GasLimitsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"allowedAt","type":"uint256"}],"name":"TimeLockAllowedAtSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"mode","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"frequency","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allowedAt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"window","type":"uint256"}],"name":"TimeLockSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"added","type":"bool"}],"name":"TokensAcceptanceListSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum ITokenIndexedTask.TokensAcceptanceType","name":"acceptanceType","type":"uint8"}],"name":"TokensAcceptanceTypeSet","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"inputs":[],"name":"EXECUTION_TYPE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"authorizer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"call","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"customTokenThreshold","outputs":[{"internalType":"address","name":"thresholdToken","type":"address"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"customVolumeLimit","outputs":[{"internalType":"address","name":"limitToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"accrued","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"nextResetTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultTokenThreshold","outputs":[{"internalType":"address","name":"thresholdToken","type":"address"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultVolumeLimit","outputs":[{"internalType":"address","name":"limitToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"accrued","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"nextResetTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalanceConnectors","outputs":[{"internalType":"bytes32","name":"previous","type":"bytes32"},{"internalType":"bytes32","name":"next","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGasLimits","outputs":[{"internalType":"uint256","name":"gasPriceLimit","type":"uint256"},{"internalType":"uint256","name":"priorityFeeLimit","type":"uint256"},{"internalType":"uint256","name":"txCostLimit","type":"uint256"},{"internalType":"uint256","name":"txCostLimitPct","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getTaskAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTimeLock","outputs":[{"internalType":"uint8","name":"mode","type":"uint8"},{"internalType":"uint256","name":"frequency","type":"uint256"},{"internalType":"uint256","name":"allowedAt","type":"uint256"},{"internalType":"uint256","name":"window","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getTokenThreshold","outputs":[{"internalType":"address","name":"thresholdToken","type":"address"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokensSource","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getVolumeLimit","outputs":[{"internalType":"address","name":"limitToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"accrued","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"nextResetTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"components":[{"internalType":"address","name":"smartVault","type":"address"},{"internalType":"bytes32","name":"previousBalanceConnectorId","type":"bytes32"},{"internalType":"bytes32","name":"nextBalanceConnectorId","type":"bytes32"}],"internalType":"struct BaseTask.BaseConfig","name":"baseConfig","type":"tuple"},{"components":[{"internalType":"uint256","name":"gasPriceLimit","type":"uint256"},{"internalType":"uint256","name":"priorityFeeLimit","type":"uint256"},{"internalType":"uint256","name":"txCostLimit","type":"uint256"},{"internalType":"uint256","name":"txCostLimitPct","type":"uint256"}],"internalType":"struct GasLimitedTask.GasLimitConfig","name":"gasLimitConfig","type":"tuple"},{"components":[{"internalType":"uint8","name":"mode","type":"uint8"},{"internalType":"uint256","name":"frequency","type":"uint256"},{"internalType":"uint256","name":"allowedAt","type":"uint256"},{"internalType":"uint256","name":"window","type":"uint256"}],"internalType":"struct TimeLockedTask.TimeLockConfig","name":"timeLockConfig","type":"tuple"},{"components":[{"internalType":"enum ITokenIndexedTask.TokensAcceptanceType","name":"acceptanceType","type":"uint8"},{"internalType":"address[]","name":"tokens","type":"address[]"}],"internalType":"struct TokenIndexedTask.TokenIndexConfig","name":"tokenIndexConfig","type":"tuple"},{"components":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"internalType":"struct TokenThresholdTask.Threshold","name":"defaultThreshold","type":"tuple"},{"components":[{"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"internalType":"struct TokenThresholdTask.Threshold","name":"threshold","type":"tuple"}],"internalType":"struct TokenThresholdTask.CustomThresholdConfig[]","name":"customThresholdConfigs","type":"tuple[]"}],"internalType":"struct TokenThresholdTask.TokenThresholdConfig","name":"tokenThresholdConfig","type":"tuple"},{"components":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"}],"internalType":"struct VolumeLimitedTask.VolumeLimitParams","name":"defaultVolumeLimit","type":"tuple"},{"components":[{"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"}],"internalType":"struct VolumeLimitedTask.VolumeLimitParams","name":"volumeLimit","type":"tuple"}],"internalType":"struct VolumeLimitedTask.CustomVolumeLimitConfig[]","name":"customVolumeLimitConfigs","type":"tuple[]"}],"internalType":"struct VolumeLimitedTask.VolumeLimitConfig","name":"volumeLimitConfig","type":"tuple"}],"internalType":"struct Task.TaskConfig","name":"taskConfig","type":"tuple"}],"internalType":"struct Depositor.DepositConfig","name":"config","type":"tuple"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"isTokenAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"previous","type":"bytes32"},{"internalType":"bytes32","name":"next","type":"bytes32"}],"name":"setBalanceConnectors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"thresholdToken","type":"address"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setCustomTokenThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"limitToken","type":"address"},{"internalType":"uint256","name":"limitAmount","type":"uint256"},{"internalType":"uint256","name":"limitPeriod","type":"uint256"}],"name":"setCustomVolumeLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"thresholdToken","type":"address"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setDefaultTokenThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"limitToken","type":"address"},{"internalType":"uint256","name":"limitAmount","type":"uint256"},{"internalType":"uint256","name":"limitPeriod","type":"uint256"}],"name":"setDefaultVolumeLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newGasPriceLimit","type":"uint256"},{"internalType":"uint256","name":"newPriorityFeeLimit","type":"uint256"},{"internalType":"uint256","name":"newTxCostLimit","type":"uint256"},{"internalType":"uint256","name":"newTxCostLimitPct","type":"uint256"}],"name":"setGasLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"mode","type":"uint8"},{"internalType":"uint256","name":"frequency","type":"uint256"},{"internalType":"uint256","name":"allowedAt","type":"uint256"},{"internalType":"uint256","name":"window","type":"uint256"}],"name":"setTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"bool[]","name":"added","type":"bool[]"}],"name":"setTokensAcceptanceList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum ITokenIndexedTask.TokensAcceptanceType","name":"newTokensAcceptanceType","type":"uint8"}],"name":"setTokensAcceptanceType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"smartVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensAcceptanceType","outputs":[{"internalType":"enum ITokenIndexedTask.TokensAcceptanceType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BSC | 100.00% | $0.004571 | 277,824,310,657,277.22 | $1,269,972,577,051.17 | |
BSC | <0.01% | $0.004571 | 8,330,892,343.0911 | $38,081,637.97 | |
BSC | <0.01% | $0.009073 | 87,890,196.1888 | $797,464.66 | |
BSC | <0.01% | $0.010311 | 6,785,255.0741 | $69,964.36 | |
BSC | <0.01% | $115.47 | 336.5931 | $38,866.4 | |
BSC | <0.01% | $0.000324 | 40,389,919.3571 | $13,103.65 | |
BSC | <0.01% | $0.034387 | 180,325.4013 | $6,200.86 | |
BSC | <0.01% | $2.91 | 677.9782 | $1,972.92 | |
BSC | <0.01% | $2.83 | 603.7784 | $1,709.01 | |
BSC | <0.01% | $0.113569 | 5,497.9141 | $624.39 | |
BSC | <0.01% | <$0.000001 | 13,679,852,081.4292 | $602.43 | |
BSC | <0.01% | $0.033182 | 17,546.8229 | $582.24 | |
BSC | <0.01% | $0.051477 | 7,896.5897 | $406.49 | |
BSC | <0.01% | $0.291995 | 1,322.9168 | $386.28 | |
BSC | <0.01% | $0.499725 | 596.8643 | $298.27 | |
BSC | <0.01% | <$0.000001 | 61,102,783,530.7671 | $252.9 | |
BSC | <0.01% | $0.000058 | 4,035,922.6502 | $232.11 | |
BSC | <0.01% | $0.100674 | 2,273.9969 | $228.93 | |
BSC | <0.01% | $0.002696 | 72,612.9337 | $195.79 | |
BSC | <0.01% | $0.039863 | 4,803.5256 | $191.48 | |
BSC | <0.01% | <$0.000001 | 16,892,531,640.2941 | $185.82 | |
BSC | <0.01% | $0.018783 | 9,487.3399 | $178.2 | |
BSC | <0.01% | $0.147657 | 1,183.3201 | $174.73 | |
BSC | <0.01% | $40.88 | 4.1521 | $169.74 | |
BSC | <0.01% | $0.000316 | 515,100.3665 | $162.72 | |
BSC | <0.01% | $2.93 | 45.4649 | $133.25 | |
BSC | <0.01% | <$0.000001 | 3,113,175,345.9759 | $129.78 | |
BSC | <0.01% | <$0.000001 | 124,761,172,207.0185 | $124.76 | |
BSC | <0.01% | $0.444069 | 250.6672 | $111.31 | |
BSC | <0.01% | $0.653692 | 150.7437 | $98.54 | |
BSC | <0.01% | $0.05355 | 1,835.0193 | $98.27 | |
BSC | <0.01% | $0.08952 | 1,036.7078 | $92.81 | |
BSC | <0.01% | $8.25 | 11.1036 | $91.6 | |
BSC | <0.01% | $4.22 | 21.2878 | $89.8 | |
BSC | <0.01% | $0.015558 | 5,756.2438 | $89.56 | |
BSC | <0.01% | $0.10073 | 876.9322 | $88.33 | |
BSC | <0.01% | $0.65431 | 134.0517 | $87.71 | |
BSC | <0.01% | $0.025585 | 3,384.1533 | $86.58 | |
BSC | <0.01% | $0.018927 | 4,461.8252 | $84.45 | |
BSC | <0.01% | $0.068251 | 1,235.9963 | $84.36 | |
BSC | <0.01% | $0.555568 | 150.5791 | $83.66 | |
BSC | <0.01% | $104,362.62 | 0.00079394 | $82.86 | |
BSC | <0.01% | $0.164407 | 499.0328 | $82.04 | |
BSC | <0.01% | $45.97 | 1.7804 | $81.85 | |
BSC | <0.01% | $0.007945 | 10,255.8037 | $81.49 | |
BSC | <0.01% | $0.092848 | 876.2708 | $81.36 | |
BSC | <0.01% | $0.000051 | 1,582,112.0013 | $81.32 | |
BSC | <0.01% | $0.015694 | 5,085.2514 | $79.81 | |
BSC | <0.01% | $0.001069 | 74,610.2232 | $79.76 | |
BSC | <0.01% | $0.003298 | 24,031.5685 | $79.26 | |
BSC | <0.01% | $16.7 | 4.6915 | $78.34 | |
BSC | <0.01% | $0.009131 | 8,560.6525 | $78.17 | |
BSC | <0.01% | $0.003838 | 20,321.9993 | $77.99 | |
BSC | <0.01% | $0.020436 | 3,785.3894 | $77.36 | |
BSC | <0.01% | $0.000011 | 6,882,996.1654 | $76.33 | |
BSC | <0.01% | $0.669503 | 113.6605 | $76.1 | |
BSC | <0.01% | $0.044201 | 1,714.8142 | $75.8 | |
BSC | <0.01% | $0.999524 | 75.7924 | $75.76 | |
BSC | <0.01% | $0.999856 | 75.7112 | $75.7 | |
BSC | <0.01% | $11.93 | 6.3434 | $75.68 | |
BSC | <0.01% | $0.270475 | 277.0631 | $74.94 | |
BSC | <0.01% | $0.3086 | 242.7651 | $74.92 | |
BSC | <0.01% | $0.175147 | 425.4024 | $74.51 | |
BSC | <0.01% | $0.32165 | 231.2216 | $74.37 | |
BSC | <0.01% | $0.277402 | 267.9262 | $74.32 | |
BSC | <0.01% | $0.126808 | 584.2395 | $74.09 | |
BSC | <0.01% | <$0.000001 | 744,918,207.7212 | $74.04 | |
BSC | <0.01% | $0.000037 | 1,986,525.0851 | $73.98 | |
BSC | <0.01% | $0.101062 | 726.3883 | $73.41 | |
BSC | <0.01% | $0.024789 | 2,952.1597 | $73.18 | |
BSC | <0.01% | $0.704147 | 103.6742 | $73 | |
BSC | <0.01% | <$0.000001 | 176,563,653.9345 | $72.92 | |
BSC | <0.01% | <$0.000001 | 3,557,482,425.104 | $72.71 | |
BSC | <0.01% | $0.025612 | 2,808.4583 | $71.93 | |
BSC | <0.01% | $1.05 | 68.7447 | $71.91 | |
BSC | <0.01% | <$0.000001 | 550,038,695.9726 | $70.89 | |
BSC | <0.01% | $0.000006 | 10,981,756.8859 | $70.58 | |
BSC | <0.01% | $0.058829 | 1,198.6007 | $70.51 | |
BSC | <0.01% | $2.31 | 30.3757 | $70.17 | |
BSC | <0.01% | $0.025812 | 2,700.2636 | $69.7 | |
BSC | <0.01% | $0.403638 | 172.5213 | $69.64 | |
BSC | <0.01% | $1.3 | 53.3308 | $69.48 | |
BSC | <0.01% | $44.53 | 1.5575 | $69.35 | |
BSC | <0.01% | $0.008221 | 8,332.3932 | $68.5 | |
BSC | <0.01% | $0.059685 | 1,140.6698 | $68.08 | |
BSC | <0.01% | $642.77 | 0.105 | $67.51 | |
BSC | <0.01% | $0.002043 | 33,023.0097 | $67.45 | |
BSC | <0.01% | $0.001573 | 42,747.2531 | $67.25 | |
BSC | <0.01% | $0.000142 | 471,783.6592 | $67.1 | |
BSC | <0.01% | $0.668394 | 100.1509 | $66.94 | |
BSC | <0.01% | $0.022015 | 3,028.6224 | $66.68 | |
BSC | <0.01% | $0.028932 | 2,288.3543 | $66.21 | |
BSC | <0.01% | $0.012967 | 5,083.2672 | $65.92 | |
BSC | <0.01% | <$0.000001 | 1,257,089,421.9176 | $65.87 | |
BSC | <0.01% | $0.000201 | 326,444.4403 | $65.71 | |
BSC | <0.01% | $0.008517 | 7,679.8725 | $65.41 | |
BSC | <0.01% | $0.040909 | 1,594.7548 | $65.24 | |
BSC | <0.01% | $0.049541 | 1,305.6631 | $64.68 | |
BSC | <0.01% | $0.000002 | 29,791,237.6119 | $64.05 | |
BSC | <0.01% | $0.046359 | 1,369.3864 | $63.48 | |
BSC | <0.01% | $0.023033 | 2,752.7912 | $63.4 | |
BSC | <0.01% | $0.006493 | 9,744.3156 | $63.27 | |
BSC | <0.01% | $0.000007 | 9,616,111.3606 | $62.5 | |
BSC | <0.01% | $0.615514 | 101.0295 | $62.19 | |
BSC | <0.01% | $0.000013 | 4,877,414.2514 | $62.04 | |
BSC | <0.01% | $0.023511 | 2,627.6247 | $61.78 | |
BSC | <0.01% | $0.004541 | 13,512.7652 | $61.36 | |
BSC | <0.01% | $0.227605 | 269.2822 | $61.29 | |
BSC | <0.01% | $0.205652 | 297.9202 | $61.27 | |
BSC | <0.01% | $0.043333 | 1,409.7217 | $61.09 | |
BSC | <0.01% | $19.67 | 3.0987 | $60.95 | |
BSC | <0.01% | $0.000981 | 62,075.8766 | $60.93 | |
BSC | <0.01% | $0.009124 | 6,656.4342 | $60.74 | |
BSC | <0.01% | $2.1 | 28.8167 | $60.52 | |
BSC | <0.01% | $0.004097 | 14,762.1487 | $60.48 | |
BSC | <0.01% | $63.62 | 0.9441 | $60.06 | |
BSC | <0.01% | $0.000136 | 433,260.7299 | $59.06 | |
BSC | <0.01% | $0.004564 | 12,882.7371 | $58.79 | |
BSC | <0.01% | $0.02328 | 2,494.1154 | $58.06 | |
BSC | <0.01% | $0.000189 | 307,193.0719 | $58.02 | |
BSC | <0.01% | $0.000365 | 156,783.7825 | $57.25 | |
BSC | <0.01% | $0.012998 | 4,399.0829 | $57.18 | |
BSC | <0.01% | $0.136 | 416.7492 | $56.68 | |
BSC | <0.01% | $15.93 | 3.5531 | $56.59 | |
BSC | <0.01% | $0.623708 | 89.8722 | $56.05 | |
BSC | <0.01% | $0.118119 | 471.8521 | $55.73 | |
BSC | <0.01% | $1.39 | 39.9724 | $55.7 | |
BSC | <0.01% | $0.000573 | 96,529.3364 | $55.33 | |
BSC | <0.01% | $0.220193 | 249.0921 | $54.85 | |
BSC | <0.01% | $0.000342 | 159,843.2933 | $54.7 | |
BSC | <0.01% | <$0.000001 | 482,205,311.533 | $54.67 | |
BSC | <0.01% | $0.00301 | 17,909.1891 | $53.91 | |
BSC | <0.01% | $0.28119 | 191.3785 | $53.81 | |
BSC | <0.01% | $0.196527 | 273.7212 | $53.79 | |
BSC | <0.01% | $2.16 | 24.8459 | $53.72 | |
BSC | <0.01% | $2,476.74 | 0.0215 | $53.18 | |
BSC | <0.01% | $0.000015 | 3,543,248.4316 | $52.72 | |
BSC | <0.01% | $1 | 52.6425 | $52.7 | |
BSC | <0.01% | $0.002949 | 17,677.1676 | $52.14 | |
BSC | <0.01% | <$0.000001 | 564,345,564.6774 | $52.13 | |
BSC | <0.01% | <$0.000001 | 4,182,762,280,404.1821 | $51.95 | |
BSC | <0.01% | <$0.000001 | 617,605,066,976.9307 | $51.69 | |
BSC | <0.01% | $0.000092 | 558,235.5137 | $51.46 | |
BSC | <0.01% | $0.024041 | 2,129.9907 | $51.21 | |
BSC | <0.01% | $0.030264 | 1,690.9961 | $51.18 | |
BSC | <0.01% | $0.211807 | 240.5427 | $50.95 | |
BSC | <0.01% | $0.031045 | 1,632.9955 | $50.7 | |
BSC | <0.01% | $0.010559 | 4,787.7742 | $50.56 | |
BSC | <0.01% | $0.046796 | 1,075.8137 | $50.34 | |
BSC | <0.01% | $0.004962 | 10,057.0195 | $49.9 | |
BSC | <0.01% | $0.179116 | 278.4587 | $49.88 | |
BSC | <0.01% | $0.249813 | 199.5495 | $49.85 | |
BSC | <0.01% | $1.19 | 41.7803 | $49.74 | |
BSC | <0.01% | $0.058605 | 847.3713 | $49.66 | |
BSC | <0.01% | $10.5 | 4.7184 | $49.54 | |
BSC | <0.01% | $5.83 | 8.4711 | $49.37 | |
BSC | <0.01% | $0.072144 | 668.0086 | $48.19 | |
BSC | <0.01% | $0.005107 | 9,418.0096 | $48.1 | |
BSC | <0.01% | $0.000164 | 292,187.3123 | $47.97 | |
BSC | <0.01% | $0.000245 | 194,859.4659 | $47.78 | |
BSC | <0.01% | $0.001872 | 25,427.5539 | $47.59 | |
BSC | <0.01% | $0.081181 | 584.9558 | $47.49 | |
BSC | <0.01% | $0.172285 | 272.187 | $46.89 | |
BSC | <0.01% | <$0.000001 | 80,835,426,387.5831 | $46.59 | |
BSC | <0.01% | $3.89 | 11.9748 | $46.53 | |
BSC | <0.01% | $0.433937 | 107.1467 | $46.49 | |
BSC | <0.01% | <$0.000001 | 112,326,789.5444 | $46.39 | |
BSC | <0.01% | $0.000232 | 197,317.4825 | $45.83 | |
BSC | <0.01% | $2.32 | 19.4461 | $45.06 | |
BSC | <0.01% | $31.14 | 1.4452 | $45 | |
BSC | <0.01% | $0.202743 | 220.5291 | $44.71 | |
BSC | <0.01% | $1 | 44.1108 | $44.11 | |
BSC | <0.01% | $0.541075 | 81.4457 | $44.07 | |
BSC | <0.01% | $0.000089 | 496,097.5144 | $44.06 | |
BSC | <0.01% | $1.02 | 42.825 | $43.8 | |
BSC | <0.01% | <$0.000001 | 16,188,623,259,784.416 | $43.79 | |
BSC | <0.01% | $0.004286 | 10,212.94 | $43.77 | |
BSC | <0.01% | $0.000001 | 31,305,731.8117 | $43.51 | |
BSC | <0.01% | $0.032097 | 1,351.5038 | $43.38 | |
BSC | <0.01% | $0.470875 | 92.0436 | $43.34 | |
BSC | <0.01% | $0.0095 | 4,561.817 | $43.34 | |
BSC | <0.01% | $0.702095 | 61.3906 | $43.1 | |
BSC | <0.01% | $0.047743 | 899.9898 | $42.97 | |
BSC | <0.01% | $0.011927 | 3,586.5785 | $42.78 | |
BSC | <0.01% | $0.002672 | 15,955.5295 | $42.63 | |
BSC | <0.01% | $0.296271 | 143.4583 | $42.5 | |
BSC | <0.01% | $0.043564 | 968.9982 | $42.21 | |
BSC | <0.01% | $0.263159 | 160.1003 | $42.13 | |
BSC | <0.01% | $9.04 | 4.6397 | $41.93 | |
BSC | <0.01% | $0.003432 | 12,174.2281 | $41.78 | |
BSC | <0.01% | $0.031948 | 1,307.3889 | $41.77 | |
BSC | <0.01% | $0.041784 | 999.3184 | $41.76 | |
BSC | <0.01% | $2.38 | 17.4991 | $41.65 | |
BSC | <0.01% | $0.384636 | 108.2298 | $41.63 | |
BSC | <0.01% | $0.015485 | 2,682.1646 | $41.53 | |
BSC | <0.01% | $0.019241 | 2,151.0583 | $41.39 | |
BSC | <0.01% | $0.616423 | 66.9457 | $41.27 | |
BSC | <0.01% | $0.17775 | 232.0686 | $41.25 | |
BSC | <0.01% | $710.9 | 0.058 | $41.23 | |
BSC | <0.01% | $0.077887 | 528.3816 | $41.15 | |
BSC | <0.01% | $25.21 | 1.6273 | $41.02 | |
BSC | <0.01% | $0.274567 | 148.8784 | $40.88 | |
BSC | <0.01% | $0.046148 | 884.3655 | $40.81 | |
BSC | <0.01% | $0.998816 | 40.7858 | $40.74 | |
BSC | <0.01% | $1.91 | 21.2788 | $40.64 | |
BSC | <0.01% | $0.101654 | 399.3128 | $40.59 | |
BSC | <0.01% | $0.008228 | 4,910.898 | $40.41 | |
BSC | <0.01% | $0.043622 | 922.7592 | $40.25 | |
BSC | <0.01% | $140.78 | 0.2854 | $40.18 | |
BSC | <0.01% | $0.004448 | 8,931.0159 | $39.73 | |
BSC | <0.01% | $0.007623 | 5,204.5388 | $39.67 | |
BSC | <0.01% | $0.030425 | 1,297.1458 | $39.47 | |
BSC | <0.01% | $0.022493 | 1,746.7165 | $39.29 | |
BSC | <0.01% | $0.00161 | 24,048.4921 | $38.71 | |
BSC | <0.01% | $13.54 | 2.8507 | $38.6 | |
BSC | <0.01% | $0.000012 | 3,101,754.3967 | $38.58 | |
BSC | <0.01% | $0.000171 | 224,163.7352 | $38.27 | |
BSC | <0.01% | $0.000322 | 118,408.3305 | $38.18 | |
BSC | <0.01% | $0.000228 | 166,444.7109 | $37.92 | |
BSC | <0.01% | $0.117305 | 323.203 | $37.91 | |
BSC | <0.01% | $0.004445 | 8,419.2201 | $37.43 | |
BSC | <0.01% | $5.99 | 6.2357 | $37.32 | |
BSC | <0.01% | $0.000138 | 269,836.9294 | $37.29 | |
BSC | <0.01% | $12.65 | 2.9424 | $37.22 | |
BSC | <0.01% | $0.048411 | 766.0206 | $37.08 | |
BSC | <0.01% | $0.000001 | 48,938,042.8792 | $36.77 | |
BSC | <0.01% | $0.011671 | 3,137.9566 | $36.62 | |
BSC | <0.01% | $0.020665 | 1,771.2717 | $36.6 | |
BSC | <0.01% | $0.000662 | 55,238.4616 | $36.58 | |
BSC | <0.01% | $7.88 | 4.6388 | $36.55 | |
BSC | <0.01% | $0.000346 | 104,481.449 | $36.11 | |
BSC | <0.01% | $0.001077 | 33,532.9323 | $36.11 | |
BSC | <0.01% | $0.007178 | 5,006.2029 | $35.93 | |
BSC | <0.01% | $0.000087 | 410,229.4729 | $35.87 | |
BSC | <0.01% | $0.000165 | 216,384.1428 | $35.75 | |
BSC | <0.01% | $0.214891 | 166.3326 | $35.74 | |
BSC | <0.01% | $0.049774 | 716.4552 | $35.66 | |
BSC | <0.01% | $87.17 | 0.4076 | $35.53 | |
BSC | <0.01% | $0.004769 | 7,371.3785 | $35.15 | |
BSC | <0.01% | $0.011582 | 3,032.1751 | $35.12 | |
BSC | <0.01% | $0.000156 | 224,023.008 | $34.97 | |
BSC | <0.01% | $0.010027 | 3,479.1223 | $34.89 | |
BSC | <0.01% | $0.003001 | 11,470.6528 | $34.43 | |
BSC | <0.01% | $0.77472 | 44.3198 | $34.34 | |
BSC | <0.01% | $0.17406 | 196.8034 | $34.26 | |
BSC | <0.01% | $0.056343 | 606.0722 | $34.15 | |
BSC | <0.01% | $0.000017 | 1,955,590.4407 | $33.97 | |
BSC | <0.01% | <$0.000001 | 961,731,068.415 | $33.72 | |
BSC | <0.01% | $0.83163 | 40.1485 | $33.39 | |
BSC | <0.01% | $0.594313 | 55.7836 | $33.15 | |
BSC | <0.01% | $0.000001 | 41,420,378.5075 | $33.07 | |
BSC | <0.01% | $0.039618 | 826.1256 | $32.73 | |
BSC | <0.01% | $0.128166 | 252.5569 | $32.37 | |
BSC | <0.01% | $0.000589 | 54,674.7794 | $32.18 | |
BSC | <0.01% | $0.040888 | 780.3882 | $31.91 | |
BSC | <0.01% | $2.61 | 12.0948 | $31.59 | |
BSC | <0.01% | $0.009505 | 3,317.5536 | $31.53 | |
BSC | <0.01% | $0.003171 | 9,919.4378 | $31.45 | |
BSC | <0.01% | $0.232914 | 134.9928 | $31.44 | |
BSC | <0.01% | $0.002958 | 10,525.6962 | $31.13 | |
BSC | <0.01% | $0.000021 | 1,488,552.587 | $31.05 | |
BSC | <0.01% | $0.025446 | 1,209.572 | $30.78 | |
BSC | <0.01% | $0.482691 | 62.8675 | $30.35 | |
BSC | <0.01% | $0.017333 | 1,749.2428 | $30.32 | |
BSC | <0.01% | $0.000036 | 838,816.9865 | $29.97 | |
BSC | <0.01% | $0.104433 | 284.3847 | $29.7 | |
BSC | <0.01% | $0.023996 | 1,229.1164 | $29.49 | |
BSC | <0.01% | $0.034973 | 842.5932 | $29.47 | |
BSC | <0.01% | $0.000064 | 458,164.9555 | $29.25 | |
BSC | <0.01% | <$0.000001 | 72,833,535,631.4516 | $29.13 | |
BSC | <0.01% | $0.000003 | 9,822,171.7935 | $28.88 | |
BSC | <0.01% | $0.012982 | 2,221.4584 | $28.84 | |
BSC | <0.01% | $0.084261 | 340.3585 | $28.68 | |
BSC | <0.01% | $2.75 | 10.4261 | $28.67 | |
BSC | <0.01% | $0.196996 | 145.0463 | $28.57 | |
BSC | <0.01% | $0.00536 | 5,314.955 | $28.49 | |
BSC | <0.01% | $0.073532 | 386.7599 | $28.44 | |
BSC | <0.01% | $0.012884 | 2,206.4234 | $28.43 | |
BSC | <0.01% | <$0.000001 | 2,826,026,305.626 | $28.37 | |
BSC | <0.01% | $0.088213 | 320.2531 | $28.25 | |
BSC | <0.01% | $0.003328 | 8,481.2323 | $28.22 | |
BSC | <0.01% | $0.061894 | 455.8668 | $28.22 | |
BSC | <0.01% | $0.057941 | 483.468 | $28.01 | |
BSC | <0.01% | $0.00007 | 397,424.0782 | $27.78 | |
BSC | <0.01% | $0.003359 | 8,169.0822 | $27.44 | |
BSC | <0.01% | $0.006858 | 3,993.575 | $27.39 | |
BSC | <0.01% | $0.024041 | 1,138.6975 | $27.38 | |
BSC | <0.01% | $0.269487 | 101.4142 | $27.33 | |
BSC | <0.01% | $0.041881 | 648.2512 | $27.15 | |
BSC | <0.01% | $0.000005 | 5,134,038.547 | $27.13 | |
BSC | <0.01% | $0.00851 | 3,163.8179 | $26.92 | |
BSC | <0.01% | $0.000456 | 58,929.9324 | $26.87 | |
BSC | <0.01% | $0.00014 | 189,114.5711 | $26.55 | |
BSC | <0.01% | $0.056239 | 470.6343 | $26.47 | |
BSC | <0.01% | $0.002677 | 9,824.8564 | $26.3 | |
BSC | <0.01% | $5.9 | 4.3942 | $25.92 | |
BSC | <0.01% | $0.020134 | 1,283.325 | $25.84 | |
BSC | <0.01% | $0.161543 | 158.8012 | $25.65 | |
BSC | <0.01% | $0.009321 | 2,742.0974 | $25.56 | |
BSC | <0.01% | $0.107561 | 237.3139 | $25.53 | |
BSC | <0.01% | $0.118833 | 211.1937 | $25.1 | |
BSC | <0.01% | $0.080129 | 313.1433 | $25.09 | |
BSC | <0.01% | <$0.000001 | 1,353,598,652.5042 | $25.09 | |
BSC | <0.01% | $2.42 | 10.3663 | $25.03 | |
BSC | <0.01% | $0.000551 | 45,167.3737 | $24.89 | |
BSC | <0.01% | $0.003063 | 8,001.7868 | $24.51 | |
BSC | <0.01% | $0.003102 | 7,901.763 | $24.51 | |
BSC | <0.01% | $0.000008 | 2,957,664.8238 | $24.37 | |
BSC | <0.01% | $1.77 | 13.7508 | $24.34 | |
BSC | <0.01% | $0.000845 | 28,752.0022 | $24.3 | |
BSC | <0.01% | $1.45 | 16.7431 | $24.28 | |
BSC | <0.01% | $0.01236 | 1,963.8473 | $24.27 | |
BSC | <0.01% | $0.000143 | 169,140.5788 | $24.17 | |
BSC | <0.01% | $2.7 | 8.8573 | $23.91 | |
BSC | <0.01% | $0.000198 | 119,992.2177 | $23.78 | |
BSC | <0.01% | $0.001242 | 19,058.3704 | $23.68 | |
BSC | <0.01% | $0.001471 | 16,025.4608 | $23.58 | |
BSC | <0.01% | $0.000356 | 65,694.703 | $23.36 | |
BSC | <0.01% | $0.000082 | 283,748.6948 | $23.33 | |
BSC | <0.01% | $0.000458 | 50,872.5546 | $23.31 | |
BSC | <0.01% | $0.036923 | 628.5776 | $23.21 | |
BSC | <0.01% | $0.000595 | 38,144.4072 | $22.7 | |
BSC | <0.01% | $0.013174 | 1,704.5368 | $22.46 | |
BSC | <0.01% | $0.538494 | 41.6836 | $22.45 | |
BSC | <0.01% | $0.105652 | 210.553 | $22.25 | |
BSC | <0.01% | <$0.000001 | 8,461,333,420.4388 | $22.13 | |
BSC | <0.01% | <$0.000001 | 374,123,433.3267 | $21.86 | |
BSC | <0.01% | $0.000472 | 46,286.663 | $21.83 | |
BSC | <0.01% | $0.000084 | 260,026.7884 | $21.77 | |
BSC | <0.01% | $0.000101 | 215,038.9642 | $21.75 | |
BSC | <0.01% | $0.132357 | 164.087 | $21.72 | |
BSC | <0.01% | $0.297882 | 72.7672 | $21.68 | |
BSC | <0.01% | $0.107272 | 201.7399 | $21.64 | |
BSC | <0.01% | $0.000589 | 36,623.6882 | $21.56 | |
BSC | <0.01% | $0.001605 | 13,334.927 | $21.4 | |
BSC | <0.01% | $0.195099 | 109.5855 | $21.38 | |
BSC | <0.01% | <$0.000001 | 244,367,911.1566 | $21.38 | |
BSC | <0.01% | $0.070976 | 299.068 | $21.23 | |
BSC | <0.01% | $0.002023 | 10,418.2024 | $21.07 | |
BSC | <0.01% | $0.200478 | 104.0375 | $20.86 | |
BSC | <0.01% | $5.18 | 4.0058 | $20.75 | |
BSC | <0.01% | <$0.000001 | 98,234,470.2489 | $20.49 | |
BSC | <0.01% | $0.00838 | 2,436.292 | $20.42 | |
BSC | <0.01% | $0.040998 | 492.7361 | $20.2 | |
BSC | <0.01% | <$0.000001 | 63,404,362.4491 | $20.2 | |
BSC | <0.01% | $1.95 | 10.3712 | $20.2 | |
BSC | <0.01% | $0.001361 | 14,822.4079 | $20.17 | |
BSC | <0.01% | $0.000095 | 211,566.216 | $20.1 | |
BSC | <0.01% | <$0.000001 | 54,904,640,076.6182 | $20.01 | |
BSC | <0.01% | $0.193343 | 101.0117 | $19.53 | |
BSC | <0.01% | $0.011179 | 1,745.4356 | $19.51 | |
BSC | <0.01% | $0.000062 | 314,762.8013 | $19.47 | |
BSC | <0.01% | $0.00904 | 2,138.9275 | $19.34 | |
BSC | <0.01% | $0.211856 | 90.8068 | $19.24 | |
BSC | <0.01% | $0.001996 | 9,630.2629 | $19.22 | |
BSC | <0.01% | $0.011976 | 1,599.1176 | $19.15 | |
BSC | <0.01% | $0.002416 | 7,790.5136 | $18.82 | |
BSC | <0.01% | $0.003873 | 4,837.2649 | $18.73 | |
BSC | <0.01% | $0.160765 | 116.1467 | $18.67 | |
BSC | <0.01% | $1.2 | 15.4569 | $18.52 | |
BSC | <0.01% | <$0.000001 | 2,247,845,603.7477 | $18.51 | |
BSC | <0.01% | $0.000304 | 60,584.7442 | $18.41 | |
BSC | <0.01% | $0.000203 | 90,080.5865 | $18.32 | |
BSC | <0.01% | $0.030771 | 593.9478 | $18.28 | |
BSC | <0.01% | $0.015323 | 1,187.6598 | $18.2 | |
BSC | <0.01% | <$0.000001 | 54,774,351,570.5316 | $18.09 | |
BSC | <0.01% | $250.48 | 0.0719 | $18.02 | |
BSC | <0.01% | $0.06067 | 296.133 | $17.97 | |
BSC | <0.01% | $0.005644 | 3,180.9728 | $17.95 | |
BSC | <0.01% | $0.0009 | 19,891.6541 | $17.9 | |
BSC | <0.01% | $0.003121 | 5,667.4058 | $17.69 | |
BSC | <0.01% | $0.002878 | 6,124.2235 | $17.62 | |
BSC | <0.01% | $1.6 | 11.0153 | $17.62 | |
BSC | <0.01% | $0.000567 | 31,021.5991 | $17.59 | |
BSC | <0.01% | $1.83 | 9.4811 | $17.35 | |
BSC | <0.01% | $0.000126 | 135,458.9998 | $17.12 | |
BSC | <0.01% | $148.27 | 0.1144 | $16.96 | |
BSC | <0.01% | $0.000061 | 275,500.9 | $16.92 | |
BSC | <0.01% | $2.12 | 7.984 | $16.89 | |
BSC | <0.01% | $0.000238 | 70,727.5957 | $16.82 | |
BSC | <0.01% | $0.00004 | 415,343.1684 | $16.73 | |
BSC | <0.01% | $1.48 | 11.2824 | $16.7 | |
BSC | <0.01% | $5,096.11 | 0.00327276 | $16.68 | |
BSC | <0.01% | $0.000026 | 636,092.9855 | $16.53 | |
BSC | <0.01% | $0.008069 | 2,038.7858 | $16.45 | |
BSC | <0.01% | <$0.000001 | 167,577,264.5632 | $16.41 | |
BSC | <0.01% | $0.127938 | 128.0791 | $16.39 | |
BSC | <0.01% | $0.000029 | 568,968.7692 | $16.29 | |
BSC | <0.01% | $0.993136 | 16.1824 | $16.07 | |
BSC | <0.01% | $0.000396 | 39,927.6241 | $15.81 | |
BSC | <0.01% | $0.009084 | 1,733.3851 | $15.75 | |
BSC | <0.01% | $0.6594 | 23.8221 | $15.71 | |
BSC | <0.01% | <$0.000001 | 4,231,787,319.3555 | $15.66 | |
BSC | <0.01% | $0.018257 | 856.8585 | $15.64 | |
BSC | <0.01% | $0.000337 | 46,275.9285 | $15.6 | |
BSC | <0.01% | $0.013703 | 1,137.5892 | $15.59 | |
BSC | <0.01% | $1 | 15.5703 | $15.58 | |
BSC | <0.01% | $0.020403 | 760.1523 | $15.51 | |
BSC | <0.01% | $0.000082 | 189,577.299 | $15.51 | |
BSC | <0.01% | $0.092893 | 166.7093 | $15.49 | |
BSC | <0.01% | $0.003458 | 4,467.9146 | $15.45 | |
BSC | <0.01% | $0.001377 | 11,210.1363 | $15.43 | |
BSC | <0.01% | <$0.000001 | 1,211,850,092.1955 | $15.41 | |
BSC | <0.01% | $0.002179 | 7,023.2699 | $15.31 | |
BSC | <0.01% | $0.007136 | 2,124.573 | $15.16 | |
BSC | <0.01% | $1 | 15.064 | $15.06 | |
BSC | <0.01% | $11.59 | 1.2959 | $15.02 | |
BSC | <0.01% | $0.081511 | 183.0789 | $14.92 | |
BSC | <0.01% | $0.077315 | 192.517 | $14.88 | |
BSC | <0.01% | <$0.000001 | 44,052,396,141.0879 | $14.83 | |
BSC | <0.01% | $0.007865 | 1,879.4465 | $14.78 | |
BSC | <0.01% | $2.69 | 5.4642 | $14.7 | |
BSC | <0.01% | $0.002504 | 5,863.2722 | $14.68 | |
BSC | <0.01% | $0.000014 | 1,037,943.6658 | $14.61 | |
BSC | <0.01% | $0.008696 | 1,678.4379 | $14.6 | |
BSC | <0.01% | $0.000001 | 21,620,199.1574 | $14.59 | |
BSC | <0.01% | $0.038551 | 375.0169 | $14.46 | |
BSC | <0.01% | $0.000537 | 26,662.7985 | $14.32 | |
BSC | <0.01% | $0.904967 | 15.6803 | $14.19 | |
BSC | <0.01% | $0.00065 | 21,788.8328 | $14.16 | |
BSC | <0.01% | $0.000052 | 269,743.9597 | $14.06 | |
BSC | <0.01% | <$0.000001 | 60,409,441,058.2754 | $14.03 | |
BSC | <0.01% | $0.000499 | 28,032.6249 | $13.99 | |
BSC | <0.01% | $0.040176 | 347.8623 | $13.98 | |
BSC | <0.01% | $0.008676 | 1,610.549 | $13.97 | |
BSC | <0.01% | $0.000367 | 38,012.0011 | $13.94 | |
BSC | <0.01% | <$0.000001 | 966,313,729.794 | $13.92 | |
BSC | <0.01% | $5.35 | 2.5747 | $13.77 | |
BSC | <0.01% | <$0.000001 | 10,564,444,578.6513 | $13.74 | |
BSC | <0.01% | $0.000802 | 16,968.3806 | $13.61 | |
BSC | <0.01% | $0.002755 | 4,935.9772 | $13.6 | |
BSC | <0.01% | $0.020451 | 663.0376 | $13.56 | |
BSC | <0.01% | $0.000052 | 259,974.7534 | $13.49 | |
BSC | <0.01% | $0.01381 | 971.8889 | $13.42 | |
BSC | <0.01% | $0.004092 | 3,255.4997 | $13.32 | |
BSC | <0.01% | $0.104339 | 127.3515 | $13.29 | |
BSC | <0.01% | $0.001158 | 11,471.3917 | $13.28 | |
BSC | <0.01% | $0.005114 | 2,564.5265 | $13.11 | |
BSC | <0.01% | $1 | 13.0379 | $13.05 | |
BSC | <0.01% | $0.057543 | 226.5629 | $13.04 | |
BSC | <0.01% | <$0.000001 | 13,834,237,048.8199 | $12.98 | |
BSC | <0.01% | $0.001834 | 7,022.3377 | $12.88 | |
BSC | <0.01% | $0.000049 | 262,910.5323 | $12.85 | |
BSC | <0.01% | $1.02 | 12.5731 | $12.76 | |
BSC | <0.01% | $0.703725 | 18.0285 | $12.69 | |
BSC | <0.01% | $0.049382 | 256.7894 | $12.68 | |
BSC | <0.01% | <$0.000001 | 12,660,137,395,676,246,000 | $12.66 | |
BSC | <0.01% | $0.153993 | 82.2081 | $12.66 | |
BSC | <0.01% | $0.006181 | 2,047.3605 | $12.65 | |
BSC | <0.01% | $4.01 | 3.1128 | $12.48 | |
BSC | <0.01% | $0.134027 | 93.0312 | $12.47 | |
BSC | <0.01% | $0.003236 | 3,841.47 | $12.43 | |
BSC | <0.01% | $0.002208 | 5,629.2159 | $12.43 | |
BSC | <0.01% | $104,204 | 0.00011906 | $12.41 | |
BSC | <0.01% | $0.000124 | 99,984.8018 | $12.37 | |
BSC | <0.01% | $0.002978 | 4,077.4636 | $12.14 | |
BSC | <0.01% | <$0.000001 | 38,796,325,871.4071 | $12.08 | |
BSC | <0.01% | $0.000543 | 22,184.9877 | $12.04 | |
BSC | <0.01% | $0.008023 | 1,500.4249 | $12.04 | |
BSC | <0.01% | $0.397686 | 30.1212 | $11.98 | |
BSC | <0.01% | $0.004571 | 2,617.3414 | $11.96 | |
BSC | <0.01% | $0.022752 | 524.3662 | $11.93 | |
BSC | <0.01% | $1.05 | 11.264 | $11.86 | |
BSC | <0.01% | $0.001676 | 7,073.1935 | $11.85 | |
BSC | <0.01% | $0.064549 | 182.4673 | $11.78 | |
BSC | <0.01% | <$0.000001 | 25,216,064,553.5752 | $11.65 | |
BSC | <0.01% | $0.002487 | 4,680.7182 | $11.64 | |
BSC | <0.01% | $0.000721 | 16,124.7874 | $11.62 | |
BSC | <0.01% | $0.009354 | 1,224.4329 | $11.45 | |
BSC | <0.01% | $0.814018 | 14.0209 | $11.41 | |
BSC | <0.01% | $0.004706 | 2,424.2046 | $11.41 | |
BSC | <0.01% | $0.016484 | 691.9722 | $11.41 | |
BSC | <0.01% | $0.431093 | 26.3555 | $11.36 | |
BSC | <0.01% | $0.073497 | 153.7928 | $11.3 | |
BSC | <0.01% | $0.180339 | 62.5185 | $11.27 | |
BSC | <0.01% | $0.000009 | 1,193,267.3086 | $11.22 | |
BSC | <0.01% | $0.344393 | 32.5211 | $11.2 | |
BSC | <0.01% | $0.101906 | 109.33 | $11.14 | |
BSC | <0.01% | $0.010391 | 1,072.0029 | $11.14 | |
BSC | <0.01% | $0.002792 | 3,966.7878 | $11.07 | |
BSC | <0.01% | $0.027325 | 404.1734 | $11.04 | |
BSC | <0.01% | $0.002008 | 5,498.5582 | $11.04 | |
BSC | <0.01% | <$0.000001 | 25,018,674,024.6472 | $10.95 | |
BSC | <0.01% | $0.002655 | 4,104.3121 | $10.9 | |
BSC | <0.01% | $0.0001 | 108,764.3911 | $10.86 | |
BSC | <0.01% | $0.000239 | 45,418.423 | $10.86 | |
BSC | <0.01% | $0.486802 | 22.2134 | $10.81 | |
BSC | <0.01% | $0.021919 | 487.4571 | $10.68 | |
BSC | <0.01% | <$0.000001 | 1,478,415,485,566.3135 | $10.5 | |
BSC | <0.01% | $0.000483 | 21,563.1888 | $10.41 | |
BSC | <0.01% | $3.33 | 3.1066 | $10.35 | |
BSC | <0.01% | $705.28 | 0.0146 | $10.28 | |
BSC | <0.01% | $396.82 | 0.0259 | $10.28 | |
BSC | <0.01% | $0.013894 | 736.3675 | $10.23 | |
BSC | <0.01% | $0.000309 | 32,971.5584 | $10.18 | |
BSC | <0.01% | $0.003601 | 2,795.8345 | $10.07 | |
BSC | <0.01% | $0.000087 | 115,714.9366 | $10.06 | |
BSC | <0.01% | $0.999321 | 10.0092 | $10 | |
BSC | <0.01% | $104,218 | 0.00009548 | $9.95 | |
BSC | <0.01% | $0.002765 | 3,590.5105 | $9.93 | |
BSC | <0.01% | $0.000118 | 84,335.2528 | $9.92 | |
BSC | <0.01% | $0.025311 | 389.9516 | $9.87 | |
BSC | <0.01% | <$0.000001 | 31,878,321,145.2469 | $9.85 | |
BSC | <0.01% | $0.79102 | 12.3986 | $9.81 | |
BSC | <0.01% | $0.000065 | 149,043.2805 | $9.72 | |
BSC | <0.01% | $0.000019 | 504,661.6395 | $9.7 | |
BSC | <0.01% | $7.22 | 1.3323 | $9.62 | |
BSC | <0.01% | <$0.000001 | 6,252,254,017.4027 | $9.55 | |
BSC | <0.01% | $0.00158 | 6,028.2815 | $9.52 | |
BSC | <0.01% | $0.000017 | 565,240.375 | $9.48 | |
BSC | <0.01% | $0.021946 | 430.3913 | $9.45 | |
BSC | <0.01% | $0.010108 | 931.8978 | $9.42 | |
BSC | <0.01% | $0.072782 | 128.538 | $9.36 | |
BSC | <0.01% | $2,481.54 | 0.00374013 | $9.28 | |
BSC | <0.01% | $0.000001 | 11,626,830.1527 | $9.26 | |
BSC | <0.01% | $0.001432 | 6,366.5914 | $9.11 | |
BSC | <0.01% | $0.008891 | 1,020.6301 | $9.07 | |
BSC | <0.01% | $0.126168 | 71.9095 | $9.07 | |
BSC | <0.01% | $0.016478 | 549.7399 | $9.06 | |
BSC | <0.01% | $0.019066 | 473.3135 | $9.02 | |
BSC | <0.01% | $0.000165 | 54,371.2105 | $8.99 | |
BSC | <0.01% | $0.000156 | 57,174.2087 | $8.91 | |
BSC | <0.01% | $0.000151 | 59,126.9718 | $8.91 | |
BSC | <0.01% | $0.010502 | 841.7771 | $8.84 | |
BSC | <0.01% | <$0.000001 | 2,188,975,933,671.4365 | $8.81 | |
BSC | <0.01% | $0.009771 | 891.6418 | $8.71 | |
BSC | <0.01% | $0.000561 | 15,371.3945 | $8.63 | |
BSC | <0.01% | $0.074148 | 115.975 | $8.6 | |
BSC | <0.01% | $11.72 | 0.7286 | $8.54 | |
BSC | <0.01% | $0.001221 | 6,971.9974 | $8.51 | |
BSC | <0.01% | $0.087208 | 96.7674 | $8.44 | |
BSC | <0.01% | $0.017057 | 493.0869 | $8.41 | |
BSC | <0.01% | $0.000187 | 44,900.8273 | $8.38 | |
BSC | <0.01% | <$0.000001 | 2,471,330,302.717 | $8.26 | |
BSC | <0.01% | <$0.000001 | 8,789,872,354.7045 | $8.26 | |
BSC | <0.01% | $0.009803 | 839.3873 | $8.23 | |
BSC | <0.01% | $0.00097 | 8,437.5459 | $8.19 | |
BSC | <0.01% | $0.782571 | 10.3964 | $8.14 | |
BSC | <0.01% | $0.047407 | 170.5176 | $8.08 | |
BSC | <0.01% | $0.000003 | 2,892,715.5854 | $8.07 | |
BSC | <0.01% | $1.05 | 7.6681 | $8.05 | |
BSC | <0.01% | $0.002285 | 3,488.4995 | $7.97 | |
BSC | <0.01% | $0.01056 | 749.1385 | $7.91 | |
BSC | <0.01% | $0.003998 | 1,972.9072 | $7.89 | |
BSC | <0.01% | $0.154661 | 50.3943 | $7.79 | |
BSC | <0.01% | $0.000284 | 27,168.173 | $7.72 | |
BSC | <0.01% | $0.002329 | 3,312.7312 | $7.72 | |
BSC | <0.01% | $0.000255 | 30,206.6696 | $7.69 | |
BSC | <0.01% | $0.000291 | 26,363.113 | $7.68 | |
BSC | <0.01% | $0.000178 | 42,797.6344 | $7.64 | |
BSC | <0.01% | $0.001212 | 6,279.9455 | $7.61 | |
BSC | <0.01% | $0.000199 | 38,159.7599 | $7.59 | |
BSC | <0.01% | $0.001065 | 7,045.8832 | $7.51 | |
BSC | <0.01% | $0.011178 | 669.9093 | $7.49 | |
BSC | <0.01% | $0.001034 | 7,221.4631 | $7.46 | |
BSC | <0.01% | $0.001122 | 6,638.336 | $7.45 | |
BSC | <0.01% | $0.007403 | 999.4375 | $7.4 | |
BSC | <0.01% | $0.000142 | 51,638.1952 | $7.32 | |
BSC | <0.01% | $0.004579 | 1,573.2448 | $7.2 | |
BSC | <0.01% | $0.000612 | 11,671.3513 | $7.14 | |
BSC | <0.01% | $0.001585 | 4,503.4288 | $7.14 | |
BSC | <0.01% | $0.013696 | 512.1032 | $7.01 | |
BSC | <0.01% | $0.003699 | 1,885.6417 | $6.97 | |
BSC | <0.01% | $0.000001 | 8,158,551.9902 | $6.94 | |
BSC | <0.01% | <$0.000001 | 164,425,495.9435 | $6.85 | |
BSC | <0.01% | $0.000002 | 2,956,819.9859 | $6.84 | |
BSC | <0.01% | $0.018797 | 362.0441 | $6.81 | |
BSC | <0.01% | $0.000037 | 182,582.1718 | $6.79 | |
BSC | <0.01% | $0.000553 | 12,256.6518 | $6.78 | |
BSC | <0.01% | <$0.000001 | 41,130,825.8254 | $6.76 | |
BSC | <0.01% | <$0.000001 | 11,146,156,327.8583 | $6.73 | |
BSC | <0.01% | <$0.000001 | 2,167,002,845.7846 | $6.71 | |
BSC | <0.01% | $17.17 | 0.3893 | $6.68 | |
BSC | <0.01% | $0.001213 | 5,502.3766 | $6.67 | |
BSC | <0.01% | $2.21 | 2.988 | $6.61 | |
BSC | <0.01% | $0.000226 | 28,912.1161 | $6.54 | |
BSC | <0.01% | $0.071808 | 90.9145 | $6.53 | |
BSC | <0.01% | $0.004083 | 1,577.5649 | $6.44 | |
BSC | <0.01% | $0.001303 | 4,894.9265 | $6.38 | |
BSC | <0.01% | $0.00353 | 1,780.125 | $6.28 | |
BSC | <0.01% | $0.359408 | 17.3645 | $6.24 | |
BSC | <0.01% | $0.005957 | 1,040.0214 | $6.2 | |
BSC | <0.01% | $0.000259 | 23,699.9656 | $6.14 | |
BSC | <0.01% | $0.120441 | 50.4376 | $6.07 | |
BSC | <0.01% | $0.00008 | 75,467.7148 | $6.07 | |
BSC | <0.01% | $0.014717 | 410.0411 | $6.03 | |
BSC | <0.01% | $1 | 5.9778 | $5.98 | |
BSC | <0.01% | $0.000523 | 11,384.8931 | $5.95 | |
BSC | <0.01% | $0.000093 | 63,307.4479 | $5.89 | |
BSC | <0.01% | $0.018534 | 317.7117 | $5.89 | |
BSC | <0.01% | $0.002521 | 2,329.2241 | $5.87 | |
BSC | <0.01% | $0.000337 | 17,267.9685 | $5.83 | |
BSC | <0.01% | <$0.000001 | 39,838,369,485.5743 | $5.82 | |
BSC | <0.01% | $0.006578 | 870.4153 | $5.73 | |
BSC | <0.01% | <$0.000001 | 9,633,510,332.468 | $5.71 | |
BSC | <0.01% | $2.15 | 2.6576 | $5.71 | |
BSC | <0.01% | $3.11 | 1.8301 | $5.69 | |
BSC | <0.01% | $0.122276 | 46.4586 | $5.68 | |
BSC | <0.01% | $0.007942 | 713.2634 | $5.66 | |
BSC | <0.01% | $0.072655 | 77.236 | $5.61 | |
BSC | <0.01% | $0.008703 | 639.7408 | $5.57 | |
BSC | <0.01% | <$0.000001 | 45,219,284,562.1832 | $5.53 | |
BSC | <0.01% | $0.000541 | 10,099.1137 | $5.46 | |
BSC | <0.01% | $0.048884 | 111.4761 | $5.45 | |
BSC | <0.01% | $0.000106 | 51,454.2158 | $5.44 | |
BSC | <0.01% | $0.222578 | 23.9668 | $5.33 | |
BSC | <0.01% | $0.270613 | 19.353 | $5.24 | |
BSC | <0.01% | $0.015937 | 327.0513 | $5.21 | |
BSC | <0.01% | $0.002396 | 2,142.451 | $5.13 | |
BSC | <0.01% | $0.056343 | 90.346 | $5.09 | |
BSC | <0.01% | $0.000015 | 329,959.5078 | $5.09 | |
BSC | <0.01% | $0.004731 | 1,074.1206 | $5.08 | |
BSC | <0.01% | $0.009988 | 502.0467 | $5.01 | |
BSC | <0.01% | $0.008754 | 571.8318 | $5.01 | |
BSC | <0.01% | $0.00022 | 22,524.8318 | $4.96 | |
BSC | <0.01% | $0.054711 | 90.2749 | $4.94 | |
BSC | <0.01% | $0.000141 | 34,644.6934 | $4.87 | |
BSC | <0.01% | $0.999898 | 4.7985 | $4.8 | |
BSC | <0.01% | $0.000312 | 15,320.8784 | $4.77 | |
BSC | <0.01% | $0.002383 | 1,987.9732 | $4.74 | |
BSC | <0.01% | $0.290586 | 16.1182 | $4.68 | |
BSC | <0.01% | $0.000001 | 5,581,896.5011 | $4.63 | |
BSC | <0.01% | $0.00229 | 2,014.9861 | $4.62 | |
BSC | <0.01% | $0.000001 | 8,658,722.5834 | $4.61 | |
BSC | <0.01% | $0.53585 | 8.5723 | $4.59 | |
BSC | <0.01% | $0.000129 | 35,473.2238 | $4.59 | |
BSC | <0.01% | $0.001362 | 3,346.3747 | $4.56 | |
BSC | <0.01% | $0.000002 | 2,728,134.8657 | $4.5 | |
BSC | <0.01% | $0.000268 | 16,754.2015 | $4.49 | |
BSC | <0.01% | $0.00152 | 2,919.139 | $4.44 | |
BSC | <0.01% | $0.000429 | 10,331.4141 | $4.43 | |
BSC | <0.01% | $0.000449 | 9,854.5639 | $4.42 | |
BSC | <0.01% | $0.001853 | 2,358.0367 | $4.37 | |
BSC | <0.01% | <$0.000001 | 8,712,597,437,202.0732 | $4.37 | |
BSC | <0.01% | $0.000041 | 106,805.9021 | $4.36 | |
BSC | <0.01% | $0.014005 | 310.429 | $4.35 | |
BSC | <0.01% | $0.156996 | 27.4007 | $4.3 | |
BSC | <0.01% | <$0.000001 | 1,510,737,338.077 | $4.3 | |
BSC | <0.01% | $0.006114 | 701.437 | $4.29 | |
BSC | <0.01% | $0.000032 | 130,568.6933 | $4.23 | |
BSC | <0.01% | $0.00275 | 1,531.6048 | $4.21 | |
BSC | <0.01% | <$0.000001 | 31,513,429.5586 | $4.2 | |
BSC | <0.01% | $0.003302 | 1,259.6729 | $4.16 | |
BSC | <0.01% | $0.928245 | 4.4627 | $4.14 | |
BSC | <0.01% | $0.00004 | 104,020.0064 | $4.14 | |
BSC | <0.01% | $0.000424 | 9,665.315 | $4.1 | |
BSC | <0.01% | <$0.000001 | 34,247,462,354.0704 | $3.99 | |
BSC | <0.01% | $0.000444 | 8,935.0506 | $3.97 | |
BSC | <0.01% | $0.005153 | 764.1269 | $3.94 | |
BSC | <0.01% | $0.983988 | 3.9784 | $3.91 | |
BSC | <0.01% | $0.002759 | 1,404.1466 | $3.87 | |
BSC | <0.01% | $0.000002 | 1,889,339.6805 | $3.87 | |
BSC | <0.01% | $1.41 | 2.7349 | $3.86 | |
BSC | <0.01% | $0.003941 | 972.3635 | $3.83 | |
BSC | <0.01% | $0.000016 | 232,234.0322 | $3.83 | |
BSC | <0.01% | $51.64 | 0.0725 | $3.74 | |
BSC | <0.01% | $0.000977 | 3,806.1646 | $3.72 | |
BSC | <0.01% | $0.001073 | 3,463.5216 | $3.72 | |
BSC | <0.01% | $0.02165 | 171.4579 | $3.71 | |
BSC | <0.01% | $0.000159 | 23,136.4854 | $3.68 | |
BSC | <0.01% | $102,563 | 0.00003575 | $3.67 | |
BSC | <0.01% | $0.006477 | 562.4992 | $3.64 | |
BSC | <0.01% | $2.36 | 1.5401 | $3.64 | |
BSC | <0.01% | <$0.000001 | 19,671,846,572.1976 | $3.62 | |
BSC | <0.01% | <$0.000001 | 1,600,025,187.6194 | $3.6 | |
BSC | <0.01% | <$0.000001 | 3,260,461,474.3296 | $3.58 | |
BSC | <0.01% | $0.001386 | 2,575.1711 | $3.57 | |
BSC | <0.01% | $0.000007 | 488,897.9932 | $3.53 | |
BSC | <0.01% | $0.00038 | 9,247.4108 | $3.52 | |
BSC | <0.01% | $0.002948 | 1,192.0726 | $3.51 | |
BSC | <0.01% | $0.000044 | 78,941.9074 | $3.51 | |
BSC | <0.01% | $0.683396 | 5.0824 | $3.47 | |
BSC | <0.01% | $0.129047 | 26.8366 | $3.46 | |
BSC | <0.01% | $0.02204 | 156.5656 | $3.45 | |
BSC | <0.01% | $0.002598 | 1,315.3851 | $3.42 | |
BSC | <0.01% | $0.000015 | 230,439.5415 | $3.42 | |
BSC | <0.01% | $0.000023 | 147,575.0208 | $3.42 | |
BSC | <0.01% | $0.036661 | 92.0843 | $3.38 | |
BSC | <0.01% | <$0.000001 | 30,774,899.7886 | $3.37 | |
BSC | <0.01% | $0.000004 | 787,204.3388 | $3.35 | |
BSC | <0.01% | $1.3 | 2.5513 | $3.32 | |
BSC | <0.01% | $0.00219 | 1,494.71 | $3.27 | |
BSC | <0.01% | $0.012892 | 251.2191 | $3.24 | |
BSC | <0.01% | $0.000634 | 5,083.589 | $3.22 | |
BSC | <0.01% | <$0.000001 | 11,388,626.7031 | $3.21 | |
BSC | <0.01% | $0.000763 | 4,206.4084 | $3.21 | |
BSC | <0.01% | $0.000002 | 1,636,077.0699 | $3.21 | |
BSC | <0.01% | $0.00095 | 3,372.452 | $3.2 | |
BSC | <0.01% | $0.000313 | 10,166.9256 | $3.18 | |
BSC | <0.01% | $0.000007 | 463,119.5354 | $3.17 | |
BSC | <0.01% | $0.275811 | 11.4637 | $3.16 | |
BSC | <0.01% | $0.004516 | 692.0738 | $3.13 | |
BSC | <0.01% | $8.25 | 0.3788 | $3.12 | |
BSC | <0.01% | $0.018826 | 165.7846 | $3.12 | |
BSC | <0.01% | $0.000011 | 293,930.651 | $3.1 | |
BSC | <0.01% | $0.002049 | 1,512.6824 | $3.1 | |
BSC | <0.01% | $0.004799 | 645.9092 | $3.1 | |
BSC | <0.01% | $0.018955 | 161.5912 | $3.06 | |
BSC | <0.01% | $0.00046 | 6,638.8089 | $3.06 | |
BSC | <0.01% | $0.000001 | 3,183,393.9936 | $3.05 | |
BSC | <0.01% | $0.003032 | 1,004.7192 | $3.05 | |
BSC | <0.01% | $0.030446 | 99.2358 | $3.02 | |
BSC | <0.01% | $0.00375 | 790.2559 | $2.96 | |
BSC | <0.01% | <$0.000001 | 5,955,167.4089 | $2.95 | |
BSC | <0.01% | <$0.000001 | 2,231,023,207.5961 | $2.95 | |
BSC | <0.01% | $0.01188 | 247.8142 | $2.94 | |
BSC | <0.01% | $0.002013 | 1,460.4173 | $2.94 | |
BSC | <0.01% | $98,100 | 0.00002991 | $2.93 | |
BSC | <0.01% | $0.002883 | 1,012.0398 | $2.92 | |
BSC | <0.01% | $0.000001 | 3,249,288.7104 | $2.92 | |
BSC | <0.01% | $0.051337 | 56.7748 | $2.91 | |
BSC | <0.01% | $0.000003 | 863,933.7528 | $2.91 | |
BSC | <0.01% | $0.001419 | 2,045.9028 | $2.9 | |
BSC | <0.01% | $0.013695 | 212 | $2.9 | |
BSC | <0.01% | $0.000114 | 25,319.4913 | $2.88 | |
BSC | <0.01% | $0.000812 | 3,517.5857 | $2.86 | |
BSC | <0.01% | $0.000281 | 10,072.4217 | $2.83 | |
BSC | <0.01% | $0.006657 | 425.3248 | $2.83 | |
BSC | <0.01% | $0.000378 | 7,452.2186 | $2.82 | |
BSC | <0.01% | $0.020772 | 135.7566 | $2.82 | |
BSC | <0.01% | $0.001429 | 1,972.3009 | $2.82 | |
BSC | <0.01% | $0.002913 | 943.1083 | $2.75 | |
BSC | <0.01% | $0.000655 | 4,149.7841 | $2.72 | |
BSC | <0.01% | $2.16 | 1.2495 | $2.7 | |
BSC | <0.01% | $0.008363 | 320.4708 | $2.68 | |
BSC | <0.01% | $0.002111 | 1,269.1706 | $2.68 | |
BSC | <0.01% | $0.00003 | 87,649.298 | $2.66 | |
BSC | <0.01% | $0.32655 | 8.1194 | $2.65 | |
BSC | <0.01% | $0.000994 | 2,600.3832 | $2.58 | |
BSC | <0.01% | $0.000075 | 34,285.5578 | $2.58 | |
BSC | <0.01% | $0.000497 | 5,103.7104 | $2.54 | |
BSC | <0.01% | $2,479.62 | 0.00101526 | $2.52 | |
BSC | <0.01% | <$0.000001 | 1,523,266,163.1627 | $2.51 | |
BSC | <0.01% | $0.000045 | 53,634.2625 | $2.42 | |
BSC | <0.01% | $0.000148 | 16,331.7908 | $2.41 | |
BSC | <0.01% | <$0.000001 | 4,010,220,121.1892 | $2.41 | |
BSC | <0.01% | $0.00007 | 33,674.7254 | $2.37 | |
BSC | <0.01% | $0.051758 | 45.1287 | $2.34 | |
BSC | <0.01% | $4.78 | 0.4826 | $2.31 | |
BSC | <0.01% | $1,699.42 | 0.00133444 | $2.27 | |
BSC | <0.01% | $3.93 | 0.5722 | $2.25 | |
BSC | <0.01% | $0.000697 | 3,216.9024 | $2.24 | |
BSC | <0.01% | $0.000006 | 354,249.9063 | $2.23 | |
BSC | <0.01% | $0.001191 | 1,857.893 | $2.21 | |
BSC | <0.01% | $0.004842 | 453.025 | $2.19 | |
BSC | <0.01% | $0.000542 | 3,982.5811 | $2.16 | |
BSC | <0.01% | $0.013516 | 157.7385 | $2.13 | |
BSC | <0.01% | $0.022763 | 93.1511 | $2.12 | |
BSC | <0.01% | $0.042798 | 49.5421 | $2.12 | |
BSC | <0.01% | $0.000022 | 95,513.2198 | $2.1 | |
BSC | <0.01% | $0.000421 | 4,951.7692 | $2.08 | |
BSC | <0.01% | $0.00043 | 4,806.6725 | $2.07 | |
BSC | <0.01% | $0.008516 | 242.0462 | $2.06 | |
BSC | <0.01% | $0.000272 | 7,460.4126 | $2.03 | |
BSC | <0.01% | $0.01581 | 127.5354 | $2.02 | |
BSC | <0.01% | $0.003035 | 663.8069 | $2.01 | |
BSC | <0.01% | $0.536639 | 3.7255 | $2 | |
BSC | <0.01% | $0.000398 | 4,969.4239 | $1.98 | |
BSC | <0.01% | <$0.000001 | 1,957,077,006.9604 | $1.98 | |
BSC | <0.01% | $0.082168 | 23.882 | $1.96 | |
BSC | <0.01% | $0.000209 | 9,376.2317 | $1.96 | |
BSC | <0.01% | $0.002901 | 673.9312 | $1.95 | |
BSC | <0.01% | $0.003519 | 553.9107 | $1.95 | |
BSC | <0.01% | $0.000977 | 1,984.225 | $1.94 | |
BSC | <0.01% | <$0.000001 | 75,780,728,793.6681 | $1.93 | |
BSC | <0.01% | $0.00512 | 373.6066 | $1.91 | |
BSC | <0.01% | $0.001319 | 1,442.1079 | $1.9 | |
BSC | <0.01% | $0.000293 | 6,481.9407 | $1.9 | |
BSC | <0.01% | <$0.000001 | 314,232,905.1708 | $1.88 | |
BSC | <0.01% | <$0.000001 | 2,540,407,806.1878 | $1.86 | |
BSC | <0.01% | <$0.000001 | 4,432,974,438.5405 | $1.86 | |
BSC | <0.01% | $0.003638 | 510.9578 | $1.86 | |
BSC | <0.01% | $0.028803 | 63.6976 | $1.83 | |
BSC | <0.01% | $0.000975 | 1,877.462 | $1.83 | |
BSC | <0.01% | $0.002086 | 872.5708 | $1.82 | |
BSC | <0.01% | $0.000311 | 5,834.0584 | $1.82 | |
BSC | <0.01% | $0.017486 | 103.3163 | $1.81 | |
BSC | <0.01% | <$0.000001 | 7,861,461,828.2313 | $1.81 | |
BSC | <0.01% | $0.135483 | 13.2593 | $1.8 | |
BSC | <0.01% | $0.000965 | 1,860.9121 | $1.79 | |
BSC | <0.01% | $0.00005 | 35,893.3326 | $1.79 | |
BSC | <0.01% | $0.000012 | 146,026.4945 | $1.76 | |
BSC | <0.01% | $0.000447 | 3,919.5538 | $1.75 | |
BSC | <0.01% | <$0.000001 | 3,665,403.8661 | $1.74 | |
BSC | <0.01% | $0.000056 | 30,757.4424 | $1.71 | |
BSC | <0.01% | $0.000001 | 1,552,377.3325 | $1.71 | |
BSC | <0.01% | $0.004614 | 368.0442 | $1.7 | |
BSC | <0.01% | $0.003323 | 506.9262 | $1.68 | |
BSC | <0.01% | $0.009048 | 184.4891 | $1.67 | |
BSC | <0.01% | $29.12 | 0.0572 | $1.67 | |
BSC | <0.01% | $0.994789 | 1.6384 | $1.63 | |
BSC | <0.01% | $0.048897 | 33.296 | $1.63 | |
BSC | <0.01% | $0.000059 | 27,360.0674 | $1.6 | |
BSC | <0.01% | $0.001472 | 1,085.9274 | $1.6 | |
BSC | <0.01% | $0.004601 | 344.0016 | $1.58 | |
BSC | <0.01% | $697.56 | 0.00226788 | $1.58 | |
BSC | <0.01% | $0.002078 | 757.3067 | $1.57 | |
BSC | <0.01% | $0.139066 | 11.231 | $1.56 | |
BSC | <0.01% | $0.000314 | 4,965.7084 | $1.56 | |
BSC | <0.01% | $0.003787 | 409.3077 | $1.55 | |
BSC | <0.01% | $0.000349 | 4,441.9075 | $1.55 | |
BSC | <0.01% | <$0.000001 | 7,753,737.8511 | $1.54 | |
BSC | <0.01% | <$0.000001 | 6,046,007.3732 | $1.52 | |
BSC | <0.01% | $0.000014 | 109,884.702 | $1.52 | |
BSC | <0.01% | $0.001092 | 1,385.5927 | $1.51 | |
BSC | <0.01% | $2.81 | 0.5336 | $1.5 | |
BSC | <0.01% | $0.000142 | 10,560.7078 | $1.5 | |
BSC | <0.01% | $0.002589 | 576.5025 | $1.49 | |
BSC | <0.01% | $0.015718 | 94.8461 | $1.49 | |
BSC | <0.01% | <$0.000001 | 3,986,544,934.7682 | $1.49 | |
BSC | <0.01% | $0.055959 | 26.5617 | $1.49 | |
BSC | <0.01% | $0.100379 | 14.7735 | $1.48 | |
BSC | <0.01% | $0.00094 | 1,568.4799 | $1.47 | |
BSC | <0.01% | $0.000681 | 2,163.4532 | $1.47 | |
BSC | <0.01% | $0.005351 | 273.9641 | $1.47 | |
BSC | <0.01% | $1.83 | 0.7886 | $1.44 | |
BSC | <0.01% | <$0.000001 | 42,621,937.4132 | $1.44 | |
BSC | <0.01% | $0.001554 | 923.5343 | $1.43 | |
BSC | <0.01% | $0.000378 | 3,783.195 | $1.43 | |
BSC | <0.01% | $0.002966 | 482.1727 | $1.43 | |
BSC | <0.01% | $0.002739 | 521.5585 | $1.43 | |
BSC | <0.01% | $0.572417 | 2.4844 | $1.42 | |
BSC | <0.01% | $0.160765 | 8.8101 | $1.42 | |
BSC | <0.01% | $0.05449 | 25.6571 | $1.4 | |
BSC | <0.01% | $0.000249 | 5,600.9717 | $1.4 | |
BSC | <0.01% | <$0.000001 | 148,832,787,862.1189 | $1.39 | |
BSC | <0.01% | $0.015759 | 87.7974 | $1.38 | |
BSC | <0.01% | $0.002718 | 507.9668 | $1.38 | |
BSC | <0.01% | $0.001248 | 1,100.1273 | $1.37 | |
BSC | <0.01% | $0.035389 | 38.2725 | $1.35 | |
BSC | <0.01% | $0.000572 | 2,329.1411 | $1.33 | |
BSC | <0.01% | $0.000034 | 39,582.1756 | $1.33 | |
BSC | <0.01% | $0.551571 | 2.3735 | $1.31 | |
BSC | <0.01% | $0.090298 | 14.4412 | $1.3 | |
BSC | <0.01% | $0.008386 | 154.802 | $1.3 | |
BSC | <0.01% | $0.000001 | 1,682,055.4575 | $1.29 | |
BSC | <0.01% | $0.000004 | 347,939.5751 | $1.28 | |
BSC | <0.01% | $0.000092 | 13,849.5907 | $1.28 | |
BSC | <0.01% | $0.011519 | 110.6472 | $1.27 | |
BSC | <0.01% | $0.001027 | 1,239.8643 | $1.27 | |
BSC | <0.01% | $0.002181 | 580.2527 | $1.27 | |
BSC | <0.01% | $0.008171 | 154.6338 | $1.26 | |
BSC | <0.01% | $0.000041 | 30,518.8981 | $1.24 | |
BSC | <0.01% | $0.096233 | 12.791 | $1.23 | |
BSC | <0.01% | $0.011561 | 106.3358 | $1.23 | |
BSC | <0.01% | $0.002075 | 568.085 | $1.18 | |
BSC | <0.01% | <$0.000001 | 31,853,706.547 | $1.17 | |
BSC | <0.01% | $0.000185 | 6,264.4957 | $1.16 | |
BSC | <0.01% | $0.000219 | 5,238.2793 | $1.15 | |
BSC | <0.01% | $0.020679 | 55.4384 | $1.15 | |
BSC | <0.01% | $0.000031 | 37,289.3584 | $1.14 | |
BSC | <0.01% | $0.009557 | 118.5909 | $1.13 | |
BSC | <0.01% | $0.00072 | 1,570.7795 | $1.13 | |
BSC | <0.01% | $0.000393 | 2,873.446 | $1.13 | |
BSC | <0.01% | <$0.000001 | 912,198,331.3941 | $1.13 | |
BSC | <0.01% | $0.000139 | 8,042.6058 | $1.12 | |
BSC | <0.01% | $0.00001 | 112,145.943 | $1.1 | |
BSC | <0.01% | <$0.000001 | 24,257,406,047.8503 | $1.09 | |
BSC | <0.01% | $0.002094 | 518.7742 | $1.09 | |
BSC | <0.01% | $0.00536 | 202.4342 | $1.09 | |
BSC | <0.01% | $0.003088 | 350.0432 | $1.08 | |
BSC | <0.01% | $2.44 | 0.4384 | $1.07 | |
BSC | <0.01% | $0.000043 | 24,858.7214 | $1.07 | |
BSC | <0.01% | $0.000077 | 13,843.4981 | $1.07 | |
BSC | <0.01% | <$0.000001 | 591,470,567.0765 | $1.06 | |
BSC | <0.01% | $0.00207 | 503.0995 | $1.04 | |
BSC | <0.01% | $0.000049 | 21,196.1229 | $1.04 | |
BSC | <0.01% | $0.999624 | 1.0348 | $1.03 | |
BSC | <0.01% | $0.092893 | 11.1183 | $1.03 | |
BSC | <0.01% | $0.001936 | 532.5696 | $1.03 | |
BSC | <0.01% | $0.00002 | 50,831.3319 | $1.03 | |
BSC | <0.01% | $0.000399 | 2,571.6119 | $1.03 | |
BSC | <0.01% | $0.01549 | 66.1547 | $1.02 | |
BSC | <0.01% | $0.786463 | 1.2998 | $1.02 | |
BSC | <0.01% | $0.004955 | 205.7207 | $1.02 | |
BSC | <0.01% | $0.012209 | 83.4918 | $1.02 | |
BSC | <0.01% | $0.002455 | 415.2223 | $1.02 | |
BSC | <0.01% | $1.21 | 0.83 | $1 | |
BSC | <0.01% | $0.000046 | 21,942.9266 | $1 | |
BSC | <0.01% | $0.034084 | 29.3 | $0.9986 | |
BSC | <0.01% | $0.000502 | 1,983.6133 | $0.9965 | |
BSC | <0.01% | $0.004608 | 212.7014 | $0.9802 | |
BSC | <0.01% | $0.001212 | 804.9768 | $0.9758 | |
BSC | <0.01% | $0.000001 | 649,672.1149 | $0.9657 | |
BSC | <0.01% | $0.002383 | 401.1538 | $0.9559 | |
BSC | <0.01% | $0.004856 | 195.5777 | $0.9497 | |
BSC | <0.01% | <$0.000001 | 8,781,980,973.5448 | $0.9484 | |
BSC | <0.01% | $0.065153 | 14.5388 | $0.9472 | |
BSC | <0.01% | $0.056678 | 16.3473 | $0.9265 | |
BSC | <0.01% | $0.003264 | 283.3181 | $0.9246 | |
BSC | <0.01% | $0.000005 | 181,691.4045 | $0.9236 | |
BSC | <0.01% | $2.25 | 0.4042 | $0.9095 | |
BSC | <0.01% | $0.000685 | 1,319.406 | $0.9032 | |
BSC | <0.01% | $0.000865 | 1,044.3545 | $0.9032 | |
BSC | <0.01% | <$0.000001 | 54,223,787.6961 | $0.9012 | |
BSC | <0.01% | $0.11143 | 8.0274 | $0.8944 | |
BSC | <0.01% | $0.048839 | 18.2474 | $0.8911 | |
BSC | <0.01% | $0.000253 | 3,520.8998 | $0.8901 | |
BSC | <0.01% | <$0.000001 | 2,361,313.7679 | $0.8839 | |
BSC | <0.01% | $0.000326 | 2,700.3861 | $0.8805 | |
BSC | <0.01% | $0.00909 | 96.1886 | $0.8743 | |
BSC | <0.01% | $0.000045 | 19,124.7383 | $0.8697 | |
BSC | <0.01% | $0.000038 | 22,560.0841 | $0.8659 | |
BSC | <0.01% | $0.000018 | 47,241.7759 | $0.8594 | |
BSC | <0.01% | $0.000015 | 57,117.1406 | $0.8539 | |
BSC | <0.01% | $0.001547 | 547.0715 | $0.846 | |
BSC | <0.01% | $0.014311 | 58.9127 | $0.8431 | |
BSC | <0.01% | $0.049715 | 16.8277 | $0.8365 | |
BSC | <0.01% | $0.000559 | 1,492.8858 | $0.8341 | |
BSC | <0.01% | $0.007926 | 105.1134 | $0.8331 | |
BSC | <0.01% | $0.000209 | 3,942.3593 | $0.8235 | |
BSC | <0.01% | $0.018445 | 44.5905 | $0.8224 | |
BSC | <0.01% | $116.05 | 0.007059 | $0.8191 | |
BSC | <0.01% | $0.004568 | 178.1549 | $0.8137 | |
BSC | <0.01% | $0.000102 | 7,645.0076 | $0.7816 | |
BSC | <0.01% | $0.00792 | 98.5722 | $0.7807 | |
BSC | <0.01% | $0.000124 | 6,295.2148 | $0.7775 | |
BSC | <0.01% | $0.000314 | 2,464.4532 | $0.7749 | |
BSC | <0.01% | $0.000034 | 22,472.5058 | $0.7745 | |
BSC | <0.01% | $0.000039 | 19,569.3003 | $0.7696 | |
BSC | <0.01% | <$0.000001 | 291,962,831.2919 | $0.7647 | |
BSC | <0.01% | $0.000107 | 7,123.5459 | $0.7639 | |
BSC | <0.01% | <$0.000001 | 6,103,720.9528 | $0.7624 | |
BSC | <0.01% | $0.000395 | 1,925.0465 | $0.7613 | |
BSC | <0.01% | $0.010667 | 70.8117 | $0.7553 | |
BSC | <0.01% | $0.001649 | 444.8818 | $0.7337 | |
BSC | <0.01% | $0.028525 | 25.5295 | $0.7282 | |
BSC | <0.01% | $0.000573 | 1,270.6056 | $0.7275 | |
BSC | <0.01% | $0.154283 | 4.7098 | $0.7266 | |
BSC | <0.01% | $0.000023 | 31,181.8876 | $0.7218 | |
BSC | <0.01% | <$0.000001 | 11,610,921,239.7508 | $0.7181 | |
BSC | <0.01% | $0.002257 | 317.948 | $0.7176 | |
BSC | <0.01% | <$0.000001 | 588,703,144.6275 | $0.7064 | |
BSC | <0.01% | $0.000881 | 796.1373 | $0.7014 | |
BSC | <0.01% | $0.037951 | 18.3995 | $0.6982 | |
BSC | <0.01% | $0.000004 | 157,879.7742 | $0.6977 | |
BSC | <0.01% | $0.000181 | 3,840.923 | $0.6957 | |
BSC | <0.01% | $0.003351 | 207.5323 | $0.6954 | |
BSC | <0.01% | $0.000315 | 2,192.3667 | $0.6911 | |
BSC | <0.01% | <$0.000001 | 2,627,402,346,198.9878 | $0.6648 | |
BSC | <0.01% | $0.001706 | 388.447 | $0.6625 | |
BSC | <0.01% | $2,947.56 | 0.0002201 | $0.6487 | |
BSC | <0.01% | $0.000039 | 16,749.2261 | $0.6481 | |
BSC | <0.01% | $0.002492 | 259.4752 | $0.6466 | |
BSC | <0.01% | $0.000673 | 955.5733 | $0.6431 | |
BSC | <0.01% | $0.406677 | 1.5763 | $0.641 | |
BSC | <0.01% | <$0.000001 | 309,976,152.5182 | $0.6388 | |
BSC | <0.01% | $0.000015 | 42,250.7094 | $0.6388 | |
BSC | <0.01% | $0.000219 | 2,913.9066 | $0.638 | |
BSC | <0.01% | $0.002001 | 315.75 | $0.6319 | |
BSC | <0.01% | <$0.000001 | 999,760,893,970.9613 | $0.628 | |
BSC | <0.01% | $0.009342 | 67.0745 | $0.6266 | |
BSC | <0.01% | <$0.000001 | 1,420,931,648,526.9609 | $0.6175 | |
BSC | <0.01% | $0.026931 | 22.8622 | $0.6157 | |
BSC | <0.01% | <$0.000001 | 55,641,352,331.806 | $0.615 | |
BSC | <0.01% | $0.00104 | 588.3409 | $0.6121 | |
BSC | <0.01% | <$0.000001 | 229,588,733.5528 | $0.6088 | |
BSC | <0.01% | $0.003912 | 154.0242 | $0.6025 | |
BSC | <0.01% | $0.000509 | 1,181.7862 | $0.602 | |
BSC | <0.01% | <$0.000001 | 728,500,591,212.9489 | $0.599 | |
BSC | <0.01% | $0.000531 | 1,127.2208 | $0.5982 | |
BSC | <0.01% | $0.002445 | 244.6771 | $0.5982 | |
BSC | <0.01% | $0.027172 | 21.8647 | $0.5941 | |
BSC | <0.01% | $0.001123 | 528.361 | $0.5935 | |
BSC | <0.01% | $1.14 | 0.5163 | $0.5885 | |
BSC | <0.01% | <$0.000001 | 1,219,597,220,416.01 | $0.5782 | |
BSC | <0.01% | <$0.000001 | 5,668,924.4623 | $0.5758 | |
BSC | <0.01% | $0.000384 | 1,487.5702 | $0.5716 | |
BSC | <0.01% | $0.046264 | 12.2754 | $0.5679 | |
BSC | <0.01% | <$0.000001 | 1,763,299.5911 | $0.5556 | |
BSC | <0.01% | $0.018826 | 29.4841 | $0.555 | |
BSC | <0.01% | $0.000017 | 32,155.5317 | $0.5518 | |
BSC | <0.01% | <$0.000001 | 139,563,965,011.9153 | $0.5516 | |
BSC | <0.01% | $0.000307 | 1,791.3755 | $0.5507 | |
BSC | <0.01% | $0.002971 | 184.9202 | $0.5494 | |
BSC | <0.01% | $0.011406 | 48.1232 | $0.5489 | |
BSC | <0.01% | $0.000995 | 550.6424 | $0.5476 | |
BSC | <0.01% | $48.04 | 0.0114 | $0.5468 | |
BSC | <0.01% | $0.000801 | 680.621 | $0.5449 | |
BSC | <0.01% | $0.000953 | 569.6366 | $0.5429 | |
BSC | <0.01% | $0.000294 | 1,844.6901 | $0.5416 | |
BSC | <0.01% | $0.000558 | 951.7064 | $0.5309 | |
BSC | <0.01% | $0.080482 | 6.5733 | $0.529 | |
BSC | <0.01% | $0.000515 | 1,019.7246 | $0.5247 | |
BSC | <0.01% | $0.059515 | 8.8062 | $0.5241 | |
BSC | <0.01% | $0.10462 | 4.9633 | $0.5192 | |
BSC | <0.01% | $0.013541 | 38.1281 | $0.5163 | |
BSC | <0.01% | <$0.000001 | 161,110,214,515,064.41 | $0.5129 | |
BSC | <0.01% | <$0.000001 | 1,451,871.0048 | $0.5095 | |
BSC | <0.01% | <$0.000001 | 794,646,192.9268 | $0.5041 | |
BSC | <0.01% | <$0.000001 | 179,943,873.4775 | $0.5038 | |
BSC | <0.01% | $0.002602 | 191.0293 | $0.497 | |
BSC | <0.01% | $0.023843 | 20.7783 | $0.4954 | |
BSC | <0.01% | $0.06787 | 7.2181 | $0.4898 | |
BSC | <0.01% | $16,199.83 | 0.00003008 | $0.4872 | |
BSC | <0.01% | <$0.000001 | 305,373,696,426.2465 | $0.484 | |
BSC | <0.01% | $0.001281 | 372.7 | $0.4774 | |
BSC | <0.01% | $1 | 0.4704 | $0.4703 | |
BSC | <0.01% | $0.013189 | 35.5658 | $0.469 | |
BSC | <0.01% | $0.000069 | 6,791.5701 | $0.4665 | |
BSC | <0.01% | $0.007469 | 61.5481 | $0.4597 | |
BSC | <0.01% | $0.000406 | 1,121.7494 | $0.4555 | |
BSC | <0.01% | <$0.000001 | 1,709,231.4456 | $0.4545 | |
BSC | <0.01% | $0.000049 | 9,192.7171 | $0.454 | |
BSC | <0.01% | <$0.000001 | 6,616,087,876,459.0137 | $0.4511 | |
BSC | <0.01% | $2,123.18 | 0.00021228 | $0.4507 | |
BSC | <0.01% | $0.000962 | 467.8879 | $0.4499 | |
BSC | <0.01% | <$0.000001 | 6,695,512,633.3739 | $0.449 | |
BSC | <0.01% | $0.002012 | 219.3047 | $0.4412 | |
BSC | <0.01% | $0.000106 | 4,089.1611 | $0.4329 | |
BSC | <0.01% | $0.170644 | 2.5285 | $0.4314 | |
BSC | <0.01% | $0.000137 | 3,113.4823 | $0.4265 | |
BSC | <0.01% | $0.000495 | 856.7387 | $0.4242 | |
BSC | <0.01% | $0.04708 | 8.9461 | $0.4211 | |
BSC | <0.01% | $0.000023 | 18,180.4204 | $0.4197 | |
BSC | <0.01% | $0.000094 | 4,464.0059 | $0.4191 | |
BSC | <0.01% | $0.443642 | 0.933 | $0.4139 | |
BSC | <0.01% | $0.000001 | 376,211.2425 | $0.4138 | |
BSC | <0.01% | $0.000643 | 640.8247 | $0.4122 | |
BSC | <0.01% | $0.00035 | 1,174.4333 | $0.4107 | |
BSC | <0.01% | $0.000009 | 46,617.108 | $0.4106 | |
BSC | <0.01% | $0.00147 | 278.1568 | $0.4089 | |
BSC | <0.01% | $0.002637 | 151.2054 | $0.3987 | |
BSC | <0.01% | $0.000479 | 825.87 | $0.3955 | |
BSC | <0.01% | $0.000008 | 48,198.5466 | $0.3904 | |
BSC | <0.01% | $0.000125 | 3,108.3989 | $0.39 | |
BSC | <0.01% | <$0.000001 | 20,671,931.8977 | $0.3898 | |
BSC | <0.01% | $0.001978 | 196.6267 | $0.3889 | |
BSC | <0.01% | $0.000065 | 5,886.1495 | $0.3818 | |
BSC | <0.01% | $0.000053 | 7,227.0054 | $0.3802 | |
BSC | <0.01% | $0.000002 | 239,697.0803 | $0.378 | |
BSC | <0.01% | $0.999013 | 0.3729 | $0.3724 | |
BSC | <0.01% | $0.618228 | 0.6013 | $0.3717 | |
BSC | <0.01% | $0.000038 | 9,655.4093 | $0.369 | |
BSC | <0.01% | $0.005351 | 67.9833 | $0.3637 | |
BSC | <0.01% | $24.41 | 0.0146 | $0.3574 | |
BSC | <0.01% | $0.000004 | 96,067.5973 | $0.3554 | |
BSC | <0.01% | $0.375207 | 0.9342 | $0.3505 | |
BSC | <0.01% | $0.0003 | 1,162.8866 | $0.3486 | |
BSC | <0.01% | <$0.000001 | 3,053,967.6531 | $0.3452 | |
BSC | <0.01% | $0.000364 | 946.1306 | $0.3442 | |
BSC | <0.01% | $3.15 | 0.1093 | $0.3441 | |
BSC | <0.01% | $0.000002 | 200,030.2244 | $0.333 | |
BSC | <0.01% | $0.032782 | 10.114 | $0.3315 | |
BSC | <0.01% | <$0.000001 | 618,285,169.727 | $0.3306 | |
BSC | <0.01% | $0.000637 | 515.6673 | $0.3282 | |
BSC | <0.01% | $0.000011 | 29,119.6704 | $0.3249 | |
BSC | <0.01% | $0.004234 | 76.7247 | $0.3248 | |
BSC | <0.01% | $14.85 | 0.0218 | $0.3244 | |
BSC | <0.01% | $0.000085 | 3,826.9697 | $0.3236 | |
BSC | <0.01% | $0.009658 | 33.3309 | $0.3219 | |
BSC | <0.01% | $0.000014 | 23,369.403 | $0.3192 | |
BSC | <0.01% | $0.03076 | 10.2302 | $0.3146 | |
BSC | <0.01% | $0.001982 | 157.6524 | $0.3124 | |
BSC | <0.01% | $0.000001 | 394,393.9208 | $0.3066 | |
BSC | <0.01% | $0.000236 | 1,286.3791 | $0.3031 | |
BSC | <0.01% | $0.000084 | 3,608.832 | $0.3023 | |
BSC | <0.01% | <$0.000001 | 4,170,410,877.0991 | $0.2953 | |
BSC | <0.01% | $0.002187 | 134.8655 | $0.2949 | |
BSC | <0.01% | $0.000163 | 1,797.2255 | $0.293 | |
BSC | <0.01% | $0.000065 | 4,504.0346 | $0.292 | |
BSC | <0.01% | $0.001032 | 279.3992 | $0.2884 | |
BSC | <0.01% | $0.00001 | 27,339.2684 | $0.2862 | |
BSC | <0.01% | $0.009448 | 29.6437 | $0.28 | |
BSC | <0.01% | $0.002312 | 120.8012 | $0.2792 | |
BSC | <0.01% | $0.002899 | 93.0026 | $0.2696 | |
BSC | <0.01% | <$0.000001 | 10,747,597,661.4366 | $0.2659 | |
BSC | <0.01% | $0.00001 | 27,654.5462 | $0.2657 | |
BSC | <0.01% | $0.000917 | 289.3983 | $0.2654 | |
BSC | <0.01% | $0.006463 | 40.5029 | $0.2617 | |
BSC | <0.01% | $0.000364 | 717.1716 | $0.2613 | |
BSC | <0.01% | $0.036026 | 7.1602 | $0.2579 | |
BSC | <0.01% | $0.000089 | 2,894.9587 | $0.2575 | |
BSC | <0.01% | $0.005968 | 43.1242 | $0.2573 | |
BSC | <0.01% | <$0.000001 | 29,349,705,860,397.902 | $0.2535 | |
BSC | <0.01% | $0.000443 | 572.8633 | $0.2535 | |
BSC | <0.01% | $0.000316 | 782.6869 | $0.2474 | |
BSC | <0.01% | $0.001171 | 210.0506 | $0.2459 | |
BSC | <0.01% | $0.000032 | 7,519.6713 | $0.2412 | |
BSC | <0.01% | $0.009463 | 25.2431 | $0.2388 | |
BSC | <0.01% | $0.000897 | 265.0419 | $0.2376 | |
BSC | <0.01% | $0.000776 | 305.6146 | $0.2371 | |
BSC | <0.01% | $0.092917 | 2.5235 | $0.2344 | |
BSC | <0.01% | $0.008062 | 29.0623 | $0.2342 | |
BSC | <0.01% | $0.00039 | 590.5342 | $0.2303 | |
BSC | <0.01% | <$0.000001 | 1,937,298,289.2181 | $0.2254 | |
BSC | <0.01% | $0.001028 | 219.0157 | $0.2251 | |
BSC | <0.01% | $0.013185 | 16.1906 | $0.2134 | |
BSC | <0.01% | $0.00091 | 234.079 | $0.2129 | |
BSC | <0.01% | $0.000108 | 1,954.9199 | $0.2114 | |
BSC | <0.01% | $0.505826 | 0.4129 | $0.2088 | |
BSC | <0.01% | $0.003887 | 53.3193 | $0.2072 | |
BSC | <0.01% | $0.005313 | 38.2595 | $0.2032 | |
BSC | <0.01% | $0.288681 | 0.6922 | $0.1998 | |
BSC | <0.01% | <$0.000001 | 8,834,520,443.2051 | $0.1993 | |
BSC | <0.01% | $0.000669 | 296.4082 | $0.1982 | |
BSC | <0.01% | <$0.000001 | 62,031,931,921.1484 | $0.1971 | |
BSC | <0.01% | <$0.000001 | 2,778,485.6495 | $0.1961 | |
BSC | <0.01% | <$0.000001 | 504,165,227.9965 | $0.193 | |
BSC | <0.01% | $0.000023 | 8,516.9049 | $0.1926 | |
BSC | <0.01% | $0.001374 | 140.151 | $0.1925 | |
BSC | <0.01% | $0.002643 | 72.3366 | $0.1911 | |
BSC | <0.01% | $0.034115 | 5.5889 | $0.1906 | |
BSC | <0.01% | $0.494659 | 0.3838 | $0.1898 | |
BSC | <0.01% | $0.000046 | 4,088.1823 | $0.1865 | |
BSC | <0.01% | $0.001307 | 141.6686 | $0.1852 | |
BSC | <0.01% | <$0.000001 | 787,858,329.5082 | $0.1828 | |
BSC | <0.01% | $0.000048 | 3,801.5362 | $0.1814 | |
BSC | <0.01% | $0.367841 | 0.4789 | $0.1761 | |
BSC | <0.01% | $0.056332 | 3.1204 | $0.1757 | |
BSC | <0.01% | $0.001261 | 133.5527 | $0.1684 | |
BSC | <0.01% | $0.008759 | 19.2239 | $0.1683 | |
BSC | <0.01% | $0.00161 | 104.0262 | $0.1674 | |
BSC | <0.01% | $0.000985 | 169.7951 | $0.1672 | |
BSC | <0.01% | $0.036814 | 4.5029 | $0.1657 | |
BSC | <0.01% | $0.104295 | 1.589 | $0.1657 | |
BSC | <0.01% | $0.001173 | 138.3243 | $0.1622 | |
BSC | <0.01% | $103,819 | 0.00000156 | $0.1616 | |
BSC | <0.01% | $0.000125 | 1,278.9842 | $0.1605 | |
BSC | <0.01% | $0.000043 | 3,705.1435 | $0.1596 | |
BSC | <0.01% | $0.001125 | 141.1963 | $0.1588 | |
BSC | <0.01% | $0.003591 | 43.446 | $0.1559 | |
BSC | <0.01% | <$0.000001 | 90,735,729,468.888 | $0.1557 | |
BSC | <0.01% | $0.01813 | 8.5017 | $0.1541 | |
BSC | <0.01% | $0.000037 | 4,134.4026 | $0.153 | |
BSC | <0.01% | $0.218707 | 0.6997 | $0.153 | |
BSC | <0.01% | $0.000002 | 88,263.59 | $0.1526 | |
BSC | <0.01% | $0.025101 | 6.0495 | $0.1518 | |
BSC | <0.01% | $0.000801 | 189.1455 | $0.1515 | |
BSC | <0.01% | $10.78 | 0.014 | $0.1511 | |
BSC | <0.01% | <$0.000001 | 107,108,695.8563 | $0.1468 | |
BSC | <0.01% | $0.000214 | 686.236 | $0.1467 | |
BSC | <0.01% | $0.000424 | 344.9447 | $0.1462 | |
BSC | <0.01% | <$0.000001 | 32,829,079.8017 | $0.1434 | |
BSC | <0.01% | $0.047447 | 3.0065 | $0.1426 | |
BSC | <0.01% | $0.000001 | 273,291.901 | $0.1394 | |
BSC | <0.01% | $0.000781 | 172.6884 | $0.1349 | |
BSC | <0.01% | $0.003504 | 38.1688 | $0.1337 | |
BSC | <0.01% | $0.003465 | 37.9365 | $0.1314 | |
BSC | <0.01% | $0.004919 | 26.706 | $0.1313 | |
BSC | <0.01% | $0.765184 | 0.1696 | $0.1297 | |
BSC | <0.01% | $0.000422 | 306.6815 | $0.1294 | |
BSC | <0.01% | $0.000078 | 1,645.8856 | $0.1291 | |
BSC | <0.01% | <$0.000001 | 143,126,414,112.8578 | $0.1276 | |
BSC | <0.01% | $0.000021 | 6,101.4258 | $0.1266 | |
BSC | <0.01% | $0.000522 | 242.4154 | $0.1265 | |
BSC | <0.01% | $0.010338 | 12.243 | $0.1265 | |
BSC | <0.01% | $0.001667 | 73.9206 | $0.1231 | |
BSC | <0.01% | <$0.000001 | 261,257.149 | $0.123 | |
BSC | <0.01% | $0.008089 | 15.2063 | $0.123 | |
BSC | <0.01% | $0.002231 | 54.3944 | $0.1213 | |
BSC | <0.01% | $0.000072 | 1,671.9062 | $0.1197 | |
BSC | <0.01% | $0.000575 | 207.558 | $0.1194 | |
BSC | <0.01% | $0.001158 | 102.8707 | $0.1191 | |
BSC | <0.01% | <$0.000001 | 2,044,046.4128 | $0.118 | |
BSC | <0.01% | $0.00001 | 11,565.985 | $0.1178 | |
BSC | <0.01% | $0.000673 | 173.4258 | $0.1167 | |
BSC | <0.01% | $0.000028 | 3,969.612 | $0.113 | |
BSC | <0.01% | <$0.000001 | 750,657.2963 | $0.1126 | |
BSC | <0.01% | $0.000256 | 432.5832 | $0.1106 | |
BSC | <0.01% | $0.000079 | 1,402.4085 | $0.1105 | |
BSC | <0.01% | $0.004238 | 25.9002 | $0.1097 | |
BSC | <0.01% | $0.000398 | 266.9126 | $0.1061 | |
BSC | <0.01% | <$0.000001 | 4,992,842,843.6957 | $0.1034 | |
BSC | <0.01% | $104,372 | 0.00000099 | $0.1033 | |
BSC | <0.01% | $0.000516 | 198.3655 | $0.1023 | |
BSC | <0.01% | $0.020007 | 5.1112 | $0.1022 | |
BSC | <0.01% | $0.000043 | 2,329.5762 | $0.1006 | |
BSC | <0.01% | $0.009797 | 10.2728 | $0.1006 | |
BSC | <0.01% | $0.000473 | 212.7933 | $0.1005 | |
BSC | <0.01% | $643.33 | 0.00000119 | $0.000767 | |
ETH | <0.01% | $1 | 57,030.6645 | $57,087.7 | |
ETH | <0.01% | $0.468539 | 26,753.7474 | $12,535.17 | |
ETH | <0.01% | $643.44 | 6.2079 | $3,994.37 | |
ETH | <0.01% | $0.094184 | 39,248.5636 | $3,696.57 | |
ETH | <0.01% | $0.174288 | 13,337.4445 | $2,324.56 | |
ETH | <0.01% | $0.002147 | 1,002,997.3556 | $2,153.59 | |
ETH | <0.01% | $1.08 | 1,348.5483 | $1,460.48 | |
ETH | <0.01% | $37.56 | 35.4565 | $1,331.74 | |
ETH | <0.01% | $0.001233 | 1,061,728.4692 | $1,309.01 | |
ETH | <0.01% | $0.066904 | 17,310.6701 | $1,158.15 | |
ETH | <0.01% | $0.001368 | 833,031.4863 | $1,139.6 | |
ETH | <0.01% | $0.036148 | 30,543.0208 | $1,104.06 | |
ETH | <0.01% | $0.008798 | 120,909.6259 | $1,063.75 | |
ETH | <0.01% | <$0.000001 | 18,971,384,599.5975 | $990.06 | |
ETH | <0.01% | $1 | 963.5084 | $964.47 | |
ETH | <0.01% | $0.162269 | 5,861.7584 | $951.18 | |
ETH | <0.01% | $0.718816 | 1,309.4733 | $941.27 | |
ETH | <0.01% | $1 | 931.7972 | $931.8 | |
ETH | <0.01% | $0.151442 | 5,948.2234 | $900.81 | |
ETH | <0.01% | $1.84 | 484.4124 | $893.29 | |
ETH | <0.01% | $0.096862 | 9,136.5239 | $884.98 | |
ETH | <0.01% | $0.433618 | 2,036.6997 | $883.15 | |
ETH | <0.01% | $0.995824 | 879.6028 | $875.93 | |
ETH | <0.01% | $0.805924 | 1,086.5768 | $875.7 | |
ETH | <0.01% | <$0.000001 | 6,689,182,516.9893 | $863.36 | |
ETH | <0.01% | $0.02031 | 40,151.1701 | $815.49 | |
ETH | <0.01% | $0.000011 | 73,314,262.9742 | $813.06 | |
ETH | <0.01% | <$0.000001 | 8,254,931,406.4831 | $809.7 | |
ETH | <0.01% | $0.27738 | 2,898.4729 | $803.98 | |
ETH | <0.01% | $0.002626 | 303,518.8878 | $797.06 | |
ETH | <0.01% | $0.007801 | 101,483.5341 | $791.64 | |
ETH | <0.01% | <$0.000001 | 49,493,872,541.1093 | $790.93 | |
ETH | <0.01% | $0.322482 | 2,321.211 | $748.55 | |
ETH | <0.01% | <$0.000001 | 68,722,164,925.0161 | $746.19 | |
ETH | <0.01% | $250.76 | 2.9303 | $734.79 | |
ETH | <0.01% | $0.999865 | 724.7518 | $724.65 | |
ETH | <0.01% | $0.31509 | 2,263.2327 | $713.12 | |
ETH | <0.01% | $0.012142 | 57,644.7358 | $699.95 | |
ETH | <0.01% | $127.86 | 5.4627 | $698.46 | |
ETH | <0.01% | $0.29793 | 2,335.6715 | $695.87 | |
ETH | <0.01% | $0.118084 | 5,865.8046 | $692.66 | |
ETH | <0.01% | $1.01 | 688.8583 | $692.3 | |
ETH | <0.01% | $2,986.23 | 0.2317 | $691.88 | |
ETH | <0.01% | $1.13 | 608.8266 | $687.97 | |
ETH | <0.01% | $0.000563 | 1,211,051.4304 | $681.43 | |
ETH | <0.01% | <$0.000001 | 1,933,726,636.9662 | $678.72 | |
ETH | <0.01% | $0.000029 | 23,308,926.9959 | $668.27 | |
ETH | <0.01% | $0.397474 | 1,674.2852 | $665.48 | |
ETH | <0.01% | $11.94 | 55.5914 | $663.76 | |
ETH | <0.01% | $0.526995 | 1,242.1741 | $654.62 | |
ETH | <0.01% | $0.019268 | 33,681.3428 | $648.98 | |
ETH | <0.01% | $0.191581 | 3,387.2927 | $648.94 | |
ETH | <0.01% | <$0.000001 | 85,208,865,038.4198 | $646.67 | |
ETH | <0.01% | $0.232522 | 2,777.4389 | $645.82 | |
ETH | <0.01% | $0.772276 | 835.9235 | $645.56 | |
ETH | <0.01% | $1.14 | 562.5196 | $641.27 | |
ETH | <0.01% | $0.034286 | 18,477.0539 | $633.5 | |
ETH | <0.01% | $0.196626 | 3,218.4618 | $632.83 | |
ETH | <0.01% | $0.125583 | 4,975.7142 | $624.87 | |
ETH | <0.01% | <$0.000001 | 248,770,562,113.6399 | $622.91 | |
ETH | <0.01% | $0.187718 | 3,309.25 | $621.2 | |
ETH | <0.01% | $0.999093 | 614.3015 | $613.74 | |
ETH | <0.01% | $0.00224 | 273,338.4802 | $612.34 | |
ETH | <0.01% | $0.076341 | 8,004.6503 | $611.08 | |
ETH | <0.01% | $1 | 608.7261 | $608.73 | |
ETH | <0.01% | <$0.000001 | 142,301,211,247.3363 | $606.91 | |
ETH | <0.01% | $0.003016 | 198,416.9621 | $598.4 | |
ETH | <0.01% | $5,100.28 | 0.1165 | $594.32 | |
ETH | <0.01% | <$0.000001 | 32,300,660,087.007 | $593.4 | |
ETH | <0.01% | $0.000024 | 24,864,335.4447 | $592.02 | |
ETH | <0.01% | $20.13 | 29.4086 | $592 | |
ETH | <0.01% | $0.000394 | 1,493,094.45 | $588.59 | |
ETH | <0.01% | $0.501082 | 1,149.4756 | $575.98 | |
ETH | <0.01% | $0.000001 | 699,010,826.4399 | $572.83 | |
ETH | <0.01% | $0.616441 | 920.6367 | $567.52 | |
ETH | <0.01% | $11.94 | 47.3037 | $564.91 | |
ETH | <0.01% | $0.012037 | 46,536.8046 | $560.15 | |
ETH | <0.01% | $0.727683 | 767.8745 | $558.77 | |
ETH | <0.01% | $0.000005 | 105,340,334.758 | $550.93 | |
ETH | <0.01% | $0.000032 | 17,076,021.2377 | $543.7 | |
ETH | <0.01% | $0.101441 | 5,260.3962 | $533.62 | |
ETH | <0.01% | $0.000179 | 2,966,797.0636 | $529.57 | |
ETH | <0.01% | $3,320.76 | 0.1586 | $526.51 | |
ETH | <0.01% | $0.502674 | 1,047.2523 | $526.43 | |
ETH | <0.01% | $2.1 | 250.2666 | $525.56 | |
ETH | <0.01% | $0.577753 | 907.357 | $524.23 | |
ETH | <0.01% | $0.324221 | 1,607.0113 | $521.03 | |
ETH | <0.01% | $0.270462 | 1,920.2914 | $519.37 | |
ETH | <0.01% | $0.626943 | 827.2891 | $518.66 | |
ETH | <0.01% | $0.010291 | 49,817.5193 | $512.66 | |
ETH | <0.01% | $0.29146 | 1,757.5423 | $512.25 | |
ETH | <0.01% | $0.077668 | 6,572.6291 | $510.48 | |
ETH | <0.01% | $1.56 | 326.0122 | $508.58 | |
ETH | <0.01% | $0.000023 | 22,093,911.31 | $507.55 | |
ETH | <0.01% | <$0.000001 | 22,840,087,752.1268 | $503.88 | |
ETH | <0.01% | $0.00444 | 113,420.7987 | $503.61 | |
ETH | <0.01% | $0.25814 | 1,933.0518 | $499 | |
ETH | <0.01% | $0.232793 | 2,141.1482 | $498.44 | |
ETH | <0.01% | $4.01 | 124.2595 | $498.28 | |
ETH | <0.01% | $0.404457 | 1,220.0433 | $493.46 | |
ETH | <0.01% | $0.06706 | 7,336.393 | $491.98 | |
ETH | <0.01% | $0.066296 | 7,348.9498 | $487.21 | |
ETH | <0.01% | <$0.000001 | 367,264,771,356.5895 | $485.52 | |
ETH | <0.01% | $0.00001 | 49,266,667.3145 | $483.31 | |
ETH | <0.01% | $44.05 | 10.9662 | $483.06 | |
ETH | <0.01% | $0.131038 | 3,669.2883 | $480.81 | |
ETH | <0.01% | <$0.000001 | 299,588,197,084.013 | $471.55 | |
ETH | <0.01% | $0.37846 | 1,245.3247 | $471.31 | |
ETH | <0.01% | $0.004207 | 111,354.59 | $468.43 | |
ETH | <0.01% | $0.153588 | 3,015.8552 | $463.2 | |
ETH | <0.01% | $0.038629 | 11,887.3448 | $459.19 | |
ETH | <0.01% | <$0.000001 | 12,948,693,398.5935 | $456.36 | |
ETH | <0.01% | $0.000017 | 26,950,036.1807 | $454.65 | |
ETH | <0.01% | $44.59 | 10.1712 | $453.53 | |
ETH | <0.01% | $0.147867 | 3,047.5173 | $450.63 | |
ETH | <0.01% | $0.037984 | 11,822.9403 | $449.09 | |
ETH | <0.01% | $0.024607 | 18,117.802 | $445.82 | |
ETH | <0.01% | $104,143 | 0.00425082 | $442.69 | |
ETH | <0.01% | $0.992089 | 441.0278 | $437.54 | |
ETH | <0.01% | $0.52287 | 835.7501 | $436.99 | |
ETH | <0.01% | $0.011248 | 38,736.414 | $435.7 | |
ETH | <0.01% | $0.000001 | 642,466,189.0797 | $434.14 | |
ETH | <0.01% | $0.001704 | 251,262.55 | $428.26 | |
ETH | <0.01% | $0.270111 | 1,576.5239 | $425.84 | |
ETH | <0.01% | $0.118249 | 3,584.3177 | $423.84 | |
ETH | <0.01% | $0.000014 | 30,488,501.419 | $422.56 | |
ETH | <0.01% | $1.3 | 322.4357 | $419.17 | |
ETH | <0.01% | $0.126979 | 3,278.9325 | $416.36 | |
ETH | <0.01% | $0.010874 | 37,995.888 | $413.17 | |
ETH | <0.01% | $0.956044 | 431.7207 | $412.74 | |
ETH | <0.01% | $8.98 | 45.85 | $411.73 | |
ETH | <0.01% | $0.77295 | 531.5225 | $410.84 | |
ETH | <0.01% | $0.136666 | 2,997.6343 | $409.67 | |
ETH | <0.01% | $0.008338 | 48,921.9366 | $407.92 | |
ETH | <0.01% | <$0.000001 | 62,102,628,764.6166 | $405.1 | |
ETH | <0.01% | $0.000298 | 1,359,217.6241 | $404.8 | |
ETH | <0.01% | $0.610074 | 657.0105 | $400.83 | |
ETH | <0.01% | $0.000134 | 2,987,207.2151 | $399.96 | |
ETH | <0.01% | $0.034959 | 11,254.584 | $393.45 | |
ETH | <0.01% | $0.06747 | 5,827.5012 | $393.18 | |
ETH | <0.01% | $0.008057 | 48,707.1664 | $392.41 | |
ETH | <0.01% | $0.000132 | 2,969,729.591 | $391.86 | |
ETH | <0.01% | <$0.000001 | 1,964,403,004.0077 | $390.42 | |
ETH | <0.01% | $0.635645 | 613.3813 | $389.89 | |
ETH | <0.01% | $0.013836 | 27,982.0797 | $387.17 | |
ETH | <0.01% | $1.06 | 362.638 | $385.48 | |
ETH | <0.01% | $0.000193 | 2,000,326.9937 | $385.4 | |
ETH | <0.01% | <$0.000001 | 1,469,975,734.4426 | $382.73 | |
ETH | <0.01% | $0.031339 | 12,119.6771 | $379.82 | |
ETH | <0.01% | $0.129019 | 2,935.7616 | $378.77 | |
ETH | <0.01% | $0.018025 | 20,983.6723 | $378.24 | |
ETH | <0.01% | $643.45 | 0.5815 | $374.15 | |
ETH | <0.01% | $114.2 | 3.271 | $373.54 | |
ETH | <0.01% | $0.542024 | 686.1716 | $371.92 | |
ETH | <0.01% | $0.127642 | 2,892.5901 | $369.22 | |
ETH | <0.01% | $0.805103 | 455.1482 | $366.44 | |
ETH | <0.01% | $0.68286 | 531.1104 | $362.67 | |
ETH | <0.01% | $0.000851 | 425,278.4688 | $361.72 | |
ETH | <0.01% | $0.298335 | 1,209.9986 | $360.98 | |
ETH | <0.01% | $0.000006 | 57,065,127.9041 | $355.47 | |
ETH | <0.01% | <$0.000001 | 2,803,868,244.8089 | $354.29 | |
ETH | <0.01% | $0.018094 | 19,511.949 | $353.05 | |
ETH | <0.01% | $0.669331 | 526.5161 | $352.41 | |
ETH | <0.01% | $0.111294 | 3,166.1963 | $352.38 | |
ETH | <0.01% | $0.362204 | 965.2505 | $349.62 | |
ETH | <0.01% | $0.002217 | 156,996.8529 | $348.12 | |
ETH | <0.01% | <$0.000001 | 1,287,955,012.6573 | $347.88 | |
ETH | <0.01% | $0.000011 | 30,775,829.7227 | $343.12 | |
ETH | <0.01% | <$0.000001 | 4,454,338,684,055.5391 | $341.71 | |
ETH | <0.01% | $0.001623 | 210,354.9756 | $341.34 | |
ETH | <0.01% | $0.000205 | 1,652,611.79 | $339.56 | |
ETH | <0.01% | $0.000003 | 114,589,697.9811 | $338.04 | |
ETH | <0.01% | $0.06616 | 5,099.628 | $337.39 | |
ETH | <0.01% | $4.04 | 82.8739 | $334.81 | |
ETH | <0.01% | $2.75 | 120.4873 | $331.34 | |
ETH | <0.01% | $2.69 | 123.0984 | $331.13 | |
ETH | <0.01% | $0.000187 | 1,734,028.9733 | $324.29 | |
ETH | <0.01% | $0.008742 | 36,541.4433 | $319.45 | |
ETH | <0.01% | $0.109972 | 2,862.492 | $314.8 | |
ETH | <0.01% | $0.00051 | 615,480.1311 | $314.13 | |
ETH | <0.01% | $0.000003 | 119,307,972.8448 | $313.78 | |
ETH | <0.01% | $5.59 | 55.9499 | $312.76 | |
ETH | <0.01% | $0.003621 | 85,519.0059 | $309.67 | |
ETH | <0.01% | $0.349318 | 870.5338 | $304.09 | |
ETH | <0.01% | $0.081596 | 3,719.7788 | $303.52 | |
ETH | <0.01% | $0.089377 | 3,366.4231 | $300.88 | |
ETH | <0.01% | $0.02367 | 12,689.8832 | $300.37 | |
ETH | <0.01% | $0.000001 | 375,738,529.3287 | $299.47 | |
ETH | <0.01% | $0.094347 | 3,171.4032 | $299.21 | |
ETH | <0.01% | $0.069626 | 4,237.939 | $295.07 | |
ETH | <0.01% | <$0.000001 | 9,167,806,855.5896 | $294.51 | |
ETH | <0.01% | $0.000015 | 19,695,305.9567 | $293.46 | |
ETH | <0.01% | $148.86 | 1.9655 | $292.59 | |
ETH | <0.01% | $0.014278 | 20,006.2588 | $285.65 | |
ETH | <0.01% | $0.000005 | 62,004,961.8082 | $285.22 | |
ETH | <0.01% | $1.91 | 148.0322 | $282.74 | |
ETH | <0.01% | $0.308639 | 915.6368 | $282.6 | |
ETH | <0.01% | $0.028748 | 9,823.6675 | $282.41 | |
ETH | <0.01% | $0.005969 | 47,252.2026 | $282.04 | |
ETH | <0.01% | $1.45 | 194.1842 | $281.92 | |
ETH | <0.01% | $0.000688 | 409,211.7704 | $281.66 | |
ETH | <0.01% | <$0.000001 | 110,353,899,116.8365 | $281.29 | |
ETH | <0.01% | $0.675485 | 414.1402 | $279.75 | |
ETH | <0.01% | $0.001412 | 197,705.1841 | $279.19 | |
ETH | <0.01% | <$0.000001 | 14,634,877,434,918,454 | $278.91 | |
ETH | <0.01% | $1,698.99 | 0.1636 | $277.91 | |
ETH | <0.01% | $0.072314 | 3,823.8533 | $276.52 | |
ETH | <0.01% | $2.38 | 115.3773 | $274.6 | |
ETH | <0.01% | $2.61 | 104.954 | $274.34 | |
ETH | <0.01% | $0.015966 | 17,137.5475 | $273.62 | |
ETH | <0.01% | $0.252772 | 1,074.9923 | $271.73 | |
ETH | <0.01% | $19.88 | 13.4181 | $266.75 | |
ETH | <0.01% | $0.001746 | 151,463.7184 | $264.41 | |
ETH | <0.01% | $0.092864 | 2,823.282 | $262.18 | |
ETH | <0.01% | $1 | 261.67 | $261.67 | |
ETH | <0.01% | $0.891311 | 293.5076 | $261.61 | |
ETH | <0.01% | $0.22459 | 1,163.428 | $261.29 | |
ETH | <0.01% | $0.321599 | 809.9644 | $260.48 | |
ETH | <0.01% | $0.027641 | 9,382.2718 | $259.34 | |
ETH | <0.01% | $0.000051 | 5,045,772.2788 | $257.44 | |
ETH | <0.01% | $0.030068 | 8,491.7313 | $255.33 | |
ETH | <0.01% | $0.998419 | 255.4081 | $255 | |
ETH | <0.01% | $3.33 | 76.218 | $253.81 | |
ETH | <0.01% | <$0.000001 | 298,355,681,807.1688 | $252.48 | |
ETH | <0.01% | $0.398882 | 628.7515 | $250.8 | |
ETH | <0.01% | $0.014497 | 17,232.5814 | $249.82 | |
ETH | <0.01% | $0.003423 | 72,742.9971 | $248.98 | |
ETH | <0.01% | $367.88 | 0.6746 | $248.19 | |
ETH | <0.01% | $0.010303 | 23,918.3424 | $246.43 | |
ETH | <0.01% | $0.001875 | 130,845.822 | $245.35 | |
ETH | <0.01% | $9.95 | 24.4715 | $243.49 | |
ETH | <0.01% | $0.888177 | 273.8221 | $243.2 | |
ETH | <0.01% | $0.000009 | 27,581,424.7422 | $241.34 | |
ETH | <0.01% | $16.54 | 14.5609 | $240.84 | |
ETH | <0.01% | $0.000004 | 57,999,161.5763 | $240.12 | |
ETH | <0.01% | $0.025592 | 9,379.7649 | $240.05 | |
ETH | <0.01% | $0.000632 | 380,075.214 | $240.02 | |
ETH | <0.01% | $0.015713 | 15,229.066 | $239.3 | |
ETH | <0.01% | $0.374735 | 637.9178 | $239.05 | |
ETH | <0.01% | $10.5 | 22.5852 | $237.18 | |
ETH | <0.01% | <$0.000001 | 507,272,883.8441 | $236.81 | |
ETH | <0.01% | $0.800529 | 286.6324 | $229.46 | |
ETH | <0.01% | $0.087213 | 2,616.4426 | $228.19 | |
ETH | <0.01% | $0.000572 | 398,833.0549 | $227.93 | |
ETH | <0.01% | $1.05 | 216.302 | $226.25 | |
ETH | <0.01% | $0.072225 | 3,089.5844 | $223.15 | |
ETH | <0.01% | $0.3747 | 595.3714 | $223.09 | |
ETH | <0.01% | $0.016615 | 13,286.6051 | $220.76 | |
ETH | <0.01% | $3.76 | 57.7773 | $217.24 | |
ETH | <0.01% | $0.005362 | 40,414.1553 | $216.71 | |
ETH | <0.01% | $0.003902 | 55,460.7345 | $216.41 | |
ETH | <0.01% | $0.00014 | 1,540,094.3641 | $216.32 | |
ETH | <0.01% | $7.2 | 29.9903 | $215.93 | |
ETH | <0.01% | $0.005792 | 37,213.2601 | $215.53 | |
ETH | <0.01% | $0.000529 | 406,979.9474 | $215.3 | |
ETH | <0.01% | $0.001315 | 162,687.7905 | $213.92 | |
ETH | <0.01% | $0.091798 | 2,318.5088 | $212.83 | |
ETH | <0.01% | <$0.000001 | 601,975,954.8597 | $211.12 | |
ETH | <0.01% | $0.030555 | 6,893.1478 | $210.62 | |
ETH | <0.01% | $0.006072 | 34,582.0375 | $209.97 | |
ETH | <0.01% | $0.000003 | 65,129,241.4366 | $209.21 | |
ETH | <0.01% | $5.99 | 34.835 | $208.66 | |
ETH | <0.01% | $0.043863 | 4,733.3893 | $207.62 | |
ETH | <0.01% | $0.202917 | 999.2071 | $202.76 | |
ETH | <0.01% | $0.025048 | 8,079.7507 | $202.38 | |
ETH | <0.01% | $0.0623 | 3,212.7496 | $200.15 | |
ETH | <0.01% | $0.00285 | 70,104.7725 | $199.77 | |
ETH | <0.01% | <$0.000001 | 68,341,281,554.8002 | $199.21 | |
ETH | <0.01% | $0.006616 | 30,072.1754 | $198.95 | |
ETH | <0.01% | $0.00864 | 22,938.1178 | $198.19 | |
ETH | <0.01% | $0.014723 | 13,460.8902 | $198.19 | |
ETH | <0.01% | $0.000383 | 514,760.1632 | $196.94 | |
ETH | <0.01% | $0.048909 | 4,016.8778 | $196.46 | |
ETH | <0.01% | $0.000012 | 15,661,126.7417 | $194.82 | |
ETH | <0.01% | $0.003119 | 61,978.2457 | $193.29 | |
ETH | <0.01% | $0.538733 | 350.8744 | $189.03 | |
ETH | <0.01% | $0.058732 | 3,218.2939 | $189.02 | |
ETH | <0.01% | $2.7 | 69.8549 | $188.61 | |
ETH | <0.01% | $0.095012 | 1,941.6103 | $184.48 | |
ETH | <0.01% | $0.526785 | 348.8358 | $183.76 | |
ETH | <0.01% | $0.212123 | 864.6802 | $183.42 | |
ETH | <0.01% | $13.56 | 13.4618 | $182.54 | |
ETH | <0.01% | $0.002251 | 80,837.6492 | $181.97 | |
ETH | <0.01% | $0.076307 | 2,376.7688 | $181.36 | |
ETH | <0.01% | <$0.000001 | 1,948,491,040.3356 | $180.27 | |
ETH | <0.01% | $0.092892 | 1,923.8601 | $178.71 | |
ETH | <0.01% | $0.000641 | 278,302.6531 | $178.48 | |
ETH | <0.01% | $0.097173 | 1,820.2417 | $176.88 | |
ETH | <0.01% | $0.000067 | 2,630,109.2888 | $176.38 | |
ETH | <0.01% | $0.032266 | 5,372.8688 | $173.36 | |
ETH | <0.01% | $0.16431 | 1,053.5466 | $173.11 | |
ETH | <0.01% | $0.131923 | 1,305.2778 | $172.2 | |
ETH | <0.01% | $0.003253 | 52,703.8127 | $171.44 | |
ETH | <0.01% | $0.000003 | 55,908,241.7365 | $171.13 | |
ETH | <0.01% | $0.01582 | 10,771.6839 | $170.41 | |
ETH | <0.01% | $0.002251 | 75,298.6753 | $169.5 | |
ETH | <0.01% | $0.205387 | 824.6156 | $169.37 | |
ETH | <0.01% | $22.83 | 7.3657 | $168.16 | |
ETH | <0.01% | $3.62 | 46.3378 | $167.77 | |
ETH | <0.01% | <$0.000001 | 45,164,227,538.6388 | $167.14 | |
ETH | <0.01% | <$0.000001 | 99,391,643,023,844,416 | $166.18 | |
ETH | <0.01% | $0.000742 | 223,865.3812 | $166.18 | |
ETH | <0.01% | $0.006762 | 24,575.7753 | $166.18 | |
ETH | <0.01% | $0.007339 | 22,545.9552 | $165.46 | |
ETH | <0.01% | $0.816093 | 201.1631 | $164.17 | |
ETH | <0.01% | $0.000074 | 2,216,991.4145 | $163.53 | |
ETH | <0.01% | $3.16 | 51.1449 | $161.62 | |
ETH | <0.01% | $0.000942 | 171,222.7593 | $161.21 | |
ETH | <0.01% | $0.020459 | 7,815.4604 | $159.9 | |
ETH | <0.01% | $0.344381 | 462.963 | $159.44 | |
ETH | <0.01% | $0.281628 | 563.6124 | $158.73 | |
ETH | <0.01% | $0.017855 | 8,841.6092 | $157.87 | |
ETH | <0.01% | $0.007936 | 19,826.4062 | $157.35 | |
ETH | <0.01% | $0.020276 | 7,749.5048 | $157.13 | |
ETH | <0.01% | $0.686934 | 227.1907 | $156.07 | |
ETH | <0.01% | $1.39 | 111.8844 | $155.52 | |
ETH | <0.01% | $0.229414 | 675.6254 | $155 | |
ETH | <0.01% | $0.014411 | 10,752.9369 | $154.96 | |
ETH | <0.01% | $0.914778 | 166.6847 | $152.48 | |
ETH | <0.01% | $0.128436 | 1,180.066 | $151.56 | |
ETH | <0.01% | $0.775796 | 195.1065 | $151.36 | |
ETH | <0.01% | $65.74 | 2.2499 | $147.91 | |
ETH | <0.01% | <$0.000001 | 47,356,990,170.1815 | $147.66 | |
ETH | <0.01% | $0.000001 | 194,358,476.8109 | $146.02 | |
ETH | <0.01% | $1.19 | 122.6799 | $145.99 | |
ETH | <0.01% | $0.000108 | 1,341,445.6678 | $145.32 | |
ETH | <0.01% | $0.008932 | 16,252.1095 | $145.16 | |
ETH | <0.01% | $0.133525 | 1,081.0388 | $144.35 | |
ETH | <0.01% | $0.122026 | 1,181.7892 | $144.21 | |
ETH | <0.01% | $2.78 | 51.4661 | $143.04 | |
ETH | <0.01% | $0.2783 | 512.0954 | $142.52 | |
ETH | <0.01% | $0.000287 | 495,086.4833 | $142.02 | |
ETH | <0.01% | $0.000469 | 302,738.3306 | $142.01 | |
ETH | <0.01% | $0.073726 | 1,923.3252 | $141.8 | |
ETH | <0.01% | $0.055395 | 2,558.0308 | $141.7 | |
ETH | <0.01% | $0.000002 | 57,927,407.1827 | $140.76 | |
ETH | <0.01% | <$0.000001 | 1,676,574,308,175.29 | $140.32 | |
ETH | <0.01% | $0.104466 | 1,340.2819 | $140.01 | |
ETH | <0.01% | $2.34 | 59.7528 | $139.82 | |
ETH | <0.01% | $0.014156 | 9,875.7584 | $139.8 | |
ETH | <0.01% | $0.008729 | 15,977.7188 | $139.47 | |
ETH | <0.01% | $0.070971 | 1,950.7712 | $138.45 | |
ETH | <0.01% | $0.000331 | 417,973.0677 | $138.45 | |
ETH | <0.01% | $0.000004 | 36,664,461.2122 | $138.38 | |
ETH | <0.01% | $0.214938 | 639.4845 | $137.45 | |
ETH | <0.01% | <$0.000001 | 480,967,879,167.7176 | $136.93 | |
ETH | <0.01% | $0.273248 | 500.0057 | $136.63 | |
ETH | <0.01% | $1.3 | 105.0199 | $136.53 | |
ETH | <0.01% | $0.098998 | 1,376.3691 | $136.26 | |
ETH | <0.01% | $0.013404 | 10,125.4682 | $135.73 | |
ETH | <0.01% | $0.025396 | 5,337.4752 | $135.55 | |
ETH | <0.01% | <$0.000001 | 39,001,718,544.2117 | $135.49 | |
ETH | <0.01% | $0.000001 | 111,587,829.219 | $135.02 | |
ETH | <0.01% | $1.04 | 129.6806 | $134.87 | |
ETH | <0.01% | $0.000015 | 8,783,401.237 | $134.03 | |
ETH | <0.01% | <$0.000001 | 22,539,854,428.3042 | $133.26 | |
ETH | <0.01% | $0.006767 | 19,591.5042 | $132.57 | |
ETH | <0.01% | $0.000027 | 4,956,356.7048 | $132.19 | |
ETH | <0.01% | $0.722094 | 181.4481 | $131.02 | |
ETH | <0.01% | $0.083718 | 1,560.5327 | $130.64 | |
ETH | <0.01% | $0.213932 | 610.2259 | $130.55 | |
ETH | <0.01% | $0.002108 | 61,564.229 | $129.78 | |
ETH | <0.01% | $0.051133 | 2,522.4571 | $128.98 | |
ETH | <0.01% | $0.022916 | 5,546.4975 | $127.1 | |
ETH | <0.01% | $0.008529 | 14,731.4842 | $125.64 | |
ETH | <0.01% | $57,671.17 | 0.0021747 | $125.42 | |
ETH | <0.01% | $6.27 | 19.8496 | $124.46 | |
ETH | <0.01% | <$0.000001 | 2,281,077,166.2484 | $124.19 | |
ETH | <0.01% | $0.000348 | 354,185.0856 | $123.41 | |
ETH | <0.01% | $0.171964 | 715.0842 | $122.97 | |
ETH | <0.01% | <$0.000001 | 17,306,194,221.0198 | $122.89 | |
ETH | <0.01% | $2.51 | 48.6747 | $122.17 | |
ETH | <0.01% | $0.001092 | 111,819.2858 | $122.05 | |
ETH | <0.01% | $0.003429 | 35,582.3657 | $122 | |
ETH | <0.01% | $0.000014 | 8,778,953.1244 | $121.94 | |
ETH | <0.01% | $0.50756 | 238.8152 | $121.21 | |
ETH | <0.01% | $0.000001 | 92,998,768.4888 | $120.29 | |
ETH | <0.01% | $0.091162 | 1,299.7833 | $118.49 | |
ETH | <0.01% | $51.69 | 2.2877 | $118.25 | |
ETH | <0.01% | $0.000507 | 232,678.7183 | $117.89 | |
ETH | <0.01% | $0.009078 | 12,950.7694 | $117.56 | |
ETH | <0.01% | $0.02044 | 5,730.8149 | $117.14 | |
ETH | <0.01% | $0.000001 | 103,456,922.2993 | $116.91 | |
ETH | <0.01% | $0.031919 | 3,654.8728 | $116.66 | |
ETH | <0.01% | <$0.000001 | 48,753,107,337.1321 | $116.32 | |
ETH | <0.01% | $0.000412 | 281,311.0413 | $115.82 | |
ETH | <0.01% | $0.000418 | 275,413.9463 | $115.02 | |
ETH | <0.01% | $0.047121 | 2,410.8454 | $113.6 | |
ETH | <0.01% | $0.00213 | 53,165.1474 | $113.23 | |
ETH | <0.01% | $0.336435 | 336.0933 | $113.07 | |
ETH | <0.01% | $0.000033 | 3,428,095.9124 | $112.54 | |
ETH | <0.01% | <$0.000001 | 300,796,036.0541 | $111.21 | |
ETH | <0.01% | $0.01868 | 5,946.5959 | $111.09 | |
ETH | <0.01% | <$0.000001 | 2,867,250,184.024 | $110.92 | |
ETH | <0.01% | <$0.000001 | 2,510,731,709.7873 | $110.56 | |
ETH | <0.01% | $0.31171 | 353.1967 | $110.09 | |
ETH | <0.01% | $0.058462 | 1,877.5595 | $109.77 | |
ETH | <0.01% | <$0.000001 | 437,283,350,287.4806 | $108.12 | |
ETH | <0.01% | $0.140286 | 770.0126 | $108.02 | |
ETH | <0.01% | $7.96 | 13.4793 | $107.3 | |
ETH | <0.01% | $0.000038 | 2,785,725.7097 | $106.94 | |
ETH | <0.01% | $0.013895 | 7,685.9773 | $106.8 | |
ETH | <0.01% | $0.005252 | 20,306.8452 | $106.64 | |
ETH | <0.01% | $0.004528 | 23,552.4939 | $106.63 | |
ETH | <0.01% | $0.001777 | 59,547.6301 | $105.8 | |
ETH | <0.01% | $103,854 | 0.0010086 | $104.75 | |
ETH | <0.01% | $0.000317 | 329,672.6202 | $104.66 | |
ETH | <0.01% | $0.015016 | 6,871.2744 | $103.18 | |
ETH | <0.01% | $0.039069 | 2,622.7069 | $102.47 | |
ETH | <0.01% | <$0.000001 | 2,276,039,884.5134 | $102.35 | |
ETH | <0.01% | $0.853553 | 119.7999 | $102.26 | |
ETH | <0.01% | $0.15746 | 649.1407 | $102.21 | |
ETH | <0.01% | $0.006157 | 16,521.8943 | $101.73 | |
ETH | <0.01% | $0.000014 | 7,214,847.0046 | $101.44 | |
ETH | <0.01% | $0.034809 | 2,913.0963 | $101.4 | |
ETH | <0.01% | $0.149071 | 675.317 | $100.67 | |
ETH | <0.01% | $0.000003 | 36,405,186.7413 | $100.44 | |
ETH | <0.01% | $0.002201 | 45,581.5942 | $100.34 | |
ETH | <0.01% | $0.12616 | 792.3503 | $99.96 | |
ETH | <0.01% | $0.018946 | 5,263.3292 | $99.72 | |
ETH | <0.01% | $0.010311 | 9,576.418 | $98.74 | |
ETH | <0.01% | $1.16 | 84.8312 | $98.4 | |
ETH | <0.01% | $16 | 6.1455 | $98.33 | |
ETH | <0.01% | $0.000001 | 96,918,737.1528 | $98.19 | |
ETH | <0.01% | $0.705877 | 138.6656 | $97.88 | |
ETH | <0.01% | $1.21 | 80.4817 | $97.57 | |
ETH | <0.01% | $0.065105 | 1,495.15 | $97.34 | |
ETH | <0.01% | $0.012916 | 7,492.2666 | $96.77 | |
ETH | <0.01% | $0.024328 | 3,965.8625 | $96.48 | |
ETH | <0.01% | $6.64 | 14.5247 | $96.44 | |
ETH | <0.01% | $0.002878 | 33,425.9006 | $96.2 | |
ETH | <0.01% | $0.000757 | 127,010.4912 | $96.18 | |
ETH | <0.01% | $0.08011 | 1,198.6211 | $96.02 | |
ETH | <0.01% | $0.015384 | 6,240.905 | $96.01 | |
ETH | <0.01% | <$0.000001 | 3,579,082,416.2218 | $95.52 | |
ETH | <0.01% | $0.001471 | 64,919.1635 | $95.47 | |
ETH | <0.01% | $0.269757 | 351.3003 | $94.77 | |
ETH | <0.01% | $6.34 | 14.92 | $94.59 | |
ETH | <0.01% | <$0.000001 | 34,726,333,719.2337 | $94.54 | |
ETH | <0.01% | $0.000005 | 18,691,418.6822 | $92.71 | |
ETH | <0.01% | $0.000002 | 45,966,165.5128 | $92.39 | |
ETH | <0.01% | $0.004086 | 22,584.4591 | $92.28 | |
ETH | <0.01% | $0.003764 | 24,430.4964 | $91.97 | |
ETH | <0.01% | $0.001983 | 46,283.5046 | $91.78 | |
ETH | <0.01% | $1 | 91.633 | $91.72 | |
ETH | <0.01% | <$0.000001 | 4,067,958,826,520.2637 | $91.4 | |
ETH | <0.01% | $4.6 | 19.7946 | $91.06 | |
ETH | <0.01% | $0.07066 | 1,285.7656 | $90.85 | |
ETH | <0.01% | $0.001186 | 76,211.6298 | $90.39 | |
ETH | <0.01% | $13.32 | 6.6538 | $88.64 | |
ETH | <0.01% | $0.006014 | 14,692.9488 | $88.36 | |
ETH | <0.01% | $0.034831 | 2,530.6003 | $88.14 | |
ETH | <0.01% | $0.069536 | 1,266.8329 | $88.09 | |
ETH | <0.01% | <$0.000001 | 129,909,374,826.927 | $87.95 | |
ETH | <0.01% | $0.037196 | 2,358.5044 | $87.73 | |
ETH | <0.01% | $0.000106 | 826,742.6188 | $87.44 | |
ETH | <0.01% | $0.01401 | 6,239.0919 | $87.41 | |
ETH | <0.01% | $0.503443 | 173.5402 | $87.37 | |
ETH | <0.01% | $0.022904 | 3,799.5665 | $87.03 | |
ETH | <0.01% | $0.23041 | 377.0882 | $86.88 | |
ETH | <0.01% | $0.013245 | 6,520.5455 | $86.36 | |
ETH | <0.01% | $1.18 | 72.851 | $85.96 | |
ETH | <0.01% | $0.000001 | 75,798,444.7973 | $85.96 | |
ETH | <0.01% | $0.018957 | 4,514.7776 | $85.59 | |
ETH | <0.01% | $0.000228 | 375,284.97 | $85.55 | |
ETH | <0.01% | $2,650.85 | 0.0322 | $85.24 | |
ETH | <0.01% | $0.008079 | 10,325.5153 | $83.42 | |
ETH | <0.01% | $0.03193 | 2,611.8662 | $83.4 | |
ETH | <0.01% | $116.01 | 0.7147 | $82.91 | |
ETH | <0.01% | <$0.000001 | 1,425,679,573.0624 | $82.85 | |
ETH | <0.01% | $0.059408 | 1,393.8829 | $82.81 | |
ETH | <0.01% | $0.046466 | 1,778.4133 | $82.64 | |
ETH | <0.01% | $0.464406 | 177.7912 | $82.57 | |
ETH | <0.01% | $11.06 | 7.4438 | $82.36 | |
ETH | <0.01% | $0.384333 | 213.8088 | $82.17 | |
ETH | <0.01% | $0.000201 | 406,604.7374 | $81.85 | |
ETH | <0.01% | $0.000641 | 127,524.7166 | $81.71 | |
ETH | <0.01% | $0.085242 | 954.9633 | $81.4 | |
ETH | <0.01% | $0.010582 | 7,647.5849 | $80.92 | |
ETH | <0.01% | $0.001932 | 41,628.6608 | $80.42 | |
ETH | <0.01% | $0.001037 | 75,914.2091 | $78.7 | |
ETH | <0.01% | $1 | 77.9173 | $77.92 | |
ETH | <0.01% | $3,338.24 | 0.0233 | $77.87 | |
ETH | <0.01% | $0.000495 | 157,070.876 | $77.8 | |
ETH | <0.01% | $0.000045 | 1,733,086.5547 | $77.42 | |
ETH | <0.01% | $0.958943 | 79.0419 | $75.8 | |
ETH | <0.01% | $8.96 | 8.4154 | $75.4 | |
ETH | <0.01% | $1.3 | 57.6701 | $74.97 | |
ETH | <0.01% | $369.66 | 0.2017 | $74.57 | |
ETH | <0.01% | $0.056356 | 1,319.993 | $74.39 | |
ETH | <0.01% | $0.000033 | 2,269,221.7944 | $74.11 | |
ETH | <0.01% | $0.00001 | 7,132,628.8381 | $74.06 | |
ETH | <0.01% | $0.000523 | 141,547.7192 | $73.99 | |
ETH | <0.01% | $0.006859 | 10,727.4804 | $73.58 | |
ETH | <0.01% | $0.354346 | 206.9834 | $73.34 | |
ETH | <0.01% | $0.041869 | 1,744.7366 | $73.05 | |
ETH | <0.01% | $0.000128 | 570,522.2385 | $72.91 | |
ETH | <0.01% | $0.46308 | 155.8034 | $72.15 | |
ETH | <0.01% | <$0.000001 | 60,007,361,929.0706 | $71.99 | |
ETH | <0.01% | $0.037512 | 1,918.7601 | $71.98 | |
ETH | <0.01% | $0.010226 | 7,010.3472 | $71.69 | |
ETH | <0.01% | $0.001404 | 51,040.8585 | $71.69 | |
ETH | <0.01% | $0.044797 | 1,596.5213 | $71.52 | |
ETH | <0.01% | $3.14 | 22.6131 | $71 | |
ETH | <0.01% | $0.000904 | 78,523.0778 | $71 | |
ETH | <0.01% | $0.997962 | 70.9958 | $70.85 | |
ETH | <0.01% | <$0.000001 | 5,825,017,311.4648 | $70.82 | |
ETH | <0.01% | $0.000146 | 484,037.2024 | $70.65 | |
ETH | <0.01% | $1.02 | 69.0661 | $70.59 | |
ETH | <0.01% | $0.01677 | 4,190.5973 | $70.28 | |
ETH | <0.01% | $0.154796 | 453.0963 | $70.14 | |
ETH | <0.01% | $0.000184 | 379,913.1234 | $69.95 | |
ETH | <0.01% | $0.005578 | 12,522.7731 | $69.85 | |
ETH | <0.01% | $0.404099 | 172.2749 | $69.62 | |
ETH | <0.01% | $0.000263 | 264,225.012 | $69.48 | |
ETH | <0.01% | $1 | 69.101 | $69.11 | |
ETH | <0.01% | $0.084588 | 816.0321 | $69.03 | |
ETH | <0.01% | $0.000001 | 74,202,257.8296 | $68.9 | |
ETH | <0.01% | $0.158433 | 430.7047 | $68.24 | |
ETH | <0.01% | $0.001407 | 48,486.4932 | $68.22 | |
ETH | <0.01% | $0.000086 | 793,201.4694 | $67.95 | |
ETH | <0.01% | $0.001067 | 63,636.8602 | $67.89 | |
ETH | <0.01% | $0.000001 | 92,883,619.2354 | $67.79 | |
ETH | <0.01% | $0.000806 | 83,089.9993 | $66.96 | |
ETH | <0.01% | <$0.000001 | 1,275,488,362.2864 | $66.82 | |
ETH | <0.01% | $0.000615 | 108,596.352 | $66.75 | |
ETH | <0.01% | $0.000346 | 192,998.0653 | $66.68 | |
ETH | <0.01% | $0.90506 | 73.6183 | $66.63 | |
ETH | <0.01% | $0.002784 | 23,921.3933 | $66.6 | |
ETH | <0.01% | $0.002943 | 22,484.383 | $66.18 | |
ETH | <0.01% | $1 | 66.0816 | $66.08 | |
ETH | <0.01% | $0.998518 | 64.9713 | $64.87 | |
ETH | <0.01% | $0.027466 | 2,361.7412 | $64.87 | |
ETH | <0.01% | $0.060462 | 1,068.7682 | $64.62 | |
ETH | <0.01% | $0.000001 | 75,256,135.4276 | $64.53 | |
ETH | <0.01% | $0.056995 | 1,128.4698 | $64.32 | |
ETH | <0.01% | $0.090135 | 711.2885 | $64.11 | |
ETH | <0.01% | $0.03926 | 1,626.1909 | $63.84 | |
ETH | <0.01% | $0.002948 | 21,439.5058 | $63.21 | |
ETH | <0.01% | <$0.000001 | 5,955,171,481.6425 | $63.18 | |
ETH | <0.01% | <$0.000001 | 40,418,722,332.4288 | $63.17 | |
ETH | <0.01% | $0.634763 | 99.1723 | $62.95 | |
ETH | <0.01% | $0.000006 | 11,327,558.9197 | $62.69 | |
ETH | <0.01% | $0.000199 | 313,946.0916 | $62.58 | |
ETH | <0.01% | $0.005773 | 10,802.2213 | $62.36 | |
ETH | <0.01% | $0.000049 | 1,261,480.4194 | $62.25 | |
ETH | <0.01% | $0.010182 | 6,104.6349 | $62.16 | |
ETH | <0.01% | $1.45 | 42.6422 | $61.94 | |
ETH | <0.01% | $0.298343 | 205.9631 | $61.45 | |
ETH | <0.01% | $0.000206 | 295,724.8258 | $60.94 | |
ETH | <0.01% | $0.000656 | 92,586.8297 | $60.78 | |
ETH | <0.01% | $0.041831 | 1,451.1065 | $60.7 | |
ETH | <0.01% | <$0.000001 | 13,596,501,132.6673 | $60.51 | |
ETH | <0.01% | $7.97 | 7.4937 | $59.71 | |
ETH | <0.01% | $0.013175 | 4,520.9958 | $59.57 | |
ETH | <0.01% | $0.1377 | 431.6432 | $59.44 | |
ETH | <0.01% | $0.000104 | 570,715.0723 | $59.35 | |
ETH | <0.01% | $0.042359 | 1,396.5845 | $59.16 | |
ETH | <0.01% | $0.160723 | 366.6793 | $58.93 | |
ETH | <0.01% | $0.001671 | 35,068.3495 | $58.6 | |
ETH | <0.01% | $0.280275 | 208.6846 | $58.49 | |
ETH | <0.01% | $0.122197 | 477.4305 | $58.34 | |
ETH | <0.01% | <$0.000001 | 152,556,288.2346 | $58.23 | |
ETH | <0.01% | <$0.000001 | 11,109,663,868.5683 | $57.92 | |
ETH | <0.01% | $0.000355 | 162,950.1112 | $57.92 | |
ETH | <0.01% | $69.52 | 0.8278 | $57.55 | |
ETH | <0.01% | $0.003175 | 18,077.3953 | $57.4 | |
ETH | <0.01% | $0.008048 | 7,099.639 | $57.14 | |
ETH | <0.01% | $2.32 | 24.5935 | $57.06 | |
ETH | <0.01% | $0.252945 | 223.5509 | $56.55 | |
ETH | <0.01% | <$0.000001 | 3,045,859,338.1122 | $56.51 | |
ETH | <0.01% | $0.010926 | 5,144.4176 | $56.21 | |
ETH | <0.01% | $0.01383 | 4,048.2917 | $55.99 | |
ETH | <0.01% | $0.114807 | 486.4266 | $55.85 | |
ETH | <0.01% | $0.62443 | 88.6653 | $55.37 | |
ETH | <0.01% | $0.000001 | 37,956,893.911 | $55.22 | |
ETH | <0.01% | <$0.000001 | 670,670,317,397.1604 | $54.45 | |
ETH | <0.01% | $0.001037 | 52,265.9932 | $54.22 | |
ETH | <0.01% | $0.031046 | 1,734.0927 | $53.84 | |
ETH | <0.01% | $0.002091 | 25,731.0676 | $53.81 | |
ETH | <0.01% | $0.007936 | 6,715.282 | $53.29 | |
ETH | <0.01% | <$0.000001 | 26,286,305,152.887 | $52.68 | |
ETH | <0.01% | <$0.000001 | 1,491,093,298.3973 | $52.42 | |
ETH | <0.01% | $28.58 | 1.8335 | $52.4 | |
ETH | <0.01% | $0.000052 | 997,924.3591 | $52.33 | |
ETH | <0.01% | $0.011198 | 4,636.9978 | $51.93 | |
ETH | <0.01% | $2,481.37 | 0.0208 | $51.56 | |
ETH | <0.01% | $0.001294 | 39,792.6356 | $51.5 | |
ETH | <0.01% | $0.157072 | 327.0111 | $51.36 | |
ETH | <0.01% | $0.000762 | 67,033.3018 | $51.06 | |
ETH | <0.01% | $0.012191 | 4,170.5302 | $50.84 | |
ETH | <0.01% | $2.99 | 16.9312 | $50.62 | |
ETH | <0.01% | <$0.000001 | 979,401,365.7582 | $50.62 | |
ETH | <0.01% | $0.047877 | 1,056.2946 | $50.57 | |
ETH | <0.01% | $0.001889 | 26,508.1771 | $50.08 | |
ETH | <0.01% | $0.001628 | 30,745.7345 | $50.06 | |
ETH | <0.01% | $0.000141 | 352,627.5593 | $49.87 | |
ETH | <0.01% | $0.020378 | 2,446.8759 | $49.86 | |
ETH | <0.01% | $0.003739 | 13,286.1099 | $49.67 | |
ETH | <0.01% | $0.001908 | 26,015.276 | $49.63 | |
ETH | <0.01% | $0.055538 | 887.4425 | $49.29 | |
ETH | <0.01% | $0.054377 | 903.0661 | $49.11 | |
ETH | <0.01% | $0.000082 | 594,141.5078 | $48.93 | |
ETH | <0.01% | $2,602.5 | 0.0188 | $48.86 | |
ETH | <0.01% | $0.632173 | 77.2173 | $48.81 | |
ETH | <0.01% | $2,821.04 | 0.0173 | $48.67 | |
ETH | <0.01% | $19 | 2.5482 | $48.42 | |
ETH | <0.01% | $0.033039 | 1,464.6837 | $48.39 | |
ETH | <0.01% | $0.015703 | 3,081.5397 | $48.39 | |
ETH | <0.01% | $0.000058 | 827,179.9895 | $48.05 | |
ETH | <0.01% | $0.009153 | 5,226.6799 | $47.84 | |
ETH | <0.01% | $0.044327 | 1,076.863 | $47.73 | |
ETH | <0.01% | $0.000684 | 69,559.4415 | $47.58 | |
ETH | <0.01% | $0.000523 | 91,004.294 | $47.57 | |
ETH | <0.01% | <$0.000001 | 608,107,093.8232 | $47.5 | |
ETH | <0.01% | $0.000091 | 517,943.7533 | $47.37 | |
ETH | <0.01% | $0.000002 | 30,953,324.3917 | $47.36 | |
ETH | <0.01% | $0.000575 | 81,164.464 | $46.71 | |
ETH | <0.01% | $0.000008 | 6,151,775.8804 | $46.63 | |
ETH | <0.01% | $0.047821 | 970.343 | $46.4 | |
ETH | <0.01% | $1.28 | 36.2459 | $46.39 | |
ETH | <0.01% | $0.092675 | 500.0021 | $46.34 | |
ETH | <0.01% | $0.015549 | 2,976.6577 | $46.28 | |
ETH | <0.01% | $0.03541 | 1,304.2804 | $46.18 | |
ETH | <0.01% | $0.027368 | 1,687.1145 | $46.17 | |
ETH | <0.01% | $0.136513 | 337.6581 | $46.09 | |
ETH | <0.01% | $0.205159 | 224.4628 | $46.05 | |
ETH | <0.01% | $0.172637 | 266.5471 | $46.02 | |
ETH | <0.01% | $0.0034 | 13,502.7732 | $45.9 | |
ETH | <0.01% | $0.012985 | 3,535.1642 | $45.9 | |
ETH | <0.01% | $0.007849 | 5,843.8495 | $45.87 | |
ETH | <0.01% | <$0.000001 | 79,081,059,235.4182 | $45.52 | |
ETH | <0.01% | <$0.000001 | 42,562,840,831,026.742 | $45.49 | |
ETH | <0.01% | $0.958697 | 47.3916 | $45.43 | |
ETH | <0.01% | $0.037501 | 1,200.6884 | $45.03 | |
ETH | <0.01% | $0.047369 | 947.6652 | $44.89 | |
ETH | <0.01% | $0.102521 | 437.7047 | $44.87 | |
ETH | <0.01% | $0.024051 | 1,864.9301 | $44.85 | |
ETH | <0.01% | $0.000706 | 63,485.3919 | $44.79 | |
ETH | <0.01% | $0.001757 | 25,438.0612 | $44.69 | |
ETH | <0.01% | $0.027813 | 1,601.3161 | $44.54 | |
ETH | <0.01% | $0.081307 | 546.8492 | $44.46 | |
ETH | <0.01% | $3.27 | 13.5535 | $44.32 | |
ETH | <0.01% | $0.098575 | 449.3497 | $44.29 | |
ETH | <0.01% | $0.001083 | 40,878.9066 | $44.26 | |
ETH | <0.01% | $0.006375 | 6,938.2023 | $44.23 | |
ETH | <0.01% | $0.037234 | 1,175.4715 | $43.77 | |
ETH | <0.01% | $0.123626 | 351.639 | $43.47 | |
ETH | <0.01% | $0.000001 | 58,341,947.5403 | $43.46 | |
ETH | <0.01% | $0.019103 | 2,273.2644 | $43.43 | |
ETH | <0.01% | $0.008894 | 4,877.7955 | $43.38 | |
ETH | <0.01% | $12.95 | 3.3425 | $43.29 | |
ETH | <0.01% | $1.15 | 37.3968 | $43.01 | |
ETH | <0.01% | $0.021914 | 1,960.9708 | $42.97 | |
ETH | <0.01% | $0.01382 | 3,096.2243 | $42.79 | |
ETH | <0.01% | <$0.000001 | 24,391,883,747.0473 | $42.61 | |
ETH | <0.01% | <$0.000001 | 94,983,828.0415 | $42.27 | |
ETH | <0.01% | $0.000021 | 2,047,415.696 | $42.24 | |
ETH | <0.01% | $0.001999 | 21,052.309 | $42.08 | |
ETH | <0.01% | $0.000298 | 139,643.7459 | $41.66 | |
ETH | <0.01% | $0.007933 | 5,248.1318 | $41.64 | |
ETH | <0.01% | <$0.000001 | 41,342,800,540.6835 | $41.51 | |
ETH | <0.01% | $0.180766 | 228.6104 | $41.32 | |
ETH | <0.01% | $0.236373 | 174.3889 | $41.22 | |
ETH | <0.01% | $0.000747 | 55,012.1353 | $41.12 | |
ETH | <0.01% | $0.661562 | 61.4923 | $40.68 | |
ETH | <0.01% | $1.45 | 28.0149 | $40.63 | |
ETH | <0.01% | $0.026397 | 1,539.0749 | $40.63 | |
ETH | <0.01% | $0.013946 | 2,912.4395 | $40.62 | |
ETH | <0.01% | $0.000151 | 268,600.9473 | $40.55 | |
ETH | <0.01% | $0.182498 | 221.6797 | $40.46 | |
ETH | <0.01% | $1.14 | 35.46 | $40.42 | |
ETH | <0.01% | $0.00038 | 106,395.547 | $40.39 | |
ETH | <0.01% | $2.63 | 15.3316 | $40.32 | |
ETH | <0.01% | $0.071142 | 564.5922 | $40.17 | |
ETH | <0.01% | $0.010564 | 3,796.3718 | $40.1 | |
ETH | <0.01% | $0.053068 | 746.9386 | $39.64 | |
ETH | <0.01% | $3.68 | 10.6066 | $39.04 | |
ETH | <0.01% | $0.177447 | 219.4521 | $38.94 | |
ETH | <0.01% | $0.030812 | 1,262.1486 | $38.89 | |
ETH | <0.01% | $24.1 | 1.6042 | $38.65 | |
ETH | <0.01% | $0.177861 | 215.8801 | $38.4 | |
ETH | <0.01% | $0.008664 | 4,426.7605 | $38.35 | |
ETH | <0.01% | $0.036692 | 1,044.2694 | $38.32 | |
ETH | <0.01% | $0.000003 | 11,402,107.1821 | $37.85 | |
ETH | <0.01% | $0.001125 | 33,156.4428 | $37.31 | |
ETH | <0.01% | <$0.000001 | 44,135,523,007.899 | $37.18 | |
ETH | <0.01% | $0.013283 | 2,795.1753 | $37.13 | |
ETH | <0.01% | $0.003955 | 9,374.2192 | $37.08 | |
ETH | <0.01% | $0.014243 | 2,585.7088 | $36.83 | |
ETH | <0.01% | $0.212306 | 173.3453 | $36.8 | |
ETH | <0.01% | $0.01297 | 2,817.6583 | $36.54 | |
ETH | <0.01% | $0.006302 | 5,795.2474 | $36.52 | |
ETH | <0.01% | $0.05325 | 683.6692 | $36.41 | |
ETH | <0.01% | $0.000016 | 2,258,226.832 | $36.34 | |
ETH | <0.01% | $0.056521 | 637.5221 | $36.03 | |
ETH | <0.01% | $0.046223 | 779.376 | $36.03 | |
ETH | <0.01% | <$0.000001 | 91,361,560.8018 | $35.91 | |
ETH | <0.01% | $0.009784 | 3,664.2987 | $35.85 | |
ETH | <0.01% | $0.000116 | 305,696.5603 | $35.43 | |
ETH | <0.01% | <$0.000001 | 15,922,493,468.2386 | $35.39 | |
ETH | <0.01% | $0.19305 | 183.2564 | $35.38 | |
ETH | <0.01% | $0.13679 | 257.2945 | $35.2 | |
ETH | <0.01% | <$0.000001 | 239,642,690.5032 | $34.65 | |
ETH | <0.01% | $0.022141 | 1,560.9972 | $34.56 | |
ETH | <0.01% | $0.02255 | 1,531.6429 | $34.54 | |
ETH | <0.01% | $3.35 | 10.2969 | $34.51 | |
ETH | <0.01% | $0.034251 | 1,005.1856 | $34.43 | |
ETH | <0.01% | <$0.000001 | 84,200,227,827.2007 | $34.33 | |
ETH | <0.01% | $0.000003 | 11,152,758.6079 | $34.24 | |
ETH | <0.01% | <$0.000001 | 818,520,414.6787 | $34.23 | |
ETH | <0.01% | $0.000232 | 147,517.8604 | $34.23 | |
ETH | <0.01% | $0.041034 | 832.4443 | $34.16 | |
ETH | <0.01% | $0.000911 | 37,490.1627 | $34.14 | |
ETH | <0.01% | $0.053793 | 633.6549 | $34.09 | |
ETH | <0.01% | <$0.000001 | 126,582,008.0596 | $33.96 | |
ETH | <0.01% | $0.330204 | 102.5267 | $33.85 | |
ETH | <0.01% | $0.332809 | 101.6374 | $33.83 | |
ETH | <0.01% | $0.122319 | 275.9335 | $33.75 | |
ETH | <0.01% | $0.000193 | 173,970.2284 | $33.61 | |
ETH | <0.01% | $0.016492 | 2,019.9408 | $33.31 | |
ETH | <0.01% | <$0.000001 | 155,680,945,390.8187 | $33.25 | |
ETH | <0.01% | $0.000463 | 71,664.0662 | $33.17 | |
ETH | <0.01% | $5,815.38 | 0.00570298 | $33.17 | |
ETH | <0.01% | $0.000178 | 186,081.8476 | $33.07 | |
ETH | <0.01% | $0.012032 | 2,745.5398 | $33.03 | |
ETH | <0.01% | $0.000715 | 46,179.6116 | $33.01 | |
ETH | <0.01% | $0.00001 | 3,294,884.842 | $32.88 | |
ETH | <0.01% | $0.61406 | 53.2203 | $32.68 | |
ETH | <0.01% | $0.000064 | 514,048.2911 | $32.65 | |
ETH | <0.01% | $0.320016 | 101.814 | $32.58 | |
ETH | <0.01% | $0.000004 | 8,635,024.9065 | $32.45 | |
ETH | <0.01% | $664.89 | 0.0488 | $32.42 | |
ETH | <0.01% | <$0.000001 | 323,507,175.9252 | $32.17 | |
ETH | <0.01% | $0.018288 | 1,750.1088 | $32.01 | |
ETH | <0.01% | $0.018221 | 1,754.5619 | $31.97 | |
ETH | <0.01% | $0.000081 | 390,733.8897 | $31.81 | |
ETH | <0.01% | $0.000085 | 371,236.9866 | $31.54 | |
ETH | <0.01% | $0.057942 | 543.6398 | $31.5 | |
ETH | <0.01% | $0.001124 | 28,004.992 | $31.46 | |
ETH | <0.01% | $0.000112 | 281,270.3971 | $31.45 | |
ETH | <0.01% | $0.000851 | 36,858.5322 | $31.35 | |
ETH | <0.01% | $0.00043 | 72,732.2696 | $31.26 | |
ETH | <0.01% | $0.002733 | 11,428.6046 | $31.23 | |
ETH | <0.01% | $0.047837 | 652.1238 | $31.2 | |
ETH | <0.01% | $0.0003 | 103,848.715 | $31.18 | |
ETH | <0.01% | <$0.000001 | 19,155,188,309.3516 | $31.13 | |
ETH | <0.01% | $0.195907 | 158.2324 | $31 | |
ETH | <0.01% | $0.000087 | 350,736.6551 | $30.65 | |
ETH | <0.01% | $0.618386 | 49.5053 | $30.61 | |
ETH | <0.01% | $0.25409 | 120.1613 | $30.53 | |
ETH | <0.01% | $0.000033 | 908,427.1098 | $30.15 | |
ETH | <0.01% | $0.000008 | 3,536,829.6018 | $29.78 | |
ETH | <0.01% | <$0.000001 | 79,607,963,882.7876 | $29.69 | |
ETH | <0.01% | $14.34 | 2.0688 | $29.67 | |
ETH | <0.01% | $0.121646 | 240.4809 | $29.25 | |
ETH | <0.01% | $0.249019 | 117.3547 | $29.22 | |
ETH | <0.01% | $0.000521 | 56,042.1062 | $29.19 | |
ETH | <0.01% | $0.005302 | 5,502.4765 | $29.18 | |
ETH | <0.01% | $0.001248 | 23,346.6609 | $29.14 | |
ETH | <0.01% | $0.000391 | 73,274.0767 | $28.65 | |
ETH | <0.01% | $0.000107 | 266,519.4222 | $28.5 | |
ETH | <0.01% | $29.2 | 0.971 | $28.35 | |
ETH | <0.01% | $0.399121 | 70.2822 | $28.05 | |
ETH | <0.01% | <$0.000001 | 87,254,250.4877 | $27.98 | |
ETH | <0.01% | $0.00003 | 933,683.2759 | $27.76 | |
ETH | <0.01% | $0.000417 | 66,481.0052 | $27.71 | |
ETH | <0.01% | <$0.000001 | 70,982,167.8701 | $27.46 | |
ETH | <0.01% | <$0.000001 | 148,777,075.6904 | $27.42 | |
ETH | <0.01% | $0.000844 | 32,463.8618 | $27.4 | |
ETH | <0.01% | $0.461839 | 59.3057 | $27.39 | |
ETH | <0.01% | $0.002845 | 9,594.9974 | $27.3 | |
ETH | <0.01% | $0.009089 | 2,992.0621 | $27.19 | |
ETH | <0.01% | $0.000251 | 108,339.8005 | $27.18 | |
ETH | <0.01% | $0.018825 | 1,442.3979 | $27.15 | |
ETH | <0.01% | $0.003414 | 7,922.0733 | $27.05 | |
ETH | <0.01% | $0.005648 | 4,778.2441 | $26.99 | |
ETH | <0.01% | $0.039318 | 686.256 | $26.98 | |
ETH | <0.01% | <$0.000001 | 62,771,070.8739 | $26.91 | |
ETH | <0.01% | $0.000178 | 149,669.9017 | $26.65 | |
ETH | <0.01% | $0.000011 | 2,358,480.5548 | $26.65 | |
ETH | <0.01% | $0.000036 | 742,656.5221 | $26.54 | |
ETH | <0.01% | $0.001438 | 18,375.0483 | $26.42 | |
ETH | <0.01% | $0.000002 | 12,223,623.8969 | $26.4 | |
ETH | <0.01% | $0.003311 | 7,966.7563 | $26.38 | |
ETH | <0.01% | $0.998619 | 26.3627 | $26.33 | |
ETH | <0.01% | $0.001416 | 18,524.5945 | $26.23 | |
ETH | <0.01% | $0.002321 | 11,279.3015 | $26.18 | |
ETH | <0.01% | $0.005315 | 4,916.3573 | $26.13 | |
ETH | <0.01% | <$0.000001 | 38,436,455,891.6338 | $26.12 | |
ETH | <0.01% | $0.003905 | 6,660.0433 | $26.01 | |
ETH | <0.01% | $0.012839 | 2,025.4791 | $26.01 | |
ETH | <0.01% | $0.005728 | 4,528.9391 | $25.94 | |
ETH | <0.01% | $0.167378 | 154.6635 | $25.89 | |
ETH | <0.01% | <$0.000001 | 148,949,377.1545 | $25.89 | |
ETH | <0.01% | $0.091246 | 282.2126 | $25.75 | |
ETH | <0.01% | $0.005896 | 4,367.1723 | $25.75 | |
ETH | <0.01% | $0.000277 | 92,486.1323 | $25.6 | |
ETH | <0.01% | $0.006634 | 3,858.567 | $25.6 | |
ETH | <0.01% | $0.000001 | 32,135,106.8365 | $25.56 | |
ETH | <0.01% | $0.032381 | 788.5305 | $25.53 | |
ETH | <0.01% | $0.000159 | 159,809.0014 | $25.47 | |
ETH | <0.01% | <$0.000001 | 41,924,663,992.3404 | $25.34 | |
ETH | <0.01% | $0.004352 | 5,808.2863 | $25.28 | |
ETH | <0.01% | $0.00043 | 58,439.0932 | $25.12 | |
ETH | <0.01% | $0.002414 | 10,398.1836 | $25.1 | |
ETH | <0.01% | $0.003561 | 7,037.1744 | $25.06 | |
ETH | <0.01% | $0.030006 | 833.0072 | $24.99 | |
ETH | <0.01% | $0.027294 | 912.0221 | $24.89 | |
ETH | <0.01% | $3,312.88 | 0.0074843 | $24.79 | |
ETH | <0.01% | $0.002736 | 9,042.8245 | $24.74 | |
ETH | <0.01% | $0.001231 | 20,082.8225 | $24.72 | |
ETH | <0.01% | <$0.000001 | 171,131,264,727.8446 | $24.65 | |
ETH | <0.01% | $0.044618 | 551.9298 | $24.63 | |
ETH | <0.01% | $0.009146 | 2,691.9514 | $24.62 | |
ETH | <0.01% | $1.15 | 21.3538 | $24.56 | |
ETH | <0.01% | $0.072843 | 334.2243 | $24.35 | |
ETH | <0.01% | <$0.000001 | 104,037,152.9912 | $24.3 | |
ETH | <0.01% | <$0.000001 | 20,757,312,642.3687 | $24.29 | |
ETH | <0.01% | <$0.000001 | 308,285,829.7681 | $24.23 | |
ETH | <0.01% | $0.015849 | 1,528.4263 | $24.22 | |
ETH | <0.01% | $2.01 | 11.9338 | $23.99 | |
ETH | <0.01% | $0.006584 | 3,629.3587 | $23.9 | |
ETH | <0.01% | $0.00351 | 6,804.6583 | $23.89 | |
ETH | <0.01% | $0.000335 | 71,088.6878 | $23.85 | |
ETH | <0.01% | <$0.000001 | 66,893,813.5983 | $23.81 | |
ETH | <0.01% | $0.994912 | 23.7207 | $23.6 | |
ETH | <0.01% | $0.11188 | 209.5923 | $23.45 | |
ETH | <0.01% | $0.013002 | 1,801.7855 | $23.43 | |
ETH | <0.01% | $0.003169 | 7,364.4024 | $23.34 | |
ETH | <0.01% | $0.000002 | 10,835,370.2345 | $23.3 | |
ETH | <0.01% | $0.077406 | 300.6863 | $23.27 | |
ETH | <0.01% | <$0.000001 | 9,143,999,728.5002 | $23.23 | |
ETH | <0.01% | <$0.000001 | 27,251,576,652.7359 | $23.02 | |
ETH | <0.01% | $0.00513 | 4,483.2941 | $23 | |
ETH | <0.01% | $0.144806 | 158.6 | $22.97 | |
ETH | <0.01% | $0.000004 | 5,829,013.3154 | $22.97 | |
ETH | <0.01% | $0.059542 | 384.0829 | $22.87 | |
ETH | <0.01% | $0.000034 | 666,058.5724 | $22.84 | |
ETH | <0.01% | $0.004706 | 4,828.552 | $22.72 | |
ETH | <0.01% | $0.055468 | 409.5465 | $22.72 | |
ETH | <0.01% | $0.000039 | 581,366.962 | $22.58 | |
ETH | <0.01% | $0.040063 | 563.445 | $22.57 | |
ETH | <0.01% | $0.702717 | 32.1161 | $22.57 | |
ETH | <0.01% | $0.292014 | 77.2522 | $22.56 | |
ETH | <0.01% | $0.004697 | 4,797.471 | $22.53 | |
ETH | <0.01% | $0.071217 | 315.1268 | $22.44 | |
ETH | <0.01% | $0.426646 | 52.4476 | $22.38 | |
ETH | <0.01% | $0.00007 | 318,105.5122 | $22.36 | |
ETH | <0.01% | $0.05034 | 443.1531 | $22.31 | |
ETH | <0.01% | $0.000038 | 584,386.8807 | $22.15 | |
ETH | <0.01% | $0.00032 | 69,154.6885 | $22.15 | |
ETH | <0.01% | $0.054753 | 403.9259 | $22.12 | |
ETH | <0.01% | $154.34 | 0.1419 | $21.91 | |
ETH | <0.01% | $0.038552 | 566.3365 | $21.83 | |
ETH | <0.01% | $0.000421 | 51,344.5926 | $21.62 | |
ETH | <0.01% | $0.009131 | 2,366.733 | $21.61 | |
ETH | <0.01% | $1.89 | 11.4124 | $21.57 | |
ETH | <0.01% | $0.001419 | 15,197.1426 | $21.57 | |
ETH | <0.01% | $0.16131 | 132.992 | $21.45 | |
ETH | <0.01% | $0.001826 | 11,675.112 | $21.32 | |
ETH | <0.01% | $0.080457 | 264.4497 | $21.28 | |
ETH | <0.01% | <$0.000001 | 140,052,856.6758 | $21.23 | |
ETH | <0.01% | $0.02736 | 775.2203 | $21.21 | |
ETH | <0.01% | $2.31 | 9.1583 | $21.16 | |
ETH | <0.01% | $0.009506 | 2,206.1418 | $20.97 | |
ETH | <0.01% | $0.019474 | 1,072.5237 | $20.89 | |
ETH | <0.01% | $2,607.38 | 0.0080034 | $20.87 | |
ETH | <0.01% | <$0.000001 | 46,675,575.8655 | $20.83 | |
ETH | <0.01% | <$0.000001 | 107,736,230,220.0671 | $20.75 | |
ETH | <0.01% | $0.000001 | 26,388,905.4915 | $20.72 | |
ETH | <0.01% | $0.000342 | 60,575.1385 | $20.71 | |
ETH | <0.01% | <$0.000001 | 8,179,748,123.1666 | $20.65 | |
ETH | <0.01% | $0.003285 | 6,278.2969 | $20.63 | |
ETH | <0.01% | <$0.000001 | 85,109,493.5824 | $20.55 | |
ETH | <0.01% | <$0.000001 | 13,029,669,839.554 | $20.52 | |
ETH | <0.01% | $0.112729 | 181.5615 | $20.47 | |
ETH | <0.01% | $0.000008 | 2,651,555.8333 | $20.27 | |
ETH | <0.01% | <$0.000001 | 51,425,291.0318 | $20.24 | |
ETH | <0.01% | <$0.000001 | 95,405,505.2679 | $20.16 | |
ETH | <0.01% | $0.0075 | 2,686.795 | $20.15 | |
ETH | <0.01% | $16.19 | 1.2443 | $20.14 | |
ETH | <0.01% | <$0.000001 | 186,692,978,956.5757 | $20.07 | |
ETH | <0.01% | $0.02992 | 669.5433 | $20.03 | |
ETH | <0.01% | $0.004045 | 4,949.9327 | $20.02 | |
ETH | <0.01% | $0.04742 | 421.1392 | $19.97 | |
ETH | <0.01% | <$0.000001 | 9,082,263,811.8648 | $19.95 | |
ETH | <0.01% | <$0.000001 | 77,390,778.8787 | $19.92 | |
ETH | <0.01% | $0.03193 | 622.4607 | $19.87 | |
ETH | <0.01% | $2,654.2 | 0.00743287 | $19.73 | |
ETH | <0.01% | <$0.000001 | 19,155,745,359.2076 | $19.7 | |
ETH | <0.01% | <$0.000001 | 200,701,118.4746 | $19.66 | |
ETH | <0.01% | $0.248539 | 78.898 | $19.61 | |
ETH | <0.01% | $0.043675 | 448.6435 | $19.59 | |
ETH | <0.01% | $0.000265 | 73,870.332 | $19.54 | |
ETH | <0.01% | $0.016607 | 1,157.8379 | $19.23 | |
ETH | <0.01% | $0.004225 | 4,549.9888 | $19.22 | |
ETH | <0.01% | $0.05682 | 337.04 | $19.15 | |
ETH | <0.01% | $0.028935 | 658.1174 | $19.04 | |
ETH | <0.01% | $0.000196 | 96,555.8991 | $18.91 | |
ETH | <0.01% | $0.166248 | 113.074 | $18.8 | |
ETH | <0.01% | $0.004253 | 4,416.6927 | $18.79 | |
ETH | <0.01% | <$0.000001 | 76,053,167.4144 | $18.68 | |
ETH | <0.01% | $0.06951 | 268.6728 | $18.68 | |
ETH | <0.01% | $0.000199 | 93,875.6101 | $18.67 | |
ETH | <0.01% | $0.001851 | 10,066.699 | $18.64 | |
ETH | <0.01% | $1.09 | 17.0325 | $18.62 | |
ETH | <0.01% | $0.978175 | 18.9111 | $18.5 | |
ETH | <0.01% | $0.274958 | 67.2155 | $18.48 | |
ETH | <0.01% | $0.756282 | 24.3753 | $18.43 | |
ETH | <0.01% | $0.022017 | 832.6561 | $18.33 | |
ETH | <0.01% | $0.263577 | 68.9897 | $18.18 | |
ETH | <0.01% | $0.001186 | 15,301.7301 | $18.15 | |
ETH | <0.01% | $0.002863 | 6,326.6739 | $18.11 | |
ETH | <0.01% | $0.081127 | 221.2189 | $17.95 | |
ETH | <0.01% | $27.35 | 0.6546 | $17.9 | |
ETH | <0.01% | $0.000895 | 19,964.0911 | $17.86 | |
ETH | <0.01% | <$0.000001 | 68,882,168.3751 | $17.69 | |
ETH | <0.01% | $0.010377 | 1,703.0511 | $17.67 | |
ETH | <0.01% | $0.531649 | 33.0879 | $17.59 | |
ETH | <0.01% | $0.000006 | 2,895,489.8492 | $17.59 | |
ETH | <0.01% | $0.002466 | 7,119.5383 | $17.56 | |
ETH | <0.01% | $2,478.76 | 0.00708329 | $17.56 | |
ETH | <0.01% | $0.21979 | 79.5558 | $17.49 | |
ETH | <0.01% | $24.82 | 0.7014 | $17.41 | |
ETH | <0.01% | $0.027731 | 625.2748 | $17.34 | |
ETH | <0.01% | $0.148604 | 116.5572 | $17.32 | |
ETH | <0.01% | $0.00096 | 17,965.2637 | $17.26 | |
ETH | <0.01% | $0.240996 | 70.6347 | $17.02 | |
ETH | <0.01% | $0.015011 | 1,126.884 | $16.92 | |
ETH | <0.01% | $0.000001 | 28,462,284.3528 | $16.89 | |
ETH | <0.01% | $1.31 | 12.7494 | $16.7 | |
ETH | <0.01% | <$0.000001 | 154,860,634.9405 | $16.35 | |
ETH | <0.01% | $0.002029 | 8,044.0365 | $16.32 | |
ETH | <0.01% | $0.017057 | 950.7039 | $16.22 | |
ETH | <0.01% | $0.043068 | 376.2615 | $16.2 | |
ETH | <0.01% | $0.00798 | 2,027.623 | $16.18 | |
ETH | <0.01% | $0.025127 | 642.5528 | $16.15 | |
ETH | <0.01% | $0.010504 | 1,524.3022 | $16.01 | |
ETH | <0.01% | $0.006182 | 2,584.5869 | $15.98 | |
ETH | <0.01% | $0.431126 | 36.9076 | $15.91 | |
ETH | <0.01% | $0.001077 | 14,766.3357 | $15.91 | |
ETH | <0.01% | $0.021067 | 751.1782 | $15.82 | |
ETH | <0.01% | $0.059664 | 263.4399 | $15.72 | |
ETH | <0.01% | $0.282656 | 55.5849 | $15.71 | |
ETH | <0.01% | $0.081547 | 191.6873 | $15.63 | |
ETH | <0.01% | $0.001949 | 8,018.7695 | $15.63 | |
ETH | <0.01% | <$0.000001 | 175,024,952,022.5285 | $15.63 | |
ETH | <0.01% | $0.204133 | 75.6029 | $15.43 | |
ETH | <0.01% | $0.000586 | 26,266.5317 | $15.4 | |
ETH | <0.01% | $0.000089 | 172,238.3349 | $15.38 | |
ETH | <0.01% | $0.06906 | 222.3619 | $15.36 | |
ETH | <0.01% | $0.000883 | 17,385.5219 | $15.34 | |
ETH | <0.01% | $0.00087 | 17,596.4583 | $15.31 | |
ETH | <0.01% | $0.503982 | 30.3688 | $15.31 | |
ETH | <0.01% | $0.07969 | 191.7357 | $15.28 | |
ETH | <0.01% | $0.000102 | 150,098.5552 | $15.27 | |
ETH | <0.01% | <$0.000001 | 44,699,821.6375 | $15.12 | |
ETH | <0.01% | <$0.000001 | 115,709,755,153.2636 | $15.08 | |
ETH | <0.01% | $0.000139 | 108,589.7933 | $15.07 | |
ETH | <0.01% | $0.000001 | 27,771,905.3109 | $15.03 | |
ETH | <0.01% | $0.006834 | 2,199.8006 | $15.03 | |
ETH | <0.01% | $0.000239 | 62,706.0052 | $15.01 | |
ETH | <0.01% | $0.000917 | 16,350.5081 | $15 | |
ETH | <0.01% | $2.18 | 6.8247 | $14.88 | |
ETH | <0.01% | $0.062009 | 238.7177 | $14.8 | |
ETH | <0.01% | $0.026741 | 553.5154 | $14.8 | |
ETH | <0.01% | $0.000149 | 99,080.3426 | $14.78 | |
ETH | <0.01% | $0.180082 | 81.6988 | $14.71 | |
ETH | <0.01% | $0.027777 | 528.8447 | $14.69 | |
ETH | <0.01% | $0.020465 | 717.2023 | $14.68 | |
ETH | <0.01% | <$0.000001 | 23,035,130,192.2759 | $14.57 | |
ETH | <0.01% | $0.000533 | 27,333.4357 | $14.56 | |
ETH | <0.01% | $0.147679 | 98.294 | $14.52 | |
ETH | <0.01% | $0.326892 | 44.3932 | $14.51 | |
ETH | <0.01% | $0.000002 | 7,503,339.9463 | $14.43 | |
ETH | <0.01% | <$0.000001 | 16,282,265,788.2631 | $14.35 | |
ETH | <0.01% | $0.003298 | 4,337.8972 | $14.31 | |
ETH | <0.01% | $0.000548 | 26,069.0001 | $14.28 | |
ETH | <0.01% | $0.001 | 14,278.156 | $14.27 | |
ETH | <0.01% | $0.02346 | 608.1788 | $14.27 | |
ETH | <0.01% | $0.087289 | 163.0344 | $14.23 | |
ETH | <0.01% | $0.003534 | 4,022.1359 | $14.21 | |
ETH | <0.01% | <$0.000001 | 2,686,556,773,963.4805 | $14.14 | |
ETH | <0.01% | <$0.000001 | 9,547,874,177.6435 | $14.13 | |
ETH | <0.01% | $0.018325 | 770.9747 | $14.13 | |
ETH | <0.01% | $0.000114 | 123,618.1095 | $14.1 | |
ETH | <0.01% | $0.041405 | 340.0011 | $14.08 | |
ETH | <0.01% | $0.008092 | 1,723.7921 | $13.95 | |
ETH | <0.01% | $0.000509 | 27,329.9005 | $13.91 | |
ETH | <0.01% | $0.0145 | 959.071 | $13.91 | |
ETH | <0.01% | $4,403.79 | 0.0031559 | $13.9 | |
ETH | <0.01% | $0.000096 | 144,338.0468 | $13.86 | |
ETH | <0.01% | $0.001047 | 13,230.2412 | $13.85 | |
ETH | <0.01% | $0.631091 | 21.9114 | $13.83 | |
ETH | <0.01% | $86.05 | 0.1606 | $13.82 | |
ETH | <0.01% | $0.008384 | 1,643.8464 | $13.78 | |
ETH | <0.01% | $0.008049 | 1,702.306 | $13.7 | |
ETH | <0.01% | <$0.000001 | 260,596,986.1761 | $13.7 | |
ETH | <0.01% | $0.031118 | 438.0527 | $13.63 | |
ETH | <0.01% | <$0.000001 | 57,981,745.8444 | $13.55 | |
ETH | <0.01% | $0.000001 | 9,211,461.6465 | $13.54 | |
ETH | <0.01% | $0.001172 | 11,533.1849 | $13.52 | |
ETH | <0.01% | $0.000001 | 14,161,867.9696 | $13.43 | |
ETH | <0.01% | $0.003338 | 3,995.9597 | $13.34 | |
ETH | <0.01% | <$0.000001 | 23,190,084,505.6223 | $13.32 | |
ETH | <0.01% | $0.001061 | 12,466.833 | $13.22 | |
ETH | <0.01% | $0.103686 | 127.2636 | $13.2 | |
ETH | <0.01% | $0.079014 | 164.6314 | $13.01 | |
ETH | <0.01% | $0.000134 | 97,178.625 | $12.98 | |
ETH | <0.01% | $0.000705 | 18,247.7514 | $12.86 | |
ETH | <0.01% | $0.1729 | 73.6237 | $12.73 | |
ETH | <0.01% | $0.002427 | 5,225.788 | $12.68 | |
ETH | <0.01% | $0.004121 | 3,060.9862 | $12.62 | |
ETH | <0.01% | $0.000161 | 78,007.0968 | $12.6 | |
ETH | <0.01% | $0.04152 | 302.026 | $12.54 | |
ETH | <0.01% | <$0.000001 | 439,388,729.9349 | $12.52 | |
ETH | <0.01% | $0.125549 | 99.6457 | $12.51 | |
ETH | <0.01% | <$0.000001 | 188,523,177.5053 | $12.51 | |
ETH | <0.01% | $1.67 | 7.4605 | $12.46 | |
ETH | <0.01% | <$0.000001 | 44,087,332,808.9633 | $12.44 | |
ETH | <0.01% | $0.000019 | 652,055.264 | $12.42 | |
ETH | <0.01% | $0.034764 | 356.5431 | $12.39 | |
ETH | <0.01% | $0.002433 | 5,086.729 | $12.38 | |
ETH | <0.01% | $0.143499 | 86.132 | $12.36 | |
ETH | <0.01% | $0.056291 | 219.3615 | $12.35 | |
ETH | <0.01% | $0.000004 | 2,953,137.5214 | $12.32 | |
ETH | <0.01% | $0.004874 | 2,516.8769 | $12.27 | |
ETH | <0.01% | $1 | 12.1571 | $12.17 | |
ETH | <0.01% | <$0.000001 | 36,853,170,108.0196 | $12.16 | |
ETH | <0.01% | $0.00016 | 75,944.7323 | $12.16 | |
ETH | <0.01% | $1.97 | 6.1147 | $12.05 | |
ETH | <0.01% | $1.11 | 10.8295 | $12.02 | |
ETH | <0.01% | $0.000601 | 19,921.6489 | $11.98 | |
ETH | <0.01% | $0.138412 | 86.1752 | $11.93 | |
ETH | <0.01% | $0.559618 | 21.3094 | $11.93 | |
ETH | <0.01% | $0.001311 | 9,056.075 | $11.87 | |
ETH | <0.01% | $0.99964 | 11.8601 | $11.86 | |
ETH | <0.01% | $11.76 | 1.0004 | $11.76 | |
ETH | <0.01% | $0.006468 | 1,807.8332 | $11.69 | |
ETH | <0.01% | $0.000069 | 168,711.3867 | $11.69 | |
ETH | <0.01% | $0.177168 | 65.3654 | $11.58 | |
ETH | <0.01% | $0.001273 | 9,067.1578 | $11.54 | |
ETH | <0.01% | $0.013002 | 884.8627 | $11.5 | |
ETH | <0.01% | <$0.000001 | 2,571,199,226.5849 | $11.4 | |
ETH | <0.01% | $0.019071 | 595.7244 | $11.36 | |
ETH | <0.01% | $0.26501 | 42.8644 | $11.36 | |
ETH | <0.01% | $66,697.49 | 0.00017021 | $11.35 | |
ETH | <0.01% | <$0.000001 | 38,411,035.4957 | $11.33 | |
ETH | <0.01% | <$0.000001 | 105,725,316.3188 | $11.27 | |
ETH | <0.01% | <$0.000001 | 144,684,716.9316 | $11.25 | |
ETH | <0.01% | $0.295107 | 38.0597 | $11.23 | |
ETH | <0.01% | $0.020161 | 555.6971 | $11.2 | |
ETH | <0.01% | $0.008212 | 1,359.9756 | $11.17 | |
ETH | <0.01% | $0.043005 | 259.2977 | $11.15 | |
ETH | <0.01% | $0.000338 | 32,929.8642 | $11.13 | |
ETH | <0.01% | <$0.000001 | 33,344,110.1301 | $11.13 | |
ETH | <0.01% | <$0.000001 | 50,285,384.0294 | $11.11 | |
ETH | <0.01% | $0.00804 | 1,380.4585 | $11.1 | |
ETH | <0.01% | $0.551633 | 20.0726 | $11.07 | |
ETH | <0.01% | $0.002543 | 4,349.1839 | $11.06 | |
ETH | <0.01% | $0.00287 | 3,849.2105 | $11.05 | |
ETH | <0.01% | $0.002487 | 4,394.8598 | $10.93 | |
ETH | <0.01% | $0.039281 | 277.6237 | $10.91 | |
ETH | <0.01% | $2.42 | 4.5097 | $10.9 | |
ETH | <0.01% | $0.000002 | 4,670,764.8967 | $10.88 | |
ETH | <0.01% | <$0.000001 | 37,644,907,692.3882 | $10.87 | |
ETH | <0.01% | <$0.000001 | 241,687,109,594.0261 | $10.86 | |
ETH | <0.01% | $0.010849 | 1,000.508 | $10.85 | |
ETH | <0.01% | $0.298269 | 35.8587 | $10.7 | |
ETH | <0.01% | $0.008197 | 1,302.3321 | $10.68 | |
ETH | <0.01% | $0.183411 | 57.96 | $10.63 | |
ETH | <0.01% | $40.03 | 0.264 | $10.57 | |
ETH | <0.01% | $0.148483 | 70.9264 | $10.53 | |
ETH | <0.01% | $0.261209 | 40.272 | $10.52 | |
ETH | <0.01% | $0.000278 | 37,746.8069 | $10.51 | |
ETH | <0.01% | <$0.000001 | 2,398,903,221.9192 | $10.49 | |
ETH | <0.01% | $0.000686 | 15,289.2851 | $10.49 | |
ETH | <0.01% | $123.67 | 0.084 | $10.39 | |
ETH | <0.01% | $0.005897 | 1,759.6798 | $10.38 | |
ETH | <0.01% | $0.006512 | 1,584.7717 | $10.32 | |
ETH | <0.01% | $0.000462 | 22,320.0159 | $10.31 | |
ETH | <0.01% | $0.000399 | 25,795.2953 | $10.3 | |
ETH | <0.01% | $0.001817 | 5,667.8404 | $10.3 | |
ETH | <0.01% | $2.89 | 3.5676 | $10.29 | |
ETH | <0.01% | $0.008508 | 1,203.8296 | $10.24 | |
ETH | <0.01% | <$0.000001 | 262,462,780,192.2004 | $10.22 | |
ETH | <0.01% | $0.000208 | 49,082.9153 | $10.19 | |
ETH | <0.01% | $0.000031 | 331,671.704 | $10.18 | |
ETH | <0.01% | <$0.000001 | 45,712,887.1382 | $10.16 | |
ETH | <0.01% | $0.006389 | 1,589.3498 | $10.15 | |
ETH | <0.01% | $0.001183 | 8,532.3113 | $10.09 | |
ETH | <0.01% | <$0.000001 | 95,681,624.8098 | $10.09 | |
ETH | <0.01% | $0.429664 | 23.4098 | $10.06 | |
ETH | <0.01% | $0.000003 | 3,014,794.408 | $10.05 | |
ETH | <0.01% | $0.003748 | 2,668.4405 | $10 | |
ETH | <0.01% | <$0.000001 | 39,470,314,774,284.875 | $9.99 | |
ETH | <0.01% | $0.000053 | 187,770.8995 | $9.93 | |
ETH | <0.01% | <$0.000001 | 1,055,911,295.7124 | $9.89 | |
ETH | <0.01% | $2.91 | 3.3812 | $9.84 | |
ETH | <0.01% | $0.000636 | 15,408.8834 | $9.8 | |
ETH | <0.01% | $0.213576 | 45.7684 | $9.78 | |
ETH | <0.01% | $0.030213 | 322.2497 | $9.74 | |
ETH | <0.01% | $0.078444 | 123.7976 | $9.71 | |
ETH | <0.01% | $0.000033 | 294,493.0393 | $9.71 | |
ETH | <0.01% | $8.5 | 1.1393 | $9.68 | |
ETH | <0.01% | $0.004474 | 2,152.883 | $9.63 | |
ETH | <0.01% | $0.000001 | 11,609,301.7943 | $9.62 | |
ETH | <0.01% | $0.028377 | 337.7681 | $9.58 | |
ETH | <0.01% | <$0.000001 | 104,138,351.3004 | $9.55 | |
ETH | <0.01% | $0.006725 | 1,415.7257 | $9.52 | |
ETH | <0.01% | $0.001547 | 6,126.3628 | $9.48 | |
ETH | <0.01% | $0.153947 | 61.4857 | $9.47 | |
ETH | <0.01% | <$0.000001 | 33,628,941,485.1748 | $9.45 | |
ETH | <0.01% | $0.030935 | 304.6739 | $9.43 | |
ETH | <0.01% | <$0.000001 | 23,906,695.7857 | $9.37 | |
ETH | <0.01% | $0.000163 | 56,496.3415 | $9.23 | |
ETH | <0.01% | $0.00195 | 4,730.9081 | $9.23 | |
ETH | <0.01% | $0.000614 | 15,022.4632 | $9.22 | |
ETH | <0.01% | $0.057898 | 158.9337 | $9.2 | |
ETH | <0.01% | $0.013932 | 657.1616 | $9.16 | |
ETH | <0.01% | $0.000308 | 29,469.5286 | $9.07 | |
ETH | <0.01% | <$0.000001 | 19,212,132,453.2606 | $9.06 | |
ETH | <0.01% | $0.00542 | 1,669.1291 | $9.05 | |
ETH | <0.01% | <$0.000001 | 31,625,246.4592 | $9.04 | |
ETH | <0.01% | $0.193635 | 46.6176 | $9.03 | |
ETH | <0.01% | $0.006762 | 1,332.5073 | $9.01 | |
ETH | <0.01% | $0.138097 | 65.1502 | $9 | |
ETH | <0.01% | $155.24 | 0.0575 | $8.93 | |
ETH | <0.01% | <$0.000001 | 55,558,141,553.243 | $8.87 | |
ETH | <0.01% | <$0.000001 | 94,806,241,201.907 | $8.86 | |
ETH | <0.01% | $0.000145 | 60,756.8403 | $8.83 | |
ETH | <0.01% | $0.003478 | 2,534.6123 | $8.82 | |
ETH | <0.01% | $0.079201 | 111.023 | $8.79 | |
ETH | <0.01% | $0.0204 | 430.2528 | $8.78 | |
ETH | <0.01% | $0.060442 | 145.1489 | $8.77 | |
ETH | <0.01% | $0.000016 | 557,610.4618 | $8.72 | |
ETH | <0.01% | $0.001573 | 5,529.9611 | $8.7 | |
ETH | <0.01% | $0.057572 | 150.8419 | $8.68 | |
ETH | <0.01% | $0.000072 | 120,013.8867 | $8.67 | |
ETH | <0.01% | $2,719.4 | 0.00318321 | $8.66 | |
ETH | <0.01% | $0.75721 | 11.354 | $8.6 | |
ETH | <0.01% | <$0.000001 | 30,220,509,965.8145 | $8.58 | |
ETH | <0.01% | $0.018314 | 467.2876 | $8.56 | |
ETH | <0.01% | $0.11624 | 72.709 | $8.45 | |
ETH | <0.01% | $0.029189 | 289.22 | $8.44 | |
ETH | <0.01% | <$0.000001 | 10,060,478,858.8456 | $8.43 | |
ETH | <0.01% | $0.003992 | 2,106.1518 | $8.41 | |
ETH | <0.01% | $2,950.96 | 0.00284637 | $8.4 | |
ETH | <0.01% | $0.001197 | 6,992.6461 | $8.37 | |
ETH | <0.01% | $0.001188 | 7,033.5647 | $8.36 | |
ETH | <0.01% | $0.002168 | 3,854.4454 | $8.36 | |
ETH | <0.01% | $0.021169 | 393.6519 | $8.33 | |
ETH | <0.01% | $0.000001 | 10,820,107.9621 | $8.32 | |
ETH | <0.01% | $0.051423 | 160.8141 | $8.27 | |
ETH | <0.01% | <$0.000001 | 109,065,687.6926 | $8.25 | |
ETH | <0.01% | <$0.000001 | 72,206,982,437.5384 | $8.2 | |
ETH | <0.01% | <$0.000001 | 88,797,650,817.2541 | $8.19 | |
ETH | <0.01% | $0.016523 | 495.6936 | $8.19 | |
ETH | <0.01% | $0.995465 | 8.2261 | $8.19 | |
ETH | <0.01% | $0.002316 | 3,500.0987 | $8.11 | |
ETH | <0.01% | $1.05 | 7.6689 | $8.08 | |
ETH | <0.01% | $6.8 | 1.1874 | $8.07 | |
ETH | <0.01% | <$0.000001 | 53,135,623.0464 | $8.06 | |
ETH | <0.01% | <$0.000001 | 70,582,813,449.3984 | $8.02 | |
ETH | <0.01% | $0.073507 | 108.9819 | $8.01 | |
ETH | <0.01% | $0.028802 | 277.8296 | $8 | |
ETH | <0.01% | $0.082916 | 96.4169 | $7.99 | |
ETH | <0.01% | $0.020815 | 382.3321 | $7.96 | |
ETH | <0.01% | <$0.000001 | 38,649,465.1865 | $7.95 | |
ETH | <0.01% | $0.001654 | 4,736.733 | $7.84 | |
ETH | <0.01% | $0.000143 | 54,600.9963 | $7.82 | |
ETH | <0.01% | $9.49 | 0.8233 | $7.81 | |
ETH | <0.01% | $0.000742 | 10,436.7555 | $7.75 | |
ETH | <0.01% | <$0.000001 | 20,598,536.8802 | $7.74 | |
ETH | <0.01% | $0.423219 | 18.2517 | $7.72 | |
ETH | <0.01% | $0.368915 | 20.8581 | $7.69 | |
ETH | <0.01% | $0.000164 | 46,889.3526 | $7.68 | |
ETH | <0.01% | $0.005231 | 1,466.7609 | $7.67 | |
ETH | <0.01% | $0.000071 | 107,609.3893 | $7.67 | |
ETH | <0.01% | <$0.000001 | 64,264,461.6827 | $7.66 | |
ETH | <0.01% | <$0.000001 | 18,464,239.9246 | $7.63 | |
ETH | <0.01% | $0.160723 | 46.9643 | $7.55 | |
ETH | <0.01% | <$0.000001 | 27,172,824,939,052,040 | $7.5 | |
ETH | <0.01% | $0.000074 | 101,045.2409 | $7.48 | |
ETH | <0.01% | $0.031563 | 236.4644 | $7.46 | |
ETH | <0.01% | $0.00001 | 733,365.9204 | $7.39 | |
ETH | <0.01% | $0.073435 | 100.4728 | $7.38 | |
ETH | <0.01% | <$0.000001 | 68,493,132.8643 | $7.37 | |
ETH | <0.01% | $0.025156 | 290.538 | $7.31 | |
ETH | <0.01% | <$0.000001 | 8,031,603,325.4042 | $7.31 | |
ETH | <0.01% | $29.95 | 0.2436 | $7.3 | |
ETH | <0.01% | $0.014897 | 489.2873 | $7.29 | |
ETH | <0.01% | $0.054729 | 133.1494 | $7.29 | |
ETH | <0.01% | $0.99979 | 7.2455 | $7.24 | |
ETH | <0.01% | $0.004695 | 1,535.6312 | $7.21 | |
ETH | <0.01% | $0.000001 | 5,616,547.641 | $7.18 | |
ETH | <0.01% | $10.45 | 0.6855 | $7.16 | |
ETH | <0.01% | $0.000173 | 41,279.9556 | $7.15 | |
ETH | <0.01% | $6.83 | 1.038 | $7.09 | |
ETH | <0.01% | $94.07 | 0.0749 | $7.05 | |
ETH | <0.01% | $0.000001 | 7,927,775.0185 | $7.02 | |
ETH | <0.01% | <$0.000001 | 19,182,437.698 | $6.98 | |
ETH | <0.01% | $0.000049 | 142,524.5419 | $6.93 | |
ETH | <0.01% | $0.00009 | 77,184.1299 | $6.91 | |
ETH | <0.01% | $0.006962 | 990.8978 | $6.9 | |
ETH | <0.01% | $0.000792 | 8,706.4711 | $6.9 | |
ETH | <0.01% | $0.000002 | 4,594,006.6485 | $6.89 | |
ETH | <0.01% | $0.055183 | 124.7625 | $6.88 | |
ETH | <0.01% | $0.00002 | 346,332.3997 | $6.87 | |
ETH | <0.01% | $0.18454 | 37.2279 | $6.87 | |
ETH | <0.01% | $1.11 | 6.1773 | $6.86 | |
ETH | <0.01% | $0.087168 | 78.6499 | $6.86 | |
ETH | <0.01% | $0.031393 | 216.5433 | $6.8 | |
ETH | <0.01% | <$0.000001 | 9,434,998,890,423.8145 | $6.79 | |
ETH | <0.01% | <$0.000001 | 37,261,540,506.6614 | $6.79 | |
ETH | <0.01% | $0.007734 | 876.1976 | $6.78 | |
ETH | <0.01% | $0.001113 | 6,069.7792 | $6.76 | |
ETH | <0.01% | $0.781085 | 8.6111 | $6.73 | |
ETH | <0.01% | <$0.000001 | 15,368,903.7314 | $6.72 | |
ETH | <0.01% | $0.025644 | 261.8201 | $6.71 | |
ETH | <0.01% | $0.000879 | 7,641.1761 | $6.71 | |
ETH | <0.01% | $1.62 | 4.1328 | $6.69 | |
ETH | <0.01% | $0.000199 | 33,594.8339 | $6.69 | |
ETH | <0.01% | $0.011495 | 577.9113 | $6.64 | |
ETH | <0.01% | $1.02 | 6.4715 | $6.6 | |
ETH | <0.01% | <$0.000001 | 65,996,596,239.3847 | $6.6 | |
ETH | <0.01% | $0.762537 | 8.607 | $6.56 | |
ETH | <0.01% | <$0.000001 | 21,738,843.1681 | $6.54 | |
ETH | <0.01% | $0.012984 | 502.3636 | $6.52 | |
ETH | <0.01% | $3,364.25 | 0.00193814 | $6.52 | |
ETH | <0.01% | $0.026375 | 247.0296 | $6.52 | |
ETH | <0.01% | <$0.000001 | 19,084,268.9307 | $6.49 | |
ETH | <0.01% | $0.001676 | 3,857.0719 | $6.46 | |
ETH | <0.01% | $0.000123 | 52,288.4402 | $6.46 | |
ETH | <0.01% | $0.000061 | 106,302.7436 | $6.43 | |
ETH | <0.01% | $0.00726 | 885.4425 | $6.43 | |
ETH | <0.01% | $0.010937 | 587.3617 | $6.42 | |
ETH | <0.01% | $0.000001 | 5,579,249.0847 | $6.42 | |
ETH | <0.01% | <$0.000001 | 161,867,542.9283 | $6.41 | |
ETH | <0.01% | $0.000304 | 21,095.468 | $6.41 | |
ETH | <0.01% | $0.999967 | 6.4087 | $6.41 | |
ETH | <0.01% | $0.000544 | 11,709.8408 | $6.37 | |
ETH | <0.01% | $0.002694 | 2,358.0439 | $6.35 | |
ETH | <0.01% | $1.05 | 6.0416 | $6.34 | |
ETH | <0.01% | $0.002487 | 2,548.4413 | $6.34 | |
ETH | <0.01% | $0.000079 | 79,501.5067 | $6.3 | |
ETH | <0.01% | $13.75 | 0.4579 | $6.3 | |
ETH | <0.01% | $0.001375 | 4,571.1465 | $6.29 | |
ETH | <0.01% | $0.015548 | 403.1182 | $6.27 | |
ETH | <0.01% | <$0.000001 | 191,416,267,198.4826 | $6.25 | |
ETH | <0.01% | $0.000001 | 12,353,564.4956 | $6.24 | |
ETH | <0.01% | <$0.000001 | 162,422,598,315.7175 | $6.22 | |
ETH | <0.01% | $0.006915 | 898.1164 | $6.21 | |
ETH | <0.01% | $0.127809 | 48.5576 | $6.21 | |
ETH | <0.01% | $0.004298 | 1,443.5391 | $6.2 | |
ETH | <0.01% | $0.033195 | 186.1273 | $6.18 | |
ETH | <0.01% | <$0.000001 | 8,516,212,558,114.6035 | $6.16 | |
ETH | <0.01% | <$0.000001 | 8,505,047,608.8726 | $6.14 | |
ETH | <0.01% | $0.000181 | 33,606.8917 | $6.1 | |
ETH | <0.01% | $0.380421 | 16.0323 | $6.1 | |
ETH | <0.01% | $0.000173 | 35,284.2505 | $6.09 | |
ETH | <0.01% | $0.75721 | 8.043 | $6.09 | |
ETH | <0.01% | $8.19 | 0.7421 | $6.08 | |
ETH | <0.01% | $0.018929 | 321.0519 | $6.08 | |
ETH | <0.01% | <$0.000001 | 28,806,329.5428 | $6.07 | |
ETH | <0.01% | $0.048941 | 123.5903 | $6.05 | |
ETH | <0.01% | <$0.000001 | 37,642,236.3282 | $6.05 | |
ETH | <0.01% | $0.006792 | 888.4439 | $6.03 | |
ETH | <0.01% | $0.000001 | 5,230,285.2164 | $6.01 | |
ETH | <0.01% | $0.227591 | 26.3546 | $6 | |
ETH | <0.01% | $0.002467 | 2,427.6137 | $5.99 | |
ETH | <0.01% | <$0.000001 | 75,525,698.5791 | $5.98 | |
ETH | <0.01% | $0.569162 | 10.4473 | $5.95 | |
ETH | <0.01% | $0.096712 | 61.3396 | $5.93 | |
ETH | <0.01% | <$0.000001 | 40,486,044.5401 | $5.93 | |
ETH | <0.01% | $0.002657 | 2,217.7566 | $5.89 | |
ETH | <0.01% | $0.667244 | 8.8029 | $5.87 | |
ETH | <0.01% | $0.000171 | 34,106.5936 | $5.85 | |
ETH | <0.01% | $0.008641 | 674.6931 | $5.83 | |
ETH | <0.01% | $0.000763 | 7,623.429 | $5.82 | |
ETH | <0.01% | $0.001922 | 2,993.7986 | $5.75 | |
ETH | <0.01% | $6.82 | 0.8414 | $5.74 | |
ETH | <0.01% | $0.003517 | 1,613.5807 | $5.67 | |
ETH | <0.01% | $0.005113 | 1,107.6494 | $5.66 | |
ETH | <0.01% | $0.009081 | 622.5025 | $5.65 | |
ETH | <0.01% | $0.002381 | 2,367.3447 | $5.64 | |
ETH | <0.01% | <$0.000001 | 275,947,385.6223 | $5.63 | |
ETH | <0.01% | $8.96 | 0.6255 | $5.6 | |
ETH | <0.01% | $0.015649 | 357.3505 | $5.59 | |
ETH | <0.01% | $0.000397 | 14,003.3785 | $5.57 | |
ETH | <0.01% | <$0.000001 | 61,004,771,569.9005 | $5.56 | |
ETH | <0.01% | $0.19305 | 28.7245 | $5.55 | |
ETH | <0.01% | $0.000865 | 6,400.3411 | $5.54 | |
ETH | <0.01% | $0.092601 | 59.733 | $5.53 | |
ETH | <0.01% | <$0.000001 | 576,805,385.1791 | $5.53 | |
ETH | <0.01% | $0.000082 | 67,073.8854 | $5.51 | |
ETH | <0.01% | <$0.000001 | 190,811,170.6462 | $5.51 | |
ETH | <0.01% | <$0.000001 | 96,871,828.6163 | $5.5 | |
ETH | <0.01% | $0.009004 | 609.5148 | $5.49 | |
ETH | <0.01% | $0.000076 | 72,482.453 | $5.48 | |
ETH | <0.01% | $8 | 0.6818 | $5.46 | |
ETH | <0.01% | $49.83 | 0.109 | $5.43 | |
ETH | <0.01% | $0.208431 | 26.0007 | $5.42 | |
ETH | <0.01% | <$0.000001 | 33,941,019,374.7906 | $5.42 | |
ETH | <0.01% | $0.002986 | 1,813.5123 | $5.42 | |
ETH | <0.01% | $0.029824 | 181.3809 | $5.41 | |
ETH | <0.01% | <$0.000001 | 296,083,823,425.4096 | $5.39 | |
ETH | <0.01% | $0.000086 | 62,765.5841 | $5.38 | |
ETH | <0.01% | <$0.000001 | 104,907,054.1112 | $5.36 | |
ETH | <0.01% | $0.001271 | 4,216.9177 | $5.36 | |
ETH | <0.01% | $0.000004 | 1,344,638.3833 | $5.35 | |
ETH | <0.01% | $0.056347 | 94.682 | $5.34 | |
ETH | <0.01% | $0.164864 | 32.3141 | $5.33 | |
ETH | <0.01% | $0.035947 | 147.902 | $5.32 | |
ETH | <0.01% | <$0.000001 | 57,148,052,413.587 | $5.3 | |
ETH | <0.01% | $0.032505 | 163.0315 | $5.3 | |
ETH | <0.01% | $0.000024 | 224,634.0402 | $5.29 | |
ETH | <0.01% | $0.000341 | 15,344.6413 | $5.23 | |
ETH | <0.01% | $0.000006 | 805,148.4124 | $5.2 | |
ETH | <0.01% | <$0.000001 | 11,706,791.6837 | $5.2 | |
ETH | <0.01% | $3.73 | 1.3912 | $5.19 | |
ETH | <0.01% | $0.37896 | 13.6725 | $5.18 | |
ETH | <0.01% | $0.77472 | 6.6788 | $5.17 | |
ETH | <0.01% | $0.000504 | 10,230.9233 | $5.16 | |
ETH | <0.01% | <$0.000001 | 19,803,996.8034 | $5.15 | |
ETH | <0.01% | <$0.000001 | 1,321,554,621.3897 | $5.15 | |
ETH | <0.01% | $0.000835 | 6,124.2624 | $5.11 | |
ETH | <0.01% | $0.000533 | 9,593.5494 | $5.11 | |
ETH | <0.01% | $0.011804 | 433.0441 | $5.11 | |
ETH | <0.01% | $0.000315 | 16,213.6397 | $5.11 | |
ETH | <0.01% | $0.048473 | 105.4034 | $5.11 | |
ETH | <0.01% | <$0.000001 | 36,326,553.1687 | $5.11 | |
ETH | <0.01% | $0.051733 | 98.097 | $5.07 | |
ETH | <0.01% | <$0.000001 | 94,438,051.7179 | $5.05 | |
ETH | <0.01% | $0.000166 | 30,289.8677 | $5.03 | |
ETH | <0.01% | $0.091707 | 54.4678 | $5 | |
ETH | <0.01% | $0.485835 | 10.2616 | $4.99 | |
ETH | <0.01% | $0.000449 | 11,095.2915 | $4.98 | |
ETH | <0.01% | $0.010713 | 465.1152 | $4.98 | |
ETH | <0.01% | $0.00001 | 484,275.7098 | $4.97 | |
ETH | <0.01% | $0.000237 | 20,998.7878 | $4.97 | |
ETH | <0.01% | $0.17202 | 28.8534 | $4.96 | |
ETH | <0.01% | $0.000152 | 32,537.3151 | $4.93 | |
ETH | <0.01% | $0.016019 | 304.3731 | $4.88 | |
ETH | <0.01% | $0.022918 | 212.1268 | $4.86 | |
ETH | <0.01% | $0.005047 | 960.0427 | $4.84 | |
ETH | <0.01% | <$0.000001 | 36,946,806.7243 | $4.84 | |
ETH | <0.01% | $1.41 | 3.4218 | $4.83 | |
ETH | <0.01% | $0.001127 | 4,270.5948 | $4.81 | |
ETH | <0.01% | $0.06865 | 69.9807 | $4.8 | |
ETH | <0.01% | $0.030864 | 155.4314 | $4.8 | |
ETH | <0.01% | $0.000024 | 203,510.5929 | $4.79 | |
ETH | <0.01% | $16.43 | 0.2906 | $4.78 | |
ETH | <0.01% | $0.000202 | 23,667.8622 | $4.77 | |
ETH | <0.01% | $0.001762 | 2,705.8901 | $4.77 | |
ETH | <0.01% | $0.468632 | 10.1279 | $4.75 | |
ETH | <0.01% | $0.000241 | 19,675.5565 | $4.74 | |
ETH | <0.01% | $0.052344 | 90.4279 | $4.73 | |
ETH | <0.01% | $0.000002 | 2,637,240.3437 | $4.72 | |
ETH | <0.01% | $0.000062 | 75,538.9447 | $4.7 | |
ETH | <0.01% | $0.002419 | 1,936.59 | $4.69 | |
ETH | <0.01% | <$0.000001 | 56,592,340,403.7263 | $4.68 | |
ETH | <0.01% | $0.000324 | 14,422.0374 | $4.67 | |
ETH | <0.01% | $2,475.54 | 0.00188447 | $4.67 | |
ETH | <0.01% | $0.005544 | 840.5259 | $4.66 | |
ETH | <0.01% | $0.000001 | 6,839,399.896 | $4.66 | |
ETH | <0.01% | $1.16 | 4.0124 | $4.65 | |
ETH | <0.01% | $12.34 | 0.3759 | $4.64 | |
ETH | <0.01% | <$0.000001 | 65,469,393.376 | $4.63 | |
ETH | <0.01% | $92,778 | 0.0000499 | $4.63 | |
ETH | <0.01% | $0.000183 | 25,251.1496 | $4.62 | |
ETH | <0.01% | <$0.000001 | 79,128,378.4581 | $4.61 | |
ETH | <0.01% | $0.004088 | 1,126.5061 | $4.61 | |
ETH | <0.01% | <$0.000001 | 12,134,633.1112 | $4.59 | |
ETH | <0.01% | $1.56 | 2.9373 | $4.58 | |
ETH | <0.01% | $0.003879 | 1,181.1074 | $4.58 | |
ETH | <0.01% | $0.001426 | 3,193.333 | $4.55 | |
ETH | <0.01% | $0.037234 | 121.8864 | $4.54 | |
ETH | <0.01% | <$0.000001 | 1,535,395,745,361.0281 | $4.52 | |
ETH | <0.01% | $0.000008 | 557,955.9287 | $4.51 | |
ETH | <0.01% | $0.996537 | 4.5006 | $4.49 | |
ETH | <0.01% | $0.000539 | 8,309.5808 | $4.48 | |
ETH | <0.01% | $0.000032 | 137,809.2823 | $4.47 | |
ETH | <0.01% | <$0.000001 | 51,530,969.6376 | $4.47 | |
ETH | <0.01% | $0.000066 | 67,807.6163 | $4.46 | |
ETH | <0.01% | $0.003638 | 1,222.1075 | $4.45 | |
ETH | <0.01% | $0.499919 | 8.8752 | $4.44 | |
ETH | <0.01% | <$0.000001 | 11,593,417.6661 | $4.37 | |
ETH | <0.01% | $0.034963 | 124.5797 | $4.36 | |
ETH | <0.01% | <$0.000001 | 21,947,812.6267 | $4.35 | |
ETH | <0.01% | <$0.000001 | 17,415,334.9024 | $4.34 | |
ETH | <0.01% | $0.002331 | 1,856.0116 | $4.33 | |
ETH | <0.01% | $2.66 | 1.611 | $4.29 | |
ETH | <0.01% | $0.000001 | 3,687,020.409 | $4.28 | |
ETH | <0.01% | $0.000005 | 829,777.652 | $4.27 | |
ETH | <0.01% | $0.00573 | 743.1215 | $4.26 | |
ETH | <0.01% | $1 | 4.2467 | $4.25 | |
ETH | <0.01% | $2,650.72 | 0.00157903 | $4.19 | |
ETH | <0.01% | $0.000196 | 21,239.1058 | $4.16 | |
ETH | <0.01% | $0.034036 | 121.9793 | $4.15 | |
ETH | <0.01% | $0.087801 | 47.2447 | $4.15 | |
ETH | <0.01% | $0.000549 | 7,544.1395 | $4.14 | |
ETH | <0.01% | $0.131986 | 31.2693 | $4.13 | |
ETH | <0.01% | <$0.000001 | 36,735,667.2864 | $4.12 | |
ETH | <0.01% | $0.142781 | 28.8051 | $4.11 | |
ETH | <0.01% | $0.078126 | 52.4049 | $4.09 | |
ETH | <0.01% | $104,435 | 0.00003919 | $4.09 | |
ETH | <0.01% | $0.000031 | 132,470.7403 | $4.05 | |
ETH | <0.01% | $0.060523 | 66.6501 | $4.03 | |
ETH | <0.01% | $1.28 | 3.1415 | $4.02 | |
ETH | <0.01% | $140.78 | 0.0282 | $3.97 | |
ETH | <0.01% | $0.039654 | 100.0149 | $3.97 | |
ETH | <0.01% | $0.000045 | 88,018.4799 | $3.96 | |
ETH | <0.01% | $0.028073 | 139.32 | $3.91 | |
ETH | <0.01% | $0.066317 | 58.6803 | $3.89 | |
ETH | <0.01% | $0.00275 | 1,408.0247 | $3.87 | |
ETH | <0.01% | $0.000199 | 19,284.2934 | $3.85 | |
ETH | <0.01% | <$0.000001 | 969,199,983.79 | $3.84 | |
ETH | <0.01% | $0.000335 | 11,452.2124 | $3.84 | |
ETH | <0.01% | $0.01599 | 236.7604 | $3.79 | |
ETH | <0.01% | $0.026887 | 140.0055 | $3.76 | |
ETH | <0.01% | $0.071849 | 51.9809 | $3.73 | |
ETH | <0.01% | $0.00458 | 814.1024 | $3.73 | |
ETH | <0.01% | <$0.000001 | 11,951,441.7179 | $3.71 | |
ETH | <0.01% | $0.00117 | 3,167.6839 | $3.71 | |
ETH | <0.01% | $0.001136 | 3,259.5063 | $3.7 | |
ETH | <0.01% | <$0.000001 | 78,650,436.4606 | $3.68 | |
ETH | <0.01% | $0.006894 | 532.7916 | $3.67 | |
ETH | <0.01% | $0.242992 | 15.1119 | $3.67 | |
ETH | <0.01% | $0.000062 | 58,529.2418 | $3.65 | |
ETH | <0.01% | $0.254833 | 14.2895 | $3.64 | |
ETH | <0.01% | $0.999912 | 3.6397 | $3.64 | |
ETH | <0.01% | $0.024725 | 146.3182 | $3.62 | |
ETH | <0.01% | $0.018633 | 192.8382 | $3.59 | |
ETH | <0.01% | $0.002673 | 1,343.9333 | $3.59 | |
ETH | <0.01% | $1.28 | 2.8068 | $3.59 | |
ETH | <0.01% | <$0.000001 | 10,268,810,459.8352 | $3.59 | |
ETH | <0.01% | $0.047227 | 75.5049 | $3.57 | |
ETH | <0.01% | $0.043624 | 81.3571 | $3.55 | |
ETH | <0.01% | <$0.000001 | 19,869,965,833.145 | $3.53 | |
ETH | <0.01% | $0.138541 | 25.4097 | $3.52 | |
ETH | <0.01% | $0.251725 | 13.93 | $3.51 | |
ETH | <0.01% | $0.000673 | 5,206.6635 | $3.5 | |
ETH | <0.01% | $0.001936 | 1,807.7766 | $3.5 | |
ETH | <0.01% | $0.000219 | 15,967.5696 | $3.5 | |
ETH | <0.01% | $0.000033 | 106,981.9855 | $3.49 | |
ETH | <0.01% | <$0.000001 | 39,101,213.5748 | $3.49 | |
ETH | <0.01% | $0.0043 | 809.9063 | $3.48 | |
ETH | <0.01% | $0.002101 | 1,653.8967 | $3.47 | |
ETH | <0.01% | $69,967.43 | 0.00004956 | $3.47 | |
ETH | <0.01% | $0.000041 | 84,298.0564 | $3.47 | |
ETH | <0.01% | $0.000174 | 19,892.6696 | $3.46 | |
ETH | <0.01% | <$0.000001 | 13,688,438,164.4182 | $3.45 | |
ETH | <0.01% | $0.000001 | 4,470,759.2676 | $3.44 | |
ETH | <0.01% | $5.25 | 0.651 | $3.42 | |
ETH | <0.01% | $0.054758 | 62.0404 | $3.4 | |
ETH | <0.01% | <$0.000001 | 801,002,295.4451 | $3.39 | |
ETH | <0.01% | $0.000047 | 71,575.6248 | $3.39 | |
ETH | <0.01% | $0.000078 | 43,537.1601 | $3.38 | |
ETH | <0.01% | $0.000787 | 4,283.1712 | $3.37 | |
ETH | <0.01% | $0.00295 | 1,140.2126 | $3.36 | |
ETH | <0.01% | $0.00288 | 1,166.6231 | $3.36 | |
ETH | <0.01% | $0.026891 | 124.1576 | $3.34 | |
ETH | <0.01% | $0.000171 | 19,383.8993 | $3.32 | |
ETH | <0.01% | $0.283748 | 11.6951 | $3.32 | |
ETH | <0.01% | $0.197964 | 16.7606 | $3.32 | |
ETH | <0.01% | $0.000097 | 34,101.8937 | $3.3 | |
ETH | <0.01% | $0.000106 | 30,856.2092 | $3.28 | |
ETH | <0.01% | $0.000013 | 248,957.4808 | $3.25 | |
ETH | <0.01% | <$0.000001 | 46,026,623,709.8945 | $3.24 | |
ETH | <0.01% | $0.001222 | 2,637.9527 | $3.22 | |
ETH | <0.01% | $0.000045 | 71,457.7999 | $3.22 | |
ETH | <0.01% | $0.001738 | 1,838.061 | $3.19 | |
ETH | <0.01% | $0.143709 | 22.0943 | $3.18 | |
ETH | <0.01% | $0.006568 | 481.3346 | $3.16 | |
ETH | <0.01% | $0.000155 | 20,322.1345 | $3.15 | |
ETH | <0.01% | $0.000606 | 5,183.9906 | $3.14 | |
ETH | <0.01% | $0.001506 | 2,073.5021 | $3.12 | |
ETH | <0.01% | $0.15098 | 20.6066 | $3.11 | |
ETH | <0.01% | <$0.000001 | 48,540,394,689.2258 | $3.09 | |
ETH | <0.01% | $0.00001 | 308,681.4787 | $3.08 | |
ETH | <0.01% | $0.135418 | 22.7202 | $3.08 | |
ETH | <0.01% | $0.200692 | 15.3302 | $3.08 | |
ETH | <0.01% | <$0.000001 | 53,919,301.404 | $3.08 | |
ETH | <0.01% | $0.056458 | 54.4426 | $3.07 | |
ETH | <0.01% | $0.000087 | 35,129.7698 | $3.07 | |
ETH | <0.01% | $0.999397 | 3.0488 | $3.05 | |
ETH | <0.01% | $0.717957 | 4.2218 | $3.03 | |
ETH | <0.01% | $3.98 | 0.76 | $3.02 | |
ETH | <0.01% | $0.000485 | 6,203.1455 | $3.01 | |
ETH | <0.01% | $0.003872 | 774.3824 | $3 | |
ETH | <0.01% | $0.000006 | 519,519.8489 | $3 | |
ETH | <0.01% | $0.003504 | 855.3702 | $3 | |
ETH | <0.01% | $0.000006 | 521,945.7293 | $2.99 | |
ETH | <0.01% | <$0.000001 | 31,727,208.2779 | $2.93 | |
ETH | <0.01% | $0.001275 | 2,297.4343 | $2.93 | |
ETH | <0.01% | $0.037222 | 78.523 | $2.92 | |
ETH | <0.01% | <$0.000001 | 17,298,365,827.7661 | $2.92 | |
ETH | <0.01% | $0.001539 | 1,887.5679 | $2.9 | |
ETH | <0.01% | $0.372785 | 7.7864 | $2.9 | |
ETH | <0.01% | $0.000039 | 74,697.6509 | $2.89 | |
ETH | <0.01% | $0.001468 | 1,963.8563 | $2.88 | |
ETH | <0.01% | $0.000229 | 12,536.9137 | $2.87 | |
ETH | <0.01% | $0.084165 | 33.8687 | $2.85 | |
ETH | <0.01% | $0.946713 | 3.0019 | $2.84 | |
ETH | <0.01% | $0.001435 | 1,975.7713 | $2.83 | |
ETH | <0.01% | <$0.000001 | 28,448,938.8353 | $2.82 | |
ETH | <0.01% | <$0.000001 | 8,828,777.4722 | $2.81 | |
ETH | <0.01% | $0.000318 | 8,822.8886 | $2.81 | |
ETH | <0.01% | $0.017847 | 156.6931 | $2.8 | |
ETH | <0.01% | $0.033732 | 82.7326 | $2.79 | |
ETH | <0.01% | $0.004412 | 628.9792 | $2.78 | |
ETH | <0.01% | $0.01484 | 186.0432 | $2.76 | |
ETH | <0.01% | <$0.000001 | 11,282,540,757.2509 | $2.71 | |
ETH | <0.01% | $0.000914 | 2,960.0377 | $2.71 | |
ETH | <0.01% | $0.000511 | 5,264.3126 | $2.69 | |
ETH | <0.01% | $0.000139 | 19,194.9787 | $2.67 | |
ETH | <0.01% | <$0.000001 | 3,413,899,520.7688 | $2.66 | |
ETH | <0.01% | <$0.000001 | 10,215,346,264.6154 | $2.63 | |
ETH | <0.01% | <$0.000001 | 31,676,888,560.9041 | $2.58 | |
ETH | <0.01% | $0.001312 | 1,962.3087 | $2.58 | |
ETH | <0.01% | $0.00103 | 2,490.1485 | $2.56 | |
ETH | <0.01% | <$0.000001 | 45,273,557.0305 | $2.56 | |
ETH | <0.01% | $0.000076 | 33,797.7516 | $2.56 | |
ETH | <0.01% | <$0.000001 | 38,088,122.7029 | $2.55 | |
ETH | <0.01% | $0.379953 | 6.6403 | $2.52 | |
ETH | <0.01% | <$0.000001 | 7,764,366,685.8354 | $2.52 | |
ETH | <0.01% | $0.02842 | 88.501 | $2.52 | |
ETH | <0.01% | $0.006481 | 386.187 | $2.5 | |
ETH | <0.01% | $0.000043 | 58,403.9256 | $2.49 | |
ETH | <0.01% | $0.000048 | 52,036.6591 | $2.48 | |
ETH | <0.01% | $0.017025 | 145.1768 | $2.47 | |
ETH | <0.01% | $198.75 | 0.0124 | $2.47 | |
ETH | <0.01% | $0.000435 | 5,672.2686 | $2.47 | |
ETH | <0.01% | $0.017847 | 138.1202 | $2.46 | |
ETH | <0.01% | <$0.000001 | 7,200,682,521.5138 | $2.46 | |
ETH | <0.01% | $0.321022 | 7.6436 | $2.45 | |
ETH | <0.01% | $0.000049 | 50,252.4088 | $2.45 | |
ETH | <0.01% | $0.16431 | 14.9178 | $2.45 | |
ETH | <0.01% | $0.000014 | 171,631.373 | $2.44 | |
ETH | <0.01% | $0.000082 | 29,598.1778 | $2.44 | |
ETH | <0.01% | <$0.000001 | 4,917,667.9082 | $2.43 | |
ETH | <0.01% | $0.001038 | 2,340.8289 | $2.43 | |
ETH | <0.01% | <$0.000001 | 197,859,613.0156 | $2.42 | |
ETH | <0.01% | $0.007131 | 339.0176 | $2.42 | |
ETH | <0.01% | $0.001734 | 1,392.9714 | $2.42 | |
ETH | <0.01% | $0.000134 | 17,964.742 | $2.41 | |
ETH | <0.01% | $0.003059 | 786.5972 | $2.41 | |
ETH | <0.01% | <$0.000001 | 14,429,081,971.1618 | $2.41 | |
ETH | <0.01% | $0.018372 | 130.6539 | $2.4 | |
ETH | <0.01% | $1.06 | 2.2577 | $2.4 | |
ETH | <0.01% | $1 | 2.3856 | $2.39 | |
ETH | <0.01% | $0.017306 | 137.6733 | $2.38 | |
ETH | <0.01% | $0.000787 | 3,004.8079 | $2.37 | |
ETH | <0.01% | $0.000021 | 110,100.8276 | $2.34 | |
ETH | <0.01% | $0.0001 | 23,363.0572 | $2.33 | |
ETH | <0.01% | <$0.000001 | 16,063,604.1888 | $2.33 | |
ETH | <0.01% | $0.117562 | 19.7526 | $2.32 | |
ETH | <0.01% | $0.003804 | 609.6598 | $2.32 | |
ETH | <0.01% | $0.03048 | 75.866 | $2.31 | |
ETH | <0.01% | $0.001803 | 1,276.9913 | $2.3 | |
ETH | <0.01% | $0.000017 | 135,539.3558 | $2.3 | |
ETH | <0.01% | <$0.000001 | 17,523,756.4994 | $2.3 | |
ETH | <0.01% | $0.00021 | 10,927.6399 | $2.29 | |
ETH | <0.01% | $1.04 | 2.2026 | $2.29 | |
ETH | <0.01% | $0.6165 | 3.6952 | $2.28 | |
ETH | <0.01% | $0.165922 | 13.6942 | $2.27 | |
ETH | <0.01% | $0.000473 | 4,788.6099 | $2.27 | |
ETH | <0.01% | $11.47 | 0.1973 | $2.26 | |
ETH | <0.01% | <$0.000001 | 7,812,344.5396 | $2.26 | |
ETH | <0.01% | $0.031401 | 71.4034 | $2.24 | |
ETH | <0.01% | $0.018684 | 119.6713 | $2.24 | |
ETH | <0.01% | $0.013072 | 170.5752 | $2.23 | |
ETH | <0.01% | $10.74 | 0.2071 | $2.22 | |
ETH | <0.01% | $0.001577 | 1,402.8631 | $2.21 | |
ETH | <0.01% | $0.002405 | 919.5539 | $2.21 | |
ETH | <0.01% | $0.081432 | 27.1125 | $2.21 | |
ETH | <0.01% | <$0.000001 | 9,976,237,537.5094 | $2.2 | |
ETH | <0.01% | $0.078512 | 27.9156 | $2.19 | |
ETH | <0.01% | $0.01026 | 213.4543 | $2.19 | |
ETH | <0.01% | $104,305 | 0.00002098 | $2.19 | |
ETH | <0.01% | $0.002261 | 963.4809 | $2.18 | |
ETH | <0.01% | <$0.000001 | 25,202,481.7799 | $2.17 | |
ETH | <0.01% | $0.04879 | 44.2942 | $2.16 | |
ETH | <0.01% | $0.043088 | 50.0377 | $2.16 | |
ETH | <0.01% | $0.009662 | 220.7286 | $2.13 | |
ETH | <0.01% | $0.001933 | 1,092.8737 | $2.11 | |
ETH | <0.01% | <$0.000001 | 60,155,219,388,212.313 | $2.11 | |
ETH | <0.01% | $0.003926 | 530.426 | $2.08 | |
ETH | <0.01% | <$0.000001 | 9,973,875,692.3082 | $2.08 | |
ETH | <0.01% | $0.997363 | 2.0826 | $2.08 | |
ETH | <0.01% | $0.022034 | 93.875 | $2.07 | |
ETH | <0.01% | $0.00153 | 1,347.7287 | $2.06 | |
ETH | <0.01% | $0.000043 | 47,687.86 | $2.06 | |
ETH | <0.01% | $0.02142 | 95.9918 | $2.06 | |
ETH | <0.01% | $0.039733 | 51.4433 | $2.04 | |
ETH | <0.01% | $0.000051 | 39,689.4026 | $2.03 | |
ETH | <0.01% | $0.000001 | 2,588,967.9587 | $2.02 | |
ETH | <0.01% | $0.008907 | 226.1451 | $2.01 | |
ETH | <0.01% | $0.063198 | 31.7805 | $2.01 | |
ETH | <0.01% | $0.004483 | 447.8663 | $2.01 | |
ETH | <0.01% | $0.000013 | 158,064.7933 | $2.01 | |
ETH | <0.01% | $0.018558 | 107.6064 | $2 | |
ETH | <0.01% | $0.00029 | 6,887.5843 | $2 | |
ETH | <0.01% | $0.000071 | 27,954.1879 | $1.99 | |
ETH | <0.01% | $0.000025 | 80,411.9854 | $1.97 | |
ETH | <0.01% | $0.013731 | 143.3078 | $1.97 | |
ETH | <0.01% | $2,477.81 | 0.00078749 | $1.95 | |
ETH | <0.01% | <$0.000001 | 5,637,069,959.5875 | $1.95 | |
ETH | <0.01% | $5.38 | 0.3618 | $1.95 | |
ETH | <0.01% | $0.001469 | 1,324.8135 | $1.95 | |
ETH | <0.01% | $0.004182 | 462.2147 | $1.93 | |
ETH | <0.01% | <$0.000001 | 234,211,409.2599 | $1.93 | |
ETH | <0.01% | $0.000258 | 7,459.2178 | $1.93 | |
ETH | <0.01% | $0.352204 | 5.4652 | $1.92 | |
ETH | <0.01% | $0.000448 | 4,287.033 | $1.92 | |
ETH | <0.01% | $0.000029 | 65,650.3905 | $1.92 | |
ETH | <0.01% | $0.997912 | 1.9091 | $1.91 | |
ETH | <0.01% | $0.010753 | 176.4088 | $1.9 | |
ETH | <0.01% | $0.047679 | 39.661 | $1.89 | |
ETH | <0.01% | $0.000485 | 3,897.2864 | $1.89 | |
ETH | <0.01% | $0.302711 | 6.2301 | $1.89 | |
ETH | <0.01% | $0.000115 | 16,393.7756 | $1.88 | |
ETH | <0.01% | $0.000004 | 458,086.6262 | $1.86 | |
ETH | <0.01% | $0.002078 | 894.6334 | $1.86 | |
ETH | <0.01% | <$0.000001 | 237,508,159.8186 | $1.86 | |
ETH | <0.01% | $0.018186 | 101.9829 | $1.85 | |
ETH | <0.01% | $0.00007 | 26,343.2488 | $1.84 | |
ETH | <0.01% | $0.001028 | 1,788.594 | $1.84 | |
ETH | <0.01% | $0.058468 | 31.3015 | $1.83 | |
ETH | <0.01% | $0.000178 | 10,247.9794 | $1.83 | |
ETH | <0.01% | $7.68 | 0.2346 | $1.8 | |
ETH | <0.01% | $0.000157 | 11,506.252 | $1.8 | |
ETH | <0.01% | <$0.000001 | 42,422,271,557.0408 | $1.79 | |
ETH | <0.01% | $0.02345 | 76.5231 | $1.79 | |
ETH | <0.01% | $0.001516 | 1,181.4039 | $1.79 | |
ETH | <0.01% | <$0.000001 | 53,160,091,793.3365 | $1.77 | |
ETH | <0.01% | $0.000004 | 410,087.2095 | $1.77 | |
ETH | <0.01% | <$0.000001 | 176,579,335.3048 | $1.76 | |
ETH | <0.01% | $0.000002 | 1,035,083.6539 | $1.76 | |
ETH | <0.01% | $0.004565 | 381.5315 | $1.74 | |
ETH | <0.01% | $0.005979 | 290.7996 | $1.74 | |
ETH | <0.01% | $0.000046 | 38,042.5757 | $1.73 | |
ETH | <0.01% | $0.000001 | 1,266,921.513 | $1.73 | |
ETH | <0.01% | $0.000771 | 2,226.2624 | $1.72 | |
ETH | <0.01% | $0.000001 | 1,280,907.455 | $1.7 | |
ETH | <0.01% | $19.27 | 0.0883 | $1.7 | |
ETH | <0.01% | $0.000064 | 26,648.7467 | $1.7 | |
ETH | <0.01% | $0.000392 | 4,329.8731 | $1.7 | |
ETH | <0.01% | <$0.000001 | 9,389,219.1008 | $1.69 | |
ETH | <0.01% | <$0.000001 | 27,744,044,023.4281 | $1.69 | |
ETH | <0.01% | $0.0001 | 16,617.6367 | $1.67 | |
ETH | <0.01% | <$0.000001 | 43,331,327.1174 | $1.66 | |
ETH | <0.01% | $0.037926 | 43.5632 | $1.65 | |
ETH | <0.01% | $0.000075 | 21,945.5815 | $1.65 | |
ETH | <0.01% | $10.59 | 0.1553 | $1.65 | |
ETH | <0.01% | $0.00023 | 7,107.7672 | $1.63 | |
ETH | <0.01% | $0.001087 | 1,502.0928 | $1.63 | |
ETH | <0.01% | $0.000496 | 3,265.6423 | $1.62 | |
ETH | <0.01% | $0.002124 | 760.4846 | $1.62 | |
ETH | <0.01% | $0.01383 | 116.6528 | $1.61 | |
ETH | <0.01% | <$0.000001 | 327,461,613,037.5703 | $1.61 | |
ETH | <0.01% | <$0.000001 | 6,153,967.7624 | $1.58 | |
ETH | <0.01% | $0.145739 | 10.8259 | $1.58 | |
ETH | <0.01% | $0.002058 | 765.5513 | $1.58 | |
ETH | <0.01% | <$0.000001 | 3,329,645.1569 | $1.57 | |
ETH | <0.01% | $0.000109 | 14,353.1229 | $1.57 | |
ETH | <0.01% | $2.02 | 0.7752 | $1.57 | |
ETH | <0.01% | $0.017723 | 88.2633 | $1.56 | |
ETH | <0.01% | $0.001729 | 904.0556 | $1.56 | |
ETH | <0.01% | <$0.000001 | 10,729,113,213.33 | $1.56 | |
ETH | <0.01% | $0.000143 | 10,897.773 | $1.56 | |
ETH | <0.01% | <$0.000001 | 13,375,459.4682 | $1.56 | |
ETH | <0.01% | $0.000013 | 115,741.0611 | $1.55 | |
ETH | <0.01% | $0.000037 | 41,220.9533 | $1.54 | |
ETH | <0.01% | <$0.000001 | 10,595,038.4203 | $1.54 | |
ETH | <0.01% | $0.433786 | 3.5228 | $1.53 | |
ETH | <0.01% | $0.003559 | 427.5658 | $1.52 | |
ETH | <0.01% | $0.011798 | 128.8165 | $1.52 | |
ETH | <0.01% | <$0.000001 | 375,384,329.6976 | $1.52 | |
ETH | <0.01% | $0.000066 | 22,953.7351 | $1.51 | |
ETH | <0.01% | $0.001143 | 1,322.9699 | $1.51 | |
ETH | <0.01% | $0.000663 | 2,274.5928 | $1.51 | |
ETH | <0.01% | <$0.000001 | 24,999,734,649.7011 | $1.5 | |
ETH | <0.01% | $0.000978 | 1,534.8686 | $1.5 | |
ETH | <0.01% | <$0.000001 | 12,266,101.3869 | $1.5 | |
ETH | <0.01% | $0.004277 | 348.8198 | $1.49 | |
ETH | <0.01% | $0.000475 | 3,139.3652 | $1.49 | |
ETH | <0.01% | $3.27 | 0.4552 | $1.49 | |
ETH | <0.01% | $0.000011 | 135,639.7209 | $1.48 | |
ETH | <0.01% | $0.037949 | 38.9784 | $1.48 | |
ETH | <0.01% | $0.000074 | 19,760.2157 | $1.47 | |
ETH | <0.01% | $0.009834 | 148.8649 | $1.46 | |
ETH | <0.01% | $0.058403 | 25.0436 | $1.46 | |
ETH | <0.01% | $0.00032 | 4,528.3779 | $1.45 | |
ETH | <0.01% | $62.27 | 0.0233 | $1.45 | |
ETH | <0.01% | $0.00028 | 5,168.4241 | $1.45 | |
ETH | <0.01% | $0.000012 | 118,522.264 | $1.43 | |
ETH | <0.01% | <$0.000001 | 6,033,482.8211 | $1.43 | |
ETH | <0.01% | $0.000401 | 3,556.4618 | $1.43 | |
ETH | <0.01% | <$0.000001 | 10,739,501.2678 | $1.42 | |
ETH | <0.01% | $0.000324 | 4,372.2722 | $1.42 | |
ETH | <0.01% | $0.024487 | 57.7302 | $1.41 | |
ETH | <0.01% | $0.000002 | 838,438.7709 | $1.41 | |
ETH | <0.01% | $0.00002 | 70,154.6774 | $1.4 | |
ETH | <0.01% | $0.000028 | 49,229.4798 | $1.4 | |
ETH | <0.01% | <$0.000001 | 443,715,990.8011 | $1.39 | |
ETH | <0.01% | <$0.000001 | 1,068,777,779.0107 | $1.39 | |
ETH | <0.01% | $0.001718 | 809.0656 | $1.39 | |
ETH | <0.01% | $0.047235 | 29.32 | $1.38 | |
ETH | <0.01% | $0.000053 | 25,953.8146 | $1.38 | |
ETH | <0.01% | <$0.000001 | 174,248,266.6663 | $1.38 | |
ETH | <0.01% | $48.17 | 0.0286 | $1.38 | |
ETH | <0.01% | $0.006731 | 201.6088 | $1.36 | |
ETH | <0.01% | <$0.000001 | 61,785,197,787.0918 | $1.35 | |
ETH | <0.01% | $0.000138 | 9,681.5165 | $1.33 | |
ETH | <0.01% | $0.259145 | 5.1242 | $1.33 | |
ETH | <0.01% | $0.002976 | 445.2154 | $1.32 | |
ETH | <0.01% | <$0.000001 | 689,704,023.6679 | $1.32 | |
ETH | <0.01% | $0.000007 | 181,578.1301 | $1.32 | |
ETH | <0.01% | $0.038177 | 34.3132 | $1.31 | |
ETH | <0.01% | $0.000346 | 3,785.2708 | $1.31 | |
ETH | <0.01% | $0.000003 | 490,585.7681 | $1.3 | |
ETH | <0.01% | $0.000064 | 20,030.1751 | $1.29 | |
ETH | <0.01% | <$0.000001 | 13,008,221.784 | $1.28 | |
ETH | <0.01% | <$0.000001 | 22,167,749,061.7508 | $1.26 | |
ETH | <0.01% | $0.104792 | 12.0445 | $1.26 | |
ETH | <0.01% | $0.004053 | 310.9057 | $1.26 | |
ETH | <0.01% | $0.792583 | 1.5865 | $1.26 | |
ETH | <0.01% | $0.15362 | 8.1074 | $1.25 | |
ETH | <0.01% | $0.001176 | 1,054.9317 | $1.24 | |
ETH | <0.01% | $0.188103 | 6.5535 | $1.23 | |
ETH | <0.01% | $0.011523 | 106.5868 | $1.23 | |
ETH | <0.01% | $0.0039 | 314.4692 | $1.23 | |
ETH | <0.01% | <$0.000001 | 6,681,678,043.593 | $1.22 | |
ETH | <0.01% | $0.000002 | 798,880.2268 | $1.21 | |
ETH | <0.01% | $0.000252 | 4,817.6419 | $1.21 | |
ETH | <0.01% | $0.015225 | 79.3335 | $1.21 | |
ETH | <0.01% | $104,016.85 | 0.00001159 | $1.21 | |
ETH | <0.01% | $0.00059 | 2,032.8523 | $1.2 | |
ETH | <0.01% | $0.006581 | 181.958 | $1.2 | |
ETH | <0.01% | $0.004239 | 282.3262 | $1.2 | |
ETH | <0.01% | $0.001813 | 658.2293 | $1.19 | |
ETH | <0.01% | $17,723.71 | 0.00006717 | $1.19 | |
ETH | <0.01% | $0.002915 | 407.5752 | $1.19 | |
ETH | <0.01% | $0.002482 | 475.2883 | $1.18 | |
ETH | <0.01% | <$0.000001 | 4,280,326,655.3619 | $1.18 | |
ETH | <0.01% | $0.192844 | 6.0773 | $1.17 | |
ETH | <0.01% | $0.000133 | 8,795.4023 | $1.17 | |
ETH | <0.01% | $0.001603 | 725.0841 | $1.16 | |
ETH | <0.01% | $0.001925 | 601.6749 | $1.16 | |
ETH | <0.01% | $3.51 | 0.3262 | $1.15 | |
ETH | <0.01% | $0.027671 | 41.1924 | $1.14 | |
ETH | <0.01% | $0.000045 | 25,098.9212 | $1.14 | |
ETH | <0.01% | $0.061338 | 18.4768 | $1.13 | |
ETH | <0.01% | $0.004288 | 263.7119 | $1.13 | |
ETH | <0.01% | <$0.000001 | 954,818,367.3524 | $1.13 | |
ETH | <0.01% | $0.041826 | 26.8438 | $1.12 | |
ETH | <0.01% | $0.000316 | 3,537.6635 | $1.12 | |
ETH | <0.01% | $0.000065 | 17,102.0119 | $1.12 | |
ETH | <0.01% | $0.004333 | 255.9911 | $1.11 | |
ETH | <0.01% | $0.00945 | 117.2825 | $1.11 | |
ETH | <0.01% | $0.001041 | 1,060.6534 | $1.1 | |
ETH | <0.01% | $0.039258 | 28.1044 | $1.1 | |
ETH | <0.01% | $0.001724 | 638.4541 | $1.1 | |
ETH | <0.01% | $0.008448 | 129.7209 | $1.1 | |
ETH | <0.01% | $0.004958 | 220.1937 | $1.09 | |
ETH | <0.01% | <$0.000001 | 32,488,220.1476 | $1.09 | |
ETH | <0.01% | $0.00001 | 105,136.5286 | $1.09 | |
ETH | <0.01% | $0.000002 | 498,239.7098 | $1.09 | |
ETH | <0.01% | $0.000658 | 1,646.0455 | $1.08 | |
ETH | <0.01% | $0.00124 | 853.1435 | $1.06 | |
ETH | <0.01% | $0.000658 | 1,600.7506 | $1.05 | |
ETH | <0.01% | $5.51 | 0.1907 | $1.05 | |
ETH | <0.01% | $0.00116 | 900.4896 | $1.04 | |
ETH | <0.01% | $0.000769 | 1,353.5021 | $1.04 | |
ETH | <0.01% | <$0.000001 | 74,206,743.1411 | $1.04 | |
ETH | <0.01% | $0.000078 | 13,157.1731 | $1.03 | |
ETH | <0.01% | $0.000308 | 3,344.3495 | $1.03 | |
ETH | <0.01% | $0.21797 | 4.6967 | $1.02 | |
ETH | <0.01% | $0.003613 | 282.5983 | $1.02 | |
ETH | <0.01% | <$0.000001 | 50,896,733,571.0823 | $1.02 | |
ETH | <0.01% | $0.002472 | 412.0481 | $1.02 | |
ETH | <0.01% | $0.00027 | 3,764.9619 | $1.02 | |
ETH | <0.01% | $0.000247 | 4,081.4598 | $1.01 | |
ETH | <0.01% | $0.000106 | 9,507.866 | $1.01 | |
ETH | <0.01% | $0.000556 | 1,804.5028 | $1 | |
ETH | <0.01% | $0.004408 | 227.2429 | $1 | |
ETH | <0.01% | $0.001551 | 645.6023 | $1 | |
ETH | <0.01% | $0.000381 | 2,629.8261 | $1 | |
ETH | <0.01% | $0.001072 | 932.1157 | $0.9994 | |
ETH | <0.01% | $0.000117 | 8,562.1192 | $0.9975 | |
ETH | <0.01% | $0.000013 | 77,169.3495 | $0.9938 | |
ETH | <0.01% | $0.14052 | 7.0539 | $0.9912 | |
ETH | <0.01% | $0.007153 | 138.087 | $0.9878 | |
ETH | <0.01% | $0.079082 | 12.4363 | $0.9834 | |
ETH | <0.01% | $0.002623 | 374.2842 | $0.9816 | |
ETH | <0.01% | $0.000247 | 3,971.1237 | $0.9798 | |
ETH | <0.01% | $0.000229 | 4,272.791 | $0.9776 | |
ETH | <0.01% | $0.000074 | 13,224.5626 | $0.9774 | |
ETH | <0.01% | $0.00805 | 121.3814 | $0.9771 | |
ETH | <0.01% | $0.021528 | 45.2851 | $0.9749 | |
ETH | <0.01% | <$0.000001 | 403,935,651.2698 | $0.9706 | |
ETH | <0.01% | $5.83 | 0.1653 | $0.9635 | |
ETH | <0.01% | $0.000004 | 262,335.7435 | $0.9627 | |
ETH | <0.01% | $0.000006 | 150,132.2953 | $0.9623 | |
ETH | <0.01% | $0.002407 | 398.7171 | $0.9596 | |
ETH | <0.01% | $0.000347 | 2,741.8731 | $0.9523 | |
ETH | <0.01% | $0.000004 | 257,558.7641 | $0.9503 | |
ETH | <0.01% | $0.00816 | 115.1472 | $0.9396 | |
ETH | <0.01% | $0.008047 | 115.1319 | $0.9264 | |
ETH | <0.01% | $0.00968 | 95.6901 | $0.9262 | |
ETH | <0.01% | $25.51 | 0.0361 | $0.921 | |
ETH | <0.01% | $0.026966 | 33.8435 | $0.9126 | |
ETH | <0.01% | $0.006364 | 143.3935 | $0.9125 | |
ETH | <0.01% | $0.002136 | 423.1039 | $0.9035 | |
ETH | <0.01% | $0.000001 | 1,509,050.4456 | $0.9031 | |
ETH | <0.01% | $0.002163 | 414.8314 | $0.8972 | |
ETH | <0.01% | $0.001254 | 712.7727 | $0.8937 | |
ETH | <0.01% | $0.00007 | 12,527.5346 | $0.883 | |
ETH | <0.01% | $0.001489 | 584.8595 | $0.8708 | |
ETH | <0.01% | $0.000341 | 2,543.5116 | $0.8662 | |
ETH | <0.01% | $0.000749 | 1,149.3895 | $0.8613 | |
ETH | <0.01% | $0.210753 | 4.0764 | $0.8591 | |
ETH | <0.01% | $0.001218 | 696.4693 | $0.848 | |
ETH | <0.01% | $0.000223 | 3,803.8991 | $0.8469 | |
ETH | <0.01% | $0.003082 | 273.8003 | $0.8439 | |
ETH | <0.01% | $0.000055 | 15,416.1673 | $0.8437 | |
ETH | <0.01% | <$0.000001 | 4,791,527.2284 | $0.8435 | |
ETH | <0.01% | $0.00276 | 305.1567 | $0.8422 | |
ETH | <0.01% | $0.007099 | 118.6238 | $0.8421 | |
ETH | <0.01% | <$0.000001 | 9,619,340.1263 | $0.8333 | |
ETH | <0.01% | $0.037597 | 22.1406 | $0.8324 | |
ETH | <0.01% | $0.006851 | 121.121 | $0.8298 | |
ETH | <0.01% | $0.000013 | 64,741.4277 | $0.8293 | |
ETH | <0.01% | $0.000498 | 1,660.6362 | $0.827 | |
ETH | <0.01% | $0.015377 | 53.7793 | $0.8269 | |
ETH | <0.01% | $0.927509 | 0.8866 | $0.8222 | |
ETH | <0.01% | $0.000038 | 21,346.8879 | $0.8177 | |
ETH | <0.01% | $0.000066 | 12,374.1078 | $0.8171 | |
ETH | <0.01% | $0.000786 | 1,032.5065 | $0.8115 | |
ETH | <0.01% | $0.000056 | 14,420.2271 | $0.8094 | |
ETH | <0.01% | $0.011188 | 71.0092 | $0.7944 | |
ETH | <0.01% | $0.003278 | 242.2505 | $0.794 | |
ETH | <0.01% | $0.014864 | 52.8818 | $0.786 | |
ETH | <0.01% | $0.000082 | 9,575.8498 | $0.7857 | |
ETH | <0.01% | $0.000157 | 4,977.5203 | $0.7829 | |
ETH | <0.01% | <$0.000001 | 338,385,582.0715 | $0.7796 | |
ETH | <0.01% | $0.006699 | 115.7958 | $0.7757 | |
ETH | <0.01% | $0.000186 | 4,163.3549 | $0.7754 | |
ETH | <0.01% | $0.000009 | 88,950.3665 | $0.7732 | |
ETH | <0.01% | $0.000044 | 17,608.9555 | $0.7698 | |
ETH | <0.01% | $0.02623 | 29.3204 | $0.769 | |
ETH | <0.01% | $21.12 | 0.0363 | $0.7674 | |
ETH | <0.01% | $0.000224 | 3,428.9356 | $0.7671 | |
ETH | <0.01% | <$0.000001 | 71,247,344.174 | $0.7644 | |
ETH | <0.01% | <$0.000001 | 4,060,018,334,345.9214 | $0.7556 | |
ETH | <0.01% | $0.230381 | 3.2739 | $0.7542 | |
ETH | <0.01% | $0.015851 | 47.1857 | $0.7479 | |
ETH | <0.01% | <$0.000001 | 15,576,722,308.7551 | $0.7346 | |
ETH | <0.01% | $0.000327 | 2,236.0042 | $0.7312 | |
ETH | <0.01% | $0.003596 | 202.2983 | $0.7275 | |
ETH | <0.01% | $0.024703 | 29.1287 | $0.7195 | |
ETH | <0.01% | $0.080305 | 8.9252 | $0.7167 | |
ETH | <0.01% | $0.00005 | 14,224.347 | $0.7116 | |
ETH | <0.01% | <$0.000001 | 1,449,519,576.6019 | $0.7089 | |
ETH | <0.01% | $0.001063 | 664.7175 | $0.7065 | |
ETH | <0.01% | $104,367 | 0.00000675 | $0.7044 | |
ETH | <0.01% | $0.008286 | 84.2474 | $0.698 | |
ETH | <0.01% | $0.000004 | 178,696.8218 | $0.6957 | |
ETH | <0.01% | $0.000012 | 58,586.3278 | $0.6954 | |
ETH | <0.01% | $0.000143 | 4,835.941 | $0.6895 | |
ETH | <0.01% | $0.046943 | 14.6739 | $0.6888 | |
ETH | <0.01% | $0.002193 | 313.6339 | $0.6879 | |
ETH | <0.01% | $0.000345 | 1,989.5253 | $0.6864 | |
ETH | <0.01% | <$0.000001 | 5,620,184.1095 | $0.6831 | |
ETH | <0.01% | $0.003843 | 177.0005 | $0.6801 | |
ETH | <0.01% | $0.000019 | 36,504.8023 | $0.6796 | |
ETH | <0.01% | $1.71 | 0.3964 | $0.6776 | |
ETH | <0.01% | $0.000153 | 4,419.8834 | $0.6751 | |
ETH | <0.01% | $0.075234 | 8.97 | $0.6748 | |
ETH | <0.01% | <$0.000001 | 5,943,528.3941 | $0.6678 | |
ETH | <0.01% | $0.001125 | 587.1683 | $0.6606 | |
ETH | <0.01% | <$0.000001 | 7,055,107.8117 | $0.659 | |
ETH | <0.01% | $0.426576 | 1.5186 | $0.6478 | |
ETH | <0.01% | $0.000049 | 13,228.8863 | $0.6463 | |
ETH | <0.01% | $0.000025 | 25,629.6853 | $0.6433 | |
ETH | <0.01% | $4.29 | 0.1498 | $0.6425 | |
ETH | <0.01% | <$0.000001 | 2,903,609.545 | $0.6411 | |
ETH | <0.01% | $0.059949 | 10.6909 | $0.6409 | |
ETH | <0.01% | $0.000961 | 666.5987 | $0.6406 | |
ETH | <0.01% | $0.024869 | 25.7089 | $0.6393 | |
ETH | <0.01% | <$0.000001 | 16,756,079,483.7325 | $0.6387 | |
ETH | <0.01% | $0.50144 | 1.2623 | $0.6329 | |
ETH | <0.01% | $0.000414 | 1,515.5228 | $0.6276 | |
ETH | <0.01% | $0.000362 | 1,719.1526 | $0.6218 | |
ETH | <0.01% | <$0.000001 | 19,154,032.369 | $0.6212 | |
ETH | <0.01% | <$0.000001 | 808,823,621.5638 | $0.603 | |
ETH | <0.01% | $0.017481 | 34.4948 | $0.6029 | |
ETH | <0.01% | <$0.000001 | 2,718,198,406,134.6929 | $0.6017 | |
ETH | <0.01% | $0.000024 | 24,961.4801 | $0.6003 | |
ETH | <0.01% | $0.018993 | 31.3751 | $0.5959 | |
ETH | <0.01% | $0.002892 | 203.4455 | $0.5884 | |
ETH | <0.01% | $0.013359 | 43.9536 | $0.5871 | |
ETH | <0.01% | $0.000225 | 2,606.159 | $0.5867 | |
ETH | <0.01% | $0.003679 | 159.2132 | $0.5857 | |
ETH | <0.01% | $0.000809 | 723.0359 | $0.5847 | |
ETH | <0.01% | <$0.000001 | 14,127,561.6249 | $0.5834 | |
ETH | <0.01% | $0.060152 | 9.6816 | $0.5823 | |
ETH | <0.01% | $0.000306 | 1,888.8779 | $0.5784 | |
ETH | <0.01% | $0.000099 | 5,827.1922 | $0.5759 | |
ETH | <0.01% | <$0.000001 | 4,917,945.4193 | $0.5751 | |
ETH | <0.01% | $0.001079 | 531.6471 | $0.5735 | |
ETH | <0.01% | $0.001885 | 303.6521 | $0.5724 | |
ETH | <0.01% | $104,167 | 0.00000547 | $0.5697 | |
ETH | <0.01% | <$0.000001 | 4,786,624.2253 | $0.5687 | |
ETH | <0.01% | $11.41 | 0.0497 | $0.567 | |
ETH | <0.01% | $0.485852 | 1.1668 | $0.5669 | |
ETH | <0.01% | $0.002911 | 194.7394 | $0.5669 | |
ETH | <0.01% | $140.68 | 0.00401403 | $0.5647 | |
ETH | <0.01% | $0.000628 | 892.0197 | $0.56 | |
ETH | <0.01% | $0.000084 | 6,654.2475 | $0.5562 | |
ETH | <0.01% | $0.008473 | 65.168 | $0.5521 | |
ETH | <0.01% | $0.000029 | 19,253.5321 | $0.5504 | |
ETH | <0.01% | $0.000368 | 1,491.755 | $0.5484 | |
ETH | <0.01% | $0.496902 | 1.0824 | $0.5378 | |
ETH | <0.01% | $109.48 | 0.00489666 | $0.536 | |
ETH | <0.01% | $0.000059 | 9,009.8962 | $0.5301 | |
ETH | <0.01% | $0.001388 | 378.6146 | $0.5256 | |
ETH | <0.01% | $0.002845 | 182.3748 | $0.5188 | |
ETH | <0.01% | $0.000436 | 1,183.4381 | $0.5154 | |
ETH | <0.01% | $0.000122 | 4,198.0245 | $0.5135 | |
ETH | <0.01% | <$0.000001 | 19,769,991.919 | $0.5135 | |
ETH | <0.01% | <$0.000001 | 128,263,679.5041 | $0.5097 | |
ETH | <0.01% | $0.00109 | 465.0853 | $0.5067 | |
ETH | <0.01% | <$0.000001 | 20,738,159,030.3704 | $0.5039 | |
ETH | <0.01% | $0.123587 | 4.0291 | $0.4979 | |
ETH | <0.01% | $0.010929 | 45.4293 | $0.4964 | |
ETH | <0.01% | $0.001209 | 409.2123 | $0.4947 | |
ETH | <0.01% | <$0.000001 | 703,577,308.5247 | $0.493 | |
ETH | <0.01% | $0.003211 | 153.3694 | $0.4924 | |
ETH | <0.01% | $0.000007 | 68,288.2227 | $0.4841 | |
ETH | <0.01% | $0.000123 | 3,929.2039 | $0.4841 | |
ETH | <0.01% | $0.00077 | 623.2473 | $0.4796 | |
ETH | <0.01% | $0.000101 | 4,764.0169 | $0.479 | |
ETH | <0.01% | $0.00014 | 3,404.2848 | $0.4772 | |
ETH | <0.01% | <$0.000001 | 92,984,388,420,402.109 | $0.4689 | |
ETH | <0.01% | $0.000009 | 51,908.7592 | $0.4677 | |
ETH | <0.01% | $0.000001 | 647,936.5489 | $0.4662 | |
ETH | <0.01% | $31.7 | 0.0146 | $0.4627 | |
ETH | <0.01% | $0.000239 | 1,939.0449 | $0.4625 | |
ETH | <0.01% | <$0.000001 | 27,038,237,035.7719 | $0.4602 | |
ETH | <0.01% | $0.001612 | 282.9049 | $0.4561 | |
ETH | <0.01% | $0.003174 | 141.979 | $0.4506 | |
ETH | <0.01% | $0.00094 | 476.511 | $0.448 | |
ETH | <0.01% | $0.0004 | 1,110.2382 | $0.4438 | |
ETH | <0.01% | $0.010859 | 40.7248 | $0.4422 | |
ETH | <0.01% | $0.000065 | 6,757.0702 | $0.4413 | |
ETH | <0.01% | $4.21 | 0.1048 | $0.441 | |
ETH | <0.01% | $0.014922 | 29.3126 | $0.4373 | |
ETH | <0.01% | $0.005945 | 72.4417 | $0.4306 | |
ETH | <0.01% | $5.54 | 0.0771 | $0.4272 | |
ETH | <0.01% | $0.001148 | 368.0987 | $0.4225 | |
ETH | <0.01% | <$0.000001 | 120,696,921,060.7917 | $0.4203 | |
ETH | <0.01% | $0.006879 | 60.5516 | $0.4165 | |
ETH | <0.01% | $0.000525 | 787.7578 | $0.4136 | |
ETH | <0.01% | $0.000117 | 3,514.9778 | $0.4107 | |
ETH | <0.01% | $0.000001 | 509,058.3367 | $0.4102 | |
ETH | <0.01% | $12,118.84 | 0.00003377 | $0.4092 | |
ETH | <0.01% | $0.000191 | 2,137.3389 | $0.4091 | |
ETH | <0.01% | $0.001846 | 221.2434 | $0.4084 | |
ETH | <0.01% | $0.000007 | 54,235.9274 | $0.4056 | |
ETH | <0.01% | $0.000297 | 1,361.3222 | $0.4043 | |
ETH | <0.01% | <$0.000001 | 3,522,982.5465 | $0.4037 | |
ETH | <0.01% | $0.000217 | 1,851.2011 | $0.4019 | |
ETH | <0.01% | $0.066044 | 5.9971 | $0.396 | |
ETH | <0.01% | $0.507712 | 0.7733 | $0.3926 | |
ETH | <0.01% | $0.001429 | 273.0545 | $0.3903 | |
ETH | <0.01% | $0.011622 | 33.5208 | $0.3895 | |
ETH | <0.01% | $0.201508 | 1.9305 | $0.389 | |
ETH | <0.01% | <$0.000001 | 862,836.3441 | $0.3881 | |
ETH | <0.01% | $5.52 | 0.07 | $0.3865 | |
ETH | <0.01% | <$0.000001 | 29,308,015.2271 | $0.3857 | |
ETH | <0.01% | $0.000783 | 486.2172 | $0.3809 | |
ETH | <0.01% | <$0.000001 | 84,003,031.9338 | $0.3804 | |
ETH | <0.01% | $0.00049 | 770.7525 | $0.3778 | |
ETH | <0.01% | <$0.000001 | 3,738,171,376.4149 | $0.3735 | |
ETH | <0.01% | $0.999564 | 0.3722 | $0.372 | |
ETH | <0.01% | $0.00159 | 233.3662 | $0.371 | |
ETH | <0.01% | $0.000443 | 833.8991 | $0.3692 | |
ETH | <0.01% | $0.000002 | 170,793.3778 | $0.3692 | |
ETH | <0.01% | $0.000155 | 2,377.4585 | $0.3685 | |
ETH | <0.01% | $0.000007 | 55,484.1296 | $0.3639 | |
ETH | <0.01% | <$0.000001 | 12,794,174.6681 | $0.3633 | |
ETH | <0.01% | $0.002461 | 147.4499 | $0.3628 | |
ETH | <0.01% | $0.000001 | 245,112.3444 | $0.3627 | |
ETH | <0.01% | $0.000163 | 2,218.5524 | $0.3611 | |
ETH | <0.01% | $0.000369 | 972.3521 | $0.359 | |
ETH | <0.01% | <$0.000001 | 1,727,046.9285 | $0.3587 | |
ETH | <0.01% | $0.021673 | 16.5239 | $0.3581 | |
ETH | <0.01% | $0.343739 | 1.0418 | $0.3581 | |
ETH | <0.01% | $0.000051 | 6,944.5992 | $0.3572 | |
ETH | <0.01% | $0.000028 | 12,737.0232 | $0.3542 | |
ETH | <0.01% | $0.000254 | 1,385.4506 | $0.3525 | |
ETH | <0.01% | $0.000261 | 1,346.6283 | $0.3518 | |
ETH | <0.01% | $0.000169 | 2,073.5957 | $0.351 | |
ETH | <0.01% | $0.013308 | 26.3494 | $0.3506 | |
ETH | <0.01% | <$0.000001 | 1,259,334,226.6268 | $0.3483 | |
ETH | <0.01% | $0.000129 | 2,662.6737 | $0.3445 | |
ETH | <0.01% | $0.000064 | 5,401.4463 | $0.3431 | |
ETH | <0.01% | $0.001548 | 221.3156 | $0.3426 | |
ETH | <0.01% | $0.0009 | 374.3922 | $0.3369 | |
ETH | <0.01% | $0.01236 | 27.2624 | $0.3369 | |
ETH | <0.01% | $0.000614 | 546.68 | $0.3354 | |
ETH | <0.01% | $0.000043 | 7,800.6684 | $0.3338 | |
ETH | <0.01% | $0.000449 | 741.2429 | $0.333 | |
ETH | <0.01% | $0.000762 | 431.6178 | $0.329 | |
ETH | <0.01% | $0.004939 | 66.565 | $0.3287 | |
ETH | <0.01% | $1.05 | 0.3137 | $0.3284 | |
ETH | <0.01% | $0.000001 | 500,493.7082 | $0.3277 | |
ETH | <0.01% | $0.056787 | 5.7213 | $0.3248 | |
ETH | <0.01% | $0.000005 | 66,062.5034 | $0.3204 | |
ETH | <0.01% | $0.999806 | 0.3157 | $0.3156 | |
ETH | <0.01% | $0.004207 | 74.9121 | $0.3151 | |
ETH | <0.01% | $0.000014 | 22,265.4126 | $0.3148 | |
ETH | <0.01% | $0.000065 | 4,826.1805 | $0.312 | |
ETH | <0.01% | <$0.000001 | 36,943,670.4739 | $0.3089 | |
ETH | <0.01% | $0.000005 | 61,077.0396 | $0.3084 | |
ETH | <0.01% | $0.00061 | 504.7723 | $0.3081 | |
ETH | <0.01% | $0.00001 | 31,618.5488 | $0.3062 | |
ETH | <0.01% | $12.32 | 0.0246 | $0.303 | |
ETH | <0.01% | $103,854 | 0.0000029 | $0.3011 | |
ETH | <0.01% | $0.000184 | 1,637.5899 | $0.301 | |
ETH | <0.01% | $0.000355 | 848.0055 | $0.3006 | |
ETH | <0.01% | $0.41794 | 0.7046 | $0.2944 | |
ETH | <0.01% | <$0.000001 | 5,888,735.8606 | $0.2942 | |
ETH | <0.01% | $0.276404 | 1.0422 | $0.288 | |
ETH | <0.01% | $0.001084 | 265.4719 | $0.2878 | |
ETH | <0.01% | $0.000001 | 273,903.5515 | $0.2875 | |
ETH | <0.01% | $0.004488 | 63.6914 | $0.2858 | |
ETH | <0.01% | $0.998056 | 0.2838 | $0.2832 | |
ETH | <0.01% | $0.064549 | 4.3848 | $0.283 | |
ETH | <0.01% | $0.0005 | 564.0075 | $0.2817 | |
ETH | <0.01% | $0.008636 | 32.5641 | $0.2812 | |
ETH | <0.01% | $0.000187 | 1,468 | $0.2751 | |
ETH | <0.01% | $0.033594 | 8.1542 | $0.2739 | |
ETH | <0.01% | $0.000015 | 17,578.6226 | $0.2722 | |
ETH | <0.01% | $0.170939 | 1.5898 | $0.2717 | |
ETH | <0.01% | $0.000006 | 43,486.0453 | $0.2709 | |
ETH | <0.01% | $0.001311 | 205.5853 | $0.2695 | |
ETH | <0.01% | $0.033534 | 8.0363 | $0.2694 | |
ETH | <0.01% | $0.0002 | 1,337.2306 | $0.2677 | |
ETH | <0.01% | $0.000025 | 10,814.5943 | $0.267 | |
ETH | <0.01% | $0.000006 | 43,667.2875 | $0.2662 | |
ETH | <0.01% | $1.14 | 0.2325 | $0.265 | |
ETH | <0.01% | $0.749928 | 0.3516 | $0.2636 | |
ETH | <0.01% | $0.000001 | 312,738.1141 | $0.2622 | |
ETH | <0.01% | <$0.000001 | 29,096,792.9115 | $0.2592 | |
ETH | <0.01% | <$0.000001 | 914,904.1944 | $0.2573 | |
ETH | <0.01% | <$0.000001 | 7,896,989.0414 | $0.256 | |
ETH | <0.01% | $0.000783 | 325.7184 | $0.255 | |
ETH | <0.01% | $0.00011 | 2,313.962 | $0.2534 | |
ETH | <0.01% | $0.332521 | 0.7597 | $0.2526 | |
ETH | <0.01% | $0.014197 | 17.708 | $0.2514 | |
ETH | <0.01% | $0.008131 | 29.7962 | $0.2422 | |
ETH | <0.01% | $0.002567 | 92.7011 | $0.2379 | |
ETH | <0.01% | $0.011958 | 19.4352 | $0.2324 | |
ETH | <0.01% | $0.000158 | 1,473.0255 | $0.2322 | |
ETH | <0.01% | $0.006906 | 33.1404 | $0.2288 | |
ETH | <0.01% | $0.00617 | 36.9003 | $0.2276 | |
ETH | <0.01% | $0.001143 | 198.7485 | $0.2271 | |
ETH | <0.01% | <$0.000001 | 10,794,940,080,737,304 | $0.2266 | |
ETH | <0.01% | $103,711 | 0.00000218 | $0.226 | |
ETH | <0.01% | $0.000542 | 416.5447 | $0.2257 | |
ETH | <0.01% | $0.003419 | 65.4449 | $0.2237 | |
ETH | <0.01% | <$0.000001 | 3,001,428.8329 | $0.2223 | |
ETH | <0.01% | $0.009602 | 22.9976 | $0.2208 | |
ETH | <0.01% | $23.12 | 0.00944467 | $0.2183 | |
ETH | <0.01% | $0.000114 | 1,904.7608 | $0.218 | |
ETH | <0.01% | <$0.000001 | 431,044,365.5185 | $0.2157 | |
ETH | <0.01% | $3.48 | 0.0619 | $0.2153 | |
ETH | <0.01% | $0.635512 | 0.3378 | $0.2146 | |
ETH | <0.01% | <$0.000001 | 1,033,073.5181 | $0.2062 | |
ETH | <0.01% | $0.000039 | 5,268.7713 | $0.206 | |
ETH | <0.01% | $0.004471 | 45.977 | $0.2055 | |
ETH | <0.01% | $0.003503 | 58.6524 | $0.2054 | |
ETH | <0.01% | $0.385878 | 0.5285 | $0.2039 | |
ETH | <0.01% | $0.087476 | 2.3299 | $0.2038 | |
ETH | <0.01% | <$0.000001 | 12,439,543.351 | $0.2036 | |
ETH | <0.01% | $0.12487 | 1.6283 | $0.2033 | |
ETH | <0.01% | $0.000317 | 634.9702 | $0.201 | |
ETH | <0.01% | $0.001677 | 119.0994 | $0.1997 | |
ETH | <0.01% | $1.14 | 0.1751 | $0.1996 | |
ETH | <0.01% | $1.12 | 0.1779 | $0.1993 | |
ETH | <0.01% | $0.000134 | 1,485.1605 | $0.1991 | |
ETH | <0.01% | $0.000035 | 5,587.8499 | $0.196 | |
ETH | <0.01% | $0.000071 | 2,761.0118 | $0.1954 | |
ETH | <0.01% | $0.00031 | 618.0275 | $0.1916 | |
ETH | <0.01% | $0.029587 | 6.396 | $0.1892 | |
ETH | <0.01% | $0.000002 | 119,585.1834 | $0.1888 | |
ETH | <0.01% | $0.000514 | 358.9401 | $0.1843 | |
ETH | <0.01% | $0.006293 | 29.2238 | $0.1839 | |
ETH | <0.01% | $0.000235 | 780.3632 | $0.1831 | |
ETH | <0.01% | $0.047482 | 3.8356 | $0.1821 | |
ETH | <0.01% | <$0.000001 | 3,273,802,542.8775 | $0.1805 | |
ETH | <0.01% | $0.045267 | 3.9794 | $0.1801 | |
ETH | <0.01% | $0.000407 | 438.9192 | $0.1785 | |
ETH | <0.01% | <$0.000001 | 599,400,404,555.6282 | $0.1768 | |
ETH | <0.01% | $0.000165 | 1,067.9227 | $0.1766 | |
ETH | <0.01% | $0.178516 | 0.9594 | $0.1712 | |
ETH | <0.01% | $0.000849 | 201.4439 | $0.171 | |
ETH | <0.01% | $0.033247 | 5.138 | $0.1708 | |
ETH | <0.01% | $0.04499 | 3.7873 | $0.1703 | |
ETH | <0.01% | $0.014682 | 11.5541 | $0.1696 | |
ETH | <0.01% | $0.080875 | 2.0967 | $0.1695 | |
ETH | <0.01% | <$0.000001 | 84,641,504.9846 | $0.1693 | |
ETH | <0.01% | <$0.000001 | 2,816,188.6347 | $0.1689 | |
ETH | <0.01% | $0.000005 | 31,418.2127 | $0.1674 | |
ETH | <0.01% | $0.000666 | 251.1126 | $0.1672 | |
ETH | <0.01% | $0.000002 | 67,851.2477 | $0.1648 | |
ETH | <0.01% | <$0.000001 | 5,382,229,658.461 | $0.1642 | |
ETH | <0.01% | $0.002235 | 73.3951 | $0.164 | |
ETH | <0.01% | $0.046922 | 3.48 | $0.1632 | |
ETH | <0.01% | $0.000135 | 1,213.0632 | $0.1632 | |
ETH | <0.01% | $0.000007 | 21,598.5271 | $0.1617 | |
ETH | <0.01% | $0.008068 | 20.0515 | $0.1617 | |
ETH | <0.01% | $0.000008 | 19,370.1062 | $0.1595 | |
ETH | <0.01% | $0.008416 | 18.5656 | $0.1562 | |
ETH | <0.01% | $0.012561 | 12.3828 | $0.1555 | |
ETH | <0.01% | $0.000047 | 3,192.3515 | $0.1502 | |
ETH | <0.01% | $0.013903 | 10.7967 | $0.1501 | |
ETH | <0.01% | $0.000285 | 523.8107 | $0.1493 | |
ETH | <0.01% | $0.995323 | 0.1499 | $0.1492 | |
ETH | <0.01% | $0.000327 | 451.7252 | $0.1477 | |
ETH | <0.01% | $0.000016 | 9,443.5979 | $0.1471 | |
ETH | <0.01% | $0.259655 | 0.5667 | $0.1471 | |
ETH | <0.01% | $0.004045 | 35.5693 | $0.1438 | |
ETH | <0.01% | $0.009998 | 14.2816 | $0.1427 | |
ETH | <0.01% | $0.049875 | 2.8547 | $0.1423 | |
ETH | <0.01% | $0.063205 | 2.2301 | $0.1409 | |
ETH | <0.01% | $0.021247 | 6.6195 | $0.1406 | |
ETH | <0.01% | $0.002216 | 63.0138 | $0.1396 | |
ETH | <0.01% | $0.000401 | 345.5133 | $0.1386 | |
ETH | <0.01% | $1 | 0.1383 | $0.1384 | |
ETH | <0.01% | $0.002752 | 50.284 | $0.1383 | |
ETH | <0.01% | $0.000002 | 72,077.454 | $0.1375 | |
ETH | <0.01% | $0.000146 | 922.4544 | $0.1344 | |
ETH | <0.01% | $0.002691 | 49.9106 | $0.1343 | |
ETH | <0.01% | $0.400714 | 0.3329 | $0.1333 | |
ETH | <0.01% | $0.002041 | 64.9834 | $0.1326 | |
ETH | <0.01% | <$0.000001 | 584,271,632.154 | $0.1318 | |
ETH | <0.01% | $0.000943 | 138.6636 | $0.1307 | |
ETH | <0.01% | $0.013261 | 9.8335 | $0.1304 | |
ETH | <0.01% | $0.000361 | 361.1733 | $0.1303 | |
ETH | <0.01% | $0.000271 | 478.5641 | $0.1295 | |
ETH | <0.01% | $0.000288 | 450.3903 | $0.1295 | |
ETH | <0.01% | $0.00001 | 12,664.3725 | $0.1276 | |
ETH | <0.01% | $0.007097 | 17.8425 | $0.1266 | |
ETH | <0.01% | $0.00007 | 1,804.0967 | $0.1263 | |
ETH | <0.01% | $0.008137 | 15.5255 | $0.1263 | |
ETH | <0.01% | $0.03252 | 3.8743 | $0.1259 | |
ETH | <0.01% | $0.000054 | 2,287.5879 | $0.1244 | |
ETH | <0.01% | $0.000031 | 4,033.4496 | $0.1244 | |
ETH | <0.01% | $0.000084 | 1,483.0714 | $0.1242 | |
ETH | <0.01% | $0.000371 | 332.7608 | $0.1233 | |
ETH | <0.01% | $0.014826 | 8.3219 | $0.1233 | |
ETH | <0.01% | $0.008121 | 14.6016 | $0.1185 | |
ETH | <0.01% | $0.079588 | 1.4734 | $0.1172 | |
ETH | <0.01% | $0.057816 | 2 | $0.1156 | |
ETH | <0.01% | $0.000748 | 154.1951 | $0.1153 | |
ETH | <0.01% | <$0.000001 | 250,223,003.1312 | $0.1151 | |
ETH | <0.01% | $0.004846 | 23.7359 | $0.115 | |
ETH | <0.01% | <$0.000001 | 2,523,037.5986 | $0.1139 | |
ETH | <0.01% | $0.000012 | 9,586.9933 | $0.113 | |
ETH | <0.01% | $0.309906 | 0.364 | $0.1127 | |
ETH | <0.01% | $0.000021 | 5,434.115 | $0.1125 | |
ETH | <0.01% | $0.000376 | 294.8662 | $0.1107 | |
ETH | <0.01% | $0.001075 | 101.9863 | $0.1096 | |
ETH | <0.01% | $0.000252 | 426.4674 | $0.1074 | |
ETH | <0.01% | $0.016594 | 6.4348 | $0.1067 | |
ETH | <0.01% | $0.00037 | 288.4469 | $0.1067 | |
ETH | <0.01% | $0.001623 | 65.2779 | $0.1059 | |
ETH | <0.01% | $0.002106 | 50.1631 | $0.1056 | |
ETH | <0.01% | $0.194585 | 0.5375 | $0.1045 | |
ETH | <0.01% | $0.008483 | 12.2478 | $0.1038 | |
ETH | <0.01% | $0.000751 | 137.9877 | $0.1035 | |
ETH | <0.01% | $0.000004 | 28,193.3047 | $0.1034 | |
ETH | <0.01% | $0.000035 | 2,963.9464 | $0.1031 | |
ETH | <0.01% | $0.000012 | 8,799.5002 | $0.1014 | |
ETH | <0.01% | $1.01 | 0.1 | $0.1004 | |
ETH | <0.01% | $2,481.37 | 0.00000376 | $0.009338 | |
POL | <0.01% | $0.004571 | 813,686.9508 | $3,719.47 | |
POL | <0.01% | $0.956203 | 1,266.6733 | $1,211.2 | |
POL | <0.01% | $1 | 1,182.6332 | $1,183.82 | |
POL | <0.01% | $0.213986 | 4,838.7967 | $1,035.43 | |
POL | <0.01% | $0.999794 | 976.1367 | $975.94 | |
POL | <0.01% | $0.00375 | 141,827.777 | $531.92 | |
POL | <0.01% | $2,476.74 | 0.1781 | $441.17 | |
POL | <0.01% | $0.015479 | 15,169.7929 | $234.81 | |
POL | <0.01% | $140.78 | 0.7072 | $99.56 | |
POL | <0.01% | $0.004857 | 17,565.3046 | $85.32 | |
POL | <0.01% | $3,338.64 | 0.0254 | $84.76 | |
POL | <0.01% | $17.05 | 4.6826 | $79.84 | |
POL | <0.01% | $0.00003 | 2,423,059.764 | $73.59 | |
POL | <0.01% | $13.54 | 5.1932 | $70.32 | |
POL | <0.01% | $0.227038 | 305.8362 | $69.44 | |
POL | <0.01% | $0.393876 | 172.6374 | $68 | |
POL | <0.01% | $0.190167 | 353.9578 | $67.31 | |
POL | <0.01% | $0.048897 | 1,338.933 | $65.47 | |
POL | <0.01% | $0.023382 | 2,689.9215 | $62.89 | |
POL | <0.01% | $148.19 | 0.3747 | $55.52 | |
POL | <0.01% | $0.053265 | 1,023.017 | $54.49 | |
POL | <0.01% | $5.99 | 8.4584 | $50.67 | |
POL | <0.01% | $1 | 49.0161 | $49.02 | |
POL | <0.01% | $0.002598 | 18,077.1258 | $46.96 | |
POL | <0.01% | $0.301674 | 150.7717 | $45.48 | |
POL | <0.01% | $0.002594 | 16,940.2907 | $43.94 | |
POL | <0.01% | $0.000005 | 8,809,671.2137 | $43.26 | |
POL | <0.01% | $0.297882 | 132.9043 | $39.59 | |
POL | <0.01% | $0.192763 | 202.9208 | $39.12 | |
POL | <0.01% | $0.001988 | 18,759.5424 | $37.3 | |
POL | <0.01% | $0.073532 | 437.9346 | $32.2 | |
POL | <0.01% | $1.14 | 27.7074 | $31.59 | |
POL | <0.01% | $1.14 | 27.7074 | $31.59 | |
POL | <0.01% | $0.007041 | 4,339.2991 | $30.55 | |
POL | <0.01% | $3.75 | 8.0689 | $30.26 | |
POL | <0.01% | $0.089316 | 328.8841 | $29.37 | |
POL | <0.01% | $0.000294 | 95,980.5226 | $28.23 | |
POL | <0.01% | <$0.000001 | 25,051,722,241.5649 | $27.56 | |
POL | <0.01% | $0.001713 | 15,862.6224 | $27.18 | |
POL | <0.01% | $0.086478 | 289.6774 | $25.05 | |
POL | <0.01% | $0.02031 | 1,224.976 | $24.88 | |
POL | <0.01% | <$0.000001 | 1,317,160,948.7478 | $24.37 | |
POL | <0.01% | $0.027573 | 826.2297 | $22.78 | |
POL | <0.01% | $1.13 | 19.6049 | $22.15 | |
POL | <0.01% | $0.147858 | 147.5231 | $21.81 | |
POL | <0.01% | $0.630479 | 33.6131 | $21.19 | |
POL | <0.01% | $0.002648 | 7,744.9568 | $20.51 | |
POL | <0.01% | $0.002678 | 7,594.7571 | $20.34 | |
POL | <0.01% | $0.080403 | 241.7529 | $19.44 | |
POL | <0.01% | $2.1 | 9.0139 | $18.93 | |
POL | <0.01% | $0.002111 | 8,619.0537 | $18.2 | |
POL | <0.01% | $0.012466 | 1,409.2544 | $17.57 | |
POL | <0.01% | $4.02 | 4.0086 | $16.11 | |
POL | <0.01% | <$0.000001 | 1,882,615,763.9402 | $15.81 | |
POL | <0.01% | $0.013174 | 1,184.6711 | $15.61 | |
POL | <0.01% | $0.000001 | 13,265,222.4084 | $14.59 | |
POL | <0.01% | $0.270006 | 52.5244 | $14.18 | |
POL | <0.01% | <$0.000001 | 105,934,094.9569 | $13.67 | |
POL | <0.01% | $0.000781 | 16,961.472 | $13.24 | |
POL | <0.01% | $0.87513 | 15.1132 | $13.23 | |
POL | <0.01% | $1.02 | 12.9937 | $13.21 | |
POL | <0.01% | $0.004205 | 3,134.72 | $13.18 | |
POL | <0.01% | $0.002418 | 5,431.9721 | $13.13 | |
POL | <0.01% | $0.101881 | 123.3379 | $12.57 | |
POL | <0.01% | $0.020432 | 595.2037 | $12.16 | |
POL | <0.01% | $0.005223 | 2,265.9735 | $11.84 | |
POL | <0.01% | $0.00038 | 29,641.0836 | $11.26 | |
POL | <0.01% | $0.060535 | 185.3693 | $11.22 | |
POL | <0.01% | $0.631596 | 17.4264 | $11.01 | |
POL | <0.01% | $0.000001 | 7,259,575.6636 | $10.83 | |
POL | <0.01% | $0.005792 | 1,810.1168 | $10.48 | |
POL | <0.01% | $0.000015 | 661,711.4886 | $9.85 | |
POL | <0.01% | $1.91 | 4.9625 | $9.48 | |
POL | <0.01% | $0.015818 | 566.2758 | $8.96 | |
POL | <0.01% | $0.000395 | 21,467.763 | $8.49 | |
POL | <0.01% | $0.00068 | 12,274.3042 | $8.35 | |
POL | <0.01% | $0.771107 | 10.4545 | $8.06 | |
POL | <0.01% | $0.000838 | 8,925.4177 | $7.48 | |
POL | <0.01% | $0.000729 | 10,175.3652 | $7.42 | |
POL | <0.01% | $0.163232 | 45.1733 | $7.37 | |
POL | <0.01% | $0.055413 | 132.5547 | $7.35 | |
POL | <0.01% | $0.993012 | 7.3652 | $7.31 | |
POL | <0.01% | <$0.000001 | 1,394,090,347.1811 | $7.25 | |
POL | <0.01% | $0.004083 | 1,749.395 | $7.14 | |
POL | <0.01% | <$0.000001 | 70,740,158.0706 | $7.03 | |
POL | <0.01% | $0.001469 | 4,742.7001 | $6.97 | |
POL | <0.01% | $1.05 | 6.4493 | $6.77 | |
POL | <0.01% | $0.62487 | 10.4858 | $6.55 | |
POL | <0.01% | $1.04 | 6.2323 | $6.46 | |
POL | <0.01% | $0.777002 | 8.2823 | $6.44 | |
POL | <0.01% | $0.000012 | 498,402.3931 | $6.2 | |
POL | <0.01% | $0.428645 | 14.2257 | $6.1 | |
POL | <0.01% | $0.000063 | 88,717.6823 | $5.61 | |
POL | <0.01% | $0.17782 | 30.9362 | $5.5 | |
POL | <0.01% | $0.254955 | 21.1862 | $5.4 | |
POL | <0.01% | $0.367841 | 14.2455 | $5.24 | |
POL | <0.01% | $0.000975 | 5,136.2882 | $5.01 | |
POL | <0.01% | $0.003308 | 1,473.6542 | $4.87 | |
POL | <0.01% | $0.323711 | 14.6427 | $4.74 | |
POL | <0.01% | $0.229201 | 20.0104 | $4.59 | |
POL | <0.01% | $0.00357 | 1,254.875 | $4.48 | |
POL | <0.01% | $0.000943 | 4,678.5358 | $4.41 | |
POL | <0.01% | $0.015997 | 274.5375 | $4.39 | |
POL | <0.01% | $0.000633 | 6,885.9036 | $4.36 | |
POL | <0.01% | $0.188104 | 23.1428 | $4.35 | |
POL | <0.01% | $0.009127 | 474.6694 | $4.33 | |
POL | <0.01% | $0.000067 | 63,091.5725 | $4.23 | |
POL | <0.01% | $0.001526 | 2,705.7704 | $4.13 | |
POL | <0.01% | $0.269487 | 14.8544 | $4 | |
POL | <0.01% | $0.683396 | 5.622 | $3.84 | |
POL | <0.01% | $0.999794 | 3.6868 | $3.69 | |
POL | <0.01% | $0.001595 | 2,308.9274 | $3.68 | |
POL | <0.01% | $0.004083 | 895.7189 | $3.66 | |
POL | <0.01% | $0.018826 | 192.7605 | $3.63 | |
POL | <0.01% | $1.14 | 2.9115 | $3.32 | |
POL | <0.01% | $0.003213 | 1,019.0414 | $3.27 | |
POL | <0.01% | <$0.000001 | 6,496,267.0597 | $3.18 | |
POL | <0.01% | $0.058892 | 53.2426 | $3.14 | |
POL | <0.01% | $0.000229 | 12,636.9316 | $2.9 | |
POL | <0.01% | $0.994789 | 2.8299 | $2.82 | |
POL | <0.01% | $0.020772 | 134.325 | $2.79 | |
POL | <0.01% | $0.002106 | 1,269.7704 | $2.67 | |
POL | <0.01% | $0.273125 | 9.4168 | $2.57 | |
POL | <0.01% | $250.6 | 0.00988329 | $2.48 | |
POL | <0.01% | $0.001241 | 1,978.621 | $2.46 | |
POL | <0.01% | $0.179099 | 12.4056 | $2.22 | |
POL | <0.01% | $0.001609 | 1,355.2822 | $2.18 | |
POL | <0.01% | $0.000212 | 10,068.3669 | $2.13 | |
POL | <0.01% | $0.069541 | 29.9711 | $2.08 | |
POL | <0.01% | $0.000057 | 34,958.3343 | $1.98 | |
POL | <0.01% | $0.000511 | 3,863.9561 | $1.98 | |
POL | <0.01% | $0.002276 | 867.4032 | $1.97 | |
POL | <0.01% | $0.001235 | 1,549.6983 | $1.91 | |
POL | <0.01% | $0.000002 | 944,692.5926 | $1.89 | |
POL | <0.01% | $0.00263 | 717.8297 | $1.89 | |
POL | <0.01% | $0.886375 | 2.0635 | $1.83 | |
POL | <0.01% | $1.14 | 1.59 | $1.81 | |
POL | <0.01% | $0.005367 | 319.2251 | $1.71 | |
POL | <0.01% | $0.372925 | 4.5576 | $1.7 | |
POL | <0.01% | $0.000001 | 1,352,879.1629 | $1.68 | |
POL | <0.01% | $0.006382 | 259.9874 | $1.66 | |
POL | <0.01% | $0.003035 | 536.1154 | $1.63 | |
POL | <0.01% | $0.003763 | 430.381 | $1.62 | |
POL | <0.01% | $0.109802 | 14.4192 | $1.58 | |
POL | <0.01% | $0.000003 | 543,160.5485 | $1.58 | |
POL | <0.01% | $0.849209 | 1.8485 | $1.57 | |
POL | <0.01% | $0.000001 | 1,333,069.8618 | $1.51 | |
POL | <0.01% | $0.314837 | 4.7464 | $1.49 | |
POL | <0.01% | $0.001554 | 956.9355 | $1.49 | |
POL | <0.01% | $1.2 | 1.1954 | $1.43 | |
POL | <0.01% | $19.69 | 0.0727 | $1.43 | |
POL | <0.01% | $0.000119 | 11,606.6895 | $1.38 | |
POL | <0.01% | $0.177658 | 7.6445 | $1.36 | |
POL | <0.01% | $0.034828 | 38.9496 | $1.36 | |
POL | <0.01% | $291.76 | 0.00462652 | $1.35 | |
POL | <0.01% | $0.006443 | 207.5717 | $1.34 | |
POL | <0.01% | $0.001955 | 677.1796 | $1.32 | |
POL | <0.01% | $0.002034 | 616.8815 | $1.25 | |
POL | <0.01% | $0.00018 | 6,945.6111 | $1.25 | |
POL | <0.01% | $0.000151 | 7,773.8916 | $1.18 | |
POL | <0.01% | $0.000479 | 2,439.3634 | $1.17 | |
POL | <0.01% | $0.000883 | 1,282.9574 | $1.13 | |
POL | <0.01% | $0.000104 | 10,332.0092 | $1.07 | |
POL | <0.01% | $0.999393 | 1.0735 | $1.07 | |
POL | <0.01% | $0.106825 | 10.0381 | $1.07 | |
POL | <0.01% | $0.018879 | 55.9451 | $1.06 | |
POL | <0.01% | $0.000039 | 25,880.4365 | $1.01 | |
POL | <0.01% | $0.001764 | 570.6558 | $1.01 | |
POL | <0.01% | $0.000727 | 1,342.7785 | $0.9758 | |
POL | <0.01% | $0.140498 | 6.4161 | $0.9014 | |
POL | <0.01% | $0.000425 | 2,052.3461 | $0.8723 | |
POL | <0.01% | $0.050332 | 15.9263 | $0.8016 | |
POL | <0.01% | $0.000088 | 8,616.5198 | $0.7623 | |
POL | <0.01% | $0.260393 | 2.8497 | $0.742 | |
POL | <0.01% | $0.012998 | 56.6879 | $0.7368 | |
POL | <0.01% | $0.000048 | 14,689.1011 | $0.7092 | |
POL | <0.01% | $0.000413 | 1,671.0163 | $0.6902 | |
POL | <0.01% | $0.031948 | 21.4161 | $0.6842 | |
POL | <0.01% | $1 | 0.6672 | $0.6672 | |
POL | <0.01% | $0.021153 | 31.0065 | $0.6558 | |
POL | <0.01% | $44.54 | 0.0145 | $0.6471 | |
POL | <0.01% | $0.002602 | 248.5945 | $0.6469 | |
POL | <0.01% | $10.78 | 0.0539 | $0.5814 | |
POL | <0.01% | $0.023443 | 23.1309 | $0.5422 | |
POL | <0.01% | $0.009846 | 53.8251 | $0.5299 | |
POL | <0.01% | $0.10482 | 4.9965 | $0.5237 | |
POL | <0.01% | $0.033034 | 15.7058 | $0.5188 | |
POL | <0.01% | $0.007807 | 60.9062 | $0.4755 | |
POL | <0.01% | $0.000037 | 12,542.425 | $0.4687 | |
POL | <0.01% | $0.217129 | 2.0878 | $0.4533 | |
POL | <0.01% | $0.000295 | 1,469.731 | $0.4332 | |
POL | <0.01% | $0.065744 | 6.5772 | $0.4324 | |
POL | <0.01% | $0.000194 | 2,204.8653 | $0.4271 | |
POL | <0.01% | $0.000436 | 976.9559 | $0.4258 | |
POL | <0.01% | $0.011507 | 36.0115 | $0.4143 | |
POL | <0.01% | $0.151397 | 2.611 | $0.3953 | |
POL | <0.01% | $0.000121 | 3,266.8784 | $0.3947 | |
POL | <0.01% | $0.000381 | 1,033.4779 | $0.3933 | |
POL | <0.01% | $0.000823 | 460.0316 | $0.3785 | |
POL | <0.01% | $1.04 | 0.3583 | $0.3708 | |
POL | <0.01% | $0.000165 | 2,188.9053 | $0.362 | |
POL | <0.01% | $0.002207 | 162.6051 | $0.3588 | |
POL | <0.01% | $0.001472 | 242.4983 | $0.3568 | |
POL | <0.01% | $0.003351 | 105.6798 | $0.3541 | |
POL | <0.01% | <$0.000001 | 25,218,532.3427 | $0.3253 | |
POL | <0.01% | $0.000157 | 2,024.106 | $0.3182 | |
POL | <0.01% | $0.13854 | 2.0452 | $0.2833 | |
POL | <0.01% | $0.001219 | 223.3112 | $0.2721 | |
POL | <0.01% | $0.000391 | 692.4973 | $0.2707 | |
POL | <0.01% | $0.08586 | 3.1342 | $0.2691 | |
POL | <0.01% | $0.000006 | 43,500.265 | $0.2636 | |
POL | <0.01% | $0.3086 | 0.7768 | $0.2397 | |
POL | <0.01% | $0.000118 | 1,997.8541 | $0.2361 | |
POL | <0.01% | $104,204 | 0.00000214 | $0.2229 | |
POL | <0.01% | $0.000114 | 1,929.8292 | $0.2206 | |
POL | <0.01% | $0.014498 | 14.5203 | $0.2105 | |
POL | <0.01% | $0.004182 | 49.6703 | $0.2077 | |
POL | <0.01% | $0.001249 | 163.9618 | $0.2047 | |
POL | <0.01% | $0.000133 | 1,488.18 | $0.1977 | |
POL | <0.01% | $0.01069 | 18.2149 | $0.1947 | |
POL | <0.01% | $0.000963 | 201.9112 | $0.1944 | |
POL | <0.01% | $0.000621 | 308.9757 | $0.1917 | |
POL | <0.01% | $0.011983 | 15.2133 | $0.1822 | |
POL | <0.01% | $0.373688 | 0.4808 | $0.1796 | |
POL | <0.01% | $0.000485 | 363.1889 | $0.176 | |
POL | <0.01% | $0.000361 | 487.1387 | $0.1757 | |
POL | <0.01% | $0.021482 | 7.9811 | $0.1714 | |
POL | <0.01% | <$0.000001 | 1,255,764.0556 | $0.171 | |
POL | <0.01% | $0.000841 | 201.5882 | $0.1695 | |
POL | <0.01% | $0.000516 | 327.2387 | $0.1688 | |
POL | <0.01% | $0.000865 | 186.5294 | $0.1613 | |
POL | <0.01% | $0.018329 | 8.277 | $0.1517 | |
POL | <0.01% | $0.000035 | 4,176.2027 | $0.1479 | |
POL | <0.01% | <$0.000001 | 1,895,934.971 | $0.1465 | |
POL | <0.01% | $0.248608 | 0.5734 | $0.1425 | |
POL | <0.01% | $0.000187 | 705.1697 | $0.1321 | |
POL | <0.01% | $0.000007 | 19,613.4978 | $0.1302 | |
POL | <0.01% | $0.000908 | 135.9272 | $0.1234 | |
POL | <0.01% | $0.0005 | 236.3538 | $0.1182 | |
POL | <0.01% | $0.011582 | 10.207 | $0.1182 | |
POL | <0.01% | $19.56 | 0.0058144 | $0.1137 | |
POL | <0.01% | $0.002111 | 51.368 | $0.1084 | |
POL | <0.01% | $0.000865 | 125.1134 | $0.1082 | |
POL | <0.01% | $0.047407 | 2.2377 | $0.106 | |
POL | <0.01% | $0.027405 | 3.7552 | $0.1029 | |
AVAX | <0.01% | $0.000554 | 1,847,472.9709 | $1,023.06 | |
AVAX | <0.01% | $0.00297 | 57,178.2259 | $169.83 | |
AVAX | <0.01% | $0.99979 | 98.9977 | $98.98 | |
AVAX | <0.01% | $2,482.83 | 0.0361 | $89.7 | |
AVAX | <0.01% | $0.007666 | 10,654.2211 | $81.68 | |
AVAX | <0.01% | $1 | 81.5625 | $81.62 | |
AVAX | <0.01% | $0.004041 | 13,575.5583 | $54.86 | |
AVAX | <0.01% | $104,340 | 0.00050318 | $52.5 | |
AVAX | <0.01% | $0.000003 | 14,687,281.5194 | $45.24 | |
AVAX | <0.01% | $15.03 | 2.7717 | $41.66 | |
AVAX | <0.01% | $0.999856 | 37.1975 | $37.19 | |
AVAX | <0.01% | $0.000001 | 59,074,527.5331 | $35.95 | |
AVAX | <0.01% | $0.010619 | 3,180.4902 | $33.77 | |
AVAX | <0.01% | $0.034119 | 969.6157 | $33.08 | |
AVAX | <0.01% | $1 | 32.7471 | $32.77 | |
AVAX | <0.01% | <$0.000001 | 4,401,139,620.5311 | $32.57 | |
AVAX | <0.01% | $13.54 | 2.3225 | $31.45 | |
AVAX | <0.01% | $0.202953 | 130.8628 | $26.56 | |
AVAX | <0.01% | $0.99979 | 26.4952 | $26.49 | |
AVAX | <0.01% | $0.008042 | 3,193.0011 | $25.68 | |
AVAX | <0.01% | <$0.000001 | 374,621,753.8499 | $25.02 | |
AVAX | <0.01% | $0.386883 | 51.4181 | $19.89 | |
AVAX | <0.01% | $250.76 | 0.0755 | $18.92 | |
AVAX | <0.01% | $0.00051 | 31,444.1201 | $16.05 | |
AVAX | <0.01% | $19.46 | 0.8179 | $15.92 | |
AVAX | <0.01% | $104,143 | 0.00015033 | $15.66 | |
AVAX | <0.01% | $0.153993 | 99.0114 | $15.25 | |
AVAX | <0.01% | $0.146064 | 102.7595 | $15.01 | |
AVAX | <0.01% | $0.998907 | 14.535 | $14.52 | |
AVAX | <0.01% | $228.33 | 0.0618 | $14.11 | |
AVAX | <0.01% | $0.000065 | 175,026.6625 | $11.3 | |
AVAX | <0.01% | $2.1 | 5.1974 | $10.91 | |
AVAX | <0.01% | <$0.000001 | 1,193,274,796.0585 | $10.26 | |
AVAX | <0.01% | $0.009434 | 1,068.2217 | $10.08 | |
AVAX | <0.01% | $4.01 | 2.3465 | $9.4 | |
AVAX | <0.01% | $0.042345 | 221.8816 | $9.4 | |
AVAX | <0.01% | $23.85 | 0.3447 | $8.22 | |
AVAX | <0.01% | $0.002259 | 3,278.4678 | $7.41 | |
AVAX | <0.01% | $1.67 | 4.1233 | $6.89 | |
AVAX | <0.01% | $140.68 | 0.0464 | $6.53 | |
AVAX | <0.01% | $0.629848 | 9.2454 | $5.82 | |
AVAX | <0.01% | $0.000001 | 4,388,563.1124 | $4.78 | |
AVAX | <0.01% | $0.99595 | 4.5257 | $4.51 | |
AVAX | <0.01% | $0.016681 | 262.0054 | $4.37 | |
AVAX | <0.01% | $0.000004 | 1,051,462.2515 | $4.08 | |
AVAX | <0.01% | $0.005302 | 735.6891 | $3.9 | |
AVAX | <0.01% | $0.034896 | 104.5203 | $3.65 | |
AVAX | <0.01% | $0.999582 | 3.5748 | $3.57 | |
AVAX | <0.01% | $0.00009 | 35,673.9915 | $3.22 | |
AVAX | <0.01% | $0.177861 | 17.8705 | $3.18 | |
AVAX | <0.01% | $19.67 | 0.1307 | $2.57 | |
AVAX | <0.01% | $0.004982 | 496.7356 | $2.47 | |
AVAX | <0.01% | $0.024218 | 90.829 | $2.2 | |
AVAX | <0.01% | $0.001469 | 1,401.1654 | $2.06 | |
AVAX | <0.01% | $0.000308 | 5,506.3224 | $1.7 | |
AVAX | <0.01% | $0.992089 | 1.7084 | $1.69 | |
AVAX | <0.01% | $0.062317 | 24.7673 | $1.54 | |
AVAX | <0.01% | $0.001148 | 1,253.3895 | $1.44 | |
AVAX | <0.01% | $0.018825 | 61.8792 | $1.16 | |
AVAX | <0.01% | $0.000914 | 1,169.4606 | $1.07 | |
AVAX | <0.01% | $0.009594 | 105.5094 | $1.01 | |
AVAX | <0.01% | $0.000236 | 3,621.7052 | $0.8553 | |
AVAX | <0.01% | $0.000095 | 8,218.6198 | $0.7846 | |
AVAX | <0.01% | $0.001078 | 648.1071 | $0.6989 | |
AVAX | <0.01% | $5.99 | 0.116 | $0.6947 | |
AVAX | <0.01% | $0.000201 | 2,830.7147 | $0.5699 | |
AVAX | <0.01% | $13.57 | 0.0409 | $0.5549 | |
AVAX | <0.01% | $0.154661 | 3.0545 | $0.4724 | |
AVAX | <0.01% | $2.75 | 0.1585 | $0.4356 | |
AVAX | <0.01% | $0.033005 | 12.8798 | $0.425 | |
AVAX | <0.01% | $0.001266 | 292.5373 | $0.3703 | |
AVAX | <0.01% | <$0.000001 | 6,758,656.109 | $0.3122 | |
AVAX | <0.01% | $0.820522 | 0.3703 | $0.3038 | |
AVAX | <0.01% | $0.000781 | 385.0908 | $0.3006 | |
AVAX | <0.01% | $0.000012 | 23,450.264 | $0.2917 | |
AVAX | <0.01% | $0.024051 | 10.3725 | $0.2494 | |
AVAX | <0.01% | $0.081555 | 3.0426 | $0.2481 | |
AVAX | <0.01% | $0.000779 | 308.8062 | $0.2404 | |
AVAX | <0.01% | $0.0014 | 170.0544 | $0.238 | |
AVAX | <0.01% | $0.044547 | 5.2545 | $0.234 | |
AVAX | <0.01% | $0.002345 | 80.0114 | $0.1876 | |
AVAX | <0.01% | $0.000029 | 6,157.4076 | $0.1754 | |
AVAX | <0.01% | $0.000124 | 1,409.8189 | $0.1743 | |
AVAX | <0.01% | $0.000008 | 18,396.2763 | $0.1388 | |
AVAX | <0.01% | $0.08927 | 1.2857 | $0.1147 | |
AVAX | <0.01% | $0.992089 | 0.1127 | $0.1117 | |
AVAX | <0.01% | $0.002863 | 36.5848 | $0.1047 | |
AVAX | <0.01% | $0.000349 | 287.6543 | $0.1003 | |
ARB | <0.01% | $2,483.23 | 0.1129 | $280.28 | |
ARB | <0.01% | $0.999793 | 163.6568 | $163.62 | |
ARB | <0.01% | $140.78 | 1.1332 | $159.54 | |
ARB | <0.01% | $0.999793 | 97.584 | $97.56 | |
ARB | <0.01% | $1 | 95.2502 | $95.25 | |
ARB | <0.01% | $0.062031 | 1,150.4748 | $71.37 | |
ARB | <0.01% | $3.63 | 18.9156 | $68.66 | |
ARB | <0.01% | $15.04 | 4.0491 | $60.9 | |
ARB | <0.01% | $5.99 | 9.1303 | $54.69 | |
ARB | <0.01% | $0.101798 | 421.7147 | $42.93 | |
ARB | <0.01% | $0.772506 | 47.1684 | $36.44 | |
ARB | <0.01% | $104,230 | 0.000334 | $34.81 | |
ARB | <0.01% | $0.002472 | 13,728.4507 | $33.93 | |
ARB | <0.01% | $1 | 31.9068 | $31.94 | |
ARB | <0.01% | $0.002253 | 14,121.353 | $31.81 | |
ARB | <0.01% | $0.384288 | 82.4678 | $31.69 | |
ARB | <0.01% | $0.631121 | 48.2631 | $30.46 | |
ARB | <0.01% | $0.207001 | 129.637 | $26.83 | |
ARB | <0.01% | $0.050038 | 469.603 | $23.5 | |
ARB | <0.01% | $0.332997 | 66.7502 | $22.23 | |
ARB | <0.01% | $5.62 | 3.7316 | $20.97 | |
ARB | <0.01% | $0.007589 | 2,592.8941 | $19.68 | |
ARB | <0.01% | $13.57 | 1.3538 | $18.37 | |
ARB | <0.01% | $0.022561 | 803.6282 | $18.13 | |
ARB | <0.01% | $1.14 | 15.5385 | $17.71 | |
ARB | <0.01% | $0.210753 | 83.3047 | $17.56 | |
ARB | <0.01% | $0.015084 | 1,143.1512 | $17.24 | |
ARB | <0.01% | $0.62568 | 26.2988 | $16.45 | |
ARB | <0.01% | $5.4 | 3.0424 | $16.43 | |
ARB | <0.01% | $0.00002 | 802,514.8127 | $16.41 | |
ARB | <0.01% | $0.362375 | 40.07 | $14.52 | |
ARB | <0.01% | $0.00051 | 24,731.3929 | $12.62 | |
ARB | <0.01% | $0.00968 | 1,285.5309 | $12.44 | |
ARB | <0.01% | $0.048977 | 251.2239 | $12.3 | |
ARB | <0.01% | $0.073731 | 158.1536 | $11.66 | |
ARB | <0.01% | $0.099929 | 112.7788 | $11.27 | |
ARB | <0.01% | $328.33 | 0.0324 | $10.63 | |
ARB | <0.01% | $0.177876 | 57.6448 | $10.25 | |
ARB | <0.01% | $0.024791 | 399.5271 | $9.9 | |
ARB | <0.01% | $0.328349 | 29.6488 | $9.74 | |
ARB | <0.01% | <$0.000001 | 95,456,068,253.461 | $9.55 | |
ARB | <0.01% | $0.000011 | 829,097.8359 | $9.19 | |
ARB | <0.01% | $0.039739 | 192.5251 | $7.65 | |
ARB | <0.01% | $0.089414 | 77.2902 | $6.91 | |
ARB | <0.01% | $0.057943 | 115.0288 | $6.67 | |
ARB | <0.01% | $0.000014 | 477,325.6053 | $6.65 | |
ARB | <0.01% | $0.000003 | 2,116,781.6132 | $6.24 | |
ARB | <0.01% | $0.072371 | 78.6898 | $5.69 | |
ARB | <0.01% | $0.000005 | 1,154,905.1239 | $5.37 | |
ARB | <0.01% | $0.000063 | 81,370.7075 | $5.17 | |
ARB | <0.01% | $1.13 | 4.281 | $4.84 | |
ARB | <0.01% | $0.978195 | 4.7666 | $4.66 | |
ARB | <0.01% | $1.14 | 4.0143 | $4.58 | |
ARB | <0.01% | $0.003938 | 1,128.0541 | $4.44 | |
ARB | <0.01% | $0.154114 | 26.9038 | $4.15 | |
ARB | <0.01% | $0.999854 | 4.038 | $4.04 | |
ARB | <0.01% | $0.308649 | 12.9193 | $3.99 | |
ARB | <0.01% | $0.123974 | 32.1184 | $3.98 | |
ARB | <0.01% | $0.995815 | 3.829 | $3.81 | |
ARB | <0.01% | $0.000009 | 414,677.347 | $3.62 | |
ARB | <0.01% | $0.0206 | 164.7771 | $3.39 | |
ARB | <0.01% | $2.1 | 1.5468 | $3.25 | |
ARB | <0.01% | $0.000371 | 8,594.6312 | $3.19 | |
ARB | <0.01% | <$0.000001 | 32,572,583.4946 | $3.01 | |
ARB | <0.01% | $0.006471 | 458.8202 | $2.97 | |
ARB | <0.01% | $0.090642 | 27.6589 | $2.51 | |
ARB | <0.01% | $250.79 | 0.00930118 | $2.33 | |
ARB | <0.01% | $0.084093 | 27.6149 | $2.32 | |
ARB | <0.01% | $0.030556 | 74.5151 | $2.28 | |
ARB | <0.01% | $0.003096 | 727.2796 | $2.25 | |
ARB | <0.01% | $0.003849 | 584.0491 | $2.25 | |
ARB | <0.01% | $0.368192 | 5.5904 | $2.06 | |
ARB | <0.01% | $0.006638 | 304.9883 | $2.02 | |
ARB | <0.01% | $0.025057 | 80.6665 | $2.02 | |
ARB | <0.01% | $0.005363 | 371.204 | $1.99 | |
ARB | <0.01% | $0.00059 | 3,274.4116 | $1.93 | |
ARB | <0.01% | $0.002223 | 866.0008 | $1.93 | |
ARB | <0.01% | $1.06 | 1.6978 | $1.81 | |
ARB | <0.01% | $0.99962 | 1.742 | $1.74 | |
ARB | <0.01% | <$0.000001 | 17,391,455.6028 | $1.73 | |
ARB | <0.01% | $0.006496 | 258.0478 | $1.68 | |
ARB | <0.01% | $0.000059 | 26,600.2506 | $1.57 | |
ARB | <0.01% | $0.994378 | 1.5733 | $1.56 | |
ARB | <0.01% | $1 | 1.5517 | $1.55 | |
ARB | <0.01% | $0.00341 | 425.9312 | $1.45 | |
ARB | <0.01% | $0.154826 | 9.0559 | $1.4 | |
ARB | <0.01% | $0.079016 | 17.5827 | $1.39 | |
ARB | <0.01% | <$0.000001 | 2,136,926,616.907 | $1.28 | |
ARB | <0.01% | $0.000879 | 1,433.6157 | $1.26 | |
ARB | <0.01% | $0.004418 | 278.4153 | $1.23 | |
ARB | <0.01% | $0.002008 | 598.2498 | $1.2 | |
ARB | <0.01% | $0.000718 | 1,553.9629 | $1.12 | |
ARB | <0.01% | <$0.000001 | 24,200,258.8554 | $0.9776 | |
ARB | <0.01% | $0.002885 | 326.4314 | $0.9417 | |
ARB | <0.01% | $1.09 | 0.838 | $0.915 | |
ARB | <0.01% | <$0.000001 | 21,639,949.9119 | $0.9045 | |
ARB | <0.01% | $2.39 | 0.3551 | $0.8486 | |
ARB | <0.01% | $0.016145 | 51.4202 | $0.8301 | |
ARB | <0.01% | <$0.000001 | 4,135,878,540.0003 | $0.8271 | |
ARB | <0.01% | $1 | 0.8185 | $0.8184 | |
ARB | <0.01% | $1.04 | 0.7464 | $0.774 | |
ARB | <0.01% | $0.00043 | 1,712.2412 | $0.7362 | |
ARB | <0.01% | $0.00157 | 465.8485 | $0.7312 | |
ARB | <0.01% | $0.010859 | 67.1468 | $0.7291 | |
ARB | <0.01% | $1.04 | 0.697 | $0.7248 | |
ARB | <0.01% | $0.018196 | 39.2463 | $0.7141 | |
ARB | <0.01% | $0.004085 | 130.3026 | $0.5322 | |
ARB | <0.01% | $2,821.09 | 0.00016888 | $0.4764 | |
ARB | <0.01% | $0.033269 | 13.8032 | $0.4592 | |
ARB | <0.01% | $0.007178 | 63.6942 | $0.4571 | |
ARB | <0.01% | $0.001063 | 421.3369 | $0.4479 | |
ARB | <0.01% | $0.000731 | 607.3472 | $0.4437 | |
ARB | <0.01% | <$0.000001 | 1,347,007,939.748 | $0.4041 | |
ARB | <0.01% | $2.31 | 0.1327 | $0.3064 | |
ARB | <0.01% | $0.156557 | 1.8463 | $0.289 | |
ARB | <0.01% | $0.000624 | 446.9506 | $0.2787 | |
ARB | <0.01% | $0.000069 | 3,550.5754 | $0.2448 | |
ARB | <0.01% | $0.006981 | 29.7185 | $0.2074 | |
ARB | <0.01% | $0.000419 | 461.4691 | $0.1932 | |
ARB | <0.01% | $0.000014 | 11,936.429 | $0.1697 | |
ARB | <0.01% | $0.031393 | 5.3722 | $0.1686 | |
ARB | <0.01% | $0.04837 | 3.3895 | $0.1639 | |
ARB | <0.01% | $0.00309 | 51.6612 | $0.1596 | |
ARB | <0.01% | <$0.000001 | 1,327,422,775.6746 | $0.1327 | |
ARB | <0.01% | $0.000122 | 1,090.4885 | $0.1326 | |
ARB | <0.01% | $0.998534 | 0.1323 | $0.132 | |
ARB | <0.01% | $0.007982 | 15.6054 | $0.1245 | |
ARB | <0.01% | $104,424 | 0.00000119 | $0.1242 | |
ARB | <0.01% | $0.006021 | 19.6095 | $0.118 | |
ARB | <0.01% | $0.041883 | 2.7992 | $0.1172 | |
ARB | <0.01% | $0.011126 | 10.3387 | $0.115 | |
ARB | <0.01% | $0.071217 | 1.4792 | $0.1053 | |
ARB | <0.01% | $0.273041 | 0.3788 | $0.1034 | |
ARB | <0.01% | $0.008747 | 11.5496 | $0.101 | |
OP | <0.01% | $2,479.63 | 0.0397 | $98.53 | |
OP | <0.01% | $1.06 | 73.5118 | $78.18 | |
OP | <0.01% | $1 | 64.862 | $64.86 | |
OP | <0.01% | $0.590356 | 81.5816 | $48.16 | |
OP | <0.01% | $1 | 35.8888 | $35.92 | |
OP | <0.01% | $0.99979 | 30.6336 | $30.63 | |
OP | <0.01% | $0.99979 | 29.4858 | $29.48 | |
OP | <0.01% | $0.048087 | 528.989 | $25.44 | |
OP | <0.01% | $13.55 | 1.3817 | $18.72 | |
OP | <0.01% | $104,126 | 0.00012433 | $12.95 | |
OP | <0.01% | $0.632052 | 14.8476 | $9.38 | |
OP | <0.01% | $0.236052 | 34.3491 | $8.11 | |
OP | <0.01% | $0.213032 | 36.2742 | $7.73 | |
OP | <0.01% | $2.1 | 3.5125 | $7.38 | |
OP | <0.01% | $0.004571 | 1,603.5823 | $7.33 | |
OP | <0.01% | $1 | 6.9424 | $6.94 | |
OP | <0.01% | $2,986.29 | 0.00173932 | $5.19 | |
OP | <0.01% | $0.004082 | 1,099.6624 | $4.49 | |
OP | <0.01% | $0.008045 | 487.1812 | $3.92 | |
OP | <0.01% | $1.41 | 2.6917 | $3.8 | |
OP | <0.01% | $0.00072 | 4,911.7426 | $3.54 | |
OP | <0.01% | $1.04 | 3.1725 | $3.29 | |
OP | <0.01% | $0.001767 | 756.4169 | $1.34 | |
OP | <0.01% | $0.999227 | 1.0871 | $1.09 | |
OP | <0.01% | $9.72 | 0.1025 | $0.9967 | |
OP | <0.01% | $5.99 | 0.1641 | $0.9831 | |
OP | <0.01% | $0.000025 | 37,757.0712 | $0.9616 | |
OP | <0.01% | $0.000147 | 6,303.3231 | $0.924 | |
OP | <0.01% | $250.7 | 0.0020554 | $0.5152 | |
OP | <0.01% | $2,820.63 | 0.00012037 | $0.3395 | |
OP | <0.01% | $0.154679 | 1.6937 | $0.2619 | |
OP | <0.01% | $0.326676 | 0.7963 | $0.2601 | |
OP | <0.01% | <$0.000001 | 2,497,136.2424 | $0.2482 | |
OP | <0.01% | $0.177435 | 0.948 | $0.1682 | |
OP | <0.01% | $0.00071 | 225.6781 | $0.1602 | |
OP | <0.01% | $0.048087 | 3.1717 | $0.1525 | |
OP | <0.01% | $0.022306 | 5.55 | $0.1237 | |
OP | <0.01% | $0.018328 | 5.5662 | $0.102 | |
BASE | <0.01% | $0.000142 | 51,638.1952 | $7.32 | |
BASE | <0.01% | $0.004633 | 1,180.9577 | $5.47 | |
BASE | <0.01% | $0.000667 | 6,502 | $4.34 | |
BASE | <0.01% | $0.020774 | 189.224 | $3.93 | |
BASE | <0.01% | $0.002782 | 1,331.6998 | $3.71 | |
BASE | <0.01% | $0.000006 | 200,004.2069 | $1.21 | |
BASE | <0.01% | $0.000168 | 4,865 | $0.8152 | |
BASE | <0.01% | $0.012404 | 25 | $0.3101 | |
BASE | <0.01% | $0.000025 | 10,563 | $0.2675 | |
GNO | <0.01% | $0.08409 | 4.4495 | $0.3741 | |
SONIC | <0.01% | $0.006044 | 21 | $0.1269 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.