Overview
BNB Balance
0.000001192459402683 BNB
BNB Value
Less Than $0.01 (@ $720.09/BNB)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
44931158 | 5 hrs ago | 0.00001515 BNB | ||||
44903753 | 28 hrs ago | 0.00001509 BNB | ||||
44895971 | 34 hrs ago | 0.00001509 BNB | ||||
44895957 | 34 hrs ago | 0.00001509 BNB | ||||
44879354 | 2 days ago | 0.00001509 BNB | ||||
44859122 | 2 days ago | 0.00001509 BNB | ||||
44854162 | 2 days ago | 0.00001509 BNB | ||||
44848567 | 3 days ago | 0.00001509 BNB | ||||
44827756 | 3 days ago | 0.00001509 BNB | ||||
44820020 | 4 days ago | 0.00001491 BNB | ||||
44791949 | 5 days ago | 0.00001491 BNB | ||||
44770605 | 5 days ago | 0.00001491 BNB | ||||
44751377 | 6 days ago | 0.00001486 BNB | ||||
44750412 | 6 days ago | 0.00001486 BNB | ||||
44750401 | 6 days ago | 0.00001486 BNB | ||||
44736798 | 6 days ago | 0.00001486 BNB | ||||
44721694 | 7 days ago | 0.0000142 BNB | ||||
44702516 | 8 days ago | 0.0000142 BNB | ||||
44697839 | 8 days ago | 0.0000142 BNB | ||||
44670568 | 9 days ago | 0.00000108 BNB | ||||
44665975 | 9 days ago | 0.0000142 BNB | ||||
44625692 | 10 days ago | 0.0000142 BNB | ||||
44590320 | 12 days ago | 0.00001397 BNB | ||||
44580902 | 12 days ago | 0.00001397 BNB | ||||
44561786 | 13 days ago | 0.0000139 BNB |
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": {} }
[{"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
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BSC | 99.99% | $0.005351 | 189,815,131,068,506.41 | $1,015,794,164,683.92 | |
BSC | <0.01% | $0.005351 | 8,330,892,343.0911 | $44,582,704.13 | |
BSC | <0.01% | $0.009053 | 2,159,555,200.5187 | $19,549,373.45 | |
BSC | <0.01% | <$0.000001 | 60,963,737,604,163.57 | $104,126.06 | |
BSC | <0.01% | $1.17 | 27,792.5228 | $32,517.25 | |
BSC | <0.01% | $115.47 | 164.1329 | $18,952.43 | |
BSC | <0.01% | $2.83 | 603.7784 | $1,709.01 | |
BSC | <0.01% | $29.12 | 39.9724 | $1,163.95 | |
BSC | <0.01% | $0.000324 | 3,477,392.2093 | $1,128.17 | |
BSC | <0.01% | <$0.000001 | 3,768,904,437.3191 | $1,017.66 | |
BSC | <0.01% | $719.69 | 0.7996 | $575.45 | |
BSC | <0.01% | $1 | 510.2484 | $510.25 | |
BSC | <0.01% | $0.054696 | 9,313.6067 | $509.42 | |
BSC | <0.01% | $0.000104 | 4,035,922.6502 | $419.73 | |
BSC | <0.01% | $0.051477 | 7,896.5758 | $406.49 | |
BSC | <0.01% | $0.033182 | 11,069.0159 | $367.29 | |
BSC | <0.01% | <$0.000001 | 61,102,783,530.7671 | $252.9 | |
BSC | <0.01% | $0.291995 | 690.94 | $201.75 | |
BSC | <0.01% | $0.039863 | 4,803.5256 | $191.48 | |
BSC | <0.01% | $0.002696 | 64,020.3545 | $172.62 | |
BSC | <0.01% | $0.000316 | 515,100.3665 | $162.72 | |
BSC | <0.01% | $0.034387 | 3,181.0425 | $109.39 | |
BSC | <0.01% | $217.19 | 0.4882 | $106.03 | |
BSC | <0.01% | $399.14 | 0.2586 | $103.2 | |
BSC | <0.01% | $6.06 | 17.0259 | $103.18 | |
BSC | <0.01% | $28.82 | 3.5775 | $103.09 | |
BSC | <0.01% | $0.444069 | 225.9985 | $100.36 | |
BSC | <0.01% | $105,662.5 | 0.00094709 | $100.07 | |
BSC | <0.01% | $0.999848 | 99.8219 | $99.81 | |
BSC | <0.01% | $1 | 98.6578 | $98.79 | |
BSC | <0.01% | $0.017045 | 5,656.0694 | $96.41 | |
BSC | <0.01% | $0.126429 | 762.1921 | $96.36 | |
BSC | <0.01% | $3,986.29 | 0.0242 | $96.27 | |
BSC | <0.01% | $0.160277 | 593.4587 | $95.12 | |
BSC | <0.01% | $0.000002 | 48,187,182.1446 | $94.45 | |
BSC | <0.01% | $0.877898 | 107.406 | $94.29 | |
BSC | <0.01% | $0.109456 | 860.6956 | $94.21 | |
BSC | <0.01% | $0.38904 | 238.4225 | $92.76 | |
BSC | <0.01% | $0.005264 | 17,553.4615 | $92.4 | |
BSC | <0.01% | $0.033115 | 2,736.993 | $90.64 | |
BSC | <0.01% | $0.166581 | 531.3519 | $88.51 | |
BSC | <0.01% | $0.295898 | 297.867 | $88.14 | |
BSC | <0.01% | $0.013243 | 6,426.0747 | $85.1 | |
BSC | <0.01% | $0.776386 | 107.8174 | $83.71 | |
BSC | <0.01% | $0.04543 | 1,822.2342 | $82.78 | |
BSC | <0.01% | $0.003314 | 24,968.1974 | $82.75 | |
BSC | <0.01% | $28.5 | 2.8906 | $82.38 | |
BSC | <0.01% | $0.010029 | 8,203.0765 | $82.27 | |
BSC | <0.01% | $0.692036 | 116.6977 | $80.76 | |
BSC | <0.01% | <$0.000001 | 407,477,280.6681 | $80.72 | |
BSC | <0.01% | $0.060479 | 1,331.8792 | $80.55 | |
BSC | <0.01% | $0.012944 | 6,148.504 | $79.59 | |
BSC | <0.01% | $0.491178 | 160.0981 | $78.64 | |
BSC | <0.01% | $0.472679 | 166.0011 | $78.47 | |
BSC | <0.01% | $0.184582 | 421.8648 | $77.87 | |
BSC | <0.01% | $0.111563 | 696.4844 | $77.7 | |
BSC | <0.01% | $0.080741 | 961.9843 | $77.67 | |
BSC | <0.01% | $0.007827 | 9,919.05 | $77.64 | |
BSC | <0.01% | $0.006599 | 11,716.584 | $77.31 | |
BSC | <0.01% | $1.08 | 70.3111 | $75.98 | |
BSC | <0.01% | $0.064789 | 1,171.7197 | $75.91 | |
BSC | <0.01% | $0.000034 | 2,240,276.1464 | $75.34 | |
BSC | <0.01% | $0.025517 | 2,945.1754 | $75.15 | |
BSC | <0.01% | $0.001848 | 40,571.6967 | $74.97 | |
BSC | <0.01% | <$0.000001 | 280,091,920,709.2187 | $74.06 | |
BSC | <0.01% | $0.012935 | 5,724.5526 | $74.05 | |
BSC | <0.01% | $0.023378 | 3,154.8892 | $73.75 | |
BSC | <0.01% | $0.000498 | 148,165.3258 | $73.75 | |
BSC | <0.01% | $1.89 | 39.0121 | $73.66 | |
BSC | <0.01% | $0.493632 | 148.3403 | $73.23 | |
BSC | <0.01% | $0.07916 | 920.5948 | $72.87 | |
BSC | <0.01% | $0.000027 | 2,668,680.6926 | $72.54 | |
BSC | <0.01% | $0.186692 | 386.6697 | $72.19 | |
BSC | <0.01% | $0.072845 | 990.6455 | $72.16 | |
BSC | <0.01% | $1.9 | 37.4981 | $71.25 | |
BSC | <0.01% | <$0.000001 | 2,247,845,603.7477 | $71.09 | |
BSC | <0.01% | $0.174624 | 407.1005 | $71.09 | |
BSC | <0.01% | $0.028396 | 2,500.3252 | $71 | |
BSC | <0.01% | $0.001478 | 47,853.7259 | $70.73 | |
BSC | <0.01% | $0.076952 | 906.4756 | $69.76 | |
BSC | <0.01% | $0.000372 | 187,250.7144 | $69.73 | |
BSC | <0.01% | $0.000001 | 115,074,547.7488 | $69.17 | |
BSC | <0.01% | $0.722118 | 95.0039 | $68.6 | |
BSC | <0.01% | <$0.000001 | 2,174,305,140,633.0999 | $68.52 | |
BSC | <0.01% | $1.83 | 37.3978 | $68.44 | |
BSC | <0.01% | $0.008563 | 7,847.5388 | $67.2 | |
BSC | <0.01% | $10,725.53 | 0.00626145 | $67.16 | |
BSC | <0.01% | $0.029468 | 2,275.1827 | $67.05 | |
BSC | <0.01% | $0.000454 | 147,346.5172 | $66.96 | |
BSC | <0.01% | $0.12214 | 540.4248 | $66.01 | |
BSC | <0.01% | $0.01205 | 5,456.3041 | $65.75 | |
BSC | <0.01% | $0.45894 | 140.7931 | $64.62 | |
BSC | <0.01% | <$0.000001 | 1,539,132,499.0706 | $64.16 | |
BSC | <0.01% | <$0.000001 | 5,830,037,554.8336 | $64.13 | |
BSC | <0.01% | $0.013393 | 4,778.3819 | $64 | |
BSC | <0.01% | $43.01 | 1.4697 | $63.21 | |
BSC | <0.01% | $0.523956 | 119.9726 | $62.86 | |
BSC | <0.01% | $0.198038 | 314.711 | $62.32 | |
BSC | <0.01% | $16.29 | 3.8202 | $62.21 | |
BSC | <0.01% | $3.73 | 16.5732 | $61.86 | |
BSC | <0.01% | $0.000483 | 127,466.7487 | $61.58 | |
BSC | <0.01% | $0.000062 | 970,922.6044 | $60.32 | |
BSC | <0.01% | $0.186052 | 322.5662 | $60.01 | |
BSC | <0.01% | $0.164888 | 362.7509 | $59.81 | |
BSC | <0.01% | $0.592072 | 100.7845 | $59.67 | |
BSC | <0.01% | $0.778804 | 76.2948 | $59.42 | |
BSC | <0.01% | $5.84 | 10.0619 | $58.76 | |
BSC | <0.01% | $3.45 | 17.0294 | $58.72 | |
BSC | <0.01% | $0.331359 | 176.563 | $58.51 | |
BSC | <0.01% | $1.99 | 29.359 | $58.42 | |
BSC | <0.01% | $0.040293 | 1,445.8086 | $58.26 | |
BSC | <0.01% | $0.004541 | 12,771.1271 | $57.99 | |
BSC | <0.01% | $0.000043 | 1,336,591.7109 | $57.77 | |
BSC | <0.01% | $0.001775 | 32,369.3086 | $57.46 | |
BSC | <0.01% | $0.000001 | 44,209,100.6559 | $57.42 | |
BSC | <0.01% | $0.136625 | 418.2392 | $57.14 | |
BSC | <0.01% | $0.0109 | 5,234.8465 | $57.06 | |
BSC | <0.01% | $0.041461 | 1,373.7973 | $56.96 | |
BSC | <0.01% | $0.000132 | 429,179.7152 | $56.69 | |
BSC | <0.01% | $0.918203 | 61.5518 | $56.52 | |
BSC | <0.01% | $0.014627 | 3,830.4547 | $56.03 | |
BSC | <0.01% | $0.022483 | 2,482.9095 | $55.82 | |
BSC | <0.01% | $0.02003 | 2,771.9352 | $55.52 | |
BSC | <0.01% | $0.401026 | 138.2121 | $55.43 | |
BSC | <0.01% | $0.141062 | 392.4289 | $55.36 | |
BSC | <0.01% | $0.0539 | 1,021.281 | $55.05 | |
BSC | <0.01% | $0.998774 | 54.634 | $54.57 | |
BSC | <0.01% | $0.060379 | 901.5353 | $54.43 | |
BSC | <0.01% | $0.000023 | 2,353,626.5074 | $54.23 | |
BSC | <0.01% | $1.5 | 36.0342 | $54.05 | |
BSC | <0.01% | $0.534096 | 100.7584 | $53.81 | |
BSC | <0.01% | <$0.000001 | 80,664,445,977.1765 | $53.49 | |
BSC | <0.01% | $0.000175 | 305,195.153 | $53.45 | |
BSC | <0.01% | $0.084515 | 632.3669 | $53.44 | |
BSC | <0.01% | $1.84 | 29.0391 | $53.43 | |
BSC | <0.01% | $7.57 | 7.0396 | $53.29 | |
BSC | <0.01% | <$0.000001 | 2,745,476,136,408.4873 | $52.84 | |
BSC | <0.01% | $0.001375 | 38,056.7807 | $52.34 | |
BSC | <0.01% | $0.054337 | 960.4306 | $52.19 | |
BSC | <0.01% | $33.28 | 1.5619 | $51.97 | |
BSC | <0.01% | $0.041766 | 1,239.4442 | $51.77 | |
BSC | <0.01% | <$0.000001 | 12,294,888,799.1701 | $51.5 | |
BSC | <0.01% | $0.000227 | 223,882.6186 | $50.92 | |
BSC | <0.01% | $0.001006 | 49,992.9966 | $50.31 | |
BSC | <0.01% | $0.001882 | 26,662.7985 | $50.18 | |
BSC | <0.01% | $0.027877 | 1,785.6538 | $49.78 | |
BSC | <0.01% | $1.16 | 42.6671 | $49.69 | |
BSC | <0.01% | $0.000004 | 13,771,031.1302 | $49.58 | |
BSC | <0.01% | $0.050421 | 970.3816 | $48.93 | |
BSC | <0.01% | $11.13 | 4.3942 | $48.91 | |
BSC | <0.01% | $0.012983 | 3,721.8574 | $48.32 | |
BSC | <0.01% | $0.709819 | 67.4519 | $47.88 | |
BSC | <0.01% | $538.48 | 0.0885 | $47.67 | |
BSC | <0.01% | <$0.000001 | 229,317,925.1042 | $47.63 | |
BSC | <0.01% | <$0.000001 | 167,566,829.7807 | $47.46 | |
BSC | <0.01% | $4.83 | 9.8081 | $47.37 | |
BSC | <0.01% | $3.95 | 11.9781 | $47.25 | |
BSC | <0.01% | $7.37 | 6.4071 | $47.22 | |
BSC | <0.01% | $0.176794 | 266.3776 | $47.09 | |
BSC | <0.01% | $1.46 | 32.1474 | $46.89 | |
BSC | <0.01% | $10.96 | 4.2419 | $46.49 | |
BSC | <0.01% | $0.205377 | 226.0489 | $46.43 | |
BSC | <0.01% | $0.322236 | 143.4819 | $46.24 | |
BSC | <0.01% | $0.434198 | 105.9975 | $46.02 | |
BSC | <0.01% | $0.066292 | 692.9013 | $45.93 | |
BSC | <0.01% | $0.065895 | 696.4725 | $45.89 | |
BSC | <0.01% | $0.00146 | 31,342.9144 | $45.77 | |
BSC | <0.01% | $788.57 | 0.058 | $45.74 | |
BSC | <0.01% | $2.48 | 18.3351 | $45.56 | |
BSC | <0.01% | $0.089743 | 506.4206 | $45.45 | |
BSC | <0.01% | <$0.000001 | 2,188,975,933,671.4365 | $45.31 | |
BSC | <0.01% | <$0.000001 | 42,240,934,630.371 | $44.94 | |
BSC | <0.01% | $4.62 | 9.7117 | $44.87 | |
BSC | <0.01% | $0.011809 | 3,796.2703 | $44.83 | |
BSC | <0.01% | $40.88 | 1.0896 | $44.54 | |
BSC | <0.01% | $0.024545 | 1,798.8018 | $44.15 | |
BSC | <0.01% | $0.121602 | 362.1781 | $44.04 | |
BSC | <0.01% | $0.079728 | 550.7049 | $43.91 | |
BSC | <0.01% | $0.000037 | 1,192,051.5516 | $43.9 | |
BSC | <0.01% | $0.100674 | 435.1409 | $43.81 | |
BSC | <0.01% | $0.012653 | 3,454.5759 | $43.71 | |
BSC | <0.01% | $0.010095 | 4,299.5897 | $43.4 | |
BSC | <0.01% | $0.00866 | 5,001.4804 | $43.31 | |
BSC | <0.01% | $0.005083 | 8,519.7492 | $43.31 | |
BSC | <0.01% | $0.0109 | 3,964.1031 | $43.21 | |
BSC | <0.01% | $0.000001 | 55,303,313.2356 | $43.15 | |
BSC | <0.01% | $0.352452 | 121.7873 | $42.92 | |
BSC | <0.01% | <$0.000001 | 47,089,169,578.6953 | $42.86 | |
BSC | <0.01% | $3.25 | 13.1568 | $42.76 | |
BSC | <0.01% | $1 | 42.0847 | $42.25 | |
BSC | <0.01% | $0.000803 | 52,634.7934 | $42.25 | |
BSC | <0.01% | $0.031407 | 1,343.8158 | $42.2 | |
BSC | <0.01% | $6.55 | 6.4228 | $42.09 | |
BSC | <0.01% | $0.000697 | 60,244.0179 | $42 | |
BSC | <0.01% | $0.145322 | 288.3554 | $41.9 | |
BSC | <0.01% | $0.000897 | 46,592.5522 | $41.79 | |
BSC | <0.01% | $0.018927 | 2,175.7996 | $41.18 | |
BSC | <0.01% | $0.00023 | 178,476.0135 | $41.11 | |
BSC | <0.01% | $2.5 | 16.3026 | $40.76 | |
BSC | <0.01% | $0.000154 | 265,276.6399 | $40.73 | |
BSC | <0.01% | $2.09 | 19.353 | $40.49 | |
BSC | <0.01% | $0.042113 | 957.855 | $40.34 | |
BSC | <0.01% | $0.189496 | 211.9829 | $40.17 | |
BSC | <0.01% | $1.96 | 20.4827 | $40.15 | |
BSC | <0.01% | $0.120949 | 331.0513 | $40.04 | |
BSC | <0.01% | $0.000012 | 3,293,891.9273 | $39.99 | |
BSC | <0.01% | $0.110054 | 362.8328 | $39.93 | |
BSC | <0.01% | $0.256376 | 155.2378 | $39.8 | |
BSC | <0.01% | $1.05 | 37.6475 | $39.68 | |
BSC | <0.01% | $0.216702 | 182.6357 | $39.58 | |
BSC | <0.01% | $0.003906 | 10,017.2075 | $39.13 | |
BSC | <0.01% | $0.000632 | 61,400.0766 | $38.78 | |
BSC | <0.01% | $0.004533 | 8,513.7552 | $38.6 | |
BSC | <0.01% | $0.000001 | 27,940,313.2396 | $38.45 | |
BSC | <0.01% | $0.309931 | 123.3708 | $38.24 | |
BSC | <0.01% | $0.009627 | 3,929.9081 | $37.83 | |
BSC | <0.01% | $10.48 | 3.5956 | $37.68 | |
BSC | <0.01% | $0.033848 | 1,109.8028 | $37.56 | |
BSC | <0.01% | $0.276562 | 134.6655 | $37.24 | |
BSC | <0.01% | $0.059644 | 623.6936 | $37.2 | |
BSC | <0.01% | $3.07 | 12.0948 | $37.17 | |
BSC | <0.01% | $0.005406 | 6,851.9662 | $37.04 | |
BSC | <0.01% | $0.275897 | 132.7189 | $36.62 | |
BSC | <0.01% | $0.000902 | 40,522.8263 | $36.55 | |
BSC | <0.01% | $0.000051 | 716,371.6512 | $36.54 | |
BSC | <0.01% | $0.050638 | 720.7144 | $36.5 | |
BSC | <0.01% | $0.045577 | 796.1756 | $36.29 | |
BSC | <0.01% | $0.731213 | 48.547 | $35.5 | |
BSC | <0.01% | <$0.000001 | 35,420,453,252.2782 | $35.42 | |
BSC | <0.01% | $0.032823 | 1,076.1553 | $35.32 | |
BSC | <0.01% | $1.61 | 21.9235 | $35.3 | |
BSC | <0.01% | $0.008697 | 4,031.7134 | $35.06 | |
BSC | <0.01% | $105.49 | 0.33 | $34.81 | |
BSC | <0.01% | $0.037877 | 911.2824 | $34.52 | |
BSC | <0.01% | $0.058241 | 588.9191 | $34.3 | |
BSC | <0.01% | $0.001102 | 30,885.3349 | $34.05 | |
BSC | <0.01% | $0.006589 | 5,145.0957 | $33.9 | |
BSC | <0.01% | $1.39 | 24.2856 | $33.76 | |
BSC | <0.01% | $0.024256 | 1,376.0914 | $33.38 | |
BSC | <0.01% | <$0.000001 | 25,018,674,024.6472 | $33.28 | |
BSC | <0.01% | $0.004691 | 7,045.146 | $33.05 | |
BSC | <0.01% | $0.00528 | 6,253.752 | $33.02 | |
BSC | <0.01% | $56.57 | 0.5797 | $32.79 | |
BSC | <0.01% | <$0.000001 | 3,556,450,410.732 | $32.74 | |
BSC | <0.01% | $0.014675 | 2,205.026 | $32.36 | |
BSC | <0.01% | <$0.000001 | 686,931,201.6807 | $32.28 | |
BSC | <0.01% | <$0.000001 | 10,346,624,173.104 | $31.86 | |
BSC | <0.01% | $1.78 | 17.7878 | $31.68 | |
BSC | <0.01% | $0.006334 | 4,961.7788 | $31.43 | |
BSC | <0.01% | $0.001956 | 16,052.8816 | $31.4 | |
BSC | <0.01% | $0.03934 | 789.5635 | $31.06 | |
BSC | <0.01% | $1.22 | 25.4124 | $31.04 | |
BSC | <0.01% | $0.147657 | 209.6683 | $30.96 | |
BSC | <0.01% | $0.12292 | 251.5609 | $30.92 | |
BSC | <0.01% | $2.73 | 11.2824 | $30.8 | |
BSC | <0.01% | $0.010362 | 2,925.1021 | $30.31 | |
BSC | <0.01% | $0.029072 | 1,031.5141 | $29.99 | |
BSC | <0.01% | $0.000036 | 838,812.2023 | $29.92 | |
BSC | <0.01% | $0.024749 | 1,205.5007 | $29.84 | |
BSC | <0.01% | $0.994855 | 29.8942 | $29.74 | |
BSC | <0.01% | $1.04 | 27.9802 | $29.03 | |
BSC | <0.01% | $0.000231 | 125,826.0833 | $29.03 | |
BSC | <0.01% | $0.032809 | 882.9459 | $28.97 | |
BSC | <0.01% | $0.003024 | 9,543.4131 | $28.86 | |
BSC | <0.01% | $0.259347 | 111.062 | $28.8 | |
BSC | <0.01% | <$0.000001 | 71,653,981,913.7681 | $28.66 | |
BSC | <0.01% | $0.029738 | 953.1572 | $28.35 | |
BSC | <0.01% | $0.529393 | 53.5135 | $28.33 | |
BSC | <0.01% | $0.012518 | 2,255.3277 | $28.23 | |
BSC | <0.01% | $0.004959 | 5,679.8788 | $28.17 | |
BSC | <0.01% | $0.030938 | 907.474 | $28.08 | |
BSC | <0.01% | $0.089323 | 313.4965 | $28 | |
BSC | <0.01% | $0.022662 | 1,221.8415 | $27.69 | |
BSC | <0.01% | $0.053455 | 517.5821 | $27.67 | |
BSC | <0.01% | $0.001026 | 26,872.0426 | $27.58 | |
BSC | <0.01% | $0.186838 | 146.7386 | $27.42 | |
BSC | <0.01% | $0.539225 | 49.847 | $26.88 | |
BSC | <0.01% | $0.000372 | 71,757.0155 | $26.71 | |
BSC | <0.01% | $0.000225 | 118,264.907 | $26.67 | |
BSC | <0.01% | $0.173372 | 153.2357 | $26.57 | |
BSC | <0.01% | <$0.000001 | 2,259,035,378,224.5371 | $26.43 | |
BSC | <0.01% | $0.000248 | 105,885.5321 | $26.3 | |
BSC | <0.01% | $0.133304 | 196.7487 | $26.23 | |
BSC | <0.01% | $0.000172 | 152,226.7327 | $26.23 | |
BSC | <0.01% | $3.94 | 6.5415 | $25.77 | |
BSC | <0.01% | $0.000151 | 166,470.0423 | $25.13 | |
BSC | <0.01% | $0.002456 | 10,192.7389 | $25.04 | |
BSC | <0.01% | $8.34 | 3.0006 | $25.03 | |
BSC | <0.01% | $2.93 | 8.5297 | $25 | |
BSC | <0.01% | $0.00024 | 103,480.3357 | $24.83 | |
BSC | <0.01% | $0.73337 | 33.6025 | $24.64 | |
BSC | <0.01% | $1.42 | 17.1328 | $24.33 | |
BSC | <0.01% | $0.000354 | 68,756.3511 | $24.32 | |
BSC | <0.01% | <$0.000001 | 60,301,758,562.9163 | $24.29 | |
BSC | <0.01% | $0.061596 | 392.7884 | $24.19 | |
BSC | <0.01% | $0.000306 | 78,477.674 | $24.02 | |
BSC | <0.01% | $0.043782 | 547.4763 | $23.97 | |
BSC | <0.01% | $0.191777 | 123.2802 | $23.64 | |
BSC | <0.01% | $0.091103 | 258.1769 | $23.52 | |
BSC | <0.01% | $13.37 | 1.7437 | $23.31 | |
BSC | <0.01% | $0.006097 | 3,723.5242 | $22.7 | |
BSC | <0.01% | $0.000001 | 37,466,656.6381 | $22.52 | |
BSC | <0.01% | $0.000624 | 35,948.0114 | $22.45 | |
BSC | <0.01% | $0.000062 | 354,509.56 | $22.06 | |
BSC | <0.01% | $0.023754 | 923.7508 | $21.94 | |
BSC | <0.01% | $0.340216 | 64.2399 | $21.86 | |
BSC | <0.01% | $0.027255 | 800.1143 | $21.81 | |
BSC | <0.01% | $0.045817 | 470.9618 | $21.58 | |
BSC | <0.01% | $0.195099 | 109.5855 | $21.38 | |
BSC | <0.01% | $0.000065 | 320,997.5069 | $21.02 | |
BSC | <0.01% | $0.020068 | 1,041.0003 | $20.89 | |
BSC | <0.01% | $0.005927 | 3,507.6835 | $20.79 | |
BSC | <0.01% | <$0.000001 | 1,211,850,092.1955 | $20.67 | |
BSC | <0.01% | $0.000003 | 6,118,037.2291 | $20.62 | |
BSC | <0.01% | $0.170726 | 118.9917 | $20.31 | |
BSC | <0.01% | $1.99 | 10.1615 | $20.22 | |
BSC | <0.01% | $0.112169 | 177.4102 | $19.9 | |
BSC | <0.01% | $0.000031 | 634,246.0969 | $19.86 | |
BSC | <0.01% | $0.211783 | 92.8489 | $19.66 | |
BSC | <0.01% | $0.000218 | 90,080.5865 | $19.64 | |
BSC | <0.01% | $17.69 | 1.1076 | $19.59 | |
BSC | <0.01% | $0.610263 | 31.8967 | $19.47 | |
BSC | <0.01% | $0.044448 | 436.7728 | $19.41 | |
BSC | <0.01% | $0.004285 | 4,503.4288 | $19.3 | |
BSC | <0.01% | <$0.000001 | 6,252,254,017.4027 | $19.28 | |
BSC | <0.01% | $0.050359 | 379.6169 | $19.12 | |
BSC | <0.01% | $0.001009 | 18,885.2 | $19.06 | |
BSC | <0.01% | $0.374496 | 50.8571 | $19.05 | |
BSC | <0.01% | $0.097157 | 194.7316 | $18.92 | |
BSC | <0.01% | $0.257114 | 72.6547 | $18.68 | |
BSC | <0.01% | $0.000677 | 27,517.645 | $18.62 | |
BSC | <0.01% | <$0.000001 | 734,977,138.0006 | $18.61 | |
BSC | <0.01% | $0.00095 | 19,566.8845 | $18.58 | |
BSC | <0.01% | $0.00554 | 3,351.5601 | $18.57 | |
BSC | <0.01% | $0.153063 | 120.424 | $18.43 | |
BSC | <0.01% | $0.255337 | 71.6563 | $18.3 | |
BSC | <0.01% | $1,892.61 | 0.00964306 | $18.25 | |
BSC | <0.01% | $0.277532 | 65.6427 | $18.22 | |
BSC | <0.01% | $0.058759 | 307.3603 | $18.06 | |
BSC | <0.01% | $0.001769 | 10,180.2653 | $18.01 | |
BSC | <0.01% | $0.141962 | 126.4694 | $17.95 | |
BSC | <0.01% | $0.02108 | 846.5587 | $17.85 | |
BSC | <0.01% | $0.00006 | 291,946.2643 | $17.57 | |
BSC | <0.01% | $0.873524 | 20.0489 | $17.51 | |
BSC | <0.01% | $2.4 | 7.2152 | $17.32 | |
BSC | <0.01% | $0.132063 | 131.0274 | $17.3 | |
BSC | <0.01% | $0.000333 | 51,638.1952 | $17.19 | |
BSC | <0.01% | $0.026559 | 645.9752 | $17.16 | |
BSC | <0.01% | $0.036013 | 475.5487 | $17.13 | |
BSC | <0.01% | $6.62 | 2.5661 | $16.99 | |
BSC | <0.01% | $3.41 | 4.9284 | $16.81 | |
BSC | <0.01% | $0.024125 | 693.9121 | $16.74 | |
BSC | <0.01% | $0.048461 | 344.4525 | $16.69 | |
BSC | <0.01% | $0.012254 | 1,361.7813 | $16.69 | |
BSC | <0.01% | $0.996792 | 16.7032 | $16.65 | |
BSC | <0.01% | $0.560374 | 29.221 | $16.37 | |
BSC | <0.01% | $0.000024 | 694,509.5665 | $16.32 | |
BSC | <0.01% | $0.000879 | 18,535.8633 | $16.3 | |
BSC | <0.01% | $0.000029 | 568,968.7692 | $16.29 | |
BSC | <0.01% | $0.99783 | 16.1824 | $16.15 | |
BSC | <0.01% | $0.014461 | 1,105.4993 | $15.99 | |
BSC | <0.01% | $0.510541 | 31.1635 | $15.91 | |
BSC | <0.01% | $2.19 | 7.2021 | $15.77 | |
BSC | <0.01% | $0.010305 | 1,510.6067 | $15.57 | |
BSC | <0.01% | <$0.000001 | 142,539,558.5011 | $15.5 | |
BSC | <0.01% | $0.007074 | 2,190.491 | $15.5 | |
BSC | <0.01% | <$0.000001 | 681,431,063.7986 | $15.49 | |
BSC | <0.01% | $0.010522 | 1,463.7034 | $15.4 | |
BSC | <0.01% | $0.001499 | 10,270.7265 | $15.4 | |
BSC | <0.01% | $1 | 15.3167 | $15.33 | |
BSC | <0.01% | $0.000214 | 71,515.4382 | $15.27 | |
BSC | <0.01% | $0.019604 | 774.3808 | $15.18 | |
BSC | <0.01% | $0.347719 | 43.2071 | $15.02 | |
BSC | <0.01% | $0.742098 | 19.9709 | $14.82 | |
BSC | <0.01% | $0.007865 | 1,879.4465 | $14.78 | |
BSC | <0.01% | $23.38 | 0.6296 | $14.72 | |
BSC | <0.01% | $0.759858 | 19.3623 | $14.71 | |
BSC | <0.01% | $0.023116 | 636.2579 | $14.71 | |
BSC | <0.01% | <$0.000001 | 3,478,703,169.0296 | $14.53 | |
BSC | <0.01% | $0.420073 | 34.274 | $14.4 | |
BSC | <0.01% | $0.000759 | 18,905.3633 | $14.35 | |
BSC | <0.01% | $0.000003 | 5,581,896.5011 | $14.35 | |
BSC | <0.01% | $0.000435 | 32,916.3466 | $14.33 | |
BSC | <0.01% | $1.17 | 12.2217 | $14.3 | |
BSC | <0.01% | $0.650348 | 21.878 | $14.23 | |
BSC | <0.01% | $0.109557 | 129.703 | $14.21 | |
BSC | <0.01% | $0.00065 | 21,788.8328 | $14.16 | |
BSC | <0.01% | $0.003052 | 4,624.3434 | $14.11 | |
BSC | <0.01% | $0.011609 | 1,215.7956 | $14.11 | |
BSC | <0.01% | <$0.000001 | 1,510,737,338.077 | $14.09 | |
BSC | <0.01% | $0.020052 | 698.7075 | $14.01 | |
BSC | <0.01% | $0.002593 | 5,376.8666 | $13.94 | |
BSC | <0.01% | $0.005952 | 2,324.0575 | $13.83 | |
BSC | <0.01% | <$0.000001 | 8,789,872,354.7045 | $13.79 | |
BSC | <0.01% | $0.189808 | 72.487 | $13.76 | |
BSC | <0.01% | $0.014616 | 939.952 | $13.74 | |
BSC | <0.01% | $0.00004 | 341,252.3225 | $13.59 | |
BSC | <0.01% | $0.094622 | 143.6553 | $13.59 | |
BSC | <0.01% | $5.1 | 2.6576 | $13.56 | |
BSC | <0.01% | $1.72 | 7.826 | $13.46 | |
BSC | <0.01% | $0.001471 | 9,124.2054 | $13.43 | |
BSC | <0.01% | $0.000689 | 19,470.0495 | $13.42 | |
BSC | <0.01% | $0.068774 | 194.6205 | $13.38 | |
BSC | <0.01% | $0.023021 | 578.9303 | $13.33 | |
BSC | <0.01% | $0.000625 | 21,226.0302 | $13.27 | |
BSC | <0.01% | $0.000176 | 75,318.9671 | $13.23 | |
BSC | <0.01% | $0.000295 | 44,703.965 | $13.18 | |
BSC | <0.01% | $0.137923 | 93.6196 | $12.91 | |
BSC | <0.01% | $0.005067 | 2,547.0703 | $12.9 | |
BSC | <0.01% | $0.001111 | 11,605.4433 | $12.89 | |
BSC | <0.01% | $0.286372 | 44.9315 | $12.87 | |
BSC | <0.01% | $0.003211 | 3,990.9996 | $12.82 | |
BSC | <0.01% | $0.168959 | 75.4029 | $12.74 | |
BSC | <0.01% | $0.006333 | 2,004.1473 | $12.69 | |
BSC | <0.01% | <$0.000001 | 12,660,137,395,676,246,000 | $12.66 | |
BSC | <0.01% | $0.11366 | 110.3215 | $12.54 | |
BSC | <0.01% | <$0.000001 | 500,465,136.6947 | $12.45 | |
BSC | <0.01% | $0.037866 | 324.7946 | $12.3 | |
BSC | <0.01% | $1.77 | 6.8618 | $12.15 | |
BSC | <0.01% | $0.011702 | 1,037.8035 | $12.14 | |
BSC | <0.01% | <$0.000001 | 38,796,325,871.4071 | $12.08 | |
BSC | <0.01% | $0.176398 | 68.395 | $12.06 | |
BSC | <0.01% | $0.737366 | 16.2902 | $12.01 | |
BSC | <0.01% | $0.624799 | 19.0635 | $11.91 | |
BSC | <0.01% | $0.220512 | 53.6804 | $11.84 | |
BSC | <0.01% | $0.001921 | 6,061.0024 | $11.64 | |
BSC | <0.01% | $0.000033 | 354,595.9141 | $11.64 | |
BSC | <0.01% | $2.27 | 5.08 | $11.55 | |
BSC | <0.01% | $0.00262 | 4,384.7871 | $11.49 | |
BSC | <0.01% | $0.00015 | 76,099.2842 | $11.43 | |
BSC | <0.01% | $0.083103 | 136.2963 | $11.33 | |
BSC | <0.01% | $0.337894 | 33.1931 | $11.22 | |
BSC | <0.01% | $0.001205 | 9,141.5874 | $11.01 | |
BSC | <0.01% | $2.45 | 4.453 | $10.92 | |
BSC | <0.01% | $0.000137 | 78,941.9074 | $10.81 | |
BSC | <0.01% | $4,045.35 | 0.00266587 | $10.78 | |
BSC | <0.01% | $0.213497 | 50.4829 | $10.78 | |
BSC | <0.01% | $0.259818 | 41.3623 | $10.75 | |
BSC | <0.01% | $0.056885 | 188.5809 | $10.73 | |
BSC | <0.01% | $0.004614 | 2,293.729 | $10.58 | |
BSC | <0.01% | $0.003974 | 2,559.5956 | $10.17 | |
BSC | <0.01% | $0.007224 | 1,378.8723 | $9.96 | |
BSC | <0.01% | $0.286372 | 34.3429 | $9.83 | |
BSC | <0.01% | $3.56 | 2.7504 | $9.79 | |
BSC | <0.01% | $0.003217 | 3,022.5455 | $9.72 | |
BSC | <0.01% | <$0.000001 | 2,468,934,335.2973 | $9.68 | |
BSC | <0.01% | $0.010169 | 940.4465 | $9.56 | |
BSC | <0.01% | $0.061466 | 154.5706 | $9.5 | |
BSC | <0.01% | $0.000946 | 9,913.7465 | $9.38 | |
BSC | <0.01% | $0.000581 | 16,093.7718 | $9.35 | |
BSC | <0.01% | $0.000019 | 484,154.9187 | $9.27 | |
BSC | <0.01% | $0.047648 | 193.5749 | $9.22 | |
BSC | <0.01% | $0.000457 | 19,878.129 | $9.09 | |
BSC | <0.01% | $0.000115 | 78,997.7397 | $9.08 | |
BSC | <0.01% | $0.001851 | 4,878.3814 | $9.03 | |
BSC | <0.01% | $0.010616 | 844.8305 | $8.97 | |
BSC | <0.01% | <$0.000001 | 13,826,152,975.7255 | $8.94 | |
BSC | <0.01% | $0.000098 | 91,247.3122 | $8.91 | |
BSC | <0.01% | $0.000151 | 59,074.8582 | $8.9 | |
BSC | <0.01% | $0.000753 | 11,807.2859 | $8.89 | |
BSC | <0.01% | $21.69 | 0.408 | $8.85 | |
BSC | <0.01% | $0.007856 | 1,118.4974 | $8.79 | |
BSC | <0.01% | <$0.000001 | 3,310,452,619.2352 | $8.66 | |
BSC | <0.01% | $0.000011 | 735,129.1374 | $8.44 | |
BSC | <0.01% | $0.002595 | 3,233.9876 | $8.39 | |
BSC | <0.01% | $0.000872 | 9,606.4513 | $8.37 | |
BSC | <0.01% | $0.004466 | 1,852.2659 | $8.27 | |
BSC | <0.01% | $0.273333 | 30.1856 | $8.25 | |
BSC | <0.01% | $0.212246 | 37.878 | $8.04 | |
BSC | <0.01% | $0.006773 | 1,177.0066 | $7.97 | |
BSC | <0.01% | $0.000464 | 17,184.0967 | $7.97 | |
BSC | <0.01% | $0.270856 | 29.4007 | $7.96 | |
BSC | <0.01% | <$0.000001 | 42,621,937.4132 | $7.91 | |
BSC | <0.01% | $1.55 | 5.0824 | $7.88 | |
BSC | <0.01% | $0.007634 | 1,031.7093 | $7.88 | |
BSC | <0.01% | $0.00083 | 9,281.6075 | $7.7 | |
BSC | <0.01% | <$0.000001 | 7,476,385,504.8175 | $7.66 | |
BSC | <0.01% | $0.000348 | 22,042.9774 | $7.66 | |
BSC | <0.01% | $0.000398 | 19,193.0744 | $7.64 | |
BSC | <0.01% | $0.714141 | 10.692 | $7.64 | |
BSC | <0.01% | $0.000385 | 19,694.4449 | $7.59 | |
BSC | <0.01% | $0.002329 | 3,225.5877 | $7.51 | |
BSC | <0.01% | $0.999753 | 7.3943 | $7.39 | |
BSC | <0.01% | $8.83 | 0.824 | $7.28 | |
BSC | <0.01% | $10.4 | 0.6941 | $7.22 | |
BSC | <0.01% | <$0.000001 | 2,837,900,193.0382 | $7.14 | |
BSC | <0.01% | $0.011985 | 571.8318 | $6.85 | |
BSC | <0.01% | $6.51 | 1.0431 | $6.79 | |
BSC | <0.01% | $0.01943 | 344.6342 | $6.7 | |
BSC | <0.01% | $0.003998 | 1,671.3248 | $6.68 | |
BSC | <0.01% | $0.001213 | 5,502.3766 | $6.67 | |
BSC | <0.01% | $1.3 | 5.0908 | $6.63 | |
BSC | <0.01% | $0.003425 | 1,925.0465 | $6.59 | |
BSC | <0.01% | <$0.000001 | 2,627,402,346,198.9878 | $6.5 | |
BSC | <0.01% | $0.075825 | 85.5035 | $6.48 | |
BSC | <0.01% | $0.007403 | 866.0874 | $6.41 | |
BSC | <0.01% | $17.17 | 0.3717 | $6.38 | |
BSC | <0.01% | $0.000626 | 10,147.8763 | $6.35 | |
BSC | <0.01% | $0.000142 | 44,669.2009 | $6.33 | |
BSC | <0.01% | $0.061844 | 102.0223 | $6.31 | |
BSC | <0.01% | $0.007918 | 795.1811 | $6.3 | |
BSC | <0.01% | $0.001735 | 3,610.2386 | $6.26 | |
BSC | <0.01% | $0.138126 | 45.1287 | $6.23 | |
BSC | <0.01% | $0.359408 | 17.2869 | $6.21 | |
BSC | <0.01% | $0.041049 | 149.9262 | $6.15 | |
BSC | <0.01% | $0.01874 | 327.0513 | $6.13 | |
BSC | <0.01% | $0.010868 | 563.5332 | $6.12 | |
BSC | <0.01% | $0.560173 | 10.857 | $6.08 | |
BSC | <0.01% | $0.019171 | 315.691 | $6.05 | |
BSC | <0.01% | $0.010532 | 573.717 | $6.04 | |
BSC | <0.01% | $82.82 | 0.0725 | $6.01 | |
BSC | <0.01% | $0.000241 | 24,858.7214 | $5.98 | |
BSC | <0.01% | $0.000003 | 2,082,747.5213 | $5.98 | |
BSC | <0.01% | $0.062064 | 94.8461 | $5.89 | |
BSC | <0.01% | $0.000179 | 32,783.6394 | $5.87 | |
BSC | <0.01% | <$0.000001 | 15,704,659,283.5685 | $5.86 | |
BSC | <0.01% | $8.74 | 0.6701 | $5.86 | |
BSC | <0.01% | $0.014291 | 407.5806 | $5.82 | |
BSC | <0.01% | $0.002607 | 2,220.4256 | $5.79 | |
BSC | <0.01% | $0.369058 | 15.6655 | $5.78 | |
BSC | <0.01% | $0.001834 | 3,144.1711 | $5.77 | |
BSC | <0.01% | $0.009583 | 595.2346 | $5.7 | |
BSC | <0.01% | $0.156385 | 36.101 | $5.65 | |
BSC | <0.01% | $0.00008 | 70,160.192 | $5.64 | |
BSC | <0.01% | $0.050525 | 111.5753 | $5.64 | |
BSC | <0.01% | $0.000113 | 48,363.3468 | $5.44 | |
BSC | <0.01% | $0.008744 | 619.7642 | $5.42 | |
BSC | <0.01% | $0.222578 | 23.9668 | $5.33 | |
BSC | <0.01% | $0.001697 | 3,112.4456 | $5.28 | |
BSC | <0.01% | $0.00213 | 2,460.3869 | $5.24 | |
BSC | <0.01% | $0.020809 | 251.4151 | $5.23 | |
BSC | <0.01% | <$0.000001 | 8,699,058,800,124.8867 | $5.18 | |
BSC | <0.01% | $0.000016 | 325,031.0669 | $5.14 | |
BSC | <0.01% | $0.000307 | 16,726.3443 | $5.13 | |
BSC | <0.01% | $0.004731 | 1,074.1206 | $5.08 | |
BSC | <0.01% | $0.008703 | 583.2764 | $5.08 | |
BSC | <0.01% | <$0.000001 | 3,986,544,934.7682 | $5.05 | |
BSC | <0.01% | $0.009988 | 502.0467 | $5.01 | |
BSC | <0.01% | $0.019104 | 260.6361 | $4.98 | |
BSC | <0.01% | $0.001199 | 4,149.7841 | $4.98 | |
BSC | <0.01% | $0.031897 | 154.2545 | $4.92 | |
BSC | <0.01% | $0.002739 | 1,774.778 | $4.86 | |
BSC | <0.01% | $0.000018 | 267,350.7888 | $4.85 | |
BSC | <0.01% | $49.18 | 0.0974 | $4.79 | |
BSC | <0.01% | $0.489225 | 9.7278 | $4.76 | |
BSC | <0.01% | $0.000341 | 13,849.5907 | $4.72 | |
BSC | <0.01% | $0.534096 | 8.8101 | $4.71 | |
BSC | <0.01% | $0.000612 | 7,675.6864 | $4.7 | |
BSC | <0.01% | $0.043608 | 106.6828 | $4.65 | |
BSC | <0.01% | $0.002574 | 1,803.0246 | $4.64 | |
BSC | <0.01% | $1.14 | 4.0354 | $4.6 | |
BSC | <0.01% | $0.000875 | 5,238.2793 | $4.58 | |
BSC | <0.01% | $0.004546 | 1,007.1664 | $4.58 | |
BSC | <0.01% | $0.000618 | 7,373.5601 | $4.56 | |
BSC | <0.01% | $0.004933 | 923.5343 | $4.56 | |
BSC | <0.01% | $0.001819 | 2,483.856 | $4.52 | |
BSC | <0.01% | $0.000206 | 21,673.9533 | $4.47 | |
BSC | <0.01% | $0.00908 | 489.3431 | $4.44 | |
BSC | <0.01% | $0.005009 | 886.8123 | $4.44 | |
BSC | <0.01% | $0.008002 | 549.2601 | $4.39 | |
BSC | <0.01% | $0.001098 | 3,982.0426 | $4.37 | |
BSC | <0.01% | $0.010849 | 402.95 | $4.37 | |
BSC | <0.01% | $0.000268 | 16,210.976 | $4.35 | |
BSC | <0.01% | $0.015056 | 286.9715 | $4.32 | |
BSC | <0.01% | $0.001204 | 3,550.5598 | $4.28 | |
BSC | <0.01% | $0.002222 | 1,921.1093 | $4.27 | |
BSC | <0.01% | <$0.000001 | 31,513,429.5586 | $4.2 | |
BSC | <0.01% | <$0.000001 | 41,130,825.8254 | $4.2 | |
BSC | <0.01% | $0.00012 | 34,974.1159 | $4.18 | |
BSC | <0.01% | $0.000088 | 47,329.8531 | $4.17 | |
BSC | <0.01% | $0.000424 | 9,665.315 | $4.1 | |
BSC | <0.01% | $0.058126 | 69.9186 | $4.06 | |
BSC | <0.01% | $0.000002 | 2,361,313.7679 | $4.06 | |
BSC | <0.01% | $0.653874 | 6.1681 | $4.03 | |
BSC | <0.01% | $0.164144 | 24.1733 | $3.97 | |
BSC | <0.01% | <$0.000001 | 13,786,461,496.477 | $3.96 | |
BSC | <0.01% | $1.84 | 2.1505 | $3.96 | |
BSC | <0.01% | <$0.000001 | 75,780,728,793.6681 | $3.89 | |
BSC | <0.01% | $0.002121 | 1,834.1861 | $3.89 | |
BSC | <0.01% | $0.000028 | 136,447.7107 | $3.88 | |
BSC | <0.01% | $0.000127 | 30,276.8437 | $3.85 | |
BSC | <0.01% | $0.001189 | 3,216.9024 | $3.83 | |
BSC | <0.01% | $0.033605 | 113.6911 | $3.82 | |
BSC | <0.01% | $0.00255 | 1,474.1464 | $3.76 | |
BSC | <0.01% | $0.004137 | 899.7726 | $3.72 | |
BSC | <0.01% | $5.35 | 0.6933 | $3.71 | |
BSC | <0.01% | $0.014237 | 260.3532 | $3.71 | |
BSC | <0.01% | $2.69 | 1.3721 | $3.69 | |
BSC | <0.01% | $0.000072 | 50,831.3319 | $3.67 | |
BSC | <0.01% | $0.127459 | 28.5025 | $3.63 | |
BSC | <0.01% | $0.008726 | 413.8755 | $3.61 | |
BSC | <0.01% | $0.000012 | 293,930.651 | $3.61 | |
BSC | <0.01% | $0.002899 | 1,239.8643 | $3.59 | |
BSC | <0.01% | $0.000004 | 884,659.3581 | $3.59 | |
BSC | <0.01% | $118.19 | 0.0303 | $3.59 | |
BSC | <0.01% | $0.00001 | 346,445.7349 | $3.52 | |
BSC | <0.01% | $0.003293 | 1,065.9734 | $3.51 | |
BSC | <0.01% | $0.025858 | 135.3981 | $3.5 | |
BSC | <0.01% | $0.381327 | 9.1322 | $3.48 | |
BSC | <0.01% | $0.035177 | 98.5722 | $3.47 | |
BSC | <0.01% | $0.000249 | 13,929.9998 | $3.46 | |
BSC | <0.01% | $0.000476 | 7,223.8845 | $3.44 | |
BSC | <0.01% | $1.36 | 2.5315 | $3.43 | |
BSC | <0.01% | $0.001119 | 3,060.9506 | $3.43 | |
BSC | <0.01% | $0.002598 | 1,315.3851 | $3.42 | |
BSC | <0.01% | $0.00009 | 37,289.3584 | $3.37 | |
BSC | <0.01% | $0.006638 | 503.5687 | $3.34 | |
BSC | <0.01% | $0.001248 | 2,647.0821 | $3.3 | |
BSC | <0.01% | <$0.000001 | 4,170,410,877.0991 | $3.29 | |
BSC | <0.01% | $0.010506 | 311.2693 | $3.27 | |
BSC | <0.01% | $57.05 | 0.0572 | $3.26 | |
BSC | <0.01% | $0.000005 | 604,180.8937 | $3.25 | |
BSC | <0.01% | $0.983988 | 3.2942 | $3.24 | |
BSC | <0.01% | $0.012892 | 251.2191 | $3.24 | |
BSC | <0.01% | <$0.000001 | 29,334,267.5928 | $3.21 | |
BSC | <0.01% | $0.000002 | 1,636,077.0699 | $3.21 | |
BSC | <0.01% | <$0.000001 | 55,641,352,331.806 | $3.2 | |
BSC | <0.01% | $0.033252 | 94.8325 | $3.15 | |
BSC | <0.01% | $0.004799 | 645.9092 | $3.1 | |
BSC | <0.01% | $0.022915 | 134.8655 | $3.09 | |
BSC | <0.01% | $0.000635 | 4,837.7095 | $3.07 | |
BSC | <0.01% | <$0.000001 | 2,540,407,806.1878 | $2.96 | |
BSC | <0.01% | $0.00375 | 788.644 | $2.96 | |
BSC | <0.01% | $0.000001 | 3,249,228.6236 | $2.92 | |
BSC | <0.01% | $0.013695 | 212 | $2.9 | |
BSC | <0.01% | $0.000004 | 700,195.5252 | $2.9 | |
BSC | <0.01% | $0.000559 | 5,103.7104 | $2.85 | |
BSC | <0.01% | $0.026271 | 108.6254 | $2.85 | |
BSC | <0.01% | $0.255337 | 10.9841 | $2.8 | |
BSC | <0.01% | $0.000012 | 242,120.6562 | $2.8 | |
BSC | <0.01% | $0.224224 | 12.2754 | $2.75 | |
BSC | <0.01% | <$0.000001 | 3,260,461,474.3296 | $2.75 | |
BSC | <0.01% | $0.000117 | 23,369.403 | $2.74 | |
BSC | <0.01% | $0.00046 | 5,932.7356 | $2.73 | |
BSC | <0.01% | $5.57 | 0.4764 | $2.65 | |
BSC | <0.01% | $0.009732 | 272.4605 | $2.65 | |
BSC | <0.01% | $0.00092 | 2,873.446 | $2.64 | |
BSC | <0.01% | $0.180859 | 14.6205 | $2.64 | |
BSC | <0.01% | $0.000002 | 1,127,797.0301 | $2.64 | |
BSC | <0.01% | $0.999898 | 2.6332 | $2.63 | |
BSC | <0.01% | $0.000347 | 7,559.8207 | $2.62 | |
BSC | <0.01% | $6.3 | 0.4154 | $2.62 | |
BSC | <0.01% | $0.001715 | 1,494.593 | $2.56 | |
BSC | <0.01% | $0.586995 | 4.3398 | $2.55 | |
BSC | <0.01% | <$0.000001 | 7,861,461,828.2313 | $2.54 | |
BSC | <0.01% | $0.004101 | 618.9786 | $2.54 | |
BSC | <0.01% | <$0.000001 | 1,523,266,163.1627 | $2.51 | |
BSC | <0.01% | $0.00919 | 272.8669 | $2.51 | |
BSC | <0.01% | $0.001672 | 1,470.1495 | $2.46 | |
BSC | <0.01% | $0.012226 | 199.8582 | $2.44 | |
BSC | <0.01% | $0.008724 | 279.0303 | $2.43 | |
BSC | <0.01% | $0.017852 | 135.6002 | $2.42 | |
BSC | <0.01% | <$0.000001 | 1,862,120,936.826 | $2.42 | |
BSC | <0.01% | <$0.000001 | 226,057,723.6422 | $2.41 | |
BSC | <0.01% | $0.019626 | 122.7158 | $2.41 | |
BSC | <0.01% | $0.0029 | 829.161 | $2.4 | |
BSC | <0.01% | $0.160201 | 14.4412 | $2.31 | |
BSC | <0.01% | $0.002214 | 1,044.3545 | $2.31 | |
BSC | <0.01% | $0.000027 | 83,605.1062 | $2.28 | |
BSC | <0.01% | <$0.000001 | 11,610,921,239.7508 | $2.26 | |
BSC | <0.01% | $0.004648 | 482.1727 | $2.24 | |
BSC | <0.01% | $2.38 | 0.9394 | $2.24 | |
BSC | <0.01% | $0.005294 | 421.1496 | $2.23 | |
BSC | <0.01% | $0.000159 | 14,027.1276 | $2.23 | |
BSC | <0.01% | $0.049727 | 44.5905 | $2.22 | |
BSC | <0.01% | $0.650467 | 3.4062 | $2.22 | |
BSC | <0.01% | $0.086754 | 25.5295 | $2.21 | |
BSC | <0.01% | $3.93 | 0.5576 | $2.19 | |
BSC | <0.01% | <$0.000001 | 147,499,030,391.6717 | $2.16 | |
BSC | <0.01% | $0.000075 | 28,720.6492 | $2.16 | |
BSC | <0.01% | $0.094141 | 22.8622 | $2.15 | |
BSC | <0.01% | $0.00024 | 8,935.0506 | $2.15 | |
BSC | <0.01% | $0.011114 | 192.904 | $2.14 | |
BSC | <0.01% | $0.179463 | 11.9251 | $2.14 | |
BSC | <0.01% | $0.000969 | 2,204.4588 | $2.14 | |
BSC | <0.01% | <$0.000001 | 314,173,294.4393 | $2.12 | |
BSC | <0.01% | <$0.000001 | 18,061,311,151.9263 | $2.1 | |
BSC | <0.01% | $0.000513 | 4,089.1611 | $2.1 | |
BSC | <0.01% | $0.002201 | 951.7064 | $2.09 | |
BSC | <0.01% | $0.604495 | 3.4188 | $2.07 | |
BSC | <0.01% | $0.002591 | 792.8409 | $2.05 | |
BSC | <0.01% | $0.000339 | 6,046.9065 | $2.05 | |
BSC | <0.01% | $0.000308 | 6,469.6597 | $1.99 | |
BSC | <0.01% | $2.57 | 0.7729 | $1.99 | |
BSC | <0.01% | $0.000023 | 87,649.298 | $1.97 | |
BSC | <0.01% | $0.007269 | 270.1674 | $1.96 | |
BSC | <0.01% | $0.005686 | 341.5378 | $1.94 | |
BSC | <0.01% | $132.54 | 0.0146 | $1.94 | |
BSC | <0.01% | $0.001932 | 1,003.5883 | $1.94 | |
BSC | <0.01% | $0.000007 | 293,915.7989 | $1.94 | |
BSC | <0.01% | $0.003811 | 504.7252 | $1.92 | |
BSC | <0.01% | $0.113613 | 16.8999 | $1.92 | |
BSC | <0.01% | $0.00007 | 27,069.7866 | $1.91 | |
BSC | <0.01% | $0.000293 | 6,481.9407 | $1.9 | |
BSC | <0.01% | <$0.000001 | 8,640,732,968.9683 | $1.89 | |
BSC | <0.01% | $0.003085 | 604.5099 | $1.87 | |
BSC | <0.01% | $0.0048 | 388.447 | $1.86 | |
BSC | <0.01% | $0.005082 | 366.5431 | $1.86 | |
BSC | <0.01% | $0.20482 | 9.0338 | $1.85 | |
BSC | <0.01% | $1.1 | 1.675 | $1.85 | |
BSC | <0.01% | $0.250916 | 7.2309 | $1.81 | |
BSC | <0.01% | $0.001234 | 1,469.1133 | $1.81 | |
BSC | <0.01% | $0.000025 | 71,694.7885 | $1.8 | |
BSC | <0.01% | $0.000131 | 13,812.5198 | $1.8 | |
BSC | <0.01% | $0.000001 | 3,324,981.4684 | $1.8 | |
BSC | <0.01% | $0.000123 | 14,536.61 | $1.78 | |
BSC | <0.01% | $0.003395 | 515.6673 | $1.75 | |
BSC | <0.01% | $0.000958 | 1,791.3755 | $1.72 | |
BSC | <0.01% | $756.14 | 0.00226788 | $1.71 | |
BSC | <0.01% | <$0.000001 | 394,839,304.5192 | $1.69 | |
BSC | <0.01% | $0.001263 | 1,319.406 | $1.67 | |
BSC | <0.01% | $26.81 | 0.0619 | $1.66 | |
BSC | <0.01% | $0.001643 | 1,002.5205 | $1.65 | |
BSC | <0.01% | $0.996532 | 1.6384 | $1.63 | |
BSC | <0.01% | $0.000003 | 593,462.1563 | $1.63 | |
BSC | <0.01% | $0.000078 | 20,519.0575 | $1.61 | |
BSC | <0.01% | <$0.000001 | 3,361,615.2293 | $1.6 | |
BSC | <0.01% | $0.000005 | 313,096.8755 | $1.59 | |
BSC | <0.01% | $0.004604 | 344.0016 | $1.58 | |
BSC | <0.01% | $784.9 | 0.00196899 | $1.55 | |
BSC | <0.01% | $0.000515 | 2,998.6187 | $1.54 | |
BSC | <0.01% | $0.000069 | 22,257.1257 | $1.54 | |
BSC | <0.01% | $95,896.13 | 0.000016 | $1.53 | |
BSC | <0.01% | $0.003687 | 415.2223 | $1.53 | |
BSC | <0.01% | <$0.000001 | 3,463,707.5641 | $1.52 | |
BSC | <0.01% | <$0.000001 | 912,198,331.3941 | $1.52 | |
BSC | <0.01% | $0.01188 | 127.5149 | $1.51 | |
BSC | <0.01% | $10.96 | 0.1375 | $1.51 | |
BSC | <0.01% | $0.002589 | 576.5025 | $1.49 | |
BSC | <0.01% | $2.81 | 0.5297 | $1.49 | |
BSC | <0.01% | $0.055959 | 26.5435 | $1.49 | |
BSC | <0.01% | $0.004399 | 332.1686 | $1.46 | |
BSC | <0.01% | $0.271124 | 5.3597 | $1.45 | |
BSC | <0.01% | $0.02271 | 63.6865 | $1.45 | |
BSC | <0.01% | $0.031169 | 46.3497 | $1.44 | |
BSC | <0.01% | $0.001959 | 724.8562 | $1.42 | |
BSC | <0.01% | $0.000314 | 4,390.9511 | $1.38 | |
BSC | <0.01% | $0.011814 | 115.975 | $1.37 | |
BSC | <0.01% | $0.000806 | 1,689.763 | $1.36 | |
BSC | <0.01% | $0.199313 | 6.8172 | $1.36 | |
BSC | <0.01% | $0.798127 | 1.6917 | $1.35 | |
BSC | <0.01% | $0.002135 | 622.413 | $1.33 | |
BSC | <0.01% | $0.005942 | 222.0423 | $1.32 | |
BSC | <0.01% | $109,179 | 0.00001207 | $1.32 | |
BSC | <0.01% | $0.000001 | 1,281,124.5947 | $1.32 | |
BSC | <0.01% | $0.00163 | 802.2417 | $1.31 | |
BSC | <0.01% | $0.000377 | 3,468.7542 | $1.31 | |
BSC | <0.01% | $0.000294 | 4,428.2542 | $1.3 | |
BSC | <0.01% | $0.449096 | 2.9002 | $1.3 | |
BSC | <0.01% | $0.000064 | 20,404.7044 | $1.3 | |
BSC | <0.01% | $0.000002 | 598,931.1387 | $1.29 | |
BSC | <0.01% | <$0.000001 | 794,353,906.9678 | $1.29 | |
BSC | <0.01% | <$0.000001 | 54,223,787.6961 | $1.29 | |
BSC | <0.01% | $0.500131 | 2.5285 | $1.26 | |
BSC | <0.01% | $0.150661 | 8.3659 | $1.26 | |
BSC | <0.01% | <$0.000001 | 984,308,739,859.7045 | $1.23 | |
BSC | <0.01% | $0.000142 | 8,516.9049 | $1.21 | |
BSC | <0.01% | $1.07 | 1.1355 | $1.21 | |
BSC | <0.01% | $0.010138 | 117.9407 | $1.2 | |
BSC | <0.01% | <$0.000001 | 12,982,012.5199 | $1.18 | |
BSC | <0.01% | <$0.000001 | 728,500,591,212.9489 | $1.18 | |
BSC | <0.01% | $0.000071 | 16,619.2467 | $1.17 | |
BSC | <0.01% | $1.1 | 1.0673 | $1.17 | |
BSC | <0.01% | $0.00001 | 112,377.9199 | $1.17 | |
BSC | <0.01% | $0.000511 | 2,289.027 | $1.17 | |
BSC | <0.01% | <$0.000001 | 31,853,706.547 | $1.17 | |
BSC | <0.01% | $0.004134 | 282.3698 | $1.17 | |
BSC | <0.01% | $0.001038 | 1,112.0886 | $1.15 | |
BSC | <0.01% | $0.000001 | 1,031,606.0725 | $1.13 | |
BSC | <0.01% | $0.00044 | 2,571.6119 | $1.13 | |
BSC | <0.01% | $0.013321 | 84.7196 | $1.13 | |
BSC | <0.01% | $0.036777 | 30.571 | $1.12 | |
BSC | <0.01% | $0.015234 | 72.575 | $1.11 | |
BSC | <0.01% | $0.002721 | 401.1538 | $1.09 | |
BSC | <0.01% | $0.021862 | 49.849 | $1.09 | |
BSC | <0.01% | $11.18 | 0.0972 | $1.09 | |
BSC | <0.01% | $105,468 | 0.00001027 | $1.08 | |
BSC | <0.01% | $0.034179 | 31.6043 | $1.08 | |
BSC | <0.01% | <$0.000001 | 2,778,485.6495 | $1.07 | |
BSC | <0.01% | $0.163946 | 6.5112 | $1.07 | |
BSC | <0.01% | <$0.000001 | 304,228,186.0348 | $1.06 | |
BSC | <0.01% | $0.0045 | 235.5753 | $1.06 | |
BSC | <0.01% | $0.048318 | 21.9284 | $1.06 | |
BSC | <0.01% | $0.003779 | 278.1568 | $1.05 | |
BSC | <0.01% | $0.005002 | 207.5323 | $1.04 | |
BSC | <0.01% | $0.002682 | 385.8934 | $1.03 | |
BSC | <0.01% | $2.44 | 0.424 | $1.03 | |
BSC | <0.01% | $4,685.84 | 0.0002201 | $1.03 | |
BSC | <0.01% | $0.996562 | 1.0348 | $1.03 | |
BSC | <0.01% | $0.01549 | 66.1547 | $1.02 | |
BSC | <0.01% | $0.000367 | 2,775.9912 | $1.02 | |
BSC | <0.01% | $2.56 | 0.3965 | $1.01 | |
BSC | <0.01% | $0.001986 | 509.1492 | $1.01 | |
BSC | <0.01% | $0.015566 | 64.3186 | $1 | |
BSC | <0.01% | $0.001161 | 856.7387 | $0.9949 | |
BSC | <0.01% | $0.00022 | 4,483.0617 | $0.9884 | |
BSC | <0.01% | $0.221501 | 4.4571 | $0.9872 | |
BSC | <0.01% | <$0.000001 | 10,713,579,225.4988 | $0.981 | |
BSC | <0.01% | $0.031295 | 30.9108 | $0.9673 | |
BSC | <0.01% | $0.000117 | 8,240.5741 | $0.9603 | |
BSC | <0.01% | $0.309931 | 3.0608 | $0.9486 | |
BSC | <0.01% | $0.031897 | 29.4841 | $0.9404 | |
BSC | <0.01% | $0.001352 | 686.0453 | $0.9274 | |
BSC | <0.01% | $0.003024 | 300.0779 | $0.9074 | |
BSC | <0.01% | $0.00204 | 443.7209 | $0.905 | |
BSC | <0.01% | <$0.000001 | 504,023,214.4766 | $0.9021 | |
BSC | <0.01% | $0.000471 | 1,879.3137 | $0.8851 | |
BSC | <0.01% | $0.939778 | 0.9323 | $0.8761 | |
BSC | <0.01% | <$0.000001 | 6,328,212,807.5967 | $0.8631 | |
BSC | <0.01% | $0.000005 | 157,879.7742 | $0.8391 | |
BSC | <0.01% | $0.049715 | 16.8277 | $0.8365 | |
BSC | <0.01% | $0.00007 | 11,829.335 | $0.8316 | |
BSC | <0.01% | $0.004358 | 188.4179 | $0.8211 | |
BSC | <0.01% | <$0.000001 | 6,616,087,876,459.0137 | $0.8185 | |
BSC | <0.01% | $0.004568 | 178.1549 | $0.8137 | |
BSC | <0.01% | <$0.000001 | 794,523,646.4996 | $0.8127 | |
BSC | <0.01% | <$0.000001 | 1,219,519,335,648.9971 | $0.8083 | |
BSC | <0.01% | $0.07853 | 10.2744 | $0.8068 | |
BSC | <0.01% | $0.000197 | 4,088.1823 | $0.8036 | |
BSC | <0.01% | <$0.000001 | 309,976,152.5182 | $0.7971 | |
BSC | <0.01% | $0.000325 | 2,432.3316 | $0.7903 | |
BSC | <0.01% | $0.097558 | 8.0274 | $0.7831 | |
BSC | <0.01% | $0.003695 | 211.4511 | $0.7813 | |
BSC | <0.01% | $0.000132 | 5,881.2239 | $0.7772 | |
BSC | <0.01% | $0.004608 | 166.7776 | $0.7685 | |
BSC | <0.01% | $0.012236 | 62.4476 | $0.7641 | |
BSC | <0.01% | <$0.000001 | 6,103,720.9528 | $0.7624 | |
BSC | <0.01% | <$0.000001 | 5,668,924.4623 | $0.7593 | |
BSC | <0.01% | $0.035389 | 20.8403 | $0.7375 | |
BSC | <0.01% | <$0.000001 | 32,802,848.5889 | $0.7353 | |
BSC | <0.01% | $0.000202 | 3,608.832 | $0.7283 | |
BSC | <0.01% | $0.15404 | 4.7098 | $0.7254 | |
BSC | <0.01% | $2.16 | 0.3362 | $0.7253 | |
BSC | <0.01% | $0.000416 | 1,731.8416 | $0.7204 | |
BSC | <0.01% | $0.000043 | 16,749.2261 | $0.714 | |
BSC | <0.01% | $0.000001 | 896,821.403 | $0.7129 | |
BSC | <0.01% | $0.44385 | 1.5763 | $0.6996 | |
BSC | <0.01% | $1.46 | 0.4789 | $0.6991 | |
BSC | <0.01% | $0.000072 | 9,655.4093 | $0.6952 | |
BSC | <0.01% | $0.000315 | 2,192.3667 | $0.6911 | |
BSC | <0.01% | <$0.000001 | 574,178,618.8256 | $0.689 | |
BSC | <0.01% | <$0.000001 | 147,470,620,952.9207 | $0.6864 | |
BSC | <0.01% | $0.003213 | 212.9293 | $0.6841 | |
BSC | <0.01% | $0.026997 | 25.1442 | $0.6788 | |
BSC | <0.01% | $0.003773 | 178.4929 | $0.6734 | |
BSC | <0.01% | $0.001124 | 588.5296 | $0.6613 | |
BSC | <0.01% | $0.000038 | 17,084.2403 | $0.6557 | |
BSC | <0.01% | $0.003446 | 189.1455 | $0.6518 | |
BSC | <0.01% | $0.000023 | 28,348.6358 | $0.6509 | |
BSC | <0.01% | $0.018901 | 33.3309 | $0.6299 | |
BSC | <0.01% | <$0.000001 | 1,420,931,648,526.9609 | $0.6175 | |
BSC | <0.01% | $0.010431 | 58.9127 | $0.6145 | |
BSC | <0.01% | $0.005241 | 117.1825 | $0.6141 | |
BSC | <0.01% | <$0.000001 | 334,405,150.5755 | $0.6121 | |
BSC | <0.01% | $0.000011 | 54,873.6815 | $0.6114 | |
BSC | <0.01% | $0.015786 | 38.1688 | $0.6025 | |
BSC | <0.01% | $0.004429 | 133.5527 | $0.5915 | |
BSC | <0.01% | $0.005694 | 102.8707 | $0.5857 | |
BSC | <0.01% | $0.627184 | 0.933 | $0.5851 | |
BSC | <0.01% | $0.007283 | 79.8321 | $0.5813 | |
BSC | <0.01% | <$0.000001 | 504,165,227.9965 | $0.5744 | |
BSC | <0.01% | $0.001384 | 410.6677 | $0.5682 | |
BSC | <0.01% | $0.113826 | 4.9633 | $0.5649 | |
BSC | <0.01% | $0.000863 | 653.5418 | $0.564 | |
BSC | <0.01% | <$0.000001 | 1,763,299.5911 | $0.5556 | |
BSC | <0.01% | $1.05 | 0.5163 | $0.5415 | |
BSC | <0.01% | $6.51 | 0.0825 | $0.5373 | |
BSC | <0.01% | $0.000004 | 125,966.0134 | $0.5366 | |
BSC | <0.01% | $0.003724 | 141.6686 | $0.5276 | |
BSC | <0.01% | $0.045011 | 11.6247 | $0.5232 | |
BSC | <0.01% | $0.000001 | 750,657.2963 | $0.5193 | |
BSC | <0.01% | $0.001553 | 333.3638 | $0.5175 | |
BSC | <0.01% | $0.001495 | 342.1255 | $0.5116 | |
BSC | <0.01% | <$0.000001 | 1,451,871.0048 | $0.5095 | |
BSC | <0.01% | <$0.000001 | 846,952,664.6187 | $0.5081 | |
BSC | <0.01% | $0.000515 | 986.0527 | $0.5074 | |
BSC | <0.01% | $0.20078 | 2.5235 | $0.5066 | |
BSC | <0.01% | $0.013331 | 37.9365 | $0.5057 | |
BSC | <0.01% | $0.002973 | 169.7951 | $0.5048 | |
BSC | <0.01% | $0.110287 | 4.5674 | $0.5037 | |
BSC | <0.01% | <$0.000001 | 178,921,088.6154 | $0.5009 | |
BSC | <0.01% | $0.000066 | 7,519.6713 | $0.4998 | |
BSC | <0.01% | $0.06787 | 7.2181 | $0.4898 | |
BSC | <0.01% | $0.002013 | 242.4694 | $0.4879 | |
BSC | <0.01% | $0.001661 | 290.6358 | $0.4827 | |
BSC | <0.01% | $0.008696 | 55.3417 | $0.4812 | |
BSC | <0.01% | $0.001281 | 372.7 | $0.4774 | |
BSC | <0.01% | $1 | 0.4704 | $0.4713 | |
BSC | <0.01% | $0.00001 | 45,668.2971 | $0.4699 | |
BSC | <0.01% | $0.075941 | 6.0495 | $0.4594 | |
BSC | <0.01% | $0.002146 | 212.7933 | $0.4565 | |
BSC | <0.01% | $2,149.31 | 0.00021228 | $0.4562 | |
BSC | <0.01% | $0.00239 | 189.184 | $0.452 | |
BSC | <0.01% | $0.000347 | 1,299.2548 | $0.4511 | |
BSC | <0.01% | <$0.000001 | 2,932,890.1459 | $0.4429 | |
BSC | <0.01% | $0.001686 | 261.8425 | $0.4414 | |
BSC | <0.01% | $0.041315 | 10.2302 | $0.4226 | |
BSC | <0.01% | $0.04708 | 8.9461 | $0.4211 | |
BSC | <0.01% | $0.000043 | 9,751.1186 | $0.418 | |
BSC | <0.01% | $0.000643 | 640.8247 | $0.4122 | |
BSC | <0.01% | <$0.000001 | 138,590,651,693.1712 | $0.4114 | |
BSC | <0.01% | $0.006392 | 64.2147 | $0.4104 | |
BSC | <0.01% | $0.002952 | 138.3243 | $0.4083 | |
BSC | <0.01% | $0.000449 | 906.2512 | $0.4068 | |
BSC | <0.01% | $0.079156 | 5.0477 | $0.3995 | |
BSC | <0.01% | $0.002637 | 151.2054 | $0.3987 | |
BSC | <0.01% | $0.002253 | 173.412 | $0.3906 | |
BSC | <0.01% | $27.85 | 0.014 | $0.3904 | |
BSC | <0.01% | $0.147887 | 2.6158 | $0.3868 | |
BSC | <0.01% | $0.024123 | 15.9843 | $0.3855 | |
BSC | <0.01% | $0.001173 | 327.2916 | $0.3839 | |
BSC | <0.01% | $0.015323 | 25.0545 | $0.3839 | |
BSC | <0.01% | $0.135483 | 2.8293 | $0.3833 | |
BSC | <0.01% | $0.009968 | 38.2595 | $0.3813 | |
BSC | <0.01% | $0.000549 | 688.9062 | $0.3784 | |
BSC | <0.01% | $0.002162 | 172.6884 | $0.3733 | |
BSC | <0.01% | $0.998708 | 0.3729 | $0.3723 | |
BSC | <0.01% | $16.94 | 0.0218 | $0.37 | |
BSC | <0.01% | $0.001374 | 266.9126 | $0.3668 | |
BSC | <0.01% | $0.000061 | 6,042.674 | $0.366 | |
BSC | <0.01% | $0.000002 | 200,030.2244 | $0.3601 | |
BSC | <0.01% | $0.000065 | 5,491.7625 | $0.3563 | |
BSC | <0.01% | $0.000001 | 261,257.149 | $0.3536 | |
BSC | <0.01% | $0.375207 | 0.9342 | $0.3505 | |
BSC | <0.01% | $0.108588 | 3.1807 | $0.3453 | |
BSC | <0.01% | $0.001905 | 172.7011 | $0.329 | |
BSC | <0.01% | $0.004234 | 76.7247 | $0.3248 | |
BSC | <0.01% | <$0.000001 | 90,735,729,468.888 | $0.3229 | |
BSC | <0.01% | $0.00014 | 2,306.3974 | $0.3229 | |
BSC | <0.01% | $0.000251 | 1,286.3791 | $0.3226 | |
BSC | <0.01% | $8.89 | 0.0357 | $0.3176 | |
BSC | <0.01% | $0.000184 | 1,691.0175 | $0.3112 | |
BSC | <0.01% | $0.000767 | 402.2906 | $0.3085 | |
BSC | <0.01% | <$0.000001 | 8,834,520,443.2051 | $0.3058 | |
BSC | <0.01% | $0.001881 | 159.3116 | $0.2996 | |
BSC | <0.01% | $0.001371 | 216.0944 | $0.2963 | |
BSC | <0.01% | $0.005241 | 56.0039 | $0.2934 | |
BSC | <0.01% | $0.00001 | 27,338.415 | $0.2862 | |
BSC | <0.01% | <$0.000001 | 7,753,705.24 | $0.2842 | |
BSC | <0.01% | <$0.000001 | 787,858,329.5082 | $0.2759 | |
BSC | <0.01% | $0.005153 | 53.0251 | $0.2732 | |
BSC | <0.01% | $0.000002 | 112,145.943 | $0.2725 | |
BSC | <0.01% | $0.0037 | 72.3366 | $0.2676 | |
BSC | <0.01% | $1 | 0.2626 | $0.2634 | |
BSC | <0.01% | $0.000124 | 2,116.903 | $0.2631 | |
BSC | <0.01% | $0.000364 | 717.1716 | $0.2613 | |
BSC | <0.01% | $0.001275 | 204.9372 | $0.2612 | |
BSC | <0.01% | $0.000085 | 3,081.7101 | $0.2605 | |
BSC | <0.01% | $0.000012 | 21,629.4842 | $0.2599 | |
BSC | <0.01% | $0.00635 | 40.5029 | $0.2572 | |
BSC | <0.01% | $0.001625 | 157.8196 | $0.2565 | |
BSC | <0.01% | $0.016174 | 15.8132 | $0.2557 | |
BSC | <0.01% | $0.502279 | 0.5062 | $0.2542 | |
BSC | <0.01% | $0.506545 | 0.4964 | $0.2514 | |
BSC | <0.01% | $0.000075 | 3,320.4332 | $0.2478 | |
BSC | <0.01% | $0.001171 | 210.0506 | $0.2459 | |
BSC | <0.01% | $0.001908 | 128.9337 | $0.2459 | |
BSC | <0.01% | $0.000089 | 2,610.291 | $0.2321 | |
BSC | <0.01% | $0.080482 | 2.8508 | $0.2294 | |
BSC | <0.01% | $0.000057 | 3,969.612 | $0.2274 | |
BSC | <0.01% | <$0.000001 | 1,937,298,289.2181 | $0.2254 | |
BSC | <0.01% | $0.006491 | 34.6144 | $0.2246 | |
BSC | <0.01% | $0.003971 | 56.2119 | $0.2232 | |
BSC | <0.01% | $0.126961 | 1.7448 | $0.2215 | |
BSC | <0.01% | $0.049091 | 4.5029 | $0.221 | |
BSC | <0.01% | <$0.000001 | 142,961,981,252.553 | $0.217 | |
BSC | <0.01% | $0.137403 | 1.578 | $0.2168 | |
BSC | <0.01% | <$0.000001 | 4,703,671.3714 | $0.2148 | |
BSC | <0.01% | $0.006499 | 32.9388 | $0.214 | |
BSC | <0.01% | $0.013185 | 16.1906 | $0.2134 | |
BSC | <0.01% | $0.000051 | 4,134.4026 | $0.2128 | |
BSC | <0.01% | $0.00176 | 119.4951 | $0.2102 | |
BSC | <0.01% | $0.505826 | 0.4129 | $0.2088 | |
BSC | <0.01% | $0.000065 | 3,184.5254 | $0.2078 | |
BSC | <0.01% | $0.003887 | 53.3193 | $0.2072 | |
BSC | <0.01% | $0.000143 | 1,434.8571 | $0.2049 | |
BSC | <0.01% | $0.000314 | 651.1108 | $0.2047 | |
BSC | <0.01% | <$0.000001 | 178,200,621,868.0455 | $0.2023 | |
BSC | <0.01% | $0.288681 | 0.6922 | $0.1998 | |
BSC | <0.01% | $0.000669 | 296.4082 | $0.1982 | |
BSC | <0.01% | <$0.000001 | 107,108,695.8563 | $0.196 | |
BSC | <0.01% | <$0.000001 | 60,980,566,873.3656 | $0.1938 | |
BSC | <0.01% | $0.002377 | 80.543 | $0.1914 | |
BSC | <0.01% | $0.001969 | 96.8674 | $0.1906 | |
BSC | <0.01% | $0.005351 | 35.6259 | $0.1906 | |
BSC | <0.01% | $0.494659 | 0.3838 | $0.1898 | |
BSC | <0.01% | $0.002312 | 80.5016 | $0.186 | |
BSC | <0.01% | $0.011132 | 16.5076 | $0.1837 | |
BSC | <0.01% | $0.381185 | 0.482 | $0.1837 | |
BSC | <0.01% | $0.000001 | 166,612.4206 | $0.1832 | |
BSC | <0.01% | $0.010445 | 17.2811 | $0.1805 | |
BSC | <0.01% | $0.000874 | 205.81 | $0.1798 | |
BSC | <0.01% | <$0.000001 | 29,349,705,860,397.902 | $0.1787 | |
BSC | <0.01% | $0.000913 | 195.6052 | $0.1785 | |
BSC | <0.01% | $0.002625 | 67.47 | $0.1771 | |
BSC | <0.01% | $0.014466 | 12.0551 | $0.1743 | |
BSC | <0.01% | $0.010445 | 16.3341 | $0.1706 | |
BSC | <0.01% | <$0.000001 | 2,044,046.4128 | $0.169 | |
BSC | <0.01% | $0.000572 | 294.7965 | $0.1685 | |
BSC | <0.01% | $1.23 | 0.1356 | $0.1668 | |
BSC | <0.01% | $0.0001 | 1,634.4796 | $0.164 | |
BSC | <0.01% | $0.000018 | 9,192.7171 | $0.1638 | |
BSC | <0.01% | $0.001344 | 121.2697 | $0.1629 | |
BSC | <0.01% | <$0.000001 | 1,522,769.814 | $0.1627 | |
BSC | <0.01% | $0.061785 | 2.5973 | $0.1604 | |
BSC | <0.01% | $0.000262 | 605.8913 | $0.1584 | |
BSC | <0.01% | $0.021946 | 7.1673 | $0.1572 | |
BSC | <0.01% | $0.000466 | 336.7205 | $0.1568 | |
BSC | <0.01% | $0.000686 | 228.6794 | $0.1568 | |
BSC | <0.01% | <$0.000001 | 6,623,214,499.3628 | $0.156 | |
BSC | <0.01% | <$0.000001 | 4,992,842,843.6957 | $0.1547 | |
BSC | <0.01% | $0.000002 | 87,836.51 | $0.1519 | |
BSC | <0.01% | $0.135583 | 1.1197 | $0.1518 | |
BSC | <0.01% | $1.59 | 0.0945 | $0.1502 | |
BSC | <0.01% | $0.011406 | 13.1203 | $0.1496 | |
BSC | <0.01% | $0.000462 | 313.4938 | $0.1447 | |
BSC | <0.01% | $0.024527 | 5.89 | $0.1444 | |
BSC | <0.01% | $0.001879 | 75.5973 | $0.142 | |
BSC | <0.01% | $0.000327 | 432.5832 | $0.1416 | |
BSC | <0.01% | $17,251.96 | 0.00000814 | $0.1403 | |
BSC | <0.01% | $0.000499 | 275.477 | $0.1374 | |
BSC | <0.01% | $0.000002 | 56,106.5784 | $0.1359 | |
BSC | <0.01% | $0.000333 | 400.839 | $0.1334 | |
BSC | <0.01% | $0.003908 | 33.7508 | $0.1318 | |
BSC | <0.01% | $0.071113 | 1.8513 | $0.1316 | |
BSC | <0.01% | $0.004919 | 26.706 | $0.1313 | |
BSC | <0.01% | $0.005027 | 25.2431 | $0.1268 | |
BSC | <0.01% | $4,108.15 | 0.0000304 | $0.1248 | |
BSC | <0.01% | $0.003133 | 39.7198 | $0.1244 | |
BSC | <0.01% | $0.001667 | 73.9206 | $0.1231 | |
BSC | <0.01% | $0.008089 | 15.2063 | $0.123 | |
BSC | <0.01% | $0.015909 | 7.6089 | $0.121 | |
BSC | <0.01% | $0.000072 | 1,671.9062 | $0.1197 | |
BSC | <0.01% | $0.69829 | 0.1696 | $0.1184 | |
BSC | <0.01% | $18.92 | 0.00625899 | $0.1184 | |
BSC | <0.01% | $0.004425 | 26.7266 | $0.1182 | |
BSC | <0.01% | $0.000673 | 173.4258 | $0.1167 | |
BSC | <0.01% | $0.000002 | 67,773.5898 | $0.113 | |
BSC | <0.01% | $0.000079 | 1,402.4085 | $0.1105 | |
BSC | <0.01% | $0.000501 | 220.3353 | $0.1104 | |
BSC | <0.01% | $0.00569 | 19.2239 | $0.1093 | |
BSC | <0.01% | $0.000053 | 2,024.4777 | $0.1073 | |
BSC | <0.01% | $0.000029 | 3,661.0496 | $0.107 | |
BSC | <0.01% | $0.001013 | 102.8241 | $0.1042 | |
BSC | <0.01% | $0.002229 | 45.7766 | $0.102 | |
BSC | <0.01% | $0.020007 | 5.0928 | $0.1018 | |
BSC | <0.01% | $0.000043 | 2,329.5762 | $0.1006 | |
BSC | <0.01% | $0.000001 | 187,052.1974 | $0.1005 | |
BSC | <0.01% | $0.598284 | 0.1681 | $0.1005 | |
BSC | BNB Chain (BNB) | <0.01% | $720.09 | 0.00000119 | $0.000859 |
ETH | <0.01% | $1 | 98,687.668 | $98,885.04 | |
ETH | <0.01% | $3,988.69 | 19.1914 | $76,548.38 | |
ETH | <0.01% | $1 | 23,683.7599 | $23,731.13 | |
ETH | <0.01% | $1 | 11,146.3354 | $11,168.63 | |
ETH | <0.01% | $93,963,307,115.72 | 0.000000081508 | $7,658.74 | |
ETH | <0.01% | $218.18 | 25.3004 | $5,520.03 | |
ETH | <0.01% | $0.368578 | 13,209.396 | $4,868.69 | |
ETH | <0.01% | $719.41 | 3.6691 | $2,639.55 | |
ETH | <0.01% | $0.03493 | 53,341.1513 | $1,863.23 | |
ETH | <0.01% | $0.002147 | 691,928.9842 | $1,485.68 | |
ETH | <0.01% | $0.808733 | 1,621.8904 | $1,311.68 | |
ETH | <0.01% | $2,660.07 | 0.4823 | $1,283.08 | |
ETH | <0.01% | $1.19 | 897.9186 | $1,068.52 | |
ETH | <0.01% | $0.000001 | 706,618,955.3531 | $1,003.4 | |
ETH | <0.01% | $0.094184 | 10,652.9405 | $1,003.33 | |
ETH | <0.01% | $0.000001 | 1,571,655,509.3185 | $965.73 | |
ETH | <0.01% | $0.297947 | 3,137.7841 | $934.89 | |
ETH | <0.01% | $0.007368 | 125,712.3495 | $926.23 | |
ETH | <0.01% | $1 | 917.5066 | $920.26 | |
ETH | <0.01% | $0.000003 | 290,776,219.4243 | $872.14 | |
ETH | <0.01% | $0.058951 | 14,752.4576 | $869.67 | |
ETH | <0.01% | $0.034735 | 24,434.0497 | $848.72 | |
ETH | <0.01% | <$0.000001 | 5,838,570,864.4691 | $838.01 | |
ETH | <0.01% | <$0.000001 | 57,872,904,567.3034 | $836.21 | |
ETH | <0.01% | $103,210 | 0.00801002 | $826.71 | |
ETH | <0.01% | $2.58 | 317.4597 | $819.05 | |
ETH | <0.01% | $28.87 | 28.3259 | $817.77 | |
ETH | <0.01% | $0.120568 | 6,667.6634 | $803.91 | |
ETH | <0.01% | $0.004797 | 166,315.12 | $797.83 | |
ETH | <0.01% | $0.156596 | 5,072.3775 | $794.31 | |
ETH | <0.01% | $0.483731 | 1,603.681 | $775.75 | |
ETH | <0.01% | $0.000024 | 32,516,145.0185 | $767.06 | |
ETH | <0.01% | $8.08 | 92.6571 | $749.03 | |
ETH | <0.01% | $3.26 | 228.0515 | $743.45 | |
ETH | <0.01% | $0.628248 | 1,180.6175 | $741.72 | |
ETH | <0.01% | $4.63 | 159.4726 | $738.36 | |
ETH | <0.01% | $0.000043 | 17,115,736.699 | $734.45 | |
ETH | <0.01% | <$0.000001 | 5,750,068,115.3569 | $727.34 | |
ETH | <0.01% | $14.99 | 48.3984 | $725.49 | |
ETH | <0.01% | $0.742574 | 974.9571 | $723.98 | |
ETH | <0.01% | $133.17 | 5.4335 | $723.58 | |
ETH | <0.01% | $5.52 | 130.9723 | $722.97 | |
ETH | <0.01% | $2,666.36 | 0.2707 | $721.83 | |
ETH | <0.01% | $0.008805 | 81,686.0401 | $719.22 | |
ETH | <0.01% | $0.000026 | 26,902,642.2468 | $712.8 | |
ETH | <0.01% | $0.160087 | 4,394.6085 | $703.52 | |
ETH | <0.01% | $1.99 | 353.6514 | $702.86 | |
ETH | <0.01% | $0.198272 | 3,505.6027 | $695.06 | |
ETH | <0.01% | $2.11 | 327.4492 | $690.92 | |
ETH | <0.01% | $1.11 | 618.0448 | $686.03 | |
ETH | <0.01% | $0.000001 | 803,519,119.8301 | $684.49 | |
ETH | <0.01% | $0.066233 | 10,309.4222 | $682.82 | |
ETH | <0.01% | <$0.000001 | 4,872,480,320.6292 | $682.32 | |
ETH | <0.01% | $2.7 | 251.8053 | $679.87 | |
ETH | <0.01% | <$0.000001 | 1,931,667,293.5591 | $677.99 | |
ETH | <0.01% | $0.049251 | 13,417.4491 | $660.83 | |
ETH | <0.01% | $0.001322 | 499,156.8326 | $659.88 | |
ETH | <0.01% | $2.19 | 296.5279 | $649.4 | |
ETH | <0.01% | $87.63 | 7.3657 | $645.45 | |
ETH | <0.01% | $0.293806 | 2,173.5557 | $638.6 | |
ETH | <0.01% | $0.331703 | 1,921.3829 | $637.33 | |
ETH | <0.01% | $2.04 | 312.3181 | $637.13 | |
ETH | <0.01% | $0.046021 | 13,778.6708 | $634.11 | |
ETH | <0.01% | <$0.000001 | 19,906,364,902.1139 | $633.7 | |
ETH | <0.01% | $9.45 | 66.4204 | $627.67 | |
ETH | <0.01% | $0.005481 | 114,369.2497 | $626.81 | |
ETH | <0.01% | $0.07882 | 7,867.1476 | $620.09 | |
ETH | <0.01% | $0.101637 | 6,077.0573 | $617.65 | |
ETH | <0.01% | $1.21 | 507.659 | $614.27 | |
ETH | <0.01% | $0.445264 | 1,375.3022 | $612.37 | |
ETH | <0.01% | $0.005663 | 106,209.1756 | $601.49 | |
ETH | <0.01% | $2.11 | 283.1885 | $597.53 | |
ETH | <0.01% | $1.14 | 522.4328 | $595.57 | |
ETH | <0.01% | $57.39 | 10.2999 | $591.11 | |
ETH | <0.01% | $0.016014 | 36,384.1157 | $582.64 | |
ETH | <0.01% | $0.013049 | 44,248.6174 | $577.41 | |
ETH | <0.01% | $0.011717 | 49,108.7 | $575.39 | |
ETH | <0.01% | $0.177166 | 3,240.6587 | $574.13 | |
ETH | <0.01% | <$0.000001 | 7,457,275,061.8036 | $571.15 | |
ETH | <0.01% | $0.000004 | 158,592,387.2321 | $570.93 | |
ETH | <0.01% | $0.000088 | 6,393,784.499 | $562.97 | |
ETH | <0.01% | $0.51245 | 1,066.6828 | $546.62 | |
ETH | <0.01% | $0.079507 | 6,750.8218 | $536.74 | |
ETH | <0.01% | $0.027329 | 19,504.8604 | $533.06 | |
ETH | <0.01% | $0.000407 | 1,304,307.0184 | $531 | |
ETH | <0.01% | $0.13817 | 3,806.3677 | $525.93 | |
ETH | <0.01% | $0.722738 | 726.851 | $525.32 | |
ETH | <0.01% | $3.95 | 132.2041 | $522.21 | |
ETH | <0.01% | $0.256504 | 2,035.5759 | $522.13 | |
ETH | <0.01% | $48.79 | 10.6909 | $521.61 | |
ETH | <0.01% | $20.97 | 24.8728 | $521.58 | |
ETH | <0.01% | $0.000157 | 3,323,026.3983 | $520.62 | |
ETH | <0.01% | $0.000033 | 15,563,289.6781 | $511.41 | |
ETH | <0.01% | $0.000006 | 86,434,022.7095 | $510.83 | |
ETH | <0.01% | $0.000012 | 41,972,945.8811 | $509.55 | |
ETH | <0.01% | $0.165329 | 3,076.1239 | $508.57 | |
ETH | <0.01% | $0.00017 | 2,975,693.8576 | $507.3 | |
ETH | <0.01% | $0.032846 | 15,239.1019 | $500.54 | |
ETH | <0.01% | $1.85 | 269.9952 | $498.93 | |
ETH | <0.01% | $0.000027 | 18,291,677.9855 | $498.81 | |
ETH | <0.01% | $0.379169 | 1,291.7621 | $489.8 | |
ETH | <0.01% | $2.88 | 169.9907 | $489.57 | |
ETH | <0.01% | $0.064953 | 7,532.8471 | $489.28 | |
ETH | <0.01% | $1.22 | 401.197 | $489.07 | |
ETH | <0.01% | $0.927202 | 523.0085 | $484.93 | |
ETH | <0.01% | $0.001793 | 269,928.9014 | $484 | |
ETH | <0.01% | $105,869 | 0.00450706 | $477.16 | |
ETH | <0.01% | $1.71 | 277.6083 | $474.71 | |
ETH | <0.01% | $0.000001 | 364,552,834.0513 | $472.53 | |
ETH | <0.01% | $0.000044 | 10,835,757.5825 | $471.79 | |
ETH | <0.01% | $1.84 | 252.8605 | $465.54 | |
ETH | <0.01% | $10,757.52 | 0.0432 | $465.07 | |
ETH | <0.01% | $0.048248 | 9,632.0523 | $464.73 | |
ETH | <0.01% | $545.55 | 0.8496 | $463.49 | |
ETH | <0.01% | $0.044435 | 10,409.681 | $462.55 | |
ETH | <0.01% | $0.351232 | 1,309.9867 | $460.11 | |
ETH | <0.01% | $0.000852 | 539,189.1334 | $459.65 | |
ETH | <0.01% | $2.03 | 225.726 | $458.22 | |
ETH | <0.01% | <$0.000001 | 1,451,002,143.8773 | $457.51 | |
ETH | <0.01% | $5.41 | 83.9069 | $453.91 | |
ETH | <0.01% | $3.52 | 128.2782 | $451.19 | |
ETH | <0.01% | $0.142808 | 3,157.2134 | $450.87 | |
ETH | <0.01% | $0.276432 | 1,623.4376 | $448.77 | |
ETH | <0.01% | $0.006848 | 65,505.0561 | $448.6 | |
ETH | <0.01% | $0.202584 | 2,184.7489 | $442.6 | |
ETH | <0.01% | $0.00775 | 56,993.3538 | $441.68 | |
ETH | <0.01% | $0.002468 | 177,482.3845 | $437.95 | |
ETH | <0.01% | $0.561412 | 779.0113 | $437.35 | |
ETH | <0.01% | $0.000948 | 458,477.9835 | $434.82 | |
ETH | <0.01% | $0.025585 | 16,918.4354 | $432.85 | |
ETH | <0.01% | $0.741638 | 581.1071 | $430.97 | |
ETH | <0.01% | $0.267643 | 1,583.5831 | $423.83 | |
ETH | <0.01% | $0.000551 | 758,546.6365 | $417.86 | |
ETH | <0.01% | $0.005661 | 73,746.6944 | $417.46 | |
ETH | <0.01% | $0.401031 | 1,039.7082 | $416.95 | |
ETH | <0.01% | $0.073197 | 5,691.6153 | $416.61 | |
ETH | <0.01% | $0.00005 | 8,221,671.1975 | $414.54 | |
ETH | <0.01% | $0.564115 | 732.5616 | $413.25 | |
ETH | <0.01% | <$0.000001 | 954,840,816.6041 | $412.46 | |
ETH | <0.01% | <$0.000001 | 1,551,453,600,217.5977 | $410.19 | |
ETH | <0.01% | $0.331935 | 1,234.4814 | $409.77 | |
ETH | <0.01% | $45.62 | 8.9103 | $406.49 | |
ETH | <0.01% | $0.1754 | 2,278.7438 | $399.69 | |
ETH | <0.01% | $0.093492 | 4,274.7943 | $399.66 | |
ETH | <0.01% | <$0.000001 | 33,108,984,804.9261 | $397.6 | |
ETH | <0.01% | <$0.000001 | 15,499,615,787.697 | $394.79 | |
ETH | <0.01% | $1 | 390.5425 | $391.32 | |
ETH | <0.01% | $0.267908 | 1,449.0068 | $388.2 | |
ETH | <0.01% | $0.000259 | 1,494,289.2239 | $386.35 | |
ETH | <0.01% | <$0.000001 | 33,342,870,648.3208 | $386 | |
ETH | <0.01% | $0.162328 | 2,376.3799 | $385.75 | |
ETH | <0.01% | $2.87 | 134.2942 | $385.42 | |
ETH | <0.01% | $0.007149 | 53,357.27 | $381.46 | |
ETH | <0.01% | $1.83 | 208.2907 | $381.17 | |
ETH | <0.01% | $0.001272 | 298,692.112 | $379.82 | |
ETH | <0.01% | $0.596485 | 631.6951 | $376.8 | |
ETH | <0.01% | $0.054366 | 6,928.2958 | $376.66 | |
ETH | <0.01% | $1.6 | 234.8253 | $375.72 | |
ETH | <0.01% | $0.002576 | 145,813.42 | $375.63 | |
ETH | <0.01% | $0.000006 | 61,368,903.8244 | $374.59 | |
ETH | <0.01% | $0.008346 | 44,741.6581 | $373.42 | |
ETH | <0.01% | $0.596977 | 624.4553 | $372.79 | |
ETH | <0.01% | $0.396321 | 940.528 | $372.75 | |
ETH | <0.01% | $1.31 | 282.9627 | $370.68 | |
ETH | <0.01% | <$0.000001 | 3,910,464,487.6695 | $368.32 | |
ETH | <0.01% | $0.000966 | 379,913.1234 | $366.93 | |
ETH | <0.01% | $0.660438 | 552.365 | $364.8 | |
ETH | <0.01% | $0.719088 | 505.6829 | $363.63 | |
ETH | <0.01% | $718.99 | 0.5041 | $362.44 | |
ETH | <0.01% | $0.317084 | 1,143.0068 | $362.43 | |
ETH | <0.01% | $0.045624 | 7,940.083 | $362.26 | |
ETH | <0.01% | $0.023723 | 15,257.612 | $361.95 | |
ETH | <0.01% | $0.093566 | 3,837.1672 | $359.03 | |
ETH | <0.01% | $0.117812 | 3,041.7315 | $358.35 | |
ETH | <0.01% | $0.001399 | 255,184.7272 | $357.05 | |
ETH | <0.01% | $0.148932 | 2,388.1216 | $355.67 | |
ETH | <0.01% | $3,993.25 | 0.0888 | $354.78 | |
ETH | <0.01% | $2 | 176.5455 | $353.09 | |
ETH | <0.01% | $0.408865 | 863.4994 | $353.05 | |
ETH | <0.01% | $0.00011 | 3,189,097.7786 | $350.23 | |
ETH | <0.01% | $2.49 | 139.575 | $347.77 | |
ETH | <0.01% | $3.52 | 98.3853 | $346.32 | |
ETH | <0.01% | $0.36713 | 940.3132 | $345.22 | |
ETH | <0.01% | $0.032663 | 10,527.4717 | $343.86 | |
ETH | <0.01% | $0.492083 | 697.1547 | $343.06 | |
ETH | <0.01% | $13.12 | 26.0399 | $341.64 | |
ETH | <0.01% | <$0.000001 | 1,472,959,829.9979 | $341.18 | |
ETH | <0.01% | $0.010087 | 33,821.3658 | $341.16 | |
ETH | <0.01% | $0.01318 | 25,699.0188 | $338.7 | |
ETH | <0.01% | $0.004734 | 71,088.1754 | $336.52 | |
ETH | <0.01% | $6.53 | 50.9673 | $332.82 | |
ETH | <0.01% | $1.59 | 208.6846 | $331.81 | |
ETH | <0.01% | $0.005887 | 56,207.5238 | $330.87 | |
ETH | <0.01% | $7.6 | 43.1512 | $327.95 | |
ETH | <0.01% | $0.009184 | 35,650.8197 | $327.42 | |
ETH | <0.01% | $0.002187 | 149,382.7344 | $326.67 | |
ETH | <0.01% | $15.22 | 21.3623 | $325.13 | |
ETH | <0.01% | $1.55 | 207.9558 | $322.33 | |
ETH | <0.01% | $0.006358 | 50,686.6882 | $322.25 | |
ETH | <0.01% | $0.000032 | 10,163,976.261 | $320.37 | |
ETH | <0.01% | $0.047505 | 6,742.6394 | $320.31 | |
ETH | <0.01% | $0.008057 | 39,721.7681 | $320.02 | |
ETH | <0.01% | $0.429538 | 741.5915 | $318.54 | |
ETH | <0.01% | $0.15342 | 2,073.603 | $318.13 | |
ETH | <0.01% | $0.054431 | 5,824.1712 | $317.02 | |
ETH | <0.01% | $0.011554 | 27,359.5807 | $316.12 | |
ETH | <0.01% | $0.000014 | 22,733,014.4184 | $314.4 | |
ETH | <0.01% | $0.085704 | 3,627.9561 | $310.93 | |
ETH | <0.01% | $0.13626 | 2,252.7416 | $306.96 | |
ETH | <0.01% | $3.38 | 90.6115 | $306.27 | |
ETH | <0.01% | $0.014443 | 21,060.5975 | $304.17 | |
ETH | <0.01% | $0.792975 | 383.4887 | $304.1 | |
ETH | <0.01% | $0.094253 | 3,219.0552 | $303.4 | |
ETH | <0.01% | $0.71685 | 419.4545 | $300.69 | |
ETH | <0.01% | $0.026108 | 11,482.9917 | $299.8 | |
ETH | <0.01% | $0.446494 | 670.7732 | $299.5 | |
ETH | <0.01% | $0.037799 | 7,853.9486 | $296.87 | |
ETH | <0.01% | $0.234586 | 1,259.837 | $295.54 | |
ETH | <0.01% | $0.013384 | 21,761.6507 | $291.26 | |
ETH | <0.01% | $2.14 | 135.2971 | $289.69 | |
ETH | <0.01% | $0.602688 | 480.3721 | $289.51 | |
ETH | <0.01% | $0.009711 | 29,720.8295 | $288.62 | |
ETH | <0.01% | $2.25 | 128.2055 | $288.46 | |
ETH | <0.01% | $0.022753 | 12,549.7593 | $285.55 | |
ETH | <0.01% | $1.2 | 236.9528 | $284.34 | |
ETH | <0.01% | $0.000471 | 599,866.4305 | $282.83 | |
ETH | <0.01% | $0.00001 | 27,590,125.2738 | $276.45 | |
ETH | <0.01% | $0.092213 | 2,996.6782 | $276.33 | |
ETH | <0.01% | $0.000031 | 9,012,906.0577 | $276.07 | |
ETH | <0.01% | $0.654683 | 421.5505 | $275.98 | |
ETH | <0.01% | $1.91 | 144.25 | $275.52 | |
ETH | <0.01% | $0.008338 | 32,988.8997 | $275.06 | |
ETH | <0.01% | $0.145036 | 1,891.6935 | $274.36 | |
ETH | <0.01% | $6.31 | 43.3418 | $273.49 | |
ETH | <0.01% | <$0.000001 | 20,723,101,971.9037 | $273.3 | |
ETH | <0.01% | $2.53 | 107.8445 | $272.85 | |
ETH | <0.01% | $105.71 | 2.5597 | $270.59 | |
ETH | <0.01% | $0.215776 | 1,247.0272 | $269.08 | |
ETH | <0.01% | $16.32 | 16.4064 | $267.75 | |
ETH | <0.01% | $0.000738 | 361,822.7887 | $267.03 | |
ETH | <0.01% | <$0.000001 | 100,574,979,224.4075 | $258.87 | |
ETH | <0.01% | $0.003821 | 66,272.0951 | $253.23 | |
ETH | <0.01% | $0.12159 | 2,037.0349 | $247.68 | |
ETH | <0.01% | $0.433796 | 569.6706 | $247.12 | |
ETH | <0.01% | <$0.000001 | 8,382,844,694,473,654 | $244.4 | |
ETH | <0.01% | $0.178206 | 1,365.1039 | $243.27 | |
ETH | <0.01% | $1.71 | 140.3235 | $239.98 | |
ETH | <0.01% | $0.117449 | 2,039.6146 | $239.55 | |
ETH | <0.01% | $0.030959 | 7,621.8713 | $235.96 | |
ETH | <0.01% | <$0.000001 | 1,349,272,251,619.5793 | $235.89 | |
ETH | <0.01% | $0.00172 | 136,246.3201 | $234.38 | |
ETH | <0.01% | $3.01 | 77.7549 | $234.04 | |
ETH | <0.01% | $0.036601 | 6,373.3436 | $233.27 | |
ETH | <0.01% | $2.9 | 79.7651 | $231.34 | |
ETH | <0.01% | $0.084583 | 2,717.2591 | $229.83 | |
ETH | <0.01% | $0.242085 | 948.1782 | $229.54 | |
ETH | <0.01% | $0.000011 | 20,367,574.7314 | $228.32 | |
ETH | <0.01% | $365.57 | 0.6226 | $227.6 | |
ETH | <0.01% | $0.016108 | 14,124.4362 | $227.52 | |
ETH | <0.01% | $1.9 | 119.7343 | $227.5 | |
ETH | <0.01% | <$0.000001 | 10,855,009,779.6488 | $225.55 | |
ETH | <0.01% | $0.003097 | 72,818.862 | $225.54 | |
ETH | <0.01% | $0.170687 | 1,307.8686 | $223.24 | |
ETH | <0.01% | $0.003058 | 72,952.3802 | $223.09 | |
ETH | <0.01% | $0.606606 | 360.3042 | $218.56 | |
ETH | <0.01% | $0.050883 | 4,279.4182 | $217.75 | |
ETH | <0.01% | <$0.000001 | 10,478,898,076.4503 | $217.51 | |
ETH | <0.01% | $28.49 | 7.5994 | $216.53 | |
ETH | <0.01% | $0.007934 | 27,291.1529 | $216.52 | |
ETH | <0.01% | $0.84349 | 254.6682 | $214.81 | |
ETH | <0.01% | $0.055268 | 3,881.2245 | $214.51 | |
ETH | <0.01% | $0.000046 | 4,668,738.565 | $214.06 | |
ETH | <0.01% | $0.00188 | 111,951.0476 | $210.46 | |
ETH | <0.01% | $0.002569 | 81,902.8851 | $210.41 | |
ETH | <0.01% | $12.06 | 17.1591 | $206.94 | |
ETH | <0.01% | $0.027696 | 7,384.0953 | $204.51 | |
ETH | <0.01% | $1.28 | 158.6 | $203.58 | |
ETH | <0.01% | $25.83 | 7.8805 | $203.55 | |
ETH | <0.01% | $0.029101 | 6,938.2023 | $201.91 | |
ETH | <0.01% | $1.01 | 199.333 | $200.93 | |
ETH | <0.01% | $0.041483 | 4,829.1116 | $200.33 | |
ETH | <0.01% | $0.076611 | 2,607.5785 | $199.77 | |
ETH | <0.01% | $2.44 | 81.6123 | $199.13 | |
ETH | <0.01% | $0.566934 | 348.2069 | $197.41 | |
ETH | <0.01% | <$0.000001 | 5,825,017,311.4648 | $197.31 | |
ETH | <0.01% | $0.000019 | 10,379,531.9675 | $196.46 | |
ETH | <0.01% | $0.036122 | 5,438.7733 | $196.46 | |
ETH | <0.01% | $0.367337 | 534.5707 | $196.37 | |
ETH | <0.01% | <$0.000001 | 44,882,008,500.851 | $195.6 | |
ETH | <0.01% | $0.000004 | 49,667,981.6097 | $195.12 | |
ETH | <0.01% | $2.62 | 73.8775 | $193.56 | |
ETH | <0.01% | <$0.000001 | 710,380,909.447 | $192.83 | |
ETH | <0.01% | $1.14 | 168.0298 | $191.55 | |
ETH | <0.01% | $21.35 | 8.8504 | $188.96 | |
ETH | <0.01% | $0.054164 | 3,470.6946 | $187.99 | |
ETH | <0.01% | $0.041727 | 4,499.74 | $187.76 | |
ETH | <0.01% | $0.41114 | 453.679 | $186.53 | |
ETH | <0.01% | $0.032292 | 5,752.8468 | $185.77 | |
ETH | <0.01% | $0.999457 | 185.7354 | $185.63 | |
ETH | <0.01% | $0.352127 | 526.9939 | $185.57 | |
ETH | <0.01% | $0.152843 | 1,211.1743 | $185.12 | |
ETH | <0.01% | $0.00023 | 801,587.1705 | $184.34 | |
ETH | <0.01% | $0.065331 | 2,818.3836 | $184.13 | |
ETH | <0.01% | $0.375251 | 487.174 | $182.81 | |
ETH | <0.01% | $0.437496 | 417.6157 | $182.71 | |
ETH | <0.01% | $0.591853 | 306.7617 | $181.56 | |
ETH | <0.01% | $0.213097 | 851.3888 | $181.43 | |
ETH | <0.01% | $0.273752 | 662.4027 | $181.33 | |
ETH | <0.01% | <$0.000001 | 2,696,328,555,659.0513 | $180.35 | |
ETH | <0.01% | $2.88 | 62.1215 | $178.91 | |
ETH | <0.01% | $0.22801 | 770.0126 | $175.57 | |
ETH | <0.01% | $16.28 | 10.724 | $174.59 | |
ETH | <0.01% | $97.8 | 1.7766 | $173.76 | |
ETH | <0.01% | $12.63 | 13.5535 | $171.18 | |
ETH | <0.01% | $1.51 | 111.9774 | $169.09 | |
ETH | <0.01% | $18.94 | 8.9013 | $168.59 | |
ETH | <0.01% | $0.109031 | 1,543.435 | $168.28 | |
ETH | <0.01% | $0.034913 | 4,805.8008 | $167.78 | |
ETH | <0.01% | $0.01729 | 9,690.3351 | $167.55 | |
ETH | <0.01% | $0.042434 | 3,940.0297 | $167.19 | |
ETH | <0.01% | $1 | 166.58 | $166.91 | |
ETH | <0.01% | $0.000785 | 210,106.3797 | $164.94 | |
ETH | <0.01% | $0.626697 | 260.9844 | $163.56 | |
ETH | <0.01% | $0.786151 | 207.572 | $163.18 | |
ETH | <0.01% | $0.097424 | 1,668.7192 | $162.57 | |
ETH | <0.01% | $0.310214 | 522.6443 | $162.13 | |
ETH | <0.01% | <$0.000001 | 572,773,764.4941 | $161.95 | |
ETH | <0.01% | $0.277569 | 582.2677 | $161.62 | |
ETH | <0.01% | $0.07523 | 2,146.2574 | $161.46 | |
ETH | <0.01% | $0.323742 | 493.4656 | $159.76 | |
ETH | <0.01% | $0.00725 | 22,015.5221 | $159.6 | |
ETH | <0.01% | $0.369308 | 431.5256 | $159.37 | |
ETH | <0.01% | $0.919514 | 172.9411 | $159.02 | |
ETH | <0.01% | $8.35 | 19.048 | $159.01 | |
ETH | <0.01% | $0.001498 | 106,153.8496 | $159 | |
ETH | <0.01% | $0.000002 | 102,967,545.4035 | $158.57 | |
ETH | <0.01% | $0.920351 | 171.7574 | $158.08 | |
ETH | <0.01% | $0.628367 | 251.064 | $157.76 | |
ETH | <0.01% | $0.060692 | 2,585.4942 | $156.92 | |
ETH | <0.01% | $8.92 | 17.4444 | $155.6 | |
ETH | <0.01% | $21.63 | 7.1737 | $155.17 | |
ETH | <0.01% | $0.011467 | 13,405.1536 | $153.72 | |
ETH | <0.01% | $0.0328 | 4,684.3085 | $153.65 | |
ETH | <0.01% | $0.359372 | 425.6904 | $152.98 | |
ETH | <0.01% | $0.070021 | 2,178.4448 | $152.54 | |
ETH | <0.01% | $0.000003 | 50,172,283.422 | $151.5 | |
ETH | <0.01% | $0.000042 | 3,564,447.9861 | $150.74 | |
ETH | <0.01% | $74.49 | 2.0222 | $150.63 | |
ETH | <0.01% | $3.56 | 42.1724 | $150.13 | |
ETH | <0.01% | $0.000299 | 498,830.5146 | $149.31 | |
ETH | <0.01% | $0.000029 | 5,230,285.2164 | $149.06 | |
ETH | <0.01% | $3.45 | 43.1162 | $148.75 | |
ETH | <0.01% | $0.034187 | 4,335.186 | $148.21 | |
ETH | <0.01% | $847.76 | 0.1745 | $147.95 | |
ETH | <0.01% | $0.000431 | 342,500.3548 | $147.65 | |
ETH | <0.01% | $0.000017 | 8,635,024.9065 | $147.15 | |
ETH | <0.01% | $0.000017 | 8,359,945.3991 | $145.02 | |
ETH | <0.01% | $0.205097 | 705.9826 | $144.79 | |
ETH | <0.01% | $0.000001 | 100,353,329.4412 | $143.34 | |
ETH | <0.01% | $1.26 | 113.7151 | $143.28 | |
ETH | <0.01% | $1.89 | 75.4622 | $142.62 | |
ETH | <0.01% | <$0.000001 | 3,032,100,495.4453 | $141.84 | |
ETH | <0.01% | $0.014002 | 10,090.42 | $141.29 | |
ETH | <0.01% | $0.301179 | 469.0528 | $141.27 | |
ETH | <0.01% | $1.72 | 81.8727 | $140.82 | |
ETH | <0.01% | $0.040922 | 3,397.463 | $139.03 | |
ETH | <0.01% | $0.062388 | 2,220.5977 | $138.54 | |
ETH | <0.01% | $0.006963 | 19,754.4278 | $137.55 | |
ETH | <0.01% | $0.171292 | 802.5252 | $137.47 | |
ETH | <0.01% | $0.000001 | 104,037,152.9912 | $136.67 | |
ETH | <0.01% | <$0.000001 | 1,568,055,154.7194 | $135.76 | |
ETH | <0.01% | $0.000007 | 18,791,317.0513 | $135.08 | |
ETH | <0.01% | $1.39 | 97.1416 | $135.03 | |
ETH | <0.01% | $0.00606 | 22,261.0333 | $134.89 | |
ETH | <0.01% | $0.01591 | 8,407.6628 | $133.76 | |
ETH | <0.01% | $0.481597 | 276.2603 | $133.05 | |
ETH | <0.01% | $0.042623 | 3,097.9625 | $132.04 | |
ETH | <0.01% | $0.030322 | 4,348.2846 | $131.85 | |
ETH | <0.01% | $0.001287 | 101,867.685 | $131.14 | |
ETH | <0.01% | $0.000005 | 26,175,044.5426 | $131.14 | |
ETH | <0.01% | $13.12 | 9.9813 | $130.95 | |
ETH | <0.01% | $0.000081 | 1,597,388.6858 | $129.95 | |
ETH | <0.01% | $0.105953 | 1,226.3598 | $129.94 | |
ETH | <0.01% | $0.001973 | 65,813.8161 | $129.85 | |
ETH | <0.01% | $0.108901 | 1,191.8848 | $129.8 | |
ETH | <0.01% | $0.341111 | 379.7712 | $129.54 | |
ETH | <0.01% | <$0.000001 | 6,883,948,068.2577 | $129.45 | |
ETH | <0.01% | $0.001565 | 82,378.3427 | $128.88 | |
ETH | <0.01% | $0.031979 | 4,009.0103 | $128.2 | |
ETH | <0.01% | $0.000554 | 230,242.1867 | $127.51 | |
ETH | <0.01% | $0.290469 | 430.4417 | $125.03 | |
ETH | <0.01% | $0.072913 | 1,713.4308 | $124.93 | |
ETH | <0.01% | $0.012167 | 10,209.3582 | $124.22 | |
ETH | <0.01% | $0.349895 | 352.2335 | $123.24 | |
ETH | <0.01% | $0.020569 | 5,948.1683 | $122.35 | |
ETH | <0.01% | $0.000014 | 8,790,204.6889 | $121.66 | |
ETH | <0.01% | $1.07 | 113.436 | $121.51 | |
ETH | <0.01% | $0.006107 | 19,798.1249 | $120.9 | |
ETH | <0.01% | $0.040655 | 2,973.8075 | $120.9 | |
ETH | <0.01% | <$0.000001 | 863,664,644.895 | $119.81 | |
ETH | <0.01% | $0.001292 | 92,585.5925 | $119.58 | |
ETH | <0.01% | $0.595189 | 200.3906 | $119.27 | |
ETH | <0.01% | $0.511534 | 232.1315 | $118.74 | |
ETH | <0.01% | $23.09 | 5.1288 | $118.43 | |
ETH | <0.01% | $0.09098 | 1,296.0026 | $117.91 | |
ETH | <0.01% | $392.01 | 0.2984 | $116.96 | |
ETH | <0.01% | $1.06 | 110.71 | $116.8 | |
ETH | <0.01% | <$0.000001 | 6,936,313,046.164 | $116.73 | |
ETH | <0.01% | $0.498934 | 233.8198 | $116.66 | |
ETH | <0.01% | <$0.000001 | 21,982,112,184.2612 | $116.59 | |
ETH | <0.01% | $0.002418 | 48,158.7566 | $116.45 | |
ETH | <0.01% | $2.97 | 38.8124 | $115.27 | |
ETH | <0.01% | $0.784102 | 146.3461 | $114.75 | |
ETH | <0.01% | $0.138361 | 829.0215 | $114.7 | |
ETH | <0.01% | $1.01 | 112.1719 | $112.84 | |
ETH | <0.01% | $53.81 | 2.0889 | $112.41 | |
ETH | <0.01% | $0.008049 | 13,923.6564 | $112.07 | |
ETH | <0.01% | $0.032744 | 3,401.7409 | $111.39 | |
ETH | <0.01% | $0.157469 | 706.9149 | $111.32 | |
ETH | <0.01% | $10.52 | 10.5723 | $111.22 | |
ETH | <0.01% | $0.000006 | 18,000,105.139 | $110.63 | |
ETH | <0.01% | $0.187382 | 589.0115 | $110.37 | |
ETH | <0.01% | $0.001468 | 74,465.8424 | $109.34 | |
ETH | <0.01% | $0.000018 | 6,088,649.536 | $108.74 | |
ETH | <0.01% | $38.02 | 2.86 | $108.74 | |
ETH | <0.01% | $0.029452 | 3,687.351 | $108.6 | |
ETH | <0.01% | $0.031043 | 3,491.4436 | $108.38 | |
ETH | <0.01% | $0.131935 | 815.6147 | $107.61 | |
ETH | <0.01% | $0.006855 | 15,691.5965 | $107.57 | |
ETH | <0.01% | $0.033871 | 3,169.4967 | $107.35 | |
ETH | <0.01% | $0.167268 | 636.6961 | $106.5 | |
ETH | <0.01% | $49.68 | 2.141 | $106.37 | |
ETH | <0.01% | $0.008404 | 12,627.1971 | $106.11 | |
ETH | <0.01% | $495.46 | 0.2138 | $105.93 | |
ETH | <0.01% | $0.000004 | 25,612,149.9274 | $105.54 | |
ETH | <0.01% | $10.15 | 10.3936 | $105.48 | |
ETH | <0.01% | $0.000193 | 544,203.5844 | $105.16 | |
ETH | <0.01% | $0.243947 | 430.2528 | $104.96 | |
ETH | <0.01% | $0.061413 | 1,703.0511 | $104.59 | |
ETH | <0.01% | $1.35 | 77.4128 | $104.51 | |
ETH | <0.01% | $0.000403 | 256,905.9793 | $103.49 | |
ETH | <0.01% | $2.96 | 34.6502 | $102.56 | |
ETH | <0.01% | $0.089603 | 1,142.1603 | $102.34 | |
ETH | <0.01% | $0.095914 | 1,066.5633 | $102.3 | |
ETH | <0.01% | $0.008963 | 11,389.5997 | $102.08 | |
ETH | <0.01% | $7.41 | 13.7516 | $101.9 | |
ETH | <0.01% | $4,224.89 | 0.0238 | $100.71 | |
ETH | <0.01% | $0.000057 | 1,743,051.7099 | $100.21 | |
ETH | <0.01% | $0.186522 | 532.7925 | $99.38 | |
ETH | <0.01% | $9.4 | 10.5714 | $99.38 | |
ETH | <0.01% | $0.064506 | 1,537.6136 | $99.18 | |
ETH | <0.01% | $0.000412 | 240,610.3987 | $99.14 | |
ETH | <0.01% | $0.170456 | 580.8299 | $99.01 | |
ETH | <0.01% | $0.112954 | 868.7784 | $98.13 | |
ETH | <0.01% | $6.63 | 14.7011 | $97.47 | |
ETH | <0.01% | <$0.000001 | 22,316,195,360.5331 | $96.47 | |
ETH | <0.01% | <$0.000001 | 484,734,144.8212 | $96.2 | |
ETH | <0.01% | $0.199508 | 476.4484 | $95.06 | |
ETH | <0.01% | $0.023031 | 4,114.9178 | $94.77 | |
ETH | <0.01% | $0.000176 | 535,110.3234 | $94.4 | |
ETH | <0.01% | $0.001555 | 60,655.689 | $94.3 | |
ETH | <0.01% | $0.000002 | 46,624,596.5406 | $94.13 | |
ETH | <0.01% | <$0.000001 | 30,436,496,943.48 | $93.11 | |
ETH | <0.01% | $0.494333 | 187.2339 | $92.56 | |
ETH | <0.01% | $0.004916 | 18,669.8362 | $91.78 | |
ETH | <0.01% | <$0.000001 | 147,372,854,670.7382 | $91.75 | |
ETH | <0.01% | $0.014349 | 6,360.9653 | $91.27 | |
ETH | <0.01% | $0.044874 | 2,027.2205 | $90.97 | |
ETH | <0.01% | $0.000005 | 16,961,181.1068 | $90.91 | |
ETH | <0.01% | $0.119642 | 748.9757 | $89.61 | |
ETH | <0.01% | $0.050402 | 1,771.6014 | $89.29 | |
ETH | <0.01% | $0.000003 | 33,039,199.6547 | $88.21 | |
ETH | <0.01% | $3.72 | 23.7289 | $88.17 | |
ETH | <0.01% | $3.42 | 25.7685 | $88.13 | |
ETH | <0.01% | <$0.000001 | 11,510,855,245.6132 | $87.87 | |
ETH | <0.01% | <$0.000001 | 25,582,833,073.3047 | $87.39 | |
ETH | <0.01% | $0.000322 | 271,264.306 | $87.36 | |
ETH | <0.01% | $0.00936 | 9,275.4984 | $86.82 | |
ETH | <0.01% | $0.000519 | 165,553.9693 | $85.87 | |
ETH | <0.01% | $0.002697 | 31,514.3791 | $85 | |
ETH | <0.01% | $0.13626 | 622.4607 | $84.82 | |
ETH | <0.01% | $0.050423 | 1,653.9374 | $83.4 | |
ETH | <0.01% | $1.72 | 47.5998 | $81.87 | |
ETH | <0.01% | $0.024275 | 3,323.9308 | $80.69 | |
ETH | <0.01% | $2.84 | 28.3874 | $80.62 | |
ETH | <0.01% | $0.153666 | 523.9167 | $80.51 | |
ETH | <0.01% | <$0.000001 | 34,830,311,301.1135 | $80.16 | |
ETH | <0.01% | $1.47 | 54.3784 | $79.74 | |
ETH | <0.01% | $1.23 | 64.4301 | $79.25 | |
ETH | <0.01% | $0.012052 | 6,526.4313 | $78.66 | |
ETH | <0.01% | $1.06 | 73.8398 | $78.42 | |
ETH | <0.01% | $0.02937 | 2,668.4405 | $78.37 | |
ETH | <0.01% | $1.13 | 68.9897 | $78.24 | |
ETH | <0.01% | $0.003648 | 21,407.8425 | $78.09 | |
ETH | <0.01% | $0.034204 | 2,278.5093 | $77.94 | |
ETH | <0.01% | <$0.000001 | 170,813,956,869.3902 | $77.93 | |
ETH | <0.01% | $0.000443 | 175,403.738 | $77.78 | |
ETH | <0.01% | $0.011482 | 6,774.2938 | $77.78 | |
ETH | <0.01% | $0.006105 | 12,622.0108 | $77.06 | |
ETH | <0.01% | $0.002175 | 35,375.6194 | $76.95 | |
ETH | <0.01% | $0.001363 | 56,415.3606 | $76.88 | |
ETH | <0.01% | $290.56 | 0.264 | $76.7 | |
ETH | <0.01% | $0.001205 | 63,434.4803 | $76.42 | |
ETH | <0.01% | $0.01663 | 4,590.9517 | $76.35 | |
ETH | <0.01% | $0.148098 | 510.5965 | $75.62 | |
ETH | <0.01% | $0.000008 | 9,548,678.0605 | $75.53 | |
ETH | <0.01% | $0.000001 | 118,501,912.8329 | $75.5 | |
ETH | <0.01% | $0.002414 | 31,179.7955 | $75.28 | |
ETH | <0.01% | $0.80344 | 92.9315 | $74.66 | |
ETH | <0.01% | $0.000001 | 58,607,968.0689 | $74.43 | |
ETH | <0.01% | $0.057615 | 1,289.6762 | $74.3 | |
ETH | <0.01% | $1.38 | 53.7089 | $74.12 | |
ETH | <0.01% | $0.000001 | 138,309,892.6422 | $74.06 | |
ETH | <0.01% | $0.499002 | 148.3716 | $74.04 | |
ETH | <0.01% | <$0.000001 | 78,617,044,649.2506 | $73.97 | |
ETH | <0.01% | $8.85 | 8.335 | $73.76 | |
ETH | <0.01% | $4,115.96 | 0.0178 | $73.31 | |
ETH | <0.01% | $1.28 | 57.0737 | $72.89 | |
ETH | <0.01% | <$0.000001 | 28,184,902,711.4112 | $72.66 | |
ETH | <0.01% | $0.007571 | 9,476.1395 | $71.74 | |
ETH | <0.01% | $0.119729 | 593.8274 | $71.1 | |
ETH | <0.01% | $0.026088 | 2,724.4512 | $71.08 | |
ETH | <0.01% | $0.000269 | 263,391.4056 | $70.93 | |
ETH | <0.01% | $0.004065 | 17,433.5938 | $70.86 | |
ETH | <0.01% | $0.353106 | 200.2072 | $70.69 | |
ETH | <0.01% | $0.077178 | 915.9299 | $70.69 | |
ETH | <0.01% | $0.000037 | 1,906,485.9436 | $70.56 | |
ETH | <0.01% | <$0.000001 | 339,137,571.794 | $70.5 | |
ETH | <0.01% | $0.006105 | 11,546.2165 | $70.49 | |
ETH | <0.01% | $0.000043 | 1,603,252.3799 | $69.68 | |
ETH | <0.01% | $0.040293 | 1,722.5191 | $69.41 | |
ETH | <0.01% | $1.03 | 67.1232 | $69.27 | |
ETH | <0.01% | $0.003425 | 20,223.0844 | $69.27 | |
ETH | <0.01% | <$0.000001 | 206,767,444.3311 | $69.21 | |
ETH | <0.01% | $35.26 | 1.9524 | $68.84 | |
ETH | <0.01% | $0.177114 | 388.1834 | $68.75 | |
ETH | <0.01% | $0.008253 | 8,326.6691 | $68.72 | |
ETH | <0.01% | $0.348603 | 197.0898 | $68.71 | |
ETH | <0.01% | $1 | 67.7463 | $67.81 | |
ETH | <0.01% | $0.226258 | 295.1645 | $66.78 | |
ETH | <0.01% | $0.003142 | 21,052.309 | $66.15 | |
ETH | <0.01% | <$0.000001 | 10,875,223,471.7215 | $65.89 | |
ETH | <0.01% | $0.003941 | 16,557.9716 | $65.25 | |
ETH | <0.01% | $0.015924 | 4,093.9022 | $65.19 | |
ETH | <0.01% | $0.013286 | 4,898.2409 | $65.08 | |
ETH | <0.01% | $0.026838 | 2,419.0637 | $64.92 | |
ETH | <0.01% | <$0.000001 | 160,454,095.6626 | $64.92 | |
ETH | <0.01% | $0.200181 | 322.5239 | $64.56 | |
ETH | <0.01% | $0.300079 | 214.2905 | $64.3 | |
ETH | <0.01% | $0.03571 | 1,795.9576 | $64.13 | |
ETH | <0.01% | $0.001335 | 47,919.7131 | $63.98 | |
ETH | <0.01% | $0.000293 | 218,542.9606 | $63.93 | |
ETH | <0.01% | $0.030902 | 2,061.33 | $63.7 | |
ETH | <0.01% | <$0.000001 | 3,186,586,481.555 | $63.45 | |
ETH | <0.01% | $0.000639 | 98,939.1284 | $63.26 | |
ETH | <0.01% | $0.000101 | 623,330.9247 | $63.14 | |
ETH | <0.01% | $3.46 | 18.1894 | $62.94 | |
ETH | <0.01% | $0.163828 | 383.8792 | $62.89 | |
ETH | <0.01% | $0.005867 | 10,685.9279 | $62.69 | |
ETH | <0.01% | <$0.000001 | 307,434,771.4193 | $62.66 | |
ETH | <0.01% | $1 | 62.4902 | $62.55 | |
ETH | <0.01% | $1.7 | 36.7069 | $62.4 | |
ETH | <0.01% | $0.000085 | 731,337.955 | $62.16 | |
ETH | <0.01% | <$0.000001 | 230,921,302.4564 | $61.88 | |
ETH | <0.01% | $0.623632 | 98.8406 | $61.64 | |
ETH | <0.01% | $0.000001 | 52,751,593.2426 | $61.61 | |
ETH | <0.01% | $0.006622 | 9,291.241 | $61.53 | |
ETH | <0.01% | $0.046905 | 1,310.3064 | $61.46 | |
ETH | <0.01% | $0.002186 | 27,973.9035 | $61.16 | |
ETH | <0.01% | $0.000001 | 70,234,550.4061 | $61.12 | |
ETH | <0.01% | $0.000001 | 103,452,224.7594 | $61.07 | |
ETH | <0.01% | $3.04 | 20.0726 | $61.02 | |
ETH | <0.01% | <$0.000001 | 4,111,422,348.7356 | $60.64 | |
ETH | <0.01% | $1.34 | 45.1228 | $60.46 | |
ETH | <0.01% | $0.017851 | 3,382.3495 | $60.38 | |
ETH | <0.01% | $0.000028 | 2,178,699.4902 | $60.14 | |
ETH | <0.01% | $6.76 | 8.8582 | $59.88 | |
ETH | <0.01% | $0.001866 | 31,877.7333 | $59.47 | |
ETH | <0.01% | $0.007132 | 8,325.8544 | $59.38 | |
ETH | <0.01% | $0.04779 | 1,240.5524 | $59.29 | |
ETH | <0.01% | $0.041089 | 1,442.2726 | $59.26 | |
ETH | <0.01% | <$0.000001 | 3,374,701,102.5659 | $59.25 | |
ETH | <0.01% | $0.000102 | 582,657.9316 | $59.21 | |
ETH | <0.01% | <$0.000001 | 604,755,506.3202 | $58.91 | |
ETH | <0.01% | $0.000001 | 40,741,723.7666 | $58.67 | |
ETH | <0.01% | $0.162575 | 360.6003 | $58.62 | |
ETH | <0.01% | $2.84 | 20.4341 | $58.03 | |
ETH | <0.01% | $1.26 | 45.8822 | $57.81 | |
ETH | <0.01% | $0.000367 | 156,659.9773 | $57.47 | |
ETH | <0.01% | $4.16 | 13.787 | $57.35 | |
ETH | <0.01% | $0.00147 | 38,910.1488 | $57.18 | |
ETH | <0.01% | $0.000002 | 24,657,950.9225 | $57.14 | |
ETH | <0.01% | $0.002386 | 23,687.5319 | $56.51 | |
ETH | <0.01% | $0.237226 | 237.8312 | $56.42 | |
ETH | <0.01% | $0.001097 | 51,078.8926 | $56.02 | |
ETH | <0.01% | $0.000005 | 12,295,641.033 | $55.59 | |
ETH | <0.01% | $0.800503 | 69.2852 | $55.46 | |
ETH | <0.01% | $0.126387 | 438.1101 | $55.37 | |
ETH | <0.01% | <$0.000001 | 94,806,241,201.907 | $55.17 | |
ETH | <0.01% | $1 | 55.1366 | $55.16 | |
ETH | <0.01% | $4.79 | 11.5113 | $55.14 | |
ETH | <0.01% | $0.000001 | 71,745,171.6716 | $54.63 | |
ETH | <0.01% | <$0.000001 | 8,604,881,347.5844 | $54.57 | |
ETH | <0.01% | $0.096062 | 567.6252 | $54.53 | |
ETH | <0.01% | $0.245064 | 222.331 | $54.49 | |
ETH | <0.01% | $0.017372 | 3,104.4024 | $53.93 | |
ETH | <0.01% | $0.018045 | 2,985.6669 | $53.88 | |
ETH | <0.01% | $0.388086 | 138.2828 | $53.67 | |
ETH | <0.01% | $12.24 | 4.3556 | $53.32 | |
ETH | <0.01% | $0.000656 | 81,121.1658 | $53.25 | |
ETH | <0.01% | $0.039383 | 1,345.3572 | $52.98 | |
ETH | <0.01% | $0.000033 | 1,610,162.1617 | $52.87 | |
ETH | <0.01% | $0.000001 | 71,099,488.829 | $52.87 | |
ETH | <0.01% | <$0.000001 | 37,667,201,415.3429 | $52.85 | |
ETH | <0.01% | $3.6 | 14.6488 | $52.74 | |
ETH | <0.01% | $0.000001 | 69,187,234.1959 | $52.55 | |
ETH | <0.01% | $0.014159 | 3,680.7769 | $52.12 | |
ETH | <0.01% | $0.582047 | 89.2256 | $51.93 | |
ETH | <0.01% | $0.147645 | 351.4012 | $51.88 | |
ETH | <0.01% | $0.071884 | 713.7892 | $51.31 | |
ETH | <0.01% | $0.004919 | 10,426.6127 | $51.29 | |
ETH | <0.01% | $46.16 | 1.1075 | $51.13 | |
ETH | <0.01% | $0.005897 | 8,655.2992 | $51.04 | |
ETH | <0.01% | $0.000012 | 4,275,171.0004 | $50.17 | |
ETH | <0.01% | $0.001838 | 27,259.1899 | $50.09 | |
ETH | <0.01% | $0.22162 | 221.5479 | $49.1 | |
ETH | <0.01% | $0.742405 | 65.8774 | $48.91 | |
ETH | <0.01% | $0.708806 | 68.323 | $48.43 | |
ETH | <0.01% | $0.011578 | 4,176.216 | $48.35 | |
ETH | <0.01% | $0.001762 | 27,329.9005 | $48.14 | |
ETH | <0.01% | $12.89 | 3.7193 | $47.94 | |
ETH | <0.01% | $0.322265 | 148.4342 | $47.84 | |
ETH | <0.01% | $0.000684 | 69,878.3233 | $47.77 | |
ETH | <0.01% | $0.140345 | 338.3635 | $47.49 | |
ETH | <0.01% | $0.020056 | 2,366.733 | $47.47 | |
ETH | <0.01% | $0.00001 | 4,938,534.8594 | $47.46 | |
ETH | <0.01% | $0.000001 | 58,369,723.6752 | $46.78 | |
ETH | <0.01% | $0.008344 | 5,583.1569 | $46.59 | |
ETH | <0.01% | $0.0126 | 3,671.5773 | $46.26 | |
ETH | <0.01% | $0.539197 | 85.5516 | $46.13 | |
ETH | <0.01% | $35.09 | 1.3086 | $45.92 | |
ETH | <0.01% | $1.96 | 23.1754 | $45.34 | |
ETH | <0.01% | <$0.000001 | 2,604,150,680.1234 | $45.08 | |
ETH | <0.01% | $380.55 | 0.1181 | $44.95 | |
ETH | <0.01% | $0.002375 | 18,776.8886 | $44.59 | |
ETH | <0.01% | $3.96 | 11.24 | $44.51 | |
ETH | <0.01% | $0.120322 | 367.6669 | $44.24 | |
ETH | <0.01% | $0.00445 | 9,888.0564 | $44 | |
ETH | <0.01% | $0.000089 | 492,135.0124 | $43.82 | |
ETH | <0.01% | $0.16639 | 263.3207 | $43.81 | |
ETH | <0.01% | $0.043464 | 1,005.1856 | $43.69 | |
ETH | <0.01% | $0.591996 | 73.4158 | $43.46 | |
ETH | <0.01% | $0.030847 | 1,408.0247 | $43.43 | |
ETH | <0.01% | $0.0006 | 71,940.8943 | $43.15 | |
ETH | <0.01% | $0.387051 | 110.4471 | $42.75 | |
ETH | <0.01% | $0.004845 | 8,811.282 | $42.69 | |
ETH | <0.01% | $0.072358 | 587.3617 | $42.5 | |
ETH | <0.01% | $0.000021 | 2,047,415.696 | $42.24 | |
ETH | <0.01% | $57.28 | 0.7361 | $42.17 | |
ETH | <0.01% | <$0.000001 | 154,860,634.9405 | $42.02 | |
ETH | <0.01% | $0.107395 | 388.2932 | $41.7 | |
ETH | <0.01% | $0.024713 | 1,687.3569 | $41.7 | |
ETH | <0.01% | $1.24 | 33.5076 | $41.55 | |
ETH | <0.01% | <$0.000001 | 18,485,262,528.6208 | $41.47 | |
ETH | <0.01% | $0.062369 | 664.7142 | $41.46 | |
ETH | <0.01% | $0.130485 | 317.0211 | $41.37 | |
ETH | <0.01% | $0.079793 | 516.1351 | $41.18 | |
ETH | <0.01% | $0.070133 | 586.1341 | $41.11 | |
ETH | <0.01% | $1.87 | 21.9388 | $41.03 | |
ETH | <0.01% | $0.005092 | 8,035.5877 | $40.92 | |
ETH | <0.01% | $0.734234 | 55.6863 | $40.89 | |
ETH | <0.01% | $0.001943 | 21,019.7697 | $40.84 | |
ETH | <0.01% | $1.44 | 28.0871 | $40.34 | |
ETH | <0.01% | $0.020873 | 1,929.5405 | $40.27 | |
ETH | <0.01% | $0.014241 | 2,826.5248 | $40.25 | |
ETH | <0.01% | $2.67 | 14.9479 | $39.87 | |
ETH | <0.01% | $1.32 | 30.0997 | $39.73 | |
ETH | <0.01% | $0.000001 | 63,706,024.0952 | $39.65 | |
ETH | <0.01% | $0.000003 | 15,790,072.2766 | $39.64 | |
ETH | <0.01% | $0.000006 | 6,536,779.3944 | $38.96 | |
ETH | <0.01% | $399.33 | 0.0973 | $38.85 | |
ETH | <0.01% | $0.271505 | 142.8131 | $38.77 | |
ETH | <0.01% | <$0.000001 | 13,488,797,021.281 | $38.63 | |
ETH | <0.01% | $1.2 | 32.1161 | $38.47 | |
ETH | <0.01% | $0.001206 | 31,862.4792 | $38.43 | |
ETH | <0.01% | $1.39 | 27.6456 | $38.43 | |
ETH | <0.01% | <$0.000001 | 30,282,945,351.4324 | $38.37 | |
ETH | <0.01% | $0.011017 | 3,468.344 | $38.21 | |
ETH | <0.01% | $0.003827 | 9,975.1668 | $38.17 | |
ETH | <0.01% | $0.010852 | 3,499.7254 | $37.98 | |
ETH | <0.01% | $1.74 | 21.728 | $37.81 | |
ETH | <0.01% | $0.000019 | 1,933,795.557 | $37.63 | |
ETH | <0.01% | $0.000286 | 130,259.5603 | $37.2 | |
ETH | <0.01% | $0.006697 | 5,439.8488 | $36.43 | |
ETH | <0.01% | $0.067485 | 539.5292 | $36.41 | |
ETH | <0.01% | $0.003495 | 10,412.72 | $36.4 | |
ETH | <0.01% | $0.000004 | 8,240,955.7459 | $36.18 | |
ETH | <0.01% | $0.000001 | 45,712,887.1382 | $36.03 | |
ETH | <0.01% | <$0.000001 | 10,015,803,091,105.061 | $36 | |
ETH | <0.01% | $0.000086 | 415,358.6435 | $35.81 | |
ETH | <0.01% | $0.225066 | 158.8562 | $35.75 | |
ETH | <0.01% | $0.002159 | 16,485.0895 | $35.6 | |
ETH | <0.01% | $0.000544 | 65,182.0879 | $35.49 | |
ETH | <0.01% | $0.000222 | 159,809.0014 | $35.42 | |
ETH | <0.01% | $0.001195 | 29,623.2916 | $35.41 | |
ETH | <0.01% | $1.07 | 32.9847 | $35.29 | |
ETH | <0.01% | $56.09 | 0.628 | $35.22 | |
ETH | <0.01% | $0.000922 | 38,141.4697 | $35.17 | |
ETH | <0.01% | $0.318368 | 108.9819 | $34.7 | |
ETH | <0.01% | $0.000131 | 264,117.0561 | $34.5 | |
ETH | <0.01% | $6.07 | 5.6566 | $34.34 | |
ETH | <0.01% | <$0.000001 | 45,388,988,286.6733 | $34.31 | |
ETH | <0.01% | $0.182498 | 187.8374 | $34.28 | |
ETH | <0.01% | $28.37 | 1.2001 | $34.05 | |
ETH | <0.01% | $0.080049 | 424.7393 | $34 | |
ETH | <0.01% | $0.091912 | 368.7407 | $33.89 | |
ETH | <0.01% | $0.066904 | 506.2897 | $33.87 | |
ETH | <0.01% | $0.00001 | 3,334,727.1747 | $33.85 | |
ETH | <0.01% | $0.011848 | 2,851.0705 | $33.78 | |
ETH | <0.01% | $0.033617 | 999.7768 | $33.61 | |
ETH | <0.01% | $0.000629 | 53,350.3078 | $33.55 | |
ETH | <0.01% | $0.006593 | 5,086.729 | $33.54 | |
ETH | <0.01% | $0.000156 | 214,777.9055 | $33.51 | |
ETH | <0.01% | $732.14 | 0.0456 | $33.36 | |
ETH | <0.01% | $0.000477 | 69,674.3588 | $33.21 | |
ETH | <0.01% | $0.002315 | 14,335.4872 | $33.19 | |
ETH | <0.01% | $0.000233 | 142,168.2698 | $33.19 | |
ETH | <0.01% | <$0.000001 | 10,552,455,586.7008 | $33.15 | |
ETH | <0.01% | $0.008517 | 3,884.757 | $33.09 | |
ETH | <0.01% | $0.733034 | 45.0812 | $33.05 | |
ETH | <0.01% | $0.273645 | 120.1465 | $32.88 | |
ETH | <0.01% | $39.46 | 0.8317 | $32.82 | |
ETH | <0.01% | $0.599487 | 54.5005 | $32.67 | |
ETH | <0.01% | $0.1488 | 215.5335 | $32.07 | |
ETH | <0.01% | $48.86 | 0.6546 | $31.98 | |
ETH | <0.01% | $0.088415 | 361.1733 | $31.93 | |
ETH | <0.01% | $0.101941 | 312.6506 | $31.87 | |
ETH | <0.01% | $0.000696 | 45,601.0802 | $31.76 | |
ETH | <0.01% | $0.122988 | 257.9764 | $31.73 | |
ETH | <0.01% | $0.201637 | 156.3102 | $31.52 | |
ETH | <0.01% | $0.000001 | 28,362,582.9011 | $31.48 | |
ETH | <0.01% | $0.50916 | 61.828 | $31.48 | |
ETH | <0.01% | <$0.000001 | 243,351,609.6948 | $31.44 | |
ETH | <0.01% | $3.89 | 8.0438 | $31.29 | |
ETH | <0.01% | $4,229.71 | 0.00734882 | $31.08 | |
ETH | <0.01% | $0.011258 | 2,748.954 | $30.95 | |
ETH | <0.01% | $0.151317 | 204.4095 | $30.93 | |
ETH | <0.01% | $1.52 | 20.2752 | $30.89 | |
ETH | <0.01% | $0.007536 | 4,080.0104 | $30.75 | |
ETH | <0.01% | $1.01 | 30.5413 | $30.72 | |
ETH | <0.01% | $0.000001 | 40,486,044.5401 | $30.56 | |
ETH | <0.01% | $1.75 | 17.4311 | $30.5 | |
ETH | <0.01% | $0.000005 | 5,915,041.3285 | $30.36 | |
ETH | <0.01% | <$0.000001 | 228,219,082,037.9459 | $30.13 | |
ETH | <0.01% | $0.000199 | 149,669.9017 | $29.81 | |
ETH | <0.01% | $0.001875 | 15,774.9025 | $29.58 | |
ETH | <0.01% | $0.040524 | 727.3706 | $29.48 | |
ETH | <0.01% | <$0.000001 | 17,525,448,016.215 | $29.44 | |
ETH | <0.01% | $0.261703 | 112.092 | $29.33 | |
ETH | <0.01% | $1.81 | 16.1761 | $29.28 | |
ETH | <0.01% | $0.000548 | 53,267.1389 | $29.2 | |
ETH | <0.01% | $0.045668 | 634.7625 | $28.99 | |
ETH | <0.01% | $0.048807 | 592.7929 | $28.93 | |
ETH | <0.01% | <$0.000001 | 11,100,928,578.9658 | $28.88 | |
ETH | <0.01% | $0.110384 | 258.2549 | $28.51 | |
ETH | <0.01% | $0.000431 | 66,062.5034 | $28.49 | |
ETH | <0.01% | $0.004667 | 6,095.9852 | $28.45 | |
ETH | <0.01% | $0.000003 | 10,981,593.2183 | $28.22 | |
ETH | <0.01% | <$0.000001 | 36,853,170,108.0196 | $28.2 | |
ETH | <0.01% | $0.042138 | 668.9701 | $28.19 | |
ETH | <0.01% | $0.008039 | 3,500.0987 | $28.14 | |
ETH | <0.01% | <$0.000001 | 6,003,414,615.3235 | $28.11 | |
ETH | <0.01% | $39.91 | 0.7014 | $27.99 | |
ETH | <0.01% | <$0.000001 | 53,162,120,540.1371 | $27.95 | |
ETH | <0.01% | $0.362311 | 76.5823 | $27.75 | |
ETH | <0.01% | $0.000697 | 39,689.4026 | $27.67 | |
ETH | <0.01% | $0.003757 | 7,354.5147 | $27.63 | |
ETH | <0.01% | $0.002649 | 10,427.3191 | $27.63 | |
ETH | <0.01% | <$0.000001 | 2,534,345,051.4134 | $27.47 | |
ETH | <0.01% | $0.15854 | 173.1579 | $27.45 | |
ETH | <0.01% | <$0.000001 | 6,310,060,707.8976 | $27.45 | |
ETH | <0.01% | $0.865668 | 31.6308 | $27.38 | |
ETH | <0.01% | $0.000001 | 18,235,020.7077 | $27.22 | |
ETH | <0.01% | <$0.000001 | 96,279,135.0527 | $27.19 | |
ETH | <0.01% | $1.82 | 14.8616 | $27.05 | |
ETH | <0.01% | $0.002626 | 10,277.7634 | $26.99 | |
ETH | <0.01% | $0.000001 | 32,283,063.3903 | $26.89 | |
ETH | <0.01% | $0.000424 | 63,287.8376 | $26.85 | |
ETH | <0.01% | $0.002075 | 12,880.2861 | $26.72 | |
ETH | <0.01% | $0.259423 | 102.4945 | $26.59 | |
ETH | <0.01% | $0.026018 | 1,011.0118 | $26.3 | |
ETH | <0.01% | $0.000002 | 10,820,107.9621 | $26.29 | |
ETH | <0.01% | $0.000943 | 27,553.1941 | $25.97 | |
ETH | <0.01% | $21.03 | 1.2259 | $25.78 | |
ETH | <0.01% | $0.00797 | 3,229.9132 | $25.74 | |
ETH | <0.01% | $0.100995 | 254.8012 | $25.73 | |
ETH | <0.01% | $0.006261 | 4,109.9578 | $25.73 | |
ETH | <0.01% | $0.000227 | 112,624.1094 | $25.59 | |
ETH | <0.01% | $0.910379 | 27.9156 | $25.41 | |
ETH | <0.01% | $2.41 | 10.5206 | $25.35 | |
ETH | <0.01% | $0.000008 | 3,064,283.0156 | $25.31 | |
ETH | <0.01% | $0.040661 | 618.7896 | $25.16 | |
ETH | <0.01% | $0.747551 | 33.6118 | $25.13 | |
ETH | <0.01% | $0.534812 | 46.9643 | $25.12 | |
ETH | <0.01% | $0.655877 | 38.1658 | $25.03 | |
ETH | <0.01% | $0.014595 | 1,713.1043 | $25 | |
ETH | <0.01% | $0.03402 | 732.7779 | $24.93 | |
ETH | <0.01% | $1 | 24.845 | $24.89 | |
ETH | <0.01% | $0.782687 | 31.6802 | $24.8 | |
ETH | <0.01% | $0.061461 | 401.7912 | $24.69 | |
ETH | <0.01% | $0.004909 | 4,943.4746 | $24.27 | |
ETH | <0.01% | $0.033812 | 710.9584 | $24.04 | |
ETH | <0.01% | <$0.000001 | 27,812,325,031,271.488 | $23.93 | |
ETH | <0.01% | $0.132693 | 180.0992 | $23.9 | |
ETH | <0.01% | $6.14 | 3.8797 | $23.81 | |
ETH | <0.01% | $1.43 | 16.6411 | $23.8 | |
ETH | <0.01% | $0.000001 | 25,317,435.788 | $23.78 | |
ETH | <0.01% | $0.000008 | 3,061,817.0272 | $23.63 | |
ETH | <0.01% | $0.01494 | 1,579.9482 | $23.6 | |
ETH | <0.01% | $0.133209 | 177.1686 | $23.6 | |
ETH | <0.01% | $0.053292 | 440.4053 | $23.47 | |
ETH | <0.01% | $173.86 | 0.1346 | $23.4 | |
ETH | <0.01% | <$0.000001 | 24,984,834,587.7441 | $23.28 | |
ETH | <0.01% | <$0.000001 | 9,484,860,203.5674 | $23.08 | |
ETH | <0.01% | $0.000435 | 52,288.4402 | $22.73 | |
ETH | <0.01% | $0.000091 | 247,220.5555 | $22.61 | |
ETH | <0.01% | $0.000325 | 69,388.7242 | $22.54 | |
ETH | <0.01% | $0.07446 | 302.2288 | $22.5 | |
ETH | <0.01% | $0.001704 | 13,163.3718 | $22.43 | |
ETH | <0.01% | $0.000039 | 574,799.7931 | $22.33 | |
ETH | <0.01% | $1 | 22.1275 | $22.15 | |
ETH | <0.01% | $1.14 | 19.2877 | $22.06 | |
ETH | <0.01% | $0.233384 | 94.0695 | $21.95 | |
ETH | <0.01% | $0.002441 | 8,983.9179 | $21.93 | |
ETH | <0.01% | $0.000208 | 105,388.6692 | $21.91 | |
ETH | <0.01% | $0.058576 | 373.703 | $21.89 | |
ETH | <0.01% | $0.047472 | 459.5269 | $21.81 | |
ETH | <0.01% | $0.323128 | 66.8535 | $21.6 | |
ETH | <0.01% | <$0.000001 | 195,225,405.0829 | $21.55 | |
ETH | <0.01% | $0.047075 | 453.6213 | $21.35 | |
ETH | <0.01% | $0.097459 | 218.8787 | $21.33 | |
ETH | <0.01% | $0.023164 | 919.5539 | $21.3 | |
ETH | <0.01% | $0.997971 | 21.3204 | $21.28 | |
ETH | <0.01% | $0.01069 | 1,990.0928 | $21.27 | |
ETH | <0.01% | $0.000921 | 23,088.3669 | $21.27 | |
ETH | <0.01% | $0.000003 | 8,072,192.9589 | $21.07 | |
ETH | <0.01% | $0.073716 | 283.8725 | $20.93 | |
ETH | <0.01% | $0.007799 | 2,673.9498 | $20.85 | |
ETH | <0.01% | $0.000001 | 37,642,236.3282 | $20.84 | |
ETH | <0.01% | $0.000004 | 5,757,333.749 | $20.83 | |
ETH | <0.01% | <$0.000001 | 70,479,449.726 | $20.83 | |
ETH | <0.01% | $1.86 | 11.19 | $20.81 | |
ETH | <0.01% | $0.080759 | 256.4551 | $20.71 | |
ETH | <0.01% | <$0.000001 | 45,272,622.3852 | $20.67 | |
ETH | <0.01% | <$0.000001 | 55,666,378.8664 | $20.62 | |
ETH | <0.01% | $0.009277 | 2,220.9431 | $20.6 | |
ETH | <0.01% | $0.313245 | 65.5806 | $20.54 | |
ETH | <0.01% | $0.608556 | 33.5972 | $20.45 | |
ETH | <0.01% | $0.011779 | 1,731.6901 | $20.4 | |
ETH | <0.01% | $2.38 | 8.5515 | $20.34 | |
ETH | <0.01% | $0.141107 | 143.9854 | $20.32 | |
ETH | <0.01% | $0.097148 | 208.5023 | $20.26 | |
ETH | <0.01% | $0.000003 | 7,927,775.0185 | $20.22 | |
ETH | <0.01% | $0.000001 | 20,962,060.3974 | $20.18 | |
ETH | <0.01% | <$0.000001 | 183,480,904.9616 | $20.13 | |
ETH | <0.01% | $0.211214 | 95.1789 | $20.1 | |
ETH | <0.01% | $0.078468 | 255.431 | $20.04 | |
ETH | <0.01% | $0.093926 | 212.9171 | $20 | |
ETH | <0.01% | $0.000002 | 11,687,618.9122 | $19.87 | |
ETH | <0.01% | $0.038895 | 509.7477 | $19.83 | |
ETH | <0.01% | $0.004172 | 4,686.223 | $19.55 | |
ETH | <0.01% | <$0.000001 | 222,916,045.4886 | $19.37 | |
ETH | <0.01% | <$0.000001 | 2,843,617,855.2271 | $19.2 | |
ETH | <0.01% | $0.485161 | 39.4167 | $19.12 | |
ETH | <0.01% | $0.027417 | 696.9036 | $19.11 | |
ETH | <0.01% | <$0.000001 | 76,896,568,190.863 | $19.08 | |
ETH | <0.01% | $0.000005 | 4,118,371.1801 | $18.99 | |
ETH | <0.01% | $0.459209 | 41.1445 | $18.89 | |
ETH | <0.01% | $1.72 | 10.9773 | $18.88 | |
ETH | <0.01% | $0.006007 | 3,135.0135 | $18.83 | |
ETH | <0.01% | $0.095848 | 194.4298 | $18.64 | |
ETH | <0.01% | $0.000001 | 18,580,084.5125 | $18.58 | |
ETH | <0.01% | $17.89 | 1.038 | $18.57 | |
ETH | <0.01% | $0.720691 | 25.4029 | $18.31 | |
ETH | <0.01% | $0.050264 | 361.2722 | $18.16 | |
ETH | <0.01% | $0.315249 | 57.54 | $18.14 | |
ETH | <0.01% | $0.042989 | 420.9074 | $18.09 | |
ETH | <0.01% | $0.201587 | 88.9618 | $17.93 | |
ETH | <0.01% | $0.001378 | 12,891.2438 | $17.76 | |
ETH | <0.01% | $0.152211 | 116.6528 | $17.76 | |
ETH | <0.01% | $0.000001 | 14,959,624.8348 | $17.7 | |
ETH | <0.01% | $0.0009 | 19,531.7487 | $17.58 | |
ETH | <0.01% | $0.001172 | 14,969.0159 | $17.55 | |
ETH | <0.01% | $0.134083 | 129.917 | $17.42 | |
ETH | <0.01% | $0.080883 | 215.05 | $17.39 | |
ETH | <0.01% | $0.000823 | 21,103.6236 | $17.38 | |
ETH | <0.01% | $0.000001 | 19,862,566.9501 | $17.34 | |
ETH | <0.01% | $0.497257 | 34.773 | $17.29 | |
ETH | <0.01% | $0.002561 | 6,744.3859 | $17.27 | |
ETH | <0.01% | $0.000004 | 4,454,527.1718 | $17.21 | |
ETH | <0.01% | $0.028028 | 609.5148 | $17.08 | |
ETH | <0.01% | $2.57 | 6.5965 | $16.95 | |
ETH | <0.01% | $0.739381 | 22.8562 | $16.9 | |
ETH | <0.01% | <$0.000001 | 57,052,966,455.7282 | $16.86 | |
ETH | <0.01% | $0.012898 | 1,302.3321 | $16.8 | |
ETH | <0.01% | $0.01392 | 1,205.6267 | $16.78 | |
ETH | <0.01% | <$0.000001 | 25,072,282,607.3673 | $16.78 | |
ETH | <0.01% | <$0.000001 | 9,819,103,551.6829 | $16.75 | |
ETH | <0.01% | $20.87 | 0.7999 | $16.69 | |
ETH | <0.01% | $0.007354 | 2,267.7232 | $16.68 | |
ETH | <0.01% | $0.36812 | 44.1717 | $16.26 | |
ETH | <0.01% | <$0.000001 | 7,947,114,477.3619 | $16.24 | |
ETH | <0.01% | $0.001749 | 9,226.0533 | $16.14 | |
ETH | <0.01% | $0.000334 | 48,275.9612 | $16.11 | |
ETH | <0.01% | $0.010297 | 1,560.3057 | $16.07 | |
ETH | <0.01% | $0.157658 | 101.7067 | $16.03 | |
ETH | <0.01% | $0.003635 | 4,408.8429 | $16.03 | |
ETH | <0.01% | $0.000817 | 19,607.1289 | $16.02 | |
ETH | <0.01% | $0.004035 | 3,962.3528 | $15.99 | |
ETH | <0.01% | $0.147343 | 108.1894 | $15.94 | |
ETH | <0.01% | $5.34 | 2.9809 | $15.92 | |
ETH | <0.01% | $3.35 | 4.6967 | $15.73 | |
ETH | <0.01% | $13.79 | 1.1393 | $15.71 | |
ETH | <0.01% | $0.239868 | 65.1502 | $15.63 | |
ETH | <0.01% | $0.004468 | 3,497.2825 | $15.63 | |
ETH | <0.01% | $0.012517 | 1,247.6423 | $15.62 | |
ETH | <0.01% | $0.000546 | 28,261.9804 | $15.44 | |
ETH | <0.01% | $0.076758 | 200.7467 | $15.41 | |
ETH | <0.01% | $0.005444 | 2,820.56 | $15.35 | |
ETH | <0.01% | $0.003441 | 4,457.9569 | $15.34 | |
ETH | <0.01% | $0.021393 | 715.3628 | $15.3 | |
ETH | <0.01% | $4,169.54 | 0.0036637 | $15.28 | |
ETH | <0.01% | $0.000154 | 99,080.3426 | $15.26 | |
ETH | <0.01% | $0.001584 | 9,598.3065 | $15.2 | |
ETH | <0.01% | $0.262954 | 57.7224 | $15.18 | |
ETH | <0.01% | $0.043788 | 346.1176 | $15.16 | |
ETH | <0.01% | $0.035892 | 419.4154 | $15.05 | |
ETH | <0.01% | $0.000835 | 17,964.742 | $15.01 | |
ETH | <0.01% | <$0.000001 | 31,220,735,237.966 | $14.94 | |
ETH | <0.01% | $2.41 | 6.1773 | $14.89 | |
ETH | <0.01% | $0.023329 | 636.6617 | $14.85 | |
ETH | <0.01% | $13.68 | 1.082 | $14.8 | |
ETH | <0.01% | $0.02487 | 593.2568 | $14.75 | |
ETH | <0.01% | $10.03 | 1.4617 | $14.66 | |
ETH | <0.01% | $0.010332 | 1,405.2423 | $14.52 | |
ETH | <0.01% | $1.42 | 10.2183 | $14.51 | |
ETH | <0.01% | $1.18 | 12.2913 | $14.5 | |
ETH | <0.01% | $0.48493 | 29.8963 | $14.5 | |
ETH | <0.01% | <$0.000001 | 20,283,743,169.6799 | $14.5 | |
ETH | <0.01% | $0.019968 | 725.2343 | $14.48 | |
ETH | <0.01% | $3,992.85 | 0.00362583 | $14.48 | |
ETH | <0.01% | $0.010427 | 1,384.8444 | $14.44 | |
ETH | <0.01% | $0.013439 | 1,071.3715 | $14.4 | |
ETH | <0.01% | <$0.000001 | 7,128,219,240.9478 | $14.36 | |
ETH | <0.01% | $0.005004 | 2,843.6928 | $14.23 | |
ETH | <0.01% | <$0.000001 | 105,969,143.6122 | $14.21 | |
ETH | <0.01% | $0.000228 | 61,918.564 | $14.12 | |
ETH | <0.01% | $0.000477 | 29,598.1778 | $14.12 | |
ETH | <0.01% | <$0.000001 | 29,348,265,050.3492 | $14.08 | |
ETH | <0.01% | $0.000003 | 5,312,089.6861 | $13.92 | |
ETH | <0.01% | $0.050125 | 275.5107 | $13.81 | |
ETH | <0.01% | $0.000934 | 14,778.0162 | $13.8 | |
ETH | <0.01% | $0.002196 | 6,278.6992 | $13.79 | |
ETH | <0.01% | $0.000009 | 1,617,883.1853 | $13.77 | |
ETH | <0.01% | $0.112954 | 121.8864 | $13.77 | |
ETH | <0.01% | $0.000052 | 262,335.7435 | $13.71 | |
ETH | <0.01% | $0.100067 | 135.9201 | $13.6 | |
ETH | <0.01% | $0.017322 | 783.4668 | $13.57 | |
ETH | <0.01% | $0.000826 | 16,305.4045 | $13.47 | |
ETH | <0.01% | <$0.000001 | 44,110,740.7518 | $13.41 | |
ETH | <0.01% | $0.186561 | 71.8031 | $13.4 | |
ETH | <0.01% | $1.07 | 12.49 | $13.38 | |
ETH | <0.01% | $0.013567 | 983.8624 | $13.35 | |
ETH | <0.01% | $4,688.19 | 0.00284637 | $13.34 | |
ETH | <0.01% | $0.000137 | 97,245.8422 | $13.3 | |
ETH | <0.01% | <$0.000001 | 8,726,601,944,856.2354 | $13.27 | |
ETH | <0.01% | $0.001365 | 9,656.9351 | $13.18 | |
ETH | <0.01% | $0.13267 | 99.1636 | $13.16 | |
ETH | <0.01% | <$0.000001 | 86,745,848.961 | $13.04 | |
ETH | <0.01% | $0.000816 | 15,967.5696 | $13.03 | |
ETH | <0.01% | $0.000003 | 5,101,151.9481 | $12.9 | |
ETH | <0.01% | $0.03196 | 402.499 | $12.86 | |
ETH | <0.01% | $4,294.07 | 0.0029893 | $12.84 | |
ETH | <0.01% | $0.002777 | 4,620.2283 | $12.83 | |
ETH | <0.01% | $0.000003 | 3,978,134.8232 | $12.77 | |
ETH | <0.01% | $0.798896 | 15.9369 | $12.73 | |
ETH | <0.01% | $6.17 | 2.0429 | $12.6 | |
ETH | <0.01% | <$0.000001 | 628,596,072.8452 | $12.53 | |
ETH | <0.01% | $0.039178 | 319.2887 | $12.51 | |
ETH | <0.01% | $0.000801 | 15,416.1673 | $12.35 | |
ETH | <0.01% | $0.034622 | 354.1818 | $12.26 | |
ETH | <0.01% | $0.000043 | 285,026.4929 | $12.26 | |
ETH | <0.01% | $0.023578 | 519.7855 | $12.26 | |
ETH | <0.01% | $296.11 | 0.0411 | $12.16 | |
ETH | <0.01% | $0.000601 | 19,921.6489 | $11.98 | |
ETH | <0.01% | $0.037411 | 319.2201 | $11.94 | |
ETH | <0.01% | $0.001238 | 9,623.2245 | $11.92 | |
ETH | <0.01% | $0.01554 | 765.5513 | $11.9 | |
ETH | <0.01% | $0.4716 | 25.0742 | $11.83 | |
ETH | <0.01% | <$0.000001 | 49,988,504.0556 | $11.82 | |
ETH | <0.01% | $0.002399 | 4,911.6427 | $11.78 | |
ETH | <0.01% | $0.006254 | 1,880.2932 | $11.76 | |
ETH | <0.01% | $0.000296 | 39,657.4033 | $11.74 | |
ETH | <0.01% | <$0.000001 | 2,187,173,353.3688 | $11.74 | |
ETH | <0.01% | <$0.000001 | 115,255,319,242.4855 | $11.71 | |
ETH | <0.01% | $0.017528 | 664.3707 | $11.65 | |
ETH | <0.01% | $0.014239 | 816.7529 | $11.63 | |
ETH | <0.01% | $3.4 | 3.4218 | $11.62 | |
ETH | <0.01% | $0.079343 | 145.8121 | $11.57 | |
ETH | <0.01% | $0.500609 | 22.7202 | $11.37 | |
ETH | <0.01% | <$0.000001 | 25,152,379.1816 | $11.37 | |
ETH | <0.01% | $0.00047 | 24,176.0595 | $11.36 | |
ETH | <0.01% | $0.265431 | 42.5122 | $11.28 | |
ETH | <0.01% | $0.999389 | 11.2752 | $11.27 | |
ETH | <0.01% | <$0.000001 | 96,871,828.6163 | $11.14 | |
ETH | <0.01% | $0.000002 | 6,415,642.9585 | $11.11 | |
ETH | <0.01% | $2.4 | 4.6171 | $11.08 | |
ETH | <0.01% | $1.06 | 10.4343 | $11.02 | |
ETH | <0.01% | $0.002975 | 3,699.2209 | $11 | |
ETH | <0.01% | $0.119357 | 92.0083 | $10.98 | |
ETH | <0.01% | <$0.000001 | 37,644,907,692.3882 | $10.87 | |
ETH | <0.01% | $2.99 | 3.6311 | $10.86 | |
ETH | <0.01% | $0.063629 | 170.1468 | $10.83 | |
ETH | <0.01% | $0.000011 | 940,176.3051 | $10.78 | |
ETH | <0.01% | <$0.000001 | 197,859,613.0156 | $10.76 | |
ETH | <0.01% | $0.283527 | 37.2598 | $10.56 | |
ETH | <0.01% | $0.030306 | 347.8754 | $10.54 | |
ETH | <0.01% | <$0.000001 | 854,210,093,040.8445 | $10.53 | |
ETH | <0.01% | $0.388468 | 27.1125 | $10.53 | |
ETH | <0.01% | $0.000117 | 89,196.1373 | $10.45 | |
ETH | <0.01% | $0.000057 | 181,155.2992 | $10.4 | |
ETH | <0.01% | $4,761 | 0.00215927 | $10.28 | |
ETH | <0.01% | $0.001071 | 9,593.5494 | $10.28 | |
ETH | <0.01% | $0.485014 | 21.1108 | $10.24 | |
ETH | <0.01% | $7.54 | 1.3531 | $10.2 | |
ETH | <0.01% | <$0.000001 | 35,530,136,065.296 | $10.19 | |
ETH | <0.01% | $0.243678 | 41.5301 | $10.12 | |
ETH | <0.01% | $0.000768 | 13,169.2808 | $10.11 | |
ETH | <0.01% | $1.85 | 5.4433 | $10.07 | |
ETH | <0.01% | $0.001199 | 8,385.5905 | $10.06 | |
ETH | <0.01% | $0.028205 | 355.4874 | $10.03 | |
ETH | <0.01% | $0.13675 | 73.236 | $10.02 | |
ETH | <0.01% | $0.000386 | 25,781.6896 | $9.94 | |
ETH | <0.01% | $0.025369 | 390.2298 | $9.9 | |
ETH | <0.01% | $0.000002 | 4,427,995.6495 | $9.87 | |
ETH | <0.01% | <$0.000001 | 36,946,806.7243 | $9.87 | |
ETH | <0.01% | $0.019119 | 512.9285 | $9.81 | |
ETH | <0.01% | $0.286444 | 33.7649 | $9.67 | |
ETH | <0.01% | <$0.000001 | 56,648,363,718,217.3 | $9.67 | |
ETH | <0.01% | $0.000167 | 57,617.1082 | $9.63 | |
ETH | <0.01% | $0.000001 | 6,673,417.1828 | $9.61 | |
ETH | <0.01% | <$0.000001 | 33,877,746.5193 | $9.59 | |
ETH | <0.01% | $0.000408 | 23,504.778 | $9.59 | |
ETH | <0.01% | $0.176656 | 53.9007 | $9.52 | |
ETH | <0.01% | $0.000408 | 23,011.2506 | $9.38 | |
ETH | <0.01% | <$0.000001 | 5,924,122,560.278 | $9.37 | |
ETH | <0.01% | $2 | 4.6472 | $9.29 | |
ETH | <0.01% | $0.005078 | 1,824.9948 | $9.27 | |
ETH | <0.01% | $8,750.59 | 0.00105411 | $9.22 | |
ETH | <0.01% | $0.006165 | 1,482.111 | $9.14 | |
ETH | <0.01% | $0.120691 | 75.658 | $9.13 | |
ETH | <0.01% | $0.265747 | 34.0844 | $9.06 | |
ETH | <0.01% | <$0.000001 | 19,803,996.8034 | $9.04 | |
ETH | <0.01% | $0.000416 | 21,679.8253 | $9.02 | |
ETH | <0.01% | $0.000011 | 802,275.9878 | $8.97 | |
ETH | <0.01% | $0.002525 | 3,496.3321 | $8.83 | |
ETH | <0.01% | $0.000716 | 12,278.2761 | $8.79 | |
ETH | <0.01% | $0.001071 | 8,181.8982 | $8.76 | |
ETH | <0.01% | $0.389175 | 22.4717 | $8.75 | |
ETH | <0.01% | <$0.000001 | 98,896,848,534.8093 | $8.73 | |
ETH | <0.01% | $21.28 | 0.4098 | $8.72 | |
ETH | <0.01% | $0.000353 | 24,640.8619 | $8.71 | |
ETH | <0.01% | $0.000198 | 43,790.1663 | $8.68 | |
ETH | <0.01% | $0.009871 | 876.1976 | $8.65 | |
ETH | <0.01% | <$0.000001 | 31,676,888,560.9041 | $8.62 | |
ETH | <0.01% | $0.02529 | 336.9082 | $8.52 | |
ETH | <0.01% | $0.199143 | 42.5855 | $8.48 | |
ETH | <0.01% | $0.078792 | 107.6064 | $8.48 | |
ETH | <0.01% | <$0.000001 | 59,597,484,488,382.867 | $8.48 | |
ETH | <0.01% | $1 | 8.4058 | $8.42 | |
ETH | <0.01% | $0.045169 | 185.798 | $8.39 | |
ETH | <0.01% | $0.00016 | 52,036.6591 | $8.32 | |
ETH | <0.01% | $0.01191 | 696.4693 | $8.3 | |
ETH | <0.01% | $0.005703 | 1,453.4299 | $8.29 | |
ETH | <0.01% | $0.001283 | 6,387.8435 | $8.2 | |
ETH | <0.01% | $0.0036 | 2,271.9906 | $8.18 | |
ETH | <0.01% | $1.99 | 4.0918 | $8.14 | |
ETH | <0.01% | $0.88696 | 9.1091 | $8.08 | |
ETH | <0.01% | <$0.000001 | 1,030,984,321.6085 | $8.06 | |
ETH | <0.01% | $0.535172 | 15.0335 | $8.05 | |
ETH | <0.01% | $0.001151 | 6,913.2011 | $7.96 | |
ETH | <0.01% | <$0.000001 | 9,101,493,446.8011 | $7.95 | |
ETH | <0.01% | $0.189947 | 41.852 | $7.95 | |
ETH | <0.01% | $0.000003 | 2,953,137.5214 | $7.9 | |
ETH | <0.01% | $0.00184 | 4,272.791 | $7.86 | |
ETH | <0.01% | $0.003447 | 2,274.5928 | $7.84 | |
ETH | <0.01% | $0.00904 | 867.1017 | $7.84 | |
ETH | <0.01% | $0.026536 | 295.0831 | $7.83 | |
ETH | <0.01% | $0.064556 | 120.3634 | $7.77 | |
ETH | <0.01% | $0.001103 | 7,033.5647 | $7.76 | |
ETH | <0.01% | $0.004626 | 1,671.8821 | $7.73 | |
ETH | <0.01% | <$0.000001 | 74,206,743.1411 | $7.72 | |
ETH | <0.01% | $4,863.53 | 0.00158588 | $7.71 | |
ETH | <0.01% | $0.000001 | 5,616,547.641 | $7.71 | |
ETH | <0.01% | <$0.000001 | 24,148,329.5092 | $7.71 | |
ETH | <0.01% | $1.19 | 6.4746 | $7.7 | |
ETH | <0.01% | $0.146292 | 51.9746 | $7.6 | |
ETH | <0.01% | $0.002586 | 2,936.7961 | $7.59 | |
ETH | <0.01% | $0.000003 | 2,664,062.9317 | $7.59 | |
ETH | <0.01% | $0.056761 | 133.4189 | $7.57 | |
ETH | <0.01% | $0.010509 | 713.1984 | $7.5 | |
ETH | <0.01% | <$0.000001 | 25,813,177,901.0746 | $7.49 | |
ETH | <0.01% | <$0.000001 | 234,211,409.2599 | $7.46 | |
ETH | <0.01% | $0.044139 | 167.6829 | $7.4 | |
ETH | <0.01% | $0.004859 | 1,517.5855 | $7.37 | |
ETH | <0.01% | $0.015811 | 465.3934 | $7.36 | |
ETH | <0.01% | $0.185511 | 39.5849 | $7.34 | |
ETH | <0.01% | <$0.000001 | 260,798,081.3211 | $7.32 | |
ETH | <0.01% | $0.007566 | 964.2994 | $7.3 | |
ETH | <0.01% | $80.26 | 0.0908 | $7.28 | |
ETH | <0.01% | $0.002425 | 2,993.1918 | $7.26 | |
ETH | <0.01% | $1.12 | 6.4715 | $7.25 | |
ETH | <0.01% | $0.051548 | 140.4258 | $7.24 | |
ETH | <0.01% | $0.00163 | 4,402.7714 | $7.18 | |
ETH | <0.01% | $0.699152 | 10.2588 | $7.17 | |
ETH | <0.01% | $0.100425 | 70.978 | $7.13 | |
ETH | <0.01% | $0.282209 | 25.2315 | $7.12 | |
ETH | <0.01% | $0.057753 | 123.0456 | $7.11 | |
ETH | <0.01% | $0.074602 | 95.155 | $7.1 | |
ETH | <0.01% | $0.0021 | 3,349.0053 | $7.03 | |
ETH | <0.01% | $0.006293 | 1,108.5236 | $6.98 | |
ETH | <0.01% | $0.001003 | 6,930.8635 | $6.95 | |
ETH | <0.01% | $0.559318 | 12.3947 | $6.93 | |
ETH | <0.01% | $190.63 | 0.0361 | $6.88 | |
ETH | <0.01% | $0.000013 | 519,519.8489 | $6.83 | |
ETH | <0.01% | $0.000004 | 1,912,884.826 | $6.82 | |
ETH | <0.01% | $0.000711 | 9,497.1727 | $6.75 | |
ETH | <0.01% | $0.649649 | 10.3419 | $6.72 | |
ETH | <0.01% | <$0.000001 | 17,298,365,827.7661 | $6.67 | |
ETH | <0.01% | $0.071423 | 93.1176 | $6.65 | |
ETH | <0.01% | $0.002212 | 2,973.041 | $6.58 | |
ETH | <0.01% | <$0.000001 | 3,507,457,932.3659 | $6.57 | |
ETH | <0.01% | $0.000248 | 26,343.2488 | $6.53 | |
ETH | <0.01% | $0.006841 | 953.7137 | $6.52 | |
ETH | <0.01% | $0.026558 | 244.2063 | $6.49 | |
ETH | <0.01% | <$0.000001 | 10,037,259,972.3222 | $6.45 | |
ETH | <0.01% | $0.045556 | 140.9499 | $6.42 | |
ETH | <0.01% | $4,204.54 | 0.00151978 | $6.39 | |
ETH | <0.01% | $0.015594 | 409.2123 | $6.38 | |
ETH | <0.01% | $0.153168 | 41.3429 | $6.33 | |
ETH | <0.01% | $0.000001 | 10,388,900.2937 | $6.29 | |
ETH | <0.01% | $0.000178 | 35,129.7698 | $6.26 | |
ETH | <0.01% | $0.000005 | 1,280,907.455 | $6.16 | |
ETH | <0.01% | $0.000007 | 878,206.3977 | $6.16 | |
ETH | <0.01% | $0.214334 | 28.5889 | $6.13 | |
ETH | <0.01% | $0.007211 | 845.2824 | $6.1 | |
ETH | <0.01% | $0.135683 | 44.8218 | $6.08 | |
ETH | <0.01% | <$0.000001 | 21,999,407.6497 | $6.06 | |
ETH | <0.01% | $0.002325 | 2,606.159 | $6.06 | |
ETH | <0.01% | $0.000282 | 21,395.8136 | $6.03 | |
ETH | <0.01% | $0.186965 | 31.2693 | $5.85 | |
ETH | <0.01% | $0.000146 | 39,773.8384 | $5.81 | |
ETH | <0.01% | $0.000001 | 7,564,608.3125 | $5.8 | |
ETH | <0.01% | $0.000401 | 14,430.1968 | $5.79 | |
ETH | <0.01% | $0.017101 | 336.6942 | $5.76 | |
ETH | <0.01% | $0.006819 | 842.7513 | $5.75 | |
ETH | <0.01% | <$0.000001 | 3,667,549,733.7878 | $5.74 | |
ETH | <0.01% | <$0.000001 | 2,877,251,261,511.4263 | $5.73 | |
ETH | <0.01% | $0.004626 | 1,235.8917 | $5.72 | |
ETH | <0.01% | <$0.000001 | 28,154,611.8931 | $5.71 | |
ETH | <0.01% | $0.000001 | 4,319,570.8283 | $5.7 | |
ETH | <0.01% | <$0.000001 | 13,375,459.4682 | $5.67 | |
ETH | <0.01% | <$0.000001 | 2,046,484,750.726 | $5.67 | |
ETH | <0.01% | $0.003013 | 1,878.9117 | $5.66 | |
ETH | <0.01% | $0.008767 | 638.4541 | $5.6 | |
ETH | <0.01% | $0.001362 | 4,081.4598 | $5.56 | |
ETH | <0.01% | $0.007311 | 756.6681 | $5.53 | |
ETH | <0.01% | <$0.000001 | 24,902,554.2083 | $5.47 | |
ETH | <0.01% | <$0.000001 | 140,625,433.2427 | $5.46 | |
ETH | <0.01% | <$0.000001 | 568,175,221.0745 | $5.44 | |
ETH | <0.01% | <$0.000001 | 2,076,868,094.548 | $5.44 | |
ETH | <0.01% | $1 | 5.3823 | $5.4 | |
ETH | <0.01% | $1.8 | 3.0019 | $5.4 | |
ETH | <0.01% | $0.000001 | 4,776,642.1214 | $5.35 | |
ETH | <0.01% | $0.203178 | 26.2038 | $5.32 | |
ETH | <0.01% | <$0.000001 | 176,579,335.3048 | $5.3 | |
ETH | <0.01% | $0.000456 | 11,607.7573 | $5.29 | |
ETH | <0.01% | $0.000001 | 7,434,795.7176 | $5.29 | |
ETH | <0.01% | $0.000254 | 20,752.8706 | $5.27 | |
ETH | <0.01% | <$0.000001 | 2,453,187,450.2241 | $5.25 | |
ETH | <0.01% | $0.000025 | 213,138.0751 | $5.25 | |
ETH | <0.01% | $0.000104 | 50,252.4088 | $5.23 | |
ETH | <0.01% | <$0.000001 | 327,046,414,769.7288 | $5.2 | |
ETH | <0.01% | $0.000003 | 1,926,216.7363 | $5.2 | |
ETH | <0.01% | $0.000184 | 28,176.2504 | $5.18 | |
ETH | <0.01% | $0.029535 | 173.9621 | $5.14 | |
ETH | <0.01% | $0.011804 | 433.0441 | $5.11 | |
ETH | <0.01% | $0.000039 | 128,978.7572 | $5.08 | |
ETH | <0.01% | $0.199539 | 25.4378 | $5.08 | |
ETH | <0.01% | $25.68 | 0.1973 | $5.07 | |
ETH | <0.01% | $5.02 | 1 | $5.02 | |
ETH | <0.01% | $0.509935 | 9.8335 | $5.01 | |
ETH | <0.01% | $0.01033 | 484.3544 | $5 | |
ETH | <0.01% | $0.002434 | 2,053.7232 | $5 | |
ETH | <0.01% | $0.017775 | 279.9208 | $4.98 | |
ETH | <0.01% | $0.014618 | 339.0176 | $4.96 | |
ETH | <0.01% | $0.000001 | 7,624,194.2304 | $4.92 | |
ETH | <0.01% | $0.003495 | 1,396.8639 | $4.88 | |
ETH | <0.01% | $0.012507 | 389.1821 | $4.87 | |
ETH | <0.01% | $0.051733 | 94.032 | $4.86 | |
ETH | <0.01% | $0.000121 | 40,032.7143 | $4.85 | |
ETH | <0.01% | $0.013186 | 367.4698 | $4.85 | |
ETH | <0.01% | $31 | 0.1553 | $4.82 | |
ETH | <0.01% | $0.000407 | 11,709.8408 | $4.77 | |
ETH | <0.01% | <$0.000001 | 38,033,481.3173 | $4.75 | |
ETH | <0.01% | $0.000514 | 9,214.0245 | $4.73 | |
ETH | <0.01% | <$0.000001 | 553,528,680.9375 | $4.71 | |
ETH | <0.01% | $0.066717 | 70.287 | $4.69 | |
ETH | <0.01% | $0.000165 | 28,319.7643 | $4.68 | |
ETH | <0.01% | <$0.000001 | 12,009,003.3295 | $4.67 | |
ETH | <0.01% | <$0.000001 | 237,508,159.8186 | $4.67 | |
ETH | <0.01% | $0.36812 | 12.6662 | $4.66 | |
ETH | <0.01% | <$0.000001 | 43,331,327.1174 | $4.66 | |
ETH | <0.01% | $0.001269 | 3,667.638 | $4.66 | |
ETH | <0.01% | $0.142785 | 32.5595 | $4.65 | |
ETH | <0.01% | $1.11 | 4.1862 | $4.65 | |
ETH | <0.01% | $0.00168 | 2,741.8731 | $4.61 | |
ETH | <0.01% | $0.000011 | 402,459.6481 | $4.6 | |
ETH | <0.01% | $0.000172 | 26,648.7467 | $4.59 | |
ETH | <0.01% | $0.857252 | 5.333 | $4.57 | |
ETH | <0.01% | $3.13 | 1.4581 | $4.56 | |
ETH | <0.01% | $0.000834 | 5,459.0959 | $4.55 | |
ETH | <0.01% | $0.003995 | 1,136.8694 | $4.54 | |
ETH | <0.01% | $9.58 | 0.4737 | $4.54 | |
ETH | <0.01% | $1.13 | 3.9925 | $4.51 | |
ETH | <0.01% | $0.000026 | 170,793.3778 | $4.49 | |
ETH | <0.01% | $0.066255 | 67.627 | $4.48 | |
ETH | <0.01% | $0.000002 | 2,354,361.8735 | $4.47 | |
ETH | <0.01% | $0.003334 | 1,333.441 | $4.45 | |
ETH | <0.01% | $0.000047 | 94,502.2945 | $4.44 | |
ETH | <0.01% | $0.150636 | 29.4461 | $4.44 | |
ETH | <0.01% | $0.012647 | 348.8407 | $4.41 | |
ETH | <0.01% | <$0.000001 | 14,429,081,971.1618 | $4.41 | |
ETH | <0.01% | $0.00558 | 786.5972 | $4.39 | |
ETH | <0.01% | $0.009937 | 441.2811 | $4.38 | |
ETH | <0.01% | $12.24 | 0.357 | $4.37 | |
ETH | <0.01% | <$0.000001 | 50,896,733,571.0823 | $4.36 | |
ETH | <0.01% | <$0.000001 | 26,542,595.8585 | $4.35 | |
ETH | <0.01% | $0.000433 | 10,063.4071 | $4.35 | |
ETH | <0.01% | <$0.000001 | 15,091,673,693.1254 | $4.35 | |
ETH | <0.01% | $1.98 | 2.1374 | $4.23 | |
ETH | <0.01% | <$0.000001 | 32,488,220.1476 | $4.2 | |
ETH | <0.01% | $0.120253 | 34.8577 | $4.19 | |
ETH | <0.01% | $0.060079 | 69.4557 | $4.17 | |
ETH | <0.01% | $0.001009 | 4,115.6501 | $4.15 | |
ETH | <0.01% | $0.877971 | 4.6793 | $4.11 | |
ETH | <0.01% | $0.012906 | 313.6339 | $4.05 | |
ETH | <0.01% | $0.000909 | 4,437.9155 | $4.03 | |
ETH | <0.01% | $0.003498 | 1,127.33 | $3.94 | |
ETH | <0.01% | <$0.000001 | 1,323,007,309,512.9697 | $3.9 | |
ETH | <0.01% | $0.021699 | 179.3995 | $3.89 | |
ETH | <0.01% | $0.00161 | 2,417.2654 | $3.89 | |
ETH | <0.01% | $0.135841 | 28.5269 | $3.88 | |
ETH | <0.01% | $0.000043 | 88,963.393 | $3.84 | |
ETH | <0.01% | $0.976284 | 3.9195 | $3.83 | |
ETH | <0.01% | <$0.000001 | 55,681,240,886.4847 | $3.82 | |
ETH | <0.01% | $0.00865 | 441.5128 | $3.82 | |
ETH | <0.01% | <$0.000001 | 13,181,532,198.8198 | $3.8 | |
ETH | <0.01% | $21.78 | 0.1723 | $3.75 | |
ETH | <0.01% | <$0.000001 | 5,261,460,968.215 | $3.74 | |
ETH | <0.01% | <$0.000001 | 2,295,384,215.9168 | $3.73 | |
ETH | <0.01% | $309.49 | 0.012 | $3.72 | |
ETH | <0.01% | $0.001568 | 2,368.1515 | $3.71 | |
ETH | <0.01% | $6.51 | 0.5697 | $3.71 | |
ETH | <0.01% | $0.000183 | 20,011.7993 | $3.67 | |
ETH | <0.01% | $342,394.93 | 0.00001068 | $3.66 | |
ETH | <0.01% | $0.000008 | 458,086.6262 | $3.64 | |
ETH | <0.01% | $0.001733 | 2,066.2768 | $3.58 | |
ETH | <0.01% | $0.685702 | 5.1957 | $3.56 | |
ETH | <0.01% | $1.14 | 3.12 | $3.56 | |
ETH | <0.01% | $0.027584 | 128.8165 | $3.55 | |
ETH | <0.01% | <$0.000001 | 29,101,411.7865 | $3.53 | |
ETH | <0.01% | $0.446742 | 7.8645 | $3.51 | |
ETH | <0.01% | $0.217134 | 16.155 | $3.51 | |
ETH | <0.01% | <$0.000001 | 57,720,516.5407 | $3.5 | |
ETH | <0.01% | $0.006654 | 524.0898 | $3.49 | |
ETH | <0.01% | $0.001097 | 3,176.7599 | $3.48 | |
ETH | <0.01% | $0.079147 | 43.9536 | $3.48 | |
ETH | <0.01% | $67.75 | 0.0507 | $3.44 | |
ETH | <0.01% | $0.204556 | 16.793 | $3.44 | |
ETH | <0.01% | $0.00003 | 113,092.551 | $3.42 | |
ETH | <0.01% | $0.000043 | 79,135.0827 | $3.41 | |
ETH | <0.01% | $0.001059 | 3,216.0729 | $3.41 | |
ETH | <0.01% | $0.484674 | 7.0217 | $3.4 | |
ETH | <0.01% | $0.000208 | 16,352.0243 | $3.4 | |
ETH | <0.01% | $0.06005 | 56.5197 | $3.39 | |
ETH | <0.01% | $0.000897 | 3,785.2708 | $3.39 | |
ETH | <0.01% | <$0.000001 | 13,768,945.516 | $3.39 | |
ETH | <0.01% | $0.047401 | 70.9019 | $3.36 | |
ETH | <0.01% | $0.118717 | 28.192 | $3.35 | |
ETH | <0.01% | $0.000171 | 19,383.8993 | $3.32 | |
ETH | <0.01% | $0.00009 | 36,504.8023 | $3.3 | |
ETH | <0.01% | $7.24 | 0.4552 | $3.3 | |
ETH | <0.01% | $0.000007 | 444,857.7015 | $3.3 | |
ETH | <0.01% | $0.054894 | 59.7121 | $3.28 | |
ETH | <0.01% | $0.001762 | 1,859.7647 | $3.28 | |
ETH | <0.01% | $0.002055 | 1,571.5338 | $3.23 | |
ETH | <0.01% | $0.000001 | 4,290,844.2889 | $3.2 | |
ETH | <0.01% | $0.140475 | 22.7749 | $3.2 | |
ETH | <0.01% | $0.018006 | 177.5969 | $3.2 | |
ETH | <0.01% | $0.000006 | 509,058.3367 | $3.19 | |
ETH | <0.01% | $0.043212 | 72.7588 | $3.14 | |
ETH | <0.01% | $0.390778 | 8.0363 | $3.14 | |
ETH | <0.01% | $0.001506 | 2,073.5021 | $3.12 | |
ETH | <0.01% | <$0.000001 | 6,603,518,467.5821 | $3.11 | |
ETH | <0.01% | $0.014622 | 212.3067 | $3.1 | |
ETH | <0.01% | $0.015296 | 201.6088 | $3.08 | |
ETH | <0.01% | $0.021499 | 143.3935 | $3.08 | |
ETH | <0.01% | $0.001006 | 3,060.7463 | $3.08 | |
ETH | <0.01% | $0.004621 | 664.7175 | $3.07 | |
ETH | <0.01% | $0.000258 | 11,862.3025 | $3.06 | |
ETH | <0.01% | $3,986.35 | 0.00076531 | $3.05 | |
ETH | <0.01% | $0.135928 | 22.3548 | $3.04 | |
ETH | <0.01% | $3.98 | 0.76 | $3.02 | |
ETH | <0.01% | $23.68 | 0.1268 | $3 | |
ETH | <0.01% | $0.000003 | 1,007,449.616 | $2.98 | |
ETH | <0.01% | $0.000004 | 838,438.7709 | $2.98 | |
ETH | <0.01% | $0.003321 | 898.5739 | $2.98 | |
ETH | <0.01% | <$0.000001 | 11,809,471.5655 | $2.98 | |
ETH | <0.01% | $0.000336 | 8,795.4023 | $2.96 | |
ETH | <0.01% | $0.229989 | 12.839 | $2.95 | |
ETH | <0.01% | $0.000071 | 41,220.9533 | $2.95 | |
ETH | <0.01% | $0.000689 | 4,267.0561 | $2.94 | |
ETH | <0.01% | $0.00048 | 6,117.9123 | $2.94 | |
ETH | <0.01% | $0.002455 | 1,174.0269 | $2.88 | |
ETH | <0.01% | $0.000696 | 4,137.171 | $2.88 | |
ETH | <0.01% | $0.655285 | 4.3848 | $2.87 | |
ETH | <0.01% | <$0.000001 | 220,017,222.9466 | $2.87 | |
ETH | <0.01% | $0.253855 | 11.2196 | $2.85 | |
ETH | <0.01% | $0.000004 | 798,880.2268 | $2.81 | |
ETH | <0.01% | <$0.000001 | 4,245,934,992.0473 | $2.81 | |
ETH | <0.01% | $0.846024 | 3.3016 | $2.79 | |
ETH | <0.01% | $0.487949 | 5.7213 | $2.79 | |
ETH | <0.01% | $1 | 2.7826 | $2.78 | |
ETH | <0.01% | <$0.000001 | 21,013,684.6211 | $2.77 | |
ETH | <0.01% | $0.001051 | 2,629.8261 | $2.76 | |
ETH | <0.01% | $0.000003 | 1,007,650.2321 | $2.76 | |
ETH | <0.01% | $13.1 | 0.2101 | $2.75 | |
ETH | <0.01% | $27.91 | 0.098 | $2.74 | |
ETH | <0.01% | $0.000039 | 69,034.7189 | $2.71 | |
ETH | <0.01% | $0.000215 | 12,570.5328 | $2.7 | |
ETH | <0.01% | $0.00038 | 7,093.2391 | $2.7 | |
ETH | <0.01% | $29.34 | 0.091 | $2.67 | |
ETH | <0.01% | $0.037894 | 70.4901 | $2.67 | |
ETH | <0.01% | $0.004997 | 531.6471 | $2.66 | |
ETH | <0.01% | $0.000007 | 354,816.0935 | $2.63 | |
ETH | <0.01% | $0.000175 | 15,017.9463 | $2.62 | |
ETH | <0.01% | $0.002097 | 1,249.1495 | $2.62 | |
ETH | <0.01% | $0.028132 | 92.7011 | $2.61 | |
ETH | <0.01% | $0.641036 | 4.0542 | $2.6 | |
ETH | <0.01% | $23.34 | 0.111 | $2.59 | |
ETH | <0.01% | $0.011294 | 229.21 | $2.59 | |
ETH | <0.01% | $0.001432 | 1,804.5028 | $2.58 | |
ETH | <0.01% | <$0.000001 | 359,995,947.116 | $2.57 | |
ETH | <0.01% | $0.114648 | 22.1406 | $2.54 | |
ETH | <0.01% | $0.020087 | 126.1817 | $2.53 | |
ETH | <0.01% | $0.00301 | 831.6456 | $2.5 | |
ETH | <0.01% | $0.000057 | 44,251.3462 | $2.5 | |
ETH | <0.01% | <$0.000001 | 4,280,326,655.3619 | $2.49 | |
ETH | <0.01% | <$0.000001 | 3,882,870,987.5601 | $2.48 | |
ETH | <0.01% | <$0.000001 | 9,902,839.3755 | $2.47 | |
ETH | <0.01% | $0.649649 | 3.8092 | $2.47 | |
ETH | <0.01% | $0.0041 | 601.6749 | $2.47 | |
ETH | <0.01% | <$0.000001 | 10,729,113,213.33 | $2.47 | |
ETH | <0.01% | $0.006561 | 374.3922 | $2.46 | |
ETH | <0.01% | $0.005331 | 459.3169 | $2.45 | |
ETH | <0.01% | $0.001038 | 2,340.8289 | $2.43 | |
ETH | <0.01% | $0.001312 | 1,848.1524 | $2.43 | |
ETH | <0.01% | $1.07 | 2.2577 | $2.42 | |
ETH | <0.01% | $0.030462 | 79.2286 | $2.41 | |
ETH | <0.01% | $0.000078 | 30,763.4155 | $2.41 | |
ETH | <0.01% | $0.000245 | 9,818.7509 | $2.4 | |
ETH | <0.01% | $6.63 | 0.3618 | $2.4 | |
ETH | <0.01% | $0.079781 | 30.0393 | $2.4 | |
ETH | <0.01% | $0.010878 | 219.1997 | $2.38 | |
ETH | <0.01% | $0.000021 | 110,100.8276 | $2.34 | |
ETH | <0.01% | $0.000033 | 70,154.6774 | $2.33 | |
ETH | <0.01% | $0.000254 | 9,129.4219 | $2.32 | |
ETH | <0.01% | $0.016147 | 141.979 | $2.29 | |
ETH | <0.01% | $0.237605 | 9.5494 | $2.27 | |
ETH | <0.01% | <$0.000001 | 624,832,015.7508 | $2.27 | |
ETH | <0.01% | $0.017456 | 129.7209 | $2.26 | |
ETH | <0.01% | <$0.000001 | 31,243,189,788.6565 | $2.25 | |
ETH | <0.01% | $0.034401 | 65.168 | $2.24 | |
ETH | <0.01% | <$0.000001 | 23,628,818,303.7844 | $2.22 | |
ETH | <0.01% | $0.004499 | 490.0121 | $2.2 | |
ETH | <0.01% | $0.01026 | 213.4543 | $2.19 | |
ETH | <0.01% | $0.044391 | 49.0732 | $2.18 | |
ETH | <0.01% | $0.534812 | 4.0678 | $2.18 | |
ETH | <0.01% | $0.000088 | 24,686.9187 | $2.17 | |
ETH | <0.01% | $0.000213 | 10,209.7473 | $2.17 | |
ETH | <0.01% | $0.028542 | 75.866 | $2.17 | |
ETH | <0.01% | $9.26 | 0.2325 | $2.15 | |
ETH | <0.01% | <$0.000001 | 401,146,224.0548 | $2.15 | |
ETH | <0.01% | $0.000774 | 2,761.0118 | $2.14 | |
ETH | <0.01% | $0.000001 | 3,524,913.536 | $2.13 | |
ETH | <0.01% | $0.001079 | 1,970.0609 | $2.12 | |
ETH | <0.01% | $0.000021 | 100,021.3472 | $2.12 | |
ETH | <0.01% | $0.003416 | 612.1516 | $2.09 | |
ETH | <0.01% | $0.000144 | 14,402.4083 | $2.07 | |
ETH | <0.01% | $0.004608 | 449.4858 | $2.07 | |
ETH | <0.01% | $0.001253 | 1,646.0455 | $2.06 | |
ETH | <0.01% | $0.000001 | 3,522,982.5465 | $2.03 | |
ETH | <0.01% | $0.502886 | 4.0291 | $2.03 | |
ETH | <0.01% | $0.013144 | 153.1633 | $2.01 | |
ETH | <0.01% | $0.000875 | 2,297.4343 | $2.01 | |
ETH | <0.01% | $0.000532 | 3,775.6782 | $2.01 | |
ETH | <0.01% | $1.21 | 1.6613 | $2.01 | |
ETH | <0.01% | $0.063198 | 31.7805 | $2.01 | |
ETH | <0.01% | <$0.000001 | 3,249,697,617.7775 | $2.01 | |
ETH | <0.01% | $0.034122 | 58.6586 | $2 | |
ETH | <0.01% | $0.000138 | 14,420.2271 | $2 | |
ETH | <0.01% | $0.000474 | 4,163.3549 | $1.98 | |
ETH | <0.01% | $1.45 | 1.3273 | $1.93 | |
ETH | <0.01% | $0.022962 | 83.7716 | $1.92 | |
ETH | <0.01% | $0.010608 | 181.0486 | $1.92 | |
ETH | <0.01% | <$0.000001 | 348,205,265.487 | $1.91 | |
ETH | <0.01% | $0.000981 | 1,943.1429 | $1.91 | |
ETH | <0.01% | <$0.000001 | 12,434,446.9448 | $1.89 | |
ETH | <0.01% | $0.009129 | 206.9094 | $1.89 | |
ETH | <0.01% | <$0.000001 | 5,336,693,935.3316 | $1.87 | |
ETH | <0.01% | $0.029354 | 63.5058 | $1.86 | |
ETH | <0.01% | $0.082423 | 22.5944 | $1.86 | |
ETH | <0.01% | $51.17 | 0.0363 | $1.86 | |
ETH | <0.01% | $0.0832 | 22.3024 | $1.86 | |
ETH | <0.01% | $0.001706 | 1,085.9346 | $1.85 | |
ETH | <0.01% | <$0.000001 | 1,581,727,760,288.616 | $1.85 | |
ETH | <0.01% | <$0.000001 | 5,885,522.9103 | $1.84 | |
ETH | <0.01% | $0.001586 | 1,157.1596 | $1.83 | |
ETH | <0.01% | $0.021896 | 83.6088 | $1.83 | |
ETH | <0.01% | $0.028599 | 63.8531 | $1.83 | |
ETH | <0.01% | $0.049992 | 36.4222 | $1.82 | |
ETH | <0.01% | <$0.000001 | 5,311,672.2875 | $1.81 | |
ETH | <0.01% | $0.001907 | 943.7064 | $1.8 | |
ETH | <0.01% | $0.034001 | 52.8907 | $1.8 | |
ETH | <0.01% | $0.016124 | 110.9454 | $1.79 | |
ETH | <0.01% | $0.00007 | 24,961.4801 | $1.75 | |
ETH | <0.01% | $0.005515 | 316.3304 | $1.74 | |
ETH | <0.01% | $0.286349 | 6.0603 | $1.74 | |
ETH | <0.01% | <$0.000001 | 12,266,101.3869 | $1.73 | |
ETH | <0.01% | <$0.000001 | 5,936,425.0501 | $1.73 | |
ETH | <0.01% | $0.010617 | 160.31 | $1.7 | |
ETH | <0.01% | $0.003344 | 504.9545 | $1.69 | |
ETH | <0.01% | <$0.000001 | 4,687,702.684 | $1.68 | |
ETH | <0.01% | $0.023618 | 71.0092 | $1.68 | |
ETH | <0.01% | $0.002684 | 624.2855 | $1.68 | |
ETH | <0.01% | $0.001152 | 1,452.8904 | $1.67 | |
ETH | <0.01% | $0.026133 | 64.0388 | $1.67 | |
ETH | <0.01% | <$0.000001 | 389,265,287.3133 | $1.67 | |
ETH | <0.01% | <$0.000001 | 19,769,991.919 | $1.66 | |
ETH | <0.01% | $0.014011 | 118.6238 | $1.66 | |
ETH | <0.01% | $0.006198 | 268.1095 | $1.66 | |
ETH | <0.01% | $0.000041 | 40,214.1395 | $1.66 | |
ETH | <0.01% | $0.112564 | 14.5963 | $1.64 | |
ETH | <0.01% | $0.000058 | 28,177.0594 | $1.63 | |
ETH | <0.01% | $0.002803 | 573.8037 | $1.61 | |
ETH | <0.01% | $0.000029 | 55,484.1296 | $1.59 | |
ETH | <0.01% | <$0.000001 | 7,314,639,096,143,716 | $1.58 | |
ETH | <0.01% | $0.000835 | 1,888.8779 | $1.58 | |
ETH | <0.01% | $0.000001 | 2,625,224.1677 | $1.58 | |
ETH | <0.01% | $0.019162 | 82.2272 | $1.58 | |
ETH | <0.01% | $0.029657 | 52.8371 | $1.57 | |
ETH | <0.01% | $0.000137 | 11,392.3404 | $1.56 | |
ETH | <0.01% | $0.035729 | 43.4745 | $1.55 | |
ETH | <0.01% | $0.000005 | 288,226.0119 | $1.54 | |
ETH | <0.01% | <$0.000001 | 7,947,921.2066 | $1.53 | |
ETH | <0.01% | $0.023046 | 65.4118 | $1.51 | |
ETH | <0.01% | <$0.000001 | 20,738,159,030.3704 | $1.49 | |
ETH | <0.01% | $0.00024 | 6,207.6938 | $1.49 | |
ETH | <0.01% | $0.000475 | 3,139.3652 | $1.49 | |
ETH | <0.01% | $0.000074 | 19,760.2157 | $1.47 | |
ETH | <0.01% | $4.16 | 0.3506 | $1.46 | |
ETH | <0.01% | $0.001256 | 1,149.3895 | $1.44 | |
ETH | <0.01% | $0.002196 | 653.3193 | $1.43 | |
ETH | <0.01% | $0.014617 | 97.1403 | $1.42 | |
ETH | <0.01% | $0.019354 | 72.8929 | $1.41 | |
ETH | <0.01% | $0.002235 | 623.2473 | $1.39 | |
ETH | <0.01% | $0.008737 | 158.4777 | $1.38 | |
ETH | <0.01% | $0.00153 | 902.1153 | $1.38 | |
ETH | <0.01% | $0.00585 | 234.6427 | $1.37 | |
ETH | <0.01% | <$0.000001 | 403,935,651.2698 | $1.35 | |
ETH | <0.01% | $0.005198 | 256.5824 | $1.33 | |
ETH | <0.01% | $0.000106 | 12,527.5346 | $1.33 | |
ETH | <0.01% | <$0.000001 | 5,529,859,420.6317 | $1.33 | |
ETH | <0.01% | <$0.000001 | 27,836,083,015.9609 | $1.32 | |
ETH | <0.01% | $0.038177 | 34.3132 | $1.31 | |
ETH | <0.01% | $0.239704 | 5.3895 | $1.29 | |
ETH | <0.01% | <$0.000001 | 5,426,071,194.9999 | $1.28 | |
ETH | <0.01% | $0.000672 | 1,909.2244 | $1.28 | |
ETH | <0.01% | <$0.000001 | 22,074,651.0403 | $1.28 | |
ETH | <0.01% | $0.091771 | 13.9391 | $1.28 | |
ETH | <0.01% | $0.05284 | 24.0569 | $1.27 | |
ETH | <0.01% | $0.108092 | 11.7425 | $1.27 | |
ETH | <0.01% | $0.166329 | 7.6159 | $1.27 | |
ETH | <0.01% | $0.006494 | 194.7394 | $1.26 | |
ETH | <0.01% | <$0.000001 | 1,449,519,576.6019 | $1.26 | |
ETH | <0.01% | $0.000215 | 5,817.6659 | $1.25 | |
ETH | <0.01% | $0.030197 | 41.3181 | $1.25 | |
ETH | <0.01% | $0.012219 | 101.9863 | $1.25 | |
ETH | <0.01% | $0.001015 | 1,215.9055 | $1.23 | |
ETH | <0.01% | $0.000439 | 2,794.2559 | $1.23 | |
ETH | <0.01% | $0.000002 | 647,788.871 | $1.22 | |
ETH | <0.01% | $0.03651 | 33.4395 | $1.22 | |
ETH | <0.01% | $8.07 | 0.1498 | $1.21 | |
ETH | <0.01% | $0.004239 | 282.3262 | $1.2 | |
ETH | <0.01% | $3.37 | 0.3516 | $1.19 | |
ETH | <0.01% | $0.000332 | 3,561.6534 | $1.18 | |
ETH | <0.01% | $0.000444 | 2,632.7181 | $1.17 | |
ETH | <0.01% | $0.051092 | 22.8457 | $1.17 | |
ETH | <0.01% | <$0.000001 | 2,395,666.5787 | $1.15 | |
ETH | <0.01% | $0.001726 | 666.5987 | $1.15 | |
ETH | <0.01% | $0.021593 | 53.2501 | $1.15 | |
ETH | <0.01% | <$0.000001 | 10,458,726,727.0587 | $1.15 | |
ETH | <0.01% | $3.51 | 0.3262 | $1.15 | |
ETH | <0.01% | $0.007641 | 149.3967 | $1.14 | |
ETH | <0.01% | <$0.000001 | 298,591,378.9638 | $1.14 | |
ETH | <0.01% | $0.000024 | 47,726.2484 | $1.14 | |
ETH | <0.01% | $11.83 | 0.096 | $1.14 | |
ETH | <0.01% | $0.00013 | 8,562.1192 | $1.12 | |
ETH | <0.01% | <$0.000001 | 10,021,180.2762 | $1.12 | |
ETH | <0.01% | $0.009263 | 119.7613 | $1.11 | |
ETH | <0.01% | $0.004333 | 255.9911 | $1.11 | |
ETH | <0.01% | $0.000498 | 2,218.5524 | $1.11 | |
ETH | <0.01% | $0.434665 | 2.5407 | $1.1 | |
ETH | <0.01% | <$0.000001 | 4,347,198,324.3082 | $1.1 | |
ETH | <0.01% | <$0.000001 | 276,301,265.8843 | $1.09 | |
ETH | <0.01% | $0.005301 | 205.5853 | $1.09 | |
ETH | <0.01% | $0.001467 | 741.2429 | $1.09 | |
ETH | <0.01% | $0.309304 | 3.4901 | $1.08 | |
ETH | <0.01% | <$0.000001 | 120,696,921,060.7917 | $1.07 | |
ETH | <0.01% | $0.001257 | 848.0055 | $1.07 | |
ETH | <0.01% | $0.02311 | 45.977 | $1.06 | |
ETH | <0.01% | $0.00611 | 172.8394 | $1.06 | |
ETH | <0.01% | $0.115428 | 9.0863 | $1.05 | |
ETH | <0.01% | <$0.000001 | 266,471,968.7693 | $1.04 | |
ETH | <0.01% | $0.000153 | 6,757.0702 | $1.04 | |
ETH | <0.01% | <$0.000001 | 3,738,171,376.4149 | $1.02 | |
ETH | <0.01% | $0.001009 | 1,000.508 | $1.01 | |
ETH | <0.01% | $0.052584 | 19.1392 | $1.01 | |
ETH | <0.01% | <$0.000001 | 808,823,621.5638 | $1.01 | |
ETH | <0.01% | $0.002234 | 448.664 | $1 | |
ETH | <0.01% | $0.000165 | 6,041.9479 | $0.9971 | |
ETH | <0.01% | $0.003743 | 265.4719 | $0.9936 | |
ETH | <0.01% | <$0.000001 | 485,440,505.9813 | $0.9854 | |
ETH | <0.01% | $0.000598 | 1,625.2172 | $0.9723 | |
ETH | <0.01% | $0.684477 | 1.407 | $0.963 | |
ETH | <0.01% | $0.007085 | 135.3154 | $0.9587 | |
ETH | <0.01% | <$0.000001 | 2,474,079,385.6125 | $0.957 | |
ETH | <0.01% | $0.003511 | 272.0773 | $0.9551 | |
ETH | <0.01% | $0.000001 | 1,110,102.395 | $0.9539 | |
ETH | <0.01% | $0.134722 | 7.0539 | $0.9503 | |
ETH | <0.01% | $0.000014 | 67,851.2477 | $0.9431 | |
ETH | <0.01% | $0.000001 | 897,463.8137 | $0.9423 | |
ETH | <0.01% | $0.000062 | 15,173.1233 | $0.9374 | |
ETH | <0.01% | <$0.000001 | 12,794,174.6681 | $0.9368 | |
ETH | <0.01% | $0.001072 | 873.5057 | $0.9367 | |
ETH | <0.01% | $0.032966 | 28.1738 | $0.9287 | |
ETH | <0.01% | $0.070758 | 13.0522 | $0.9235 | |
ETH | <0.01% | $0.061549 | 14.9176 | $0.9181 | |
ETH | <0.01% | $0.001256 | 730.6735 | $0.9179 | |
ETH | <0.01% | $0.000205 | 4,419.8834 | $0.9042 | |
ETH | <0.01% | $0.001881 | 479.8762 | $0.9025 | |
ETH | <0.01% | $0.007451 | 121.0169 | $0.9016 | |
ETH | <0.01% | $0.002163 | 414.8314 | $0.8972 | |
ETH | <0.01% | $0.001443 | 621.6202 | $0.8968 | |
ETH | <0.01% | <$0.000001 | 91,375,026.3828 | $0.8966 | |
ETH | <0.01% | $0.001041 | 857.7191 | $0.8932 | |
ETH | <0.01% | $0.042249 | 21.0662 | $0.89 | |
ETH | <0.01% | $0.845833 | 1.0418 | $0.8811 | |
ETH | <0.01% | $0.005843 | 145.5652 | $0.8505 | |
ETH | <0.01% | <$0.000001 | 10,414,015.0427 | $0.849 | |
ETH | <0.01% | $0.229994 | 3.6811 | $0.8466 | |
ETH | <0.01% | $0.104756 | 8.0462 | $0.8428 | |
ETH | <0.01% | $0.00045 | 1,872.6161 | $0.842 | |
ETH | <0.01% | $0.016744 | 50.1631 | $0.8399 | |
ETH | <0.01% | $0.011115 | 74.6143 | $0.8293 | |
ETH | <0.01% | $0.000108 | 7,624.9124 | $0.8263 | |
ETH | <0.01% | $0.000002 | 368,864.7938 | $0.8188 | |
ETH | <0.01% | $104,881 | 0.00000778 | $0.8159 | |
ETH | <0.01% | <$0.000001 | 29,308,015.2271 | $0.8156 | |
ETH | <0.01% | <$0.000001 | 4,560,263.4326 | $0.8027 | |
ETH | <0.01% | $23,759 | 0.00003377 | $0.8022 | |
ETH | <0.01% | $1.28 | 0.6219 | $0.7955 | |
ETH | <0.01% | $0.001251 | 635.5319 | $0.7951 | |
ETH | <0.01% | $0.000041 | 19,161.6283 | $0.7948 | |
ETH | <0.01% | $0.275999 | 2.8473 | $0.7858 | |
ETH | <0.01% | $0.001793 | 437.9093 | $0.7851 | |
ETH | <0.01% | $0.002182 | 355.1258 | $0.7749 | |
ETH | <0.01% | <$0.000001 | 1,781,733.5809 | $0.7727 | |
ETH | <0.01% | $0.02623 | 29.3204 | $0.769 | |
ETH | <0.01% | <$0.000001 | 32,673,237.2896 | $0.7687 | |
ETH | <0.01% | $0.097262 | 7.8538 | $0.7638 | |
ETH | <0.01% | <$0.000001 | 1,727,046.9285 | $0.7637 | |
ETH | <0.01% | $0.000239 | 3,192.3515 | $0.7621 | |
ETH | <0.01% | $0.000758 | 1,001.8361 | $0.7589 | |
ETH | <0.01% | $0.003411 | 221.3156 | $0.7549 | |
ETH | <0.01% | $0.000081 | 9,199.1669 | $0.7479 | |
ETH | <0.01% | $0.003372 | 221.2434 | $0.746 | |
ETH | <0.01% | <$0.000001 | 2,253,757.7191 | $0.742 | |
ETH | <0.01% | $0.002665 | 277.5597 | $0.7396 | |
ETH | <0.01% | $0.059331 | 12.2478 | $0.7266 | |
ETH | <0.01% | $0.000136 | 5,268.7713 | $0.7145 | |
ETH | <0.01% | <$0.000001 | 8,250,815,910.3917 | $0.7055 | |
ETH | <0.01% | $0.00009 | 7,800.6684 | $0.7012 | |
ETH | <0.01% | $0.000464 | 1,491.755 | $0.6925 | |
ETH | <0.01% | $0.000248 | 2,783.0733 | $0.6905 | |
ETH | <0.01% | $0.001624 | 423.9546 | $0.6882 | |
ETH | <0.01% | $0.027404 | 25.0044 | $0.6852 | |
ETH | <0.01% | $0.000229 | 2,986.2456 | $0.6838 | |
ETH | <0.01% | $0.000028 | 24,109.1396 | $0.683 | |
ETH | <0.01% | $0.000463 | 1,473.0255 | $0.6817 | |
ETH | <0.01% | $5.13 | 0.132 | $0.6771 | |
ETH | <0.01% | <$0.000001 | 5,943,528.3941 | $0.6678 | |
ETH | <0.01% | $0.000865 | 770.294 | $0.6665 | |
ETH | <0.01% | $0.014771 | 45.1178 | $0.6664 | |
ETH | <0.01% | $0.009893 | 66.2407 | $0.6553 | |
ETH | <0.01% | $0.000005 | 119,585.1834 | $0.6511 | |
ETH | <0.01% | $0.000071 | 9,111.8458 | $0.6501 | |
ETH | <0.01% | <$0.000001 | 133,649,389.1868 | $0.6491 | |
ETH | <0.01% | <$0.000001 | 3,001,428.8329 | $0.6465 | |
ETH | <0.01% | $0.001832 | 345.5133 | $0.6328 | |
ETH | <0.01% | $0.029503 | 21.2933 | $0.6282 | |
ETH | <0.01% | $0.00793 | 78.1858 | $0.62 | |
ETH | <0.01% | <$0.000001 | 987,652,777.4097 | $0.6101 | |
ETH | <0.01% | $0.005271 | 114.5067 | $0.6035 | |
ETH | <0.01% | $0.029847 | 19.9943 | $0.5967 | |
ETH | <0.01% | $0.051638 | 11.5541 | $0.5966 | |
ETH | <0.01% | $0.07329 | 8.0358 | $0.5889 | |
ETH | <0.01% | <$0.000001 | 5,888,735.8606 | $0.5888 | |
ETH | <0.01% | $0.000009 | 68,288.2227 | $0.5824 | |
ETH | <0.01% | $106,339 | 0.00000547 | $0.5816 | |
ETH | <0.01% | $0.002519 | 228.3996 | $0.5753 | |
ETH | <0.01% | $0.009749 | 58.6524 | $0.5718 | |
ETH | <0.01% | <$0.000001 | 3,168,480,907.5495 | $0.5692 | |
ETH | <0.01% | $0.002826 | 201.4439 | $0.5691 | |
ETH | <0.01% | <$0.000001 | 523,428,570.3656 | $0.5665 | |
ETH | <0.01% | $0.000369 | 1,515.5228 | $0.559 | |
ETH | <0.01% | $0.000461 | 1,189.6079 | $0.548 | |
ETH | <0.01% | $0.011874 | 44.9242 | $0.5334 | |
ETH | <0.01% | <$0.000001 | 7,055,107.8117 | $0.5324 | |
ETH | <0.01% | $0.271942 | 1.9383 | $0.5271 | |
ETH | <0.01% | <$0.000001 | 1,444,403.5055 | $0.526 | |
ETH | <0.01% | <$0.000001 | 29,096,792.9115 | $0.5256 | |
ETH | <0.01% | $0.001746 | 299.0302 | $0.5222 | |
ETH | <0.01% | $0.000017 | 29,820.0683 | $0.5114 | |
ETH | <0.01% | $0.00175 | 292.1779 | $0.5113 | |
ETH | <0.01% | <$0.000001 | 837,878,014.3907 | $0.5078 | |
ETH | <0.01% | $0.00024 | 2,090.9951 | $0.5014 | |
ETH | <0.01% | $0.000039 | 12,737.0232 | $0.4997 | |
ETH | <0.01% | $0.00034 | 1,468 | $0.4987 | |
ETH | <0.01% | $0.095527 | 5.2186 | $0.4985 | |
ETH | <0.01% | $0.051557 | 9.6443 | $0.4972 | |
ETH | <0.01% | $0.006769 | 73.3951 | $0.4967 | |
ETH | <0.01% | $0.010929 | 45.4293 | $0.4964 | |
ETH | <0.01% | $0.454418 | 1.0875 | $0.4941 | |
ETH | <0.01% | $0.496902 | 0.9863 | $0.49 | |
ETH | <0.01% | $0.000111 | 4,401.8258 | $0.489 | |
ETH | <0.01% | $0.076025 | 6.396 | $0.4862 | |
ETH | <0.01% | $0.000038 | 12,511.0502 | $0.4792 | |
ETH | <0.01% | $0.079536 | 5.9971 | $0.4769 | |
ETH | <0.01% | $0.004369 | 107.5038 | $0.4696 | |
ETH | <0.01% | $0.000524 | 896.7149 | $0.4695 | |
ETH | <0.01% | $0.00186 | 251.0263 | $0.4668 | |
ETH | <0.01% | $0.09726 | 4.7659 | $0.4635 | |
ETH | <0.01% | $0.00174 | 262.2949 | $0.4564 | |
ETH | <0.01% | $0.146436 | 3.1156 | $0.4562 | |
ETH | <0.01% | $0.00047 | 964.6697 | $0.4534 | |
ETH | <0.01% | $0.000095 | 4,745.1064 | $0.4517 | |
ETH | <0.01% | <$0.000001 | 1,082,989.3867 | $0.45 | |
ETH | <0.01% | $0.000057 | 7,774.8657 | $0.4462 | |
ETH | <0.01% | $0.000222 | 2,009.4106 | $0.4457 | |
ETH | <0.01% | $0.000046 | 9,586.9933 | $0.4433 | |
ETH | <0.01% | $0.000206 | 2,073.5957 | $0.4272 | |
ETH | <0.01% | <$0.000001 | 84,423,924,555,465.6 | $0.4257 | |
ETH | <0.01% | $0.001148 | 368.0987 | $0.4225 | |
ETH | <0.01% | $0.00028 | 1,491.9481 | $0.4179 | |
ETH | <0.01% | $0.995615 | 0.4197 | $0.4178 | |
ETH | <0.01% | $0.005546 | 74.8353 | $0.415 | |
ETH | <0.01% | $0.924653 | 0.4453 | $0.4117 | |
ETH | <0.01% | <$0.000001 | 3,103,332,927.6931 | $0.4032 | |
ETH | <0.01% | $65.18 | 0.00618391 | $0.403 | |
ETH | <0.01% | $0.000367 | 1,067.9227 | $0.3921 | |
ETH | <0.01% | <$0.000001 | 862,836.3441 | $0.3883 | |
ETH | <0.01% | <$0.000001 | 242,154,639.854 | $0.381 | |
ETH | <0.01% | $0.000597 | 634.9702 | $0.379 | |
ETH | <0.01% | <$0.000001 | 6,290,322.3143 | $0.3723 | |
ETH | <0.01% | $0.058937 | 6.3152 | $0.3722 | |
ETH | <0.01% | $0.000001 | 312,738.1141 | $0.3718 | |
ETH | <0.01% | $0.993911 | 0.3722 | $0.3698 | |
ETH | <0.01% | <$0.000001 | 10,794,940,080,737,304 | $0.367 | |
ETH | <0.01% | $0.002461 | 147.4499 | $0.3628 | |
ETH | <0.01% | $0.021673 | 16.5239 | $0.3581 | |
ETH | <0.01% | <$0.000001 | 1,259,334,226.6268 | $0.3483 | |
ETH | <0.01% | $0.655623 | 0.5285 | $0.3465 | |
ETH | <0.01% | $0.881918 | 0.3891 | $0.3431 | |
ETH | <0.01% | $0.00032 | 1,071.3034 | $0.3423 | |
ETH | <0.01% | $0.000526 | 646.5602 | $0.34 | |
ETH | <0.01% | $0.000035 | 9,443.5979 | $0.3345 | |
ETH | <0.01% | $0.507712 | 0.6557 | $0.3329 | |
ETH | <0.01% | $0.049076 | 6.7104 | $0.3293 | |
ETH | <0.01% | $0.000001 | 500,493.7082 | $0.3277 | |
ETH | <0.01% | $0.000137 | 2,377.4585 | $0.3266 | |
ETH | <0.01% | $0.001461 | 222.3988 | $0.3249 | |
ETH | <0.01% | <$0.000001 | 12,439,543.351 | $0.3233 | |
ETH | <0.01% | $0.000054 | 5,944.5109 | $0.3189 | |
ETH | <0.01% | <$0.000001 | 174,248,266.6663 | $0.3141 | |
ETH | <0.01% | $0.066475 | 4.7011 | $0.3125 | |
ETH | <0.01% | $0.000041 | 7,640.2741 | $0.3097 | |
ETH | <0.01% | $0.032001 | 9.5628 | $0.306 | |
ETH | <0.01% | $12.32 | 0.0246 | $0.303 | |
ETH | <0.01% | $0.000144 | 2,107.7981 | $0.3025 | |
ETH | <0.01% | $0.000563 | 535.4898 | $0.3013 | |
ETH | <0.01% | $1.1 | 0.2734 | $0.3007 | |
ETH | <0.01% | <$0.000001 | 4,104,781,824.611 | $0.2955 | |
ETH | <0.01% | <$0.000001 | 2,145,122,487,873.7021 | $0.2941 | |
ETH | <0.01% | $0.009831 | 29.5371 | $0.2903 | |
ETH | <0.01% | $0.001566 | 185.1776 | $0.2899 | |
ETH | <0.01% | $0.096515 | 2.9388 | $0.2836 | |
ETH | <0.01% | $0.03393 | 8.3219 | $0.2823 | |
ETH | <0.01% | $0.057549 | 4.7325 | $0.2723 | |
ETH | <0.01% | $0.000056 | 4,696.5487 | $0.265 | |
ETH | <0.01% | $0.068541 | 3.7873 | $0.2595 | |
ETH | <0.01% | <$0.000001 | 914,904.1944 | $0.2573 | |
ETH | <0.01% | $0.000187 | 1,366.0617 | $0.256 | |
ETH | <0.01% | $0.000324 | 780.3632 | $0.2528 | |
ETH | <0.01% | $0.065746 | 3.8356 | $0.2521 | |
ETH | <0.01% | $0.008131 | 29.7962 | $0.2422 | |
ETH | <0.01% | $0.000258 | 927.8739 | $0.2391 | |
ETH | <0.01% | <$0.000001 | 624,286.5776 | $0.2384 | |
ETH | <0.01% | $0.057055 | 4.1675 | $0.2377 | |
ETH | <0.01% | $0.005566 | 42.5912 | $0.237 | |
ETH | <0.01% | $0.000012 | 19,181.215 | $0.2349 | |
ETH | <0.01% | $0.788194 | 0.2959 | $0.2332 | |
ETH | <0.01% | $0.282904 | 0.8244 | $0.2332 | |
ETH | <0.01% | $0.000192 | 1,213.0632 | $0.2328 | |
ETH | <0.01% | $31.81 | 0.00722517 | $0.2298 | |
ETH | <0.01% | $0.006906 | 33.1404 | $0.2288 | |
ETH | <0.01% | $0.000792 | 288.4469 | $0.2284 | |
ETH | <0.01% | $104,752 | 0.00000218 | $0.2283 | |
ETH | <0.01% | <$0.000001 | 1,445,832.7905 | $0.228 | |
ETH | <0.01% | <$0.000001 | 826,353,372.1459 | $0.2258 | |
ETH | <0.01% | $0.000542 | 416.5447 | $0.2257 | |
ETH | <0.01% | $0.000406 | 551.3847 | $0.2239 | |
ETH | <0.01% | $0.030913 | 7.1739 | $0.2217 | |
ETH | <0.01% | $0.001557 | 141.3303 | $0.22 | |
ETH | <0.01% | $23.12 | 0.00944467 | $0.2183 | |
ETH | <0.01% | $0.023147 | 9.1805 | $0.2124 | |
ETH | <0.01% | $0.797647 | 0.266 | $0.2121 | |
ETH | <0.01% | <$0.000001 | 385,790,791,760.5448 | $0.2081 | |
ETH | <0.01% | $0.000001 | 380,504.9603 | $0.2019 | |
ETH | <0.01% | $0.177236 | 1.1321 | $0.2006 | |
ETH | <0.01% | $0.025322 | 7.7428 | $0.196 | |
ETH | <0.01% | $0.000001 | 144,764.8718 | $0.1959 | |
ETH | <0.01% | $0.000075 | 2,561.0294 | $0.1925 | |
ETH | <0.01% | $0.001616 | 117.9569 | $0.1906 | |
ETH | <0.01% | <$0.000001 | 298,360,423.0509 | $0.1892 | |
ETH | <0.01% | $0.000021 | 8,799.5002 | $0.1879 | |
ETH | <0.01% | $0.024381 | 7.6214 | $0.1858 | |
ETH | <0.01% | $0.000001 | 140,171.0739 | $0.1836 | |
ETH | <0.01% | $0.000293 | 622.9285 | $0.1825 | |
ETH | <0.01% | $0.002238 | 80.646 | $0.1805 | |
ETH | <0.01% | $0.000006 | 28,795.4155 | $0.1793 | |
ETH | <0.01% | $1.32 | 0.1319 | $0.174 | |
ETH | <0.01% | $0.529809 | 0.3253 | $0.1723 | |
ETH | <0.01% | $0.000001 | 188,884.4924 | $0.1676 | |
ETH | <0.01% | <$0.000001 | 3,549,276.0116 | $0.1666 | |
ETH | <0.01% | $0.004143 | 40.0058 | $0.1657 | |
ETH | <0.01% | $0.000377 | 438.9192 | $0.1652 | |
ETH | <0.01% | <$0.000001 | 1,387,669.7049 | $0.1638 | |
ETH | <0.01% | $1 | 0.1618 | $0.1621 | |
ETH | <0.01% | $0.04303 | 3.7381 | $0.1608 | |
ETH | <0.01% | <$0.000001 | 1,583,002,851.599 | $0.1573 | |
ETH | <0.01% | $0.020815 | 7.5458 | $0.157 | |
ETH | <0.01% | $72.93 | 0.00211695 | $0.1543 | |
ETH | <0.01% | $0.000974 | 158.218 | $0.1541 | |
ETH | <0.01% | <$0.000001 | 327,037,992,964.7354 | $0.1541 | |
ETH | <0.01% | $1.04 | 0.1465 | $0.1522 | |
ETH | <0.01% | $11.26 | 0.013 | $0.1468 | |
ETH | <0.01% | $0.07181 | 2 | $0.1436 | |
ETH | <0.01% | $0.002791 | 50.5337 | $0.141 | |
ETH | <0.01% | $3,995.19 | 0.000035 | $0.1398 | |
ETH | <0.01% | $0.001664 | 83.2395 | $0.1385 | |
ETH | <0.01% | $0.015983 | 8.6551 | $0.1383 | |
ETH | <0.01% | $0.921094 | 0.1499 | $0.1381 | |
ETH | <0.01% | $0.026078 | 5.2567 | $0.137 | |
ETH | <0.01% | $0.021105 | 6.4348 | $0.1358 | |
ETH | <0.01% | <$0.000001 | 883,308.2967 | $0.1339 | |
ETH | <0.01% | $0.017949 | 7.4352 | $0.1334 | |
ETH | <0.01% | $0.060341 | 2.1887 | $0.132 | |
ETH | <0.01% | $0.003353 | 39.3005 | $0.1317 | |
ETH | <0.01% | $0.024783 | 5.2167 | $0.1292 | |
ETH | <0.01% | $0.000371 | 332.7608 | $0.1233 | |
ETH | <0.01% | $0.50144 | 0.2458 | $0.1232 | |
ETH | <0.01% | <$0.000001 | 28,115,475.3887 | $0.122 | |
ETH | <0.01% | $0.008453 | 14.2816 | $0.1207 | |
ETH | <0.01% | $0.008121 | 14.6016 | $0.1185 | |
ETH | <0.01% | <$0.000001 | 1,107,405,774,182.1987 | $0.1185 | |
ETH | <0.01% | $0.000276 | 428.6525 | $0.1183 | |
ETH | <0.01% | <$0.000001 | 318,008.0886 | $0.1146 | |
ETH | <0.01% | $0.208175 | 0.5471 | $0.1139 | |
ETH | <0.01% | $0.000003 | 43,069.1543 | $0.1137 | |
ETH | <0.01% | $0.000501 | 223.3794 | $0.1119 | |
ETH | <0.01% | <$0.000001 | 1,573,122,346.9221 | $0.1095 | |
ETH | <0.01% | $0.000037 | 2,963.9464 | $0.1094 | |
ETH | <0.01% | <$0.000001 | 37,253,385.6531 | $0.1083 | |
ETH | <0.01% | $0.005087 | 21.2683 | $0.1082 | |
ETH | <0.01% | $0.004715 | 22.9412 | $0.1081 | |
ETH | <0.01% | <$0.000001 | 1,138,408.6495 | $0.1059 | |
ETH | <0.01% | $0.001057 | 98.5995 | $0.1042 | |
ETH | <0.01% | $2,524.81 | 0.00004048 | $0.1022 | |
ETH | <0.01% | $0.18792 | 0.5369 | $0.1008 | |
FTM | <0.01% | <$0.000001 | 13,954,983,412.3294 | $3,738.54 | |
FTM | <0.01% | $105,419 | 0.0316 | $3,333.73 | |
FTM | <0.01% | $399.32 | 3.2234 | $1,287.17 | |
FTM | <0.01% | $3,987.32 | 0.1752 | $698.43 | |
FTM | <0.01% | $98,322 | 0.00236726 | $232.75 | |
FTM | <0.01% | $0.081255 | 1,079.4288 | $87.71 | |
FTM | <0.01% | $1.39 | 62.4431 | $86.8 | |
FTM | <0.01% | $0.220321 | 356.2957 | $78.5 | |
FTM | <0.01% | $0.003455 | 21,773.8204 | $75.24 | |
FTM | <0.01% | $0.001826 | 38,900.7756 | $71.03 | |
FTM | <0.01% | $0.062096 | 1,029.3406 | $63.92 | |
FTM | <0.01% | $0.998618 | 61.013 | $60.93 | |
FTM | <0.01% | $379.82 | 0.1566 | $59.49 | |
FTM | <0.01% | $0.347535 | 138.7878 | $48.23 | |
FTM | <0.01% | $10,719.74 | 0.00437303 | $46.88 | |
FTM | <0.01% | $0.045436 | 970.597 | $44.1 | |
FTM | <0.01% | $1.39 | 30.0721 | $41.8 | |
FTM | <0.01% | <$0.000001 | 135,054,741.9053 | $38.54 | |
FTM | <0.01% | $1.94 | 14.2524 | $27.65 | |
FTM | <0.01% | $1 | 24.3459 | $24.44 | |
FTM | <0.01% | $0.000289 | 80,107.1859 | $23.11 | |
FTM | <0.01% | $0.704668 | 30.951 | $21.81 | |
FTM | <0.01% | $1.89 | 10.551 | $19.94 | |
FTM | <0.01% | $0.58733 | 33.25 | $19.53 | |
FTM | <0.01% | $0.047241 | 344.6667 | $16.28 | |
FTM | <0.01% | $0.000062 | 247,538.8441 | $15.25 | |
FTM | <0.01% | $0.824304 | 15.5051 | $12.78 | |
FTM | <0.01% | $1.57 | 8.0344 | $12.61 | |
FTM | <0.01% | $0.000484 | 23,144.6089 | $11.21 | |
FTM | <0.01% | $867.96 | 0.0107 | $9.3 | |
FTM | <0.01% | $0.272954 | 30.7087 | $8.38 | |
FTM | <0.01% | $0.591973 | 12.9269 | $7.65 | |
FTM | <0.01% | <$0.000001 | 37,077,727,482.7821 | $7.42 | |
FTM | <0.01% | $0.000002 | 3,593,975.0049 | $6.33 | |
FTM | <0.01% | $28.82 | 0.2135 | $6.15 | |
FTM | <0.01% | $0.99653 | 5.8729 | $5.85 | |
FTM | <0.01% | $1 | 5.3724 | $5.37 | |
FTM | <0.01% | $0.006488 | 725.077 | $4.7 | |
FTM | <0.01% | <$0.000001 | 22,268,900,374.7183 | $4.45 | |
FTM | <0.01% | $0.011146 | 341.6968 | $3.81 | |
FTM | <0.01% | $1.01 | 3.737 | $3.76 | |
FTM | <0.01% | $0.00009 | 41,623.7345 | $3.76 | |
FTM | <0.01% | $2.03 | 1.6974 | $3.45 | |
FTM | <0.01% | $35.92 | 0.0926 | $3.33 | |
FTM | <0.01% | $0.087671 | 36.8874 | $3.23 | |
FTM | <0.01% | <$0.000001 | 30,704,280,926.4275 | $3.07 | |
FTM | <0.01% | $0.002197 | 1,265.0268 | $2.78 | |
FTM | <0.01% | $2.87 | 0.873 | $2.51 | |
FTM | <0.01% | $3.41 | 0.6881 | $2.35 | |
FTM | <0.01% | $0.010783 | 197.7326 | $2.13 | |
FTM | <0.01% | $4.15 | 0.5011 | $2.08 | |
FTM | <0.01% | $138.49 | 0.0146 | $2.02 | |
FTM | <0.01% | $0.731384 | 2.2177 | $1.62 | |
FTM | <0.01% | $2.45 | 0.637 | $1.56 | |
FTM | <0.01% | $0.891366 | 1.4376 | $1.28 | |
FTM | <0.01% | $1.54 | 0.7615 | $1.17 | |
FTM | <0.01% | $0.000089 | 12,669.1979 | $1.13 | |
FTM | <0.01% | $0.000946 | 979.6304 | $0.9268 | |
FTM | <0.01% | <$0.000001 | 7,587,374.4113 | $0.8513 | |
FTM | <0.01% | $0.000323 | 2,522.3848 | $0.8139 | |
FTM | <0.01% | $0.028014 | 27.9449 | $0.7828 | |
FTM | <0.01% | $0.996775 | 0.6357 | $0.6336 | |
FTM | <0.01% | $0.027378 | 17.8151 | $0.4877 | |
FTM | <0.01% | $1 | 0.4681 | $0.4686 | |
FTM | <0.01% | $0.291258 | 1.3799 | $0.4019 | |
FTM | <0.01% | $0.006204 | 55.4961 | $0.3442 | |
FTM | <0.01% | $0.000209 | 1,470.6025 | $0.3074 | |
FTM | <0.01% | $0.996775 | 0.2697 | $0.2688 | |
FTM | <0.01% | <$0.000001 | 500,107,275.3277 | $0.25 | |
FTM | <0.01% | $0.016649 | 14.7591 | $0.2457 | |
FTM | <0.01% | $0.00013 | 1,828.4031 | $0.2379 | |
FTM | <0.01% | $0.02359 | 9.9323 | $0.2343 | |
FTM | <0.01% | $0.00001 | 16,356.4495 | $0.1665 | |
FTM | <0.01% | $3,993.08 | 0.00003917 | $0.1564 | |
FTM | <0.01% | $0.034867 | 4.0347 | $0.1406 | |
FTM | <0.01% | $0.002588 | 47.3195 | $0.1224 | |
FTM | <0.01% | $0.039145 | 3.1177 | $0.122 | |
FTM | <0.01% | $0.010548 | 10.322 | $0.1088 | |
POL | <0.01% | $0.005351 | 109,750.3825 | $587.33 | |
POL | <0.01% | $0.00375 | 134,128.6516 | $503.04 | |
POL | <0.01% | $0.031785 | 7,300.0845 | $232.03 | |
POL | <0.01% | $399.32 | 0.332 | $132.58 | |
POL | <0.01% | $0.056801 | 1,642.2846 | $93.28 | |
POL | <0.01% | $0.011698 | 7,637.1064 | $89.34 | |
POL | <0.01% | $0.004857 | 17,565.3046 | $85.32 | |
POL | <0.01% | $0.17698 | 457.9446 | $81.05 | |
POL | <0.01% | $379.82 | 0.2035 | $77.28 | |
POL | <0.01% | $0.030523 | 2,489.9638 | $76 | |
POL | <0.01% | $0.740728 | 100.2581 | $74.26 | |
POL | <0.01% | <$0.000001 | 4,789,173,161.7894 | $74.23 | |
POL | <0.01% | $2,654.71 | 0.0277 | $73.62 | |
POL | <0.01% | $0.003442 | 19,028.8834 | $65.5 | |
POL | <0.01% | $1.27 | 51.4318 | $65.32 | |
POL | <0.01% | $0.246347 | 257.9283 | $63.54 | |
POL | <0.01% | $0.272954 | 228.5722 | $62.39 | |
POL | <0.01% | <$0.000001 | 1,317,160,948.7478 | $61.77 | |
POL | <0.01% | $2.03 | 30.3863 | $61.68 | |
POL | <0.01% | $0.0181 | 3,214.5471 | $58.18 | |
POL | <0.01% | $0.184431 | 311.8661 | $57.52 | |
POL | <0.01% | $0.202638 | 278.9859 | $56.53 | |
POL | <0.01% | $1 | 53.6362 | $53.64 | |
POL | <0.01% | $0.005836 | 8,674.0444 | $50.62 | |
POL | <0.01% | $16.28 | 2.9976 | $48.8 | |
POL | <0.01% | $2.87 | 16.9986 | $48.79 | |
POL | <0.01% | $0.242648 | 197.5738 | $47.94 | |
POL | <0.01% | $3,984.44 | 0.0118 | $47.12 | |
POL | <0.01% | $1.07 | 42.4009 | $45.5 | |
POL | <0.01% | $2.36 | 18.841 | $44.46 | |
POL | <0.01% | $0.368799 | 119.7578 | $44.17 | |
POL | <0.01% | $3.95 | 10.9577 | $43.28 | |
POL | <0.01% | $0.002594 | 16,563.6262 | $42.96 | |
POL | <0.01% | $0.004957 | 8,382.2314 | $41.55 | |
POL | <0.01% | $0.218038 | 189.8319 | $41.39 | |
POL | <0.01% | $0.595033 | 67.5706 | $40.21 | |
POL | <0.01% | $0.002345 | 16,949.8297 | $39.74 | |
POL | <0.01% | $0.275581 | 136.9328 | $37.74 | |
POL | <0.01% | $0.000958 | 37,378.0228 | $35.8 | |
POL | <0.01% | $6.51 | 5.4463 | $35.46 | |
POL | <0.01% | $3.72 | 8.6868 | $32.31 | |
POL | <0.01% | $0.079485 | 401.4808 | $31.91 | |
POL | <0.01% | $0.484288 | 63.8882 | $30.94 | |
POL | <0.01% | $0.013205 | 2,330.4393 | $30.77 | |
POL | <0.01% | $0.000005 | 5,922,457.0888 | $29.74 | |
POL | <0.01% | $0.000638 | 45,862.1982 | $29.28 | |
POL | <0.01% | $0.053943 | 539.2176 | $29.09 | |
POL | <0.01% | $0.200248 | 132.5524 | $26.54 | |
POL | <0.01% | $0.009744 | 2,624.9788 | $25.58 | |
POL | <0.01% | $28.82 | 0.8521 | $24.56 | |
POL | <0.01% | $216.33 | 0.1127 | $24.38 | |
POL | <0.01% | $2.57 | 9.4049 | $24.17 | |
POL | <0.01% | $0.006306 | 3,769.503 | $23.77 | |
POL | <0.01% | $1 | 23.1058 | $23.11 | |
POL | <0.01% | $0.00484 | 4,733.5176 | $22.91 | |
POL | <0.01% | $0.045436 | 500.3595 | $22.73 | |
POL | <0.01% | $9.43 | 2.3209 | $21.89 | |
POL | <0.01% | $0.716678 | 30.4322 | $21.81 | |
POL | <0.01% | $0.100972 | 211.8839 | $21.39 | |
POL | <0.01% | $0.000013 | 1,556,654.885 | $20.49 | |
POL | <0.01% | $1.43 | 13.3601 | $19.1 | |
POL | <0.01% | $0.001226 | 14,664.1416 | $17.98 | |
POL | <0.01% | $3.43 | 5.2108 | $17.87 | |
POL | <0.01% | <$0.000001 | 76,072,150.4382 | $17.63 | |
POL | <0.01% | $1.33 | 12.7198 | $16.92 | |
POL | <0.01% | $0.012223 | 1,373.2733 | $16.79 | |
POL | <0.01% | $0.003413 | 4,597.9146 | $15.69 | |
POL | <0.01% | $0.007143 | 2,075.13 | $14.82 | |
POL | <0.01% | $1.47 | 9.6302 | $14.16 | |
POL | <0.01% | $0.003685 | 3,724.4251 | $13.73 | |
POL | <0.01% | $2.24 | 6.033 | $13.51 | |
POL | <0.01% | $0.000027 | 468,727.4728 | $12.75 | |
POL | <0.01% | $0.000022 | 558,226.2845 | $12.46 | |
POL | <0.01% | $0.698541 | 17.6626 | $12.34 | |
POL | <0.01% | $0.000037 | 333,913.3955 | $12.28 | |
POL | <0.01% | $0.032323 | 350.31 | $11.32 | |
POL | <0.01% | $0.031938 | 347.4016 | $11.1 | |
POL | <0.01% | $0.014334 | 761.6161 | $10.92 | |
POL | <0.01% | $1 | 10.6261 | $10.64 | |
POL | <0.01% | $0.005471 | 1,915.0809 | $10.48 | |
POL | <0.01% | $0.049152 | 200.4575 | $9.85 | |
POL | <0.01% | $0.001254 | 7,773.8916 | $9.75 | |
POL | <0.01% | $1.55 | 5.622 | $8.71 | |
POL | <0.01% | $0.346991 | 24.6268 | $8.55 | |
POL | <0.01% | $0.598857 | 14.2257 | $8.52 | |
POL | <0.01% | $0.322755 | 25.8448 | $8.34 | |
POL | <0.01% | $0.001461 | 5,497.2617 | $8.03 | |
POL | <0.01% | $0.012416 | 588.3083 | $7.3 | |
POL | <0.01% | $11.05 | 0.6589 | $7.28 | |
POL | <0.01% | $0.009156 | 791.5603 | $7.25 | |
POL | <0.01% | $0.022999 | 314.4162 | $7.23 | |
POL | <0.01% | $0.993012 | 6.9938 | $6.94 | |
POL | <0.01% | $0.011734 | 591.2362 | $6.94 | |
POL | <0.01% | $0.001912 | 3,528.916 | $6.75 | |
POL | <0.01% | $0.006333 | 1,042.9277 | $6.61 | |
POL | <0.01% | <$0.000001 | 19,701,703.7293 | $6.6 | |
POL | <0.01% | $0.004948 | 1,321.7005 | $6.54 | |
POL | <0.01% | $0.005414 | 1,167.1979 | $6.32 | |
POL | <0.01% | $0.007169 | 875.1505 | $6.27 | |
POL | <0.01% | $0.046488 | 134.325 | $6.24 | |
POL | <0.01% | $0.204342 | 30.3847 | $6.21 | |
POL | <0.01% | $0.018269 | 332.3326 | $6.07 | |
POL | <0.01% | $0.003246 | 1,859.5842 | $6.04 | |
POL | <0.01% | <$0.000001 | 317,041,986.1396 | $5.61 | |
POL | <0.01% | $0.448338 | 12.1628 | $5.45 | |
POL | <0.01% | $0.000795 | 6,808.4779 | $5.41 | |
POL | <0.01% | $0.000437 | 12,303.3886 | $5.38 | |
POL | <0.01% | $0.014273 | 363.1889 | $5.18 | |
POL | <0.01% | $0.153514 | 33.691 | $5.17 | |
POL | <0.01% | $3.55 | 1.4368 | $5.1 | |
POL | <0.01% | $0.003959 | 1,271.5586 | $5.03 | |
POL | <0.01% | $0.031921 | 143.1559 | $4.57 | |
POL | <0.01% | $1.04 | 4.2738 | $4.46 | |
POL | <0.01% | $0.000465 | 9,588.2545 | $4.46 | |
POL | <0.01% | $0.015904 | 252.4215 | $4.01 | |
POL | <0.01% | $0.230109 | 17.41 | $4.01 | |
POL | <0.01% | $0.001733 | 2,265.323 | $3.93 | |
POL | <0.01% | $0.026204 | 148.8266 | $3.9 | |
POL | <0.01% | $8.89 | 0.4253 | $3.78 | |
POL | <0.01% | $0.170283 | 20.8539 | $3.55 | |
POL | <0.01% | $0.01152 | 304.3003 | $3.51 | |
POL | <0.01% | $0.060273 | 56.6879 | $3.42 | |
POL | <0.01% | $0.002636 | 1,269.7704 | $3.35 | |
POL | <0.01% | $1.07 | 3.0989 | $3.31 | |
POL | <0.01% | $0.737443 | 4.4412 | $3.28 | |
POL | <0.01% | $0.001103 | 2,955.1081 | $3.26 | |
POL | <0.01% | $1.19 | 2.5735 | $3.06 | |
POL | <0.01% | $0.000295 | 10,068.3669 | $2.97 | |
POL | <0.01% | $0.000001 | 2,675,547.8557 | $2.97 | |
POL | <0.01% | $1.05 | 2.7869 | $2.93 | |
POL | <0.01% | $0.000043 | 66,049.2736 | $2.84 | |
POL | <0.01% | $0.603111 | 4.5632 | $2.75 | |
POL | <0.01% | $0.008449 | 323.9784 | $2.74 | |
POL | <0.01% | $0.015957 | 160.2303 | $2.56 | |
POL | <0.01% | $0.001281 | 1,974.9025 | $2.53 | |
POL | <0.01% | $0.007636 | 326.048 | $2.49 | |
POL | <0.01% | $0.001011 | 2,438.467 | $2.47 | |
POL | <0.01% | $0.001184 | 2,024.106 | $2.4 | |
POL | <0.01% | $0.152623 | 15.7058 | $2.4 | |
POL | <0.01% | $0.209002 | 10.9691 | $2.29 | |
POL | <0.01% | $0.012353 | 177.797 | $2.2 | |
POL | <0.01% | $0.088303 | 24.4535 | $2.16 | |
POL | <0.01% | $0.396569 | 5.3596 | $2.13 | |
POL | <0.01% | $0.000201 | 10,316.742 | $2.07 | |
POL | <0.01% | $0.00009 | 20,607.3293 | $1.86 | |
POL | <0.01% | $0.136574 | 12.9503 | $1.77 | |
POL | <0.01% | $0.110822 | 15.9263 | $1.76 | |
POL | <0.01% | $0.008726 | 197.1324 | $1.72 | |
POL | <0.01% | $49.07 | 0.0346 | $1.7 | |
POL | <0.01% | $0.002377 | 691.4906 | $1.64 | |
POL | <0.01% | $0.849209 | 1.8485 | $1.57 | |
POL | <0.01% | $105.42 | 0.0145 | $1.53 | |
POL | <0.01% | $0.529249 | 2.7671 | $1.46 | |
POL | <0.01% | $0.004941 | 293.6019 | $1.45 | |
POL | <0.01% | $27.87 | 0.0516 | $1.44 | |
POL | <0.01% | $0.002869 | 462.2194 | $1.33 | |
POL | <0.01% | $0.006021 | 218.3545 | $1.31 | |
POL | <0.01% | $0.010678 | 115.6181 | $1.23 | |
POL | <0.01% | $0.016252 | 73.5431 | $1.2 | |
POL | <0.01% | $0.001059 | 1,033.4779 | $1.09 | |
POL | <0.01% | $0.001086 | 1,001.2987 | $1.09 | |
POL | <0.01% | $0.00009 | 11,823.1588 | $1.06 | |
POL | <0.01% | $0.000002 | 518,186.0942 | $1.04 | |
POL | <0.01% | $0.001072 | 961.1919 | $1.03 | |
POL | <0.01% | $0.006884 | 148.8307 | $1.02 | |
POL | <0.01% | $0.894172 | 1.1033 | $0.9865 | |
POL | <0.01% | $0.003719 | 248.5945 | $0.9244 | |
POL | <0.01% | $0.001301 | 705.1697 | $0.9174 | |
POL | <0.01% | $0.134364 | 6.4161 | $0.862 | |
POL | <0.01% | $0.307508 | 2.611 | $0.8029 | |
POL | <0.01% | $0.089599 | 7.9811 | $0.7151 | |
POL | <0.01% | $0.918037 | 0.7768 | $0.7131 | |
POL | <0.01% | $0.000057 | 12,270.7377 | $0.6939 | |
POL | <0.01% | $0.003656 | 186.5294 | $0.6819 | |
POL | <0.01% | $0.012397 | 53.8251 | $0.6672 | |
POL | <0.01% | $1 | 0.6672 | $0.6672 | |
POL | <0.01% | $0.000033 | 19,601.766 | $0.6494 | |
POL | <0.01% | $0.001778 | 362.8155 | $0.6449 | |
POL | <0.01% | $0.097825 | 6.5772 | $0.6434 | |
POL | <0.01% | $0.001961 | 308.9757 | $0.6057 | |
POL | <0.01% | $0.025087 | 23.1309 | $0.5802 | |
POL | <0.01% | $0.004074 | 141.5864 | $0.5768 | |
POL | <0.01% | $0.000448 | 1,215.28 | $0.5446 | |
POL | <0.01% | $0.000367 | 1,478.5453 | $0.5425 | |
POL | <0.01% | $0.000244 | 2,204.8653 | $0.539 | |
POL | <0.01% | $0.00502 | 105.5899 | $0.53 | |
POL | <0.01% | $0.16775 | 3.1342 | $0.5257 | |
POL | <0.01% | $0.002438 | 210.9877 | $0.5143 | |
POL | <0.01% | $0.000651 | 747.1141 | $0.4866 | |
POL | <0.01% | $0.000001 | 412,496.7379 | $0.4537 | |
POL | <0.01% | $0.05249 | 7.654 | $0.4017 | |
POL | <0.01% | <$0.000001 | 1,894,375.3497 | $0.3904 | |
POL | <0.01% | $1.07 | 0.34 | $0.3634 | |
POL | <0.01% | $0.742623 | 0.4795 | $0.356 | |
POL | <0.01% | $0.001201 | 286.6951 | $0.3442 | |
POL | <0.01% | $0.001694 | 201.9112 | $0.342 | |
POL | <0.01% | $0.024371 | 13.8952 | $0.3386 | |
POL | <0.01% | $1 | 0.3354 | $0.3353 | |
POL | <0.01% | $0.99653 | 0.3273 | $0.3261 | |
POL | <0.01% | $1.39 | 0.2286 | $0.3177 | |
POL | <0.01% | $0.002241 | 124.3261 | $0.2786 | |
POL | <0.01% | $0.000138 | 1,929.8292 | $0.267 | |
POL | <0.01% | $0.054377 | 4.7389 | $0.2576 | |
POL | <0.01% | $0.553352 | 0.4572 | $0.2529 | |
POL | <0.01% | $0.007169 | 34.8768 | $0.25 | |
POL | <0.01% | $0.000167 | 1,488.18 | $0.2487 | |
POL | <0.01% | $0.000118 | 1,977.6194 | $0.2337 | |
POL | <0.01% | $0.000986 | 234.4675 | $0.2311 | |
POL | <0.01% | $0.000282 | 816.0405 | $0.2299 | |
POL | <0.01% | $0.000866 | 253.3506 | $0.2193 | |
POL | <0.01% | $0.676604 | 0.3228 | $0.2184 | |
POL | <0.01% | $0.488821 | 0.4453 | $0.2176 | |
POL | <0.01% | $0.000991 | 216.1936 | $0.2142 | |
POL | <0.01% | $0.217129 | 0.9351 | $0.203 | |
POL | <0.01% | $0.142616 | 1.4148 | $0.2017 | |
POL | <0.01% | $0.097281 | 2.0563 | $0.20 | |
POL | <0.01% | $63.93 | 0.00306559 | $0.1959 | |
POL | <0.01% | $0.000006 | 31,706.637 | $0.1921 | |
POL | <0.01% | $0.001629 | 117.0869 | $0.1907 | |
POL | <0.01% | $0.011827 | 15.6773 | $0.1854 | |
POL | <0.01% | $0.003463 | 51.368 | $0.1779 | |
POL | <0.01% | $0.000014 | 12,387.7625 | $0.1759 | |
POL | <0.01% | $0.007112 | 23.0447 | $0.1639 | |
POL | <0.01% | $0.000313 | 508.6217 | $0.1593 | |
POL | <0.01% | $0.001008 | 150.8251 | $0.152 | |
POL | <0.01% | $0.000013 | 11,641.9804 | $0.1483 | |
POL | <0.01% | $0.000099 | 1,469.731 | $0.1457 | |
POL | <0.01% | $0.039145 | 3.4973 | $0.1369 | |
POL | <0.01% | $0.06044 | 1.936 | $0.117 | |
POL | <0.01% | $0.027389 | 3.7552 | $0.1028 | |
ARB | <0.01% | $399.36 | 0.7467 | $298.21 | |
ARB | <0.01% | $1.01 | 182.8576 | $183.95 | |
ARB | <0.01% | $1 | 112.3978 | $112.51 | |
ARB | <0.01% | $1 | 103.3579 | $103.36 | |
ARB | <0.01% | $0.323796 | 284.1704 | $92.01 | |
ARB | <0.01% | $37.3 | 2.4397 | $91 | |
ARB | <0.01% | $1 | 77.3499 | $77.35 | |
ARB | <0.01% | $3,992 | 0.0189 | $75.57 | |
ARB | <0.01% | $2.03 | 36.0192 | $73.12 | |
ARB | <0.01% | $65.16 | 1.1199 | $72.97 | |
ARB | <0.01% | $0.140431 | 459.3957 | $64.51 | |
ARB | <0.01% | $0.003985 | 14,960.4739 | $59.61 | |
ARB | <0.01% | $0.093129 | 560.3584 | $52.19 | |
ARB | <0.01% | $0.014886 | 3,406.4992 | $50.71 | |
ARB | <0.01% | $0.197502 | 250.7912 | $49.53 | |
ARB | <0.01% | $0.275623 | 158.4262 | $43.67 | |
ARB | <0.01% | $0.078387 | 490.6169 | $38.46 | |
ARB | <0.01% | $0.034786 | 1,098.8061 | $38.22 | |
ARB | <0.01% | <$0.000001 | 95,456,068,253.461 | $38.18 | |
ARB | <0.01% | $2.24 | 16.2915 | $36.49 | |
ARB | <0.01% | $0.077009 | 458.8358 | $35.33 | |
ARB | <0.01% | $2.35 | 14.9767 | $35.2 | |
ARB | <0.01% | $0.87923 | 40.0065 | $35.17 | |
ARB | <0.01% | $1 | 29.3021 | $29.3 | |
ARB | <0.01% | $0.000012 | 2,116,781.6132 | $25.8 | |
ARB | <0.01% | $1,668.81 | 0.0151 | $25.25 | |
ARB | <0.01% | $0.330855 | 60.3191 | $19.96 | |
ARB | <0.01% | $0.000946 | 20,044.579 | $18.96 | |
ARB | <0.01% | $1.07 | 15.8729 | $17.03 | |
ARB | <0.01% | $0.65428 | 25.8246 | $16.9 | |
ARB | <0.01% | $105,612 | 0.00015306 | $16.16 | |
ARB | <0.01% | $16.29 | 0.9306 | $15.16 | |
ARB | <0.01% | $0.528923 | 24.126 | $12.76 | |
ARB | <0.01% | $0.000024 | 506,963.1983 | $11.93 | |
ARB | <0.01% | $0.918368 | 12.8655 | $11.82 | |
ARB | <0.01% | $0.347573 | 33.418 | $11.62 | |
ARB | <0.01% | $0.02159 | 494.1694 | $10.67 | |
ARB | <0.01% | $28.83 | 0.3624 | $10.45 | |
ARB | <0.01% | $3.63 | 2.8125 | $10.21 | |
ARB | <0.01% | $0.054509 | 184.6344 | $10.06 | |
ARB | <0.01% | $0.273038 | 35.8608 | $9.79 | |
ARB | <0.01% | $0.083114 | 114.9731 | $9.56 | |
ARB | <0.01% | $0.021791 | 426.9769 | $9.3 | |
ARB | <0.01% | $0.053163 | 163.3951 | $8.69 | |
ARB | <0.01% | $0.176806 | 45.6342 | $8.07 | |
ARB | <0.01% | $0.001017 | 7,869.0004 | $8 | |
ARB | <0.01% | <$0.000001 | 1,560,905,110.047 | $7.34 | |
ARB | <0.01% | $0.000006 | 1,154,905.1239 | $6.88 | |
ARB | <0.01% | $0.102289 | 67.1091 | $6.86 | |
ARB | <0.01% | $0.007937 | 843.7911 | $6.7 | |
ARB | <0.01% | $0.004308 | 1,553.9629 | $6.69 | |
ARB | <0.01% | $0.004165 | 1,433.6157 | $5.97 | |
ARB | <0.01% | $0.011645 | 491.869 | $5.73 | |
ARB | <0.01% | $0.000021 | 253,188.8807 | $5.34 | |
ARB | <0.01% | <$0.000001 | 24,758,704.9599 | $5.14 | |
ARB | <0.01% | $3.94 | 1.2855 | $5.06 | |
ARB | <0.01% | $0.066919 | 67.4544 | $4.51 | |
ARB | <0.01% | <$0.000001 | 22,543,865.6504 | $4.26 | |
ARB | <0.01% | $0.017553 | 233.6258 | $4.1 | |
ARB | <0.01% | <$0.000001 | 11,737,341.3021 | $3.92 | |
ARB | <0.01% | $0.582759 | 6.6309 | $3.86 | |
ARB | <0.01% | $0.013078 | 261.5389 | $3.42 | |
ARB | <0.01% | $0.222544 | 14.8709 | $3.31 | |
ARB | <0.01% | $0.016671 | 194.8958 | $3.25 | |
ARB | <0.01% | $0.732142 | 4.0008 | $2.93 | |
ARB | <0.01% | $3.43 | 0.697 | $2.39 | |
ARB | <0.01% | $1.05 | 2.0936 | $2.19 | |
ARB | <0.01% | $6.3 | 0.3457 | $2.18 | |
ARB | <0.01% | $0.004609 | 420.8342 | $1.94 | |
ARB | <0.01% | $0.999626 | 1.9401 | $1.94 | |
ARB | <0.01% | $0.996644 | 1.9324 | $1.93 | |
ARB | <0.01% | $0.004118 | 437.5938 | $1.8 | |
ARB | <0.01% | $0.000043 | 40,056.2407 | $1.72 | |
ARB | <0.01% | $0.996908 | 1.6583 | $1.65 | |
ARB | <0.01% | $0.032774 | 45.122 | $1.48 | |
ARB | <0.01% | $0.035927 | 34.294 | $1.23 | |
ARB | <0.01% | <$0.000001 | 10,880,784.8506 | $1.02 | |
ARB | <0.01% | $0.99874 | 1.0102 | $1.01 | |
ARB | <0.01% | $0.007169 | 118.6269 | $0.8504 | |
ARB | <0.01% | $1 | 0.7939 | $0.7946 | |
ARB | <0.01% | $0.026792 | 28.0233 | $0.7507 | |
ARB | <0.01% | $0.967118 | 0.7464 | $0.7218 | |
ARB | <0.01% | $1.93 | 0.3693 | $0.7127 | |
ARB | <0.01% | <$0.000001 | 1,327,736,085.29 | $0.6638 | |
ARB | <0.01% | $0.210722 | 3.0875 | $0.6506 | |
ARB | <0.01% | $0.001355 | 461.4691 | $0.6252 | |
ARB | <0.01% | $0.091073 | 6.6917 | $0.6094 | |
ARB | <0.01% | $0.170466 | 3.3895 | $0.5777 | |
ARB | <0.01% | $0.067406 | 8.5155 | $0.5739 | |
ARB | <0.01% | $0.186643 | 2.7992 | $0.5224 | |
ARB | <0.01% | $2.82 | 0.1846 | $0.5205 | |
ARB | <0.01% | $0.03725 | 13.5836 | $0.5059 | |
ARB | <0.01% | $0.00001 | 39,594.8597 | $0.403 | |
ARB | <0.01% | $3.26 | 0.1126 | $0.3671 | |
ARB | <0.01% | $0.037005 | 9.9103 | $0.3667 | |
ARB | <0.01% | $0.029861 | 11.5836 | $0.3458 | |
ARB | <0.01% | $0.072578 | 4.5965 | $0.3336 | |
ARB | <0.01% | $0.000041 | 7,728.1513 | $0.3186 | |
ARB | <0.01% | $0.002794 | 103.2439 | $0.2884 | |
ARB | <0.01% | $0.000057 | 4,965.7938 | $0.2816 | |
ARB | <0.01% | <$0.000001 | 1,166,708,643.6064 | $0.2333 | |
ARB | <0.01% | $0.005295 | 36.2122 | $0.1917 | |
ARB | <0.01% | $0.000126 | 1,433.8633 | $0.1812 | |
ARB | <0.01% | $0.001697 | 79.4938 | $0.1349 | |
ARB | <0.01% | $0.99991 | 0.1323 | $0.1322 | |
AVAX | <0.01% | $398.72 | 0.6358 | $253.51 | |
AVAX | <0.01% | $0.00013 | 1,829,801.7841 | $237.03 | |
AVAX | <0.01% | $0.00297 | 54,798.4018 | $162.76 | |
AVAX | <0.01% | $1 | 90.6137 | $90.64 | |
AVAX | <0.01% | $1 | 73.9746 | $73.97 | |
AVAX | <0.01% | $105,419 | 0.00068346 | $72.05 | |
AVAX | <0.01% | $0.357968 | 193.6745 | $69.33 | |
AVAX | <0.01% | $37.29 | 1.6457 | $61.37 | |
AVAX | <0.01% | $0.021677 | 2,032.9184 | $44.07 | |
AVAX | <0.01% | $0.047622 | 723.1155 | $34.44 | |
AVAX | <0.01% | $0.000002 | 14,125,765.4784 | $32.07 | |
AVAX | <0.01% | $0.003496 | 8,984.9843 | $31.41 | |
AVAX | <0.01% | $379.82 | 0.0803 | $30.5 | |
AVAX | <0.01% | $0.040953 | 674.8307 | $27.64 | |
AVAX | <0.01% | $1 | 27.1857 | $27.19 | |
AVAX | <0.01% | $0.008042 | 3,193.0011 | $25.68 | |
AVAX | <0.01% | $0.999753 | 22.6521 | $22.65 | |
AVAX | <0.01% | $0.529393 | 42.4884 | $22.49 | |
AVAX | <0.01% | $631.18 | 0.0297 | $18.73 | |
AVAX | <0.01% | $0.000946 | 15,695.0612 | $14.85 | |
AVAX | <0.01% | $6.3 | 2.3465 | $14.78 | |
AVAX | <0.01% | $1 | 14.535 | $14.59 | |
AVAX | <0.01% | $58 | 0.2327 | $13.5 | |
AVAX | <0.01% | $0.000004 | 3,236,160.1679 | $13.37 | |
AVAX | <0.01% | $0.000016 | 757,398.1699 | $12.12 | |
AVAX | <0.01% | $0.184478 | 59.9722 | $11.06 | |
AVAX | <0.01% | $49.18 | 0.2155 | $10.6 | |
AVAX | <0.01% | $0.009434 | 828.5399 | $7.82 | |
AVAX | <0.01% | <$0.000001 | 113,579,879.6411 | $7.59 | |
AVAX | <0.01% | $0.001142 | 5,426.7406 | $6.19 | |
AVAX | <0.01% | $0.347535 | 17.6656 | $6.14 | |
AVAX | <0.01% | $0.008726 | 638.2034 | $5.57 | |
AVAX | <0.01% | $0.000154 | 34,511.3357 | $5.31 | |
AVAX | <0.01% | $0.000587 | 8,680.3173 | $5.09 | |
AVAX | <0.01% | <$0.000001 | 200,960,610.8383 | $4.94 | |
AVAX | <0.01% | $0.826938 | 5.8045 | $4.8 | |
AVAX | <0.01% | $0.055642 | 83.8411 | $4.67 | |
AVAX | <0.01% | $0.99595 | 4.5257 | $4.51 | |
AVAX | <0.01% | $1.15 | 3.6881 | $4.24 | |
AVAX | <0.01% | $0.996509 | 3.5748 | $3.56 | |
AVAX | <0.01% | $28.82 | 0.1198 | $3.45 | |
AVAX | <0.01% | $0.000946 | 3,621.7052 | $3.43 | |
AVAX | <0.01% | $0.032211 | 105.5094 | $3.4 | |
AVAX | <0.01% | $2.04 | 1.4938 | $3.04 | |
AVAX | <0.01% | $0.002231 | 1,181.8378 | $2.64 | |
AVAX | <0.01% | $0.003848 | 616.0518 | $2.37 | |
AVAX | <0.01% | $0.031921 | 61.8792 | $1.98 | |
AVAX | <0.01% | $0.999097 | 1.7059 | $1.7 | |
AVAX | <0.01% | $29.21 | 0.0504 | $1.47 | |
AVAX | <0.01% | $0.002331 | 589.9913 | $1.38 | |
AVAX | <0.01% | $16.28 | 0.0794 | $1.29 | |
AVAX | <0.01% | $0.172201 | 6.6148 | $1.14 | |
AVAX | <0.01% | $0.110022 | 10.1888 | $1.12 | |
AVAX | <0.01% | $0.003345 | 292.5373 | $0.9784 | |
AVAX | <0.01% | $0.000003 | 283,060.4549 | $0.9539 | |
AVAX | <0.01% | $6.51 | 0.1303 | $0.8484 | |
AVAX | <0.01% | $0.015788 | 44.0043 | $0.6947 | |
AVAX | <0.01% | $0.000027 | 23,450.264 | $0.638 | |
AVAX | <0.01% | $3.41 | 0.1585 | $0.5409 | |
AVAX | <0.01% | $0.000026 | 18,265.4212 | $0.4672 | |
AVAX | <0.01% | $0.088079 | 5.2545 | $0.4628 | |
AVAX | <0.01% | $0.139329 | 3.0426 | $0.4239 | |
AVAX | <0.01% | $0.097696 | 4.1771 | $0.408 | |
AVAX | <0.01% | $0.275547 | 1.2857 | $0.3542 | |
AVAX | <0.01% | $0.001118 | 264.305 | $0.2955 | |
AVAX | <0.01% | $0.000176 | 1,409.8189 | $0.2474 | |
AVAX | <0.01% | $0.045436 | 5.3575 | $0.2434 | |
AVAX | <0.01% | $0.0014 | 166.4385 | $0.2329 | |
AVAX | <0.01% | $0.490188 | 0.464 | $0.2274 | |
AVAX | <0.01% | $1.04 | 0.213 | $0.2213 | |
AVAX | <0.01% | $0.000078 | 2,731.2048 | $0.2131 | |
AVAX | <0.01% | $0.014149 | 12.4835 | $0.1766 | |
AVAX | <0.01% | $0.73337 | 0.2012 | $0.1475 | |
AVAX | <0.01% | $0.003565 | 36.5848 | $0.1304 | |
AVAX | <0.01% | <$0.000001 | 635,268.4102 | $0.1246 | |
AVAX | <0.01% | $0.028218 | 3.6483 | $0.1029 | |
OP | <0.01% | $3,987.32 | 0.0228 | $90.94 | |
OP | <0.01% | $1 | 72.3671 | $72.37 | |
OP | <0.01% | $2.5 | 26.0879 | $65.26 | |
OP | <0.01% | $1 | 60.4454 | $60.45 | |
OP | <0.01% | $2.87 | 14.8476 | $42.61 | |
OP | <0.01% | $28.82 | 1.3357 | $38.49 | |
OP | <0.01% | $2.86 | 12.5266 | $35.84 | |
OP | <0.01% | $1.03 | 32.5537 | $33.53 | |
OP | <0.01% | $0.208271 | 149.5269 | $31.14 | |
OP | <0.01% | $1 | 18.8791 | $18.88 | |
OP | <0.01% | $6.51 | 1.8493 | $12.04 | |
OP | <0.01% | $1 | 10.9171 | $10.93 | |
OP | <0.01% | $3.43 | 3.1725 | $10.88 | |
OP | <0.01% | $0.002232 | 4,459.4389 | $9.95 | |
OP | <0.01% | $0.020758 | 469.4801 | $9.75 | |
OP | <0.01% | $0.978554 | 9.7313 | $9.52 | |
OP | <0.01% | $0.005351 | 1,603.5823 | $8.58 | |
OP | <0.01% | $1 | 6.7755 | $6.78 | |
OP | <0.01% | $105,419 | 0.00003401 | $3.59 | |
OP | <0.01% | $4.7 | 0.7623 | $3.58 | |
OP | <0.01% | $0.007169 | 370.4663 | $2.66 | |
OP | <0.01% | $30.53 | 0.0834 | $2.54 | |
OP | <0.01% | $16.28 | 0.1522 | $2.48 | |
OP | <0.01% | $0.988979 | 1.0871 | $1.08 | |
OP | <0.01% | $0.004621 | 213.1095 | $0.9847 | |
OP | <0.01% | $379.82 | 0.0020554 | $0.7806 | |
OP | <0.01% | $0.783985 | 0.948 | $0.7432 | |
OP | <0.01% | $0.208271 | 3.1717 | $0.6605 | |
OP | <0.01% | $4,473.79 | 0.00012037 | $0.5385 | |
OP | <0.01% | $0.002515 | 187.4643 | $0.4715 | |
OP | <0.01% | $0.654102 | 0.7045 | $0.4608 | |
OP | <0.01% | $0.000535 | 836.4244 | $0.4475 | |
OP | <0.01% | $0.062877 | 5.55 | $0.3489 | |
OP | <0.01% | $0.000025 | 11,157.3047 | $0.2841 | |
OP | <0.01% | $0.003222 | 87.1874 | $0.2809 | |
OP | <0.01% | <$0.000001 | 826,158.3753 | $0.2765 | |
OP | <0.01% | $0.006734 | 33.0435 | $0.2225 | |
OP | <0.01% | $0.000001 | 74,925.7005 | $0.1056 | |
BASE | <0.01% | $0.098994 | 189.224 | $18.73 | |
BASE | <0.01% | $0.00054 | 10,563 | $5.7 | |
BASE | <0.01% | $0.000012 | 200,004.2069 | $2.49 | |
BASE | <0.01% | $0.039524 | 25 | $0.9881 | |
GNO | <0.01% | $0.268993 | 4.4495 | $1.2 |
[ 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.